[Extras-cauldron-commits] r37 - trunk/buildme/tools

ed_ at garage.maemo.org ed_ at garage.maemo.org
Sun May 18 17:23:44 EEST 2008


Author: ed_
Date: 2008-05-18 17:23:44 +0300 (Sun, 18 May 2008)
New Revision: 37

Modified:
   trunk/buildme/tools/buildme
Log:
Improved logging. Added rejecting functionality

Modified: trunk/buildme/tools/buildme
===================================================================
--- trunk/buildme/tools/buildme	2008-05-18 14:22:22 UTC (rev 36)
+++ trunk/buildme/tools/buildme	2008-05-18 14:23:44 UTC (rev 37)
@@ -27,11 +27,12 @@
 
 __revision__ = "r"+"$Revision$".split(' ')[1]
 
-import sys, os, logging, pwd, shutil, re
+import sys, os, logging, pwd, shutil
 
 from glob import glob
 from optparse import OptionParser
 from commands import getstatusoutput
+from datetime import datetime
 
 from minideblib.ChangeFile import ChangeFileException
 
@@ -40,11 +41,12 @@
 from buildlib.sbdarch import SbdArch
 from buildlib.lock import Lockf
 from buildlib.dest import destfactory
-from buildlib.dsc import Dsc
+from buildlib.dsc import Dsc, DscException, LockException
 from buildlib.app import App
-from buildlib.logger import CustomLogger, BuilderSMTPHandler
-from buildlib.helpers import sendemail, readfile
+from buildlib.logger import CustomLogger, create_uploader_handler, create_ml_handler, create_summary_handler
 
+REJECTED = 'REJECTED'
+
 class UserLock(Lockf):
     """ Lock for user """
     
@@ -117,17 +119,57 @@
         self.env = env
 
     def __str__(self):
-        """ Format subject based on configuration template """
+        """ Format subject based on configuration template 
+            and environment 
+        """
+
+        env = self.env
         
-        (package, version) = env['dsc'].name.split('_')
         if env.params['rcode']:
-            build_status = "FAILED"
+            if env.params['rcode'] == REJECTED:
+                build_status = REJECTED
+            else:
+                build_status = "FAILED"
         else:
             build_status = "OK"
 
+        package, version = os.path.splitext(os.path.basename(env['fname']))[0].split('_')
+
         return env.params['conf'].get(env['product'], 'subject_template', False,
                         {'package' : package, 'version' : version, 'build_status' : build_status})
 
+def reject_fname(env, message):
+    """ Move files to 'rejected' subdirectory. """
+
+    env.params['rcode'] = REJECTED
+    env.params['logger'].fatal("REJECTED: %s" % message)
+
+    fname = env['fname']
+    incoming = os.path.dirname(fname)
+    rejected_dir = os.path.join(incoming, 'rejected')
+
+    # create 'rejected' subdirectory if needed
+    if not os.path.isdir(rejected_dir):
+        try:
+            os.mkdir(rejected_dir)
+        except (OSError, IOError), exobj:
+            raise Error("Can't create 'rejected' directory: %s" % exobj) 
+
+    # Collect files mentioned in .dsc 
+    fnames = [fname]
+    try:
+        dsc = Dsc(fname, mustbesigned=False)
+        fnames += [os.path.join(incoming, info[-1]) for info in dsc.getFiles()]
+    except:
+        pass
+
+    # Move them into 'rejected' dir
+    for name in fnames:
+        try:
+            shutil.move(name, rejected_dir)
+        except (OSError, IOError), exobj:
+            raise Error("Can't move '%s' to rejected subdir: %s" % (os.path.basename(name), exobj))
+
 # FSM handlers
 
 def init(env):
@@ -197,7 +239,12 @@
     except Error, exobj:
         logger.debug(exobj)
         return FSM.NEXT
-       
+
+    # create handler for mailing list notifications
+    if conf.has_option(product, 'mail_list'):
+        create_ml_handler(conf.get(product, 'mail_list'),
+                        conf.get(product, 'builder_email'), Subject(env))
+
     # get target names tuple from config
     tnames = eval(conf.get(product, 'targets'))
  
