X-Git-Url: https://git.distorted.org.uk/~mdw/hippotat/blobdiff_plain/eb113b2c70237a415fc3c730fa9115fa4add1233..eed788f8959bb06e7631f2d2bbb57d0783314727:/hippotatd diff --git a/hippotatd b/hippotatd index 32d9a34..e9b62b7 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" ---------- @@ -200,18 +233,44 @@ class IphttpResource(NotStupidResource): def render_GET(self, request): log_debug(DBG.HTTP, 'GET request') - return b'hippotat' + return b''' + +hippotat +

+source +(and that of dependency packages) +available + +''' def start_http(): resource = IphttpResource() 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) + td = tempfile.mkdtemp() + + def cleanup(): + try: shutil.rmtree(td) + except FileNotFoundError: pass + + cleanups.append(cleanup) + + ssp = SourceShipmentPreparer(td) + ssp.logger = partial(log_debug, DBG.OWNSOURCE) + ssp.generate() + + resource.putChild(b'source', twisted.web.static.File(ssp.output_paths[0])) + resource.putChild(b'srcpkgs', twisted.web.static.File(ssp.output_paths[1])) + + 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() @@ -244,7 +303,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()