Damit Nagios stets SMS versenden kann, sollte auch das Guthaben bei einem SMS-Provider wie SMStrade.de überwacht werden. SMStrade liefert den aktuellen Credit per HTTP-Request aus, sodass ein Check in Perl schnell zusammengeschustert war. Der Check wirft auch Performancedaten aus, sodass man die Menge der versendeten SMS resp. das verbleibende Guthaben auch im Graphen bewundern kann.

In dieser Kurzbesprechung will ich auf die Verwendung des Perl-Moduls Nagios::Plugin eingehen, mit dem neue Nagios-Checks in Windeseile gebaut sind und auch gleich den Nagios-Konventionen entsprechen.

use Nagios::Plugin;
use LWP::Simple;
use Math::Round qw/nearest/;

Hiermit werden drei Perl-Module importiert; von Math::Round wird nur die Funktion nearest benötigt. Sie rundet den von SMStrade dreistellig ausgegebenen Betrag auf einen zweistelligen.

my $url = "http://gateway.smstrade.de/credits/?key=____________";

Unter dieser URL wird das Guthaben ausgegeben. Beachten Sie dass der Key natürlich der zu Ihrem Account gehörende sein muss.

*Nagios::Plugin::Functions::get_shortname = sub {
        return undef;
};

Ein kleiner Hack, der verhindert, dass die Plugin-Ausgabe mit dem shortname des Plugins beginnt.

my $np = Nagios::Plugin->new(
        shortname => 'check_smscredit',
        usage   => 'Usage: %s [-w|--warning=] [-c|--critical=]',
        blurb   => 'Prüft das Guthaben bei SMSTrade und schlägt Alarm,
wenn dieses unter die zulässigen Grenzwerte fällt, um rechtzeitig neues
Guthaben zu überweisen.',
);

Per Konstruktor ->new() wird ein neues Objekt np vom Typ Nagios::Plugin erzeugt. Usage wird angezeigt, wenn der Pluginaufruf fehlschlägt bzw. das Plugin mit –-help oder –-usage aufgerufen wird. blurb ist ein Text, der kurz den Zweck des Plugins beschreiben soll:

$np-> add_arg(
        spec    => 'warning|w=i',
        help    => 'Warning threshold.',
        default => 10,
);
$np->add_arg(
        spec    => "critical|c=i",
        help    => 'Critical threshold.',
        default => 5,
);

Warning und Critical Schwellwert. Der Wert zum Hash-key spec zeigt an, dass es sich hierbei um Integerzahlen handelt und diese entweder mit warning oder w bzw. critical und c angegeben werden können. help speichert einen kleinen Hilfetext, der beim Aufruf des Plugins mit –help ausgegeben wird. default gibt einen Standardwert vor, sollte der Parameter nicht angegeben worden sein.

$np->getopts();
$np->set_thresholds(
        warning => ($np->opts->warning()),
        critical => ($np->opts->critical()),
);

Die Methode ->getopts() liest die übergebenen Argumente in das Objekt np ein. Diese werden dann in die Threshold-Variablen des np-Objektes geschrieben.

if ($np->opts->warning < $np->opts->critical ) {
        $np->nagios_exit(3, "Warning threshold darf nicht kleiner sein als Critical threshold.");
}

Die Exit-Methode mit dem Status 3 (UNKNOWN) wird aufgerufen, wenn der Warning-Threshold kleiner ist als der Critical-Threshold.

my $content = get $url;
if ($content !\~ m/\^\d+\.\d{3}$/) {
        $np->nagios_exit(3, "Fehler beim Abrufen des Guthabens von SMSTrade.de!");
}

Holt den Zahlenwert von der URL ab (get ist eine LWP-Methode). Sollte dieser Wert nicht der Regex ^\d+\.\d{3}$ (= ‘ein oder mehrere Ziffern, ein Punkt, gefolgt von genau drei Ziffern’) entsprechen, bricht das Script ebenfalls mit UNKNOWN ab.

$content = nearest('0.01', $content);

if ($content < $np->opts->critical) {
        $np->add_message(CRITICAL, "Guthaben bei SMSTrade beträgt nur noch $content Euro (critical bei ".$np->opts->critical.").");
} else {
        if ($content < $np->opts->warning) {
           $np->add_message(WARNING, "Guthaben bei SMSTrade beträgt nur noch $content Euro (warning bei ".$np->opts->warning.").")
        } else {
           $np->add_message(OK, "Guthaben bei SMSTrade beträgt $content Euro.")
        }
}

Rundet den erhaltenen Wert auf zwei Nachkommastellen und vergleicht ihn mit den Threshold-Werten. Entsprechend wird per methode ->add_message der Exit-Status, sowie der Output des Plugins gesetzt.

$np->add_perfdata(
        label => 'Guthaben',
        value => $content,
        uom   => 'EUR',
        threshold => $np->threshold(),
);

Sorgt dafür, dass dem Output des Plugins noch Performancedaten im korrekten Format angehängt werden.

$np->nagios_exit(
        $np->check_messages()
);

Wertet den Messages-Stack aus und beendet das Script mit dem entsprechenden Exitcode und Output-String – fertig:

Und so sieht ein braver Nagios aus:

Das Plugin check_smstrade.pl steht hier zum Download bereit.