X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=daklib%2Fqueue_install.py;h=8f05e7bf2ce6e8de7e1627e4db87bb972a7b0173;hb=543d6b6b93b2c78f41f3f56f46ba7a09ecda7a4e;hp=e6aee579faaaba1a61f9efd8c2f3ca4a75df9a93;hpb=f0c875ddc69f384bf2600fa342fbac30dc82fda7;p=dak.git diff --git a/daklib/queue_install.py b/daklib/queue_install.py index e6aee579..8f05e7bf 100644 --- a/daklib/queue_install.py +++ b/daklib/queue_install.py @@ -26,6 +26,7 @@ Utility functions for process-upload # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import os +from shutil import copyfile from daklib import utils from daklib.dbconn import * @@ -34,92 +35,124 @@ from daklib.config import Config ################################################################################ def package_to_suite(u, suite_name, session): - if not u.pkg.changes["distribution"].has_key(suite_name): + if suite_name not in u.pkg.changes["distribution"]: return False - ret = True + if 'source' in u.pkg.changes["architecture"]: + return True - if not u.pkg.changes["architecture"].has_key("source"): - 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) + q = session.query(Suite).filter_by(suite_name = suite_name). \ + filter(Suite.sources.any( \ + source = u.pkg.changes['source'], \ + version = u.pkg.changes['version'])) - # NB: Careful, this logic isn't what you would think it is - # 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 - - return ret + # NB: Careful, this logic isn't what you would think it is + # 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: + return False + else: + return True -def package_to_queue(u, summary, short_summary, queue, perms=0660, announce=None): +def package_to_queue(u, summary, short_summary, queue, chg, session, announce=None): cnf = Config() dir = queue.path print "Moving to %s policy queue" % queue.queue_name.upper() u.logger.log(["Moving to %s" % queue.queue_name, u.pkg.changes_file]) - u.move_to_dir(dir, perms=perms) - # TODO: Put building logic in here? We used to take a build=bool argument + u.move_to_queue(queue) + chg.in_queue_id = queue.policy_queue_id + session.add(chg) + + # send to build queues + if queue.send_to_build_queues: + for suite_name in u.pkg.changes["distribution"].keys(): + suite = get_suite(suite_name, session) + for q in suite.copy_queues: + q.add_changes_from_policy_queue(queue, 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) ################################################################################ -# TODO: This logic needs to be replaced with policy queues before we upgrade -# security master +def is_unembargo(u): + session = DBConn().session() -#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"): -# 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, session=None): -# return package_to_queue(u, summary, short_summary, "Unembargoed", -# perms=0660, build=True, announce='process-unchecked.accepted') + # If we dont have the disembargo queue we are not on security and so not interested + # in doing any security queue handling + disembargo_queue = get_policy_queue("unembargoed") + if not disembargo_queue: + return False + + # If we already are in newstage, then it means this just got passed through and accepted + # by a security team member. Don't try to accept it for disembargo again + dbc = get_dbchange(u.pkg.changes_file, session) + if dbc and dbc.in_queue.queue_name in [ 'newstage' ]: + 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 + + # Ensure we don't have a / on the end or something + disdir = os.path.abspath(disembargo_queue.path) + + ret = False + + if u.pkg.directory == disdir: + if u.pkg.changes["architecture"].has_key("source"): + session.execute("INSERT INTO disembargo (package, version) VALUES (:source, :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('unembargoed') + package_to_queue(u, summary, short_summary, + polq, chg, session, + announce=None) # ################################################################################# # -#def is_embargo(u): -# # if embargoed queues are enabled always embargo -# return True -# -#def queue_embargo(u, summary, short_summary, session=None): -# return package_to_queue(u, summary, short_summary, "Unembargoed", -# perms=0660, build=True, announce='process-unchecked.accepted') +def is_embargo(u): + # if we are the security archive, we always have a embargo queue and its the + # last in line, so if that exists, return true + # Of course do not return true when we accept from out of newstage, as that means + # it just left embargo and we want it in the archive + if get_policy_queue('embargoed'): + session = DBConn().session() + dbc = get_dbchange(u.pkg.changes_file, session) + if dbc and dbc.in_queue.queue_name in [ 'newstage' ]: + return False + + return True + +def do_embargo(u, summary, short_summary, chg, session=None): + polq=get_policy_queue('embargoed') + package_to_queue(u, summary, short_summary, + polq, chg, session, + announce=None) ################################################################################ @@ -145,7 +178,7 @@ def is_autobyhand(u): all_auto = 0 continue - ABH = cnf.SubTree("AutomaticByHandPackages") + ABH = cnf.subtree("AutomaticByHandPackages") if not ABH.has_key(pckg) or \ ABH["%s::Source" % (pckg)] != u.pkg.changes["source"]: print "not match %s %s" % (pckg, u.pkg.changes["source"]) @@ -162,9 +195,9 @@ def is_autobyhand(u): return any_auto and all_auto -def do_autobyhand(u, summary, short_summary, session=None): +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 @@ -186,13 +219,13 @@ def do_autobyhand(u, summary, short_summary, session=None): 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, session) + do_byhand(u, summary, short_summary, chg, session) else: u.accept(summary, short_summary, session) u.check_override() @@ -205,9 +238,10 @@ def is_byhand(u): return True return False -def do_byhand(u, summary, short_summary, session=None): - 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) ################################################################################ @@ -217,29 +251,38 @@ def is_new(u): return True return False -def acknowledge_new(u, summary, short_summary, session=None): +def acknowledge_new(u, summary, short_summary, chg, session): cnf = Config() print "Moving to NEW queue." u.logger.log(["Moving to new", u.pkg.changes_file]) - u.move_to_dir(cnf["Dir::Queue::New"], perms=0640, changesperms=0644) + q = get_policy_queue('new', session) - if not cnf["Dinstall::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) + 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): @@ -248,9 +291,10 @@ def determine_target(u): # Statically handled queues target = None - for q in QueueInfo.keys(): + for q in ["autobyhand", "byhand", "new", "unembargoed", "embargoed"]: if QueueInfo[q]["is"](u): target = q + break return target