Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 74 additions & 4 deletions SiriServer.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-


try:
from twisted.internet import ssl
from twisted.internet.protocol import Factory
Expand All @@ -16,7 +20,10 @@
import db
import logging
import sys

import os
import tempfile
import signal

try:
from OpenSSL import crypto
except:
Expand Down Expand Up @@ -180,15 +187,53 @@ 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():

parser = OptionParser()
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])
Expand All @@ -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:
Expand All @@ -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()