[or-cvs] r20922: {projects} Keep a record of failed mails in a dump file for later inves (in projects/gettor: . lib/gettor)

kaner at seul.org kaner at seul.org
Sun Nov 8 13:37:45 UTC 2009


Author: kaner
Date: 2009-11-08 08:37:44 -0500 (Sun, 08 Nov 2009)
New Revision: 20922

Modified:
   projects/gettor/GetTor.py
   projects/gettor/README
   projects/gettor/TODO
   projects/gettor/lib/gettor/config.py
   projects/gettor/lib/gettor/packages.py
   projects/gettor/lib/gettor/utils.py
   projects/gettor/sample-gettorrc
Log:
Keep a record of failed mails in a dump file for later investigation


Modified: projects/gettor/GetTor.py
===================================================================
--- projects/gettor/GetTor.py	2009-11-08 12:40:26 UTC (rev 20921)
+++ projects/gettor/GetTor.py	2009-11-08 13:37:44 UTC (rev 20922)
@@ -32,10 +32,12 @@
     - Send reply. Use all information gathered from the request and pass
       it on to the reply class/method to decide what to do."""
         
+    rawMessage = ""
     log.info("Processing mail..")
     # Retrieve request from stdin
     try:
         request = gettor.requests.requestMail(conf)
+        rawMessage = request.getRawMessage()
         replyTo, lang, pack, split, sig, cmdAddr = request.parseMail()
         log.info("Request from %s package %s, lang %s, split %s, cmdaddr %s" \
                     % (replyTo, pack, lang, split, cmdAddr))
@@ -44,18 +46,25 @@
         log.error("Parsing the request failed.")
         log.error("Here is the exception I saw: %s" % sys.exc_info()[0])
         log.error("Detail: %s" % e) 
+        # Keep a copy of the failed email for later reference
+        gettor.utils.dumpMessage(conf, rawMessage)
         return False
 
     # Ok, information aquired. Initiate reply sequence
     try:
         reply = gettor.responses.Response(conf, replyTo, lang, pack, split, \
                                             sig, cmdAddr)
-        reply.sendReply()
+        if not reply.sendReply():
+            log.error("Sending reply failed. We'll keep a record of this mail")
+            gettor.utils.dumpMessage(conf, rawMessage)
+            return False
         return True
     except Exception, e:
         log.error("Sending the reply failed.")
         log.error("Here is the exception I saw: %s" % sys.exc_info()[0])
         log.error("Detail: %s" %e)
+        # Keep a copy of the failed email for later reference
+        gettor.utils.dumpMessage(conf, rawMessage)
         raise
         return False
 

Modified: projects/gettor/README
===================================================================
--- projects/gettor/README	2009-11-08 12:40:26 UTC (rev 20921)
+++ projects/gettor/README	2009-11-08 13:37:44 UTC (rev 20922)
@@ -141,6 +141,7 @@
     logFile         = /home/gettor/gettor/logs/logfile
     localeDir       =  /home/gettor/gettor/i18n/
     cmdPassFile     = /home/gettor/gettor/pass
+    dumpFile        = /home/gettor/gettor/failedmails
 
 You can leave any of these lines out, and it will choose a suitable
 default.
@@ -165,6 +166,7 @@
 localeDir:     This is where the 'en/LC_MESSAGES/gettor.mo' or
                'whateverlang/LC_MESSAGES/gettor.mo' should go
 cmdPassFile:   The file containing the hashed command password
+dumpFile:      All failed mails are recorded here
 
 WHAT'S DKIM / WHY DKIM?
 -----------------------

Modified: projects/gettor/TODO
===================================================================
--- projects/gettor/TODO	2009-11-08 12:40:26 UTC (rev 20921)
+++ projects/gettor/TODO	2009-11-08 13:37:44 UTC (rev 20922)
@@ -4,20 +4,16 @@
   (multi-part download, etc.).
 - Write spec for how locale requests shall be formatted and parsed
 - Implement test (-t switch) functionality
-- Fix setup.py installer!
 - Split (at least) tiger bundle into several smaller archives to avoid ~20MB
 - Add more translations
     - Freeze messages for translation
     - Put po files into pootle for translation
 - Add GetTor to GetTor and it will be able to distribute itself
-- Better exception catching when the local SMTP rejects the email
-    - Perhaps we want to email the admin of GetTor with the error?
-    - Perhaps we want to respond to the user with a useful message?
 - Add torbutton (Mike, please sign torbutton and populate a proper .asc)
 - Fix rsync to follow symlinks properly. We want the data not a link to data.
-- Add a nice little note about the size of the files users may request
 - Strip HTML mails (!)
 - Remove 'localhost:25' to send mail and use '/usr/bin/sendmail' instead
   (suggested by weasel)
-- Think about adding a mail queue for outgoing mails that got a SMTP error
-  while trying to be sent. This way no mail gets lost
+- Package names that are sent out to the user are currently hard-coded. Return
+  to a more dynamic approach, also: Add a nice little note about the size of 
+  the files users may request

Modified: projects/gettor/lib/gettor/config.py
===================================================================
--- projects/gettor/lib/gettor/config.py	2009-11-08 12:40:26 UTC (rev 20921)
+++ projects/gettor/lib/gettor/config.py	2009-11-08 13:37:44 UTC (rev 20922)
@@ -26,6 +26,8 @@
      logFile = /dev/null
      localeDir = /usr/share/locale
      delayAlert = True
+     cmdPassFile = /var/lib/gettor/pass
+     dumpFile = /var/lib/gettor/dump
 
  Note that you can set from none to any of these values in your config file.
  Values you dont provide will be taken from the defaults in 'useConf'.
@@ -50,6 +52,8 @@
  delayAlert:    If set to True (the default), a message will be sent to any
                 user who has properly requested a package. The message confirms
                 that a package was selected and will be sent.
+ cmdPassFile:   Where our forward command password resides
+ dumpFile:      Where failed mails get stored
 
  If no valid config file is provided to __init__, gettorConf will try to use
  '~/.gettorrc' as default config file. If that fails, the default values from
@@ -96,6 +100,7 @@
                         "logFile":      ("/dev/null",               "global"),
                         "localeDir":    ("/usr/share/locale",       "global"),
                         "cmdPassFile":  ("/var/lib/gettor/cmdpass", "global"),
+                        "dumpFile":     ("/var/lib/gettor/dump",    "global"),
                         "delayAlert":   (True,                    "global")}
 
         # One ConfigParser instance to read the actual values from config
@@ -178,6 +183,9 @@
     def getDelayAlert(self):
         return self.useConf["delayAlert"][0]
 
+    def getDumpFile(self):
+        return self.useConf["dumpFile"][0]
+
 if __name__ == "__main__" :
     c = Config()
     print "# This is a suitable default configuration. Tune to fit your needs."

Modified: projects/gettor/lib/gettor/packages.py
===================================================================
--- projects/gettor/lib/gettor/packages.py	2009-11-08 12:40:26 UTC (rev 20921)
+++ projects/gettor/lib/gettor/packages.py	2009-11-08 13:37:44 UTC (rev 20922)
@@ -16,22 +16,13 @@
 import subprocess
 import gettor.gtlog
 import gettor.config
+import gettor.utils
 import re
 
 __all__ = ["Packages"]
 
 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 Packages:
     #                "bundle name": ("single file regex", "split file regex")
     packageRegex = { "windows-bundle": ("vidalia-bundle-.*.exe$", "vidalia-bundle-.*_split"),
@@ -50,14 +41,14 @@
         try:
             entry = os.stat(self.distDir)
         except OSError, e:
-            if not createDir(self.distDir):
+            if not gettor.utils.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:
-            if not createDir(self.packDir):
+            if not gettor.utils.createDir(self.packDir):
                 log.error("Bad pack dir %s: %s" % (self.packDir, e))
                 raise IOError
 

Modified: projects/gettor/lib/gettor/utils.py
===================================================================
--- projects/gettor/lib/gettor/utils.py	2009-11-08 12:40:26 UTC (rev 20921)
+++ projects/gettor/lib/gettor/utils.py	2009-11-08 13:37:44 UTC (rev 20922)
@@ -14,6 +14,7 @@
 import os
 import subprocess
 import hashlib
+import datetime
 
 import gettor.gtlog
 import gettor.blacklist
@@ -31,6 +32,27 @@
         return False
     return True
 
+def dumpMessage(conf, message):
+    """Dump a message to our dumpfile"""
+    dumpFile = conf.getDumpFile()
+    # Be nice: Create dir if it's not there
+    dumpDir = os.path.dirname(dumpFile)
+    if not os.access(dumpDir, os.W_OK):
+        if not createDir(dumpDir):
+            log.error("Could not create dump dir")
+            return False
+    try:
+        fd = open(dumpFile, 'a')
+        now = datetime.datetime.now()
+        prefix = "Failed mail at %s:\n" % now.strftime("%Y-%m-%d %H:%M:%S")
+        fd.write(prefix)
+        fd.write(message)
+        fd.close
+        return True
+    except Exception, e:
+        log.error("Creating dump entry failed: %s" % e)
+        return False
+
 def installTranslations(conf, localeSrcdir):
     """Install all translation files to 'dir'"""
     log.info("Installing translation files..")
@@ -212,6 +234,12 @@
     log.info("Setting command password")
     passwordHash = str(hashlib.sha1(password).hexdigest())
     cmdPassFile = conf.getCmdPassFile()
+    # Be nice: Create dir if it's not there
+    passDir = os.path.dirname(cmdPassFile)
+    if not os.access(passDir, os.W_OK):
+        if not createDir(passDir):
+            log.error("Could not create pass dir")
+            return False
     try:
         fd = open(cmdPassFile, 'w')
         fd.write(passwordHash)

Modified: projects/gettor/sample-gettorrc
===================================================================
--- projects/gettor/sample-gettorrc	2009-11-08 12:40:26 UTC (rev 20921)
+++ projects/gettor/sample-gettorrc	2009-11-08 13:37:44 UTC (rev 20922)
@@ -2,13 +2,15 @@
 # ~/.gettorrc
 #
 [global]
-stateDir    = /tmp/
-blstatedir  = /tmp/bl/
-wlstatedir  = /tmp/wl/
-distdir     = /tmp/distdir/
-packdir     = /tmp/packdir/
-locale      = en
-delayalert  = True
-logSubSystem= stdout
-logFile     = /tmp/logfile
-localDir    = /tmp/i18n/
+stateDir        = /tmp/gettor
+blstatedir      = /tmp/gettor/bl/
+wlstatedir      = /tmp/gettor/wl/
+distdir         = /tmp/gettor/distdir/
+packdir         = /tmp/gettor/packdir/
+locale          = en
+delayalert      = True
+logSubSystem    = stdout
+logFile         = /tmp/gettor/logfile
+localDir        = /tmp/gettor/i18n/
+cmdPassFile     = /tmp/gettor/pass
+dumpFile        = /tmp/gettor/dumpfile



More information about the tor-commits mailing list