home *** CD-ROM | disk | FTP | other *** search
/ Inter.Net 55-2 / Inter.Net 55-2.iso / Mandrake / mdkinst / usr / bin / perl-install / network.pm < prev    next >
Encoding:
Perl POD Document  |  2000-01-12  |  5.1 KB  |  235 lines

  1. package network;
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9. use Socket;
  10.  
  11. use common qw(:common :file :system :functional);
  12. use detect_devices;
  13. use run_program;
  14. use log;
  15.  
  16.  
  17.  
  18.  
  19. sub read_conf {
  20.     my ($file) = @_;
  21.     my %netc = getVarsFromSh($file);
  22.     $netc{dnsServer} = $netc{NS0};
  23.     \%netc;
  24. }
  25.  
  26. sub read_resolv_conf {
  27.     my ($file) = @_;
  28.     my %netc;
  29.     my @l;
  30.  
  31.     local *F;
  32.     open F, $file or die "cannot open $file: $!";
  33.     foreach (<F>) {
  34.     push @l, $1 if (/^\s*nameserver\s+([^\s]+)/);
  35.     }
  36.  
  37.     $netc{$_} = shift @l foreach qw(dnsServer dnsServer2 dnsServer3);
  38.     \%netc;
  39. }
  40.  
  41. sub read_interface_conf {
  42.     my ($file) = @_;
  43.     my %intf = getVarsFromSh($file) or die "cannot open file $file: $!";
  44.  
  45.     $intf{BOOTPROTO} ||= 'static';
  46.     $intf{isPtp} = $intf{NETWORK} eq '255.255.255.255';
  47.     $intf{isUp} = 1;
  48.     \%intf;
  49. }
  50.  
  51. sub up_it {
  52.     my ($prefix, $intfs) = @_;
  53.     $_->{isUp} and return foreach @$intfs;
  54.     my $f = "/etc/resolv.conf"; symlink "$prefix/$f", $f;
  55.     run_program::rooted($prefix, "/etc/rc.d/init.d/network", "start");
  56.     $_->{isUp} = 1 foreach @$intfs;
  57. }
  58.  
  59. sub write_conf {
  60.     my ($file, $netc) = @_;
  61.  
  62.     add2hash($netc, {
  63.              NETWORKING => "yes",
  64.              FORWARD_IPV4 => "false",
  65.              HOSTNAME => "localhost.localdomain",
  66.              });
  67.     add2hash($netc, { DOMAINNAME => $netc->{HOSTNAME} =~ /\.(.*)/ });
  68.  
  69.     setVarsInSh($file, $netc, qw(NETWORKING FORWARD_IPV4 HOSTNAME DOMAINNAME GATEWAY GATEWAYDEV NISDOMAIN));
  70. }
  71.  
  72. sub write_resolv_conf {
  73.     my ($file, $netc) = @_;
  74.  
  75.     
  76.     unless ($netc->{DOMAINNAME} || dnsServers($netc)) {
  77.     unlink($file);
  78.     log::l("neither domain name nor dns server are configured");
  79.     return 0;
  80.     }
  81.     my @l = cat_($file);
  82.  
  83.     local *F;
  84.     open F, "> $file" or die "cannot write $file: $!";
  85.     print F "search $netc->{DOMAINNAME}\n" if $netc->{DOMAINNAME};
  86.     print F "nameserver $_\n" foreach dnsServers($netc);
  87.     print F "#$_" foreach @l;
  88.  
  89.     
  90.     1;
  91. }
  92.  
  93. sub write_interface_conf {
  94.     my ($file, $intf) = @_;
  95.  
  96.     my @ip = split '\.', $intf->{IPADDR};
  97.     my @mask = split '\.', $intf->{NETMASK};
  98.     add2hash($intf, {
  99.              BROADCAST => join('.', mapn { int $_[0] | ~int $_[1] & 255 } \@ip, \@mask),
  100.              NETWORK   => join('.', mapn { int $_[0] &      $_[1]       } \@ip, \@mask),
  101.              ONBOOT => "yes",
  102.             });
  103.     setVarsInSh($file, $intf, qw(DEVICE BOOTPROTO IPADDR NETMASK NETWORK BROADCAST ONBOOT));
  104. }
  105.  
  106. sub add2hosts {
  107.     my ($file, $hostname, @ips) = @_;
  108.     my %l;
  109.     $l{$_} = $hostname foreach @ips;
  110.  
  111.     local *F;
  112.     if (-e $file) {
  113.     open F, $file or die "cannot open $file: $!";
  114.     /\s*(\S+)(.*)/ and $l{$1} = $2 foreach <F>;
  115.     }
  116.     log::l("writing host information to $file");
  117.     open F, ">$file" or die "cannot write $file: $!";
  118.     while (my ($ip, $v) = each %l) {
  119.     $ip or next;
  120.     print F "$ip";
  121.     if ($v =~ /^\s/) {
  122.         print F $v;
  123.     } else {
  124.         print F "\t\t$v";
  125.         print F " $1" if $v =~ /(.*?)\./;
  126.     }
  127.     print F "\n";
  128.     }
  129. }
  130.  
  131. # The interface/gateway needs to be configured before this will work!
  132. sub guessHostname {
  133.     my ($prefix, $netc, $intf) = @_;
  134.  
  135.     $intf->{isUp} && dnsServers($netc) or return 0;
  136.     $netc->{HOSTNAME} && $netc->{DOMAINNAME} and return 1;
  137.  
  138.     write_resolv_conf("$prefix/etc/resolv.conf", $netc);
  139.  
  140.     my $name = gethostbyaddr(Socket::inet_aton($intf->{IPADDR}), AF_INET) or log::l("reverse name lookup failed"), return 0;
  141.  
  142.     log::l("reverse name lookup worked");
  143.  
  144.     add2hash($netc, { HOSTNAME => $name });
  145.     1;
  146. }
  147.  
  148. sub addDefaultRoute {
  149.     my ($netc) = @_;
  150.     c::addDefaultRoute($netc->{GATEWAY}) if $netc->{GATEWAY};
  151. }
  152.  
  153. sub sethostname {
  154.     my ($netc) = @_;
  155.     syscall_('sethostname', $netc->{HOSTNAME}, length $netc->{HOSTNAME}) or log::l("sethostname failed: $!");
  156. }
  157.  
  158. sub resolv($) {
  159.     my ($name) = @_;
  160.     is_ip($name) and return $name;
  161.     my $a = join(".", unpack "C4", (gethostbyname $name)[4]);
  162.     
  163.     $a;
  164. }
  165.  
  166. sub dnsServers {
  167.     my ($netc) = @_;
  168.     grep { $_ } map { $netc->{$_} } qw(dnsServer dnsServer2 dnsServer3);
  169. }
  170.  
  171. sub findIntf {
  172.     my ($intf, $device) = @_;
  173.     my ($l) = grep { $_->{DEVICE} eq $device } @$intf;
  174.     push @$intf, $l = { DEVICE => $device } unless $l;
  175.     $l;
  176. }
  177. #PAD \s* a la fin
  178. my $ip_regexp = qr/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/;
  179. sub is_ip {
  180.     my ($ip) = @_;
  181.     return 0 unless $ip =~ $ip_regexp;
  182.     my @fields = ($1, $2, $3, $4);
  183.     foreach (@fields) {
  184.     return 0 if $_ < 0 || $_ > 255;
  185.     }
  186.     return 1;
  187. }
  188.  
  189. sub netmask {
  190.     my ($ip) = @_;
  191.     return "255.255.255.0" unless is_ip($ip);
  192.     $ip =~ $ip_regexp;
  193.     if ($1 >= 1 && $1 < 127) {
  194.     return "255.0.0.0";    
  195.     } elsif ($1  >= 128 && $1 <= 191 ){
  196.     return "255.255.0.0";  
  197.     } elsif ($1 >= 192 && $1 <= 223) {
  198.     return "255.255.255.0";
  199.     } else {
  200.     return "255.255.255.255"; 
  201.     }
  202. }
  203.  
  204. sub masked_ip {
  205.     my ($ip) = @_;
  206.     return "" unless is_ip($ip);
  207.     my @mask = netmask($ip) =~ $ip_regexp;
  208.     my @ip   = $ip          =~ $ip_regexp;
  209.     for (my $i = 0; $i < @ip; $i++) {
  210.     $ip[$i] &= int $mask[$i];
  211.     }
  212.     join(".", @ip);
  213. }
  214.  
  215. sub dns {
  216.     my ($ip) = @_;
  217.     my $mask = masked_ip($ip);
  218.     my @masked = masked_ip($ip) =~ $ip_regexp;
  219.     $masked[3]  = 1;
  220.     join (".", @masked);
  221.  
  222. }
  223. sub gateway {
  224.     my ($ip) = @_;
  225.     my @masked = masked_ip($ip) =~ $ip_regexp;
  226.     $masked[3]  = 254;
  227.     join (".", @masked);
  228.  
  229. }
  230.  
  231.  
  232.  
  233.  
  234. 1;
  235.