#!/usr/bin/perl -w 
######################################################################
# urlchk.pl
######################################################################
# Perl Power! - Michael Schilli 1998
######################################################################

######################################################################
# urlchk.pl - check URL fro modifications 
######################################################################
# urlchk.pl [-v] URL [snippet-regex]
#   -v:    verbose
######################################################################
                                   
$pfile = "$ENV{HOME}/data/urlchk.dat"; # path for persistency file

use LWP::UserAgent;                # WWW accesses
use GDBM_File;                     # persistent hash
use Fcntl;                         # O_CREAT, O_RDWR, and so on

$| = 1;                            # do not buffer output

                                   # open persistent hash
tie(%MEM, GDBM_File, $pfile, O_CREAT|O_RDWR, 0644) || 
      die "Cannot open $pfile";
  
$verbose = 0;                      # output required?
@ARGV = grep { !(/^-v$/ && ($verbose = 1)) } @ARGV;
                                   # check number of parameters
usage("Wrong argument count") if $#ARGV < 0 || $#ARGV > 1;

($url, $regex) = @ARGV;            # fetch parameters

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

$ua = LWP::UserAgent->new();       # create user agent
  
                                   # set URL
$request = HTTP::Request->new('GET', $url);
  
                                   # carry out network access
$response = $ua->request($request);

if($response->is_error()) {        # failed?
    print "$url " unless $verbose;
    print "FAILED (", $response->code(), ": ", 
          $response->message(), ")\n";
    exit 0;
}
      
if(defined $regex) {               # snippet match if defined
    # multi-line, ignoring upper/lower case spelling
    $response->content() =~ /$regex/si;

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

} else {
    # no pattern defined - entire content required
    $dat = $response->content();
}

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

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

$MEM{$url} = $chksum;              # store change persistently
untie(%MEM);                       # close persistent hash

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

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

