summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2013-04-20 11:26:00 +0100
committerLars Wirzenius <liw@liw.fi>2013-04-20 11:26:00 +0100
commit2a7467a3d99ab2247161268a8807ad7406b73a75 (patch)
tree29e777706f11532339baab061c03e689067974f8
parentfcc3f81562d7e92bc359efabc8492109cffa8fe5 (diff)
parent389f0a3d444e113b3ca36baa72306b404f1ae6f4 (diff)
downloaddesktop-cronish-2a7467a3d99ab2247161268a8807ad7406b73a75.tar.gz
Merge branch 'mtime-trigger'
-rwxr-xr-xdesktop-cronish55
-rwxr-xr-xtests/mtime-new.script16
-rwxr-xr-xtests/mtime-nofile.script15
-rw-r--r--tests/mtime-nofile.stdout1
-rwxr-xr-xtests/mtime-old.script15
-rw-r--r--tests/mtime-old.stdout1
6 files changed, 97 insertions, 6 deletions
diff --git a/desktop-cronish b/desktop-cronish
index d6d84e2..98e78ca 100755
--- a/desktop-cronish
+++ b/desktop-cronish
@@ -17,6 +17,7 @@
import cliapp
import logging
+import os
import time
import sys
import ttystatus
@@ -38,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)
@@ -67,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)
@@ -76,12 +88,43 @@ class DesktopCronish(cliapp.Application):
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
+ 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)
+ 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):
+ 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 None
+
+ # If the file exists and is too old, trigger now.
+ mtime = os.path.getmtime(filename)
+ 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:
seconds = when - self.now()
diff --git a/tests/mtime-new.script b/tests/mtime-new.script
new file mode 100755
index 0000000..ae1338c
--- /dev/null
+++ b/tests/mtime-new.script
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+set -eu
+
+touch "$DATADIR/mtime-new.trigger"
+touch "$DATADIR/mtime-new.out"
+cat <<EOF > "$DATADIR/mtime-new.tasks"
+date:
+ trigger-file: $DATADIR/mtime-new.trigger
+ trigger-age: 10
+ command: echo triggered > $DATADIR/mtime-new.out
+EOF
+
+
+./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
new file mode 100755
index 0000000..772becc
--- /dev/null
+++ b/tests/mtime-nofile.script
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+set -eu
+
+rm -f "$DATADIR/mtime-nofile.trigger"
+cat <<EOF > "$DATADIR/mtime-nofile.tasks"
+date:
+ trigger-file: $DATADIR/mtime-nofile.trigger
+ trigger-age: 10
+ command: echo triggered > $DATADIR/mtime-nofile.out
+EOF
+
+
+./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
new file mode 100755
index 0000000..b58b53e
--- /dev/null
+++ b/tests/mtime-old.script
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+set -eu
+
+touch -t 197001010000.00 "$DATADIR/mtime-old.trigger"
+cat <<EOF > "$DATADIR/mtime-old.tasks"
+date:
+ trigger-file: $DATADIR/mtime-old.trigger
+ trigger-age: 10
+ command: echo triggered > $DATADIR/mtime-old.out
+EOF
+
+
+./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