Changeset - 259f29140f23
[Not reviewed]
default
0 4 0
Laman - 8 years ago 2017-10-09 21:55:09

server forked into background
4 files changed with 47 insertions and 8 deletions:
0 comments (0 inline, 0 general)
src/config.py
Show inline comments
 
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")
 
keyfile=os.path.join(directory,"certs/key.pem")
 
peers=os.path.join(directory,"certs/peers.pem")
src/morevna.py
Show inline comments
 
import sys
 
import os.path
 
from argparse import ArgumentParser
 

	
 
from util import spawnDaemon
 
import config as conf
 
import stats
 
from hashtree import HashTree
 
from client import Client
 
from server import Server
 

	
 
@@ -37,13 +38,13 @@ def serve(args):
 
	if args.tree:
 
		_checkFile(args.tree)
 
	if args.host: conf.hosts.insert(0,args.host)
 
	if args.port: conf.port=args.port
 

	
 
	s=Server(args.datafile,args.tree)
 
	s.serve()
 
	spawnDaemon(s.serve)
 

	
 

	
 
parser=ArgumentParser()
 
subparsers=parser.add_subparsers()
 

	
 
pBuild=subparsers.add_parser("build")
src/server.py
Show inline comments
 
@@ -29,12 +29,13 @@ class Connection:
 

	
 

	
 
class Server:
 
	def __init__(self,filename,treeFile=""):
 
		self._filename=filename
 
		self._treeFile=treeFile
 
		self._locked=False
 

	
 
		if treeFile:
 
			self._tree=HashTree.load(treeFile)
 
		else:
 
			self._tree=HashTree.fromFile(filename)
 

	
 
@@ -53,23 +54,24 @@ class Server:
 
		self._dataFile=None
 

	
 
	def serve(self):
 
		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
 

	
 
	def _serveOne(self,incoming,outcoming):
 
		jsonData,binData=incoming.readMsg()
 

	
 
		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":
 
			if jsonData["dataType"]=="data":
 
				outcoming.writeMsg(*self._requestData(jsonData["index"]))
 
			else:
 
@@ -77,12 +79,13 @@ class Server:
 

	
 
		elif jsonData["command"]=="send" and jsonData["dataType"]=="data":
 
			outcoming.writeMsg(*self._receiveData(jsonData,binData))
 

	
 
		elif jsonData["command"]=="end":
 
			self._finalize()
 
			self._locked=False
 
			return False
 

	
 
		else:
 
			assert False, jsonData["command"]
 

	
 
		return True
src/util.py
Show inline comments
 
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
 
		self._i0=i0
 
		self._i=i0
 
		self._last=""
0 comments (0 inline, 0 general)