diff --git a/src/morevna.py b/src/morevna.py --- a/src/morevna.py +++ b/src/morevna.py @@ -7,27 +7,29 @@ from client import Client from server import Server -def _checkDatafile(datafile): - if not os.path.isfile(datafile): - print("invalid file specified:",args.datafile,file=sys.stderr) +def _checkFile(f): + if not os.path.isfile(f): + print("invalid file specified:",f,file=sys.stderr) sys.exit(1) def buildTree(args): - _checkDatafile(args.datafile) + _checkFile(args.datafile) tree=HashTree.fromFile(args.datafile) tree.save(args.treefile) def update(args): - _checkDatafile(args.datafile) + _checkFile(args.datafile) c=Client(args.datafile) blocksToTransfer=c.negotiate() c.sendData(blocksToTransfer) def serve(args): - _checkDatafile(args.datafile) + _checkFile(args.datafile) + if args.tree: + _checkFile(args.tree) # debug copy default file import shutil @@ -35,7 +37,7 @@ def serve(args): filename=origFilename+"_" shutil.copyfile(origFilename,filename) - s=Server(filename) + s=Server(filename,args.tree) s.serve() diff --git a/src/server.py b/src/server.py --- a/src/server.py +++ b/src/server.py @@ -24,9 +24,14 @@ class Connection: class Server: - def __init__(self,filename): + def __init__(self,filename,treeFile=""): self.filename=filename - self.tree=HashTree.fromFile(filename) + + if treeFile: + self.tree=HashTree.load(treeFile) + else: + self.tree=HashTree.fromFile(filename) + self.BLOCK_SIZE=self.tree.BLOCK_SIZE self.ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM) @@ -34,6 +39,7 @@ class Server: self.ss.listen(1) self._lastWrite=-1 + self.dataFile=None def serve(self): while self._serveOne(): @@ -55,6 +61,8 @@ class Server: elif jsonData["command"]=="end": log.info("closing session...") + if self.dataFile: + self.dataFile.close() return False else: @@ -75,11 +83,12 @@ class Server: def _receiveData(self,jsonData,binData): log.info("received data block #{0}: {1}...{2}".format(jsonData["index"],binData[:5],binData[-5:])) + if not self.dataFile: + self.dataFile=open(self.filename,mode="rb+") i=jsonData["index"] - with open(self.filename,mode="rb+") as dataFile: - if self._lastWrite+1!=i: - dataFile.seek(i*self.BLOCK_SIZE) - dataFile.write(binData) + if self._lastWrite+1!=i: + self.dataFile.seek(i*self.BLOCK_SIZE) + self.dataFile.write(binData) self._lastWrite=i # never update the hash tree