| #!/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]) |
| |