Changeset 3790 in /cluster/svnroot


Ignore:
Timestamp:
Aug 31, 2012 1:06:42 AM (8 years ago)
Author:
skylar
Message:

merging in persistent nic configuration (#729)

Location:
bccd-ng/trunk
Files:
4 edited
1 copied

Legend:

Unmodified
Added
Removed
  • bccd-ng/trunk

  • bccd-ng/trunk/packages/etc/skel/.bash_profile

    • Property svn:keywords changed from Id Rev Author Date to Id
  • bccd-ng/trunk/trees/bin/bccd-nic-setup

    r3772 r3790  
    4141       
    4242        foreach my $nic ($Bccd->get_eth_nics()) {
    43                 $response = $Bccd->run_nic_dhcp($nic,'/etc/dhcp/dhclient.conf-bccd');
    44                
    45                 if(defined($response)) {
    46                         $nic_conf->{$nic}->{'ipaddr'} = $response;
    47                         $nic_conf->{$nic}->{'dhcp_source'} = 'BCCD';
    48                 }
    49                 else {
    50                         $response = $Bccd->run_nic_dhcp($nic,'/etc/dhcp/dhclient.conf-any');
    51                         if(defined($response)) {
    52                                 $nic_conf->{$nic}->{'ipaddr'} = $response;
    53                                 $nic_conf->{$nic}->{'dhcp_source'} = 'OTHER';
    54                         }
    55                 }
    56                 # Fall through for interfaces with no DHCP
    57                 if(!defined($response)) {
    58                         $nic_conf->{$nic}{'dhcp'} = 0;
    59                 }
     43        $Bccd->set_dhcp_stance($nic);
    6044        }
    6145       
    62         $nic_conf = $Bccd->config_nic_dialog($d,$nic_conf);
     46        $Bccd->config_nic_dialog($d);
    6347       
    64         $nic_conf = $Bccd->config_interfaces($nic_conf);
    65         $nic_conf = $Bccd->config_dhcp($nic_conf);
     48        $Bccd->config_interfaces();
     49        $Bccd->config_dhcp($nic_conf);
    6650
    6751        ($out,$rc) = $Bccd->run_test("system","","Starting networking","/etc/init.d/networking start"); # No invoke-rc.d because utmp has not been updated
  • bccd-ng/trunk/trees/usr/local/lib/site_perl/Bccd.pm

    r3501 r3790  
    6161                            'mask' => '255.255.255.0',
    6262                            'bcast'   => '192.168.3.255',
     63                                                        'net'   => '192.168.3.0',
    6364                            'dhcp'    => 0,
    6465                            'bccdnet' => 1,
     
    17761777    my($self) = @_;
    17771778    my @nics;
    1778     my $nic_conf;
    17791779    my $sub='nic_dialog';
    17801780    my $d = new UI::Dialog (backtitle => "Configure NICS",
     
    17921792   
    17931793    foreach my $nic (@chosen_nics) {
    1794         $nic_conf->{$nic} = $self->config_nic_dialog($d,$nic);
    1795         if(!defined($nic_conf->{$nic})) {
     1794        $self->{nic_conf}->{$nic} = $self->config_nic_dialog($d,$nic);
     1795        if(!defined($self->{nic_conf}->{$nic})) {
    17961796            return undef;
    17971797        }
    17981798    }
    17991799   
    1800     $self->config_interfaces($nic_conf);
    1801    
    1802     return $nic_conf;
     1800    $self->config_interfaces();
     1801   
     1802    return 1;
    18031803}
    18041804
     
    18301830
    18311831sub config_interfaces{
    1832     my($self,$nic_conf) = @_;
     1832    my($self) = @_;
    18331833    my($sub,$rc);
    18341834    my @auto;
     
    18421842    print $INT "iface lo inet loopback\n\n";
    18431843
    1844     foreach my $nic (keys(%{$nic_conf})) {
    1845         if($nic_conf->{$nic}->{'dhcp'}) {
     1844    foreach my $nic (keys(%{$self->{nic_conf}})) {
     1845        if($self->{nic_conf}->{$nic}->{'dhcp'}) {
    18461846            push(@auto,$nic);
    18471847            print $INT "iface $nic inet dhcp\n\n";
    1848             if(defined($nic_conf->{$nic}->{'dhcp_source'}) && $nic_conf->{$nic}->{'dhcp_source'} eq 'BCCD') {
     1848            if(defined($self->{nic_conf}->{$nic}->{'dhcp_source'})
     1849                                && $self->{nic_conf}->{$nic}->{'dhcp_source'} eq 'BCCD') {
    18491850                if($self->require_bccd_server() > 2) {
    18501851                    $self->log_and_die("ERROR",$sub,"Couldn't set BCCD server in dhclient.");
     
    18571858            }
    18581859        }
    1859         elsif(defined($nic_conf->{$nic}->{'ipaddr'}) && defined($nic_conf->{$nic}->{'mask'})) {
     1860        elsif(defined($self->{nic_conf}->{$nic}->{'ipaddr'})
     1861                        && defined($self->{nic_conf}->{$nic}->{'mask'})) {
    18601862            push(@auto,$nic);
    18611863            print $INT "iface $nic inet static\n";
    1862             print $INT "\taddress $nic_conf->{$nic}->{'ipaddr'}\n";
    1863             print $INT "\tnetmask $nic_conf->{$nic}->{'mask'}\n";
    1864             if(defined($nic_conf->{$nic}->{'bcast'})) {
    1865                 print $INT "\tbroadcast $nic_conf->{$nic}->{'bcast'}\n";
    1866             }
    1867             if(defined($nic_conf->{$nic}->{'gw'})) {
    1868                 print $INT "\tgateway $nic_conf->{$nic}->{'gw'}\n";
     1864            print $INT "\taddress $self->{nic_conf}->{$nic}->{'ipaddr'}\n";
     1865            print $INT "\tnetmask $self->{nic_conf}->{$nic}->{'mask'}\n";
     1866            if(defined($self->{nic_conf}->{$nic}->{'bcast'})) {
     1867                print $INT "\tbroadcast $self->{nic_conf}->{$nic}->{'bcast'}\n";
     1868            }
     1869            if(defined($self->{nic_conf}->{$nic}->{'gw'})) {
     1870                print $INT "\tgateway $self->{nic_conf}->{$nic}->{'gw'}\n";
    18691871            }
    18701872        }
     
    18751877    $self->leave_sub($sub);
    18761878
    1877         return $nic_conf;
     1879        return 1;
    18781880}
    18791881
    18801882sub check_bccd_net{
    1881         my($self,$nic_conf) = @_;
     1883        my($self) = @_;
    18821884        my $sub = 'check_bccd_net';
    18831885
    1884         foreach my $nic (keys(%{$nic_conf})) {
    1885                 if(defined($nic_conf->{$nic}->{'dhcp_source'}) &&
    1886                         $nic_conf->{$nic}->{dhcp_source} eq 'BCCD') {
     1886        foreach my $nic (keys(%{$self->{nic_conf}})) {
     1887                if(defined($self->{nic_conf}->{$nic}->{'dhcp_source'}) &&
     1888                        $self->{nic_conf}->{$nic}->{dhcp_source} eq 'BCCD') {
    18871889                        return 1;
    18881890                }
     
    18931895
    18941896sub config_dhcp{
    1895     my($self,$nic_conf) = @_;
     1897    my($self) = @_;
    18961898    my($sub,$pubnetip,$j,$oneip,$file,$pubnet,$pxenet,$havedhcp,
    18971899       $bcast,$mask,$i,$rc,$out,$pxenic,$pxenetip,$addr,$dhcpnic,
     
    19011903    $havedhcp = 0;
    19021904  FIND_PXE_NIC:
    1903     foreach my $nic (keys(%{$nic_conf})) {
    1904         if(defined($nic_conf->{$nic}->{'pxenic'})) {
     1905    foreach my $nic (keys(%{$self->{nic_conf}})) {
     1906        if(defined($self->{nic_conf}->{$nic}->{'pxenic'})) {
    19051907            $pxenic = $nic;
    19061908            last FIND_PXE_NIC;
     
    19081910    }
    19091911   
    1910     foreach my $nic (keys(%{$nic_conf})) {
    1911         if(defined($nic_conf->{$nic}->{'dhcp_source'}) &&
    1912            $nic_conf->{$nic}->{'dhcp_source'} eq 'BCCD') {
     1912    foreach my $nic (keys(%{$self->{nic_conf}})) {
     1913        if(defined($self->{nic_conf}->{$nic}->{'dhcp_source'}) &&
     1914           $self->{nic_conf}->{$nic}->{'dhcp_source'} eq 'BCCD') {
    19131915            $havedhcp = 1;
    19141916        }
    19151917    }
    19161918   
    1917   HAVE_DHCP: foreach my $nic (keys(%{$nic_conf})) {
    1918       if(defined($nic_conf->{$nic}->{'bccdnet'})) {
     1919  HAVE_DHCP: foreach my $nic (keys(%{$self->{nic_conf}})) {
     1920      if(defined($self->{nic_conf}->{$nic}->{'bccdnet'})) {
    19191921          $dhcpnic = $nic;
    19201922          last HAVE_DHCP;
     
    19231925   
    19241926    if(defined($pxenic)) {
    1925         $pxenetip = new NetAddr::IP($nic_conf->{$pxenic}->{'ipaddr'},$nic_conf->{$pxenic}->{'mask'}) ||
    1926             $self->log_and_die("ERROR",$sub,"Couldn't create network IP object for $nic_conf->{$pxenic}->{'ipaddr'}: $!");
    1927         if(!defined($nic_conf->{$pxenic}->{'gw'})) {
    1928             $nic_conf->{$pxenic}->{'gw'} = $nic_conf->{$pxenic}->{'ipaddr'};
     1927        $pxenetip = new NetAddr::IP($self->{nic_conf}->{$pxenic}->{'ipaddr'},
     1928                                                                        $self->{nic_conf}->{$pxenic}->{'mask'}) ||
     1929            $self->log_and_die("ERROR",$sub,"Couldn't create network "
     1930                                ."IP object for $self->{nic_conf}->{$pxenic}->{'ipaddr'}: $!");
     1931        if(!defined($self->{nic_conf}->{$pxenic}->{'gw'})) {
     1932            $self->{nic_conf}->{$pxenic}->{'gw'}
     1933                                = $self->{nic_conf}->{$pxenic}->{'ipaddr'};
    19291934        }
    19301935    }
     
    19641969    # Increment to first DHCP address
    19651970    for($i=1;$i<$DHCP_RANGES->{'res'};$i++) {
    1966         if(defined($dhcpnic) && $pubnetip->addr() eq $nic_conf->{$dhcpnic}->{'ipaddr'}) {
     1971        if(defined($dhcpnic)
     1972                        && $pubnetip->addr()
     1973                                eq $self->{nic_conf}->{$dhcpnic}->{'ipaddr'}) {
    19671974            print $HOSTS sprintf("%s\tnode%.3d.bccd.net node%.3d %s %s\t# Reserved IP\n", $pubnetip->addr(), $j, $j,
    19681975                                 $HOSTNAME, $SHORT_HOSTNAME);
     
    20112018        print $DCONF "\toption subnet-mask $pxenet->{'mask'};\n";
    20122019        print $DCONF "\toption broadcast-address $pxenet->{'bcast'};\n";
    2013         print $DCONF "\toption routers $nic_conf->{$pxenic}->{'gw'};\n";
     2020        print $DCONF "\toption routers $self->{nic_conf}->{$pxenic}->{'gw'};\n";
    20142021        print $DCONF "\tpool {\n";
    20152022        print $DCONF "\t\trange $pxenet->{'firstip'} $pxenet->{'lastip'};\n";
    20162023        print $DCONF "\t\tallow members of \"pxelinux-nodes\";\n";
    20172024        print $DCONF "\t\tfilename \"pxelinux.0\";\n";
    2018         print $DCONF "\t\tnext-server $nic_conf->{$pxenic}->{'ipaddr'};\n";
    2019         print $DCONF "\t\toption root-path \"$nic_conf->{$pxenic}->{'ipaddr'}:/,nfsvers=3,tcp,hard\";\n";
     2025        print $DCONF "\t\tnext-server $self->{nic_conf}->{$pxenic}->{'ipaddr'};\n";
     2026        print $DCONF "\t\toption root-path \"$self->{nic_conf}->{$pxenic}->{'ipaddr'}:/,nfsvers=3,tcp,hard\";\n";
    20202027        print $DCONF "\t}\n";
    20212028        print $DCONF "}\n";
     
    20262033        print $PCONF "label bccd\n";
    20272034        print $PCONF "\tkernel vmlinuz-$KERNREV\n";
    2028         print $PCONF "\tappend ETHERNET=eth0 initrd=initrd.img-$KERNREV root=/dev/nfs nfsroot=$nic_conf->{$pxenic}->{'ipaddr'}:/ ip=dhcp init=/sbin/init vga=791 lang=us\n";
     2035        print $PCONF "\tappend ETHERNET=eth0 initrd=initrd.img-$KERNREV "
     2036                        ."root=/dev/nfs nfsroot=$self->{nic_conf}->{$pxenic}->{'ipaddr'}:/ "
     2037                        ."ip=dhcp init=/sbin/init vga=791 lang=us\n";
    20292038       
    20302039        close($PCONF);
    2031         if(-d "/diskless/$PROJECT") {
    2032             open(my $FCONF, '>', $DISKLESS_FSTAB) ||
    2033                 $self->log_and_die("ERROR",$sub,"Can't open file $DISKLESS_FSTAB: $!");
    2034            
    2035             print $FCONF "$nic_conf->{$pxenic}->{'ipaddr'}:/bccd/home  /bccd/home   nfs     nfsvers=3,tcp,rsize=32768,wsize=32768,hard,intr 0 0\n";
    2036            
    2037             close($FCONF);
     2040                if(-d "/diskless/$PROJECT") {
     2041                open(my $FCONF, '>', $DISKLESS_FSTAB) ||
     2042                        $self->log_and_die("ERROR",$sub,"Can't open file $DISKLESS_FSTAB: $!");
     2043                   
     2044                print $FCONF "$self->{nic_conf}->{$pxenic}->{'ipaddr'}:/bccd/home  "
     2045                                ."/bccd/home   nfs     "
     2046                                ."nfsvers=3,tcp,rsize=32768,wsize=32768,hard,intr 0 0\n";
     2047                   
     2048                close($FCONF);
    20382049        }
    20392050    }
    20402051    else {
    20412052        print $DCONF "allow bootp;\nallow booting;\n\n";
    2042         print $DCONF "# This is a total hack to get DHCP to work with interface aliases\n";
    2043         print $DCONF "subnet 0.0.0.0 netmask 0.0.0.0 {\n\n";
     2053                print $DCONF "# This is a total hack to get DHCP to work with interface aliases\n";
     2054                print $DCONF "subnet $BCCD_NET->{'net'} netmask $BCCD_NET->{'mask'} {\n\n";
     2055                print $DCONF "authoritative;\n";
    20442056        print $DCONF "\toption subnet-mask $pubnet->{'mask'};\n";
    20452057        print $DCONF "\toption broadcast-address $pubnet->{'bcast'};\n";
     
    20502062        print $DCONF "\t}\n";
    20512063        print $DCONF "}\n";
     2064       
     2065                # Include the base NIC (no alias) as well
     2066                my $base_dhcpnic = $dhcpnic;
     2067                $base_dhcpnic =~ s{:\d+$}{};
     2068       
     2069                my $base_dhcpnic_ip = new NetAddr::IP($self->{nic_conf}->{$base_dhcpnic}->{'ipaddr'},
     2070                                                                        $self->{nic_conf}->{$base_dhcpnic}->{'mask'});
     2071                # Just get the network address, not the mask
     2072                my $network = $base_dhcpnic_ip->network();
     2073                $network =~ s{/\d+$}{};
     2074       
     2075                print $DCONF "subnet $network ";
     2076                print $DCONF "netmask $self->{nic_conf}->{$base_dhcpnic}->{'mask'} {\n";
     2077                print $DCONF "\tpool {\n";
     2078                print $DCONF "\t\tallow members of \"bccd-nodes\";\n";
     2079                print $DCONF "\t\trange 127.0.0.10 127.0.0.11;\n";
     2080                print $DCONF "\t}\n";
     2081                print $DCONF "}\n";
     2082
     2083                # Generate blank subnet statements for each known subnet
     2084                foreach my $nic_conf_nic (keys(%{$self->{nic_conf}})) {
     2085                        # Filter out aliases (DHCP doesn't like them)
     2086                        if($nic_conf_nic !~ m{:\d+$}
     2087                                && defined($self->{nic_conf}->{$nic_conf_nic}->{'ipaddr'})
     2088                                && defined($self->{nic_conf}->{$nic_conf_nic}->{'mask'})) {
     2089                                my $nic_nai
     2090                                        = new NetAddr::IP($self->{nic_conf}->{$nic_conf_nic}->{'ipaddr'},
     2091                                                $self->{nic_conf}->{$nic_conf_nic}->{'mask'});
     2092                                $network = $nic_nai->network();
     2093                                $network =~ s{/\d+$}{};
     2094                                print $DCONF "subnet $network ";
     2095                                print $DCONF "netmask $self->{nic_conf}->{$nic_conf_nic}->{'mask'} {\n";
     2096                                print $DCONF "}\n";
     2097                        }
     2098                }
     2099
     2100            close($DCONF);
    20522101        }
    2053    
    2054     close($DCONF);
    20552102
    20562103        if($self->parse_cmdline("recoverdhcp")) {
     
    21662213        }
    21672214    }
    2168     return $nic_conf;
     2215    return 1;
    21692216}
    21702217
    21712218sub config_nat{
    2172         my($self,$nic_conf) = @_;
     2219        my($self) = @_;
    21732220        my($natnic,$sub);
    21742221        $sub = 'config_nat';
     
    22452292
    22462293sub config_nic_dialog {
    2247     my($self,$d,$nic_conf) = @_;
     2294    my($self,$d) = @_;
    22482295    my($temp,$bccd_nic,$gotpxe,$dhcp_source,$sub,$rc);
    22492296    $sub = 'config_nic_dialog';
     
    22542301        my @dhcp_nics;
    22552302        # See if there's a BCCD server response
    2256         foreach my $nic (keys(%{$nic_conf})) {
    2257             if(defined($nic_conf->{$nic}->{'dhcp_source'})
    2258                && $nic_conf->{$nic}->{'dhcp_source'} eq 'BCCD') {
     2303        foreach my $nic (keys(%{$self->{nic_conf}})) {
     2304            if(defined($self->{nic_conf}->{$nic}->{'dhcp_source'})
     2305               && $self->{nic_conf}->{$nic}->{'dhcp_source'} eq 'BCCD') {
    22592306                $dhcp_source = 'BCCD';
    22602307            }
     
    22622309
    22632310        # Display NICs that have non-BCCD IP addresses with the IP address they got
    2264         foreach my $nic (sort(keys(%{$nic_conf}))) {
     2311        foreach my $nic (sort(keys(%{$self->{nic_conf}}))) {
    22652312            # Only if we didn't pick up a BCCD server
    2266             if((defined($nic_conf->{$nic}->{'dhcp_source'}) && $nic_conf->{$nic}->{'dhcp_source'} ne 'BCCD') || !defined($dhcp_source)) {
     2313            if((defined($self->{nic_conf}->{$nic}->{'dhcp_source'})
     2314                                && $self->{nic_conf}->{$nic}->{'dhcp_source'} ne 'BCCD')
     2315                                || !defined($dhcp_source)) {
    22672316                my $ip = $self->get_nic_ip($nic);
    22682317                push(@dhcp_nics,($nic,defined($ip) ? "($ip)" : "()"));
     
    23022351        }
    23032352        # Setup NAT in iptables on the BCCD NIC
    2304         if(defined($bccd_nic) && !$self->check_bccd_net($nic_conf)) {
    2305             $nic_conf->{"$bccd_nic:1"} = $BCCD_NET;
     2353        if(defined($bccd_nic) && !$self->check_bccd_net($self->{nic_conf})) {
     2354            $self->{nic_conf}->{"$bccd_nic:1"} = $BCCD_NET;
    23062355            foreach my $LINE (
    23072356                q{*nat},
     
    23152364        }
    23162365        close($IPT);
    2317        
     2366
    23182367      NIC_CONF:
    2319         foreach my $nic (sort keys %{$nic_conf}) {
    2320             if(defined($nic_conf->{$nic}->{'ipaddr'}) && defined($nic_conf->{$nic}->{'dhcp_source'}) &&
    2321                $nic_conf->{$nic}->{'dhcp_source'} eq 'BCCD') {
     2368        foreach my $nic (sort keys %{$self->{nic_conf}}) {
     2369            if(defined($self->{nic_conf}->{$nic}->{'ipaddr'})
     2370                                && defined($self->{nic_conf}->{$nic}->{'dhcp_source'})
     2371                                && $self->{nic_conf}->{$nic}->{'dhcp_source'} eq 'BCCD') {
    23222372                # Only for NICs that pickup a response from a non-BCCD DHCP server
    23232373                if(!$self->parse_cmdline('standalone')) {
    2324                     $nic_conf->{$nic}->{'dhcp'} = 1;
     2374                    $self->{nic_conf}->{$nic}->{'dhcp'} = 1;
    23252375                }
    23262376            }
    2327             elsif(defined($nic_conf->{$nic}->{'dhcp_source'})
    2328                         && ((-e '/testmode') || ($d->yesno(text=>"$nic has an IP address $nic_conf->{$nic}->{'ipaddr'} from $nic_conf->{$nic}->{'dhcp_source'}. Take this address?")
     2377            elsif(defined($self->{nic_conf}->{$nic}->{'dhcp_source'})
     2378                        && ((-e '/testmode')
     2379                        || ($d->yesno(text=>"$nic has an IP address "
     2380                                ."$self->{nic_conf}->{$nic}->{'ipaddr'} from "
     2381                                ."$self->{nic_conf}->{$nic}->{'dhcp_source'}. Take this address?")
    23292382                        ))) {
    2330                 $nic_conf->{$nic}->{'dhcp'} = 1;
     2383                $self->{nic_conf}->{$nic}->{'dhcp'} = 1;
    23312384            }
    23322385            else {
    2333                 $nic_conf->{$nic}->{'dhcp'} = 0;
    2334             }
    2335             if($nic_conf->{$nic}->{'dhcp'} == 0 && !defined($nic_conf->{$nic}->{'ipaddr'})
    2336              && ! -e '/testmode'
    2337                          && ! $d->yesno(text=>"No DHCP for $nic, skip?")) {
    2338                 $nic_conf->{$nic}->{'dhcp'} = 0;
     2386                $self->{nic_conf}->{$nic}->{'dhcp'} = 0;
     2387            }
     2388            if(($self->{nic_conf}->{$nic}->{'dhcp'} == 0)
     2389                                && !defined($self->{nic_conf}->{$nic}->{'ipaddr'})
     2390                && ! -e '/testmode'
     2391                                && ! $d->yesno(text=>"No DHCP for $nic, skip?")) {
     2392                $self->{nic_conf}->{$nic}->{'dhcp'} = 0;
    23392393            }
    23402394            else {
     
    23422396                # unless the base interface has an IP address
    23432397                if($nic eq $bccd_nic) {
    2344                     $nic_conf->{$nic}->{'ipaddr'} = '127.127.127.127';
    2345                     $nic_conf->{$nic}->{'mask'} = '255.0.0.0';
     2398                    $self->{nic_conf}->{$nic}->{'ipaddr'} = '127.127.127.127';
     2399                    $self->{nic_conf}->{$nic}->{'mask'} = '255.0.0.0';
    23462400                }
    23472401                next NIC_CONF;
    23482402            }
    2349             if($nic_conf->{$nic}->{'dhcp'} == 0) {
     2403            if($self->{nic_conf}->{$nic}->{'dhcp'} == 0) {
    23502404              FIND_CUR_NIC:
    23512405                do {
    23522406                    # Setup a PXE network if liberated and requested
    2353                     if(!defined($gotpxe) && $self->get_stage() eq 'LIBERATED' && $d->yesno(text=>"Make $nic the PXE-capable NIC?")) {
     2407                    if(!defined($gotpxe)
     2408                                                && $self->get_stage() eq 'LIBERATED'
     2409                                                && $d->yesno(text=>"Make $nic the PXE-capable NIC?")) {
    23542410                        $gotpxe = 1;
    2355                         $nic_conf->{$nic}->{'pxenic'}  = $nic;
    2356                         $nic_conf->{$nic}->{'ipaddr'}  = $BCCD_NET->{'ipaddr'};
    2357                         $nic_conf->{$nic}->{'bcast'}   = $BCCD_NET->{'bcast'};
    2358                         $nic_conf->{$nic}->{'mask'}    = $BCCD_NET->{'mask'};
    2359                         $nic_conf->{$nic}->{'bccdnet'} = $BCCD_NET->{'bccdnet'};
     2411                        $self->{nic_conf}->{$nic}->{'pxenic'}  = $nic;
     2412                        $self->{nic_conf}->{$nic}->{'ipaddr'}  = $BCCD_NET->{'ipaddr'};
     2413                        $self->{nic_conf}->{$nic}->{'bcast'}   = $BCCD_NET->{'bcast'};
     2414                        $self->{nic_conf}->{$nic}->{'mask'}    = $BCCD_NET->{'mask'};
     2415                        $self->{nic_conf}->{$nic}->{'bccdnet'} = $BCCD_NET->{'bccdnet'};
    23602416                      DELETE_VIRTUAL_NIC:
    2361                         foreach my $x (keys(%{$nic_conf})) {
    2362                             if(defined($nic_conf->{"$x:1"}->{'ipaddr'}) &&
    2363                                $nic_conf->{"$x:1"}->{'ipaddr'} eq $BCCD_NET->{'ipaddr'}) {
    2364                                 delete $nic_conf->{"$x:1"};
     2417                        foreach my $x (keys(%{$self->{nic_conf}})) {
     2418                            if(defined($self->{nic_conf}->{"$x:1"}->{'ipaddr'})
     2419                               && $self->{nic_conf}->{"$x:1"}->{'ipaddr'} eq $BCCD_NET->{'ipaddr'}) {
     2420                                delete $self->{nic_conf}->{"$x:1"};
    23652421                            }
    23662422                        }
     
    23692425                        # If no PXE, then allow the user to set network information manually
    23702426                        if (-e '/testmode'){
    2371                             $nic_conf->{$nic}->{'ipaddr'} = '192.168.0.*';
     2427                            $self->{nic_conf}->{$nic}->{'ipaddr'} = '192.168.0.*';
    23722428                        }else{
    2373                             $nic_conf->{$nic}->{'ipaddr'} =
     2429                            $self->{nic_conf}->{$nic}->{'ipaddr'} =
    23742430                                ($temp = $d->inputbox(text=>
    23752431                                                      "$nic IP address (mandatory)")) ? $temp : undef;
     
    23792435                                redo FIND_EXT_NIC;
    23802436                            }
    2381                             elsif($nic_conf->{$nic}->{'ipaddr'}
     2437                            elsif($self->{nic_conf}->{$nic}->{'ipaddr'}
    23822438                                  eq $BCCD_NET->{'ipaddr'}) {
    23832439                                $d->msgbox(text =>
     
    23882444                       
    23892445                        if (-e '/testmode'){
    2390                             $nic_conf->{$nic}->{'mask'} = "255.255.255.0";
     2446                            $self->{nic_conf}->{$nic}->{'mask'} = "255.255.255.0";
    23912447                        } else {
    2392                             $nic_conf->{$nic}->{'mask'} =
     2448                            $self->{nic_conf}->{$nic}->{'mask'} =
    23932449                                ($temp = $d->inputbox(text=>
    23942450                                                      "$nic Subnet mask (mandatory)")) ? $temp : undef;
     
    23992455                        }
    24002456                       
    2401                         $nic_conf->{$nic}->{'gw'} = ($temp = $d->inputbox(text=>"$nic Gateway (optional)")) ? $temp : undef;
     2457                        $self->{nic_conf}->{$nic}->{'gw'}
     2458                                                        = ($temp = $d->inputbox(text=>"$nic Gateway (optional)")) ? $temp : undef;
    24022459                        if(!$self->is_dialog_ok($d)) {
    24032460                            redo FIND_EXT_NIC;
    24042461                        }
    24052462                    }
    2406                 } while(!defined($nic_conf->{$nic}->{'ipaddr'}) || !defined($nic_conf->{$nic}->{'mask'}));
    2407             }
    2408         }
    2409     }
    2410    
    2411     return $nic_conf;
     2463                } while(!defined($self->{nic_conf}->{$nic}->{'ipaddr'})
     2464                                        || !defined($self->{nic_conf}->{$nic}->{'mask'}));
     2465            }
     2466        }
     2467    }
     2468   
     2469    return 1;
    24122470}
    24132471
     
    24662524}
    24672525
     2526# Detect other BCCD systems and set DHCP accordingly
     2527sub set_dhcp_stance {
     2528    my($self,$nic) = @_;
     2529    my($response,$sub);
     2530    $sub = 'set_dhcp_stance';
     2531
     2532    # Response is a hash ref of ipaddr and subnet mask
     2533    $response
     2534        = $self->run_nic_dhcp($nic,'/etc/dhcp/dhclient.conf-bccd');
     2535    if(defined($response)) {
     2536        $self->{nic_conf}->{$nic} = $response;
     2537        $self->{nic_conf}->{$nic}->{'dhcp_source'} = 'BCCD';
     2538    }
     2539    else {
     2540        $response
     2541            = $self->run_nic_dhcp($nic,'/etc/dhcp/dhclient.conf-any');
     2542        if(defined($response)) {
     2543            $self->{nic_conf}->{$nic} = $response;
     2544            $self->{nic_conf}->{$nic}->{'dhcp_source'} = 'OTHER';
     2545        }
     2546    }
     2547    # Fall through for interfaces with no DHCP
     2548    if(!defined($response)) {
     2549        $self->{nic_conf}->{$nic}{'dhcp'} = 0;
     2550    }
     2551
     2552    return 1;
     2553}
     2554
    24682555sub run_nic_dhcp {
    24692556    my($self,$nic,$cfg) = @_;
    2470     my($cmd,$out,$rc,$sub);
     2557    my($cmd,$ip_info,$out,$rc,$sub,$DHLEASE,$lease_file);
    24712558    $sub = 'run_nic_dhcp';
    24722559   
     
    24742561    ($out,$rc) = $self->exec_system($cmd);
    24752562   
    2476     foreach my $lease_file ( </var/lib/dhcp/dhclient*leases*> ) {
     2563    foreach $lease_file ( </var/lib/dhcp/dhclient*leases*> ) {
    24772564        if(!$self->run_test('unlink','',"Removing $lease_file.",$lease_file)) {
    24782565            $self->log_and_die("ERROR",$sub,"Couldn't remove $lease_file.");
     
    24822569    $cmd = "dhclient -cf $cfg -1 $nic -v";
    24832570    ($out,$rc) = $self->run_test('system','',"Running $cmd.",$cmd);
    2484    
    2485     if($out =~ m/^bound to ((?:\d{1,3}\.){3}\d{1,3})/m) {
    2486         return $1;
    2487     }
     2571
     2572        # Lease file comes under a variety of names
     2573        # Return undef if none can be found
     2574        if( -f "/var/lib/dhcp/dhclient.$nic.leases") {
     2575                $lease_file = "/var/lib/dhcp/dhclient.$nic.leases";
     2576        }
     2577        elsif( -f "/var/lib/dhcp/dhclient.leases" ) {
     2578                $lease_file = "/var/lib/dhcp/dhclient.leases";
     2579        }
     2580        else {
     2581                return undef;
     2582        }
     2583
     2584        if(!defined(open($DHLEASE, '<', $lease_file))) {
     2585                $self->log_and_die("ERROR",$sub,"Couldn't parse lease file: $!\n");
     2586        }
     2587   
     2588        while(my $line = <$DHLEASE>) {
     2589                chomp $line;
     2590                if($line =~ m{^\s+fixed-address\s+((?:\d{1,3}\.){3}\d{1,3});$}) {
     2591                        $ip_info->{'ipaddr'} = $1;
     2592                }
     2593                elsif($line =~ m{^\s+option subnet-mask\s+((?:\d{1,3}\.){3}\d{1,3});$}) {
     2594                        $ip_info->{'mask'} = $1;
     2595                }
     2596        }
     2597
     2598        if(!defined(close($DHLEASE))) {
     2599                $self->log_and_cont("ERROR",$sub,"Couldn't close lease file: $!\n");
     2600        }
     2601
     2602        if(defined($ip_info->{'ipaddr'})
     2603                && defined($ip_info->{'mask'})
     2604        ) {
     2605                return $ip_info;
     2606        }
     2607
    24882608    return undef;
    24892609}
Note: See TracChangeset for help on using the changeset viewer.