Commit | Line | Data |
686337f3 |
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. |
406c51ee |
6 | |
7 | package Net::Config; |
406c51ee |
8 | |
9 | require Exporter; |
10 | use vars qw(@ISA @EXPORT %NetConfig $VERSION $CONFIGURE $LIBNET_CFG); |
11 | use Socket qw(inet_aton inet_ntoa); |
12 | use strict; |
13 | |
14 | @EXPORT = qw(%NetConfig); |
15 | @ISA = qw(Net::LocalCfg Exporter); |
12df23ee |
16 | $VERSION = "1.10"; # $Id: //depot/libnet/Net/Config.pm#17 $ |
406c51ee |
17 | |
18 | eval { 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 | |
c8570720 |
36 | # |
37 | # Try to get as much configuration info as possible from InternetConfig |
38 | # |
12df23ee |
39 | $^O eq 'MacOS' and eval <<TRY_INTERNET_CONFIG; |
c8570720 |
40 | use Mac::InternetConfig; |
41 | |
42 | { |
43 | my %nc = ( |
12df23ee |
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, |
c8570720 |
51 | socks_hosts => |
12df23ee |
52 | \$InternetConfig{ kICUseSocks() } ? [ \$InternetConfig{ kICSocksHost() } ] : [], |
c8570720 |
53 | ftp_firewall => |
12df23ee |
54 | \$InternetConfig{ kICUseFTPProxy() } ? [ \$InternetConfig{ kICFTPProxyHost() } ] : [], |
c8570720 |
55 | ); |
12df23ee |
56 | \@NetConfig{keys %nc} = values %nc; |
c8570720 |
57 | } |
58 | TRY_INTERNET_CONFIG |
59 | |
406c51ee |
60 | my $file = __FILE__; |
61 | my $ref; |
62 | $file =~ s/Config.pm/libnet.cfg/; |
63 | if ( -f $file ) { |
302c2e6b |
64 | $ref = eval { local $SIG{__DIE__}; do $file }; |
406c51ee |
65 | if (ref($ref) eq 'HASH') { |
66 | %NetConfig = (%NetConfig, %{ $ref }); |
67 | $LIBNET_CFG = $file; |
68 | } |
69 | } |
70 | if ($< == $> and !$CONFIGURE) { |
302c2e6b |
71 | my $home = eval { local $SIG{__DIE__}; (getpwuid($>))[7] } || $ENV{HOME}; |
72 | $home ||= $ENV{HOMEDRIVE} . ($ENV{HOMEPATH}||'') if defined $ENV{HOMEDRIVE}; |
686337f3 |
73 | if (defined $home) { |
74 | $file = $home . "/.libnetrc"; |
302c2e6b |
75 | $ref = eval { local $SIG{__DIE__}; do $file } if -f $file; |
686337f3 |
76 | %NetConfig = (%NetConfig, %{ $ref }) |
77 | if ref($ref) eq 'HASH'; |
78 | } |
406c51ee |
79 | } |
80 | my ($k,$v); |
81 | while(($k,$v) = each %NetConfig) { |
302c2e6b |
82 | $NetConfig{$k} = [ $v ] |
c8570720 |
83 | if($k =~ /_hosts$/ and $k ne "test_hosts" and defined($v) and !ref($v)); |
406c51ee |
84 | } |
85 | |
302c2e6b |
86 | # Take a hostname and determine if it is inside the firewall |
406c51ee |
87 | |
88 | sub 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 | |
114 | use vars qw(*is_external); |
115 | *is_external = \&requires_firewall; |
116 | |
117 | 1; |
118 | |
119 | __END__ |
120 | |
121 | =head1 NAME |
122 | |
123 | Net::Config - Local configuration data for libnet |
124 | |
125 | =head1 SYNOPSYS |
126 | |
127 | use Net::Config qw(%NetConfig); |
128 | |
129 | =head1 DESCRIPTION |
130 | |
131 | C<Net::Config> holds configuration data for the modules in the libnet |
3c4b39be |
132 | distribution. During installation you will be asked for these values. |
406c51ee |
133 | |
134 | The configuration data is held globally in a file in the perl installation |
ea5a7fad |
135 | tree, but a user may override any of these values by providing their own. This |
136 | can be done by having a C<.libnetrc> file in their home directory. This file |
406c51ee |
137 | should return a reference to a HASH containing the keys described below. |
138 | For example |
139 | |
140 | # .libnetrc |
141 | { |
3c4b39be |
142 | nntp_hosts => [ "my_preferred_host" ], |
406c51ee |
143 | ph_hosts => [ "my_ph_server" ], |
144 | } |
145 | __END__ |
146 | |
147 | =head1 METHODS |
148 | |
149 | C<Net::Config> defines the following methods. They are methods as they are |
150 | invoked as class methods. This is because C<Net::Config> inherits from |
151 | C<Net::LocalCfg> so you can override these methods if you want. |
152 | |
153 | =over 4 |
154 | |
155 | =item requires_firewall HOST |
156 | |
157 | Attempts to determine if a given host is outside your firewall. Possible |
158 | return 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 | |
164 | This is done by using hostname lookup and the C<local_netmask> entry in |
165 | the 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 | |
187 | Each is a reference to an array of hostnames (in order of preference), |
188 | which should be used for the given protocol |
189 | |
190 | =item inet_domain |
191 | |
192 | Your internet domain name |
193 | |
194 | =item ftp_firewall |
195 | |
d1be9408 |
196 | If you have an FTP proxy firewall (B<NOT> an HTTP or SOCKS firewall) |
406c51ee |
197 | then this value should be set to the firewall hostname. If your firewall |
198 | does not listen to port 21, then this value should be set to |
199 | C<"hostname:port"> (eg C<"hostname:99">) |
200 | |
686337f3 |
201 | =item ftp_firewall_type |
202 | |
ea5a7fad |
203 | There are many different ftp firewall products available. But unfortunately |
204 | there is no standard for how to traverse a firewall. The list below shows the |
686337f3 |
205 | sequence 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 | |
217 | There 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 | |
406c51ee |
268 | =item ftp_ext_passive |
269 | |
3c4b39be |
270 | =item ftp_int_passive |
406c51ee |
271 | |
272 | FTP servers normally work on a non-passive mode. That is when you want to |
273 | transfer data you have to tell the server the address and port to |
274 | connect to. |
275 | |
ea5a7fad |
276 | With some firewalls this does not work as the server cannot |
277 | connect to your machine (because you are behind a firewall) and the firewall |
278 | does not re-write the command. In this case you should set C<ftp_ext_passive> |
406c51ee |
279 | to a I<true> value. |
280 | |
281 | Some servers are configured to only work in passive mode. If you have |
282 | one of these you can force C<Net::FTP> to always transfer in passive |
ea5a7fad |
283 | mode; when not going via a firewall, by setting C<ftp_int_passive> to |
406c51ee |
284 | a I<true> value. |
285 | |
286 | =item local_netmask |
287 | |
288 | A reference to a list of netmask strings in the form C<"134.99.4.0/24">. |
289 | These are used by the C<requires_firewall> function to determine if a given |
290 | host is inside or outside your firewall. |
291 | |
292 | =back |
293 | |
294 | The following entries are used during installation & testing on the |
295 | libnet package |
296 | |
297 | =over 4 |
298 | |
299 | =item test_hosts |
300 | |
ea5a7fad |
301 | If true then C<make test> may attempt to connect to hosts given in the |
406c51ee |
302 | configuration. |
303 | |
304 | =item test_exists |
305 | |
ea5a7fad |
306 | If true then C<Configure> will check each hostname given that it exists |
406c51ee |
307 | |
308 | =back |
309 | |
686337f3 |
310 | =for html <hr> |
311 | |
12df23ee |
312 | I<$Id: //depot/libnet/Net/Config.pm#17 $> |
686337f3 |
313 | |
406c51ee |
314 | =cut |