Listing 2. cvschecker.pl

#!/usr/bin/perl

use File::Find;
use strict;
use vars qw(@Files);

my $email = 'root@localhost';
my $host = "192.168.10.5";
my $cvsroot = "/usr/local/hbids_cvs";
my $collectorCmd = "/usr/local/bin/collector.pl";

system "cvs -d $cvsroot checkout -ko $host";
chdir $host;
system "$collectorCmd"; ### get the files from $host

find(\&findfiles, "/home/mbr/${host}");

### check to see if any file has been changed
for my $file (@Files) {
    if (`cvs -d $cvsroot commit -m . $file`) {
        my $cvsfile = $file;
        $cvsfile =~ s|^\S+?$host|$host|;
        $cvsfile = $cvsroot ."/" . $cvsfile .",v";
        my $prerev = "";

        ### use rlog to get the previous revision
        open RLOG, "rlog $cvsfile|";
        my $found = 0;
        while (<RLOG>) {
            if (/^revision\s(\S+)/) {
                $prerev = $1;
                $found++;
            }
            last if ($found == 2);
       }
       close RLOG;

       ### get the changes using 'cvs diff'
       my $diff = `cvs -d $cvsroot diff -r       \
                                    $prerev $file`;
       open TMP, "> /tmp/change";
       print TMP $diff;
       close TMP;
       $file =~ s|^\S+?$host||g;

       ### send an email that contains the changes
       `mail -s "Changed file on $host: $file"
                             $email < /tmp/change`;
    }
}
exit 0;

### find all files in the local directory structure,
### but ignore directories and CVS files
sub findfiles() {
    my $file = $File::Find::name;
    unless (-d $file || $file =~ /CVS/) {
        push @Files, $file;
    }
    return;
}