diff options
author | Stefan Metzmacher <metze@samba.org> | 2004-05-06 15:02:58 +0000 |
---|---|---|
committer | Stefan Metzmacher <metze@samba.org> | 2004-05-06 15:02:58 +0000 |
commit | e256acce3bfc22534b5738f8438faf328fda6a8b (patch) | |
tree | db96031437314f4d14db5a4f4e837c9f8c28642b /source/script/findsmb.in | |
parent | 9c9d2fac0b8ccbb5292a7e8b90361da6ea9d2ece (diff) | |
download | samba-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-x | source/script/findsmb.in | 234 |
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"; + } |