summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--perl-install/printer/detect.pm93
1 files changed, 63 insertions, 30 deletions
diff --git a/perl-install/printer/detect.pm b/perl-install/printer/detect.pm
index b2f3321b0..7ae07c7d9 100644
--- a/perl-install/printer/detect.pm
+++ b/perl-install/printer/detect.pm
@@ -351,57 +351,90 @@ sub getIPsInLocalNetworks() {
# Read the output of "ifconfig" to determine the broadcast addresses of
# the local networks
my $dev_is_localnet = 0;
- my @local_bcasts;
- my $current_bcast = "";
-
+ my $local_nets = {};
+ my $dev;
local *IFCONFIG_OUT;
open IFCONFIG_OUT, ($::testing ? "" : "chroot $::prefix/ ") .
'/bin/sh -c "export LC_ALL=C; ifconfig" 2> /dev/null |' or return ();
while (my $readline = <IFCONFIG_OUT>) {
# New entry ...
if ($readline =~ /^(\S+)\s/) {
- my $dev = $1;
+ $dev = $1;
# ... for a local network (eth = ethernet,
# vmnet = VMWare,
# ethernet card connected to ISP excluded)?
$dev_is_localnet = $dev =~ /^eth/ || $dev =~ /^vmnet/;
- # delete previous address
- $current_bcast = "";
}
- # Are we in the important line now?
- if ($readline =~ /\sBcast:([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\s/) {
- # Rip out the broadcast IP address
- $current_bcast = $1;
-
- # Are we in an entry for a local network?
- if ($dev_is_localnet == 1) {
- # Store current IP address
- push @local_bcasts, $current_bcast;
+ if ($dev_is_localnet) {
+ # Are we in the important line now?
+ if ($readline =~ /\saddr:([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\s/) {
+ # Rip out the broadcast IP address
+ $local_nets->{$dev}{ip} = $1;
+ }
+ if ($readline =~ /\sBcast:([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\s/) {
+ # Rip out the broadcast IP address
+ $local_nets->{$dev}{bcast} = $1;
+ }
+ if ($readline =~ /\sMask:([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\s/) {
+ # Rip out the broadcast IP address
+ $local_nets->{$dev}{mask} = $1;
}
}
}
close(IFCONFIG_OUT);
+ # Now find all addresses in the local networks which we will investigate
my @addresses;
- # Now ping all broadcast addresses and additionally "nmblookup" the
- # networks (to find Windows servers which do not answer to ping)
- foreach my $bcast (@local_bcasts) {
- local *F;
- open F, ($::testing ? "" : "chroot $::prefix/ ") .
- qq(/bin/sh -c "export LC_ALL=C; ping -w 1 -b -n $bcast 2> /dev/null | cut -f 4 -d ' ' | sed s/:// | egrep '^[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+' | uniq | sort" |)
- or next;
- local $_;
- while (<F>) { chomp; push @addresses, $_ }
- close F;
- if (-x "/usr/bin/nmblookup") {
+ foreach $dev (keys %{$local_nets}) {
+ my $ip = $local_nets->{$dev}{ip};
+ my $bcast = $local_nets->{$dev}{bcast};
+ my $mask = $local_nets->{$dev}{mask};
+ if ($mask =~ /255.255.255.(\d+)/) {
+ # Small network, never more than 255 boxes, so we return
+ # all addresses belonging to this network, nwithout pinging
+ my $lastnumber = $1;
+ my $masknumber;
+ if ($lastnumber < 128) {
+ $masknumber = 24;
+ } elsif ($lastnumber < 192) {
+ $masknumber = 25;
+ } elsif ($lastnumber < 224) {
+ $masknumber = 26;
+ } elsif ($lastnumber < 240) {
+ $masknumber = 27;
+ } elsif ($lastnumber < 248) {
+ $masknumber = 28;
+ } elsif ($lastnumber < 252) {
+ $masknumber = 29;
+ } elsif ($lastnumber < 254) {
+ $masknumber = 30;
+ } elsif ($lastnumber < 255) {
+ $masknumber = 31;
+ } else {
+ $masknumber = 32;
+ }
+ push @addresses, "$ip/$masknumber";
+ } else {
+ # Big network, probably more than 255 boxes, so ping the
+ # broadcast address and additionally "nmblookup" the
+ # networks (to find Windows servers which do not answer to ping)
local *F;
open F, ($::testing ? "" : "chroot $::prefix/ ") .
- qq(/bin/sh -c "export LC_ALL=C; nmblookup -B $bcast \\* 2> /dev/null | cut -f 1 -d ' ' | egrep '^[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+' | uniq | sort" |)
+ qq(/bin/sh -c "export LC_ALL=C; ping -w 1 -b -n $bcast 2> /dev/null | cut -f 4 -d ' ' | sed s/:// | egrep '^[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+' | uniq | sort" |)
or next;
local $_;
- while (<F>) {
- chomp;
- push @addresses, $_ if !(member($_,@addresses));
+ while (<F>) { chomp; push @addresses, $_ }
+ close F;
+ if (-x "/usr/bin/nmblookup") {
+ local *F;
+ open F, ($::testing ? "" : "chroot $::prefix/ ") .
+ qq(/bin/sh -c "export LC_ALL=C; nmblookup -B $bcast \\* 2> /dev/null | cut -f 1 -d ' ' | egrep '^[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+' | uniq | sort" |)
+ or next;
+ local $_;
+ while (<F>) {
+ chomp;
+ push @addresses, $_ if !(member($_,@addresses));
+ }
}
}
}