import sys import os.path import logging as log 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) try: spawnDaemon(s.serve) except Exception as e: log.exception("exception: %s",e) 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)