From: Joerg Jaspert Date: Sat, 12 Apr 2008 20:13:58 +0000 (+0200) Subject: Merge from upstream X-Git-Url: https://git.decadent.org.uk/gitweb/?a=commitdiff_plain;h=d0c62ab4610b5f272816d49dcd7f5847fdb77b98;hp=c227a240809c7b5dd17d6b977debf4ff9283bea4;p=dak.git Merge from upstream --- diff --git a/ChangeLog b/ChangeLog index 1ca4a408..7c22507c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -21,6 +21,12 @@ adjusted to reject newer (and right now broken) 1.8 version, until dpkg (or debsign) is fixed and doesn't produce invalid .changes anymore +2008-03-22 Joerg Jaspert + + * dak/transitions.py (load_transitions): Check if all our keys are + defined, if there are only keys defined we want and also the types + of the various keys. + 2008-03-22 Anthony Towns * dak/edit_transitions.py: Add --import option. diff --git a/dak/transitions.py b/dak/transitions.py index d8845a0b..7c9b206a 100755 --- a/dak/transitions.py +++ b/dak/transitions.py @@ -36,6 +36,9 @@ projectB = None ################################################################################ +##################################### +#### This may run within sudo !! #### +##################################### def init(): global Cnf, Options, projectB @@ -90,21 +93,70 @@ Options: ################################################################################ +##################################### +#### This may run within sudo !! #### +##################################### def load_transitions(trans_file): # Parse the yaml file sourcefile = file(trans_file, 'r') sourcecontent = sourcefile.read() + failure = False try: trans = syck.load(sourcecontent) except syck.error, msg: # Someone fucked it up print "ERROR: %s" % (msg) return None - # could do further validation here + + # lets do further validation here + checkkeys = ["source", "reason", "packages", "new", "rm"] + for test in trans: + t = trans[test] + + # First check if we know all the keys for the transition and if they have + # the right type (and for the packages also if the list has the right types + # included, ie. not a list in list, but only str in the list) + for key in t: + if key not in checkkeys: + print "ERROR: Unknown key %s in transition %s" % (key, test) + failure = True + + if key == "packages": + if type(t[key]) != list: + print "ERROR: Unknown type %s for packages in transition %s." % (type(t[key]), test) + failure = True + + try: + for package in t["packages"]: + if type(package) != str: + print "ERROR: Packages list contains invalid type %s (as %s) in transition %s" % (type(package), package, test) + failure = True + except TypeError: + # In case someone has an empty packages list + print "ERROR: No packages defined in transition %s" % (test) + failure = True + continue + + elif type(t[key]) != str: + print "ERROR: Unknown type %s for key %s in transition %s" % (type(t[key]), key, test) + failure = True + + # And now the other way round - are all our keys defined? + for key in checkkeys: + if key not in t: + print "ERROR: Missing key %s in transition %s" % (key, test) + failure = True + + if failure: + return None + return trans ################################################################################ +##################################### +#### This may run within sudo !! #### +##################################### def lock_file(file): for retry in range(10): lock_fd = os.open(file, os.O_RDWR | os.O_CREAT) @@ -123,6 +175,9 @@ def lock_file(file): ################################################################################ +##################################### +#### This may run within sudo !! #### +##################################### def write_transitions(from_trans): """Update the active transitions file safely. This function takes a parsed input file (which avoids invalid @@ -149,6 +204,9 @@ def write_transitions(from_trans): class ParseException(Exception): pass +########################################## +#### This usually runs within sudo !! #### +########################################## def write_transitions_from_file(from_file): """We have a file we think is valid; if we're using sudo, we invoke it here, otherwise we just parse the file and call write_transitions""" @@ -342,6 +400,9 @@ def transition_info(transitions): def main(): global Cnf + ##################################### + #### This can run within sudo !! #### + ##################################### init() # Check if there is a file defined (and existant) @@ -361,6 +422,9 @@ def main(): print m sys.exit(2) sys.exit(0) + ############################################## + #### Up to here it can run within sudo !! #### + ############################################## # Parse the yaml file transitions = load_transitions(transpath)