--- /dev/null
+#! /usr/bin/perl -w
+use diagnostics;
+use strict;
+
+my $verbose = 0;
+
+while (@ARGV) {
+ my $arg = shift;
+ if ($arg eq '-v' or $arg eq '--verbose') {
+ $verbose = 1;
+ } else {
+ warn "Unrecognized option: $arg\n";
+ }
+}
+
+local (*AVAILABLE, *STATUS);
+open AVAILABLE, '</var/lib/dpkg/available' or
+ die "Can't open available file: $!";
+open STATUS, '</var/lib/dpkg/status' or die "Can't open status file: $!";
+
+my (%available, %status);
+my $package;
+
+while (<AVAILABLE>)
+{
+ if (/^Package: (.*)/)
+ {
+ $package = $1;
+ }
+ elsif (/^Version: (.*)/)
+ {
+ $available{$package} = $1;
+ undef $package;
+ }
+}
+
+while (<STATUS>)
+{
+ if (/^Package: (.*)/)
+ {
+ $package = $1;
+ }
+ elsif (/^Version: (.*)/)
+ {
+ $status{$package} = $1;
+ undef $package;
+ }
+}
+
+close STATUS;
+close AVAILABLE;
+
+foreach my $package (sort keys %available)
+{
+ my ($av, $st) = ($available{$package}, $status{$package});
+ if (defined $st)
+ {
+ if ($av ne $st) {
+ print "!!! $package $av $st\n";
+ } elsif ($verbose) {
+ print "$package $av $st\n";
+ }
+ }
+}
+