]> git.decadent.org.uk Git - dak.git/blobdiff - dak/admin.py
Merge remote branch 'mhy/master'
[dak.git] / dak / admin.py
index 663b196b64db06534df436c910ed40d519575362..2183c2293b2ad4c039d1658362b1f72ad318c22b 100755 (executable)
@@ -25,6 +25,7 @@ import apt_pkg
 
 from daklib import utils
 from daklib.dbconn import *
 
 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
   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
 
   architecture / a:
      a list                 show a list of architectures
@@ -76,6 +83,9 @@ Perform administrative work on the dak database.
                             add suite SUITE, version VERSION. label,
                             description, origin and codename are optional.
 
                             add suite SUITE, version VERSION. label,
                             description, origin and codename 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
      s-a list-suite ARCH    show the suites an ARCH is in
   suite-architecture / s-a:
      s-a list               show the architectures for all suites
      s-a list-suite ARCH    show the suites an ARCH is in
@@ -83,6 +93,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)
      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    rmove a version check
+       where
+         CHECK     is one of Enhances, MustBeNewerThan, MustBeOlderThan
+        REFERENCE is another suite name
 """
     sys.exit(exit_code)
 
 """
     sys.exit(exit_code)
 
@@ -177,7 +196,7 @@ def __suite_show(d, args):
 
     print su.details()
 
 
     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]
     die_arglen(args, 4, "E: adding a suite requires at least a name and a version")
     suite_name = args[2].lower()
     version = args[3]
@@ -201,13 +220,25 @@ def __suite_add(d, args):
             suite.origin = get_field('origin')
             suite.codename = get_field('codename')
             s.add(suite)
             suite.origin = get_field('origin')
             suite.codename = get_field('codename')
             s.add(suite)
-            s.commit()
+            s.flush()
         except IntegrityError, e:
             die("E: Integrity error adding suite %s (it probably already exists)" % suite_name)
         except SQLAlchemyError, e:
             die("E: Error adding suite %s (%s)" % (suite_name, e))
     print "Suite %s added" % (suite_name)
 
         except IntegrityError, e:
             die("E: Integrity error adding suite %s (it probably already exists)" % suite_name)
         except SQLAlchemyError, 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()
 def suite(command):
     args = [str(x) for x in command]
     Cnf = utils.get_conf()
@@ -222,7 +253,9 @@ def suite(command):
     elif mode == 'show':
         __suite_show(d, args)
     elif mode == 'add':
     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")
 
     else:
         die("E: suite command unknown")
 
@@ -333,6 +366,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()
 def show_config(command):
     args = [str(x) for x in command]
     cnf = utils.get_conf()
@@ -359,6 +464,7 @@ def show_config(command):
                 connstr += "?port=%s" % cnf["DB::Port"]
         print connstr
     elif mode == 'db-shell':
                 connstr += "?port=%s" % cnf["DB::Port"]
         print connstr
     elif mode == 'db-shell':
+        e = []
         if cnf.has_key("DB::Service"):
             e.append('PGSERVICE')
             print "PGSERVICE=%s" % cnf["DB::Service"]
         if cnf.has_key("DB::Service"):
             e.append('PGSERVICE')
             print "PGSERVICE=%s" % cnf["DB::Service"]
@@ -373,13 +479,47 @@ def show_config(command):
             e.append('PGPORT')
         print "export " + " ".join(e)
     else:
             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
 
 ################################################################################
 
 
 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
 def main():
     """Perform administrative work on the dak database"""
     global dryrun