]> git.decadent.org.uk Git - dak.git/blobdiff - dak/new_security_install.py
Merge branch 'master' into security
[dak.git] / dak / new_security_install.py
index 3d8c6daea18a6522add671b1b2822bfab667b7eb..854a5834919e96aac6be9f64eb9ace94bec8d5e7 100755 (executable)
@@ -1,13 +1,36 @@
 #!/usr/bin/env python
 
-import katie, logging, utils, db_access
-import apt_pkg, os, sys, pwd, time, re, commands
+""" Wrapper for Debian Security team """
+# Copyright (C) 2006  Anthony Towns <ajt@debian.org>
 
-re_taint_free = re.compile(r"^['/;\-\+\.\s\w]+$");
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+# USA
+
+################################################################################
+
+import apt_pkg, os, sys, pwd, time, commands
+
+from daklib import queue
+from daklib import daklog
+from daklib import utils
+from daklib.dbconn import DBConn, get_build_queue, get_suite_architectures
+from daklib.regexes import re_taint_free
 
 Cnf = None
 Options = None
-Katie = None
+Upload = None
 Logger = None
 
 advisory = None
@@ -15,44 +38,45 @@ changes = []
 srcverarches = {}
 
 def init():
-    global Cnf, Katie, Options, Logger
+    global Cnf, Upload, Options, Logger
 
     Cnf = utils.get_conf()
     Cnf["Dinstall::Options::No-Mail"] = "y"
-    Arguments = [('h', "help", "Amber::Options::Help"),
-                 ('a', "automatic", "Amber::Options::Automatic"),
-                 ('n', "no-action", "Amber::Options::No-Action"),
-                ('s', "sudo", "Amber::Options::Sudo"),
-                (' ', "no-upload", "Amber::Options::No-Upload"),
-                (' ', "drop-advisory", "Amber::Options::Drop-Advisory"),
-                ('A', "approve", "Amber::Options::Approve"),
-                ('R', "reject", "Amber::Options::Reject"),
-                ('D', "disembargo", "Amber::Options::Disembargo") ]
+    Arguments = [('h', "help", "Security-Install::Options::Help"),
+                 ('a', "automatic", "Security-Install::Options::Automatic"),
+                 ('n', "no-action", "Security-Install::Options::No-Action"),
+                 ('s', "sudo", "Security-Install::Options::Sudo"),
+                 (' ', "no-upload", "Security-Install::Options::No-Upload"),
+                 ('u', "fg-upload", "Security-Install::Options::Foreground-Upload"),
+                 (' ', "drop-advisory", "Security-Install::Options::Drop-Advisory"),
+                 ('A', "approve", "Security-Install::Options::Approve"),
+                 ('R', "reject", "Security-Install::Options::Reject"),
+                 ('D', "disembargo", "Security-Install::Options::Disembargo") ]
 
     for i in Arguments:
-         Cnf[i[2]] = ""
+        Cnf[i[2]] = ""
 
     arguments = apt_pkg.ParseCommandLine(Cnf, Arguments, sys.argv)
 
-    Options = Cnf.SubTree("Amber::Options")
+    Options = Cnf.SubTree("Security-Install::Options")
 
-    whoami = os.getuid()
-    whoamifull = pwd.getpwuid(whoami)
-    username = whoamifull[0]
-    if username != "katie":
-        print "Non-katie user: %s" % username
+    username = utils.getusername()
+    if username != "dak":
+        print "Non-dak user: %s" % username
         Options["Sudo"] = "y"
 
     if Options["Help"]:
         print "help yourself"
-       sys.exit(0)
+        sys.exit(0)
 
     if len(arguments) == 0:
-       utils.fubar("Process what?")
+        utils.fubar("Process what?")
 
-    Katie = katie.Katie(Cnf)
+    Upload = queue.Upload(Cnf)
+    if Options["No-Action"]:
+        Options["Sudo"] = ""
     if not Options["Sudo"] and not Options["No-Action"]:
-        Logger = Katie.Logger = logging.Logger(Cnf, "newamber")
+        Logger = Upload.Logger = daklog.Logger(Cnf, "new-security-install")
 
     return arguments
 
@@ -66,8 +90,8 @@ def load_args(arguments):
 
     adv_ids = {}
     if not arguments[0].endswith(".changes"):
