X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=dak%2Fadmin.py;h=3fa7eefb032b209414f3907dba15af5287a8b07e;hb=6a6d627c2d86e2acb263107ab2f115a8a68428f9;hp=d159651e75df850904971df8f7b3705b4bbd6837;hpb=3b0114ce123dc45186d02045233510b777a01b02;p=dak.git diff --git a/dak/admin.py b/dak/admin.py index d159651e..3fa7eefb 100755 --- a/dak/admin.py +++ b/dak/admin.py @@ -61,6 +61,13 @@ Perform administrative work on the dak database. 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 + k add-buildd NAME ARCH... add buildd keyring with upload permission + for the given architectures + architecture / a: a list show a list of architectures a rm ARCH remove an architecture (will only work if @@ -75,8 +82,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 @@ -86,11 +98,20 @@ Perform administrative work on the dak database. s-a rm SUITE ARCH remove ARCH from suite (will only work if no packages remain for the arch in the suite) + archive: + archive list list all archives + archive add NAME ROOT DESCRIPTION [primary-mirror=MIRROR] [tainted=1] + add archive NAME with path ROOT, + primary mirror MIRROR. + archive rm NAME remove archive NAME (will only work if there are + no files and no suites in the archive) + archive rename OLD NEW rename archive OLD to NEW + 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 rmove a version check + v-c rm SUITE CHECK REFERENCE remove a version check where CHECK is one of Enhances, MustBeNewerThan, MustBeOlderThan REFERENCE is another suite name @@ -100,7 +121,7 @@ Perform administrative work on the dak database. ################################################################################ def __architecture_list(d, args): - q = d.session().query(Architecture).order_by('arch_string') + q = d.session().query(Architecture).order_by(Architecture.arch_string) for j in q.all(): # HACK: We should get rid of source from the arch table if j.arch_string == 'source': continue @@ -127,9 +148,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]) @@ -144,9 +165,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] @@ -174,7 +195,7 @@ dispatch['a'] = architecture def __suite_list(d, args): s = d.session() - for j in s.query(Suite).order_by('suite_name').all(): + for j in s.query(Suite).order_by(Suite.suite_name).all(): print j.suite_name def __suite_show(d, args): @@ -188,7 +209,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] @@ -206,19 +227,41 @@ 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()] + archive_name = get_field('archive') + if archive_name is not None: + suite.archive = get_archive(archive_name, s) + else: + suite.archive = s.query(Archive).filter(~Archive.archive_name.in_(['build-queues', 'new', 'policy'])).one() + 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(Architecture.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() @@ -233,7 +276,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") @@ -244,7 +289,7 @@ dispatch['s'] = suite def __suite_architecture_list(d, args): s = d.session() - for j in s.query(Suite).order_by('suite_name'): + for j in s.query(Suite).order_by(Suite.suite_name): architectures = j.get_architectures(skipsrc = True, skipall = True) print j.suite_name + ': ' + \ ', '.join([a.arch_string for a in architectures]) @@ -284,9 +329,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()) @@ -309,9 +354,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()) @@ -344,9 +389,80 @@ dispatch['s-a'] = suite_architecture ################################################################################ +def archive_list(): + session = DBConn().session() + for archive in session.query(Archive).order_by(Archive.archive_name): + print "{0} path={1} description={2} tainted={3}".format(archive.archive_name, archive.path, archive.description, archive.tainted) + +def archive_add(args): + (name, path, description) = args[0:3] + + attributes = dict( + archive_name=name, + path=path, + description=description, + ) + + for option in args[3:]: + (key, value) = option.split('=') + attributes[key] = value + + session = DBConn().session() + + archive = Archive() + for key, value in attributes.iteritems(): + setattr(archive, key, value) + + session.add(archive) + session.flush() + + if dryrun: + session.rollback() + else: + session.commit() + +def archive_rm(name): + session = DBConn().session() + archive = session.query(Archive).filter_by(archive_name=name).one() + session.delete(archive) + session.flush() + + if dryrun: + session.rollback() + else: + session.commit() + +def archive_rename(oldname, newname): + session = DBConn().session() + archive = get_archive(oldname, session) + archive.archive_name = newname + session.flush() + + if dryrun: + session.rollback() + else: + session.commit() + +def archive(command): + mode = command[1] + if mode == 'list': + archive_list() + elif mode == 'rename': + archive_rename(command[2], command[3]) + elif mode == 'add': + archive_add(command[2:]) + elif mode == 'rm': + archive_rm(command[2]) + else: + die("E: archive command unknown") + +dispatch['archive'] = archive + +################################################################################ + def __version_check_list(d): session = d.session() - for s in session.query(Suite).order_by('suite_name'): + for s in session.query(Suite).order_by(Suite.suite_name): __version_check_list_suite(d, s.suite_name) def __version_check_list_suite(d, suite_name): @@ -456,6 +572,8 @@ def show_config(command): print "PGPORT=%s" % cnf["DB::Port"] e.append('PGPORT') print "export " + " ".join(e) + elif mode == 'get': + print cnf.get(args[2]) else: session = DBConn().session() try: @@ -469,6 +587,67 @@ 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.join(Keyring.acl).filter(ACL.allow_source == False) + elif mode == 'list-source': + q = q.join(Keyring.acl).filter(ACL.allow_source == True) + else: + die("E: keyring command unknown") + + for k in q.all(): + print k.keyring_name + +def keyring_add_buildd(command): + name = command[2] + arch_names = command[3:] + + session = DBConn().session() + arches = session.query(Architecture).filter(Architecture.arch_string.in_(arch_names)) + + acl = ACL() + acl.name = 'buildd-{0}'.format('+'.join(arch_names)) + acl.architectures.update(arches) + acl.allow_new = True + acl.allow_binary = True + acl.allow_binary_only = True + acl.allow_hijack = True + session.add(acl) + + k = Keyring() + k.keyring_name = name + k.acl = acl + k.priority = 10 + session.add(k) + + session.commit() + +def keyring(command): + if command[1].startswith('list-'): + show_keyring(command) + elif command[1] == 'add-buildd': + keyring_add_buildd(command) + else: + die("E: keyring command unknown") + +dispatch['keyring'] = keyring +dispatch['k'] = keyring + +################################################################################ + def main(): """Perform administrative work on the dak database""" global dryrun @@ -479,9 +658,9 @@ def main(): if not Cnf.has_key("Admin::Options::%s" % (i)): Cnf["Admin::Options::%s" % (i)] = "" - arguments = apt_pkg.ParseCommandLine(Cnf, arguments, sys.argv) + arguments = apt_pkg.parse_commandline(Cnf, arguments, sys.argv) - options = Cnf.SubTree("Admin::Options") + options = Cnf.subtree("Admin::Options") if options["Help"] or len(arguments) < 1: usage() if options["Dry-Run"]: