#!/usr/bin/perl
# 
# Author:  Peter Keel <seegras@discordia.ch>
# Date:    ?
# Revised: 19.03.2012
# Version: 0.2
# License: Artistic License 2.0
# URL:     https://seegras.discordia.ch/Programs/
#

use Digest::MD5;
use Getopt::Long;
use Pod::Usage;
use File::Find;

# Config Options
$home = $ENV{'HOME'};
$md5_checksum_list = "$home/.fileindex.md5";  
$debug = 1;    # debug mode, 1=on, 0=off
$version = "0.2";

&Getopt::Long::Configure( 'pass_through', 'no_autoabbrev');
&Getopt::Long::GetOptions(
		'help|h'		=> \$needshelp,
		'delete|d'		=> \$deletemode,
		'add|a'			=> \$addmode,
);

if (!$ARGV[0]) {
    $dname = ".";
} else { 
    $dname=$ARGV[0]; 
}

if ($needshelp) {
pod2usage(1);
}
# for the convenience of &wanted calls, including -eval statements:
use vars qw/*name *dir *prune/;
*name   = *File::Find::name;
*dir    = *File::Find::dir;
*prune  = *File::Find::prune;

sub wanted;

# Traverse desired filesystems
File::Find::find({wanted => \&wanted}, $dname);
exit;

sub wanted {
    my ($dev,$ino,$mode,$nlink,$uid,$gid);
    (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
    -f _
#    && print("$name\n");
    && md5_check($name);
}


sub md5_check {
#
# COMPARE MD5 CHECKSUM
#
    my $file = $_;
    open(FILE, $file) or die "Can't open '$file': $!";
    binmode(FILE);
 
    my $md5digest = Digest::MD5->new->addfile(*FILE)->hexdigest , "\n";
    close(FILE);
    $md5_fingerprint = $md5digest;

    $vrfyMD5 = `egrep $md5_fingerprint $md5_checksum_list`;
    if ($vrfyMD5 =~ /\w/) {
	print "Duplicate: $name\n";
	if ($deletemode) {
	    print "Removed: $name\n";
	    unlink "$file";
	}
    } else {
	if ($addmode) {
	    print "Added: $name\n";
	    open (CHECKSUMFILE,">> $md5_checksum_list");
	    print CHECKSUMFILE "$md5_fingerprint:$name\n";
	    close (CHECKSUMFILE); 
	}
    } 
} 


__END__

=head1 NAME

fileindex - index files with md5 sum

=head1 SYNOPSIS

B<This program> [options] [directory ...]

 Options:
   -h|--help
   -d|--delete
   -a|--add

=head1 OPTIONS

=over 8

=item B<-h|--help>

Print a brief help message and exit.

=item B<-a|--add>

Add MD5-sums to database

=item B<-d|--delete>

Delete duplicate files

=back

=head1 DESCRIPTION

B<This program> will index all files in a given path, and create a
database (.fileindex.md5) in the home of the user. It also can delete
files whose md5-sum is already found in the database (dangerous!).

=cut
