X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=hippotat.git;a=blobdiff_plain;f=hippotatd;h=49521683b250d503f2e61dddf34f4ef70843134a;hp=3adf9b313f27a89f81fd122facc5dfb491f5364b;hb=6b92614170718685ed8e92275282895f1e417ee9;hpb=de2b215e1dfd47b5b7332b044832f7620892e174 diff --git a/hippotatd b/hippotatd index 3adf9b3..4952168 100755 --- a/hippotatd +++ b/hippotatd @@ -3,15 +3,25 @@ from hippotatlib import * import os +import tempfile +import atexit +import shutil import twisted.internet from twisted.web.server import NOT_DONE_YET +import twisted.web.static + +import hippotatlib.ownsource +from hippotatlib.ownsource import SourceShipmentPreparer + #import twisted.web.server import Site #from twisted.web.resource import Resource import syslog +cleanups = [ ] + clients = { } #---------- "router" ---------- @@ -200,11 +210,32 @@ class IphttpResource(NotStupidResource): def render_GET(self, request): log_debug(DBG.HTTP, 'GET request') - return b'hippotat' + return b''' + +hippotat +

+source available + +''' -class SourceResource(NotStupidResource): - def render_GET(self, request): - return b'SUBDIR' +class SourceResource(twisted.web.static.File): + def __init__(self): + td = tempfile.mkdtemp() + + def cleanup(): + try: shutil.rmtree(td) + except FileNotFoundError: pass + + cleanups.append(cleanup) + + self._ssp = SourceShipmentPreparer(td) + self._ssp.logger = self.log + self._ssp.generate() + + super().__init__(self._ssp.output_path) + + def log(self, m): + log_debug(DBG.OWNSOURCE, m) def start_http(): resource = IphttpResource() @@ -216,7 +247,7 @@ def start_http(): log_debug(DBG.INIT, 'listening on %s' % sa) #---------- config and setup ---------- - + def process_cfg(putative_servers, putative_clients): global c c = ConfigResults() @@ -249,7 +280,25 @@ def process_cfg(putative_servers, putative_clients): ('peer', 'vrelay'), ('rnets','vnetwork'))) +def catch_termination(): + def run_cleanups(): + for cleanup in cleanups: + cleanup() + + atexit.register(run_cleanups) + + def signal_handler(name, sig, *args): + signal.signal(sig, signal.SIG_DFL) + print('exiting due to %s' % name, file=sys.stderr) + run_cleanups() + os.kill(os.getpid(), sig) + raise RuntimeError('did not die due to signal %s !' % name) + + for sig in (signal.SIGINT, signal.SIGTERM): + signal.signal(sig, partial(signal_handler, sig.name)) + common_startup(process_cfg) +catch_termination() ipif = start_ipif(c.ipif_command, (lambda p,s,d: route(p,"[ipif]",s,d))) start_http() common_run()