Mercurial > templog
diff py/tempserver.py @ 233:19569cb5ed46
better arg parser. seems close to ready
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Sat, 11 Apr 2015 23:32:59 +0800 |
parents | a01b7bccccd3 |
children | fd29ae905d1b |
line wrap: on
line diff
--- a/py/tempserver.py Sat Apr 11 21:09:13 2015 +0800 +++ b/py/tempserver.py Sat Apr 11 23:32:59 2015 +0800 @@ -6,6 +6,7 @@ import time import signal import asyncio +import argparse import lockfile.pidlockfile import daemon @@ -20,11 +21,12 @@ class Tempserver(object): - def __init__(self): + def __init__(self, test_mode): self.readings = [] self.current = (None, None) self.fridge = None - self._wakeup = asyncio.Condition() + self._wakeup = asyncio.Event() + self._test_mode = test_mode def __enter__(self): self.params = params.Params() @@ -53,9 +55,15 @@ ) loop = asyncio.get_event_loop() - result_tasks = loop.run_until_complete(asyncio.wait(tasks, return_when=asyncio.FIRST_EXCEPTION)) - # use the results so that exceptions get thrown - [t.result() for x in result_tasks for t in x] + try: + result_tasks = loop.run_until_complete(asyncio.wait(tasks, return_when=asyncio.FIRST_EXCEPTION)) + # use the results so that exceptions get thrown + [t.result() for x in result_tasks for t in x] + except KeyboardInterrupt: + print('ctrl-c') + pass + finally: + loop.close() def now(self): return utils.monotonic_time() @@ -98,42 +106,58 @@ # XXX fixme - we should wake on _wakeup but asyncio Condition with wait_for is a bit broken? # https://groups.google.com/forum/#!topic/python-tulip/eSm7rZAe9LM # For now we just sleep, ignore the _wakeup - yield from asyncio.sleep(timeout) + try: + yield from asyncio.wait_for(self._wakeup.wait(), timeout=timeout) + except asyncio.TimeoutError: + pass - @asyncio.coroutine def _reload_signal(self): try: self.params.load() L("Reloaded.") - yield from self._wakeup.acquire() - self._wakeup.notify_all() - self._wakeup.release() + self._wakeup.set() + self._wakeup.clear() except Error as e: W("Problem reloading: %s" % str(e)) -def setup_logging(): + def test_mode(self): + return self._test_mode + +def setup_logging(debug = False): + level = logging.INFO + if debug: + level = logging.DEBUG logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p', - level=logging.DEBUG) - logging.getLogger("asyncio").setLevel(logging.DEBUG) + level=level) + #logging.getLogger("asyncio").setLevel(logging.DEBUG) -def start(): - with Tempserver() as server: +def start(test_mode): + with Tempserver(test_mode) as server: server.run() def main(): - setup_logging() + parser = argparse.ArgumentParser() + parser.add_argument('--hup', action='store_true') + parser.add_argument('--new', action='store_true') + parser.add_argument('--daemon', action='store_true') + parser.add_argument('-d', '--debug', action='store_true') + parser.add_argument('-t', '--test', action='store_true') + args = parser.parse_args() + + setup_logging(args.debug) heredir = os.path.abspath(os.path.dirname(__file__)) pidpath = os.path.join(heredir, 'tempserver.pid') pidf = lockfile.pidlockfile.PIDLockFile(pidpath, threaded=False) - do_hup = '--hup' in sys.argv + + try: pidf.acquire(1) pidf.release() except (lockfile.AlreadyLocked, lockfile.LockTimeout) as e: pid = pidf.read_pid() - if do_hup: + if args.hup: try: os.kill(pid, signal.SIGHUP) print("Sent SIGHUP to process %d" % pid, file=sys.stderr) @@ -146,7 +170,7 @@ stale = False if pid > 0: - if '--new' in sys.argv: + if args.new: try: os.kill(pid, 0) except OSError: @@ -171,18 +195,18 @@ print("Unlinking stale lockfile %s for pid %d" % (pidpath, pid), file=sys.stderr) pidf.break_lock() - if do_hup: + if args.hup: print("Doesn't seem to be running", file=sys.stderr) sys.exit(1) - if '--daemon' in sys.argv: + if args.daemon: logpath = os.path.join(os.path.dirname(__file__), 'tempserver.log') logf = open(logpath, 'a+') with daemon.DaemonContext(pidfile=pidf, stdout=logf, stderr = logf): - start() + start(args.test) else: with pidf: - start() + start(args.test) if __name__ == '__main__': main()