X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=dak%2Fadmin.py;h=e4d1034d0ac247ba2cda62018b3fb203c65eae07;hb=39799e5acc0db0c864ebea1b38fc6c1e1a5cec25;hp=8ba79797bdaf6345e6d5b1c3bd0206c8c3313c08;hpb=c66012218feeb5a9a4228890f44a9a27dcaafeca;p=dak.git diff --git a/dak/admin.py b/dak/admin.py index 8ba79797..e4d1034d 100755 --- a/dak/admin.py +++ b/dak/admin.py @@ -65,6 +65,8 @@ Perform administrative work on the dak database. 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 @@ -75,12 +77,21 @@ Perform administrative work on the dak database. If SUITELIST is given, add to each of the suites at the same time + component: + component list show a list of components + component rm COMPONENT remove a component (will only work if + empty) + component add NAME DESCRIPTION ORDERING + add component NAME with DESCRIPTION. + Ordered at ORDERING. + suite / s: - s list show a list of suites + s list [--print-archive] + show a list of suites s show SUITE show config details for a suite s add SUITE VERSION [ label=LABEL ] [ description=DESCRIPTION ] [ origin=ORIGIN ] [ codename=CODENAME ] - [ signingkey=SIGNINGKEY ] + [ signingkey=SIGNINGKEY ] [ archive=ARCHIVE ] add suite SUITE, version VERSION. label, description, origin, codename and signingkey are optional. @@ -103,6 +114,7 @@ Perform administrative work on the dak database. 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 @@ -190,10 +202,84 @@ dispatch['a'] = architecture ################################################################################ +def component_list(): + session = DBConn().session() + for component in session.query(Component).order_by(Component.component_name): + print "{0} ordering={1}".format(component.component_name, component.ordering) + +def component_add(args): + (name, description, ordering) = args[0:3] + + attributes = dict( + component_name=name, + description=description, + ordering=ordering, + ) + + for option in args[3:]: + (key, value) = option.split('=') + attributes[key] = value + + session = DBConn().session() + + component = Component() + for key, value in attributes.iteritems(): + setattr(component, key, value) + + session.add(component) + session.flush() + + if dryrun: + session.rollback() + else: + session.commit() + +def component_rm(name): + session = DBConn().session() + component = get_component(name, session) + session.delete(component) + session.flush() + + if dryrun: + session.rollback() + else: + session.commit() + +def component_rename(oldname, newname): + session = DBConn().session() + component = get_component(oldname, session) + component.component_name = newname + session.flush() + + if dryrun: + session.rollback() + else: + session.commit() + +def component(command): + mode = command[1] + if mode == 'list': + component_list() + elif mode == 'rename': + component_rename(command[2], command[3]) + elif mode == 'add': + component_add(command[2:]) + elif mode == 'rm': + component_rm(command[2]) + else: + die("E: component command unknown") + +dispatch['component'] = component + +################################################################################ + def __suite_list(d, args): s = d.session() - for j in s.query(Suite).order_by(Suite.suite_name).all(): - print j.suite_name + for j in s.query(Suite).join(Suite.archive).order_by(Archive.archive_name, Suite.suite_name).all(): + if len(args) > 2 and args[2] == "--print-archive": + print "{0} {1}".format(j.archive.archive_name, j.suite_name) + else: + print "{0}".format(j.suite_name) def __suite_show(d, args): if len(args) < 2: @@ -258,6 +344,23 @@ def __suite_add(d, args, addallarches=False): s.commit() +def __suite_rm(d, args): + die_arglen(args, 3, "E: removing a suite requires at least a name") + name = args[2] + print "Removing suite {0}".format(name) + if not dryrun: + try: + s = d.session() + su = get_suite(name.lower()) + if su is None: + die("E: Cannot find suite {0}".format(name)) + s.delete(su) + s.commit() + except IntegrityError as e: + die("E: Integrity error removing suite {0} (suite-arch entries probably still exist)".format(name)) + except SQLAlchemyError as e: + die("E: Error removing suite {0} ({1})".format(name, e)) + print "Suite {0} removed".format(name) def suite(command): args = [str(x) for x in command] @@ -272,6 +375,8 @@ def suite(command): __suite_list(d, args) elif mode == 'show': __suite_show(d, args) + elif mode == 'rm': + __suite_rm(d, args) elif mode == 'add': __suite_add(d, args, False) elif mode == 'add-all-arches': @@ -420,7 +525,7 @@ def archive_add(args): def archive_rm(name): session = DBConn().session() - archive = session.query(Archive).filter_by(archive_name=name).one() + archive = get_archive(name, session) session.delete(archive) session.flush() @@ -429,10 +534,23 @@ def archive_rm(name): 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': @@ -595,8 +713,40 @@ def show_keyring(command): for k in q.all(): print k.keyring_name -dispatch['keyring'] = show_keyring -dispatch['k'] = show_keyring +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 ################################################################################