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 def _checkFile(f): if not os.path.isfile(f): print("invalid file specified:",f,file=sys.stderr) sys.exit(1) def buildTree(args): _checkFile(args.datafile) tree=HashTree.fromFile(args.datafile) tree.save(args.treefile) def push(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.sendData(blocksToTransfer) print() print(stats.report()) def serve(args): _checkFile(args.datafile) 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) spawnDaemon(s.serve) parser=ArgumentParser() subparsers=parser.add_subparsers() pBuild=subparsers.add_parser("build") pBuild.add_argument("treefile", help="stored hash tree location") pBuild.add_argument("datafile") pBuild.set_defaults(func=buildTree) pUpdate=subparsers.add_parser("push") pUpdate.add_argument("-p","--port",type=int) pUpdate.add_argument("--host",default="127.0.0.1") pUpdate.add_argument("datafile") pUpdate.set_defaults(func=push) 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)