summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2013-04-11 20:40:32 +0100
committerLars Wirzenius <liw@liw.fi>2013-04-11 20:40:32 +0100
commit9ef617317c1b51209aa41b523c122b61c9b23aaf (patch)
tree0019a1e1bad4c1e0da783787d26b895e70f80309
parentb4601ba1ddf6d3442555b719478e1d60f1a36dd1 (diff)
downloaddesktop-cronish-9ef617317c1b51209aa41b523c122b61c9b23aaf.tar.gz
Simple implementation
-rwxr-xr-xdesktop-cronish45
1 files changed, 44 insertions, 1 deletions
diff --git a/desktop-cronish b/desktop-cronish
index a67af1e..f69d16e 100755
--- a/desktop-cronish
+++ b/desktop-cronish
@@ -16,6 +16,8 @@
import cliapp
+import time
+import yaml
__version__ = '0.0'
@@ -31,7 +33,48 @@ class DesktopCronish(cliapp.Application):
default=0)
def process_args(self, args):
- pass
+ self.jobs = {}
+ self.previously = {}
+ self.process_inputs(args)
+ self.execute_jobs()
+
+ def process_input(self, filename):
+ with self.open_input(filename, 'r') as f:
+ job_dict = yaml.safe_load(f)
+ self.jobs.update(job_dict)
+
+ def execute_jobs(self):
+ n = 0
+ max_jobs = self.settings['max-jobs']
+ while max_jobs == 0 or n < max_jobs:
+ job_name, when = self.choose_job()
+ self.wait_until(when)
+ self.execute_job(job_name)
+ n += 1
+
+ def choose_job(self):
+ next_job_name = None
+ next_when = 0
+ for job_name, job in self.jobs.items():
+ job_when = self.previously.get(job_name, 0) + job['interval']
+ if next_job_name is None or job_when <= next_when:
+ next_job_name = job_name
+ next_when = job_when
+ return next_job_name, next_when
+
+ def wait_until(self, when):
+ while self.now() < when:
+ time.sleep(when - self.now())
+
+ def execute_job(self, job_name):
+ job = self.jobs[job_name]
+ exit, out, err = cliapp.runcmd_unchecked(['sh', '-c', job['command']])
+ self.output.write(out)
+ if exit != 0:
+ sys.stderr.write(err)
+ self.previously[job_name] = self.now()
+ def now(self):
+ return time.time()
DesktopCronish(version=__version__).run()