X-Git-Url: https://git.distorted.org.uk/~mdw/hippotat/blobdiff_plain/0e8d950f126d308d18db7a37da1fd62cb797d157..1ffdd5d34bbef7659abd4138f021e3b28dc25af4:/hippotatd diff --git a/hippotatd b/hippotatd index 1e9348e..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" ---------- @@ -176,8 +186,13 @@ def log_http(desca, msg, **kwargs): pass log_debug(DBG.HTTP, msg + repr(desca), **kwargs) -class IphttpResource(twisted.web.resource.Resource): - isLeaf = True +class NotStupidResource(twisted.web.resource.Resource): + # why this is not the default is a mystery! + def getChild(self, name, request): + if name == b'': return self + else: return twisted.web.resource.Resource.getChild(name, request) + +class IphttpResource(NotStupidResource): def render_POST(self, request): log_debug(DBG.HTTP_FULL, 'req recv: ' + repr(request) + ' ' + repr(request.args), @@ -195,10 +210,36 @@ class IphttpResource(twisted.web.resource.Resource): def render_GET(self, request): log_debug(DBG.HTTP, 'GET request') - return b'hippotat' + return b''' + +hippotat +

+source available + +''' + +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() + resource.putChild(b'source',SourceResource()) site = twisted.web.server.Site(resource) for sa in c.saddrs: ep = sa.make_endpoint() @@ -206,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() @@ -239,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()