Mit MRTG POP3/IMAP Logins etc. auflisten

Benny²

Member
hallo,

ich wollte in meinem MRTG die IMAP, POP3 Logins sowie den Mailausgang, der noch in der Warteschlange liegt, sowie die Mails, die noch durch den Postgrey laufen anzeigen.

Ich hab das mit folgen Code für IMAP schon mal probiert:

Code:
use Time::Local;

# Global Vars
$IntMins = "5";                     # Set this to your MRTG interval
$MailLogFile = "/var/log/mail.log";  # Change this if your maillog isn't here.
$SuccessCount = "0";
#$FailCount = "0";


# Exec
&Get_Time;
&Process_Log;
&Print_Totals;


# Subroutines
sub Get_Time {
  # Gets the start time and sets global variables.

  $timestart = time();
  my $date = localtime();
  my($day, $month, $num, $time, $year) = split(/\s+/,$date);
  $timeyear = $year;
}


sub Back_Time {
  # This is a debug mechanism for taking the seconds and converting them
  # back to human readable date format. (Not used in operation.)

  my $date = localtime($_[0]);
  my ($day, $month, $num, $time, $year) = split(/\s+/,$date);
  my $back = "[$month $num $time]";
  return $back;
}


sub Rec_Time {
  # Takes a date string on input and returns the universal second count
  # which is better for comparing intervals.
  #   input format is 'Sep 26 16:27:50' (syslog)
  
  my @DateString = split(/\ /,$_[0]);
  my @TimeString = split(/:/,$DateString[2]);
  my $month = $DateString[0];
  if ($month eq "Jan") { $month = "1"; }
  if ($month eq "Feb") { $month = "2"; }
  if ($month eq "Mar") { $month = "3"; }
  if ($month eq "Apr") { $month = "4"; }
  if ($month eq "May") { $month = "5"; }
  if ($month eq "Jun") { $month = "6"; }
  if ($month eq "Jul") { $month = "7"; }
  if ($month eq "Aug") { $month = "8"; }
  if ($month eq "Sep") { $month = "9"; }
  if ($month eq "Oct") { $month = "10"; }
  if ($month eq "Nov") { $month = "11"; }
  if ($month eq "Dec") { $month = "12"; }
  $month = int($month - 1);
  my $iseconds = timelocal($TimeString[2],$TimeString[1],$TimeString[0]
                            ,$DateString[1],$month,$timeyear);
  return $iseconds;
}


sub Process_Log {
  # Bulk of the processing occurs here.
  # 1. Mail Log is inputted and checked for 'score=2.0,' format entries.
  # 2. Only entries that fall within our program's interval are checked.
  # 3. A total is divided by a count producing an average.
  # 4. A global var is set with the average.
  
  my $int_secs = int($IntMins * 60);
  
  open (MAILLOG,$MailLogFile);
  while ($cline = <MAILLOG>) {
    if ($cline =~ "imapd: Connection") {
      if ($cline =~ "imapd: Disconnected") {
        my @curline = split(/\ /,$cline);
        my $test = "$curline[1]";
        if ($test ne "") {
          $recsecs = Rec_Time("$curline[0] $curline[1] $curline[2]");
        } else {
          $recsecs = Rec_Time("$curline[0] $curline[2] $curline[3]");
        }

        my $distsecs = int($timestart - $recsecs);

        if ($int_secs > $distsecs && $distsecs > 0) {
          # Ok, count this one
          $SuccessCount++;
        }
      }
    }
  }
  close MAILLOG;

}


sub Print_Totals {
  # Output the total in MRTG format.

  print "$SuccessCount\n";
  print "$SuccessCount\n";
}


exit 0;

Aber leider klappt das nicht so wie ich mir das vorstellt habe, weil dort keine Daten angezeigt werden. Ich mit mit meinem Rechner auf ein IMAP-Konto angemeldet, es wird aber immer noch 0 angezeigt.

Wie kann ich das ändern?


PS: Die Codes für die anderen Befehle sehen fast genauso aus, nur dass im cline das verändert ist.
 
Hast D im MRTG unter Options auch "gauge"? Das ist schließlich kein Interface-Counter.
Läuft das Script standalone? Was steht im Log?
 
Hast D im MRTG unter Options auch "gauge"? Das ist schließlich kein Interface-Counter.
Läuft das Script standalone? Was steht im Log?

also in der option steht bei jedem Script folgendes drin:
Options[ipop3]: gauge,nopercent,integer,growright
also auch gauge

