#!/usr/bin/perl -w

use strict;
use warnings;

use Getopt::Long qw(GetOptions);

sub my_parsedate {
    ( undef, my $date ) = @_;
    require Time::ParseDate and Time::ParseDate->import('parsedate');
    my $time = parsedate( $date, PREFER_PAST => 1 )
      or die qq(Verstehe das Datum "$date" nicht.\n);
    $time;
}

my ( $CriticalAge, $WarningAge );
GetOptions(
    'critical-age=s' => sub { $CriticalAge = &my_parsedate },
    'warning-age=s'  => sub { $WarningAge  = &my_parsedate },
    'help|?' => sub {
        exec perldoc => -F => $0 or die qq(Cannot exec "perldoc -F $0": $!\n);
    },
) or exit 1;

require noris::NetSaint;

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

die <<_ unless @ARGV;
Es muss mindestens ein Verzeichnis auf der Kommandozeile angegeben werden.
_

my ( $oldest_entry, $oldest_mtime );
for (@ARGV) {
    opendir my $dh, $_ or die qq(Kann Verzeichnis "$_" nicht ffnen: $!\n);
    while ( defined( my $entry = readdir $dh ) ) {
        next if $entry eq '.' || $entry eq '..';
        my $mtime = ( stat( $entry = "$_/$entry" ) )[9];
        next if defined $oldest_entry && $oldest_mtime <= $mtime;
        $oldest_entry = $entry;
        $oldest_mtime = $mtime;
    }
}

sub time2str($) {
    my ($time) = @_;
    my @time   = localtime $time;
    my @now    = localtime;
    require Date::Language;
    Date::Language->new('German')->time2str(
        (
                 "@now[3,4]" ne "@time[3,4]"
              && '%o %B' . ( $now[5] != $time[5] && ' %Y' ) . ', '
        )
        . '%k Uhr %M',
        $time
    );
}

$NetSaint->update(
    defined $oldest_mtime
    ? (
        defined $CriticalAge
          && $oldest_mtime < $CriticalAge ? 'Critical' 
        : defined $WarningAge
          && $oldest_mtime < $WarningAge
        ? 'Warning'
        : 'OK' => sprintf qq(lteste Datei "$oldest_entry" ist vom )
          . time2str($oldest_mtime)
      )
    : (
        OK => (
            @ARGV == 1
            ? 'Im angegebenen Verzeichnis'
            : 'In den angegebenen Verzeichnissen'
          )
          . ' wurden keine Dateien gefunden.'
    )
);

__END__

=head1 NAME

check_fileage - Nagios-Plugin zur Alarmierung bei alten Dateisystemeintrgen

=head1 SYNOPSE

  check_fileage /usr/local/eleven/spool \
                -warning '42 min ago' -critical '2 hours ago'

berwacht alle Eintrge des Verzeichnisses C</usr/local/eleven/spool> und
erzeugt einen kritischen Alarm, falls einer lter als zwei Stunden ist bzw.
ansonsten eine Warnung, falls einer lter als 42 Minuten ist.

=head1 BESCHREIBUNG

Das Plugin durchsucht alle auf der Kommandozeile angegebenen Verzeichnisse
(I<nicht> jedoch etwaige Unterverzeichnisse) nach dem ltesten Eintrag.
Es unterscheidet dabei nicht zwischen verschiedenen Eintragstypen (etwa normalen
Dateien, Links oder Verzeichnissen), lediglich die Eintrge C<.> und C<..>
werden bersprungen.

=head1 OPTIONEN

Alle Zeitangaben werden mittels L<Time::ParseDate> analysiert.

=over 4

=item -critical-age Zeitangabe

um einen kritischen Status zu bekommen, falls eine Datei lter ist als der
angegebene Schwellenwert.

=item -warning-age Zeitangabe

um ansonsten eine Warnung zu bekommen, falls eine Datei lter ist als der
angegebene Schwellenwert.

=item -help

=item -?

um (nur) diese Dokumentation anzuzeigen

=back

=head1 AUTOR

 Martin H. Sluka <fany@noris.net>
 fr die noris network AG, RT#342928

=for vim

# vim: bg=light
