http://www.perlmonks.org?node_id=7138
Category:
Author/Contact Info turnstep
Description: Small script to check if anyone has looked at my online resume, and if so, mails the information to me. Run as a periodic cronjob; exits silently if no new matches are found.
#!/usr/bin/perl -- -*-fundamental-*-

## Resume logger
## Greg Sabino Mullane, greg@turnstep.com, 0x14964AC8
## Note: your log format and mail program may vary:
## Try local 'sendmail' or use Mail::Mailer

use strict;

my($mail, $mailto, $mailfrom, $subject);
my($accesslog, $resumelog, $mydomain, $mypage);
my(@fresh, %seenit, %seenIP, %visits);
my($x);

$mail      = "/usr/bin/mail"; ## Paranoia is a Good Thing
$mailto    = "resume\@example.com";
$mailfrom  = qq["Abe Lincoln" <alincoln\@example.com>];
$subject   = "More resume nibbles";

$accesslog = "/foo/bar/logs/access_log";
$resumelog = "/home/alincoln/jobs/resume.log";
$mydomain  = "turnstep"; ## Use if server has >1 domain...
$mypage    = "/resume.html";

## Load our old data:
open(OLD, "+< $resumelog") || die "Could not open $resumelog: $!\n";
while(<OLD>) {
  $seenit{$_}++; ($x) = split(/ /,$_); $seenIP{$x}++;
}

## Anything new in the logs?
open(ACCESSLOG, "$accesslog") || die "Could not open $accesslog: $!\n"
+;
while(<ACCESSLOG>) {
  ## Crude match: refine if other pages contain $mypage
  next unless m/^$mydomain (.*?) (.*$mypage.*\n)/;
  $seenit{"$1 $2"} || push(@fresh, "$1 $2") && $visits{$1}++;
}
close(ACCESSLOG);

## Bail if nothing new:
@fresh || exit; ## perl closes OLD for us. Isn't that nice?

## Add new entries to the end of OLD:
print OLD @fresh; close(OLD);

## Mail it to us:
open(MAILME, "| $mail -t $mailto") || die " Could not start $mail: $!\
+n";
print MAILME "From: $mailfrom\n";
print MAILME "Subject: $subject.\n\n";
for (@fresh) {
  ($x) = split(/ /, $_);
  $seenIP{$x} ||=0;
  print MAILME "\tThis time: $visits{$x} Prior: $seenIP{$x}\n$_\n\n";
}
close(MAILME);
exit;