From: Michael Tremer Date: Thu, 1 Nov 2018 14:52:01 +0000 (+0000) Subject: Add script to run background tasks X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c5ddbd67e50fb483815be9ac6a4ef6f1710520c3;p=ipfire.org.git Add script to run background tasks Signed-off-by: Michael Tremer --- diff --git a/src/backend/base.py b/src/backend/base.py index 065d717d..0507d5cd 100644 --- a/src/backend/base.py +++ b/src/backend/base.py @@ -1,7 +1,8 @@ #!/usr/bin/python -import configparser as configparser +import configparser import io +import tornado.gen from . import accounts from . import database @@ -78,3 +79,22 @@ class Backend(object): } self.db = database.Connection(**credentials) + + @tornado.gen.coroutine + def run_task(self, task, *args, **kwargs): + tasks = { + "update-blog-feeds" : self.blog.update_feeds, + } + + # Get the task from the list of all tasks + func = tasks.get(task, None) + if not func: + raise ValueError("Unknown task: %s" % task) + + # Run the task + r = yield func(*args, **kwargs) + + # If any error code has been returned, + # we will end the program + if r: + raise SystemExit(r) diff --git a/src/crontab/ipfire.org b/src/crontab/ipfire.org index 1bb8bf6d..a772c359 100644 --- a/src/crontab/ipfire.org +++ b/src/crontab/ipfire.org @@ -1 +1,2 @@ -# empty +# Update blog feeds once an hour +0 * * * * ipfire.org update-blog-feeds diff --git a/src/scripts/ipfire.org.in b/src/scripts/ipfire.org.in index d718e7f4..723dc895 100644 --- a/src/scripts/ipfire.org.in +++ b/src/scripts/ipfire.org.in @@ -1,111 +1,43 @@ -#!@PYTHON@ +#!/usr/bin/python3 -import logging -import time +import sys +import tornado.gen import tornado.ioloop -import webapp.backend as backend +import ipfire -class Daemon(object): - def __init__(self): - self._managers = [] - - self.ioloop.set_blocking_log_threshold(900) +class TaskRunner(object): + def __init__(self, *args, **kwargs): + self.backend = ipfire.Backend(*args, **kwargs) - self.backend = backend.Backend("webapp.conf") + # Create an IOLoop + self.ioloop = tornado.ioloop.IOLoop.current() - @property - def ioloop(self): - return tornado.ioloop.IOLoop.instance() - - def add(self, manager_cls): - manager = manager_cls(self) - self._managers.append(manager) - - def run(self): - """ - Main loop. - """ - for manager in self._managers: - manager.pc.start() - - self.ioloop.start() - - def shutdown(self): - self.ioloop.stop() - - -class Manager(object): - def __init__(self, daemon): - self.daemon = daemon - - self.pc = tornado.ioloop.PeriodicCallback(self, self.timeout * 1000) - - logging.info("%s was initialized." % self.__class__.__name__) - - self() - - def __call__(self): - logging.info("%s main method was called." % self.__class__.__name__) - - self.do() - - # Update callback_time. - self.pc.callback_time = self.timeout * 1000 - logging.debug("Next call will be in %.2f seconds." % \ - (self.pc.callback_time / 1000)) - - @property - def backend(self): - return self.daemon.backend - - @property - def settings(self): - return self.backend.settings - - @property - def timeout(self): + def run_task(self, name, *args, **kwargs): """ - Return a new callback timeout in seconds. + This method runs the task with the given name and + arguments asynchronically and exits the program in + case on a non-zero exit code """ - raise NotImplementedError - - def do(self): - raise NotImplementedError - - - -class MirrorManager(Manager): - @property - def mirrors(self): - return self.backend.mirrors - - @property - def timeout(self): - return self.backend.settings.get_int("mirror_check_interval", 3600) - - def do(self): - # Check status of all mirror servers. - self.mirrors.check_all() + @tornado.gen.coroutine + def task(): + yield self.backend.run_task(name, *args, **kwargs) + return self.ioloop.run_sync(task) -class ReleaseFilesManager(Manager): - @property - def releases(self): - return self.backend.releases - @property - def timeout(self): - return self.settings.get_int("releasefiles_check_interval", 3600) +def main(): + z = TaskRunner("@configsdir@/@PACKAGE_NAME@.conf") - def do(self): - for release in self.releases._get_all(): - release.scan_files() + if len(sys.argv) < 2: + sys.stderr.write("Argument needed\n") + sys.exit(1) + basename = sys.argv[0] + task = sys.argv[1] + args = sys.argv[2:] -if __name__ == "__main__": - d = Daemon() - d.add(MirrorManager) - d.add(ReleaseFilesManager) + # Run the task + z.run_task(task, *args) - d.run() +main()