-       adv_ids [arguments[0]] = 1
-       arguments = arguments[1:]
+        adv_ids [arguments[0]] = 1
+        arguments = arguments[1:]
 
     null_adv_changes = []
 
@@ -77,12 +101,12 @@ def load_args(arguments):
             utils.fubar("can only deal with files in the current directory")
         if not a.endswith(".changes"):
             utils.fubar("not a .changes file: %s" % (a))
-        Katie.init_vars()
-        Katie.pkg.changes_file = a
-        Katie.update_vars()
-        if "adv id" in Katie.pkg.changes:
+        Upload.init_vars()
+        Upload.pkg.changes_file = a
+        Upload.update_vars()
+        if "adv id" in Upload.pkg.changes:
             changesfiles[a] = 1
-            adv_ids[Katie.pkg.changes["adv id"]] = 1
+            adv_ids[Upload.pkg.changes["adv id"]] = 1
         else:
             null_adv_changes.append(a)
 
@@ -102,19 +126,19 @@ def load_adv_changes():
 
     for c in os.listdir("."):
         if not c.endswith(".changes"): continue
-        Katie.init_vars()
-        Katie.pkg.changes_file = c
-        Katie.update_vars()
-        if "adv id" not in Katie.pkg.changes:
-           continue
-       if Katie.pkg.changes["adv id"] != advisory:
-           continue
-
-       if c not in changes: changes.append(c)
-        srcver = "%s %s" % (Katie.pkg.changes["source"], 
-                           Katie.pkg.changes["version"])
+        Upload.init_vars()
+        Upload.pkg.changes_file = c
+        Upload.update_vars()
+        if "adv id" not in Upload.pkg.changes:
+            continue
+        if Upload.pkg.changes["adv id"] != advisory:
+            continue
+
+        if c not in changes: changes.append(c)
+        srcver = "%s %s" % (Upload.pkg.changes["source"],
+                            Upload.pkg.changes["version"])
         srcverarches.setdefault(srcver, {})
-        for arch in Katie.pkg.changes["architecture"].keys():
+        for arch in Upload.pkg.changes["architecture"].keys():
             srcverarches[srcver][arch] = 1
 
 def advisory_info():
@@ -128,9 +152,9 @@ def advisory_info():
     svs = srcverarches.keys()
     svs.sort()
     for sv in svs:
-        as = srcverarches[sv].keys()
-        as.sort()
-        print " %s (%s)" % (sv, ", ".join(as))
+        as_ = srcverarches[sv].keys()
+        as_.sort()
+        print " %s (%s)" % (sv, ", ".join(as_))
 
 def prompt(opts, default):
     p = ""
@@ -138,9 +162,9 @@ def prompt(opts, default):
     for o in opts:
         v[o[0].upper()] = o
         if o[0] == default:
-           p += ", [%s]%s" % (o[0], o[1:])
-       else:
-           p += ", " + o
+            p += ", [%s]%s" % (o[0], o[1:])
+        else:
+            p += ", " + o
     p = p[2:] + "? "
     a = None
 
@@ -149,37 +173,139 @@ def prompt(opts, default):
 
     while a not in v:
         a = utils.our_raw_input(p) + default
-       a = a[:1].upper()
-       
+        a = a[:1].upper()
+
     return v[a]
 
 def add_changes(extras):
     for c in extras:
-       changes.append(c)
-        Katie.init_vars()
-        Katie.pkg.changes_file = c
-        Katie.update_vars()
-        srcver = "%s %s" % (Katie.pkg.changes["source"], Katie.pkg.changes["version"])
+        changes.append(c)
+        Upload.init_vars()
+        Upload.pkg.changes_file = c
+        Upload.update_vars()
+        srcver = "%s %s" % (Upload.pkg.changes["source"], Upload.pkg.changes["version"])
         srcverarches.setdefault(srcver, {})
-        for arch in Katie.pkg.changes["architecture"].keys():
+        for arch in Upload.pkg.changes["architecture"].keys():
             srcverarches[srcver][arch] = 1
-       Katie.pkg.changes["adv id"] = advisory
-       Katie.dump_vars(os.getcwd())
+        Upload.pkg.changes["adv id"] = advisory
+        Upload.dump_vars(os.getcwd())
 
 def yes_no(prompt):
     if Options["Automatic"]: return True
     while 1:
         answer = utils.our_raw_input(prompt + " ").lower()
