#!/usr/bin/perl # # Copyright (c) 1999 Neil Blakey-Milner # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # $FreeBSD$ # #my($path) = "/var/qmail"; my($path) = "/usr/local/bin"; my($pkgdir) = "/var/db/pkg"; $do_md5 = 1; $do_fs = 1; my(@fsfiles); my(%files); my(%fsmd5); my(%pkgmd5); my(%pkgname); if ($do_fs) { @fsfiles = `find $path ! -type d`; foreach (@fsfiles) { chomp; s#\Q$path\E/?##; $files{$_} = 1; chomp($fsmd5{$_} = `md5 -q $path/$_ 2> /dev/null`) if $do_md5 == 1; } } require "find.pl"; &find('/var/db/pkg'); # Traverse desired filesystems foreach (sort keys %files) { $file = $_; $pkgname{$_} =~ s/,$//; $files{$_} == 1 && do { print "Only on filesystem - $_\n"; next; }; $files{$_} == 2 && do { if ($do_fs == 1) { printf "Not on filesystem - $_ from %s\n", $pkgname{$_}; next; } }; if ($do_fs != 1) { if (-e "$path/$_") { chomp($fsmd5{$_} = `md5 -q $path/$_ 2> /dev/null`) if $do_md5 == 1; } else { printf "Not on filesystem - $_ from %s\n", $pkgname{$_}; } } $files{$_} > 3 && do { printf "File $_ owned by multiple packages %s\n", $pkgname{$_}; }; if ($do_md5) { $pkgmd5tmp = $pkgmd5{$_}; $fsmd5tmp = $fsmd5{$_}; if ($fsmd5tmp =~ /^ *$/) { $msg = ""; $msg = ", but it exists" if (-e "$path/$_"); printf "No filesystem md5 available for $_%s\n", $msg; next; } if ($pkgmd5tmp =~ /^ *$/) { print "No package md5 available for $_\n"; next; } foreach (split /,/, $pkgmd5tmp) { #print "Comparing: $fsmd5tmp $_\n"; if ($fsmd5tmp !~ /\Q$_\E/) { print "For $file, package md5 $_ is " . "DIFFERENT from fs md5 of $fsmd5tmp!\n"; } } } } exit; sub wanted { my($dev, $ino, $mode, $nlink, $uid, $gid); my($cwd, $tmp); (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) && -f _ && /^\+CONTENTS$/ || return; open(CNT, "$name"); chomp($pkg = `dirname $name`); chomp($pkg = `basename $pkg`); $cwd = ""; $lastfile = ""; while() { chomp; /^\@cwd (.*)$/ && do { $cwd = $1; next; }; s#^\@comment MD5:## && do { return if $cwd =~ /^\.?$/; $tmp = "$cwd/$lastfile"; if ($tmp =~ s#^\Q$path\E/?##) { $pkgmd5{$tmp} .= "$_,"; } next; }; /^[^@]/ && do { $lastfile = $_; return if $cwd =~ /^\.?$/; $tmp = "$cwd/$_"; if ($tmp =~ s#^\Q$path\E/?##) { $files{$tmp} += 2; $pkgname{$tmp} .= "$pkg,"; } }; } close(CNT); }