Per prima cosa ho installato snmpd:
# apt-get install snmp snmpd
poi ho configurato le cose di base, ovvero l'uso della community public e le informazioni del sistema:
com2sec readonly default public syslocation MI sysname xyzrelay.cust.gnustile.net syscontact S.Sasso <root@xyzrelay.cust.gnustile.net>
ho quindi creato uno script per raccogliere le statistiche e inserirle in un file di log, che poi verrà recuperato da snmpd (grazie ad un'altro script).
/usr/local/sbin/scan_exim_log.pl
#!/usr/bin/perl
use POSIX qw(strftime);
$TOTAL = "/var/log/scan_exim_log.total";
$EXIM = "/usr/sbin/exim";
$number_in = $number_out = $cancelled = $rejected = 0;
$frozen = $queued = $to_deliver = $qkb = $largest = 0;
open(LOG,"</var/log/exim4/mainlog")
|| die "$0: couldn't open mainlog: $!";
while(<LOG>) {
if (/<=/) {
$number_in++;
} elsif (/[-=]>/) {
$number_out++;
} elsif (/cancelled by system filter:/) {
$cancelled++;
}
}
close(LOG);
$now = strftime("%Y-%m-%d %H:%M", gmtime(time - 300));
open(LOG,"</var/log/exim4/rejectlog")
|| die "$0: couldn't open rejectlog: $!";
while(<LOG>) {
if (/rejected/) {
$rejected++;
}
}
close(LOG);
open(MAILQ, "$EXIM -bp|")
|| die "$0: couldn't open pipe from Exim ($EXIM): $!";
while(<MAILQ>) {
chop;
if (/[<>]/) {
$frozen++ if /frozen/;
$queued++;
s/\s+/ /g;
my ($time, $size, $msgid, $sender) = split;
if ($size =~ /K$/) {
$size =~ s/K$//;
$size *= 1024; # multiply by 1024 to go from KB -> bytes
$qkb += int($size);
} elsif ($size =~ /M/) {
$size =~ s/M$//;
$size *= 1024; # multiply by 1024 to go from MB -> KB
$size *= 1024; # multiply by 1024 to go from KB -> bytes
$qkb += int($size);
} else {
$qkb += int($size);
}
if ($size > $largest) {
$largest = int($size);
}
} else {
next if /D /;
$to_deliver++;
}
}
close(MAILQ);
open(TOTAL,">$TOTAL.$$")
|| die "Can't write the file 'scan_exim_log.total.$$'\n";
print TOTAL <<EOF;
$frozen
$queued
$to_deliver
$qkb
$largest
$number_in
$number_out
$rejected
EOF
close(TOTAL);
rename("/var/log/scan_exim_log.total.$$", "/var/log/scan_exim_log.total");
/usr/local/sbin/qpeek.pl
#!/usr/bin/perl
$TOT = "/var/log/scan_exim_log.total";
open(EXIM_TOTALS, "$TOT")
|| die "$0: couldn't open Exim totals $TOT: $!";
while() {
chop;
print "$_\n";
}
close(EXIM_TOTALS);
inserisco quindi in snmpd.conf
exec .1.3.6.1.4.1.3032.64 qpeek.pl /usr/local/sbin/qpeek.pl
e riavvio snmpd:
/etc/init.d/snmpd restart
Inserisco ora una entry nel crontab per recuperare le statistiche ogni 5 minuti:
/etc/cron.d/scan_exim_logs
*/5 * * * * root /usr/local/sbin/scan_exim_log.pl >/dev/null 2>&1
Si presuppone poi che mrtg sia già stato configurato per monitorare rete, memoria, cpu, etc...; vedremo solo come configurarlo per graficare le statistiche di exim;
aggiungiamo quindi alla configurazione di mrtg (/etc/mrtg.cfg):
# queued messages to deliver Target[queued]: 1.3.6.1.4.1.3032.64.101.3&1.3.6.1.4.1.3032.64.101.3:public@localhost Title[queued]: Messages to deliver (full queue) MaxBytes[queued]: 10000 PageTop[queued]: <H1>Messages to deliver (full queue)</H1> YLegend[queued]: Messages ShortLegend[queued]: msgs LegendI[queued]: Messages to deliver LegendO[queued]: Legend1[queued]: Messages to deliver Legend2[queued]: Options[queued]: growright,nopercent,gauge # queued vs frozen Target[queuedfrozen]: 1.3.6.1.4.1.3032.64.101.2&1.3.6.1.4.1.3032.64.101.1:public@localhost Title[queuedfrozen]: Queued vs. frozen messages MaxBytes[queuedfrozen]: 15000 PageTop[queuedfrozen]: <H1>Queued vs. frozen messages</H1> YLegend[queuedfrozen]: Messages LegendI[queuedfrozen]: Queued LegendO[queuedfrozen]: Frozen Legend1[queuedfrozen]: Queued Legend2[queuedfrozen]: Frozen ShortLegend[queuedfrozen]: msgs Options[queuedfrozen]: growright,nopercent,gauge # queue size Target[qkblargest]: 1.3.6.1.4.1.3032.64.101.4&1.3.6.1.4.1.3032.64.101.5:public@localhost Title[qkblargest]: Queue size vs largest msg. MaxBytes[qkblargest]: 100000000000 PageTop[qkblargest]: <H1>Queue size vs largest msg.</H1> YLegend[qkblargest]: Size LegendI[qkblargest]: Queue size LegendO[qkblargest]: Largest size Legend1[qkblargest]: Queue size Legend2[qkblargest]: Largest size Options[qkblargest]: growright,nopercent,gauge ShortLegend[qkblargest]: b # In/Out Target[msginout]: 1.3.6.1.4.1.3032.64.101.6&1.3.6.1.4.1.3032.64.101.7:public@localhost Title[msginout]: In vs Out (msg) MaxBytes[msginout]: 100000000000 PageTop[msginout]: <H1>In vs Out (msg)</H1> YLegend[msginout]: Messages LegendI[msginout]: In LegendO[msginout]: Out Legend1[msginout]: In Messages Legend2[msginout]: Out Messages Options[msginout]: growright,nopercent,gauge ShortLegend[msginout]: msgs # rejected Target[rejected]: 1.3.6.1.4.1.3032.64.101.8&1.3.6.1.4.1.3032.64.101.8:public@localhost Title[rejected]: Rejected at SMTP time MaxBytes[rejected]: 10000 PageTop[rejected]: <H1>Rejected at SMTP time</H1> YLegend[rejected]: Messages ShortLegend[rejected]: msgs LegendI[rejected]: Rejected LegendO[rejected]: Legend1[rejected]: Rejected Legend2[rejected]: Options[rejected]: growright,nopercent,gauge
rigeneriamo poi l'indice di mrtg
# indexmaker /etc/mrtg.cfg --columns=2 --output /var/www/mrtg/index.html
e lanciamo un paio (o più :) ) di volte mrtg stesso, per generare i primi dati
# mrtg ; mrtg ; mrtg