home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / sendmail / sendmail-5.65c+IDA-1.4.4.1 / mailstats / syslog-stat.pl < prev    next >
Encoding:
Perl Script  |  1990-12-14  |  2.7 KB  |  132 lines

  1. #! /usr/local/bin/perl
  2.  
  3. # Print a weekly summary of email activity.  Written by Paul Vixie, DEC
  4.  
  5. $logdir = "/usr/spool/mqueue";
  6. $secperday = 24 * 60 * 60;
  7. $shortdelay = $secperday / 2;
  8. $K = 1024;
  9.  
  10.  
  11. format q_top =
  12.  Syslog    Input: (total)      (mail11)     Output Statistics:
  13. File Date  Msgs Kbytes AvgSz  Sndrs Rcips   Sent AvgDelay Dferd Que'd Other
  14. .
  15. format q_line =
  16. @< @<<<<< @>>>> @>>>>> @>>>>  @>>>> @>>>>  @>>>> @>>>>>>> @>>>> @>>>> @>>>>
  17. $logfn,$date,$msgs,$kbytes,$avgsiz,$m11sndr,$m11rcip,$sent,$avgdly,$dferd,$queued,$other
  18. .
  19.  
  20. $^ = "q_top";
  21. $~ = "q_line";
  22.  
  23. chdir($logdir) || die "can't chdir to $logdir: $!";
  24. foreach $logfn (<syslog.*>) {
  25.     open(stdin, "<$logfn") || die "can't open $logfn: $!";
  26.     &mailstats();
  27.     close(stdin);
  28.     $logfn =~ s/^.*\./\./;
  29.     write();
  30. }
  31.  
  32. exit(0);
  33.  
  34. sub mailstats {
  35. ($msgs,$bytes,$delay,$m11sndr,$m11rcip) = (0,0,0,0,0);
  36. $date = "";
  37. %stati = ();
  38. while (<>) {
  39.     ($mon,$dd,$time,$host,$client,$qid,@rest) = split;
  40.     @rest=split(/, /,join(' ',@rest));
  41.     $date = sprintf("%s %2d", $mon, $dd) if ($date eq "");
  42.     if ($client =~ /sendmail\[[0-9]+\]:/) {
  43.         if ($rest[0] =~ /^from=/ && $rest[1] =~ /^size=(\d+)/) {
  44.             $msgs++;
  45.             $bytes += $1;
  46.         } elsif ($rest[0] =~ /^to=/) {
  47.             if ($rest[2] =~ /Deferred/) {
  48.                 if ($deferred{$qid}) {
  49.                     next;
  50.                 } else {
  51.                     $deferred{$qid}++;
  52.                 }
  53.             }
  54.             $rest[1] =~ /^delay=([^,]+)/;
  55.             $md = $1;
  56.             $d = 0;
  57.             if ($md =~ /(\d+)\+(.+)/) {
  58.                 $d += $md * $secperday;
  59.                 $md =~ s/\d+\+//;
  60.             }
  61.             $md =~ /^delay=(\d+):(\d+):(\d+)/;
  62.             $d += ($1 * 3600 + $2 * 60 + $3);
  63.             $delay += $d if ($d < $shortdelay);
  64.             $rest[2] =~ /^stat=(.+)(.*)/;
  65.             $stat = $1." ".$2;
  66.             $stati{$stat}++;
  67.         }
  68.     }
  69.     if ($client eq "mail11d:") {
  70.         if ($rest[0] =~ /^from=/) {
  71.             $m11sndr++;
  72.         } elsif ($rest[0] =~ /^to=/) {
  73.             $m11rcip++;
  74.         }
  75.     }
  76. }
  77.  
  78. #printf    "total input: %d msgs, %dKB (%d bytes avg)\n",
  79. #    $msgs, $bytes/$K, $bytes/$msgs;
  80.  
  81. #printf    "mail11 input: %d senders (msgs), %d recips\n",
  82. #    $mail11_senders, $mail11_recips;
  83.  
  84. if ($msgs == 0) {
  85.     $avgdly = &fmt_time(0);
  86. } else {
  87.     $avgdly = &fmt_time($delay / $msgs);
  88. }
  89.  
  90. $kbytes = int(0.5+$bytes/$K);
  91. if ($msgs == 0) {
  92.     $avgsiz = 0;
  93. } else {
  94.     $avgsiz = int(0.5+$bytes/$msgs);
  95. }
  96. $sent = $stati{"Sent "};
  97.  
  98. ($dferd, $other, $queued) = (0, 0, 0);
  99. foreach $stat (keys(%stati)) {
  100.     next if ($stat eq "Sent ");
  101.     if ($stat eq "queued ") {
  102.         $queued += $stati{$stat};
  103.         next;
  104.     }
  105.     if ($stat =~ /^Deferred/) {
  106.         $dferd += $stati{$stat};
  107.         next;
  108.     }
  109.     $other += $stati{$stat};
  110. }
  111. return;
  112. }
  113.  
  114. sub fmt_time {
  115.     local($t) = @_;
  116.     local($s) = int($t);
  117.     local($h) = int($s / 3600);  $s -= $h*3600;
  118.     local($m) = int($s / 60);  $s -= $m*60;
  119.     local($x) = "";
  120.  
  121.     if ($s || $m || $h) {
  122.         $x = sprintf("%02d", $s) .$x;
  123.     }
  124.     if ($m || $h) {
  125.         $x = sprintf("%02d:", $m) .$x;
  126.     }
  127.     if ($h) {
  128.         $x = sprintf("%2d:", $h) .$x;
  129.     }
  130.     return $x;
  131. }
  132.