X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=dak%2Fadmin.py;h=e109877faf0d5606fd5fb1ebe4049f973a821da5;hb=27e00376e81d1c37ff327ee0d39670b266418869;hp=218eea578ed7ef9bf5f78a32898f745570c91827;hpb=87bcdbc7dffd6230cb4d49942fbd87ead6f2fffe;p=dak.git diff --git a/dak/admin.py b/dak/admin.py index 218eea57..e109877f 100755 --- a/dak/admin.py +++ b/dak/admin.py @@ -25,6 +25,7 @@ import apt_pkg from daklib import utils from daklib.dbconn import * +from sqlalchemy.orm.exc import NoResultFound ################################################################################ @@ -58,6 +59,12 @@ Perform administrative work on the dak database. config / c: c db show db config c db-shell show db config in a usable form for psql + c NAME show option NAME as set in configuration table + + keyring / k: + k list-all list all keyrings + k list-binary list all keyrings with a NULL source acl + k list-source list all keyrings with a non NULL source acl architecture / a: a list show a list of architectures @@ -73,8 +80,13 @@ Perform administrative work on the dak database. s show SUITE show config details for a suite s add SUITE VERSION [ label=LABEL ] [ description=DESCRIPTION ] [ origin=ORIGIN ] [ codename=CODENAME ] - add suite SUITE, version VERSION. label, - description, origin and codename are optional. + [ signingkey=SIGNINGKEY ] + add suite SUITE, version VERSION. + label, description, origin, codename + and signingkey are optional. + + s add-all-arches SUITE VERSION... as "s add" but adds suite-architecture + relationships for all architectures suite-architecture / s-a: s-a list show the architectures for all suites @@ -83,6 +95,15 @@ Perform administrative work on the dak database. s-a add SUITE ARCH add ARCH to suite s-a rm SUITE ARCH remove ARCH from suite (will only work if no packages remain for the arch in the suite) + + version-check / v-c: + v-c list show version checks for all suites + v-c list-suite SUITE show version checks for suite SUITE + v-c add SUITE CHECK REFERENCE add a version check for suite SUITE + v-c rm SUITE CHECK REFERENCE remove a version check + where + CHECK is one of Enhances, MustBeNewerThan, MustBeOlderThan + REFERENCE is another suite name """ sys.exit(exit_code) @@ -116,9 +137,9 @@ def __architecture_add(d, args): else: warn("W: Cannot find suite %s" % su) s.commit() - except IntegrityError, e: + except IntegrityError as e: die("E: Integrity error adding architecture %s (it probably already exists)" % args[2]) - except SQLAlchemyError, e: + except SQLAlchemyError as e: die("E: Error adding architecture %s (%s)" % (args[2], e)) print "Architecture %s added" % (args[2]) @@ -133,9 +154,9 @@ def __architecture_rm(d, args): die("E: Cannot find architecture %s" % args[2]) s.delete(a) s.commit() - except IntegrityError, e: + except IntegrityError as e: die("E: Integrity error removing architecture %s (suite-arch entries probably still exist)" % args[2]) - except SQLAlchemyError, e: + except SQLAlchemyError as e: die("E: Error removing architecture %s (%s)" % (args[2], e)) print "Architecture %s removed" % args[2] @@ -177,7 +198,7 @@ def __suite_show(d, args): print su.details() -def __suite_add(d, args): +def __suite_add(d, args, addallarches=False): die_arglen(args, 4, "E: adding a suite requires at least a name and a version") suite_name = args[2].lower() version = args[3] @@ -195,19 +216,36 @@ def __suite_add(d, args): s = d.session() suite = Suite() suite.suite_name = suite_name + suite.overridecodename = suite_name suite.version = version suite.label = get_field('label') suite.description = get_field('description') suite.origin = get_field('origin') suite.codename = get_field('codename') + signingkey = get_field('signingkey') + if signingkey is not None: + suite.signingkeys = [signingkey.upper()] + suite.srcformats = s.query(SrcFormat).all() s.add(suite) - s.commit() - except IntegrityError, e: + s.flush() + except IntegrityError as e: die("E: Integrity error adding suite %s (it probably already exists)" % suite_name) - except SQLAlchemyError, e: + except SQLAlchemyError as e: die("E: Error adding suite %s (%s)" % (suite_name, e)) print "Suite %s added" % (suite_name) + if addallarches: + arches = [] + q = s.query(Architecture).order_by('arch_string') + for arch in q.all(): + suite.architectures.append(arch) + arches.append(arch.arch_string) + + print "Architectures %s added to %s" % (','.join(arches), suite_name) + + s.commit() + + def suite(command): args = [str(x) for x in command] Cnf = utils.get_conf() @@ -222,7 +260,9 @@ def suite(command): elif mode == 'show': __suite_show(d, args) elif mode == 'add': - __suite_add(d, args) + __suite_add(d, args, False) + elif mode == 'add-all-arches': + __suite_add(d, args, True) else: die("E: suite command unknown") @@ -273,9 +313,9 @@ def __suite_architecture_add(d, args): try: suite.architectures.append(arch) s.commit() - except IntegrityError, e: + except IntegrityError as e: die("E: Can't add suite-architecture entry (%s, %s) - probably already exists" % (args[2].lower(), args[3].lower())) - except SQLAlchemyError, e: + except SQLAlchemyError as e: die("E: Can't add suite-architecture entry (%s, %s) - %s" % (args[2].lower(), args[3].lower(), e)) print "Added suite-architecture entry for %s, %s" % (args[2].lower(), args[3].lower()) @@ -298,9 +338,9 @@ def __suite_architecture_rm(d, args): die("E: architecture %s not found in suite %s" % (arch_string, suite_name)) suite.architectures.remove(architecture) s.commit() - except IntegrityError, e: + except IntegrityError as e: die("E: Can't remove suite-architecture entry (%s, %s) - it's probably referenced" % (args[2].lower(), args[3].lower())) - except SQLAlchemyError, e: + except SQLAlchemyError as e: die("E: Can't remove suite-architecture entry (%s, %s) - %s" % (args[2].lower(), args[3].lower(), e)) print "Removed suite-architecture entry for %s, %s" % (args[2].lower(), args[3].lower()) @@ -333,6 +373,78 @@ dispatch['s-a'] = suite_architecture ################################################################################ +def __version_check_list(d): + session = d.session() + for s in session.query(Suite).order_by('suite_name'): + __version_check_list_suite(d, s.suite_name) + +def __version_check_list_suite(d, suite_name): + vcs = get_version_checks(suite_name) + for vc in vcs: + print "%s %s %s" % (suite_name, vc.check, vc.reference.suite_name) + +def __version_check_add(d, suite_name, check, reference_name): + suite = get_suite(suite_name) + if not suite: + die("E: Could not find suite %s." % (suite_name)) + reference = get_suite(reference_name) + if not reference: + die("E: Could not find reference suite %s." % (reference_name)) + + session = d.session() + vc = VersionCheck() + vc.suite = suite + vc.check = check + vc.reference = reference + session.add(vc) + session.commit() + +def __version_check_rm(d, suite_name, check, reference_name): + suite = get_suite(suite_name) + if not suite: + die("E: Could not find suite %s." % (suite_name)) + reference = get_suite(reference_name) + if not reference: + die("E: Could not find reference suite %s." % (reference_name)) + + session = d.session() + try: + vc = session.query(VersionCheck).filter_by(suite=suite, check=check, reference=reference).one() + session.delete(vc) + session.commit() + except NoResultFound: + print "W: version-check not found." + +def version_check(command): + args = [str(x) for x in command] + Cnf = utils.get_conf() + d = DBConn() + + die_arglen(args, 2, "E: version-check needs at least a command") + mode = args[1].lower() + + if mode == 'list': + __version_check_list(d) + elif mode == 'list-suite': + if len(args) != 3: + die("E: version-check list-suite needs a single parameter") + __version_check_list_suite(d, args[2]) + elif mode == 'add': + if len(args) != 5: + die("E: version-check add needs three parameters") + __version_check_add(d, args[2], args[3], args[4]) + elif mode == 'rm': + if len(args) != 5: + die("E: version-check rm needs three parameters") + __version_check_rm(d, args[2], args[3], args[4]) + else: + die("E: version-check command unknown") + +dispatch['version-check'] = version_check +dispatch['v-c'] = version_check + +################################################################################ + def show_config(command): args = [str(x) for x in command] cnf = utils.get_conf() @@ -374,13 +486,47 @@ def show_config(command): e.append('PGPORT') print "export " + " ".join(e) else: - die("E: config command unknown") + session = DBConn().session() + try: + o = session.query(DBConfig).filter_by(name = mode).one() + print o.value + except NoResultFound: + print "W: option '%s' not set" % mode dispatch['config'] = show_config dispatch['c'] = show_config ################################################################################ +def show_keyring(command): + args = [str(x) for x in command] + cnf = utils.get_conf() + + die_arglen(args, 2, "E: keyring needs at least a command") + + mode = args[1].lower() + + d = DBConn() + + q = d.session().query(Keyring).filter(Keyring.active == True) + + if mode == 'list-all': + pass + elif mode == 'list-binary': + q = q.filter(Keyring.default_source_acl_id == None) + elif mode == 'list-source': + q = q.filter(Keyring.default_source_acl_id != None) + else: + die("E: keyring command unknown") + + for k in q.all(): + print k.keyring_name + +dispatch['keyring'] = show_keyring +dispatch['k'] = show_keyring + +################################################################################ + def main(): """Perform administrative work on the dak database""" global dryrun