#!/usr/bin/env python # # This script reads the dependency information under /var/db/pkg and # verifies their consistency. Any mismatches are printed. # # Copyright (C) 2007-2009 Oliver Fromme # All rights reserved. Standard 2-clause BSD license and disclaimer apply, # please refer to the file /usr/share/examples/etc/bsd-style-copyright on # FreeBSD or ask the author for a copy. # pkg_dbdir = "/var/db/pkg" import os, os.path, sys me = os.path.basename(sys.argv[0]) usage = """ Usage: %s [-q] Options: -q (quiet) Don't list dependencies. """.replace('\t', '') % me def err (msg): print >> sys.stderr, "%s: %s" % (me, msg) sys.exit (1) if len(sys.argv) == 2 and sys.argv[1] == '-q': quiet = True else: quiet = False if len(sys.argv) != 1: print >> sys.stderr, usage sys.exit (1) try: pkglist = os.listdir(pkg_dbdir) except OSError, (errno, errstr): err ("Can't read directory %s: %s" % (pkg_dbdir, errstr)) if not pkglist: err ("No packages registered.") pkglist.sort() reqby = {} depend = {} for i in pkglist: fname = os.path.join(pkg_dbdir, i, "+CONTENTS") if os.path.isfile(fname): depend[i] = sorted([ line.split()[1] for line in file(fname) if line.startswith("@pkgdep") ]) else: depend[i] = [] fname = os.path.join(pkg_dbdir, i, "+REQUIRED_BY") if os.path.isfile(fname): reqby[i] = sorted([ line.strip() for line in file(fname) if line[0:1] not in "@#" ]) else: reqby[i] = [] if not quiet: print "%-32s depends on %2d pkgs, required by %2d pkgs" \ % (i, len(depend[i]), len(reqby[i])) for i in pkglist: seen = {} for j in depend[i]: if j not in pkglist: print "MISSING: %s (dependency of %s)" % (j, i) elif i not in reqby[j]: print "MISMATCH: %s depends on %s, but no reverse" % (i, j) if j in seen: print "DUPLICATE: %s (dependency of %s)" % (j ,i) else: seen[j] = True seen = {} for j in reqby[i]: if j not in pkglist: print "MISSING: %s (requires %s)" % (j, i) elif i not in depend[j]: print "MISMATCH: %s required by %s, but no forward" % (i, j) if j in seen: print 'DUPLICATE: %s (requires %s)' % (j ,i) else: seen[j] = True #--