#!/usr/bin/perl -w

# OTRS-Projekt: muss fürs OTRS neu implementiert werden, vgl. #10040212

use utf8;
use strict;
use warnings;

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

use Dbase::Getopt;
use Dbase::Globals qw(find_descr);
use Dbase::Help qw(Do DoFn qquote);
use noris::NetSaint;
use Time::Zone qw(tz_local_offset);

GetOptions(
    'critical-threshold=i' => \my $CriticalThreshold,
    'expire=i'             => \my $Expire,
    'inhalt-like=s'        => \my $InhaltLike,
    'sequence-typ=s'       => \( my $SequenceTyp = 'comments' ),
    'ticket=i'             => \my $Ticket,
    'warning-threshold=i'  => \my $WarningThreshold,
);

die "Es muss ein --ticket angegeben werden.\n" unless $Ticket;
defined( my $sequence_typ = find_descr( tickett => $SequenceTyp, 1 ) )
  or die qq(Unbekannter Sequence-Typ "$SequenceTyp"!\n)
  if defined $SequenceTyp;

my $NetSaint = noris::NetSaint->new;

my $where =
    "WHERE ticket=$Ticket "
  . ( defined $sequence_typ && " AND typ = $sequence_typ" )
  . ( defined $InhaltLike   && " AND inhalt LIKE ${\qquote($InhaltLike)}" );

if ( my $tz_offset = tz_local_offset() ) {
    Do(
        'SET time_zone = '
          . qquote(
            sprintf '%1s%02d:%02d',
            $tz_offset < 0 ? '-' : '+',
            int( abs $tz_offset / 3600 ),
            ( abs $tz_offset / 60 ) % 60
          )
    );
}

unless ( my($id,$age) = DoFn(<<_) ) {
	SELECT   CONCAT_WS('-',ticket,seq),
	         UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(timestamp)
	FROM     ticketid
	$where
	ORDER BY timestamp DESC
	LIMIT    1
_
    $NetSaint->update(
        Unknown => 'Es wurde kein einschlägiger Ticket-Eintrag gefunden.' );
}
else {
    $NetSaint->add_message( "Der letzte einschlägige Eintrag ist RT#$id und $age Sekunde"
          . ( $age != 1 && 'n' )
          . ' alt.' );
    $NetSaint->atleast( defined $CriticalThreshold
          && $age > $CriticalThreshold ? 'Critical' : defined $WarningThreshold
          && $age > $WarningThreshold  ? 'Warning'  : 'OK' );
}

Do(<<_) if defined $Expire;
	DELETE FROM ticketid
	$where
	   AND timestamp < FROM_UNIXTIME( UNIX_TIMESTAMP(NOW()) - $Expire )
_

__END__

=head1 NAME

check_rtticket_freshness - Monitoring-Plugin für Aktualität von RT-Tickets

=head1 SYNOPSE

 check_rtticket_freshness -ticket 247230                                 \
                          -inhalt-like '%Monitoring fuer krempel:58123%' \
                          -warning-threshold 600                         \
                          -critical-threshold 900                        \
                          -expire 86400

Ü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 expire=i

um festzulegen, dass einschlägige Einträge, die älter als I<i> Sekunden sind,
gelöscht werden sollen.
(Per Default wird nichts gelöscht.)

=item inhalt-like=s

zur Angabe einer SQL-Wildcard für die Selektion einschlägiger Comments.

=item sequence-typ=s

um nur eine bestimmte Art Ticket-Sequences zu betrachten;
Default: nur
C<comments>

=item warning-threshold=i

zur Festlegung des Schwellenwerts für Warnungen in Sekunden

=item help|?

um (nur) diese Dokumentation anzeigen zu lassen

=back

=cut

