source: branches/samba-3.0/packaging/SGI/findsmb@ 1036

Last change on this file since 1036 was 1, checked in by Paul Smedley, 19 years ago

Initial code import

File size: 3.9 KB
Line 
1#!/bin/perl
2#
3# Prints info on all smb responding machines on a subnet.
4# This script needs to be run on a machine without nmbd running and be
5# run as root to get correct info from WIN95 clients.
6#
7# syntax:
8# findsmb [subnet broadcast address]
9#
10# with no agrument it will list machines on the current subnet
11#
12# There will be a "+" in front of the workgroup name for machines that are
13# local master browsers for that workgroup. There will be an "*" in front
14# of the workgroup name for machines that are the domain master browser for
15# that workgroup.
16#
17
18$SAMBABIN = "/usr/samba/bin";
19
20for ($i = 0; $i < 2; $i++) { # test for -d option and broadcast address
21 $_ = shift;
22 if (m/-d|-D/) {
23 $DEBUG = 1;
24 } else {
25 if ($_) {
26 $BCAST = "-B $_";
27 }
28 }
29}
30
31sub ipsort # do numeric sort on last field of IP address
32{
33 @t1 = split(/\./,$a);
34 @t2 = split(/\./,$b);
35 @t1[3] <=> @t2[3];
36}
37
38# look for all machines that respond to a name lookup
39
40open(NMBLOOKUP,"$SAMBABIN/nmblookup $BCAST '*'|") ||
41 die("Can't run nmblookup '*'.\n");
42
43# get rid of all lines that are not a response IP address,
44# strip everything but IP address and sort by last field in address
45
46@ipaddrs = sort ipsort grep(s/ \*<00>.*$//,<NMBLOOKUP>);
47
48# print header info
49
50print "\nIP ADDR NETBIOS NAME WORKGROUP/OS/VERSION $BCAST\n";
51print "---------------------------------------------------------------------\n";
52
53foreach $ip (@ipaddrs) # loop through each IP address found
54{
55 $ip =~ s/\n//; # strip newline from IP address
56
57# find the netbios names registered by each machine
58
59 open(NMBLOOKUP,"$SAMBABIN/nmblookup -r -A $ip|") ||
60 die("Can't get nmb name list.\n");
61 @nmblookup = <NMBLOOKUP>;
62 close NMBLOOKUP;
63
64# get the first <00> name
65
66 @name = grep(/<00> - /,@nmblookup);
67 $_ = @name[0];
68 if ($_) { # we have a netbios name
69 if (/GROUP/) { # is it a group name
70 ($name, $aliases, $type, $length, @addresses) =
71 gethostbyaddr(pack('C4',split('\.',$ip)),2);
72 if (! $name) { # could not get name
73 $name = "unknown nis name";
74 }
75 } else {
76 /(.{1,15})\s+<00>\s+/;
77 $name = $1;
78 }
79
80# do an smbclient command on the netbios name.
81
82 open(SMB,"$SAMBABIN/smbclient -N -L $name -I $ip -U% |") ||
83 die("Can't do smbclient command.\n");
84 @smb = <SMB>;
85 close SMB;
86
87 if ($DEBUG) { # if -d flag print results of nmblookup and smbclient
88 print "===============================================================\n";
89 print @nmblookup;
90 print @smb;
91 }
92
93# look for the OS= string
94
95 @info = grep(/OS=/,@smb);
96 $_ = @info[0];
97 if ($_) { # we found response
98 s/.*Domain=|OS=|Server=|\n//g; # strip out descriptions to make line shorter
99
100 } else { # no OS= string in response (WIN95 client)
101
102# for WIN95 clients get workgroup name from nmblookup response
103 @name = grep(/<00> - <GROUP>/,@nmblookup);
104 $_ = @name[0];
105 if ($_) {
106 /(.{1,15})\s+<00>\s+/;
107 $_ = "[$1]";
108 } else {
109 $_ = "Unknown Workgroup";
110 }
111 }
112
113# see if machine registered a local master browser name
114 if (grep(/<1d>/,@nmblookup)) {
115 $master = '+'; # indicate local master browser
116 if (grep(/<1b>/,@nmblookup)) { # how about domain master browser?
117 $master = '*'; # indicate domain master browser
118 }
119 } else {
120 $master = ' '; # not a browse master
121 }
122
123# line up info in 3 columns
124
125 print "$ip".' 'x(16-length($ip))."$name".' 'x(14-length($name))."$master"."$_\n";
126
127 } else { # no netbios name found
128# try getting the host name
129 ($name, $aliases, $type, $length, @addresses) =
130 gethostbyaddr(pack('C4',split('\.',$ip)),2);
131 if (! $name) { # could not get name
132 $name = "unknown nis name";
133 }
134 if ($DEBUG) { # if -d flag print results of nmblookup
135 print "===============================================================\n";
136 print @nmblookup;
137 }
138 print "$ip".' 'x(16-length($ip))."$name\n";
139 }
140}
141
Note: See TracBrowser for help on using the repository browser.