mailstats
上传用户:shbosideng
上传日期:2013-05-04
资源大小:1555k
文件大小:3k
源码类别:

SNMP编程

开发平台:

C/C++

  1. #!/usr/local/bin/perl
  2. #
  3. # Author:  Petter Reinholdtsen <pere@td.org.uit.no>
  4. # Date:    1997-07-09
  5. # The original was written by Rachel Polanskis <rachel@juno.virago.org.au>
  6. # Fetches output from mailstats(1) either via TCP or via exec and
  7. # feeds changes on smtp to mrtg.
  8. #
  9. # Irix 6.x seems to lack mailstats
  10. #
  11. # Usage mailstats [host]
  12. #  if host is missing, localhost is used
  13. use strict;
  14. use Socket;
  15. my($datafile, $source, $sourceport, @mailstatspaths,
  16.    $oldfrm, $oldto,
  17.    $newfrm, $newto, $uptime);
  18. # Adjust this to your own mailserver.  Uses local `mailstats` if set
  19. # to 'localhost'
  20. $source         = $ARGV[0] || "localhost";
  21. $sourceport     = "7256";
  22. $datafile       = "/tmp/mailstat-$source.old";
  23. @mailstatspaths = ( "/usr/sbin/mailstats", "/usr/bin/mailstats" );
  24. ($oldfrm, $oldto) = getOldStats($datafile);
  25. ($newfrm, $newto, $uptime) = getStats($source, $sourceport);
  26. putOldStats($datafile, $newfrm, $newto) || warn "$0: Unable to save stats to $datafile";
  27. print $newfrm-$oldfrm,"n",$newto-$oldto,"n","$uptimen$sourcen" if ($oldfrm);
  28. ##
  29. # Returns first line of file given as param splittet on space
  30. sub getOldStats {
  31.     my($filename) = @_;
  32.     open(OLD, $filename) || warn "$0: Unable to open $filename for reading";
  33.     my($line) = <OLD>;
  34.     close(OLD);
  35.     return split(/ /, $line);
  36. }
  37. sub findFirstExecutable {
  38.     my($filename);
  39.     foreach $filename (@_) {
  40. return $filename if ( -x $filename && ! -d $filename );
  41.     }
  42. }
  43. sub getStats {
  44.     my($source, $sourceport) = @_;
  45.     my(@output, $port, $proto, $iaddr, $paddr);
  46.     if ( $source eq "localhost" ) {
  47. my($progpath) = findFirstExecutable(@mailstatspaths);
  48. @output = `$progpath`;
  49. chomp(@output);
  50.     } else {
  51. $port = getservbyname ($sourceport, 'tcp') if ($sourceport =~ /D/);
  52. die "$0: Bad port "$sourceport"" unless ($port);
  53. $proto = getprotobyname ('tcp') || die "$0: Bad prototype tcp";
  54. $iaddr = inet_aton($source) or die "$0: no host "$source"";
  55. $paddr = sockaddr_in($port, $iaddr);
  56. socket (SOCK, PF_INET, SOCK_STREAM, $proto) or die "$0: socket error $!";
  57. connect (SOCK, $paddr) or die "$0: connect error $!";
  58. while (<SOCK>) {
  59.     push(@output);
  60. }
  61. close(SOCK) || warn "$0: socket close error $!";
  62.     }
  63.     my($curfrm, $curto, $uptime);
  64.     foreach (@output) {
  65. ($curfrm, $curto) = (split(/ +/))[2,4] if (/e?smtp/);
  66. ($uptime) = m/Statistics from (.*)/ if (/Stati/);
  67.     }
  68.     return ($curfrm, $curto, $uptime);
  69. }
  70. sub putOldStats {
  71.     my($filename, $frm, $to) = @_;
  72.     open(STAT, ">$filename") || return "";
  73.     print STAT "$frm $ton";
  74.     close(STAT);
  75.     return "1";
  76. }