1# Net::Config.pm 2# 3# Copyright (c) 2000 Graham Barr <gbarr@pobox.com>. All rights reserved. 4# This program is free software; you can redistribute it and/or 5# modify it under the same terms as Perl itself. 6 7package Net::Config; 8 9require Exporter; 10use vars qw(@ISA @EXPORT %NetConfig $VERSION $CONFIGURE $LIBNET_CFG); 11use Socket qw(inet_aton inet_ntoa); 12use strict; 13 14@EXPORT = qw(%NetConfig); 15@ISA = qw(Net::LocalCfg Exporter); 16$VERSION = "1.10"; # $Id: //depot/libnet/Net/Config.pm#17 $ 17 18eval { local $SIG{__DIE__}; require Net::LocalCfg }; 19 20%NetConfig = ( 21 nntp_hosts => [], 22 snpp_hosts => [], 23 pop3_hosts => [], 24 smtp_hosts => [], 25 ph_hosts => [], 26 daytime_hosts => [], 27 time_hosts => [], 28 inet_domain => undef, 29 ftp_firewall => undef, 30 ftp_ext_passive => 0, 31 ftp_int_passive => 0, 32 test_hosts => 1, 33 test_exist => 1, 34); 35 36# 37# Try to get as much configuration info as possible from InternetConfig 38# 39$^O eq 'MacOS' and eval <<TRY_INTERNET_CONFIG; 40use Mac::InternetConfig; 41 42{ 43my %nc = ( 44 nntp_hosts => [ \$InternetConfig{ kICNNTPHost() } ], 45 pop3_hosts => [ \$InternetConfig{ kICMailAccount() } =~ /\@(.*)/ ], 46 smtp_hosts => [ \$InternetConfig{ kICSMTPHost() } ], 47 ftp_testhost => \$InternetConfig{ kICFTPHost() } ? \$InternetConfig{ kICFTPHost()} : undef, 48 ph_hosts => [ \$InternetConfig{ kICPhHost() } ], 49 ftp_ext_passive => \$InternetConfig{"646F676F\xA5UsePassiveMode"} || 0, 50 ftp_int_passive => \$InternetConfig{"646F676F\xA5UsePassiveMode"} || 0, 51 socks_hosts => 52 \$InternetConfig{ kICUseSocks() } ? [ \$InternetConfig{ kICSocksHost() } ] : [], 53 ftp_firewall => 54 \$InternetConfig{ kICUseFTPProxy() } ? [ \$InternetConfig{ kICFTPProxyHost() } ] : [], 55); 56\@NetConfig{keys %nc} = values %nc; 57} 58TRY_INTERNET_CONFIG 59 60my $file = __FILE__; 61my $ref; 62$file =~ s/Config.pm/libnet.cfg/; 63if ( -f $file ) { 64 $ref = eval { local $SIG{__DIE__}; do $file }; 65 if (ref($ref) eq 'HASH') { 66 %NetConfig = (%NetConfig, %{ $ref }); 67 $LIBNET_CFG = $file; 68 } 69} 70if ($< == $> and !$CONFIGURE) { 71 my $home = eval { local $SIG{__DIE__}; (getpwuid($>))[7] } || $ENV{HOME}; 72 $home ||= $ENV{HOMEDRIVE} . ($ENV{HOMEPATH}||'') if defined $ENV{HOMEDRIVE}; 73 if (defined $home) { 74 $file = $home . "/.libnetrc"; 75 $ref = eval { local $SIG{__DIE__}; do $file } if -f $file; 76 %NetConfig = (%NetConfig, %{ $ref }) 77 if ref($ref) eq 'HASH'; 78 } 79} 80my ($k,$v); 81while(($k,$v) = each %NetConfig) { 82 $NetConfig{$k} = [ $v ] 83 if($k =~ /_hosts$/ and $k ne "test_hosts" and defined($v) and !ref($v)); 84} 85 86# Take a hostname and determine if it is inside the firewall 87 88sub requires_firewall { 89 shift; # ignore package 90 my $host = shift; 91 92 return 0 unless defined $NetConfig{'ftp_firewall'}; 93 94 $host = inet_aton($host) or return -1; 95 $host = inet_ntoa($host); 96 97 if(exists $NetConfig{'local_netmask'}) { 98 my $quad = unpack("N",pack("C*",split(/\./,$host))); 99 my $list = $NetConfig{'local_netmask'}; 100 $list = [$list] unless ref($list); 101 foreach (@$list) { 102 my($net,$bits) = (m#^(\d+\.\d+\.\d+\.\d+)/(\d+)$#) or next; 103 my $mask = ~0 << (32 - $bits); 104 my $addr = unpack("N",pack("C*",split(/\./,$net))); 105 106 return 0 if (($addr & $mask) == ($quad & $mask)); 107 } 108 return 1; 109 } 110 111 return 0; 112} 113 114use vars qw(*is_external); 115*is_external = \&requires_firewall; 116 1171; 118 119__END__ 120 121=head1 NAME 122 123Net::Config - Local configuration data for libnet 124 125=head1 SYNOPSYS 126 127 use Net::Config qw(%NetConfig); 128 129=head1 DESCRIPTION 130 131C<Net::Config> holds configuration data for the modules in the libnet 132distribuion. During installation you will be asked for these values. 133 134The configuration data is held globally in a file in the perl installation 135tree, but a user may override any of these values by providing their own. This 136can be done by having a C<.libnetrc> file in their home directory. This file 137should return a reference to a HASH containing the keys described below. 138For example 139 140 # .libnetrc 141 { 142 nntp_hosts => [ "my_prefered_host" ], 143 ph_hosts => [ "my_ph_server" ], 144 } 145 __END__ 146 147=head1 METHODS 148 149C<Net::Config> defines the following methods. They are methods as they are 150invoked as class methods. This is because C<Net::Config> inherits from 151C<Net::LocalCfg> so you can override these methods if you want. 152 153=over 4 154 155=item requires_firewall HOST 156 157Attempts to determine if a given host is outside your firewall. Possible 158return values are. 159 160 -1 Cannot lookup hostname 161 0 Host is inside firewall (or there is no ftp_firewall entry) 162 1 Host is outside the firewall 163 164This is done by using hostname lookup and the C<local_netmask> entry in 165the configuration data. 166 167=back 168 169=head1 NetConfig VALUES 170 171=over 4 172 173=item nntp_hosts 174 175=item snpp_hosts 176 177=item pop3_hosts 178 179=item smtp_hosts 180 181=item ph_hosts 182 183=item daytime_hosts 184 185=item time_hosts 186 187Each is a reference to an array of hostnames (in order of preference), 188which should be used for the given protocol 189 190=item inet_domain 191 192Your internet domain name 193 194=item ftp_firewall 195 196If you have an FTP proxy firewall (B<NOT> an HTTP or SOCKS firewall) 197then this value should be set to the firewall hostname. If your firewall 198does not listen to port 21, then this value should be set to 199C<"hostname:port"> (eg C<"hostname:99">) 200 201=item ftp_firewall_type 202 203There are many different ftp firewall products available. But unfortunately 204there is no standard for how to traverse a firewall. The list below shows the 205sequence of commands that Net::FTP will use 206 207 user Username for remote host 208 pass Password for remote host 209 fwuser Username for firewall 210 fwpass Password for firewall 211 remote.host The hostname of the remote ftp server 212 213=over 4 214 215=item 0 216 217There is no firewall 218 219=item 1 220 221 USER user@remote.host 222 PASS pass 223 224=item 2 225 226 USER fwuser 227 PASS fwpass 228 USER user@remote.host 229 PASS pass 230 231=item 3 232 233 USER fwuser 234 PASS fwpass 235 SITE remote.site 236 USER user 237 PASS pass 238 239=item 4 240 241 USER fwuser 242 PASS fwpass 243 OPEN remote.site 244 USER user 245 PASS pass 246 247=item 5 248 249 USER user@fwuser@remote.site 250 PASS pass@fwpass 251 252=item 6 253 254 USER fwuser@remote.site 255 PASS fwpass 256 USER user 257 PASS pass 258 259=item 7 260 261 USER user@remote.host 262 PASS pass 263 AUTH fwuser 264 RESP fwpass 265 266=back 267 268=item ftp_ext_passive 269 270=item ftp_int_pasive 271 272FTP servers normally work on a non-passive mode. That is when you want to 273transfer data you have to tell the server the address and port to 274connect to. 275 276With some firewalls this does not work as the server cannot 277connect to your machine (because you are behind a firewall) and the firewall 278does not re-write the command. In this case you should set C<ftp_ext_passive> 279to a I<true> value. 280 281Some servers are configured to only work in passive mode. If you have 282one of these you can force C<Net::FTP> to always transfer in passive 283mode; when not going via a firewall, by setting C<ftp_int_passive> to 284a I<true> value. 285 286=item local_netmask 287 288A reference to a list of netmask strings in the form C<"134.99.4.0/24">. 289These are used by the C<requires_firewall> function to determine if a given 290host is inside or outside your firewall. 291 292=back 293 294The following entries are used during installation & testing on the 295libnet package 296 297=over 4 298 299=item test_hosts 300 301If true then C<make test> may attempt to connect to hosts given in the 302configuration. 303 304=item test_exists 305 306If true then C<Configure> will check each hostname given that it exists 307 308=back 309 310=for html <hr> 311 312I<$Id: //depot/libnet/Net/Config.pm#17 $> 313 314=cut 315