Files
@ 02ea4fed2520
Branch filter:
Location: Morevna/src/morevna.py - annotation
02ea4fed2520
2.9 KiB
text/x-python
fixes, error handling
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | d72018278450 d72018278450 3f9fff4c9811 d72018278450 d72018278450 9f2b0a4f3538 7b737e64c6a0 41ea9614ce8c d72018278450 02ea4fed2520 6c8e994fd906 b73a5d69a11b b73a5d69a11b 8b0dc65400f3 8b0dc65400f3 8b0dc65400f3 b73a5d69a11b d72018278450 d72018278450 d72018278450 8b0dc65400f3 095908159393 095908159393 095908159393 095908159393 095908159393 095908159393 b73a5d69a11b d72018278450 d72018278450 d72018278450 164e41861584 8b0dc65400f3 8bb6a904d50b 8bb6a904d50b 9f2b0a4f3538 7b737e64c6a0 b73a5d69a11b 8bb6a904d50b 02ea4fed2520 02ea4fed2520 02ea4fed2520 02ea4fed2520 02ea4fed2520 02ea4fed2520 02ea4fed2520 02ea4fed2520 02ea4fed2520 02ea4fed2520 d72018278450 3d0876534e40 3d0876534e40 8bb6a904d50b 8bb6a904d50b 9f2b0a4f3538 3d0876534e40 3d0876534e40 8bb6a904d50b 02ea4fed2520 02ea4fed2520 02ea4fed2520 02ea4fed2520 02ea4fed2520 02ea4fed2520 02ea4fed2520 02ea4fed2520 02ea4fed2520 3d0876534e40 d72018278450 8b0dc65400f3 8b0dc65400f3 8b0dc65400f3 7b737e64c6a0 7b737e64c6a0 b73a5d69a11b 6c8e994fd906 3f9fff4c9811 3f9fff4c9811 3f9fff4c9811 3f9fff4c9811 b73a5d69a11b d72018278450 d72018278450 d72018278450 d72018278450 13d0327a4abb 095908159393 13d0327a4abb 13d0327a4abb 13d0327a4abb d72018278450 164e41861584 d72018278450 7e101f53704e 8bb6a904d50b d72018278450 164e41861584 d72018278450 3d0876534e40 3d0876534e40 02ea4fed2520 8bb6a904d50b 3d0876534e40 3d0876534e40 3d0876534e40 d72018278450 d72018278450 7e101f53704e d72018278450 d72018278450 d72018278450 d72018278450 d72018278450 d72018278450 | import sys
import os.path
import logging as log
from argparse import ArgumentParser
from util import spawnDaemon, splitHost
import config as conf
import stats
from hashtree import HashTree
from client import Client, Connection as ClientConnection, FailedConnection
from server import Miniserver
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)
if os.path.isfile(args.treefile):
treeMod=os.stat(args.treefile).st_mtime
dataMod=os.stat(args.datafile).st_mtime
if dataMod<treeMod and not args.force:
print("tree file is up to date")
return
tree=HashTree.fromFile(args.datafile)
tree.save(args.treefile)
def push(args):
_checkFile(args.datafile)
if args.tree:
_checkFile(args.tree)
if args.host: conf.hosts=[args.host]
if args.port: conf.port=args.port
c=Client(args.datafile,args.tree)
for h in conf.hosts:
host=splitHost(h,conf.port)
try:
with ClientConnection(*host) as con:
c.setConnection(con)
blocksToTransfer=c.negotiate()
c.sendData(blocksToTransfer)
print()
print(stats.report())
except FailedConnection: continue
def pull(args):
_checkFile(args.datafile)
if args.tree:
_checkFile(args.tree)
if args.host: conf.hosts=[args.host]
if args.port: conf.port=args.port
c=Client(args.datafile,args.tree)
host=splitHost(conf.hosts[0],conf.port)
try:
with ClientConnection(*host) as con:
c.setConnection(con)
blocksToTransfer=c.negotiate()
c.pullData(blocksToTransfer)
print()
print(stats.report())
except FailedConnection: pass
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=Miniserver(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("-f","--force",action="store_true",help="force tree rebuild")
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")
pUpdate.add_argument("-t","--tree",help="stored hash tree location")
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")
pUpdate.add_argument("-t","--tree",help="stored hash tree location")
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")
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)
|