Changeset 2969 in MondoRescue for branches/3.0/mindi/mr-net-find


Ignore:
Timestamp:
Mar 17, 2012, 4:10:22 AM (12 years ago)
Author:
Bruno Cornec
Message:

r4571@cabanilles: bruno | 2012-03-15 16:26:08 +0100

  • Working mr-net-find for both ip and ifconfig
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/3.0/mindi/mr-net-find

    r2968 r2969  
    116116
    117117my $curdev = "";
    118 open(IP,"ip addr |") || die "Unable to read IP config\n";
    119 while(<IP>) {
    120     # Remove duplicate spaces
    121     $_ =~ s/\s+/ /g;
    122     pb_log(2,"Line: $_\n");
    123     # Check for a new interface
    124     my $tmp;
    125     if (/^[0-9]+:/) {
    126         my $dev;
    127         my $rank;
    128         ($rank,$dev,$tmp) = split(/:/);
    129         pb_log(3,"$rank,$dev,$tmp");
    130         $dev =~ s/\s*//;
    131         $if->{$dev}->{'if'} = $dev;
    132         $curdev = $dev;
    133     }
    134     ($tmp,$tmp,$if->{$curdev}->{'mac'},$tmp) = split(/ /) if (/^ link/);
    135     ($tmp,$tmp,$if->{$curdev}->{'cidr'},$tmp) = split(/ /) if (/^ inet/);
    136 }
    137 close(IP);
     118# TODO: Check whther the ip command is available !
     119# If not consider using ifconfig for compatibility or non Linux availability
     120my $ipcmd = pb_check_req("ip",1);
     121if (defined $ipcmd) {
     122    open(IP,"$ipcmd addr |") || die "Unable to read IP config with $ipcmd addr\n";
     123    while (<IP>) {
     124        # Remove duplicate spaces
     125        my $line = $_;
     126        $line =~ s/\s+/ /g;
     127        pb_log(2,"Line: $line\n");
     128        # Check for a new interface
     129        my $tmp;
     130        if ($line =~ /^[0-9]+:/) {
     131            my $dev;
     132            my $rank;
     133            ($rank,$dev,$tmp) = split(/:/,$line);
     134            pb_log(3,"$rank,$dev,$tmp\n");
     135            $dev =~ s/\s*//;
     136            $if->{$dev}->{'if'} = $dev;
     137            $curdev = $dev;
     138        }
     139        ($tmp,$tmp,$if->{$curdev}->{'mac'},$tmp) = split(/ /,$line) if (/^\s*link/);
     140        ($tmp,$tmp,$if->{$curdev}->{'cidr'},$tmp) = split(/ /,$line) if (/^\s*inet/);
     141    }
     142    close(IP);
     143} else {
     144    my $ipcmd = pb_check_req("ifconfig",1);
     145    if (defined $ipcmd) {
     146        open(IP,"$ipcmd -a |") || die "Unable to read IP config with $ipcmd -a\n";
     147        while (<IP>) {
     148            # Remove duplicate spaces
     149            my $line = $_;
     150            $line =~ s/\s+/ /g;
     151            pb_log(2,"Line: $line\n");
     152            # Check for a new interface
     153            my $tmp;
     154            my $tmp2;
     155            if ($line =~ /^[^ ]+ /) {
     156                my $dev;
     157                ($dev,$tmp) = split(/ /,$line,2);
     158                pb_log(3,"DEV: $dev,$tmp\n");
     159                $dev =~ s/\s*//;
     160                $if->{$dev}->{'if'} = $dev;
     161                $curdev = $dev;
     162                ($tmp2,$tmp2,$tmp2,$if->{$curdev}->{'mac'}) = split(/ /,$tmp);
     163            }
     164            if (/^\s*inet/) {
     165                ($tmp,$if->{$curdev}->{'ip'},$if->{$curdev}->{'nm'},$tmp) = split(/:/,$line);
     166                $if->{$curdev}->{'ip'} =~ s/ .*$// if (defined $if->{$curdev}->{'ip'});
     167                $if->{$curdev}->{'nm'} =~ s/ .*$// if (defined $if->{$curdev}->{'nm'});
     168                pb_log(3,"IP: $if->{$curdev}->{'ip'},$if->{$curdev}->{'nm'}\n");
     169                $if->{$curdev}->{'cidr'} = $if->{$curdev}->{'ip'}."/".mr_net_cvt_mask_bits($if->{$curdev}->{'nm'}) if ((defined $if->{$curdev}->{'ip'}) && (defined $if->{$curdev}->{'nm'}));
     170                }
     171        }
     172        close(IP);
     173    } else {
     174        die "Neither ip nor ifconfig are available to get IP configuration.\nPlease report upstream how to deal with your platform.\n";
     175    }
     176}
    138177
    139178# Ideas Taken from http://nixcraft.com/shell-scripting/11398-simple-ipcalc-perl-script.html
    140179foreach my $dev (keys %if) {
    141180    next if (not defined $if->{$dev}->{'cidr'});
    142     ($if->{$dev}->{'ip'},my $cidr) = split(/\//,$if->{$dev}->{'cidr'});
    143 
    144     $if->{$dev}->{'nm'} = mr_net_cvt_bits_mask($cidr);
     181    ($if->{$dev}->{'ip'},my $cidr) = split(/\//,$if->{$dev}->{'cidr'}) if (not defined $if->{$dev}->{'ip'});
     182
     183    $if->{$dev}->{'nm'} = mr_net_cvt_bits_mask($cidr) if (not defined $if->{$dev}->{'nm'});;
    145184
    146185    ($if->{$dev}->{'net'},$if->{$dev}->{'bcast'}) = mr_net_nbcast_from_in($if->{$dev}->{'ip'},$if->{$dev}->{'nm'});
     
    162201
    163202if ($bits <= 8 ) {
    164     $a = bits_to_dec($bits);
     203    $a = mr_net_bits_to_dec($bits);
    165204} else {
    166205    $a = 255;
    167206    if ($bits <= 16 ) {
    168         $b = bits_to_dec($bits-8);
     207        $b = mr_net_bits_to_dec($bits-8);
    169208    } else {
    170209        $b=255;
    171210        if ($bits <= 24 ) {
    172             $c = bits_to_dec($bits-16);
     211            $c = mr_net_bits_to_dec($bits-16);
    173212        } else {
    174213            $c=255;
    175214            if ($bits <= 32 ) {
    176                 $d = bits_to_dec($bits-24);
     215                $d = mr_net_bits_to_dec($bits-24);
    177216            } else {
    178217                die "invalid bit count\n";
     
    183222return ($a.".".$b.".".$c.".".$d);
    184223}
    185    
    186 sub bits_to_dec {
     224
     225sub mr_net_cvt_mask_bits {
     226
     227my ($mask) = @_;
     228my ($a,$b,$c,$d) = split(/\./,$mask);
     229my $bits =0;
     230
     231$bits= mr_net_dec_to_bits($a) + mr_net_dec_to_bits($b) + mr_net_dec_to_bits($c) + mr_net_dec_to_bits($d);
     232return ($bits);
     233}
     234 
     235sub mr_net_bits_to_dec {
    187236my ($bits) = @_;
    188237   
     
    198247}
    199248
     249sub mr_net_dec_to_bits {
     250my ($dec) = @_;
     251   
     252if ($dec == 0 ) { return 0; }
     253if ($dec == 128 ) { return 1; }
     254if ($dec == 192 ) { return 2; }
     255if ($dec == 224 ) { return 3; }
     256if ($dec == 240 ) { return 4; }
     257if ($dec == 248 ) { return 5; }
     258if ($dec == 252 ) { return 6; }
     259if ($dec == 254 ) { return 7; }
     260if ($dec == 255 ) { return 8; }
     261}
     262
    200263# Get Net and Broadcast from IP and Netmask
    201264sub mr_net_nbcast_from_in  {
Note: See TracChangeset for help on using the changeset viewer.