adding findsmb perl script to get info on smb machines on a net
authorHerb Lewis <herb@samba.org>
Mon, 2 Mar 1998 21:27:07 +0000 (21:27 +0000)
committerHerb Lewis <herb@samba.org>
Mon, 2 Mar 1998 21:27:07 +0000 (21:27 +0000)
(This used to be commit 4adb00e41abbbaf6eaa014e6a599cb2c8b77d7da)

packaging/SGI/findsmb [new file with mode: 0755]
packaging/SGI/idb.pl

diff --git a/packaging/SGI/findsmb b/packaging/SGI/findsmb
new file mode 100755 (executable)
index 0000000..59dc960
--- /dev/null
@@ -0,0 +1,129 @@
+#!/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 [subnet broadcast address]
+#
+# with no agrument it will list machines on the current subnet
+#
+# There will be a "+" in front of the workgroup name for machines that are
+# 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.
+#
+
+$SAMBABIN = "/usr/samba/bin";
+
+for ($i = 0; $i < 2; $i++) {   # test for -d option and broadcast address
+  $_ = shift;
+  if (m/-d|-D/) {
+    $DEBUG = 1;
+  } else  {
+    if ($_) {
+      $BCAST = "-B $_";
+    }
+  }
+}
+
+sub ipsort                     # do numeric sort on last field of IP address
+{
+  @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 '*'|") || 
+  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
+
+@ipaddrs = sort ipsort grep(s/ \*<00>.*$//,<NMBLOOKUP>);
+
+# print header info
+
+print "\nIP ADDR         NETBIOS NAME   WORKGROUP/OS/VERSION $BCAST\n";
+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 -A $ip|") || 
+       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
+    /(\S+)/;
+    $name = $1;
+
+# 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];
+      /(\S+)/;
+      $_ = "[$1]";
+    }
+
+# 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";
+  }
+} 
+
index 78d5eb1de832924e55f7aa0aeb954a0e7670aca0..7eea09d8d551665a0b8052ef290b140cdf9d9078 100755 (executable)
@@ -55,7 +55,7 @@ if (@codepage) {
 }
 
 # add my local files to the list of binaries to install
-@bins = sort (@sprogs,@progs,@progs1,@scripts,("sambalp","smbprint"));
+@bins = sort (@sprogs,@progs,@progs1,@scripts,("findsmb","sambalp","smbprint"));
 
 # the files installed in docs include all the original files in docs plus all
 # the "*.doc" files from the source tree
@@ -92,6 +92,9 @@ while(@bins) {
     if ($nextfile eq "smbpasswd") {
       print IDB "f 4555 root sys usr/samba/bin/$nextfile source/$nextfile samba.sw.base\n";
     }
+    elsif ($nextfile eq "findsmb") {
+      print IDB "f 0755 root sys usr/samba/bin/$nextfile packaging/SGI/$nextfile samba.sw.base\n";
+    }
     elsif ($nextfile eq "sambalp") {
       print IDB "f 0755 root sys usr/samba/bin/$nextfile packaging/SGI/$nextfile samba.sw.base\n";
     }