view bin/jobdaemon.py @ 557:9824e409388b

Refactor git branching If a checkout is already available and the branch is changed in the config git command would always fail because it doesn't know the branch to track. Therefore always check if the branch is locally available and if not checkout the remote branch
author Bjoern Ricks <bricks@intevation.de>
date Fri, 02 Sep 2011 08:45:28 +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)