]> pere.pagekite.me Git - homepage.git/blob - mrtg/mailstats
Generated.
[homepage.git] / mrtg / mailstats
1 #!/usr/local/bin/perl -w
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 #
7 # Fetches output from mailstats(1) either via TCP or via exec and
8 # feeds changes on smtp to mrtg.
9 #
10 # Irix 6.x seems to lack mailstats
11 #
12 # Usage mailstats [host]
13 # if host is missing, localhost is used
14
15 use strict;
16 use Socket;
17
18 my($datafile, $source, $sourceport, @mailstatspaths,
19 $oldfrm, $oldto,
20 $newfrm, $newto, $uptime);
21
22 # Adjust this to your own mailserver. Uses local `mailstats` if set
23 # to 'localhost'
24 $source = $ARGV[0] || "localhost";
25 $sourceport = "7256";
26
27 $datafile = "/tmp/mailstat-$source.old";
28 @mailstatspaths = ( "/usr/sbin/mailstats", "/usr/bin/mailstats" );
29
30 ($oldfrm, $oldto) = getOldStats($datafile);
31
32 ($newfrm, $newto, $uptime) = getStats($source, $sourceport);
33
34 putOldStats($datafile, $newfrm, $newto) || warn "$0: Unable to save stats to $datafile";
35
36 print $newfrm-$oldfrm,"\n",$newto-$oldto,"\n","$uptime\n$source\n" if ($oldfrm);
37
38 ##
39 # Returns first line of file given as param splittet on space
40 sub getOldStats {
41 my($filename) = @_;
42 open(OLD, $filename) || warn "$0: Unable to open $filename for reading";
43 my($line) = <OLD>;
44 close(OLD);
45 return split(/ /, $line);
46 }
47
48 sub findFirstExecutable {
49 my($filename);
50 foreach $filename (@_) {
51 return $filename if ( -x $filename && ! -d $filename );
52 }
53 }
54
55 sub getStats {
56 my($source, $sourceport) = @_;
57 my(@output, $port, $proto, $iaddr, $paddr);
58 if ( $source eq "localhost" ) {
59 my($progpath) = findFirstExecutable(@mailstatspaths);
60 @output = `$progpath`;
61 chomp(@output);
62 } else {
63 $port = $sourceport;
64 $port = getservbyname ($sourceport, 'tcp') if ($sourceport =~ /\D/);
65 die "$0: Bad port \"$sourceport\"" unless ($port);
66 $proto = getprotobyname ('tcp') || die "$0: Bad prototype tcp";
67
68 $iaddr = inet_aton($source) or die "$0: no host \"$source\"";
69 $paddr = sockaddr_in($port, $iaddr);
70
71 socket (SOCK, PF_INET, SOCK_STREAM, $proto) or die "$0: socket error $!";
72 connect (SOCK, $paddr) or die "$0: connect error $!";
73
74 while (<SOCK>) {
75 push(@output,$_);
76 }
77 close(SOCK) || warn "$0: socket close error $!";
78 }
79 my($curfrm, $curto, $uptime);
80 foreach (@output) {
81 # Our sendmail reports smtp as uucp (stupid admin... :-)
82 ($curfrm, $curto) = (split(/ +/))[2,4] if (/uucp|e?smtp/);
83 ($uptime) = m/Statistics from (.*)/ if (/Stati/);
84 }
85 return ($curfrm, $curto, $uptime);
86 }
87
88 sub putOldStats {
89 my($filename, $frm, $to) = @_;
90 open(STAT, ">$filename") || return "";
91 print STAT "$frm $to\n";
92 close(STAT);
93 return "1";
94 }