]> git.ipfire.org Git - ipfire.org.git/commitdiff
Add script to run background tasks
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 1 Nov 2018 14:52:01 +0000 (14:52 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 1 Nov 2018 14:52:01 +0000 (14:52 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/backend/base.py
src/crontab/ipfire.org
src/scripts/ipfire.org.in

index 065d717de8ceb92ffe29e25cc060ab9dda422ec8..0507d5cd86073b36d570e8482af7f90b1536600d 100644 (file)
@@ -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)
index 1bb8bf6d7fd4c8d09aea89b47de20fb8bbb61626..a772c359aa9fff6efdebf648456f5a9d254fcf24 100644 (file)
@@ -1 +1,2 @@
-# empty
+# Update blog feeds once an hour
+0 * * * *   ipfire.org update-blog-feeds
index d718e7f411cea4780d9795645e57d58ac190e5d3..723dc895f4912d0049e51d7291dabc9855afee3b 100644 (file)
-#!@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()