das Script wird dann über die MRTG abgerufen und jedes läuft einzeln, da es sonst andere Probleme gibt.
Im Log steht nichts drin und es gibt auch keine Fehlermeldung, außer dass ich ab und zu mal folgende Meldung erhalte, die aber nach einigen Minuten etc. wieder verschwindet.

Code:
2012-09-15 00:12:02, Rateup WARNING: /usr/bin/rateup Can't remove ismtp.old updating log file
 
Die Fehlermeldung kommt immer, wenn die Rechte an der Datei nicht stimmen (beispielsweise, weil das Script per Cronjob als nobody ausgeführt wird, Du es aber vorher als root getestet hast.

Mit Logfile meinte ich die ismtp.log (oder ipop3.log) in der die Werte stehen (falls nicht Logformat RRD eingestellt ist, sonst ist es eine ebensolche).

Dort stehen neben einem Unix-Zeitstempel die aktuellen Werte und die History, aus der dann die Graphen berechnet werden.

Wenn die Datei aus Rechte-Gründen nicht geschrieben werden kann, kann sich auch kein Graph bilden.
 
Die Fehlermeldung kommt immer, wenn die Rechte an der Datei nicht stimmen (beispielsweise, weil das Script per Cronjob als nobody ausgeführt wird, Du es aber vorher als root getestet hast.

Mit Logfile meinte ich die ismtp.log (oder ipop3.log) in der die Werte stehen (falls nicht Logformat RRD eingestellt ist, sonst ist es eine ebensolche).

Dort stehen neben einem Unix-Zeitstempel die aktuellen Werte und die History, aus der dann die Graphen berechnet werden.

Wenn die Datei aus Rechte-Gründen nicht geschrieben werden kann, kann sich auch kein Graph bilden.

hmm, sehr fraglich, denn ich führe das Skript der root aus. Deshalb wundert mich das ja

naja, in der log steht folgendes:
Code:
1347779161 0 0
1347779161 0 0 0 0
1347779161 0 0 0 0
1347779100 0 0 0 0
1347778800 0 0 0 0
1347778500 0 0 0 0
1347778200 0 0 0 0
1347777900 0 0 0 0
1347777600 0 0 0 0
1347777300 0 0 0 0
1347777000 0 0 0 0
1347776700 0 0 0 0
1347776400 0 0 0 0
1347776100 0 0 0 0
1347775800 0 0 0 0
1347775500 0 0 0 0
1347775200 0 0 0 0
1347774900 0 0 0 0
1347774600 0 0 0 0
1347774300 0 0 0 0
1347774000 0 0 0 0
1347773700 0 0 0 0
1347773400 0 0 0 0
1347773100 0 0 0 0
1347772800 0 0 0 0
1347772500 0 0 0 0
1347772200 0 0 0 0
1347771900 0 0 0 0
1347771600 0 0 0 0
1347771300 0 0 0 0
1347771000 0 0 0 0
1347770700 0 0 0 0
1347770400 0 0 0 0
1347770100 0 0 0 0
1347769800 0 0 0 0
1347769500 0 0 0 0
1347769200 0 0 0 0
1347768900 0 0 0 0
1347768600 0 0 0 0
1347768300 0 0 0 0
1347768000 0 0 0 0
1347767700 0 0 0 0
1347767400 0 0 0 0
1347767100 0 0 0 0
1347766800 0 0 0 0
1347766500 0 0 0 0
1347766200 0 0 0 0
1347765900 0 0 0 0
1347765600 0 0 0 0
1347765300 0 0 0 0
 
Ich denke das Script funktioniert nicht.
Hast Du es schon mal auf der Console (also ganz ohne MRTG) getestet?
1.) Die Shebang-Zeile fehlt: #!/usr/bin/perl
2.) Es werden globale Variablen genutzt ($timestart, $timeyear), welche aber nicht global definiert sind.
3.) MRTG möchte gerne 4 Zeilen bekommen, nicht nur 2.
4.) Es werden im Logfile nach bestimmten Pattern gesucht. Wenn Dein IMAP-Server aber andere Log-Messages schreibt, so findet er natürlich nie etwas.
5.) Es ist zwar legitim sowas zu schreiben:
$cline =~ "imapd: Disconnected"
Aber in Perl sieht das etwas krank aus. Slashes sind die gebräuchlichen Einschließer (enclosements) für Regex.

Tipp: Teste die Perl-Scripte erstmal solange bis sie auf der Console eine korrekte Ausgabe bringen. Dann erst im MRTG.

huschi.
 
Back
Top