bin@rhesus.primate.wisc.edu (Brain in Neutral) (04/24/88)
My humble submission: Here's a perl script I use here to summarize the mail traffic on my machine. I'm sure the level of perl-fluency is pretty barbaric, since I'm just learning it, but that's how it goes. Basically, the script below takes information from the /usr/spool/mqueue/syslog file, crunches it up and spits out a summary of the number and size of messages, by category: local -> local, local -> remote, remote -> local and remote -> remote. A message appears in the summary only if there is a from= line matched by a to= line which has status "Sent" (i.e, those with to= lines having status "host unknown" or something are considered incomplete). A local address is considered to be either a user name by itself, or of the form user@machine, where machine is either rhesus.primate.wisc.edu (the fully qualified name) or rhesus (the short name). If that machine is found, it's stripped off. Remote names then are those with @ % or ! in them. My use of this is to look especially at the volume of local->remote and remote->local traffic. I expect this to increase over time as my now-rather- naive users become aware of the possibilities for inter-machine mail, in particular, collaboration on manuscripts with colleagues at geographically distant sites. Save in a file called "mailstat", chmod to 755. --- cut here --- #!/usr/local/perl # mailstat - generate rudimentary mail traffic statistics # input should be the syslog sendmail lines, but only the columns # following the "sendmail:" column. That should look like: # AAnnnnn from=... # AAnnnnn to=... # ^ ^ # msgid type # On Ultrix 1.2 do this: # grep sendmail /usr/adm/mqueue/syslog | cut -d" " -f7- | mailstat # does not work properly for multiple recipient messages (to=x,y,z) # 22 April 1988 Paul DuBois dubois@rhesus.primate.wisc.edu # ---- # get the host name (assumes Internet style) so can recognize address # with that host as local names and not remote. Sometimes the host # is given as just the short form, so figure that out as the first # part of the long name. Presumably there should be some effort # to determine the uucp name as well for similar purposes, but that's # not done here. open (tmp, "hostname|"); $host = <tmp>; chop ($host); $shorthost = $host; $shorthost =~ s/\..*//; close (tmp); $sent = 0; $received = 0; @id = (); @from = (); @size = (); @to = (); while (<>) # for each line... { chop; # toss newline @f = split; # split into fields $mid = $f[0]; # message id $type = $f[1]; # message type (message-id, from, to) $type =~ y/A-Z/a-z/; # make sure lowercase $mid =~ s/://; # toss colon $id{$mid} = $mid; # record number if ($type =~ /^from/) # who the message is from { $type =~ s/^from=(.*),/$1/; # strip from= and comma $type =~ s/^<(.*)>$/$1/; # strip < > if present $type =~ s/@$host//; # strip local host if present $type =~ s/@$shorthost//; # ditto with short form $from{$mid} = $type; # save sender name $f[2] =~ s/^size=(.*),/$1/; # message size $size{$mid} = $f[2]; # save size $sent++; } elsif ($type =~ /^to/) # who the message is to { unless ($f[3] =~ /Sent/) # skip if not Sent (don't want { # "host unknown", etc.) next; } $type =~ s/^to=(.*),/$1/; # strip to= and comma $type =~ s/^<(.*)>$/$1/; # strip < > if present $type =~ s/@$host//; # strip local host if present $type =~ s/@$shorthost//; # ditto with short form $to{$mid} = $type; # save recipient name $received++; } } # loop through information, figure out how many of each type of # message were found, and compute stats on each $in = 0; # incomplete message (either no from or no to) $nll = $nlr = $nrl = $nrr = 0; # number of each kind $sll = $slr = $srl = $srr = 0; # size of each kind @keys = keys (id); for ($i = 0; $i <= $#keys; $i++) { #print $i, " ", $keys[$i], " "; #print "from=", $from{$keys[$i]}, " ", "to=", $to{$keys[$i]}, "\n"; $f = $from{$keys[$i]}; $t = $to{$keys[$i]}; $s = $size{$keys[$i]}; if ($f eq "" || $t eq "") { #print "incomplete\n"; $in++; next; } if ($f =~ /[@%!]/) # remote from { if ($t =~ /[@%!]/) # remote to { #print "remote/remote\n"; $nrr++; $srr += $s; } else # local to { #print "remote/local\n"; $nrl++; $srl += $s; } } else # local from { if ($t =~ /[@%!]/) # remote to { #print "local/remote\n"; $nlr++; $slr += $s; } else # local to { #print "local/local\n"; $nll++; $sll += $s; } } } sub stats { printf "%s %4d %7d ", $_[0], $_[1], $_[2]; if ($_[1] > 0) { $_[1] = $_[2]/$_[1]; } printf "%9.2f\n", $_[1]; } #print "Messages sent: ", $sent, "\n"; #print "Messages received: ", $received, "\n"; print "Messages failed, still queued, or sent by system: ", $in, "\n"; print "message number total bytes/\n"; print "type msgs bytes msg\n"; do stats ("local/local:", $nll, $sll); do stats ("local/remote:", $nlr, $slr); do stats ("remote/local:", $nrl, $srl); do stats ("remote/remote:", $nrr, $srr); do stats ("total: ", $nll+$nlr+$nrl+$nrr, $sll+$slr+$srl+$srr);