#!/usr/bin/perl -w

#
# check_fritzbox_pushmail plugin for nagios
#
# usage:
#    check_fritzbox_pushmail warn crit
#      Warn and Crit Value in MB
#
# Version: 0.1 December 2013 by Thomas Bruckmann
#
# Copyright Notice: GPL (http://www.gnu.org/licenses/gpl.html)
#
# Use this on your Risk!

use strict;

use Net::POP3;
use Mail::Internet;

# Konfig
# Escape @ with \, for example user\@mailserver.de
my $username = "user\@example.com";
my $password = "123456";
my $pop3Server = "pop3.example.com";
# Konstanten
#my $capacity_tmp_file = "/tmp/fritzbox_push_last_capacity";
# Has to be writable for the nagios User
my $capacity_tmp_file = "/var/lib/nagios/fritzbox_push_last_capacity";
my $TMP_MESSAGEFILE = "/tmp/messagefile";
my $SUBJECTSTRING = "FRITZ!Box Push Service vom";

(my $warn, my $crit) = @ARGV;
my $capacity = -1;

# Konstruktor
my $pop3srv = Net::POP3->new($pop3Server, Timeout => 60);

# Am Server einloggen
if ($pop3srv->login($username, $password) > 0) {
  # Anzahl der Nachrichten ermitteln
  my $msgnums = $pop3srv->list;
  # Jede Nachricht abarbeiten
  foreach my $msgnum (keys %$msgnums) {
    # Referenz zum Array mit der aktuellen Nachricht holen
    my $msg = $pop3srv->get($msgnum);
    # Aktuelle Nachricht in eine temporaere Datei schreiben
    open MESSAGE, ">$TMP_MESSAGEFILE" or die "Temporaere Messagedatei konnte nicht geoeffnet werden!";
    print MESSAGE @{$msg};
    close(MESSAGE);
    # Nachricht wieder aus der temp-Datei auslesen und in ein Mail-Objekt packen
    open MESSAGE, "<$TMP_MESSAGEFILE" or die "Temporaere Messagedatei konnte nicht geoeffnet werden!";
    my $mail = Mail::Internet->new( \*MESSAGE );
    close MESSAGE;
    # Den Betreff aus dem Mailobjekt auslesen
    my $subject = $mail->head->get("Subject");
#    print $subject;
    # Pruefen ob der Betreff verraet dass es eine Nachricht der Fritzbox ist
    if (index($subject, $SUBJECTSTRING) > -1) {
      # Wenn ja, dann den Body nach dem verbrauchten Datenvolumen in diesem Monat durchsuchen
      my $body = $mail->body;
      my $inAktuellerMonat = 0;
      foreach my $line (@{$body}) {
        if (index($line, "Aktueller Monat:") > -1) {
          $inAktuellerMonat = 1;
        }
        if ($inAktuellerMonat) {
          if ($line =~ m/\s+Datenvolumen:\s+gesamt/) {
            my $beginIndex = index($line, "gesamt")+length("gesamt")+1;
            my $endIndex = index($line, "MB", $beginIndex);
            my $wordlength = $endIndex-$beginIndex;
            $capacity = substr ($line, $beginIndex, $wordlength);
            open FILE, ">$capacity_tmp_file" or die "TMP-File konnte nicht geöffnet werden!";
            print FILE $capacity;
            close FILE;
            last;
          }
        }
      }
#      print @{$body};
    }
    # Verarbeitete Nachricht vom Server loeschenen!
    $pop3srv->delete($msgnum);
  }
}
# Von Server ausloggen
$pop3srv->quit;

# Wenn capacity noch nicht gesetzt ist, wurde heute noch keine Mail gesendet
# Daher nehmen wir den zwischengespeicherten Wert!

if ($capacity == -1) {
  open FILE, "<$capacity_tmp_file" or die "TMP-File konnte nicht zu lesen geöffnet werden";
  $capacity = <FILE>;
  close FILE;
  chomp ($capacity);
}
if ($capacity > $crit) {
  print "CRITICAL: Verbrauchtes Datenvolumen im aktuellen Monat: ".$capacity."MB\n";
  exit 2;
} elsif ($capacity > $warn) {
  print "WARNING: Verbrauchtes Datenvolumen im aktuellen Monat: ".$capacity."MB\n";
  exit 1;
} else {
  print "OK: Verbrauchtes Datenvolumen im aktuellen Monat: ".$capacity."MB\n";
  exit 0;
}

print "UNKNOWN: Ein Fehler ist aufgetreten!\n";
exit 3;
