From f18d3f5089055d4eca9a3055269936242a0a0721 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sat, 20 Apr 2013 10:51:27 +0100 Subject: Add test script for trigger file missing --- tests/mtime-nofile.script | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100755 tests/mtime-nofile.script diff --git a/tests/mtime-nofile.script b/tests/mtime-nofile.script new file mode 100755 index 0000000..9f8bb8c --- /dev/null +++ b/tests/mtime-nofile.script @@ -0,0 +1,14 @@ +#!/bin/sh + +set -eu + +rm -f "$DATADIR/foo.trigger" +cat < "$DATADIR/foo.tasks" +date: + trigger-file: $DATADIR/foo.trigger + trigger-age: 10 + command: echo triggered > $DATADIR/foo.out +EOF + + +./desktop-cronish --max-jobs 1 "$DATADIR/foo.tasks" -- cgit v1.2.1 From 5c9c29237c59d6866ec80260448065ff6b828947 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sat, 20 Apr 2013 10:52:09 +0100 Subject: Add test script for trigger file being old --- tests/mtime-old.script | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100755 tests/mtime-old.script diff --git a/tests/mtime-old.script b/tests/mtime-old.script new file mode 100755 index 0000000..d727c78 --- /dev/null +++ b/tests/mtime-old.script @@ -0,0 +1,14 @@ +#!/bin/sh + +set -eu + +touch -t 197001010000.00 "$DATADIR/foo.trigger" +cat < "$DATADIR/foo.tasks" +date: + trigger-file: $DATADIR/foo.trigger + trigger-age: 10 + command: echo triggered > $DATADIR/foo.out +EOF + + +./desktop-cronish --max-jobs 5 "$DATADIR/foo.tasks" -- cgit v1.2.1 From fc4401c1a4f3ba42e89affa1d24bfdcb68b7ef71 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sat, 20 Apr 2013 10:52:42 +0100 Subject: Add test script for trigger file being new --- tests/mtime-new.script | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100755 tests/mtime-new.script diff --git a/tests/mtime-new.script b/tests/mtime-new.script new file mode 100755 index 0000000..0e92b29 --- /dev/null +++ b/tests/mtime-new.script @@ -0,0 +1,14 @@ +#!/bin/sh + +set -eu + +touch "$DATADIR/foo.trigger" +cat < "$DATADIR/foo.tasks" +date: + trigger-file: $DATADIR/foo.trigger + trigger-age: 10 + command: echo triggered > $DATADIR/foo.out +EOF + + +./desktop-cronish --max-jobs 5 "$DATADIR/foo.tasks" -- cgit v1.2.1 From 645abeec9da4520c4bf613af86201280c8df74f8 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sat, 20 Apr 2013 10:56:00 +0100 Subject: Use interval only when job has it --- desktop-cronish | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/desktop-cronish b/desktop-cronish index d6d84e2..eb34c6e 100755 --- a/desktop-cronish +++ b/desktop-cronish @@ -76,12 +76,20 @@ class DesktopCronish(cliapp.Application): next_job_name = None next_when = 0 for job_name, job in self.jobs.items(): + if 'interval' in job: + job_when = self.when_interval_job(job_name, job) + else: + raise cliapp.AppException( + 'Unknown job trigger for %s' % job_name) 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 when_interval_job(self, job_name, job): + return self.previously.get(job_name, 0) + job['interval'] + def wait_until(self, when, for_what): while self.now() < when: seconds = when - self.now() -- cgit v1.2.1 From 963664a6d980a4e425e557f766408d23f0de4a32 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sat, 20 Apr 2013 11:00:51 +0100 Subject: First attempt at implementing trigger-file --- desktop-cronish | 18 +++++++++++++++++- tests/mtime-new.script | 2 +- tests/mtime-nofile.script | 2 +- tests/mtime-old.script | 2 +- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/desktop-cronish b/desktop-cronish index eb34c6e..70f2e40 100755 --- a/desktop-cronish +++ b/desktop-cronish @@ -17,6 +17,7 @@ import cliapp import logging +import os import time import sys import ttystatus @@ -78,10 +79,11 @@ class DesktopCronish(cliapp.Application): for job_name, job in self.jobs.items(): if 'interval' in job: job_when = self.when_interval_job(job_name, job) + elif 'trigger-file' in job: + job_when = self.when_trigger_file_job(job_name, job) else: raise cliapp.AppException( 'Unknown job trigger for %s' % job_name) - 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 @@ -90,6 +92,20 @@ class DesktopCronish(cliapp.Application): def when_interval_job(self, job_name, job): return self.previously.get(job_name, 0) + job['interval'] + def when_trigger_file_job(self, job_name, job): + filename = job['trigger-file'] + + # If file doesn't exist, trigger now. + if not os.path.exists(filename): + return self.now() + + # If there is no max age for file, but it exists, never trigger. + if 'trigger-age' not in job: + return -1 + + mtime = os.path.getmtime(filename) + return mtime + job['trigger-age'] + def wait_until(self, when, for_what): while self.now() < when: seconds = when - self.now() diff --git a/tests/mtime-new.script b/tests/mtime-new.script index 0e92b29..2d1f28e 100755 --- a/tests/mtime-new.script +++ b/tests/mtime-new.script @@ -11,4 +11,4 @@ date: EOF -./desktop-cronish --max-jobs 5 "$DATADIR/foo.tasks" +./desktop-cronish --quiet --max-jobs 5 "$DATADIR/foo.tasks" diff --git a/tests/mtime-nofile.script b/tests/mtime-nofile.script index 9f8bb8c..9a04a71 100755 --- a/tests/mtime-nofile.script +++ b/tests/mtime-nofile.script @@ -11,4 +11,4 @@ date: EOF -./desktop-cronish --max-jobs 1 "$DATADIR/foo.tasks" +./desktop-cronish --quiet --max-jobs 1 "$DATADIR/foo.tasks" diff --git a/tests/mtime-old.script b/tests/mtime-old.script index d727c78..a14ad25 100755 --- a/tests/mtime-old.script +++ b/tests/mtime-old.script @@ -11,4 +11,4 @@ date: EOF -./desktop-cronish --max-jobs 5 "$DATADIR/foo.tasks" +./desktop-cronish --quiet --max-jobs 5 "$DATADIR/foo.tasks" -- cgit v1.2.1 From 389f0a3d444e113b3ca36baa72306b404f1ae6f4 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sat, 20 Apr 2013 11:25:03 +0100 Subject: Fix trigger-file --- desktop-cronish | 33 ++++++++++++++++++++++++++------- tests/mtime-new.script | 12 +++++++----- tests/mtime-nofile.script | 11 ++++++----- tests/mtime-nofile.stdout | 1 + tests/mtime-old.script | 11 ++++++----- tests/mtime-old.stdout | 1 + 6 files changed, 47 insertions(+), 22 deletions(-) create mode 100644 tests/mtime-nofile.stdout create mode 100644 tests/mtime-old.stdout diff --git a/desktop-cronish b/desktop-cronish index 70f2e40..98e78ca 100755 --- a/desktop-cronish +++ b/desktop-cronish @@ -39,6 +39,11 @@ class DesktopCronish(cliapp.Application): self.settings.boolean( ['quiet', 'q'], 'no status messaging to terminal') + + self.settings.integer( + ['sleep'], + 'if there is no known job, sleep for SECONDS', + default=1) def process_args(self, args): self.ts = ttystatus.TerminalStatus(period=0.1) @@ -68,8 +73,14 @@ class DesktopCronish(cliapp.Application): max_jobs = self.settings['max-jobs'] while max_jobs == 0 or n < max_jobs: job_name, when = self.choose_job() - self.wait_until(when, job_name) - self.execute_job(job_name) + if job_name is not None: + self.wait_until(when, job_name) + self.execute_job(job_name) + else: + self.status( + 'No idea what to do, sleeping for %d seconds' % + self.settings['sleep']) + time.sleep(self.settings['sleep']) n += 1 self.status('Stopped executing after %d jobs' % n) @@ -84,9 +95,10 @@ class DesktopCronish(cliapp.Application): else: raise cliapp.AppException( 'Unknown job trigger for %s' % job_name) - if next_job_name is None or job_when <= next_when: - next_job_name = job_name - next_when = job_when + if job_when is not None: + 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 when_interval_job(self, job_name, job): @@ -101,10 +113,17 @@ class DesktopCronish(cliapp.Application): # If there is no max age for file, but it exists, never trigger. if 'trigger-age' not in job: - return -1 + return None + # If the file exists and is too old, trigger now. mtime = os.path.getmtime(filename) - return mtime + job['trigger-age'] + if mtime + job['trigger-age'] <= self.now(): + return self.now() + + # Do not trigger now. We can't compute the next time to trigger: + # the file might go missing, or get updated, so we need to test + # it every iteration. + return None def wait_until(self, when, for_what): while self.now() < when: diff --git a/tests/mtime-new.script b/tests/mtime-new.script index 2d1f28e..ae1338c 100755 --- a/tests/mtime-new.script +++ b/tests/mtime-new.script @@ -2,13 +2,15 @@ set -eu -touch "$DATADIR/foo.trigger" -cat < "$DATADIR/foo.tasks" +touch "$DATADIR/mtime-new.trigger" +touch "$DATADIR/mtime-new.out" +cat < "$DATADIR/mtime-new.tasks" date: - trigger-file: $DATADIR/foo.trigger + trigger-file: $DATADIR/mtime-new.trigger trigger-age: 10 - command: echo triggered > $DATADIR/foo.out + command: echo triggered > $DATADIR/mtime-new.out EOF -./desktop-cronish --quiet --max-jobs 5 "$DATADIR/foo.tasks" +./desktop-cronish --quiet --max-jobs 5 "$DATADIR/mtime-new.tasks" +cat "$DATADIR/mtime-new.out" diff --git a/tests/mtime-nofile.script b/tests/mtime-nofile.script index 9a04a71..772becc 100755 --- a/tests/mtime-nofile.script +++ b/tests/mtime-nofile.script @@ -2,13 +2,14 @@ set -eu -rm -f "$DATADIR/foo.trigger" -cat < "$DATADIR/foo.tasks" +rm -f "$DATADIR/mtime-nofile.trigger" +cat < "$DATADIR/mtime-nofile.tasks" date: - trigger-file: $DATADIR/foo.trigger + trigger-file: $DATADIR/mtime-nofile.trigger trigger-age: 10 - command: echo triggered > $DATADIR/foo.out + command: echo triggered > $DATADIR/mtime-nofile.out EOF -./desktop-cronish --quiet --max-jobs 1 "$DATADIR/foo.tasks" +./desktop-cronish --quiet --max-jobs 1 "$DATADIR/mtime-nofile.tasks" +cat "$DATADIR/mtime-nofile.out" diff --git a/tests/mtime-nofile.stdout b/tests/mtime-nofile.stdout new file mode 100644 index 0000000..bd20802 --- /dev/null +++ b/tests/mtime-nofile.stdout @@ -0,0 +1 @@ +triggered diff --git a/tests/mtime-old.script b/tests/mtime-old.script index a14ad25..b58b53e 100755 --- a/tests/mtime-old.script +++ b/tests/mtime-old.script @@ -2,13 +2,14 @@ set -eu -touch -t 197001010000.00 "$DATADIR/foo.trigger" -cat < "$DATADIR/foo.tasks" +touch -t 197001010000.00 "$DATADIR/mtime-old.trigger" +cat < "$DATADIR/mtime-old.tasks" date: - trigger-file: $DATADIR/foo.trigger + trigger-file: $DATADIR/mtime-old.trigger trigger-age: 10 - command: echo triggered > $DATADIR/foo.out + command: echo triggered > $DATADIR/mtime-old.out EOF -./desktop-cronish --quiet --max-jobs 5 "$DATADIR/foo.tasks" +./desktop-cronish --quiet --max-jobs 5 "$DATADIR/mtime-old.tasks" +cat "$DATADIR/mtime-old.out" diff --git a/tests/mtime-old.stdout b/tests/mtime-old.stdout new file mode 100644 index 0000000..bd20802 --- /dev/null +++ b/tests/mtime-old.stdout @@ -0,0 +1 @@ +triggered -- cgit v1.2.1