X-Git-Url: https://git.distorted.org.uk/~mdw/hippotat/blobdiff_plain/ec2c9312c36782c61b38e1c3bcdbe932685a9794..d72f83602e9173940102c718974025e16b873657:/hippotatd diff --git a/hippotatd b/hippotatd index 525e4a1..666fc1b 100755 --- a/hippotatd +++ b/hippotatd @@ -25,19 +25,19 @@ # the file AGPLv3+CAFv2. If not, email Ian Jackson # . - +#@ import sys; sys.path.append('@PYBUILD_INSTALL_DIR@') from hippotatlib import * import os import tempfile import atexit import shutil +import subprocess import twisted.internet from twisted.web.server import NOT_DONE_YET import twisted.web.static -import twisted.python.syslog import hippotatlib.ownsource from hippotatlib.ownsource import SourceShipmentPreparer @@ -296,7 +296,8 @@ def process_cfg(_opts, putative_servers, putative_clients): global c c = ConfigResults() - c.server = cfg.get('SERVER','server') + try: c.server = cfg.get('SERVER','server') + except NoOptionError: c.server = 'SERVER' cfg_process_common(c, c.server) cfg_process_saddrs(c, c.server) @@ -319,12 +320,21 @@ def process_cfg(_opts, putative_servers, putative_clients): c.vrelay = search break + try: c.ifname = cfg.get(c.server, 'ifname_server', raw=True) + except NoOptionError: pass + cfg_process_ipif(c, [c.server, 'DEFAULT'], (('local','vaddr'), ('peer', 'vrelay'), ('rnets','vnetwork'))) + if opts.printconfig is not None: + try: val = cfg.get(c.server, opts.printconfig) + except NoOptionError: pass + else: print(val) + sys.exit(0) + def catch_termination(): def run_cleanups(): for cleanup in cleanups: @@ -340,7 +350,9 @@ def catch_termination(): 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)) + try: signame = sig.name + except AttributeError: signame = "signal %d" % sig + signal.signal(sig, partial(signal_handler, signame)) def daemonise(): global syslogfacility @@ -353,6 +365,7 @@ def daemonise(): facility=facilnum, logoption=syslog.LOG_PID) def emit(event): + if logevent_is_boringtwisted(event): return m = twisted.logger.formatEvent(event) #print(repr(event), m, file=org_stderr) level = event.get('log_level') @@ -366,6 +379,57 @@ def daemonise(): glp.addObserver(emit) log_debug(DBG.INIT, 'starting to log to syslog') + #log.crit('daemonic hippotatd crashed', dflag=False) + if opts.daemon: + daemonic_reactor = (twisted.internet.interfaces.IReactorDaemonize + .providedBy(reactor)) + if daemonic_reactor: reactor.beforeDaemonize() + if opts.pidfile is not None: + pidfile_h = open(opts.pidfile, 'w') + rfd, wfd = os.pipe() + childpid = os.fork() + if childpid: + # we are the parent + os.close(wfd) + st = os.read(rfd, 1) + try: + st = st[0] + except IndexError: + st = 127 + log.critical('daemonic hippotatd crashed', dflag=False) + os._exit(st) + os.close(rfd) + os.setsid() + grandchildpid = os.fork() + if grandchildpid: + # we are the intermediate child + if opts.pidfile is not None: + print(grandchildpid, file=pidfile_h) + pidfile_h.close() + os._exit(0) + + if opts.pidfile is not None: + pidfile_h.close() + + logger = subprocess.Popen(['logger','-d', + '-t','hippotat[%d](stderr)' % os.getpid(), + '-p',opts.syslogfacility + '.err'], + stdin=subprocess.PIPE, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + restore_signals=True) + + nullfd = os.open('/dev/null', os.O_RDWR) + os.dup2(nullfd, 0) + os.dup2(nullfd, 1) + os.dup2(logger.stdin.fileno(), 2) + os.close(nullfd) + if daemonic_reactor: reactor.afterDaemonize() + log_debug(DBG.INIT, 'daemonised') + os.write(wfd, b'\0') + os.close(wfd) + + if opts.syslogfacility is not None: glp.removeObserver(hippotatlib.file_log_observer) optparser.add_option('--ownsource', default=2, @@ -380,15 +444,30 @@ optparser.add_option('--no-ownsource', action='store_const', dest='ownsource', const=0, help='source download disabled (for testing only)') +optparser.add_option('--daemon', + action='store_true', dest='daemon', default=False, + help='daemonize (and log to syslog)') + +optparser.add_option('--pidfile', + nargs=1, type='string', + action='store', dest='pidfile', default=None, + help='write pid to this file') + optparser.add_option('--syslog-facility', nargs=1, type='string',action='store', metavar='FACILITY', dest='syslogfacility', default=None, help='log to syslog, with specified facility') +optparser.add_option('--print-config', + nargs=1, type='string',action='store', + metavar='OPTION', dest='printconfig', + default=None, + help='print one config option value and exit') + common_startup(process_cfg) catch_termination() -ipif = start_ipif(c.ipif_command, (lambda p,s,d: route(p,"[ipif]",s,d))) start_http() daemonise() +ipif = start_ipif(c.ipif_command, (lambda p,s,d: route(p,"[ipif]",s,d))) common_run()