summaryrefslogtreecommitdiffstats
path: root/source/script/findsmb.in
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2004-05-06 15:02:58 +0000
committerStefan Metzmacher <metze@samba.org>2004-05-06 15:02:58 +0000
commite256acce3bfc22534b5738f8438faf328fda6a8b (patch)
treedb96031437314f4d14db5a4f4e837c9f8c28642b /source/script/findsmb.in
parent9c9d2fac0b8ccbb5292a7e8b90361da6ea9d2ece (diff)
downloadsamba-e256acce3bfc22534b5738f8438faf328fda6a8b.tar.gz
samba-e256acce3bfc22534b5738f8438faf328fda6a8b.tar.xz
samba-e256acce3bfc22534b5738f8438faf328fda6a8b.zip
r518: merge in the SAMBA_2_2 branch from cvs to brnaches/SAMBA_2_2
this is maybe not complete yet, please wait until I create the DAY_ZERRO tag metze
Diffstat (limited to 'source/script/findsmb.in')
-rwxr-xr-xsource/script/findsmb.in234
1 files changed, 113 insertions, 121 deletions
diff --git a/source/script/findsmb.in b/source/script/findsmb.in
index 546cf8ce7b4..e9bb247da0d 100755
--- a/source/script/findsmb.in
+++ b/source/script/findsmb.in
@@ -1,11 +1,11 @@
-#!@PERL@
+#!/usr/bin/perl
#
# Prints info on all smb responding machines on a subnet.
# This script needs to be run on a machine without nmbd running and be
# run as root to get correct info from WIN95 clients.
#
# syntax:
-# findsmb [-d|-D] [-r] [subnet broadcast address]
+# findsmb [subnet broadcast address]
#
# with no agrument it will list machines on the current subnet
#
@@ -13,43 +13,32 @@
# local master browsers for that workgroup. There will be an "*" in front
# of the workgroup name for machines that are the domain master browser for
# that workgroup.
-#
-# Options:
-#
-# -d|-D enable debug
-# -r add -r option to nmblookup when finding netbios name
#
$SAMBABIN = "@prefix@/bin";
-for ($i = 0; $i < 2; $i++) { # test for -d and -r options
- $_ = shift;
- if (m/-d|-D/) {
- $DEBUG = 1;
- } elsif (m/-r/) {
- $R_OPTION = "-r";
- }
-}
-
-if ($_) { # set broadcast address if it was specified
- $BCAST = "-B $_";
+for ($i = 0; $i < 2; $i++) { # test for -d option and broadcast address
+ $_ = shift;
+ if (m/-d|-D/) {
+ $DEBUG = 1;
+ } else {
+ if ($_) {
+ $BCAST = "-B $_";
+ }
+ }
}
-
-######################################################################
-# do numeric sort on last field of IP address
-sub ipsort
+sub ipsort # do numeric sort on last field of IP address
{
- @t1 = split(/\./,$a);
- @t2 = split(/\./,$b);
- @t1[3] <=> @t2[3];
+ @t1 = split(/\./,$a);
+ @t2 = split(/\./,$b);
+ @t1[3] <=> @t2[3];
}
-######################################################################
# look for all machines that respond to a name lookup
-open(NMBLOOKUP,"$SAMBABIN/nmblookup $BCAST '*' --debuglevel=0|") ||
- die("Can't run nmblookup '*'.\n");
+open(NMBLOOKUP,"$SAMBABIN/nmblookup $BCAST '*'|") ||
+ die("Can't run nmblookup '*'.\n");
# get rid of all lines that are not a response IP address,
# strip everything but IP address and sort by last field in address
@@ -57,6 +46,7 @@ open(NMBLOOKUP,"$SAMBABIN/nmblookup $BCAST '*' --debuglevel=0|") ||
@ipaddrs = sort ipsort grep(s/ \*<00>.*$//,<NMBLOOKUP>);
# print header info
+
print "\n *=DMB\n";
print " +=LMB\n";
print "IP ADDR NETBIOS NAME WORKGROUP/OS/VERSION $BCAST\n";
@@ -64,98 +54,100 @@ print "---------------------------------------------------------------------\n";
foreach $ip (@ipaddrs) # loop through each IP address found
{
- $ip =~ s/\n//; # strip newline from IP address
-
- # find the netbios names registered by each machine
-
- open(NMBLOOKUP,"$SAMBABIN/nmblookup $R_OPTION -A $ip --debuglevel=0|") ||
- die("Can't get nmb name list.\n");
- @nmblookup = <NMBLOOKUP>;
- close NMBLOOKUP;
-
- # get the first <00> name
-
- @name = grep(/<00>/,@nmblookup);
- $_ = @name[0];
-
- if ($_) { # we have a netbios name
- if (/GROUP/) { # is it a group name
- ($name, $aliases, $type, $length, @addresses) =
- gethostbyaddr(pack('C4',split('\.',$ip)),2);
- if (! $name) { # could not get name
- $name = "unknown nis name";
- }
- } else {
- # The Netbios name can contain lot of characters also '<' '>'
- # and spaces. The follwing cure inside name space but not
- # names starting or ending with spaces
- /(.{1,15})\s+<00>\s+/;
- $name = $1;
- $name =~ s/^\s+//g;
- }
-
- # do an smbclient command on the netbios name.
-
- if ( "$name" ) {
- open(SMB,"$SAMBABIN/smbclient -L $name -I $ip -N --debuglevel=1 2>&1 |") ||
- die("Can't do smbclient command.\n");
- @smb = <SMB>;
- close SMB;
-
- if ($DEBUG) { # if -d flag print results of nmblookup and smbclient
- print "===============================================================\n";
- print @nmblookup;
- print @smb;
- }
-
- # look for the OS= string
-
- @info = grep(/OS=/,@smb);
- $_ = @info[0];
- if ($_) { # we found response
- s/Domain=|OS=|Server=|\n//g; # strip out descriptions to make line shorter
-
- } else { # no OS= string in response (WIN95 client)
-
- # for WIN95 clients get workgroup name from nmblookup response
- @name = grep(/<00> - <GROUP>/,@nmblookup);
- $_ = @name[0];
- if ($_) {
- # Same as before for space and characters
- /(.{1,15})\s+<00>\s+/;
- $_ = "[$1]";
- } else {
- $_ = "Unknown Workgroup";
- }
- }
- }
-
- # see if machine registered a local master browser name
- if (grep(/<1d>/,@nmblookup)) {
- $master = '+'; # indicate local master browser
- if (grep(/<1b>/,@nmblookup)) { # how about domain master browser?
- $master = '*'; # indicate domain master browser
- }
- } else {
- $master = ' '; # not a browse master
- }
-
- # line up info in 3 columns
-
- print "$ip".' 'x(16-length($ip))."$name".' 'x(14-length($name))."$master"."$_\n";
-
- } else { # no netbios name found
- # try getting the host name
- ($name, $aliases, $type, $length, @addresses) =
- gethostbyaddr(pack('C4',split('\.',$ip)),2);
- if (! $name) { # could not get name
- $name = "unknown nis name";
- }
- if ($DEBUG) { # if -d flag print results of nmblookup
- print "===============================================================\n";
- print @nmblookup;
- }
- print "$ip".' 'x(16-length($ip))."$name\n";
- }
+ $ip =~ s/\n//; # strip newline from IP address
+
+# find the netbios names registered by each machine
+
+ open(NMBLOOKUP,"$SAMBABIN/nmblookup -r -A $ip|") ||
+ die("Can't get nmb name list.\n");
+ @nmblookup = <NMBLOOKUP>;
+ close NMBLOOKUP;
+
+# get the first non group <00> name
+
+ @name = grep(/<00> - /,@nmblookup);
+ $_ = @name[0];
+ if (not $_) {
+# try without the -r option
+ open(NMBLOOKUP,"$SAMBABIN/nmblookup -A $ip|") ||
+ die("Can't get nmb name list.\n");
+ @nmblookup = <NMBLOOKUP>;
+ close NMBLOOKUP;
+ @name = grep(/<00> - /,@nmblookup);
+ $_ = @name[0];
+ }
+# The Netbios name can contain lot of characters also '<' '>'
+# and spaces. The follwing cures embedded space but not
+# names starting or ending with spaces
+ /(.{1,15})\s+<00>\s+/;
+ $name = $1;
+
+ if (not $name) { # no netbios name found
+# try getting the host name
+ ($name, $aliases, $type, $length, @addresses) =
+ gethostbyaddr(pack('C4',split('\.',$ip)),2);
+ if (! $name) { # could not get name
+ $name = "unknown name";
+ }
+# truncate name to 15 characters
+ if (length($name) > 15) {
+ $name = substr($name,0,15);
+ }
+# do an smbclient command on the ip address
+
+ open(SMB,"$SAMBABIN/smbclient -N -L '$ip' -I $ip -U% |") ||
+ die("Can't do smbclient command.\n");
+ @smb = <SMB>;
+ close SMB;
+ } else { # netbios name found
+
+# do an smbclient command on the netbios name.
+
+ open(SMB,"$SAMBABIN/smbclient -N -L '$name' -I $ip -U% |") ||
+ die("Can't do smbclient command.\n");
+ @smb = <SMB>;
+ close SMB;
+ }
+ if ($DEBUG) { # if -d flag print results of nmblookup and smbclient
+ print "===============================================================\n";
+ print @nmblookup;
+ print @smb;
+ }
+
+# look for the OS= string
+
+ @info = grep(/OS=/,@smb);
+ $_ = @info[0];
+ if ($_) { # we found response
+ s/.*Domain=|OS=|Server=|\n//g; # strip out descriptions to make line shorter
+
+ } else { # no OS= string in response (WIN95 client)
+
+# for WIN95 clients get workgroup name from nmblookup response
+ @name = grep(/<00> - <GROUP>/,@nmblookup);
+ $_ = @name[0];
+ if ($_) {
+# Same as before for space and characters
+ /(.{1,15})\s+<00>\s+/;
+ $_ = "[$1]";
+ } else {
+ $_ = "Unknown Workgroup";
+ }
+ }
+
+# see if machine registered a local master browser name
+ if (grep(/<1d>/,@nmblookup)) {
+ $master = '+'; # indicate local master browser
+ if (grep(/<1b>/,@nmblookup)) { # how about domain master browser?
+ $master = '*'; # indicate domain master browser
+ }
+ } else {
+ $master = ' '; # not a browse master
+ }
+
+# line up info in 3 columns
+
+ print "$ip".' 'x(16-length($ip))."$name".' 'x(16-length($name))."$master"."$_\n";
+
}