#!/usr/bin/perl -w

# $Id: check_last_modified,v 1.1 2004/09/17 14:01:36 sysadm Exp $

use 5.006;
use strict;
use warnings;

use Date::Parse 'str2time';
use FindBin ();
use Getopt::Long 'GetOptions';
use LWP::UserAgent ();

use lib $FindBin::Bin;
use noris::NetSaint;

our $NetSaint = new noris::NetSaint;

GetOptions
  'warning-age=i'  => \our $Warning_Age,
  'critical-age=i' => \our $Critical_Age,
  'method=s'       => \(our $Method = 'head'),
  'help|?'         => \our $Help;

exec perldoc => $0 or die "exec('perldoc $0') returned $?: $!\n" if $Help;

die "USAGE: $0 [OPTIONS] <URL>\n" if @ARGV != 1;

my $url = shift;
$Method = lc $Method;

my $ua = new LWP::UserAgent or die;
my $response = $ua->$Method($url) or die;

unless ( $response->is_success ) {
    $NetSaint->update( Unknown => "\U$Method\E request for <$url> failed: "
          . $response->status_line );
}
elsif ( !defined( my $last_modified = $response->header('Last-Modified') ) ) {
    $NetSaint->update(
        Unknown => "$url does not provide a Last-Modified header.\n" );
}
elsif ( !defined( my $time = str2time $last_modified ) ) {
    $NetSaint->update( Unknown =>
          "Last modified date from $url could not be parsed: $last_modified"
    );
}
else {
    $NetSaint->add_message("$url was last modified at $last_modified.\n");
    my $age = $^T - $time;
    if ( defined $Critical_Age && $age > $Critical_Age ) {
        $NetSaint->atleast('Critical');
    }
    elsif ( defined $Warning_Age && $age > $Warning_Age ) {
        $NetSaint->atleast('Warning');
    }
    else {
        $NetSaint->atleast('OK');
    }
}

=head1 NAME

check_last_modified -- berprfung des nderungsdatums einer URL

=head1 SYNOPSE

 check_last_modified --critical-age 259200 http://cpan.noris.de/RECENT.html

Das Script ruft die URL auf und ermittelt anhand des Last-Modified:-Headers
deren Alter.
berschreitet dies die (optional) angegebenen Grenzen, wird ein Fehlerstatus
erzeugt.

Der Status wird auf I<UNKNOWN> gesetzt, falls ein Fehler beim Aufruf der URL
auftritt, die URL keinen C<Last-Modified:>-Header enthlt oder dessen Inhalt
nicht als Datum erkannt wird.

=head1 OPTIONEN

=over 4

=item critical-age=i

Alter in Sekunden, bei dessen berschreiten ein kritischer Zustand generiert
werden soll

=item warning-age=i

Alter in Sekunden, bei dessen berschreiten eine Warnung generiert werden soll

=item method=s

(HTTP-)Methode, mit der die URL abgefragt werden soll;  Default: C<HEAD>

=item help|?

um (nur) diese Dokumentation anzeigen zu lassen

=back

=head1 AUTOR

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

=cut
