#!/usr/bin/env python # # This script generates a solution database for a directory containing rpm packages # but tries to be efficient about this, only doing so when the packages have changed # in some way. # # It is assumed something already went through and removed all the solvedb.done stamp files # in advance. # # First argument - the rpm binary to use # Subsequent arguments - paths to process solution databases for # import sys, os import hashlib import stat import subprocess if len(sys.argv) < 1: print("Error, rpm command not specified") sys.exit(1) if len(sys.argv) < 2: print("Error, no paths specified") sys.exit(1) paths = sys.argv[2:] for path in paths: if os.path.exists(path + "/solvedb.done"): continue data = "" manifest = [] for root, dirs, files in os.walk(path): for file in files: f = os.path.join(root, file) if f.startswith(path + "/" + "solvedb"): continue data = data + str(os.stat(f)[stat.ST_MTIME]) manifest.append(f) checksum = hashlib.md5(data).hexdigest() if os.path.exists(path + "/solvedb.checksum") and open(path + "/solvedb.checksum", "r").read() == checksum: open(path + "/solvedb.done", "w") continue if os.path.exists(path + "/solvedb"): subprocess.call("rm -rf %s" % (path + "/solvedb"), shell=True) os.mkdir(path + "/solvedb") m = open(path + "/solvedb/manifest", "w") m.write("# Dynamically generated solve manifest\n") for f in manifest: m.write(f + "\n") m.close() cmd = sys.argv[1] + ' -i --replacepkgs --replacefiles --oldpackage -D "_dbpath ' + path + '/solvedb" --justdb \ --noaid --nodeps --noorder --noscripts --notriggers --noparentdirs --nolinktos --stats \ --ignoresize --nosignature --nodigest -D "__dbi_txn create nofsync" \ ' + path + '/solvedb/manifest' subprocess.call(cmd, shell=True) open(path + "/solvedb.checksum", "w").write(checksum) open(path + "/solvedb.done", "w")