diff --git a/src/client.py b/src/client.py --- a/src/client.py +++ b/src/client.py @@ -104,3 +104,33 @@ class Client: log.info("closing session...") dataFile.close() + + def pullData(self,blocksToTransfer): + log.info(blocksToTransfer) + dataFile=open(self._filename, mode="rb+") + i1=-1 + + print(datetime.now(), "receiving data:") + with Connection(self._ssl) as (incoming,outcoming): + progress=Progress(len(blocksToTransfer)) + for (k,i2) in enumerate(blocksToTransfer): + outcoming.writeMsg({"command":"req", "index":i2, "dataType":"data"}) + jsonData,binData=incoming.readMsg() + assert jsonData["command"]=="send" and jsonData["index"]==i2 and jsonData["dataType"]=="data", jsonData + + if i1+1!=i2: + dataFile.seek(i2*HashTree.BLOCK_SIZE) + dataFile.write(binData) + + log.info("block #{0}: {1}...{2}".format(i2,binData[:5],binData[-5:])) + + stats.logTransferredBlock() + i1=i2 + progress.p(k) + progress.done() + + with Connection(self._ssl) as (incoming,outcoming): + outcoming.writeMsg({"command":"end"}) + + log.info("closing session...") + dataFile.close() diff --git a/src/morevna.py b/src/morevna.py --- a/src/morevna.py +++ b/src/morevna.py @@ -34,6 +34,17 @@ def push(args): print() print(stats.report()) +def pull(args): + _checkFile(args.datafile) + if args.host: conf.hosts.insert(0,args.host) + if args.port: conf.port=args.port + + c=Client(args.datafile) + blocksToTransfer=c.negotiate() + c.pullData(blocksToTransfer) + print() + print(stats.report()) + def serve(args): _checkFile(args.datafile) if args.tree: @@ -62,6 +73,12 @@ pUpdate.add_argument("--host",default="1 pUpdate.add_argument("datafile") pUpdate.set_defaults(func=push) +pUpdate=subparsers.add_parser("pull") +pUpdate.add_argument("-p","--port",type=int) +pUpdate.add_argument("--host",default="127.0.0.1") +pUpdate.add_argument("datafile") +pUpdate.set_defaults(func=pull) + pServe=subparsers.add_parser("serve") pServe.add_argument("-p","--port",type=int) pServe.add_argument("--host",default="")