]> arthur.barton.de Git - netatalk.git/blob - contrib/macusers/macusers.in
case-conversion slightly faster
[netatalk.git] / contrib / macusers / macusers.in
1 #!@PERL@
2
3 use strict;
4 use Socket;
5 use vars qw($MAC_PROCESS $PS_STR $MATCH_STR $ASIP_PORT_NO $ASIP_PORT $LSOF);
6
7 # Written for linux; may have to be modified for your brand of Unix.
8 # Support for FreeBSD added by Joe Clarke <marcus@marcuscom.com>.
9 # Support Solaris added by Frank Lahm <franklahm@googlemail.com>.
10 # Support has also been added for 16 character usernames.
11
12 $MAC_PROCESS = "afpd";
13 if ($^O eq "freebsd" || $^O eq "openbsd") {
14         $PS_STR    = "-awwxouser,pid,ppid,start,command";
15         $MATCH_STR = '(\w+)\s+(\d+)\s+(\d+)\s+([\d\w:]+)';
16 } elsif ($^O eq "solaris") {
17         $PS_STR    = "-eo user,pid,ppid,c,stime,tty,time,comm";
18         $MATCH_STR = '\s*(\w+)\s+(\d+)\s+(\d+)\s+\d+\s+([\d\w:]+)';
19 } else {
20         $PS_STR    = "-eo user:32,pid,ppid,c,stime,tty,time,cmd";
21         $MATCH_STR = '\s*(\w+)\s+(\d+)\s+(\d+)\s+\d+\s+([\d\w:]+)';
22 }
23 $ASIP_PORT    = "afpovertcp";
24 $ASIP_PORT_NO = 548;
25
26 # Change to 0 if you don't have lsof
27 $LSOF = 1;
28 my %mac = ();
29
30 if ($^O eq "freebsd") {
31         open(SOCKSTAT, "sockstat -4 | grep $MAC_PROCESS | grep -v grep |");
32
33         while (<SOCKSTAT>) {
34                 next if ($_ !~ /$MAC_PROCESS/);
35                 $_ =~
36                     /\S+\s+\S+\s+(\d+)\s+\d+\s+[\w\d]+\s+[\d\.:]+\s+([\d\.]+)/;
37                 my ($pid, $addr, $host);
38                 $pid  = $1;
39                 $addr = $2;
40                 $host = gethostbyaddr(pack('C4', split (/\./, $addr)), AF_INET);
41                 ($host) = ( $host =~ /(^(\d+\.){3}\d+|[\w\d\-]+)/ );
42                 $mac{$pid} = $host;
43         }
44         print
45             "PID      UID      Username         Name                 Logintime Mac\n";
46         close(SOCKSTAT);
47 } elsif ($^O eq "solaris") {
48         if ($< != 0) {
49             print "must be run as root\n";
50             exit(1);
51         }
52         print "PID      UID      Username         Name                 Logintime Mac\n";
53 } elsif ($LSOF == 1) {
54         open(LSOF, "lsof -i :$ASIP_PORT |");
55
56         while (<LSOF>) {
57                 next if ($_ !~ /$ASIP_PORT/);
58                 $_ =~ /\w+\s+(\d+).*->([\w\.-]+).*/;
59                 my ($pid, $host);
60                 $pid  = $1;
61                 $host = $2;
62                 ($host) = ( $host =~ /(^(\d+\.){3}\d+|[\w\d\-]+)/ );
63                 $mac{$pid} = $host;
64         }
65         print
66             "PID      UID      Username         Name                 Logintime Mac\n";
67         close(LSOF);
68 } else {
69         print
70             "PID      UID      Username         Name                 Logintime\n";
71 }
72
73 open(PS, "ps $PS_STR |") || die "Unable to open a pipe to ``ps''";
74
75 while (<PS>) {
76         next if ($_ !~ /$MAC_PROCESS/);
77         my ($user, $pid, $ppid, $time, $name, $uid, $t, $ip);
78         $_ =~ /$MATCH_STR/;
79         $user = $1;
80         $pid  = $2;
81         $ppid = $3;
82         $time = $4;
83
84         if ($ppid != 1) {
85                 if ($^O eq "solaris") {
86                         open(PFILES, "pfiles $pid |");
87                         while (<PFILES>) {
88                                 next if ($_ !~ /port: $ASIP_PORT_NO/);
89                                 while (<PFILES>) {
90                                         next if ($_ !~ /peername/);
91                                         if ($_ =~ /AF_INET (.*) port/) {
92                                             $ip = $1;
93                                             if ($ip =~ /::ffff:(.*)/ ) {
94                                                 $ip = $1;
95                                             }
96                                         }
97                                         $mac{$pid} = $ip;
98                                         last;
99                                 }
100                                 last;
101                         }
102                         close(PFILES);
103                 }
104
105                 ($t, $t, $uid, $t, $t, $t, $name, $t, $t) = getpwnam($user);
106                 ($name) = ( $name =~ /(^[^,]+)/ );
107                 printf "%-8d %-8d %-16s %-20s %-9s %s\n", $pid, $uid, $user,
108                     $name, $time, $mac{$pid};
109         }
110 }
111
112 close(PS);