X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=daklib%2Fqueue_install.py;h=d53887863176972b54e7fe652eac70dbc429bb5e;hb=117f3acf50f2d38c616f76bd8274248d849c3fd5;hp=40f0304e8228c72e5cbc49399324e294caddaad4;hpb=285e2240c786fb3ca7a87c5389ad28e6ba2f350f;p=dak.git diff --git a/daklib/queue_install.py b/daklib/queue_install.py old mode 100644 new mode 100755 index 40f0304e..d5388786 --- a/daklib/queue_install.py +++ b/daklib/queue_install.py @@ -25,84 +25,53 @@ Utility functions for process-upload # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -from daklib.config import Config - -############################################################################### - -# q-unapproved hax0ring -QueueInfo = { - "New": { "is": is_new, "process": acknowledge_new }, - "Autobyhand" : { "is" : is_autobyhand, "process": do_autobyhand }, - "Byhand" : { "is": is_byhand, "process": do_byhand }, - "OldStableUpdate" : { "is": is_oldstableupdate, - "process": do_oldstableupdate }, - "StableUpdate" : { "is": is_stableupdate, "process": do_stableupdate }, - "Unembargo" : { "is": is_unembargo, "process": queue_unembargo }, - "Embargo" : { "is": is_embargo, "process": queue_embargo }, -} - -def determine_target(u): - cnf = Config() - - queues = [ "New", "Autobyhand", "Byhand" ] - if cnf.FindB("Dinstall::SecurityQueueHandling"): - queues += [ "Unembargo", "Embargo" ] - else: - queues += [ "OldStableUpdate", "StableUpdate" ] - - target = None - for q in queues: - if QueueInfo[q]["is"](u): - target = q - break +import os - return target +from daklib import utils +from daklib.dbconn import * +from daklib.config import Config ################################################################################ -def package_to_suite(u, suite): - if not u.pkg.changes["distribution"].has_key(suite): +def package_to_suite(u, suite_name, session): + if not u.pkg.changes["distribution"].has_key(suite_name): return False ret = True if not u.pkg.changes["architecture"].has_key("source"): - s = DBConn().session() - q = s.query(SrcAssociation.sa_id) - q = q.join(Suite).filter_by(suite_name=suite) + q = session.query(SrcAssociation.sa_id) + q = q.join(Suite).filter_by(suite_name=suite_name) q = q.join(DBSource).filter_by(source=u.pkg.changes['source']) q = q.filter_by(version=u.pkg.changes['version']).limit(1) # NB: Careful, this logic isn't what you would think it is - # Source is already in {old-,}proposed-updates so no need to hold - # Instead, we don't move to the holding area, we just do an ACCEPT + # Source is already in the target suite so no need to go to policy + # Instead, we don't move to the policy area, we just do an ACCEPT if q.count() > 0: ret = False - s.close() - return ret -def package_to_queue(u, summary, short_summary, queue, perms=0660, build=True, announce=None): +def package_to_queue(u, summary, short_summary, queue, chg, session, announce=None): cnf = Config() - dir = cnf["Dir::Queue::%s" % queue] + dir = queue.path - print "Moving to %s holding area" % queue.upper() - Logger.log(["Moving to %s" % queue, u.pkg.changes_file]) + print "Moving to %s policy queue" % queue.queue_name.upper() + u.logger.log(["Moving to %s" % queue.queue_name, u.pkg.changes_file]) - u.pkg.write_dot_dak(dir) - u.move_to_dir(dir, perms=perms) - if build: - get_or_set_queue(queue.lower()).autobuild_upload(u.pkg, dir) + u.move_to_queue(queue) + chg.in_queue_id = queue.policy_queue_id + session.add(chg) + session.commit() # Check for override disparities u.check_override() # Send accept mail, announce to lists and close bugs - if announce and not cnf["Dinstall::Options::No-Mail"]: + if announce: template = os.path.join(cnf["Dir::Templates"], announce) u.update_subst() - u.Subst["__SUITE__"] = "" mail_message = utils.TemplateSubst(u.Subst, template) utils.send_mail(mail_message) u.announce(short_summary, True) @@ -110,64 +79,70 @@ def package_to_queue(u, summary, short_summary, queue, perms=0660, build=True, a ################################################################################ def is_unembargo(u): - session = DBConn().session() - cnf = Config() - - q = session.execute("SELECT package FROM disembargo WHERE package = :source AND version = :version", u.pkg.changes) - if q.rowcount > 0: - session.close() - return True - - oldcwd = os.getcwd() - os.chdir(cnf["Dir::Queue::Disembargo"]) - disdir = os.getcwd() - os.chdir(oldcwd) - - ret = False - - if u.pkg.directory == disdir: - if u.pkg.changes["architecture"].has_key("source"): - if not Options["No-Action"]: - session.execute("INSERT INTO disembargo (package, version) VALUES (:package, :version)", u.pkg.changes) - session.commit() - - ret = True - - session.close() - - return ret - -def queue_unembargo(u, summary, short_summary): - return package_to_queue(u, summary, short_summary, "Unembargoed", - perms=0660, build=True, announce='process-unchecked.accepted') - -################################################################################ - + session = DBConn().session() + cnf = Config() + + # If we dont have the disembargo queue we are not on security and so not interested + # in doing any security queue handling + if not get_policy_queue("disembargo"): + return False + + q = session.execute("SELECT package FROM disembargo WHERE package = :source AND version = :version", + {'source': u.pkg.changes["source"], + 'version': u.pkg.changes["version"]}) + if q.rowcount > 0: + session.close() + return True + + oldcwd = os.getcwd() + os.chdir(cnf["Dir::Queue::Disembargo"]) + disdir = os.getcwd() + os.chdir(oldcwd) + + ret = False + + if u.pkg.directory == disdir: + if u.pkg.changes["architecture"].has_key("source"): + session.execute("INSERT INTO disembargo (package, version) VALUES (:package, :version)", + {'source': u.pkg.changes["source"], + 'version': u.pkg.changes["version"]}) + session.commit() + + ret = True + + session.close() + + return ret + +def do_unembargo(u, summary, short_summary, chg, session=None): + polq=get_policy_queue('disembargo') + package_to_queue(u, summary, short_summary, + polq, chg, session, + announce=None) + for suite_name in u.pkg.changes["distribution"].keys(): + suite = get_suite(suite_name, session) + for q in suite.copy_queues: + for f in u.pkg.files.keys(): + os.symlink(os.path.join(polq.path, f), os.path.join(q.path, f)) +# +################################################################################# +# def is_embargo(u): - # if embargoed queues are enabled always embargo - return True - -def queue_embargo(u, summary, short_summary): - return package_to_queue(u, summary, short_summary, "Unembargoed", - perms=0660, build=True, announce='process-unchecked.accepted') - -################################################################################ - -def is_stableupdate(u): - return package_to_suite(u, 'proposed-updates') - -def do_stableupdate(u, summary, short_summary): - return package_to_queue(u, summary, short_summary, "ProposedUpdates", - perms=0664, build=False, announce=None) - -################################################################################ - -def is_oldstableupdate(u): - return package_to_suite(u, 'oldstable-proposed-updates') - -def do_oldstableupdate(u, summary, short_summary): - return package_to_queue(u, summary, short_summary, "OldProposedUpdates", - perms=0664, build=False, announce=None) + # if we are the security archive, we always have a embargo queue and its the + # last in line, so if that exists, return true + if get_policy_queue('embargo'): + return True + +def do_embargo(u, summary, short_summary, chg, session=None): + polq=get_policy_queue('embargo') + package_to_queue(u, summary, short_summary, + polq, chg, session, + announce=None) + for suite_name in u.pkg.changes["distribution"].keys(): + suite = get_suite(suite_name, session) + for q in suite.copy_queues: + for f in u.pkg.files.keys(): + os.symlink(os.path.join(polq.path, f), os.path.join(q.path, f)) ################################################################################ @@ -210,9 +185,9 @@ def is_autobyhand(u): return any_auto and all_auto -def do_autobyhand(u, summary, short_summary): +def do_autobyhand(u, summary, short_summary, chg, session): print "Attempting AUTOBYHAND." - byhandleft = True + byhandleft = False for f, entry in u.pkg.files.items(): byhandfile = f @@ -234,18 +209,16 @@ def do_autobyhand(u, summary, short_summary): if result == 0: os.unlink(byhandfile) - del entry + del u.pkg.files[f] else: print "Error processing %s, left as byhand." % (f) byhandleft = True if byhandleft: - do_byhand(u, summary, short_summary) + do_byhand(u, summary, short_summary, chg, session) else: - u.accept(summary, short_summary) + u.accept(summary, short_summary, session) u.check_override() - # XXX: We seem to be missing a u.remove() here - # This might explain why we get byhand leftovers in unchecked - mhy ################################################################################ @@ -255,9 +228,10 @@ def is_byhand(u): return True return False -def do_byhand(u, summary, short_summary): - return package_to_queue(u, summary, short_summary, "Byhand", - perms=0660, build=False, announce=None) +def do_byhand(u, summary, short_summary, chg, session): + return package_to_queue(u, summary, short_summary, + get_policy_queue('byhand'), chg, session, + announce=None) ################################################################################ @@ -267,19 +241,52 @@ def is_new(u): return True return False -def acknowledge_new(u, summary, short_summary): +def acknowledge_new(u, summary, short_summary, chg, session): cnf = Config() - print "Moving to NEW holding area." - Logger.log(["Moving to new", u.pkg.changes_file]) + print "Moving to NEW queue." + u.logger.log(["Moving to new", u.pkg.changes_file]) - u.pkg.write_dot_dak(cnf["Dir::Queue::New"]) - u.move_to_dir(cnf["Dir::Queue::New"], perms=0640, changesperms=0644) + q = get_policy_queue('new', session) + + u.move_to_queue(q) + chg.in_queue_id = q.policy_queue_id + session.add(chg) + session.commit() + + print "Sending new ack." + template = os.path.join(cnf["Dir::Templates"], 'process-unchecked.new') + u.update_subst() + u.Subst["__SUMMARY__"] = summary + new_ack_message = utils.TemplateSubst(u.Subst, template) + utils.send_mail(new_ack_message) + +################################################################################ + +# FIXME: queues should be able to get autobuild +# the current logic doesnt allow this, as buildd stuff is AFTER accept... +# embargo/disembargo use a workaround due to this +# q-unapproved hax0ring +QueueInfo = { + "new": { "is": is_new, "process": acknowledge_new }, + "autobyhand" : { "is" : is_autobyhand, "process": do_autobyhand }, + "byhand" : { "is": is_byhand, "process": do_byhand }, + "embargoed" : { "is": is_embargo, "process": do_embargo }, + "unembargoed" : { "is": is_unembargo, "process": do_unembargo }, +} + +def determine_target(u): + cnf = Config() + + # Statically handled queues + target = None + + for q in ["autobyhand", "byhand", "new", "unembargoed", "embargoed"]: + if QueueInfo[q]["is"](u): + target = q + break + + return target + +############################################################################### - if not Options["No-Mail"]: - print "Sending new ack." - template = os.path.join(cnf["Dir::Templates"], 'process-unchecked.new') - u.update_subst() - u.Subst["__SUMMARY__"] = summary - new_ack_message = utils.TemplateSubst(u.Subst, template) - utils.send_mail(new_ack_message)