X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=dak%2Fadmin.py;h=43e20ecfe9209b6f87c2237e8a620f650740618a;hb=9dbb7b6ec34adb6a28180279895c888806f6e9de;hp=a4f5f4bb9788580ff92d770d76ec618fc4dc7288;hpb=0dd17ca89eac326802b074523b7e398dfadeb6a5;p=dak.git diff --git a/dak/admin.py b/dak/admin.py index a4f5f4bb..43e20ecf 100755 --- a/dak/admin.py +++ b/dak/admin.py @@ -23,6 +23,9 @@ import sys import apt_pkg +import daklib.archive +import daklib.gpg + from daklib import utils from daklib.dbconn import * from sqlalchemy.orm.exc import NoResultFound @@ -135,6 +138,14 @@ Perform administrative work on the dak database. where CHECK is one of Enhances, MustBeNewerThan, MustBeOlderThan REFERENCE is another suite name + + change-component: + change-component SUITE COMPONENT source SOURCE... + change-component SUITE COMPONENT binary BINARY... + Move source or binary packages to a different component by copying + associated files and changing the overrides. + + forget-signature FILE: forget that we saw FILE """ sys.exit(exit_code) @@ -435,20 +446,24 @@ def __suite_architecture_add(d, args): suite = get_suite(args[2].lower(), s) if suite is None: die("E: Can't find suite %s" % args[2].lower()) - arch = get_architecture(args[3].lower(), s) - if arch is None: die("E: Can't find architecture %s" % args[3].lower()) + for arch_name in args[3:]: + arch = get_architecture(arch_name.lower(), s) + if arch is None: die("E: Can't find architecture %s" % args[3].lower()) - if not dryrun: try: suite.architectures.append(arch) - s.commit() + s.flush() except IntegrityError as e: - die("E: Can't add suite-architecture entry (%s, %s) - probably already exists" % (args[2].lower(), args[3].lower())) + die("E: Can't add suite-architecture entry (%s, %s) - probably already exists" % (args[2].lower(), arch_name)) except SQLAlchemyError as e: - die("E: Can't add suite-architecture entry (%s, %s) - %s" % (args[2].lower(), args[3].lower(), e)) + die("E: Can't add suite-architecture entry (%s, %s) - %s" % (args[2].lower(), arch_name, e)) + + print "Added suite-architecture entry for %s, %s" % (args[2].lower(), arch_name) - print "Added suite-architecture entry for %s, %s" % (args[2].lower(), args[3].lower()) + if not dryrun: + s.commit() + s.close() def __suite_architecture_rm(d, args): if len(args) < 3: @@ -537,20 +552,23 @@ def __suite_component_add(d, args): suite = get_suite(args[2].lower(), s) if suite is None: die("E: Can't find suite %s" % args[2].lower()) - component = get_component(args[3].lower(), s) - if component is None: die("E: Can't find component %s" % args[3].lower()) + for component_name in args[3:]: + component = get_component(component_name.lower(), s) + if component is None: die("E: Can't find component %s" % args[3].lower()) - if not dryrun: try: suite.components.append(component) - s.commit() + s.flush() except IntegrityError as e: - die("E: Can't add suite-component entry (%s, %s) - probably already exists" % (args[2].lower(), args[3].lower())) + die("E: Can't add suite-component entry (%s, %s) - probably already exists" % (args[2].lower(), component_name)) except SQLAlchemyError as e: - die("E: Can't add suite-component entry (%s, %s) - %s" % (args[2].lower(), args[3].lower(), e)) + die("E: Can't add suite-component entry (%s, %s) - %s" % (args[2].lower(), component_name, e)) - print "Added suite-component entry for %s, %s" % (args[2].lower(), args[3].lower()) + print "Added suite-component entry for %s, %s" % (args[2].lower(), component_name) + if not dryrun: + s.commit() + s.close() def __suite_component_rm(d, args): if len(args) < 3: @@ -863,6 +881,75 @@ dispatch['k'] = keyring ################################################################################ +def change_component_source(transaction, suite, component, source_names): + session = transaction.session + + overrides = session.query(Override).filter(Override.package.in_(source_names)).filter_by(suite=suite).join(OverrideType).filter_by(overridetype='dsc') + for override in overrides: + print "Changing override for {0}".format(override.package) + override.component = component + session.flush() + + sources = session.query(DBSource).filter(DBSource.source.in_(source_names)).filter(DBSource.suites.contains(suite)) + for source in sources: + print "Copying {0}={1}".format(source.source, source.version) + transaction.copy_source(source, suite, component) + +def change_component_binary(transaction, suite, component, binary_names): + session = transaction.session + + overrides = session.query(Override).filter(Override.package.in_(binary_names)).filter_by(suite=suite).join(OverrideType).filter(OverrideType.overridetype.in_(['deb', 'udeb'])) + for override in overrides: + print "Changing override for {0}".format(override.package) + override.component = component + session.flush() + + binaries = session.query(DBBinary).filter(DBBinary.package.in_(binary_names)).filter(DBBinary.suites.contains(suite)) + for binary in binaries: + print "Copying {0}={1} [{2}]".format(binary.package, binary.version, binary.architecture.arch_string) + transaction.copy_binary(binary, suite, component) + pass + +def change_component(args): + with daklib.archive.ArchiveTransaction() as transaction: + session = transaction.session + + suite = session.query(Suite).filter_by(suite_name=args[1]).one() + component = session.query(Component).filter_by(component_name=args[2]).one() + + if args[3] == 'source': + change_component_source(transaction, suite, component, args[4:]) + elif args[3] == 'binary': + change_component_binary(transaction, suite, component, args[4:]) + else: + raise Exception("Can only move source or binary, not {0}".format(args[3])) + + transaction.commit() + +dispatch['change-component'] = change_component + +################################################################################ + +def forget_signature(args): + filename = args[1] + with open(filename, 'r') as fh: + data = fh.read() + + session = DBConn().session() + keyrings = [ k.keyring_name for k in session.query(Keyring).filter_by(active=True).order_by(Keyring.priority) ] + signed_file = daklib.gpg.SignedFile(data, keyrings) + history = SignatureHistory.from_signed_file(signed_file).query(session) + if history is not None: + session.delete(history) + session.commit() + else: + print "Signature was not known to dak." + session.rollback() + +dispatch['forget-signature'] = forget_signature + +################################################################################ + def main(): """Perform administrative work on the dak database""" global dryrun