]> git.decadent.org.uk Git - dak.git/blobdiff - dak/transitions.py
improve import-keyring output
[dak.git] / dak / transitions.py
index 7c9b206a9220fb57f53b063733816f0419153381..af39ee23a52ff788ac28c66094dd1b8386694a39 100755 (executable)
@@ -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+\-.*")
+
 ################################################################################
 
 #####################################
@@ -125,12 +127,16 @@ def load_transitions(trans_file):
                 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)
@@ -211,6 +217,11 @@ 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"""
 
+    # Lets check if from_file is in the directory we expect it to be in
+    if not os.path.abspath(from_file).startswith(Cnf["Transitions::TempPath"]):
+        print "Will not accept transitions file outside of %s" % (Cnf["Transitions::TempPath"])
+        sys.exit(3)
+
     if Options["sudo"]:
         os.spawnl(os.P_WAIT, "/usr/bin/sudo", "/usr/bin/sudo", "-u", "dak", "-H", 
               "/usr/local/bin/dak", "transitions", "--import", from_file)
@@ -227,7 +238,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")
+    (fd, path) = tempfile.mkstemp("", "transitions", Cnf["Transitions::TempPath"])
     os.chmod(path, 0644)
     f = open(path, "w")
     syck.dump(transitions, f)
@@ -414,6 +425,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: