[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