X-Git-Url: https://git.distorted.org.uk/~mdw/hippotat/blobdiff_plain/0e8d950f126d308d18db7a37da1fd62cb797d157..1e43fae07664c81c74a3df3388e4490c2fdcf9e1:/hippotatd diff --git a/hippotatd b/hippotatd index 1e9348e..0f6a318 100755 --- a/hippotatd +++ b/hippotatd @@ -1,17 +1,50 @@ #!/usr/bin/python3 +# +# Hippotat - Asinine IP Over HTTP program +# ./hippotatd - server main program +# +# Copyright 2017 Ian Jackson +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version, with the "CAF Login +# Exception" as published by Ian Jackson (version 2, or at your option +# any later version) as an Additional Permission. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public +# License and the CAF Login Exception along with this program, in the +# file AGPLv3+CAFv2. If not, email Ian Jackson +# . + 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 +209,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,18 +233,45 @@ 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() crash_on_defer(ep.listen(site)) log_debug(DBG.INIT, 'listening on %s' % sa) + reactor.callLater(0.1, (lambda: log.info('hippotatd started', dflag=False))) #---------- config and setup ---------- - + def process_cfg(putative_servers, putative_clients): global c c = ConfigResults() @@ -239,7 +304,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()