X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=dak%2Ftransitions.py;h=e7cb99e805994d3fb259e5bbb8b993eb2bb7380d;hb=9f9da35e524274a0a013279cbe0b52fb8f0d0930;hp=43c2ae6e362884289b565db1749f639155bb0ad6;hpb=8667340fafcbd32e20a4391f6ce554479c2fe03c;p=dak.git diff --git a/dak/transitions.py b/dak/transitions.py index 43c2ae6e..e7cb99e8 100755 --- a/dak/transitions.py +++ b/dak/transitions.py @@ -23,7 +23,7 @@ ################################################################################ -import os, pg, sys, time, errno, fcntl, tempfile, pwd +import os, pg, sys, time, errno, fcntl, tempfile, pwd, re import apt_pkg import daklib.database import daklib.utils @@ -34,6 +34,8 @@ Cnf = None Options = None projectB = None +re_broken_package = re.compile(r"[a-zA-Z]\w+\s+\-.*") + ################################################################################ ##################################### @@ -110,42 +112,66 @@ def load_transitions(trans_file): # 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 + # If we get an empty definition - we just have nothing to check, no transitions defined + if type(trans) != dict: + # This can be anything. We could have no transitions defined. Or someone totally fucked up the + # file, adding stuff in a way we dont know or want. Then we set it empty - and simply have no + # transitions anymore. User will see it in the information display after he quit the editor and + # could fix it + trans = "" + return trans - elif type(t[key]) != str: - print "ERROR: Unknown type %s for key %s in transition %s" % (type(t[key]), key, test) - failure = True + try: + 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 + if re_broken_package.match(package): + # Someone had a space too much (or not enough), we have something looking like + # "package1 - package2" now. + print "ERROR: Invalid indentation of package list in transition %s, around package(s): %s" % (test, package) + 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: + if key == "new" and type(t[key]) == int: + # Ok, debian native version + continue + else: + 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 + except TypeError: + # In case someone defined very broken things + print "ERROR: Unable to parse the file" + 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 @@ -232,7 +258,7 @@ def temp_transitions_file(transitions): # We need the chmod, as the file is (most possibly) copied from a # sudo-ed script and would be unreadable if it has default mkstemp mode - (fd, path) = tempfile.mkstemp("","transitions",Cnf["Transitions::TempPath"]) + (fd, path) = tempfile.mkstemp("", "transitions", Cnf["Transitions::TempPath"]) os.chmod(path, 0644) f = open(path, "w") syck.dump(transitions, f) @@ -419,6 +445,15 @@ def main(): daklib.utils.warn("ReleaseTransitions file, %s, not found." % (Cnf["Dinstall::Reject::ReleaseTransitions"])) sys.exit(1) + # Also check if our temp directory is defined and existant + temppath = Cnf.get("Transitions::TempPath", "") + if temppath == "": + daklib.utils.warn("Transitions::TempPath not defined") + sys.exit(1) + if not os.path.exists(temppath): + daklib.utils.warn("Temporary path %s not found." % + (Cnf["Transitions::TempPath"])) + sys.exit(1) if Options["import"]: try: