Mercurial > treepkg
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()