|
Packit |
bd23c0 |
# Net::Config.pm
|
|
Packit |
bd23c0 |
#
|
|
Packit |
bd23c0 |
# Copyright (C) 2000 Graham Barr. All rights reserved.
|
|
Packit |
bd23c0 |
# Copyright (C) 2013-2014, 2016 Steve Hay. All rights reserved.
|
|
Packit |
bd23c0 |
# This module is free software; you can redistribute it and/or modify it under
|
|
Packit |
bd23c0 |
# the same terms as Perl itself, i.e. under the terms of either the GNU General
|
|
Packit |
bd23c0 |
# Public License or the Artistic License, as specified in the F<LICENCE> file.
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
package Net::Config;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
use 5.008001;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
use strict;
|
|
Packit |
bd23c0 |
use warnings;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
use Exporter;
|
|
Packit |
bd23c0 |
use Socket qw(inet_aton inet_ntoa);
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
our @EXPORT = qw(%NetConfig);
|
|
Packit |
bd23c0 |
our @ISA = qw(Net::LocalCfg Exporter);
|
|
Packit |
bd23c0 |
our $VERSION = "3.11";
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
our($CONFIGURE, $LIBNET_CFG);
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
eval {
|
|
Packit |
bd23c0 |
local @INC = @INC;
|
|
Packit |
bd23c0 |
pop @INC if $INC[-1] eq '.';
|
|
Packit |
bd23c0 |
local $SIG{__DIE__};
|
|
Packit |
bd23c0 |
require Net::LocalCfg;
|
|
Packit |
bd23c0 |
};
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
our %NetConfig = (
|
|
Packit |
bd23c0 |
nntp_hosts => [],
|
|
Packit |
bd23c0 |
snpp_hosts => [],
|
|
Packit |
bd23c0 |
pop3_hosts => [],
|
|
Packit |
bd23c0 |
smtp_hosts => [],
|
|
Packit |
bd23c0 |
ph_hosts => [],
|
|
Packit |
bd23c0 |
daytime_hosts => [],
|
|
Packit |
bd23c0 |
time_hosts => [],
|
|
Packit |
bd23c0 |
inet_domain => undef,
|
|
Packit |
bd23c0 |
ftp_firewall => undef,
|
|
Packit |
bd23c0 |
ftp_ext_passive => 1,
|
|
Packit |
bd23c0 |
ftp_int_passive => 1,
|
|
Packit |
bd23c0 |
test_hosts => 1,
|
|
Packit |
bd23c0 |
test_exist => 1,
|
|
Packit |
bd23c0 |
);
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
#
|
|
Packit |
bd23c0 |
# Try to get as much configuration info as possible from InternetConfig
|
|
Packit |
bd23c0 |
#
|
|
Packit |
bd23c0 |
{
|
|
Packit |
bd23c0 |
## no critic (BuiltinFunctions::ProhibitStringyEval)
|
|
Packit |
bd23c0 |
$^O eq 'MacOS' and eval <
|
|
Packit |
bd23c0 |
use Mac::InternetConfig;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
{
|
|
Packit |
bd23c0 |
my %nc = (
|
|
Packit |
bd23c0 |
nntp_hosts => [ \$InternetConfig{ kICNNTPHost() } ],
|
|
Packit |
bd23c0 |
pop3_hosts => [ \$InternetConfig{ kICMailAccount() } =~ /\@(.*)/ ],
|
|
Packit |
bd23c0 |
smtp_hosts => [ \$InternetConfig{ kICSMTPHost() } ],
|
|
Packit |
bd23c0 |
ftp_testhost => \$InternetConfig{ kICFTPHost() } ? \$InternetConfig{ kICFTPHost()} : undef,
|
|
Packit |
bd23c0 |
ph_hosts => [ \$InternetConfig{ kICPhHost() } ],
|
|
Packit |
bd23c0 |
ftp_ext_passive => \$InternetConfig{"646F676F\xA5UsePassiveMode"} || 0,
|
|
Packit |
bd23c0 |
ftp_int_passive => \$InternetConfig{"646F676F\xA5UsePassiveMode"} || 0,
|
|
Packit |
bd23c0 |
socks_hosts =>
|
|
Packit |
bd23c0 |
\$InternetConfig{ kICUseSocks() } ? [ \$InternetConfig{ kICSocksHost() } ] : [],
|
|
Packit |
bd23c0 |
ftp_firewall =>
|
|
Packit |
bd23c0 |
\$InternetConfig{ kICUseFTPProxy() } ? [ \$InternetConfig{ kICFTPProxyHost() } ] : [],
|
|
Packit |
bd23c0 |
);
|
|
Packit |
bd23c0 |
\@NetConfig{keys %nc} = values %nc;
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
TRY_INTERNET_CONFIG
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
my $file = __FILE__;
|
|
Packit |
bd23c0 |
my $ref;
|
|
Packit |
bd23c0 |
$file =~ s/Config.pm/libnet.cfg/;
|
|
Packit |
bd23c0 |
if (-f $file) {
|
|
Packit |
bd23c0 |
$ref = eval { local $SIG{__DIE__}; do $file };
|
|
Packit |
bd23c0 |
if (ref($ref) eq 'HASH') {
|
|
Packit |
bd23c0 |
%NetConfig = (%NetConfig, %{$ref});
|
|
Packit |
bd23c0 |
$LIBNET_CFG = $file;
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
if ($< == $> and !$CONFIGURE) {
|
|
Packit |
bd23c0 |
my $home = eval { local $SIG{__DIE__}; (getpwuid($>))[7] } || $ENV{HOME};
|
|
Packit |
bd23c0 |
$home ||= $ENV{HOMEDRIVE} . ($ENV{HOMEPATH} || '') if defined $ENV{HOMEDRIVE};
|
|
Packit |
bd23c0 |
if (defined $home) {
|
|
Packit |
bd23c0 |
$file = $home . "/.libnetrc";
|
|
Packit |
bd23c0 |
$ref = eval { local $SIG{__DIE__}; do $file } if -f $file;
|
|
Packit |
bd23c0 |
%NetConfig = (%NetConfig, %{$ref})
|
|
Packit |
bd23c0 |
if ref($ref) eq 'HASH';
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
my ($k, $v);
|
|
Packit |
bd23c0 |
while (($k, $v) = each %NetConfig) {
|
|
Packit |
bd23c0 |
$NetConfig{$k} = [$v]
|
|
Packit |
bd23c0 |
if ($k =~ /_hosts$/ and $k ne "test_hosts" and defined($v) and !ref($v));
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# Take a hostname and determine if it is inside the firewall
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
sub requires_firewall {
|
|
Packit |
bd23c0 |
shift; # ignore package
|
|
Packit |
bd23c0 |
my $host = shift;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
return 0 unless defined $NetConfig{'ftp_firewall'};
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
$host = inet_aton($host) or return -1;
|
|
Packit |
bd23c0 |
$host = inet_ntoa($host);
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
if (exists $NetConfig{'local_netmask'}) {
|
|
Packit |
bd23c0 |
my $quad = unpack("N", pack("C*", split(/\./, $host)));
|
|
Packit |
bd23c0 |
my $list = $NetConfig{'local_netmask'};
|
|
Packit |
bd23c0 |
$list = [$list] unless ref($list);
|
|
Packit |
bd23c0 |
foreach (@$list) {
|
|
Packit |
bd23c0 |
my ($net, $bits) = (m#^(\d+\.\d+\.\d+\.\d+)/(\d+)$#) or next;
|
|
Packit |
bd23c0 |
my $mask = ~0 << (32 - $bits);
|
|
Packit |
bd23c0 |
my $addr = unpack("N", pack("C*", split(/\./, $net)));
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
return 0 if (($addr & $mask) == ($quad & $mask));
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
return 1;
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
return 0;
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
*is_external = \&requires_firewall;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
1;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
__END__
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=head1 NAME
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
Net::Config - Local configuration data for libnet
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=head1 SYNOPSIS
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
use Net::Config qw(%NetConfig);
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=head1 DESCRIPTION
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
C<Net::Config> holds configuration data for the modules in the libnet
|
|
Packit |
bd23c0 |
distribution. During installation you will be asked for these values.
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
The configuration data is held globally in a file in the perl installation
|
|
Packit |
bd23c0 |
tree, but a user may override any of these values by providing their own. This
|
|
Packit |
bd23c0 |
can be done by having a C<.libnetrc> file in their home directory. This file
|
|
Packit |
bd23c0 |
should return a reference to a HASH containing the keys described below.
|
|
Packit |
bd23c0 |
For example
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# .libnetrc
|
|
Packit |
bd23c0 |
{
|
|
Packit |
bd23c0 |
nntp_hosts => [ "my_preferred_host" ],
|
|
Packit |
bd23c0 |
ph_hosts => [ "my_ph_server" ],
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
__END__
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=head1 METHODS
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
C<Net::Config> defines the following methods. They are methods as they are
|
|
Packit |
bd23c0 |
invoked as class methods. This is because C<Net::Config> inherits from
|
|
Packit |
bd23c0 |
C<Net::LocalCfg> so you can override these methods if you want.
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=over 4
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=item requires_firewall ( HOST )
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
Attempts to determine if a given host is outside your firewall. Possible
|
|
Packit |
bd23c0 |
return values are.
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
-1 Cannot lookup hostname
|
|
Packit |
bd23c0 |
0 Host is inside firewall (or there is no ftp_firewall entry)
|
|
Packit |
bd23c0 |
1 Host is outside the firewall
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
This is done by using hostname lookup and the C<local_netmask> entry in
|
|
Packit |
bd23c0 |
the configuration data.
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=back
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=head1 NetConfig VALUES
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=over 4
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=item nntp_hosts
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=item snpp_hosts
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=item pop3_hosts
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=item smtp_hosts
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=item ph_hosts
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=item daytime_hosts
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=item time_hosts
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
Each is a reference to an array of hostnames (in order of preference),
|
|
Packit |
bd23c0 |
which should be used for the given protocol
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=item inet_domain
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
Your internet domain name
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=item ftp_firewall
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
If you have an FTP proxy firewall (B<NOT> an HTTP or SOCKS firewall)
|
|
Packit |
bd23c0 |
then this value should be set to the firewall hostname. If your firewall
|
|
Packit |
bd23c0 |
does not listen to port 21, then this value should be set to
|
|
Packit |
bd23c0 |
C<"hostname:port"> (eg C<"hostname:99">)
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=item ftp_firewall_type
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
There are many different ftp firewall products available. But unfortunately
|
|
Packit |
bd23c0 |
there is no standard for how to traverse a firewall. The list below shows the
|
|
Packit |
bd23c0 |
sequence of commands that Net::FTP will use
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
user Username for remote host
|
|
Packit |
bd23c0 |
pass Password for remote host
|
|
Packit |
bd23c0 |
fwuser Username for firewall
|
|
Packit |
bd23c0 |
fwpass Password for firewall
|
|
Packit |
bd23c0 |
remote.host The hostname of the remote ftp server
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=over 4
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=item 0Z<>
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
There is no firewall
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=item 1Z<>
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
USER user@remote.host
|
|
Packit |
bd23c0 |
PASS pass
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=item 2Z<>
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
USER fwuser
|
|
Packit |
bd23c0 |
PASS fwpass
|
|
Packit |
bd23c0 |
USER user@remote.host
|
|
Packit |
bd23c0 |
PASS pass
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=item 3Z<>
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
USER fwuser
|
|
Packit |
bd23c0 |
PASS fwpass
|
|
Packit |
bd23c0 |
SITE remote.site
|
|
Packit |
bd23c0 |
USER user
|
|
Packit |
bd23c0 |
PASS pass
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=item 4Z<>
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
USER fwuser
|
|
Packit |
bd23c0 |
PASS fwpass
|
|
Packit |
bd23c0 |
OPEN remote.site
|
|
Packit |
bd23c0 |
USER user
|
|
Packit |
bd23c0 |
PASS pass
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=item 5Z<>
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
USER user@fwuser@remote.site
|
|
Packit |
bd23c0 |
PASS pass@fwpass
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=item 6Z<>
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
USER fwuser@remote.site
|
|
Packit |
bd23c0 |
PASS fwpass
|
|
Packit |
bd23c0 |
USER user
|
|
Packit |
bd23c0 |
PASS pass
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=item 7Z<>
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
USER user@remote.host
|
|
Packit |
bd23c0 |
PASS pass
|
|
Packit |
bd23c0 |
AUTH fwuser
|
|
Packit |
bd23c0 |
RESP fwpass
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=back
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=item ftp_ext_passive
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=item ftp_int_passive
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
FTP servers can work in passive or active mode. Active mode is when
|
|
Packit |
bd23c0 |
you want to transfer data you have to tell the server the address and
|
|
Packit |
bd23c0 |
port to connect to. Passive mode is when the server provide the
|
|
Packit |
bd23c0 |
address and port and you establish the connection.
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
With some firewalls active mode does not work as the server cannot
|
|
Packit |
bd23c0 |
connect to your machine (because you are behind a firewall) and the firewall
|
|
Packit |
bd23c0 |
does not re-write the command. In this case you should set C<ftp_ext_passive>
|
|
Packit |
bd23c0 |
to a I<true> value.
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
Some servers are configured to only work in passive mode. If you have
|
|
Packit |
bd23c0 |
one of these you can force C<Net::FTP> to always transfer in passive
|
|
Packit |
bd23c0 |
mode; when not going via a firewall, by setting C<ftp_int_passive> to
|
|
Packit |
bd23c0 |
a I<true> value.
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=item local_netmask
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
A reference to a list of netmask strings in the form C<"134.99.4.0/24">.
|
|
Packit |
bd23c0 |
These are used by the C<requires_firewall> function to determine if a given
|
|
Packit |
bd23c0 |
host is inside or outside your firewall.
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=back
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
The following entries are used during installation & testing on the
|
|
Packit |
bd23c0 |
libnet package
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=over 4
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=item test_hosts
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
If true then C<make test> may attempt to connect to hosts given in the
|
|
Packit |
bd23c0 |
configuration.
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=item test_exists
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
If true then C<Configure> will check each hostname given that it exists
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=back
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=head1 AUTHOR
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
Graham Barr E<lt>F<gbarr@pobox.com>E<gt>.
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
Steve Hay E<lt>F<shay@cpan.org>E<gt> is now maintaining libnet as of version
|
|
Packit |
bd23c0 |
1.22_02.
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=head1 COPYRIGHT
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
Copyright (C) 1998-2011 Graham Barr. All rights reserved.
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
Copyright (C) 2013-2014, 2016 Steve Hay. All rights reserved.
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=head1 LICENCE
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
This module is free software; you can redistribute it and/or modify it under the
|
|
Packit |
bd23c0 |
same terms as Perl itself, i.e. under the terms of either the GNU General Public
|
|
Packit |
bd23c0 |
License or the Artistic License, as specified in the F<LICENCE> file.
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
=cut
|