3 """Configure dak parameters in the database"""
4 # Copyright (C) 2009 Mark Hymers <mhy@debian.org>
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 ################################################################################
29 from daklib import utils
30 from daklib.dbconn import *
31 from sqlalchemy.orm.exc import NoResultFound
33 ################################################################################
38 ################################################################################
40 print >> sys.stderr, msg
42 def die(msg, exit_code=1):
43 print >> sys.stderr, msg
46 def die_arglen(args, args_needed, msg):
47 if len(args) < args_needed:
50 def usage(exit_code=0):
51 """Perform administrative work on the dak database."""
53 print """Usage: dak admin COMMAND
54 Perform administrative work on the dak database.
56 -h, --help show this help and exit.
57 -n, --dry-run don't do anything, just show what would have been done
58 (only applies to add or rm operations).
60 Commands can use a long or abbreviated form:
64 c db-shell show db config in a usable form for psql
65 c NAME show option NAME as set in configuration table
68 k list-all list all keyrings
69 k list-binary list all keyrings with a NULL source acl
70 k list-source list all keyrings with a non NULL source acl
71 k add-buildd NAME ARCH... add buildd keyring with upload permission
72 for the given architectures
75 a list show a list of architectures
76 a rm ARCH remove an architecture (will only work if
77 no longer linked to any suites)
78 a add ARCH DESCRIPTION [SUITELIST]
79 add architecture ARCH with DESCRIPTION.
80 If SUITELIST is given, add to each of the
81 suites at the same time
84 component list show a list of components
85 component rm COMPONENT remove a component (will only work if
87 component add NAME DESCRIPTION ORDERING
88 add component NAME with DESCRIPTION.
92 s list [--print-archive]
94 s show SUITE show config details for a suite
95 s add SUITE VERSION [ label=LABEL ] [ description=DESCRIPTION ]
96 [ origin=ORIGIN ] [ codename=CODENAME ]
97 [ signingkey=SIGNINGKEY ] [ archive=ARCHIVE ]
98 add suite SUITE, version VERSION.
99 label, description, origin, codename
100 and signingkey are optional.
102 s add-all-arches SUITE VERSION... as "s add" but adds suite-architecture
103 relationships for all architectures
104 s add-build-queue SUITE BUILD-QUEUE BUILD-QUEUE-CODENAME BUILD-QUEUE-ARCHIVE
105 add a build queue for an existing suite
107 suite-architecture / s-a:
108 s-a list show the architectures for all suites
109 s-a list-suite ARCH show the suites an ARCH is in
110 s-a list-arch SUITE show the architectures in a SUITE
111 s-a add SUITE ARCH add ARCH to suite
112 s-a rm SUITE ARCH remove ARCH from suite (will only work if
113 no packages remain for the arch in the suite)
115 suite-component / s-c:
116 s-c list show the architectures for all suites
117 s-c list-suite COMPONENT
118 show the suites a COMPONENT is in
119 s-c list-component SUITE
120 show the components in a SUITE
121 s-c add SUITE COMPONENT
122 add COMPONENT to suite
123 s-c rm SUITE COMPONENT remove component from suite (will only work if
124 no packages remain for the component in the suite)
127 archive list list all archives
128 archive add NAME ROOT DESCRIPTION [primary-mirror=MIRROR] [tainted=1]
129 add archive NAME with path ROOT,
130 primary mirror MIRROR.
131 archive rm NAME remove archive NAME (will only work if there are
132 no files and no suites in the archive)
133 archive rename OLD NEW rename archive OLD to NEW
136 v-c list show version checks for all suites
137 v-c list-suite SUITE show version checks for suite SUITE
138 v-c add SUITE CHECK REFERENCE add a version check for suite SUITE
139 v-c rm SUITE CHECK REFERENCE remove a version check
141 CHECK is one of Enhances, MustBeNewerThan, MustBeOlderThan
142 REFERENCE is another suite name
145 change-component SUITE COMPONENT source SOURCE...
146 change-component SUITE COMPONENT binary BINARY...
147 Move source or binary packages to a different component by copying
148 associated files and changing the overrides.
150 forget-signature FILE: forget that we saw FILE
154 ################################################################################
156 def __architecture_list(d, args):
157 q = d.session().query(Architecture).order_by(Architecture.arch_string)
159 # HACK: We should get rid of source from the arch table
160 if j.arch_string == 'source': continue
164 def __architecture_add(d, args):
165 die_arglen(args, 4, "E: adding an architecture requires a name and a description")
166 print "Adding architecture %s" % args[2]
167 suites = [str(x) for x in args[4:]]
169 print "Adding to suites %s" % ", ".join(suites)
174 a.arch_string = str(args[2]).lower()
175 a.description = str(args[3])
178 su = get_suite(sn, s)
182 warn("W: Cannot find suite %s" % su)
184 except IntegrityError as e:
185 die("E: Integrity error adding architecture %s (it probably already exists)" % args[2])
186 except SQLAlchemyError as e:
187 die("E: Error adding architecture %s (%s)" % (args[2], e))
188 print "Architecture %s added" % (args[2])
190 def __architecture_rm(d, args):
191 die_arglen(args, 3, "E: removing an architecture requires at least a name")
192 print "Removing architecture %s" % args[2]
196 a = get_architecture(args[2].lower(), s)
198 die("E: Cannot find architecture %s" % args[2])
201 except IntegrityError as e:
202 die("E: Integrity error removing architecture %s (suite-arch entries probably still exist)" % args[2])
203 except SQLAlchemyError as e:
204 die("E: Error removing architecture %s (%s)" % (args[2], e))
205 print "Architecture %s removed" % args[2]
207 def architecture(command):
208 args = [str(x) for x in command]
209 Cnf = utils.get_conf()
212 die_arglen(args, 2, "E: architecture needs at least a command")
214 mode = args[1].lower()
216 __architecture_list(d, args)
218 __architecture_add(d, args)
220 __architecture_rm(d, args)
222 die("E: architecture command unknown")
224 dispatch['architecture'] = architecture
225 dispatch['a'] = architecture
227 ################################################################################
229 def component_list():
230 session = DBConn().session()
231 for component in session.query(Component).order_by(Component.component_name):
232 print "{0} ordering={1}".format(component.component_name, component.ordering)
234 def component_add(args):
235 (name, description, ordering) = args[0:3]
239 description=description,
243 for option in args[3:]:
244 (key, value) = option.split('=')
245 attributes[key] = value
247 session = DBConn().session()
249 component = Component()
250 for key, value in attributes.iteritems():
251 setattr(component, key, value)
253 session.add(component)
261 def component_rm(name):
262 session = DBConn().session()
263 component = get_component(name, session)
264 session.delete(component)
272 def component_rename(oldname, newname):
273 session = DBConn().session()
274 component = get_component(oldname, session)
275 component.component_name = newname
283 def component(command):
287 elif mode == 'rename':
288 component_rename(command[2], command[3])
290 component_add(command[2:])
292 component_rm(command[2])
294 die("E: component command unknown")
296 dispatch['component'] = component
298 ################################################################################
300 def __suite_list(d, args):
302 for j in s.query(Suite).join(Suite.archive).order_by(Archive.archive_name, Suite.suite_name).all():
303 if len(args) > 2 and args[2] == "--print-archive":
304 print "{0} {1}".format(j.archive.archive_name, j.suite_name)
306 print "{0}".format(j.suite_name)
308 def __suite_show(d, args):
310 die("E: showing an suite entry requires a suite")
313 su = get_suite(args[2].lower())
315 die("E: can't find suite entry for %s" % (args[2].lower()))
319 def __suite_add(d, args, addallarches=False):
320 die_arglen(args, 4, "E: adding a suite requires at least a name and a version")
321 suite_name = args[2].lower()
325 def get_field(field):
327 if varval.startswith(field + '='):
328 return varval.split('=')[1]
331 print "Adding suite %s" % suite_name
336 suite.suite_name = suite_name
337 suite.overridecodename = suite_name
338 suite.version = version
339 suite.label = get_field('label')
340 suite.description = get_field('description')
341 suite.origin = get_field('origin')
342 suite.codename = get_field('codename')
343 signingkey = get_field('signingkey')
344 if signingkey is not None:
345 suite.signingkeys = [signingkey.upper()]
346 archive_name = get_field('archive')
347 if archive_name is not None:
348 suite.archive = get_archive(archive_name, s)
350 suite.archive = s.query(Archive).filter(~Archive.archive_name.in_(['build-queues', 'new', 'policy'])).one()
351 suite.srcformats = s.query(SrcFormat).all()
354 except IntegrityError as e:
355 die("E: Integrity error adding suite %s (it probably already exists)" % suite_name)
356 except SQLAlchemyError as e:
357 die("E: Error adding suite %s (%s)" % (suite_name, e))
358 print "Suite %s added" % (suite_name)
362 q = s.query(Architecture).order_by(Architecture.arch_string)
364 suite.architectures.append(arch)
365 arches.append(arch.arch_string)
367 print "Architectures %s added to %s" % (','.join(arches), suite_name)
371 def __suite_rm(d, args):
372 die_arglen(args, 3, "E: removing a suite requires at least a name")
374 print "Removing suite {0}".format(name)
378 su = get_suite(name.lower())
380 die("E: Cannot find suite {0}".format(name))
383 except IntegrityError as e:
384 die("E: Integrity error removing suite {0} (suite-arch entries probably still exist)".format(name))
385 except SQLAlchemyError as e:
386 die("E: Error removing suite {0} ({1})".format(name, e))
387 print "Suite {0} removed".format(name)
389 def __suite_add_build_queue(d, args):
390 session = d.session()
392 die_arglen(args, 6, "E: Adding a build queue needs four parameters.")
395 build_queue_name = args[3]
396 build_queue_codename = args[4]
397 build_queue_archive_name = args[5]
399 suite = session.query(Suite).filter_by(suite_name=suite_name).one()
400 except NoResultFound:
401 die("E: Unknown suite '{0}'".format(suite_name))
403 build_queue_archive = session.query(Archive).filter_by(archive_name=build_queue_archive_name).one()
404 except NoResultFound:
405 die("E: Unknown archive '{1}'".format(build_queue_archive_name))
409 s.suite_name = build_queue_name
410 s.origin = suite.origin
411 s.label = suite.label
412 s.description = "buildd {0} incoming".format(suite_name)
413 s.codename = build_queue_codename
414 s.notautomatic = suite.notautomatic
415 s.overridesuite = suite.overridesuite
416 s.butautomaticupgrades = suite.butautomaticupgrades
417 s.signingkeys = suite.signingkeys
418 s.include_long_description = False
420 s.archive = build_queue_archive
421 s.architectures.extend(suite.architectures)
422 s.components.extend(suite.components)
423 s.srcformats.extend(suite.srcformats)
429 bq.queue_name = build_queue_codename
435 suite.copy_queues.append(bq)
440 args = [str(x) for x in command]
441 Cnf = utils.get_conf()
444 die_arglen(args, 2, "E: suite needs at least a command")
446 mode = args[1].lower()
449 __suite_list(d, args)
451 __suite_show(d, args)
455 __suite_add(d, args, False)
456 elif mode == 'add-all-arches':
457 __suite_add(d, args, True)
458 elif mode == 'add-build-queue':
459 __suite_add_build_queue(d, args)
461 die("E: suite command unknown")
463 dispatch['suite'] = suite
464 dispatch['s'] = suite
466 ################################################################################
468 def __suite_architecture_list(d, args):
470 for j in s.query(Suite).order_by(Suite.suite_name):
471 architectures = j.get_architectures(skipsrc = True, skipall = True)
472 print j.suite_name + ': ' + \
473 ', '.join([a.arch_string for a in architectures])
475 def __suite_architecture_listarch(d, args):
476 die_arglen(args, 3, "E: suite-architecture list-arch requires a suite")
477 suite = get_suite(args[2].lower(), d.session())
479 die('E: suite %s is invalid' % args[2].lower())
480 a = suite.get_architectures(skipsrc = True, skipall = True)
485 def __suite_architecture_listsuite(d, args):
486 die_arglen(args, 3, "E: suite-architecture list-suite requires an arch")
487 architecture = get_architecture(args[2].lower(), d.session())
488 if architecture is None:
489 die("E: architecture %s is invalid" % args[2].lower())
490 for j in architecture.suites:
494 def __suite_architecture_add(d, args):
496 die("E: adding a suite-architecture entry requires a suite and arch")
500 suite = get_suite(args[2].lower(), s)
501 if suite is None: die("E: Can't find suite %s" % args[2].lower())
503 for arch_name in args[3:]:
504 arch = get_architecture(arch_name.lower(), s)
505 if arch is None: die("E: Can't find architecture %s" % args[3].lower())
508 suite.architectures.append(arch)
510 except IntegrityError as e:
511 die("E: Can't add suite-architecture entry (%s, %s) - probably already exists" % (args[2].lower(), arch_name))
512 except SQLAlchemyError as e:
513 die("E: Can't add suite-architecture entry (%s, %s) - %s" % (args[2].lower(), arch_name, e))
515 print "Added suite-architecture entry for %s, %s" % (args[2].lower(), arch_name)
522 def __suite_architecture_rm(d, args):
524 die("E: removing an suite-architecture entry requires a suite and arch")
529 suite_name = args[2].lower()
530 suite = get_suite(suite_name, s)
532 die('E: no such suite %s' % suite_name)
533 arch_string = args[3].lower()
534 architecture = get_architecture(arch_string, s)
535 if architecture not in suite.architectures:
536 die("E: architecture %s not found in suite %s" % (arch_string, suite_name))
537 suite.architectures.remove(architecture)
539 except IntegrityError as e:
540 die("E: Can't remove suite-architecture entry (%s, %s) - it's probably referenced" % (args[2].lower(), args[3].lower()))
541 except SQLAlchemyError as e:
542 die("E: Can't remove suite-architecture entry (%s, %s) - %s" % (args[2].lower(), args[3].lower(), e))
544 print "Removed suite-architecture entry for %s, %s" % (args[2].lower(), args[3].lower())
547 def suite_architecture(command):
548 args = [str(x) for x in command]
549 Cnf = utils.get_conf()
552 die_arglen(args, 2, "E: suite-architecture needs at least a command")
554 mode = args[1].lower()
557 __suite_architecture_list(d, args)
558 elif mode == 'list-arch':
559 __suite_architecture_listarch(d, args)
560 elif mode == 'list-suite':
561 __suite_architecture_listsuite(d, args)
563 __suite_architecture_add(d, args)
565 __suite_architecture_rm(d, args)
567 die("E: suite-architecture command unknown")
569 dispatch['suite-architecture'] = suite_architecture
570 dispatch['s-a'] = suite_architecture
572 ################################################################################
574 def __suite_component_list(d, args):
576 for j in s.query(Suite).order_by(Suite.suite_name):
577 components = j.components
578 print j.suite_name + ': ' + \
579 ', '.join([c.component_name for c in components])
582 def __suite_component_listcomponent(d, args):
583 die_arglen(args, 3, "E: suite-component list-component requires a suite")
584 suite = get_suite(args[2].lower(), d.session())
586 die('E: suite %s is invalid' % args[2].lower())
587 for c in suite.components:
588 print c.component_name
591 def __suite_component_listsuite(d, args):
592 die_arglen(args, 3, "E: suite-component list-suite requires an component")
593 component = get_component(args[2].lower(), d.session())
594 if component is None:
595 die("E: component %s is invalid" % args[2].lower())
596 for s in component.suites:
600 def __suite_component_add(d, args):
602 die("E: adding a suite-component entry requires a suite and component")
606 suite = get_suite(args[2].lower(), s)
607 if suite is None: die("E: Can't find suite %s" % args[2].lower())
609 for component_name in args[3:]:
610 component = get_component(component_name.lower(), s)
611 if component is None: die("E: Can't find component %s" % args[3].lower())
614 suite.components.append(component)
616 except IntegrityError as e:
617 die("E: Can't add suite-component entry (%s, %s) - probably already exists" % (args[2].lower(), component_name))
618 except SQLAlchemyError as e:
619 die("E: Can't add suite-component entry (%s, %s) - %s" % (args[2].lower(), component_name, e))
621 print "Added suite-component entry for %s, %s" % (args[2].lower(), component_name)
627 def __suite_component_rm(d, args):
629 die("E: removing an suite-component entry requires a suite and component")
634 suite_name = args[2].lower()
635 suite = get_suite(suite_name, s)
637 die('E: no such suite %s' % suite_name)
638 component_string = args[3].lower()
639 component = get_component(arch_string, s)
640 if component not in suite.components:
641 die("E: component %s not found in suite %s" % (component_string, suite_name))
642 suite.components.remove(component)
644 except IntegrityError as e:
645 die("E: Can't remove suite-component entry (%s, %s) - it's probably referenced" % (args[2].lower(), args[3].lower()))
646 except SQLAlchemyError as e:
647 die("E: Can't remove suite-component entry (%s, %s) - %s" % (args[2].lower(), args[3].lower(), e))
649 print "Removed suite-component entry for %s, %s" % (args[2].lower(), args[3].lower())
652 def suite_component(command):
653 args = [str(x) for x in command]
654 Cnf = utils.get_conf()
657 die_arglen(args, 2, "E: suite-component needs at least a command")
659 mode = args[1].lower()
662 __suite_component_list(d, args)
663 elif mode == 'list-component':
664 __suite_component_listcomponent(d, args)
665 elif mode == 'list-suite':
666 __suite_component_listsuite(d, args)
668 __suite_component_add(d, args)
670 # __suite_architecture_rm(d, args)
672 die("E: suite-component command unknown")
674 dispatch['suite-component'] = suite_component
675 dispatch['s-c'] = suite_component
677 ################################################################################
680 session = DBConn().session()
681 for archive in session.query(Archive).order_by(Archive.archive_name):
682 print "{0} path={1} description={2} tainted={3}".format(archive.archive_name, archive.path, archive.description, archive.tainted)
684 def archive_add(args):
685 (name, path, description) = args[0:3]
690 description=description,
693 for option in args[3:]:
694 (key, value) = option.split('=')
695 attributes[key] = value
697 session = DBConn().session()
700 for key, value in attributes.iteritems():
701 setattr(archive, key, value)
711 def archive_rm(name):
712 session = DBConn().session()
713 archive = get_archive(name, session)
714 session.delete(archive)
722 def archive_rename(oldname, newname):
723 session = DBConn().session()
724 archive = get_archive(oldname, session)
725 archive.archive_name = newname
733 def archive(command):
737 elif mode == 'rename':
738 archive_rename(command[2], command[3])
740 archive_add(command[2:])
742 archive_rm(command[2])
744 die("E: archive command unknown")
746 dispatch['archive'] = archive
748 ################################################################################
750 def __version_check_list(d):
751 session = d.session()
752 for s in session.query(Suite).order_by(Suite.suite_name):
753 __version_check_list_suite(d, s.suite_name)
755 def __version_check_list_suite(d, suite_name):
756 vcs = get_version_checks(suite_name)
758 print "%s %s %s" % (suite_name, vc.check, vc.reference.suite_name)
760 def __version_check_add(d, suite_name, check, reference_name):
761 suite = get_suite(suite_name)
763 die("E: Could not find suite %s." % (suite_name))
764 reference = get_suite(reference_name)
766 die("E: Could not find reference suite %s." % (reference_name))
768 session = d.session()
772 vc.reference = reference
776 def __version_check_rm(d, suite_name, check, reference_name):
777 suite = get_suite(suite_name)
779 die("E: Could not find suite %s." % (suite_name))
780 reference = get_suite(reference_name)
782 die("E: Could not find reference suite %s." % (reference_name))
784 session = d.session()
786 vc = session.query(VersionCheck).filter_by(suite=suite, check=check, reference=reference).one()
789 except NoResultFound:
790 print "W: version-check not found."
792 def version_check(command):
793 args = [str(x) for x in command]
794 Cnf = utils.get_conf()
797 die_arglen(args, 2, "E: version-check needs at least a command")
798 mode = args[1].lower()
801 __version_check_list(d)
802 elif mode == 'list-suite':
804 die("E: version-check list-suite needs a single parameter")
805 __version_check_list_suite(d, args[2])
808 die("E: version-check add needs three parameters")
809 __version_check_add(d, args[2], args[3], args[4])
812 die("E: version-check rm needs three parameters")
813 __version_check_rm(d, args[2], args[3], args[4])
815 die("E: version-check command unknown")
817 dispatch['version-check'] = version_check
818 dispatch['v-c'] = version_check
820 ################################################################################
822 def show_config(command):
823 args = [str(x) for x in command]
824 cnf = utils.get_conf()
826 die_arglen(args, 2, "E: config needs at least a command")
828 mode = args[1].lower()
832 if cnf.has_key("DB::Service"):
834 connstr = "postgresql://service=%s" % cnf["DB::Service"]
835 elif cnf.has_key("DB::Host"):
837 connstr = "postgres://%s" % cnf["DB::Host"]
838 if cnf.has_key("DB::Port") and cnf["DB::Port"] != "-1":
839 connstr += ":%s" % cnf["DB::Port"]
840 connstr += "/%s" % cnf["DB::Name"]
843 connstr = "postgres:///%s" % cnf["DB::Name"]
844 if cnf["DB::Port"] and cnf["DB::Port"] != "-1":
845 connstr += "?port=%s" % cnf["DB::Port"]
847 elif mode == 'db-shell':
849 if cnf.has_key("DB::Service"):
850 e.append('PGSERVICE')
851 print "PGSERVICE=%s" % cnf["DB::Service"]
852 if cnf.has_key("DB::Name"):
853 e.append('PGDATABASE')
854 print "PGDATABASE=%s" % cnf["DB::Name"]
855 if cnf.has_key("DB::Host"):
856 print "PGHOST=%s" % cnf["DB::Host"]
858 if cnf.has_key("DB::Port") and cnf["DB::Port"] != "-1":
859 print "PGPORT=%s" % cnf["DB::Port"]
861 print "export " + " ".join(e)
863 print cnf.get(args[2])
865 session = DBConn().session()
867 o = session.query(DBConfig).filter_by(name = mode).one()
869 except NoResultFound:
870 print "W: option '%s' not set" % mode
872 dispatch['config'] = show_config
873 dispatch['c'] = show_config
875 ################################################################################
877 def show_keyring(command):
878 args = [str(x) for x in command]
879 cnf = utils.get_conf()
881 die_arglen(args, 2, "E: keyring needs at least a command")
883 mode = args[1].lower()
887 q = d.session().query(Keyring).filter(Keyring.active == True)
889 if mode == 'list-all':
891 elif mode == 'list-binary':
892 q = q.join(Keyring.acl).filter(ACL.allow_source == False)
893 elif mode == 'list-source':
894 q = q.join(Keyring.acl).filter(ACL.allow_source == True)
896 die("E: keyring command unknown")
901 def keyring_add_buildd(command):
903 arch_names = command[3:]
905 session = DBConn().session()
906 arches = session.query(Architecture).filter(Architecture.arch_string.in_(arch_names))
909 acl.name = 'buildd-{0}'.format('+'.join(arch_names))
910 acl.architectures.update(arches)
912 acl.allow_binary = True
913 acl.allow_binary_only = True
914 acl.allow_hijack = True
918 k.keyring_name = name
925 def keyring(command):
926 if command[1].startswith('list-'):
927 show_keyring(command)
928 elif command[1] == 'add-buildd':
929 keyring_add_buildd(command)
931 die("E: keyring command unknown")
933 dispatch['keyring'] = keyring
934 dispatch['k'] = keyring
936 ################################################################################
938 def change_component_source(transaction, suite, component, source_names):
939 session = transaction.session
941 overrides = session.query(Override).filter(Override.package.in_(source_names)).filter_by(suite=suite).join(OverrideType).filter_by(overridetype='dsc')
942 for override in overrides:
943 print "Changing override for {0}".format(override.package)
944 override.component = component
947 sources = session.query(DBSource).filter(DBSource.source.in_(source_names)).filter(DBSource.suites.contains(suite))
948 for source in sources:
949 print "Copying {0}={1}".format(source.source, source.version)
950 transaction.copy_source(source, suite, component)
952 def change_component_binary(transaction, suite, component, binary_names):
953 session = transaction.session
955 overrides = session.query(Override).filter(Override.package.in_(binary_names)).filter_by(suite=suite).join(OverrideType).filter(OverrideType.overridetype.in_(['deb', 'udeb']))
956 for override in overrides:
957 print "Changing override for {0}".format(override.package)
958 override.component = component
961 binaries = session.query(DBBinary).filter(DBBinary.package.in_(binary_names)).filter(DBBinary.suites.contains(suite))
962 for binary in binaries:
963 print "Copying {0}={1} [{2}]".format(binary.package, binary.version, binary.architecture.arch_string)
964 transaction.copy_binary(binary, suite, component)
967 def change_component(args):
968 with daklib.archive.ArchiveTransaction() as transaction:
969 session = transaction.session
971 suite = session.query(Suite).filter_by(suite_name=args[1]).one()
972 component = session.query(Component).filter_by(component_name=args[2]).one()
974 if args[3] == 'source':
975 change_component_source(transaction, suite, component, args[4:])
976 elif args[3] == 'binary':
977 change_component_binary(transaction, suite, component, args[4:])
979 raise Exception("Can only move source or binary, not {0}".format(args[3]))
983 dispatch['change-component'] = change_component
985 ################################################################################
987 def forget_signature(args):
989 with open(filename, 'r') as fh:
992 session = DBConn().session()
993 keyrings = [ k.keyring_name for k in session.query(Keyring).filter_by(active=True).order_by(Keyring.priority) ]
994 signed_file = daklib.gpg.SignedFile(data, keyrings)
995 history = SignatureHistory.from_signed_file(signed_file).query(session)
996 if history is not None:
997 session.delete(history)
1000 print "Signature was not known to dak."
1003 dispatch['forget-signature'] = forget_signature
1005 ################################################################################
1008 """Perform administrative work on the dak database"""
1010 Cnf = utils.get_conf()
1011 arguments = [('h', "help", "Admin::Options::Help"),
1012 ('n', "dry-run", "Admin::Options::Dry-Run")]
1013 for i in [ "help", "dry-run" ]:
1014 if not Cnf.has_key("Admin::Options::%s" % (i)):
1015 Cnf["Admin::Options::%s" % (i)] = ""
1017 arguments = apt_pkg.parse_commandline(Cnf, arguments, sys.argv)
1019 options = Cnf.subtree("Admin::Options")
1020 if options["Help"] or len(arguments) < 1:
1022 if options["Dry-Run"]:
1025 subcommand = str(arguments[0])
1027 if subcommand in dispatch.keys():
1028 dispatch[subcommand](arguments)
1030 die("E: Unknown command")
1032 ################################################################################
1034 if __name__ == '__main__':