#!/usr/bin/perl -w 
######################################################################
# (c) Michael Schilli 1999
######################################################################
###############################################################
# urlchk.pl - URL auf Veränderungen hin überprüfen 
###############################################################
# urlchk.pl [-v] URL [snippet-regex]
#   -v:    verbose
###############################################################
                                   
$pfile = "$ENV{HOME}/data/urlchk.dat";    # Pfad für 
                                          # Persistenz-Datei

use LWP::UserAgent;                # WWW Zugriffe
use GDBM_File;                     # Persistenter Hash
use Fcntl;                         # O_CREAT, O_RDWR usw.

$| = 1;                            # Ausgaben nicht puffern

                                   # Persistenten Hash öffnen
tie(%MEM, GDBM_File, $pfile, O_CREAT|O_RDWR, 0644) || 
      die "Cannot open $pfile";
  
$verbose = 0;                      # Ausgaben erwünscht?
@ARGV = grep { !(/^-v$/ && ($verbose = 1)) } @ARGV;
                                   # Parameterzahl prüfen
usage("Wrong argument count") if $#ARGV < 0 || $#ARGV > 1;

($url, $regex) = @ARGV;            # Parameter holen

print "Checking $url ... " if $verbose;

$ua = LWP::UserAgent->new();       # UserAgent erzeugen
  
                                   # URL festlegen
$request = HTTP::Request->new('GET', $url);
  
                                   # Netzzugriff ausführen
$response = $ua->request($request);

if($response->is_error()) {        # Fehlgeschlagen?
    print "$url " unless $verbose;
    print "FAILED (", $response->code(), ": ", 
          $response->message(), ")\n";
    exit 0;
}
      
if(defined $regex) {            # Snippet-Match falls definiert
    # Zeilenübergreifend, Groß/Kleinschreibung ignorierend
    $response->content() =~ /$regex/si;

    if(defined($&)) {
        $dat = $&;                 # Such-Ergebnis
    } else {
        print "NO MATCH (/$regex/) " if $verbose;
        $dat = "";
    }

} else {
    # Kein Muster definiert - gesamter Inhalt gefragt
    $dat = $response->content();
}

$chksum = unpack("%16C*", $dat);   # 16bit-Checksumme

if(!exists $MEM{$url} || $chksum ne $MEM{$url}) {
  print "$url " unless $verbose;
  print "changed.\n";
} else {
  print "unchanged.\n" if $verbose;
}

$MEM{$url} = $chksum;           # Änderung persistent speichern
untie(%MEM);                    # Persistenten Hash schließen

###############################################################
sub usage {
###############################################################
    my $message = shift;
    ($prog = $0) =~ s#.*/##g;

    print "$prog: $message\n";
    print "usage: $prog [-v] URL [snippet]\n";
    exit 1;
}
