[or-cvs] r20449: {projects} Towards multifile downloads, fixed some issues as well (in projects/gettor: . gettor)

kaner at seul.org kaner at seul.org
Mon Aug 31 19:16:11 UTC 2009


Author: kaner
Date: 2009-08-31 15:16:10 -0400 (Mon, 31 Aug 2009)
New Revision: 20449

Modified:
   projects/gettor/GetTor.py
   projects/gettor/gettor/blacklist.py
   projects/gettor/gettor/packages.py
   projects/gettor/gettor/requests.py
   projects/gettor/gettor/responses.py
Log:
Towards multifile downloads, fixed some issues as well


Modified: projects/gettor/GetTor.py
===================================================================
--- projects/gettor/GetTor.py	2009-08-31 02:48:21 UTC (rev 20448)
+++ projects/gettor/GetTor.py	2009-08-31 19:16:10 UTC (rev 20449)
@@ -71,6 +71,16 @@
 # Global logger
 log = None
 
+# XXX Move this into a utils class or something
+def createDir(path):
+    try:
+        log.info("Creating directory %s.." % path)
+        os.makedirs(path)
+    except OSError, e:
+        log.error("Failed to create directory %s: %s" % (path, e))
+        return False
+    return True
+
 # Switch language to 'newlocale'. Return default if language is not supported.
 def switchLocale(newlocale, localedir):
     trans = gettext.translation("gettor", 
@@ -92,7 +102,7 @@
             log.error("Error in msgfmt execution: %s" % ret)
             return False
     except OSError, e:
-        log.erro("Comilation failed: " % e)
+        log.error("Comilation failed: " % e)
         return False
     return True
 
@@ -104,31 +114,39 @@
         log.error("Bad arg.")
         return False
     if not os.path.isdir(localeSrcdir):
-        log.error("Not a directory: " % localeSrcdir)
-        return False
+        log.info("Not a directory: %s" % localeSrcdir)
+        if not createDir(localeSrcdir):
+            log.error(_("Giving up on %s" % localeSrcdir))
+            return False
     localeDir = config.getLocaleDir()
     if not os.path.isdir(localeDir):
-        log.error("Sorry, %s is not a directory." % localeDir)
-        return False
+        log.info("Not a directory: %s" % localeDir)
+        if not createDir(localeDir):
+            log.error(_("Giving up on %s" % localeDir))
+            return False
 
     for root, dirs, files in os.walk(localeSrcdir):
-        # Python lacks 'depth' featue for os.walk()
+        # Python lacks 'depth' feature for os.walk()
         if root != localeSrcdir:
             continue
         for dir in dirs:
             hasDirs = True
             if dir.startswith("."):
                 continue
+            # We ignore the templates dir for now
+            if dir.startswith("templates"):
+                continue
             try:
-                poFile = os.path.join(root, dir) + "/gettor_" + dir + ".po"
+                poFile = os.path.join(root, dir) + "/gettor.po"
                 # Construct target dir
                 targetDir = localeDir + "/" + dir + "/LC_MESSAGES"
-                if os.path.isdir(targetDir):
-                    if installMo(poFile, targetDir) == False:
-                        log.error("Installing .mo files failed.")
+                if not os.path.isdir(targetDir):
+                    log.info("Not a directory: %s" % targetDir)
+                    if not createDir(targetDir):
+                        log.error(_("Giving up on %s" % targetDir))
                         return False
-                else:
-                    log.error("Not a directory: %s" % targetDir)
+                if installMo(poFile, targetDir) == False:
+                    log.error("Installing .mo files failed.")
                     return False
             except Exception:
                 log.error("Error accessing translation files.")
@@ -282,8 +300,10 @@
 
     distDir = conf.getDistDir()
     if not os.path.isdir(distDir):
-        log.error(_("Sorry, %s is not a directory.") % distDir)
-        return False
+        log.info(_("Sorry, %s is not a directory.") % distDir)
+        if not createDir(distDir):
+            log.error(_("Giving up on %s", distDir))
+            return False
     try:
         packs = gettor.packages.gettorPackages(options.mirror, conf)
     except IOError:

Modified: projects/gettor/gettor/blacklist.py
===================================================================
--- projects/gettor/gettor/blacklist.py	2009-08-31 02:48:21 UTC (rev 20448)
+++ projects/gettor/gettor/blacklist.py	2009-08-31 19:16:10 UTC (rev 20449)
@@ -16,12 +16,23 @@
 stateDir = conf.getStateDir()
 blStateDir = conf.getBlStateDir()
 
+# XXX
+def createDir(path):
+    try:
+        log.info("Creating directory %s.." % path)
+        os.makedirs(path)
+    except OSError, e:
+        log.error("Failed to create directory %s: %s" % (path, e))
+        return False
+    return True
+
 class BWList:
     def __init__(self, listdir):
         self.listDir = listdir
         if not os.path.isdir(self.listDir):
-            # XXX Change this to something more appropriate
-            raise IOError("Bad dir: %s" % self.listDir)
+            if not createDir(self.listDir):
+                # XXX Change this to something more appropriate
+                raise IOError("Bad dir: %s" % self.listDir)
 
     def lookupListEntry(self, address):
         """Check to see if we have a list entry for the given address."""

Modified: projects/gettor/gettor/packages.py
===================================================================
--- projects/gettor/gettor/packages.py	2009-08-31 02:48:21 UTC (rev 20448)
+++ projects/gettor/gettor/packages.py	2009-08-31 19:16:10 UTC (rev 20449)
@@ -22,14 +22,24 @@
 
 log = gettor.gtlog.getLogger()
 
+# XXX
+def createDir(path):
+    try:
+        log.info("Creating directory %s.." % path)
+        os.makedirs(path)
+    except OSError, e:
+        log.error("Failed to create directory %s: %s" % (path, e))
+        return False
+    return True
+
 class gettorPackages:
-
-    packageRegex = { "windows-bundle": "vidalia-bundle-.*.exe$",
-                     "panther-bundle": "vidalia-bundle-.*-ppc.dmg$",
-                     "macosx-universal-bundle": "vidalia-bundle-.*-universal.dmg$",
-                     "source-bundle": "tor-.*.tar.gz",
-                     "tor-browser-bundle": "tor-browser-.*_en-US.exe",
-                     "tor-im-browser-bundle": "tor-im-browser-.*_en-US.exe",
+    #                "bundle name": ("single file regex", "split file regex")
+    packageRegex = { "windows-bundle": ("vidalia-bundle-.*.exe$", "vidalia-bundle-.*_split$"),
+                     "panther-bundle": ("vidalia-bundle-.*-ppc.dmg$", "vidalia-bundle-.*-ppc_split$"),
+                     "macosx-universal-bundle": ("vidalia-bundle-.*-universal.dmg$", "vidalia-bundle-.*-universal_split$"),
+                     "source-bundle": ("tor-.*.tar.gz$", "none"),
+                     "tor-browser-bundle": ("tor-browser-.*_en-US.exe$", "tor-browser-.*_en-US_split$"),
+                     "tor-im-browser-bundle": ("tor-im-browser-.*_en-US.exe$", "tor-im-browser-.*_en-US_split$"),
                      # Mike won't sign Torbutton; He doesn't get gettor support
                      #"torbutton": "torbutton-current.xpi$",
                    }
@@ -41,14 +51,16 @@
         try:
             entry = os.stat(self.distDir)
         except OSError, e:
-            log.error("Bad dist dir %s: %s" % (self.distDir, e))
-            raise IOError
+            if not createDir(self.Distdir):
+                log.error("Bad dist dir %s: %s" % (self.distDir, e))
+                raise IOError
         self.packDir = config.getPackDir()
         try:
             entry = os.stat(self.packDir)
         except OSError, e:
-            log.error("Bad pack dir %s: %s" % (self.packDir, e))
-            raise IOError
+            if not createDir(self.packDir):
+                log.error("Bad pack dir %s: %s" % (self.packDir, e))
+                raise IOError
         self.rsync = ["rsync"]
         self.rsync.append("-a")
         # Don't download dotdirs
@@ -77,8 +89,34 @@
 
     def buildPackages(self):
         for filename in os.listdir(self.distDir):
-            for (pack, regex) in self.packageRegex.items():
-                if re.compile(regex).match(filename):
+            for (pack, (regex_single, regex_split)) in self.packageRegex.items():
+                # Splitfile hacks. XXX: Refactor
+                if re.compile(regex_split).match(filename):
+                    packSplitDir = None
+                    try:
+                        packSplitDir = self.packDir + "/" + pack + ".split"
+                        if not os.access(packSplitDir, os.R_OK):
+                            os.mkdir(packSplitDir)
+                    except OSError, e:
+                        log.error(_("Could not create dir %s: %s" % (packSplitDir, e)))
+                    # Loop through split dir, look if every partXX.ZZZ has a matching signature,
+                    # pack them together in a .z
+                    splitdir = self.distDir + "/" + filename
+                    for splitfile in os.listdir(splitdir):
+                        if re.compile(".*split.part.*").match(splitfile):
+                            ascfile = splitdir + "/signatures/" + splitfile + ".asc"
+                            file = splitdir + "/" + splitfile
+                            zipFileName = packSplitDir + "/" + splitfile + ".z"
+                            if os.access(ascfile, os.R_OK) and os.access(file, os.R_OK):
+                                print "ok: ", zipFileName
+                                zip = zipfile.ZipFile(zipFileName, "w")
+                                zip.write(splitdir + "/" + splitfile, os.path.basename(file))
+                                zip.write(ascfile, os.path.basename(ascfile))
+                                zip.close()
+                            else:
+                                log.error(_("Uhm, no signature for %s found" % splitfile))
+                                return False
+                if re.compile(regex_single).match(filename):
                     file = self.distDir + "/" + filename
                     ascfile = file + ".asc"
                     zipFileName  = self.packDir + "/" + pack + ".z"

Modified: projects/gettor/gettor/requests.py
===================================================================
--- projects/gettor/gettor/requests.py	2009-08-31 02:48:21 UTC (rev 20448)
+++ projects/gettor/gettor/requests.py	2009-08-31 19:16:10 UTC (rev 20449)
@@ -51,6 +51,8 @@
         self.replytoAddress = self.parsedMessage["from"]
         # If no package name could be recognized, use 'None'
         self.returnPackage = None
+        self.splitDelivery = False
+        # Parse line by line
         for line in email.Iterators.body_line_iterator(self.parsedMessage):
             # Remove comments
             if line.startswith(">"):
@@ -60,6 +62,12 @@
                 if match: 
                     self.returnPackage = package
                     log.info(_("User requested package %s") % self.returnPackage)
+            # If we find 'split' somewhere in the mail, we assume that the user wants
+            # a split delivery
+            match = re.match(".*split.*", line)
+            if match:
+                log.info(_("User requested a split delivery"))
+                self.splitDelivery = True
 
         self.replyLocale = None
         pattern = re.compile("^Lang:\s+(.*)$")
@@ -94,6 +102,9 @@
     def getLocale(self):
         return self.replyLocale
 
+    def getSplitDelivery(self):
+        return self.splitDelivery
+
 if __name__ == "__main__" :
     """ Give us an email to understand what we think of it. """
     packageList = { 

Modified: projects/gettor/gettor/responses.py
===================================================================
--- projects/gettor/gettor/responses.py	2009-08-31 02:48:21 UTC (rev 20448)
+++ projects/gettor/gettor/responses.py	2009-08-31 19:16:10 UTC (rev 20449)
@@ -181,14 +181,17 @@
 
         return status
 
-    def constructMessage(self, messageText, ourAddress, recipient, fileName=None):
+    def sendSplitPackage(self, source, destination, filename):
+    def sendPackage(
+
+    def constructMessage(self, messageText, ourAddress, recipient, fileName=None, subj=_('Re: Your "gettor" request')):
         """ Construct a multi-part mime message, including only the first part
         with plaintext."""
 
         message = StringIO.StringIO()
         mime = MimeWriter.MimeWriter(message)
         mime.addheader('MIME-Version', '1.0')
-        mime.addheader('Subject', _('Re: Your "gettor" request'))
+        mime.addheader('Subject', subj)
         mime.addheader('To', recipient)
         mime.addheader('From', ourAddress)
         mime.startmultipartbody('mixed')



More information about the tor-commits mailing list