diff --git a/src/config.py b/src/config.py --- a/src/config.py +++ b/src/config.py @@ -1,18 +1,18 @@ import os -import datetime import logging as log +from logging.handlers import TimedRotatingFileHandler -logName="/tmp/mor{0}.log".format(datetime.datetime.now().timestamp()) log.basicConfig( - level=log.INFO,format="%(asctime)s %(levelname)s: %(message)s",datefmt="%Y-%m-%d %H:%M:%S", - filename=logName + level=log.INFO,format="%(asctime)s %(levelname)s: %(message)s",datefmt="%Y-%m-%d %H:%M:%S" ) +logger=log.getLogger() +logger.addHandler(TimedRotatingFileHandler("/var/log/morevna.log",when="midnight",backupCount=9)) version=0 hosts=["127.0.0.1"] -port=9001 +port=9901 directory=os.path.join(os.path.dirname(__file__),"..") certfile=os.path.join(directory,"certs/cert.pem") diff --git a/src/morevna.py b/src/morevna.py --- a/src/morevna.py +++ b/src/morevna.py @@ -2,6 +2,7 @@ import sys import os.path from argparse import ArgumentParser +from util import spawnDaemon import config as conf import stats from hashtree import HashTree @@ -40,7 +41,7 @@ def serve(args): if args.port: conf.port=args.port s=Server(args.datafile,args.tree) - s.serve() + spawnDaemon(s.serve) parser=ArgumentParser() diff --git a/src/server.py b/src/server.py --- a/src/server.py +++ b/src/server.py @@ -32,6 +32,7 @@ class Server: def __init__(self,filename,treeFile=""): self._filename=filename self._treeFile=treeFile + self._locked=False if treeFile: self._tree=HashTree.load(treeFile) @@ -56,8 +57,8 @@ class Server: while True: with Connection(self._ss,self._ssl) as (incoming, outcoming): try: - while True: - if not self._serveOne(incoming,outcoming): return + while self._serveOne(incoming,outcoming): + pass except AssertionError: continue @@ -67,6 +68,7 @@ class Server: if jsonData["command"]=="init": assert jsonData["blockSize"]==self.BLOCK_SIZE assert jsonData["blockCount"]==self._tree.leafCount + self._locked=True outcoming.writeMsg({"command": "ack"}) elif jsonData["command"]=="req": @@ -80,6 +82,7 @@ class Server: elif jsonData["command"]=="end": self._finalize() + self._locked=False return False else: diff --git a/src/util.py b/src/util.py --- a/src/util.py +++ b/src/util.py @@ -1,3 +1,38 @@ +import os +import sys + + +def spawnDaemon(fun): + # do the UNIX double-fork magic, see Stevens' "Advanced + # Programming in the UNIX Environment" for details (ISBN 0201563177) + try: + pid = os.fork() + if pid > 0: + # parent process, return and keep running + return + except OSError as e: + print("fork #1 failed: {0} ({1})".format(e.errno,e.strerror),file=sys.stderr) + sys.exit(1) + + os.setsid() + + # do second fork + try: + pid = os.fork() + if pid > 0: + # exit from second parent + print("[{0}] server running".format(pid)) + sys.exit(0) + except OSError as e: + print("fork #2 failed: {0} ({1})".format(e.errno,e.strerror),file=sys.stderr) + sys.exit(1) + + fun() + + # all done + os._exit(os.EX_OK) + + class Progress: def __init__(self,n,i0=0): self._n=n