From 46242e6f88ed1d34a49cb552fd3b6082b24b3a73 Mon Sep 17 00:00:00 2001 From: cytec Date: Mon, 12 Mar 2012 21:45:00 +0100 Subject: [PATCH 1/5] added basic daemon function --- SiriServer.py | 74 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/SiriServer.py b/SiriServer.py index 50d2ce7..1602a10 100644 --- a/SiriServer.py +++ b/SiriServer.py @@ -16,6 +16,7 @@ import db import logging import sys +import os try: from OpenSSL import crypto @@ -180,7 +181,39 @@ 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(): + """ + Fork off as a daemon + """ + + # Make a non-session-leader child process + try: + pid = os.fork() #@UndefinedVariable - only available in UNIX + if pid != 0: + sys.exit(0) + except OSError, e: + raise RuntimeError("1st fork failed: %s [%d]" % + (e.strerror, e.errno)) + + os.setsid() #@UndefinedVariable - only available in UNIX + + # Make sure I can read my own files and shut out others + prev = os.umask(0) + os.umask(prev and int('077', 8)) + + # Make the child a session-leader by detaching from the terminal + try: + pid = os.fork() #@UndefinedVariable - only available in UNIX + 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 +221,22 @@ 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('--daemon', default=None, dest='daemon', action="store_true", help='run SiriServer as a daemon') + parser.add_option('--kill', default=None, dest='kill', action="store_true", help='kills a running daemon') (options, _) = parser.parse_args() + + createPID = False + PIDFILE = "./SiriServer.pid" + + if options.daemon: + if options.logfile: + daemonize() + reatePID = True + else: + #print "\nNo Logfile, cant run as Daemon\n" + options.logfile = "./SiriServer.log" + daemonize() + createPID = True x = logging.getLogger() x.setLevel(log_levels[options.logLevel]) @@ -202,6 +250,22 @@ def main(): h.setFormatter(f) x.addHandler(h) + + if options.kill: + if os.path.exists(PIDFILE): + try: + pidtokill = open(PIDFILE, 'r').read() + os.kill(int(pidtokill), 9) + 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 +282,15 @@ def main(): x.debug("-> Will use default select interface") from twisted.internet import reactor - + if createPID: + pid = str(os.getpid()) + x.info(u"Writing PID " + pid + " to " + str(PIDFILE)) + file(PIDFILE, 'w').write("%s\n" % 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 From e10c8934804dbca9223623dd8ee6c10b7b152c3d Mon Sep 17 00:00:00 2001 From: cytec Date: Mon, 12 Mar 2012 21:52:15 +0100 Subject: [PATCH 2/5] cleaned code and removed comments --- SiriServer.py | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/SiriServer.py b/SiriServer.py index 1602a10..497db47 100644 --- a/SiriServer.py +++ b/SiriServer.py @@ -183,28 +183,21 @@ def create_self_signed_cert(): """ def daemonize(): - """ - Fork off as a daemon - """ - - # Make a non-session-leader child process try: - pid = os.fork() #@UndefinedVariable - only available in UNIX + 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() #@UndefinedVariable - only available in UNIX + os.setsid() - # Make sure I can read my own files and shut out others prev = os.umask(0) os.umask(prev and int('077', 8)) - # Make the child a session-leader by detaching from the terminal try: - pid = os.fork() #@UndefinedVariable - only available in UNIX + pid = os.fork() if pid != 0: sys.exit(0) except OSError, e: @@ -233,7 +226,6 @@ def main(): daemonize() reatePID = True else: - #print "\nNo Logfile, cant run as Daemon\n" options.logfile = "./SiriServer.log" daemonize() createPID = True From 967054856804101ad7866c3ae16ab42945c235c5 Mon Sep 17 00:00:00 2001 From: cytec Date: Tue, 20 Mar 2012 13:23:43 +0100 Subject: [PATCH 3/5] daemon imporves some imporvements for the daemon function... kill now needs a pidfile to kill... --- SiriServer.py | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/SiriServer.py b/SiriServer.py index 497db47..c573348 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 @@ -17,7 +21,9 @@ import logging import sys import os - +import tempfile +import signal + try: from OpenSSL import crypto except: @@ -214,19 +220,21 @@ 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('--daemon', default=None, dest='daemon', action="store_true", help='run SiriServer as a daemon') - parser.add_option('--kill', default=None, dest='kill', action="store_true", help='kills a running daemon') + 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 - PIDFILE = "./SiriServer.pid" + PIDFILE = tempfile.mkstemp(suffix=".pid", prefix="SiriServer-", dir="/var/run") + PIDFILE = PIDFILE[1] + if options.daemon: if options.logfile: daemonize() reatePID = True else: - options.logfile = "./SiriServer.log" + options.logfile = "/var/log/SiriServer.log" daemonize() createPID = True @@ -243,11 +251,12 @@ def main(): x.addHandler(h) - if options.kill: + if options.kill != None: + PIDFILE = options.kill if os.path.exists(PIDFILE): try: pidtokill = open(PIDFILE, 'r').read() - os.kill(int(pidtokill), 9) + os.kill(int(pidtokill), signal.SIGTERM) os.unlink(PIDFILE) x.info("SiriServer successfully killed") except: @@ -277,12 +286,15 @@ def main(): if createPID: pid = str(os.getpid()) x.info(u"Writing PID " + pid + " to " + str(PIDFILE)) - file(PIDFILE, 'w').write("%s\n" % pid) + 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 os.path.exists(PIDFILE): + os.unlink(PIDFILE) if __name__ == "__main__": main() \ No newline at end of file From 88c1ac8f23d840557377b9150d05ae3a5b748403 Mon Sep 17 00:00:00 2001 From: cytec Date: Tue, 20 Mar 2012 13:31:46 +0100 Subject: [PATCH 4/5] create pidfile only when needed (--daemon) --- SiriServer.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/SiriServer.py b/SiriServer.py index c573348..58f2576 100644 --- a/SiriServer.py +++ b/SiriServer.py @@ -225,10 +225,7 @@ def main(): (options, _) = parser.parse_args() createPID = False - PIDFILE = tempfile.mkstemp(suffix=".pid", prefix="SiriServer-", dir="/var/run") - PIDFILE = PIDFILE[1] - - + if options.daemon: if options.logfile: daemonize() @@ -284,6 +281,8 @@ def main(): 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) From 258b54d181d7184dec2604e0b2a7892f73114fcf Mon Sep 17 00:00:00 2001 From: cytec Date: Wed, 28 Mar 2012 12:24:47 +0200 Subject: [PATCH 5/5] removed 2 unneeded lines --- SiriServer.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/SiriServer.py b/SiriServer.py index 58f2576..d892d4c 100644 --- a/SiriServer.py +++ b/SiriServer.py @@ -292,8 +292,7 @@ def main(): reactor.listenSSL(options.port, SiriFactory(), ssl.DefaultOpenSSLContextFactory(SERVER_KEY_FILE, SERVER_CERT_FILE)) reactor.run() x.info("Server shutdown complete") - if os.path.exists(PIDFILE): - os.unlink(PIDFILE) + if __name__ == "__main__": main() \ No newline at end of file