# HG changeset patch # User Laman # Date 2017-05-07 17:38:09 # Node ID d720182784506b804ee418f9b81b33fd5e88f333 # Parent e6752944fe6becf8bc37cccfc8df12728bf8fd17 nicer program entry point diff --git a/src/client.py b/src/client.py --- a/src/client.py +++ b/src/client.py @@ -29,7 +29,7 @@ class Connection: def negotiate(): - localTree=HashTree.fromFile(open(filename,mode="rb")) + localTree=HashTree.fromFile(filename) blocksToTransfer=[] nodeStack=collections.deque([0]) # root diff --git a/src/hashtree.py b/src/hashtree.py --- a/src/hashtree.py +++ b/src/hashtree.py @@ -14,15 +14,16 @@ class HashTree: self.leafCount=leafCount @classmethod - def fromFile(cls,fd): - stat=os.fstat(fd.fileno()) - size=stat.st_size # !! symlinks - leafCount=(size-1)//HashTree.BLOCK_SIZE+1 # number of leaf blocks - res=cls(leafCount) - - for i in range(leafCount): - data=fd.read(HashTree.BLOCK_SIZE) - res.insertLeaf(hashlib.sha256(data).digest()[HashTree.HASH_LEN:]) + def fromFile(cls,filename): + with open(filename,"rb") as f: + stat=os.fstat(f.fileno()) + size=stat.st_size # !! symlinks + leafCount=(size-1)//HashTree.BLOCK_SIZE+1 # number of leaf blocks + res=cls(leafCount) + + for i in range(leafCount): + data=f.read(HashTree.BLOCK_SIZE) + res.insertLeaf(hashlib.sha256(data).digest()[HashTree.HASH_LEN:]) res.buildTree() return res diff --git a/src/morevna.py b/src/morevna.py new file mode 100644 --- /dev/null +++ b/src/morevna.py @@ -0,0 +1,46 @@ +import sys +import os.path +from argparse import ArgumentParser + +from hashtree import HashTree + + +def buildTree(args): + if not os.path.isfile(args.datafile): + print("invalid file specified:",args.datafile,file=sys.stderr) + return + tree=HashTree.fromFile(args.datafile) + tree.save(args.treefile) + +def update(args): + print("ready to update") + print(args) + +def serve(args): + print("ready to serve") + print(args) + +parser=ArgumentParser() +subparsers=parser.add_subparsers() + +pRebuild=subparsers.add_parser("build") +pRebuild.add_argument("treefile",help="stored hash tree location") +pRebuild.add_argument("datafile") +pRebuild.set_defaults(func=buildTree) + +pUpdate=subparsers.add_parser("update") +pUpdate.add_argument("-p","--port",type=int) +pUpdate.add_argument("--host",default="127.0.0.1") +pUpdate.add_argument("-t","--tree",help="stored hash tree location") +pUpdate.add_argument("datafile") +pUpdate.set_defaults(func=update) + +pServe=subparsers.add_parser("serve") +pServe.add_argument("-p","--port",type=int) +pServe.add_argument("--host",default="") +pServe.add_argument("-t","--tree",help="stored hash tree location") +pServe.add_argument("datafile") +pServe.set_defaults(func=serve) + +args=parser.parse_args() +args.func(args) diff --git a/src/server.py b/src/server.py --- a/src/server.py +++ b/src/server.py @@ -32,7 +32,7 @@ class Connection: self.socket.close() -localTree=HashTree.fromFile(open(filename,mode="rb")) +localTree=HashTree.fromFile(filename) ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ss.bind(("",conf.port)) @@ -53,8 +53,9 @@ while True: assert jsonData["blockSize"]==localTree.BLOCK_SIZE assert jsonData["blockCount"]==localTree.leafCount - elif jsonData["command"]=="req": # !! index out of range + elif jsonData["command"]=="req": log.info("received request for node #{0}".format(jsonData["index"])) + assert jsonData["index"]