view bin/jobdaemon.py @ 570:44c0f8404983

Refactor git pull command out of update Tag MUST NOT use update because therefore it always changes the current local branch! For listing the tags it's enough to pull the latest repo changes
author Bjoern Ricks <bricks@intevation.de>
date Fri, 02 Sep 2011 11:46:29 +0000
parents c1d5a6cb5cb0
children
line wrap: on
line source
#!/usr/bin/env python

import os.path
import sys
import shlex
import traceback
import time

from optparse import OptionParser

CONFIG_FILE = os.environ.get("JOBDAEMON_CFG", "jobdaemon.cfg") 

SLEEP = int(os.environ.get("JOBDAEMON_SLEEP", "60"))

def fork(job):
    pid = os.fork()
    if pid: return pid
    os.execv(job[0], job)
    return -1 # never reached

class Jobs(object):

    def __init__(self, filename):
        self.load_config(filename)

    def load_config(self, filename):
        print >> sys.stderr, "loading config file '%s'" % filename
        plan, jobs = [], []
        f = open(filename, "r")
        try:
            while True:
                line = f.readline()
                if not line: break
                line = line.strip()
                if not line or line.startswith("#"): 
                    continue
                if line.startswith("BLOCKER:"):
                    line = line[len("BLOCKER:"):].strip()
                    plan.append((jobs, line))
                    jobs = []
                    continue
                jobs.append(shlex.split(line))
        finally:
            f.close()

        if jobs: plan.append((jobs, None))

        self.plan = plan

    def run_jobs(self, jobs):
        pids = []
        for job in jobs:
            try:
                pids.append(fork(job))
            except:
                traceback.print_exc()

        for pid in pids:
            try:
                os.waitpid(pid, 0)
            except:
                traceback.print_exc()

    def run(self):
        for jobs, blocker in self.plan:
            self.run_jobs(jobs)
            if blocker:
                try:
                    os.system(blocker)
                except:
                    traceback.print_exc()
        
def main():

    global config_changed

    parser = OptionParser()

    parser.add_option(
        "-c", "--config", dest="config",
        help="load configuration from file", 
        metavar="FILE", default=CONFIG_FILE)

    parser.add_option(
        "-s", "--sleep", dest="sleep_time",
        help="sleep time between runs",
        type="int",
        metavar="TIME", default=SLEEP)

    (options, _) = parser.parse_args()

    if not os.path.isfile(options.config):
        print >> sys.stderr, "config file '%s' does not exists."
        sys.exit(1)

    modtime = os.stat(options.config).st_mtime

    jobs = Jobs(options.config)

    while True:
        if os.path.isfile(options.config):
            nmodtime = os.stat(options.config).st_mtime
            if nmodtime > modtime:
                modtime = nmodtime
                jobs = Jobs(options.config)
        jobs.run()
        time.sleep(options.sleep_time)

if __name__ == '__main__':
    main()
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)