#!/usr/bin/perl -w

use strict;
use Config::INI::Reader;

my $config = Config::INI::Reader->read_file('/etc/eeaptwatch/eeaptwatch.ini');

my $cache_dir = $config->{main}{cache_dir};
my $dest_email = $config->{main}{dest_email};
my %custom_headers = ( $config->{custom_headers} ) ? %{$config->{custom_headers}} : ();

my $hostname = `hostname`;
chomp ( $hostname );

my %old;
my %new;
my @changes;

mkdir $cache_dir unless ( -d $cache_dir );

unless ( $ARGV[0] && $ARGV[0] =~ /^pre|post$/ ) {
    warn "Usage: eeaptwatchwatch {pre|post}";
    exit (0);
}

if ( $ARGV[0] eq 'pre' ) {
    `dpkg-query -W -f='\${Package} \${Version}\\n' > $cache_dir/old`;
} elsif ( $ARGV[0] eq 'post' ) {
    `dpkg-query -W -f='\${Package} \${Version}\\n' > $cache_dir/new`;
    open (OLD, "$cache_dir/old") or die "$!\n";
    while ( <OLD> ) {
        my ($name, $version) = split /\s+/, $_;
        chomp ( $version );
        $old{$name} = $version;
    }
    close (OLD);

    open (NEW, "$cache_dir/new") or die "$!\n";
    while ( <NEW> ) {
        my ($name, $version) = split /\s+/, $_;
        chomp ( $version );
        $new{$name} = $version;
        if ( ! $old{$name} ) {
            push @changes, "$name installed ($version)";
        } elsif ( $old{$name} ne $version ) {
            `dpkg --compare-versions "$old{$name}" ge "$version"`;
            if ( $? ) {
                push @changes, "$name upgraded ($old{$name} -> $version)";
            } else {
                push @changes, "$name downgraded ($old{$name} -> $version)";
            }
        }
    }
    close (NEW);
    foreach my $name (keys %old) {
        if ( ! $new{$name} ) {
            push @changes, "$name removed ($old{$name})";
        }
    }
}

if ( scalar @changes ) {
    open (SENDMAIL, "|/usr/lib/sendmail -t") or die "$!\n";
    print SENDMAIL "Subject: [eeaptwatch] changes on $hostname\n";
    print SENDMAIL "From: <root>\n";
    print SENDMAIL "To: <$dest_email>\n";
    foreach my $header_name ( keys %custom_headers ) {
        print SENDMAIL "$header_name: ".$custom_headers{$header_name}."\n";
    }
    print SENDMAIL "\n\n";
    foreach my $change ( sort { $a cmp $b } @changes ) {
        print SENDMAIL $change."\n";
    }
    close ( SENDMAIL );
}
