#!/usr/bin/python # Copyright 1999-2006 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Id$ # Very simple program to compare the md5sums of a package as listed # in VDB_PATH/category/package/CONTENTS with the md5sums of the # actual programs on the system (and makes sure that symlinks point to # the right files). import os.path, os, sys try: import portage except ImportError: from os import path as osp sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym")) import portage def CONTENTScheck(path): try: contents = open(path, "r") except IOError, e: print "Unable to open %s: %s" % (path, e) sys.exit(1) lines = contents.readlines() for line in lines: items = line.split() # items is a list w/ size depending on the type of item listed in item[0] # if items[0] = 'dir' then items[1] is the path of a directory # if items[0] = 'obj' then items[1] is the path of a file, # items[2] is the file's md5sum, # items[3] is the file's size # if items[0] = 'sym' then items[1] is the path of a symbolic link, # items[2] is '->' # items[3] is the file the symlink should point to # items[4] is the symlink mtime if (items[0] == 'obj'): md5stored = items[2].lower() # fchksum.fmdft(file) returns the file's md5sum and the file's size md5real = portage.perform_checksum(items[1])[0].lower() if (md5stored != md5real): if md5real: print "%s has md5sum of %s instead of %s" % (items[1], md5real, md5stored) else: print "%s is missing!" % items[1] elif (items[0] == 'sym'): link = items[1] target = items[3] if (not os.path.islink(link)): print "%s is not a symbolic link" % link continue actualtarget = os.readlink(link) if (os.path.normpath(actualtarget) != os.path.normpath(target)): print "%s points to %s, not %s" % (link, actualtarget, target) if __name__ == '__main__': import sys if (len(sys.argv) != 2 or sys.argv[1] == "--help"): print "This program compares md5sums in the file VDB_PATH/category/package/CONTENTS" print "with the md5sums of the actual files on the filesystem" print "(and makes sure that symlinks point to the right files)." print "\nUsage: chkcontents path/to/CONTENTS" sys.exit(1) CONTENTScheck(sys.argv[1])