| """Compare local and remote dictionaries and transfer differing files -- like rdist."""
|
|
|
| import sys
|
| from repr import repr
|
| import FSProxy
|
| import time
|
| import os
|
|
|
| def main():
|
| pwd = os.getcwd()
|
| s = raw_input("chdir [%s] " % pwd)
|
| if s:
|
| os.chdir(s)
|
| pwd = os.getcwd()
|
| host = ask("host", 'voorn.cwi.nl')
|
| port = 4127
|
| verbose = 1
|
| mode = ''
|
| print """\
|
| Mode should be a string of characters, indicating what to do with differences.
|
| r - read different files to local file system
|
| w - write different files to remote file system
|
| c - create new files, either remote or local
|
| d - delete disappearing files, either remote or local
|
| """
|
| s = raw_input("mode [%s] " % mode)
|
| if s: mode = s
|
| address = (host, port)
|
| t1 = time.time()
|
| local = FSProxy.FSProxyLocal()
|
| remote = FSProxy.FSProxyClient(address, verbose)
|
| compare(local, remote, mode)
|
| remote._close()
|
| local._close()
|
| t2 = time.time()
|
| dt = t2-t1
|
| mins, secs = divmod(dt, 60)
|
| print mins, "minutes and", round(secs), "seconds"
|
| raw_input("[Return to exit] ")
|
|
|
| def ask(prompt, default):
|
| s = raw_input("%s [%s] " % (prompt, default))
|
| return s or default
|
|
|
| def askint(prompt, default):
|
| s = raw_input("%s [%s] " % (prompt, str(default)))
|
| if s: return string.atoi(s)
|
| return default
|
|
|
| def compare(local, remote, mode):
|
| print
|
| print "PWD =", repr(os.getcwd())
|
| sums_id = remote._send('sumlist')
|
| subdirs_id = remote._send('listsubdirs')
|
| remote._flush()
|
| print "calculating local sums ..."
|
| lsumdict = {}
|
| for name, info in local.sumlist():
|
| lsumdict[name] = info
|
| print "getting remote sums ..."
|
| sums = remote._recv(sums_id)
|
| print "got", len(sums)
|
| rsumdict = {}
|
| for name, rsum in sums:
|
| rsumdict[name] = rsum
|
| if not lsumdict.has_key(name):
|
| print repr(name), "only remote"
|
| if 'r' in mode and 'c' in mode:
|
| recvfile(local, remote, name)
|
| else:
|
| lsum = lsumdict[name]
|
| if lsum != rsum:
|
| print repr(name),
|
| rmtime = remote.mtime(name)
|
| lmtime = local.mtime(name)
|
| if rmtime > lmtime:
|
| print "remote newer",
|
| if 'r' in mode:
|
| recvfile(local, remote, name)
|
| elif lmtime > rmtime:
|
| print "local newer",
|
| if 'w' in mode:
|
| sendfile(local, remote, name)
|
| else:
|
| print "same mtime but different sum?!?!",
|
| print
|
| for name in lsumdict.keys():
|
| if not rsumdict.keys():
|
| print repr(name), "only locally",
|
| fl()
|
| if 'w' in mode and 'c' in mode:
|
| sendfile(local, remote, name)
|
| elif 'r' in mode and 'd' in mode:
|
| os.unlink(name)
|
| print "removed."
|
| print
|
| print "gettin subdirs ..."
|
| subdirs = remote._recv(subdirs_id)
|
| common = []
|
| for name in subdirs:
|
| if local.isdir(name):
|
| print "Common subdirectory", repr(name)
|
| common.append(name)
|
| else:
|
| print "Remote subdirectory", repr(name), "not found locally"
|
| if 'r' in mode and 'c' in mode:
|
| pr = "Create local subdirectory %s? [y] " % \
|
| repr(name)
|
| if 'y' in mode:
|
| ok = 'y'
|
| else:
|
| ok = ask(pr, "y")
|
| if ok[:1] in ('y', 'Y'):
|
| local.mkdir(name)
|
| print "Subdirectory %s made" % \
|
| repr(name)
|
| common.append(name)
|
| lsubdirs = local.listsubdirs()
|
| for name in lsubdirs:
|
| if name not in subdirs:
|
| print "Local subdirectory", repr(name), "not found remotely"
|
| for name in common:
|
| print "Entering subdirectory", repr(name)
|
| local.cd(name)
|
| remote.cd(name)
|
| compare(local, remote, mode)
|
| remote.back()
|
| local.back()
|
|
|
| def sendfile(local, remote, name):
|
| try:
|
| remote.create(name)
|
| except (IOError, os.error), msg:
|
| print "cannot create:", msg
|
| return
|
|
|
| print "sending ...",
|
| fl()
|
|
|
| data = open(name).read()
|
|
|
| t1 = time.time()
|
|
|
| remote._send_noreply('write', name, data)
|
| remote._flush()
|
|
|
| t2 = time.time()
|
|
|
| dt = t2-t1
|
| print len(data), "bytes in", round(dt), "seconds",
|
| if dt:
|
| print "i.e.", round(len(data)/dt), "bytes/sec",
|
| print
|
|
|
| def recvfile(local, remote, name):
|
| ok = 0
|
| try:
|
| rv = recvfile_real(local, remote, name)
|
| ok = 1
|
| return rv
|
| finally:
|
| if not ok:
|
| print "*** recvfile of %r failed, deleting" % (name,)
|
| local.delete(name)
|
|
|
| def recvfile_real(local, remote, name):
|
| try:
|
| local.create(name)
|
| except (IOError, os.error), msg:
|
| print "cannot create:", msg
|
| return
|
|
|
| print "receiving ...",
|
| fl()
|
|
|
| f = open(name, 'w')
|
| t1 = time.time()
|
|
|
| length = 4*1024
|
| offset = 0
|
| id = remote._send('read', name, offset, length)
|
| remote._flush()
|
| while 1:
|
| newoffset = offset + length
|
| newid = remote._send('read', name, newoffset, length)
|
| data = remote._recv(id)
|
| id = newid
|
| if not data: break
|
| f.seek(offset)
|
| f.write(data)
|
| offset = newoffset
|
| size = f.tell()
|
|
|
| t2 = time.time()
|
| f.close()
|
|
|
| dt = t2-t1
|
| print size, "bytes in", round(dt), "seconds",
|
| if dt:
|
| print "i.e.", size//dt, "bytes/sec",
|
| print
|
| remote._recv(id) # ignored
|
|
|
| def fl():
|
| sys.stdout.flush()
|
|
|
| if __name__ == '__main__':
|
| main()
|