1#!/usr/local/bin/perl
2#
3#@(#) smb-wall.pl Description:
4#@(#) A perl script which allows you to announce whatever you choose to
5#@(#) every PC client currently connected to a Samba Server...
6#@(#) ...using "smbclient -M" message to winpopup service.
7#@(#) Default usage is to message every connected PC.
8#@(#) Alternate usage is to message every pc on the argument list.
9#@(#)  Hacked up by Keith Farrar <farrar@parc.xerox.com>
10#
11# Cleanup and corrections by
12# Michal Jaegermann <michal@ellpspace.math.ualberta.ca>
13# Message to send can be now also fed (quietly) from stdin; a pipe will do.
14#=============================================================================
15
16$smbstatus = "/usr/local/bin/smbstatus";
17$smbshout = "/usr/local/bin/smbclient -M";
18
19if (@ARGV) {
20    @clients = @ARGV;
21    undef @ARGV;
22}
23else {  # no clients specified explicitly
24    open(PCLIST, "$smbstatus |") || die "$smbstatus failed!.\n$!\n";
25    while(<PCLIST>) {
26	last if /^Locked files:/;
27	split(' ', $_, 6);
28        # do not accept this line if less then six fields
29        next unless $_[5];
30        # if you have A LOT of clients you may speed things up by
31        # checking pid - no need to look further if this pid was already
32        # seen;  left as an exercise :-)
33        $client = $_[4];
34	next unless $client =~ /^\w+\./;       # expect 'dot' in a client name
35	next if grep($_ eq $client, @clients); # we want this name once
36	push(@clients, $client);
37    }
38    close(PCLIST);
39}
40
41if (-t) {
42    print <<'EOT';
43
44Enter message for Samba clients of this host
45(terminated with single '.' or end of file):
46EOT
47
48    while (<>) {
49	last if /^\.$/;
50	push(@message, $_);
51    }
52}
53else { # keep quiet and read message from stdin
54    @message = <>;
55}
56
57foreach(@clients) {
58##    print "To $_:\n";
59    if (open(SENDMSG,"|$smbshout $_")) {
60	print SENDMSG @message;
61	close(SENDMSG);
62    }
63    else {
64	warn "Cannot notify $_ with $smbshout:\n$!\n";
65    }
66}
67
68exit 0;
69
70