@@ -214,8 +261,8 @@
 
 def setup_build(env):
     """ Setup build environment.
-        Verify .dsc file
-        setup summary log """
+        Verify .dsc file. Setup logging 
+    """
 
     conf = env.params['conf']
     product = env.params['product']
@@ -223,52 +270,49 @@
     fname = env.params['fname']
     destination = env.params['destination']
     result_dir = conf.get(product, 'result_dir')
+    upload_timeout = conf.get(product, 'upload_timeout')
+    builder_email = conf.get(product, 'builder_email')
 
     uploader = pwd.getpwuid(os.stat(fname).st_uid).pw_name
     info = "Processing package %s. Uploader: %s, builder: %s" % \
             (os.path.splitext(os.path.basename(fname))[0].replace('_', ' '), uploader, destination.user)
     logger.info(info)
 
-    # Set up email loggers for uploader email and mailing list
-    builder_email = conf.get(product, 'builder_email')
-    uploader_email = None
-    match = re.match(r'.* <(?P<email>[\w\-][\w\-\.]+@[\w\-][\w\-\.]+[a-zA-Z]{1,4})>$', 
-        pwd.getpwnam(uploader).pw_gecos)
-    if match:
-        uploader_email = match.groupdict()['email']
+    handler = create_uploader_handler(logger, uploader, builder_email, Subject(env))
 
-    # add email handlers
-    subject = Subject(env)
-    if uploader_email:
-        handler = BuilderSMTPHandler(builder_email, uploader_email, subject)
-        handler.setLevel(logging.INFO)
-        logger.addHandler(handler)
+    try:
+        dsc = Dsc(fname, exclude = ('.deb',))
+    except DscException, exobj:
+        reject_fname(env, str(exobj))
+        logger.removeHandler(handler)
+        return FSM.NEXT
+    except LockException, exobj:
+        logger.removeHandler(handler)
+        return FSM.NEXT
 
-    if conf.has_option(product, 'mail_list'):
-        handler = BuilderSMTPHandler(builder_email, conf.get(product, 'mail_list'), subject)
-        handler.setLevel(CustomLogger.SUMMARY)
-        logger.addHandler(handler)
-
     try:
-        dsc = Dsc(fname, exclude = ('.deb',))
-        env.params['dsc'] = dsc
         dsc.verify()
+    except DscException, exobj:
+        reject_fname(logger, exobj)
+        logger.removeHandler(handler)
+        return FSM.NEXT
     except ChangeFileException, exobj:
-        # FIXME: check dsc timeout
-        logger.info(exobj)
-        logger.info("skipped")
+        # check dsc timeout
+        if (datetime.now() - datetime.fromtimestamp(os.stat(fname).st_mtime)).seconds > upload_timeout:
+            reject_fname(env, exobj)
+            logger.removeHandler(handler)
+
         return FSM.NEXT
 
+    env.params['dsc'] = dsc
     env.params['extraopts'] = ""
     env.params['targets'] = env.params['sbdtargets'].gettargets(dsc)
     env.params['firstbuild'] = True
 
     infras = infrasfactory(result_dir, dsc.name)
 
-    # set up handler for summary.log
-    handler = logging.FileHandler(os.path.join(infras['logs'], 'summary.log'))
-    handler.setLevel(CustomLogger.SUMMARY)
-    logger.addHandler(handler)
+    # create handler for summary.log
+    create_summary_handler(logger, os.path.join(infras['logs'], 'summary.log'))
 
     env.params['infras'] = infras
 
@@ -419,7 +463,7 @@
             logger.debug("signing %s", changes)
             (rcode, out) = getstatusoutput("debsign -k%s %s" % (gpg_key, changes))
             if rcode:
-                raise Error("Can's sign build results. Debsign output: %s" % out)
+                raise Error("Can't sign build results. Debsign output: %s" % out)
 
     return FSM.OK
 



More information about the Extras-cauldron-commits mailing list