#!/usr/bin/python
-import configparser as configparser
+import configparser
import io
+import tornado.gen
from . import accounts
from . import database
}
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)
-#!@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()