#!/usr/bin/perl -w

use utf8;
use strict;
use warnings;

BEGIN {
    unshift @INC, ( $ENV{POPHOME} || '@POPHOME@' ) . '/lib'
      unless $ENV{KUNDE_NO_PERLPATH};
}

use Dbase::Getopt;
use noris::NetSaint;
use noris::Ticket::API qw(get_pooled_connection);
use Time::Local;

GetOptions(
    'critical-threshold=i' => \my $CriticalThreshold,
    'ticket=i'             => \my $Ticket,
    'warning-threshold=i'  => \my $WarningThreshold,
);
die "Es muss ein --ticket angegeben werden.\n" unless $Ticket;

my $NetSaint   = noris::NetSaint->new();
my $ticket_api = get_pooled_connection();
$NetSaint->update( Unknown => 'Konnte Ticket-API nicht laden!' )
  unless defined $ticket_api;

if ( my ($last_change) = $ticket_api->get_ticket( $Ticket, [qw(changed)] ) ) {

    my @t = $last_change =~ m/(\d{4})-(\d{2})-(\d{2})\s(\d{2}):(\d{2}):(\d{2})/;
    $t[1]--;
    my $age = time() - timelocal( @t[ 5, 4, 3, 2, 1, 0 ] );
    $NetSaint->add_message(
        "Das Ticket wurde zuletzt vor $age Sekunde"
      . ( $age != 1 && 'n' )
      . ' angefasst.' );
    $NetSaint->atleast( defined $CriticalThreshold
      && $age > $CriticalThreshold ? 'Critical' : defined $WarningThreshold
      && $age > $WarningThreshold  ? 'Warning'  : 'OK' );
}
else {
    $NetSaint->update( Unknown => "Ticket #$Ticket existiert nicht!" );
}

__END__

=head1 NAME

check_ticket_freshness - Monitoring-Plugin für Aktualität von Tickets

=head1 SYNOPSE

 check_ticket_freshness -ticket 247230           \
                        -warning-threshold 600   \
                        -critical-threshold 900

Überprüft, wie alt der letzte Comment, in dessen Text die Zeichenkette
"Monitoring fuer krempel:58123" vorkommt, ist, und gibt folgenden Status aus:

=over 4

=item Unknown

falls kein entsprechender Eintrag gefunden wird,

=item Critical

falls der letzte einschlägige Eintrag älter als eine Viertelstunde (aka 900
Sekunden) ist,

=item Warning

falls der letzte einschlägige Eintrag älter als zehn Minuten ist,

=item OK

falls der letzte einschlägige Eintrag maximal zehn Minuten alt ist.

=back

=head1 NOTWENDIGE ARGUMENTE

=over 4

=item ticket=i

ID des Tickets, in dem gesucht werden soll

=back

=head1 OPTIONEN

=over 4

=item critical-threshold=i

zur Festlegung des Schwellenwerts für kritische Alarme in Sekunden

=item warning-threshold=i

zur Festlegung des Schwellenwerts für Warnungen in Sekunden

=item help|?

um (nur) diese Dokumentation anzeigen zu lassen

=back

=cut