-       if answer in "yn":
-           return answer == "y"
-       print "Invalid answer; please try again."
+        if answer in "yn":
+            return answer == "y"
+        print "Invalid answer; please try again."
 
 def do_upload():
     if Options["No-Upload"]:
         print "Not uploading as requested"
-       return
+    elif Options["Foreground-Upload"]:
+        actually_upload(changes)
+    else:
+        child = os.fork()
+        if child == 0:
+            actually_upload(changes)
+            os._exit(0)
+        print "Uploading in the background"
+
+def actually_upload(changes_files):
+    file_list = ""
+    suites = {}
+    component_mapping = {}
+    for component in Cnf.SubTree("Security-Install::ComponentMappings").List():
+        component_mapping[component] = Cnf["Security-Install::ComponentMappings::%s" % (component)]
+    uploads = {}; # uploads[uri] = file_list
+    changesfiles = {}; # changesfiles[uri] = file_list
+    package_list = {} # package_list[source_name][version]
+    changes_files.sort(utils.changes_compare)
+    for changes_file in changes_files:
+        changes_file = utils.validate_changes_file_arg(changes_file)
+        # Reset variables
+        components = {}
+        upload_uris = {}
+        file_list = []
+        Upload.init_vars()
+        # Parse the .dak file for the .changes file
+        Upload.pkg.changes_file = changes_file
+        Upload.update_vars()
+        files = Upload.pkg.files
+        changes = Upload.pkg.changes
+        dsc = Upload.pkg.dsc
+        # Build the file list for this .changes file
+        for file in files.keys():
+            poolname = os.path.join(Cnf["Dir::Root"], Cnf["Dir::PoolRoot"],
+                                    utils.poolify(changes["source"], files[file]["component"]),
+                                    file)
+            file_list.append(poolname)
+            orig_component = files[file].get("original component", files[file]["component"])
+            components[orig_component] = ""
+        # Determine the upload uri for this .changes file
+        for component in components.keys():
+            upload_uri = component_mapping.get(component)
+            if upload_uri:
+                upload_uris[upload_uri] = ""
+        num_upload_uris = len(upload_uris.keys())
+        if num_upload_uris == 0:
+            utils.fubar("%s: No valid upload URI found from components (%s)."
+                        % (changes_file, ", ".join(components.keys())))
+        elif num_upload_uris > 1:
+            utils.fubar("%s: more than one upload URI (%s) from components (%s)."
+                        % (changes_file, ", ".join(upload_uris.keys()),
+                           ", ".join(components.keys())))
+        upload_uri = upload_uris.keys()[0]
+        # Update the file list for the upload uri
+        if not uploads.has_key(upload_uri):
+            uploads[upload_uri] = []
+        uploads[upload_uri].extend(file_list)
+        # Update the changes list for the upload uri
+        if not changesfiles.has_key(upload_uri):
+            changesfiles[upload_uri] = []
+        changesfiles[upload_uri].append(changes_file)
+        # Remember the suites and source name/version
+        for suite in changes["distribution"].keys():
+            suites[suite] = ""
+        # Remember the source name and version
+        if changes["architecture"].has_key("source") and \
+           changes["distribution"].has_key("testing"):
+            if not package_list.has_key(dsc["source"]):
+                package_list[dsc["source"]] = {}
+            package_list[dsc["source"]][dsc["version"]] = ""
+
+    for uri in uploads.keys():
+        uploads[uri].extend(changesfiles[uri])
+        (host, path) = uri.split(":")
+        #        file_list = " ".join(uploads[uri])
+        print "Moving files to UploadQueue"
+        for filename in uploads[uri]:
+            utils.copy(filename, Cnf["Dir::Upload"])
+            # .changes files have already been moved to queue/done by p-a
+            if not filename.endswith('.changes'):
+                remove_from_buildd(suites, filename)
+        #spawn("lftp -c 'open %s; cd %s; put %s'" % (host, path, file_list))
+
+    if not Options["No-Action"]:
+        filename = "%s/testing-processed" % (Cnf["Dir::Log"])
+        file = utils.open_file(filename, 'a')
+        for source in package_list.keys():
+            for version in package_list[source].keys():
+                file.write(" ".join([source, version])+'\n')
+        file.close()
+
+def remove_from_buildd(suites, filename):
+    """Check the buildd dir for each suite and remove the file if needed"""
+    builddbase = Cnf["Dir::QueueBuild"]
+    filebase = os.path.basename(filename)
+    for s in suites:
+        try:
+            os.unlink(os.path.join(builddbase, s, filebase))
+        except OSError, e:
+            pass
+            # About no value printing this warning - it only confuses the security team,
+            # yet makes no difference otherwise.
+            #utils.warn("Problem removing %s from buildd queue %s [%s]" % (filebase, s, str(e)))
 
