From: Ian Jackson Date: Sat, 8 Apr 2017 23:01:09 +0000 (+0100) Subject: hippotatd: support daemonisation X-Git-Url: https://git.distorted.org.uk/~mdw/hippotat/commitdiff_plain/d84dbf4bde624a66318086c61c387e6448c707e4 hippotatd: support daemonisation Signed-off-by: Ian Jackson --- diff --git a/hippotatd b/hippotatd index 525e4a1..f4bc551 100755 --- a/hippotatd +++ b/hippotatd @@ -32,6 +32,7 @@ import os import tempfile import atexit import shutil +import subprocess import twisted.internet from twisted.web.server import NOT_DONE_YET @@ -366,6 +367,50 @@ 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() + 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 + os._exit(0) + + logger = subprocess.Popen(['logger','-d', + '-t','hippotat(stderr)', + '--id=%d' % 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,6 +425,10 @@ 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('--syslog-facility', nargs=1, type='string',action='store', metavar='FACILITY', dest='syslogfacility', @@ -388,7 +437,7 @@ optparser.add_option('--syslog-facility', 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()