#!/usr/bin/perl -w

use strict;
use warnings;

use Errno ();
use Getopt::Long qw(GetOptions);
use noris::NetSaint;
use Time::ParseDate qw(parsedate);

sub my_parsedate {
    my ( $option, $value ) = @_;
    defined( my $time = parsedate( $value, PREFER_PAST => 1, WHOLE => 1 ) )
      or die
      qq(Ich verstehe das bei -$option angegebene Datum "$value" nicht.\n);
    $time;
}

my ( $Critical, $Status4Missing, $Warning );

GetOptions(
    'critical=s' => sub { $Critical = &my_parsedate },
    'help|?' => sub {
        exec perldoc => -F => $0
          or die qq(Kann "perldoc -F $0" nicht ausfhren: $!\n);
    },
    'rrdhosts=s' => \( my $RrdHosts = '/etc/rrdhosts' ),
    'interfaces-file=s' =>
      \( my $InterfacesFile = '/var/lib/rrd/traffic/%s/interfaces' ),
    'status4missing=s' => sub {
        ( undef, my $value ) = @_;
        $Status4Missing =
          length $value ? noris::NetSaint::Status->new($value) : undef;
    },
    'warning=s' => sub { $Warning = &my_parsedate },
  )
  or exit 1;

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

open my $fh_rrdhosts, '<', $RrdHosts
  or die qq(Kann rrdhosts-Datei "$RrdHosts" nicht zum Lesen ffnen: $!\n);
my $ok = 0;
while (<$fh_rrdhosts>) {
    s/#.*//;
    next unless /\S/;
    my ($host) = split;
    my $interfaces_file = sprintf $InterfacesFile, lc $host;
    if ( defined( my $mtime = ( stat $interfaces_file )[9] ) ) {
        if ( defined $Critical && $mtime < $Critical ) {
            $NetSaint->update( Critical =>
                    "Die Interfaces-Datei fr Host $host ist viel zu alt ("
                  . localtime($mtime)
                  . ').' );
        }
        elsif ( defined $Warning && $mtime < $Warning ) {
            $NetSaint->update(
                Warning => "Die Interfaces-Datei fr Host $host ist zu alt ("
                  . localtime($mtime)
                  . ').' );
        }
        else { ++$ok }
    }
    elsif ( $!{ENOENT} ) {
        $NetSaint->update(
            $Status4Missing => "Die Interfaces-Datei fr Host $host fehlt." )
          if defined $Status4Missing;
    }
    else {
        $NetSaint->update( Unknown =>
"Ich kann das Alter der Interfaces-Datei fr $host nicht ermitteln: $!"
        );
    }
}

$NetSaint->update( OK => $ok . ' Host' . ( $ok != 1 && 's' ) . ' okay.' )
  unless $NetSaint->message;

__END__

=head1 NAME

check_interfaces-files - NetSaint-Plugin fr Router-CDB

=head1 BESCHREIBUNG

Das Plugin berprft anhand des Dateialters der C<interfaces>-Dateien fr alle
in der C<snmp-collect>-Konfigurationsdatei angegebenen Hosts, ob die
SNMP-Abfrage fr diese Hosts funktioniert und schlgt Alarm, falls dies zu lange
nicht der Fall sein sollte.

=head1 SYNOPSE

    check_interfaces-files -warning '42 minutes ago'

=head1 OPTIONEN

=over 4

=item -critical Datum

zur Festlegung des Schwellenwertes fr kritische Alarme.
Ein solcher wird ausgelst, falls eine der C<interfaces>-Dateien lter als das
angegebene Datum sein sollte.
Dieses kann in allen (insb. auch relativen) Formaten angegeben werden, die von
L<Time::ParseDate> verstanden werden.

=item -warning Datum

analog wie L</-critical> zur Festlegung des Schwellenwertes fr Warnungen

=item -status4missing Status

L<noris::NetSaint::Status>, der ausgegeben werden soll, wenn eine
C<interfaces>-Datei gar nicht vorhanden ist.
Bei Angabe einer leeren Zeichenkette als Argument werden solche Flle ohne
Meldung ignoriert.
(Dies ist auerdem so voreingestellt.)

=item -rrdhosts Datei

zur Angabe des Pfades und Namens der C<snmp-collect>-Konfigurationsdatei.

Default: C</etc/rrdhosts>

=item -interfaces-file Template

L<sprintf|perlfunc/sprintf>-Template fr den Namen der Interfaces-Dateien;
maximal ein Platzhalter wird durch den jeweiligen Hostnamen laut
Konfigurationsdatei in Kleinbuchstaben ersetzt.

Default: C</var/lib/rrd/ttraffic/%s/interfaces>

=item -help

=item -?

um (nur) diese Dokumentation anzeigen zu lassen

=back

=head1 AUTOR

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