-    print "Would upload to ftp-master" # XXX
 
 def generate_advisory(template):
     global changes, advisory
@@ -189,49 +315,49 @@ def generate_advisory(template):
 
     for arg in changes:
         arg = utils.validate_changes_file_arg(arg)
-       Katie.pkg.changes_file = arg
-       Katie.init_vars()
-       Katie.update_vars()
-
-        src = Katie.pkg.changes["source"]
-       src_ver = "%s (%s)" % (src, Katie.pkg.changes["version"])
-       if src_ver not in adv_packages:
-           adv_packages.append(src_ver)
-
-       suites = Katie.pkg.changes["distribution"].keys()
-       for suite in suites:
-           if not updated_pkgs.has_key(suite):
+        Upload.pkg.changes_file = arg
+        Upload.init_vars()
+        Upload.update_vars()
+
+        src = Upload.pkg.changes["source"]
+        src_ver = "%s (%s)" % (src, Upload.pkg.changes["version"])
+        if src_ver not in adv_packages:
+            adv_packages.append(src_ver)
+
+        suites = Upload.pkg.changes["distribution"].keys()
+        for suite in suites:
+            if not updated_pkgs.has_key(suite):
                 updated_pkgs[suite] = {}
 
-       files = Katie.pkg.files
-       for file in files.keys():
-           arch = files[file]["architecture"]
-           md5 = files[file]["md5sum"]
-           size = files[file]["size"]
-           poolname = Cnf["Dir::PoolRoot"] + \
-               utils.poolify(src, files[file]["component"])
-           if arch == "source" and file.endswith(".dsc"):
-               dscpoolname = poolname
-           for suite in suites:
-               if not updated_pkgs[suite].has_key(arch):
-                   updated_pkgs[suite][arch] = {}
-               updated_pkgs[suite][arch][file] = {
+        files = Upload.pkg.files
+        for file in files.keys():
+            arch = files[file]["architecture"]
+            md5 = files[file]["md5sum"]
+            size = files[file]["size"]
+            poolname = Cnf["Dir::PoolRoot"] + \
+                utils.poolify(src, files[file]["component"])
+            if arch == "source" and file.endswith(".dsc"):
+                dscpoolname = poolname
+            for suite in suites:
+                if not updated_pkgs[suite].has_key(arch):
+                    updated_pkgs[suite][arch] = {}
+                updated_pkgs[suite][arch][file] = {
                     "md5": md5, "size": size, "poolname": poolname }
 
-       dsc_files = Katie.pkg.dsc_files
-       for file in dsc_files.keys():
-           arch = "source"
-           if not dsc_files[file].has_key("files id"):
+        dsc_files = Upload.pkg.dsc_files
+        for file in dsc_files.keys():
+            arch = "source"
+            if not dsc_files[file].has_key("files id"):
                 continue
 
-           # otherwise, it's already in the pool and needs to be
-           # listed specially
-           md5 = dsc_files[file]["md5sum"]
-           size = dsc_files[file]["size"]
-           for suite in suites:
-               if not updated_pkgs[suite].has_key(arch):
-                   updated_pkgs[suite][arch] = {}
-               updated_pkgs[suite][arch][file] = {
+            # otherwise, it's already in the pool and needs to be
+            # listed specially
+            md5 = dsc_files[file]["md5sum"]
+            size = dsc_files[file]["size"]
+            for suite in suites:
+                if not updated_pkgs[suite].has_key(arch):
+                    updated_pkgs[suite][arch] = {}
+                updated_pkgs[suite][arch][file] = {
                     "md5": md5, "size": size, "poolname": dscpoolname }
 
     if os.environ.has_key("SUDO_UID"):
@@ -242,11 +368,11 @@ def generate_advisory(template):
     username = whoamifull[4].split(",")[0]
 
     Subst = {
-       "__ADVISORY__": advisory,
-       "__WHOAMI__": username,
-       "__DATE__": time.strftime("%B %d, %Y", time.gmtime(time.time())),
-       "__PACKAGE__": ", ".join(adv_packages),
-        "__KATIE_ADDRESS__": Cnf["Dinstall::MyEmailAddress"]
+        "__ADVISORY__": advisory,
+        "__WHOAMI__": username,
+        "__DATE__": time.strftime("%B %d, %Y", time.gmtime(time.time())),
+        "__PACKAGE__": ", ".join(adv_packages),
+        "__DAK_ADDRESS__": Cnf["Dinstall::MyEmailAddress"]
         }
 
     if Cnf.has_key("Dinstall::Bcc"):
@@ -256,40 +382,40 @@ def generate_advisory(template):
     archive = Cnf["Archive::%s::PrimaryMirror" % (utils.where_am_i())]
     for suite in updated_pkgs.keys():
         ver = Cnf["Suite::%s::Version" % suite]
-       if ver != "": ver += " "
+        if ver != "": ver += " "
         suite_header = "%s %s(%s)" % (Cnf["Dinstall::MyDistribution"],
                                        ver, suite)
         adv += "%s\n%s\n\n" % (suite_header, "-"*len(suite_header))
 
-       arches = Cnf.ValueList("Suite::%s::Architectures" % suite)
-       if "source" in arches:
+        arches = [x.arch_name for x in get_suite_architectures(suite)]
+        if "source" in arches:
             arches.remove("source")
-       if "all" in arches:
+        if "all" in arches:
             arches.remove("all")
-       arches.sort()
+        arches.sort()
 
-       adv += "%s updates are available for %s.\n\n" % (
-               suite.capitalize(), utils.join_with_commas_and(arches))
+        adv += "%s updates are available for %s.\n\n" % (
+                suite.capitalize(), utils.join_with_commas_and(arches))
 
-       for a in ["source", "all"] + arches:
-           if not updated_pkgs[suite].has_key(a):
+        for a in ["source", "all"] + arches:
+            if not updated_pkgs[suite].has_key(a):
                 continue
 
-           if a == "source":
-               adv += "Source archives:\n\n"
-           elif a == "all":
-               adv += "Architecture independent packages:\n\n"
-           else:
-               adv += "%s architecture (%s)\n\n" % (a,
-                       Cnf["Architectures::%s" % a])
-
-           for file in updated_pkgs[suite][a].keys():
-               adv += "  http://%s/%s%s\n" % (
-                               archive, updated_pkgs[suite][a][file]["poolname"], file)
-               adv += "    Size/MD5 checksum: %8s %s\n" % (
-                       updated_pkgs[suite][a][file]["size"],
-                       updated_pkgs[suite][a][file]["md5"])
-           adv += "\n"
+            if a == "source":
+                adv += "Source archives:\n\n"
+            elif a == "all":
+                adv += "Architecture independent packages:\n\n"
+            else:
+                adv += "%s architecture (%s)\n\n" % (a,
+                        Cnf["Architectures::%s" % a])
+
+            for file in updated_pkgs[suite][a].keys():
+                adv += "  http://%s/%s%s\n" % (
+                                archive, updated_pkgs[suite][a][file]["poolname"], file)
+                adv += "    Size/MD5 checksum: %8s %s\n" % (
+                        updated_pkgs[suite][a][file]["size"],
+                        updated_pkgs[suite][a][file]["md5"])
+            adv += "\n"
     adv = adv.rstrip()
 
     Subst["__ADVISORY_TEXT__"] = adv
@@ -297,7 +423,6 @@ def generate_advisory(template):
     adv = utils.TemplateSubst(Subst, template)
     return adv
 
-
 def spawn(command):
     if not re_taint_free.match(command):
         utils.fubar("Invalid character in \"%s\"." % (command))
@@ -320,9 +445,9 @@ def spawn(command):
 def sudo(arg, fn, exit):
     if Options["Sudo"]:
         if advisory == None:
-           utils.fubar("Must set advisory name")
-        os.spawnl(os.P_WAIT, "/usr/bin/sudo","/usr/bin/sudo", "-u", "katie", "-H", 
-          "/org/security.debian.org/katie/newamber", "-"+arg, "--", advisory)
+            utils.fubar("Must set advisory name")
+        os.spawnl(os.P_WAIT, "/usr/bin/sudo", "/usr/bin/sudo", "-u", "dak", "-H",
+                  "/usr/local/bin/dak", "new-security-install", "-"+arg, "--", advisory)
     else:
         fn()
     if exit:
@@ -331,33 +456,33 @@ def sudo(arg, fn, exit):
 def do_Approve(): sudo("A", _do_Approve, True)
 def _do_Approve():
     # 1. dump advisory in drafts
-    draft = "/org/security.debian.org/advisories/drafts/%s" % (advisory)
+    draft = "/org/security-master.debian.org/advisories/drafts/%s" % (advisory)
     print "Advisory in %s" % (draft)
     if not Options["No-Action"]:
         adv_file = "./advisory.%s" % (advisory)
         if not os.path.exists(adv_file):
-            adv_file = Cnf["Dir::Templates"]+"/amber.advisory"
+            adv_file = Cnf["Dir::Templates"]+"/security-install.advisory"
         adv_fd = os.open(draft, os.O_RDWR|os.O_CREAT|os.O_EXCL, 0664)
         os.write(adv_fd, generate_advisory(adv_file))
         os.close(adv_fd)
         adv_fd = None
 
-    # 2. run kelly on changes
+    # 2. run dak process-accepted on changes
     print "Accepting packages..."
-    spawn("%s/kelly -pa %s" % (Cnf["Dir::Katie"], " ".join(changes)))
-
-    # 3. run jenna / apt-ftparchve / ziyi / tiffani
-    if not Options["No-Action"]:
-        os.chdir(Cnf["Dir::Katie"])
+    spawn("dak process-accepted -pa %s" % (" ".join(changes)))
 
+    # 3. run dak make-suite-file-list / apt-ftparchve / dak generate-releases
     print "Updating file lists for apt-ftparchive..."
-    spawn("./jenna")
+    spawn("dak make-suite-file-list")
+    spawn("dak generate-filelist")
     print "Updating Packages and Sources files..."
+    spawn("/org/security-master.debian.org/dak/config/debian-security/map.sh")
     spawn("apt-ftparchive generate %s" % (utils.which_apt_conf_file()))
     print "Updating Release files..."
-    spawn("./ziyi")
+    spawn("dak generate-releases")
     print "Triggering security mirrors..."
-    spawn("sudo -u archvsync /home/archvsync/signal_security")
+    spawn("/org/security-master.debian.org/dak/config/debian-security/make-mirror.sh")
+    spawn("sudo -u archvsync -H /home/archvsync/signal_security")
 
     # 4. chdir to done - do upload
     if not Options["No-Action"]:
@@ -369,98 +494,107 @@ def _do_Disembargo():
     if os.getcwd() != Cnf["Dir::Queue::Embargoed"].rstrip("/"):
         utils.fubar("Can only disembargo from %s" % Cnf["Dir::Queue::Embargoed"])
 
+    session = DBConn().session()
+
     dest = Cnf["Dir::Queue::Unembargoed"]
-    emb_q = db_access.get_or_set_queue_id("embargoed")
-    une_q = db_access.get_or_set_queue_id("unembargoed")
+    emb_q = get_build_queue("embargoed", session)
+    une_q = get_build_queue("unembargoed", session)
 
-    queuefiles = []
     for c in changes:
         print "Disembargoing %s" % (c)
 
-        Katie.init_vars()
-        Katie.pkg.changes_file = c
-        Katie.update_vars()
+        Upload.init_vars()
+        Upload.pkg.changes_file = c
+        Upload.update_vars()
 
-        if "source" in Katie.pkg.changes["architecture"].keys():
-           print "Adding %s %s to disembargo table" % (Katie.pkg.changes["source"], Katie.pkg.changes["version"])
-           Katie.projectB.query("INSERT INTO disembargo (package, version) VALUES ('%s', '%s')" % (Katie.pkg.changes["source"], Katie.pkg.changes["version"]))
+        if "source" in Upload.pkg.changes["architecture"].keys():
+            print "Adding %s %s to disembargo table" % (Upload.pkg.changes["source"], Upload.pkg.changes["version"])
+            session.execute("INSERT INTO disembargo (package, version) VALUES (:package, :version)",
+                {'package': Upload.pkg.changes["source"], 'version': Upload.pkg.changes["version"]})
 
         files = {}
-       for suite in Katie.pkg.changes["distribution"].keys():
-           if suite not in Cnf.ValueList("Dinstall::QueueBuildSuites"):
-               continue
-           dest_dir = Cnf["Dir::QueueBuild"]
-           if Cnf.FindB("Dinstall::SecurityQueueBuild"):
-               dest_dir = os.path.join(dest_dir, suite)
-           for file in Katie.pkg.files.keys():
-               files[os.path.join(dest_dir, file)] = 1
-
-       files = files.keys()
-       Katie.projectB.query("BEGIN WORK")
-       for f in files:
-           Katie.projectB.query("UPDATE queue_build SET queue = %s WHERE filename = '%s' AND queue = %s" % (une_q, f, emb_q))
-       Katie.projectB.query("COMMIT WORK")
-
-       for file in Katie.pkg.files.keys():
-           utils.copy(file, os.path.join(dest, file))
-           os.unlink(file)
+        for suite in Upload.pkg.changes["distribution"].keys():
+            if suite not in Cnf.ValueList("Dinstall::QueueBuildSuites"):
+                continue
+            dest_dir = Cnf["Dir::QueueBuild"]
+            if Cnf.FindB("Dinstall::SecurityQueueBuild"):
+                dest_dir = os.path.join(dest_dir, suite)
+            for file in Upload.pkg.files.keys():
+                files[os.path.join(dest_dir, file)] = 1
+
+        files = files.keys()
+        for f in files:
+            session.execute("UPDATE queue_build SET queue = :unembargoed WHERE filename = :filename AND queue = :embargoed",
+                {'unembargoed': une_q.queue_id, 'filename': f, 'embargoed': emb_q.queue_id})
+        session.commit()
+
+        for file in Upload.pkg.files.keys():
+            utils.copy(file, os.path.join(dest, file))
+            os.unlink(file)
 
     for c in changes:
         utils.copy(c, os.path.join(dest, c))
-       os.unlink(c)
-       k = c[:8] + ".katie"
+        os.unlink(c)
+        k = c[:-8] + ".dak"
         utils.copy(k, os.path.join(dest, k))
-       os.unlink(k)
+        os.unlink(k)
+
+    session.commit()
 
 def do_Reject(): sudo("R", _do_Reject, True)
 def _do_Reject():
     global changes
+
+    session = DBConn().session()
+
     for c in changes:
         print "Rejecting %s..." % (c)
-        Katie.init_vars()
-        Katie.pkg.changes_file = c
-        Katie.update_vars()
+        Upload.init_vars()
+        Upload.pkg.changes_file = c
+        Upload.update_vars()
         files = {}
-       for suite in Katie.pkg.changes["distribution"].keys():
-           if suite not in Cnf.ValueList("Dinstall::QueueBuildSuites"):
-               continue
-           dest_dir = Cnf["Dir::QueueBuild"]
-           if Cnf.FindB("Dinstall::SecurityQueueBuild"):
-               dest_dir = os.path.join(dest_dir, suite)
-           for file in Katie.pkg.files.keys():
-               files[os.path.join(dest_dir, file)] = 1
-
-       files = files.keys()
-
-       aborted = Katie.do_reject()
-       if not aborted:
-           os.unlink(c[:-8]+".katie")
-           for f in files:
-               Katie.projectB.query(
-                   "DELETE FROM queue_build WHERE filename = '%s'" % (f))
-               os.unlink(f)
+        for suite in Upload.pkg.changes["distribution"].keys():
+            if suite not in Cnf.ValueList("Dinstall::QueueBuildSuites"):
+                continue
+            dest_dir = Cnf["Dir::QueueBuild"]
+            if Cnf.FindB("Dinstall::SecurityQueueBuild"):
+                dest_dir = os.path.join(dest_dir, suite)
+            for file in Upload.pkg.files.keys():
+                files[os.path.join(dest_dir, file)] = 1
+
+        files = files.keys()
+
+        aborted = Upload.do_reject()
+        if not aborted:
+            os.unlink(c[:-8]+".dak")
+            for f in files:
+                session.execute("DELETE FROM queue_build WHERE filename = :filename",
+                    {'filename': f})
+                os.unlink(f)
 
     print "Updating buildd information..."
-    spawn("/org/security.debian.org/katie/cron.buildd-security")
+    spawn("/org/security-master.debian.org/dak/config/debian-security/cron.buildd")
 
     adv_file = "./advisory.%s" % (advisory)
     if os.path.exists(adv_file):
         os.unlink(adv_file)
 
+    session.commit()
+
 def do_DropAdvisory():
     for c in changes:
-        Katie.init_vars()
-        Katie.pkg.changes_file = c
-        Katie.update_vars()
-       del Katie.pkg.changes["adv id"]
-       Katie.dump_vars(os.getcwd())
+        Upload.init_vars()
+        Upload.pkg.changes_file = c
+        Upload.update_vars()
+        del Upload.pkg.changes["adv id"]
+        Upload.dump_vars(os.getcwd())
     quit()
 
 def do_Edit():
     adv_file = "./advisory.%s" % (advisory)
     if not os.path.exists(adv_file):
-        utils.copy(Cnf["Dir::Templates"]+"/amber.advisory", adv_file)
-    editor = os.environ.get("EDITOR","vi")
+        utils.copy(Cnf["Dir::Templates"]+"/security-install.advisory", adv_file)
+    editor = os.environ.get("EDITOR", "vi")
     result = os.system("%s %s" % (editor, adv_file))
     if result != 0:
         utils.fubar("%s invocation failed for %s." % (editor, adv_file))
@@ -468,7 +602,7 @@ def do_Edit():
 def do_Show():
     adv_file = "./advisory.%s" % (advisory)
     if not os.path.exists(adv_file):
-        adv_file = Cnf["Dir::Templates"]+"/amber.advisory"
+        adv_file = Cnf["Dir::Templates"]+"/security-install.advisory"
     print "====\n%s\n====" % (generate_advisory(adv_file))
 
 def do_Quit():
@@ -484,17 +618,17 @@ def main():
     if extras:
         if not advisory:
             changes = extras
-       else:
+        else:
             if srcverarches == {}:
                 if not yes_no("Create new advisory %s?" % (advisory)):
-                   print "Not doing anything, then"
-                   quit()
+                    print "Not doing anything, then"
+                    quit()
             else:
                 advisory_info()
-               doextras = []
+                doextras = []
                 for c in extras:
-                   if yes_no("Add %s to %s?" % (c, advisory)):
-                        doextras.append(c)
+                    if yes_no("Add %s to %s?" % (c, advisory)):
+                        doextras.append(c)
                 extras = doextras
             add_changes(extras)
 
@@ -505,45 +639,50 @@ def main():
         utils.fubar("No changes specified")
 
     if Options["Approve"]:
-       advisory_info()
+        advisory_info()
         do_Approve()
     elif Options["Reject"]:
-       advisory_info()
+        advisory_info()
         do_Reject()
     elif Options["Disembargo"]:
-       advisory_info()
+        advisory_info()
         do_Disembargo()
     elif Options["Drop-Advisory"]:
         advisory_info()
-       do_DropAdvisory()
+        do_DropAdvisory()
     else:
         while 1:
             default = "Q"
-           opts = ["Approve", "Edit advisory"]
-           if os.path.exists("./advisory.%s" % advisory):
-               default = "A"
-           else:
-               default = "E"
-           if os.getcwd() == Cnf["Dir::Queue::Embargoed"].rstrip("/"):
-               opts.append("Disembargo")
-           opts += ["Show advisory", "Reject", "Quit"]
-       
-           advisory_info()
+            opts = ["Approve", "Edit advisory"]
+            if os.path.exists("./advisory.%s" % advisory):
+                default = "A"
+            else:
+                default = "E"
+            if os.getcwd() == Cnf["Dir::Queue::Embargoed"].rstrip("/"):
+                opts.append("Disembargo")
+            opts += ["Show advisory", "Reject", "Quit"]
+
+            advisory_info()
             what = prompt(opts, default)
 
-           if what == "Quit":
-               do_Quit()
-           elif what == "Approve":
-               do_Approve()
-           elif what == "Edit advisory":
-               do_Edit()
-           elif what == "Show advisory":
-               do_Show()
-           elif what == "Disembargo":
-               do_Disembargo()
-           elif what == "Reject":
-               do_Reject()
-           else:
-               utils.fubar("Impossible answer '%s', wtf?" % (what))
-
-main()
+            if what == "Quit":
+                do_Quit()
+            elif what == "Approve":
+                do_Approve()
+            elif what == "Edit advisory":
+                do_Edit()
+            elif what == "Show advisory":
+                do_Show()
+            elif what == "Disembargo":
+                do_Disembargo()
+            elif what == "Reject":
+                do_Reject()
+            else:
+                utils.fubar("Impossible answer '%s', wtf?" % (what))
+
+################################################################################
+
+if __name__ == '__main__':
+    main()
+
+################################################################################