#!/usr/bin/perl -w

use 5.006;
use strict;
use warnings;

use DateTime::Event::Cron ();
use Getopt::Long qw(GetOptions);
use noris::NetSaint;

my $When;
GetOptions(
    'help|?' =>
      sub { exec perldoc => -F => $0 or die "exec('perldoc -F $0'): $!\n" },
    'critical-minutes=f' => \my $CriticalMinutes,
    'time-zone=s'        => \( my $TimeZone = 'Europe/Berlin' ),
    'warning-minutes=f'  => \my $WarningMinutes,
    'when=s' => sub { $When = DateTime::Event::Cron->from_cron( $_[1] ) },
  )
  or exit 1;

die "Es muss mindestens eine Datei auf der Kommandozeile angegeben werden.\n"
  unless @ARGV;

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

for (@ARGV) {
    if ( defined( my $timestamp = (stat)[9] ) ) {

        $NetSaint->add_message(
            'Die Datei wurde zuletzt ' . localtime($timestamp) . ' gendert.' );

        for ( [ Critical => $CriticalMinutes ], [ Warning => $WarningMinutes ] )
        {
            my ( $status, $minutes ) = @$_;
            next unless defined $minutes;
            my $datetime_last_expected_since = DateTime->from_epoch(
                epoch => $^T - $minutes * 60,
                defined $TimeZone ? ( time_zone => $TimeZone ) : ()
            );
            $datetime_last_expected_since =
              $When->previous($datetime_last_expected_since)
              if $When;
            if (
                (
                    my $last_expected_since =
                    $datetime_last_expected_since->epoch
                ) > $timestamp
              )
            {
                $NetSaint->update( $status => 'Sie htte aber frhestens '
                      . localtime($last_expected_since)
                      . ' aktualisiert werden mssen.' );
                last;
            }
        }
        $NetSaint->atleast('OK');
    }
    else {
        $NetSaint->update( Unknown =>
              qq(Das Alter von "$_" konnte nicht ermittelt werden: $!) );
    }
}

__END__

=head1 NAME

check_file_age_irregular - Dateialter berwachen

=head1 SYNOPSE

    check_file_age_irregular -when '54 3 * * 1-5' \
                             -warning-minutes  1  \
                             -critical-minutes 3  \
                             /var/run/replace_subscribers.MORNINGBRIEFING

=head1 BESCHREIBUNG

NetSaint-kompatibles Plugin;
berprft das Alter der auf der Kommandozeile angegebenen Datei(en).

=head1 OPTIONEN

Alle Optionen werden mittels
L<GetOptions() aus Getopt::Long|Getopt::Long/GetOptions> analysiert.

=over 4

=item -critical-minutes Minuten

Hiermit kann festgelegt werden, dass ein kritischer Status ausgegeben werden
soll, falls die Datei lter als die angegebene Anzahl Minuten ist, ggf. bezogen
auf den mit L<-when|/-when Cron-Spec> festgelegten Zeitpunkt.

=item -warning-minutes Minutes

Hiermit kann festgelegt werden, dass eine Warnung ausgegeben werden soll, falls
die Datei lter als die angegebene Zahl Minuten ist, ggf. bezogen auf den mit
L<-when|/when=s> festgelegten Zeitpunkt.


=item -time-zone Zeitzone

Zeitzone, in der gerechnet werden soll; Default: C<Europe/Berlin>

=item -when Cron-Spec

Spezifikation im cron-blichen Format, die angibt, wann entsprechende
Accounting-Datenstze erwartet werden, z. B. nur monatlich am 12. um 13:14 Uhr:

	-when '14 13 12 * *'

=item -help

=item -?

um (nur) diese Dokumentation anzeigen zu lassen

=back

=head1 AUTOR

 Martin H. Sluka <fany@noris.net>
 fuer die noris network AG
 RT#400137

=cut

