diff --git a/SiriServer.py b/SiriServer.py index 50d2ce7..d892d4c 100644 --- a/SiriServer.py +++ b/SiriServer.py @@ -1,3 +1,7 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + + try: from twisted.internet import ssl from twisted.internet.protocol import Factory @@ -16,7 +20,10 @@ import db import logging import sys - +import os +import tempfile +import signal + try: from OpenSSL import crypto except: @@ -180,7 +187,32 @@ def create_self_signed_cert(): \t\tTHE CERTIFICATES MUST MATCH! IF YOU DID THIS HERE BEFORE, THE OLD ca.pem WON'T WORK ANYMORE\n \t\tYou can just EMail the keys/ca.pem file to yourself\n """ - + +def daemonize(): + try: + pid = os.fork() + if pid != 0: + sys.exit(0) + except OSError, e: + raise RuntimeError("1st fork failed: %s [%d]" % + (e.strerror, e.errno)) + + os.setsid() + + prev = os.umask(0) + os.umask(prev and int('077', 8)) + + try: + pid = os.fork() + if pid != 0: + sys.exit(0) + except OSError, e: + raise RuntimeError("2nd fork failed: %s [%d]" % + (e.strerror, e.errno)) + + dev_null = file('/dev/null', 'r') + os.dup2(dev_null.fileno(), sys.stdin.fileno()) + def main(): @@ -188,7 +220,20 @@ def main(): parser.add_option('-l', '--loglevel', default='info', dest='logLevel', help='This sets the logging level you have these options: debug, info, warning, error, critical \t\tThe standard value is info') parser.add_option('-p', '--port', default=4443, type='int', dest='port', help='This options lets you use a custom port instead of 443 (use a port > 1024 to run as non root user)') parser.add_option('--logfile', default=None, dest='logfile', help='Log to a file instead of stdout.') + parser.add_option('-d', '--daemon', default=None, dest='daemon', action="store_true", help='run SiriServer as a daemon') + parser.add_option('--kill', default=None, dest='kill', help='kills a running daemon by the provided pidfile') (options, _) = parser.parse_args() + + createPID = False + + if options.daemon: + if options.logfile: + daemonize() + reatePID = True + else: + options.logfile = "/var/log/SiriServer.log" + daemonize() + createPID = True x = logging.getLogger() x.setLevel(log_levels[options.logLevel]) @@ -202,6 +247,23 @@ def main(): h.setFormatter(f) x.addHandler(h) + + if options.kill != None: + PIDFILE = options.kill + if os.path.exists(PIDFILE): + try: + pidtokill = open(PIDFILE, 'r').read() + os.kill(int(pidtokill), signal.SIGTERM) + os.unlink(PIDFILE) + x.info("SiriServer successfully killed") + except: + x.info("Error trying to Kill " + str(pidtokill)) + exit() + else: + x.info("Seems like SiriServer is not running...") + exit() + + create_self_signed_cert() try: @@ -218,11 +280,19 @@ def main(): x.debug("-> Will use default select interface") from twisted.internet import reactor - + if createPID: + PIDFILE = tempfile.mkstemp(suffix=".pid", prefix="SiriServer-", dir="/var/run") + PIDFILE = PIDFILE[1] + pid = str(os.getpid()) + x.info(u"Writing PID " + pid + " to " + str(PIDFILE)) + file(PIDFILE, 'w').write(pid) + + x.info("Starting server on port {0}".format(options.port)) reactor.listenSSL(options.port, SiriFactory(), ssl.DefaultOpenSSLContextFactory(SERVER_KEY_FILE, SERVER_CERT_FILE)) reactor.run() x.info("Server shutdown complete") + if __name__ == "__main__": - main() + main() \ No newline at end of file