#!/usr/bin/perl -w # # Author : Julien Bordet # # Update a md5 fingerprint file. Supervised file name should be passed as # parameters : if they changed, their md5 is updated. If they are new, they are # added. If they do not exist anylonger, their entry is deleted in the fingerprint # file # # fingerprint file should be passed with the -f switch # use strict; use Getopt::Long; use Digest::MD5; use MIME::Base64; use vars qw ( @filenames %md5 $filelist ); my $filename = ""; GetOptions('-f=s' => \$filelist); if (! -f $filelist) { open LIST, "> $filelist" or die "Unable to create $filelist : $!\n"; close LIST; } @filenames = @ARGV; foreach my $filename (@filenames) { $md5{$filename} = ''; if (open FILE, "< $filename") { my $ctx = Digest::MD5->new; $ctx->addfile(*FILE); $md5{$filename} = encode_base64($ctx->digest, ''); close FILE; } } @ARGV = ($filelist); undef $/; $^I = ".bak"; while (<>) { foreach my $filename (@filenames) { my $digest = $md5{$filename}; if ( m!\Q$filename\E:! and $digest) { # File have been changed s/^\Q$filename\E:.*?$/$filename:$digest/m; } elsif ($digest) { # File is being added $_ .= "$filename:$digest\n"; } else { # File is being deleted s/^\Q$filename\E:.*?\n//m; } } print; }