diff options
Diffstat (limited to 'Tools/scripts/ftpmirror.py')
| -rwxr-xr-x | Tools/scripts/ftpmirror.py | 143 |
1 files changed, 74 insertions, 69 deletions
diff --git a/Tools/scripts/ftpmirror.py b/Tools/scripts/ftpmirror.py index 0f918b8..9e8be1d 100755 --- a/Tools/scripts/ftpmirror.py +++ b/Tools/scripts/ftpmirror.py @@ -1,4 +1,4 @@ -#! /usr/bin/env python +#! /usr/bin/env python3 """Mirror a remote ftp subtree into a local directory tree. @@ -29,8 +29,8 @@ from fnmatch import fnmatch # Print usage message and exit def usage(*args): sys.stdout = sys.stderr - for msg in args: print msg - print __doc__ + for msg in args: print(msg) + print(__doc__) sys.exit(2) verbose = 1 # 0 for -q, 2 for -v @@ -45,7 +45,7 @@ def main(): global verbose, interactive, mac, rmok, nologin try: opts, args = getopt.getopt(sys.argv[1:], 'a:bil:mnp:qrs:v') - except getopt.error, msg: + except getopt.error as msg: usage(msg) login = '' passwd = '' @@ -82,22 +82,22 @@ def main(): if args[3:]: usage('too many arguments') # f = ftplib.FTP() - if verbose: print "Connecting to '%s%s'..." % (host, - (port and ":%d"%port or "")) + if verbose: print("Connecting to '%s%s'..." % (host, + (port and ":%d"%port or ""))) f.connect(host,port) if not nologin: if verbose: - print 'Logging in as %r...' % (login or 'anonymous') + print('Logging in as %r...' % (login or 'anonymous')) f.login(login, passwd, account) - if verbose: print 'OK.' + if verbose: print('OK.') pwd = f.pwd() - if verbose > 1: print 'PWD =', repr(pwd) + if verbose > 1: print('PWD =', repr(pwd)) if remotedir: - if verbose > 1: print 'cwd(%s)' % repr(remotedir) + if verbose > 1: print('cwd(%s)' % repr(remotedir)) f.cwd(remotedir) - if verbose > 1: print 'OK.' + if verbose > 1: print('OK.') pwd = f.pwd() - if verbose > 1: print 'PWD =', repr(pwd) + if verbose > 1: print('PWD =', repr(pwd)) # mirrorsubdir(f, localdir) @@ -105,29 +105,29 @@ def main(): def mirrorsubdir(f, localdir): pwd = f.pwd() if localdir and not os.path.isdir(localdir): - if verbose: print 'Creating local directory', repr(localdir) + if verbose: print('Creating local directory', repr(localdir)) try: makedir(localdir) - except os.error, msg: - print "Failed to establish local directory", repr(localdir) + except os.error as msg: + print("Failed to establish local directory", repr(localdir)) return infofilename = os.path.join(localdir, '.mirrorinfo') try: text = open(infofilename, 'r').read() - except IOError, msg: + except IOError as msg: text = '{}' try: info = eval(text) except (SyntaxError, NameError): - print 'Bad mirror info in', repr(infofilename) + print('Bad mirror info in', repr(infofilename)) info = {} subdirs = [] listing = [] - if verbose: print 'Listing remote directory %r...' % (pwd,) + if verbose: print('Listing remote directory %r...' % (pwd,)) f.retrlines('LIST', listing.append) filesfound = [] for line in listing: - if verbose > 1: print '-->', repr(line) + if verbose > 1: print('-->', repr(line)) if mac: # Mac listing has just filenames; # trailing / means subdirectory @@ -141,14 +141,14 @@ def mirrorsubdir(f, localdir): # Parse, assuming a UNIX listing words = line.split(None, 8) if len(words) < 6: - if verbose > 1: print 'Skipping short line' + if verbose > 1: print('Skipping short line') continue filename = words[-1].lstrip() i = filename.find(" -> ") if i >= 0: # words[0] had better start with 'l'... if verbose > 1: - print 'Found symbolic link %r' % (filename,) + print('Found symbolic link %r' % (filename,)) linkto = filename[i+4:] filename = filename[:i] infostuff = words[-5:-1] @@ -157,28 +157,28 @@ def mirrorsubdir(f, localdir): for pat in skippats: if fnmatch(filename, pat): if verbose > 1: - print 'Skip pattern', repr(pat), - print 'matches', repr(filename) + print('Skip pattern', repr(pat), end=' ') + print('matches', repr(filename)) skip = 1 break if skip: continue if mode[0] == 'd': if verbose > 1: - print 'Remembering subdirectory', repr(filename) + print('Remembering subdirectory', repr(filename)) subdirs.append(filename) continue filesfound.append(filename) - if info.has_key(filename) and info[filename] == infostuff: + if filename in info and info[filename] == infostuff: if verbose > 1: - print 'Already have this version of',repr(filename) + print('Already have this version of',repr(filename)) continue fullname = os.path.join(localdir, filename) tempname = os.path.join(localdir, '@'+filename) if interactive: doit = askabout('file', filename, pwd) if not doit: - if not info.has_key(filename): + if filename not in info: info[filename] = 'Not retrieved' continue try: @@ -187,20 +187,20 @@ def mirrorsubdir(f, localdir): pass if mode[0] == 'l': if verbose: - print "Creating symlink %r -> %r" % (filename, linkto) + print("Creating symlink %r -> %r" % (filename, linkto)) try: os.symlink(linkto, tempname) - except IOError, msg: - print "Can't create %r: %s" % (tempname, msg) + except IOError as msg: + print("Can't create %r: %s" % (tempname, msg)) continue else: try: fp = open(tempname, 'wb') - except IOError, msg: - print "Can't create %r: %s" % (tempname, msg) + except IOError as msg: + print("Can't create %r: %s" % (tempname, msg)) continue if verbose: - print 'Retrieving %r from %r as %r...' % (filename, pwd, fullname) + print('Retrieving %r from %r as %r...' % (filename, pwd, fullname)) if verbose: fp1 = LoggingFile(fp, 1024, sys.stdout) else: @@ -209,8 +209,8 @@ def mirrorsubdir(f, localdir): try: f.retrbinary('RETR ' + filename, fp1.write, 8*1024) - except ftplib.error_perm, msg: - print msg + except ftplib.error_perm as msg: + print(msg) t1 = time.time() bytes = fp.tell() fp.close() @@ -222,30 +222,30 @@ def mirrorsubdir(f, localdir): pass # Ignore the error try: os.rename(tempname, fullname) - except os.error, msg: - print "Can't rename %r to %r: %s" % (tempname, fullname, msg) + except os.error as msg: + print("Can't rename %r to %r: %s" % (tempname, fullname, msg)) continue info[filename] = infostuff writedict(info, infofilename) if verbose and mode[0] != 'l': dt = t1 - t0 kbytes = bytes / 1024.0 - print int(round(kbytes)), - print 'Kbytes in', - print int(round(dt)), - print 'seconds', + print(int(round(kbytes)), end=' ') + print('Kbytes in', end=' ') + print(int(round(dt)), end=' ') + print('seconds', end=' ') if t1 > t0: - print '(~%d Kbytes/sec)' % \ - int(round(kbytes/dt),) - print + print('(~%d Kbytes/sec)' % \ + int(round(kbytes/dt),)) + print() # # Remove files from info that are no longer remote deletions = 0 - for filename in info.keys(): + for filename in list(info.keys()): if filename not in filesfound: if verbose: - print "Removing obsolete info entry for", - print repr(filename), "in", repr(localdir or ".") + print("Removing obsolete info entry for", end=' ') + print(repr(filename), "in", repr(localdir or ".")) del info[filename] deletions = deletions + 1 if deletions: @@ -258,14 +258,14 @@ def mirrorsubdir(f, localdir): except os.error: names = [] for name in names: - if name[0] == '.' or info.has_key(name) or name in subdirs: + if name[0] == '.' or name in info or name in subdirs: continue skip = 0 for pat in skippats: if fnmatch(name, pat): if verbose > 1: - print 'Skip pattern', repr(pat), - print 'matches', repr(name) + print('Skip pattern', repr(pat), end=' ') + print('matches', repr(name)) skip = 1 break if skip: @@ -273,10 +273,10 @@ def mirrorsubdir(f, localdir): fullname = os.path.join(localdir, name) if not rmok: if verbose: - print 'Local file', repr(fullname), - print 'is no longer pertinent' + print('Local file', repr(fullname), end=' ') + print('is no longer pertinent') continue - if verbose: print 'Removing local file/dir', repr(fullname) + if verbose: print('Removing local file/dir', repr(fullname)) remove(fullname) # # Recursively mirror subdirectories @@ -284,28 +284,28 @@ def mirrorsubdir(f, localdir): if interactive: doit = askabout('subdirectory', subdir, pwd) if not doit: continue - if verbose: print 'Processing subdirectory', repr(subdir) + if verbose: print('Processing subdirectory', repr(subdir)) localsubdir = os.path.join(localdir, subdir) pwd = f.pwd() if verbose > 1: - print 'Remote directory now:', repr(pwd) - print 'Remote cwd', repr(subdir) + print('Remote directory now:', repr(pwd)) + print('Remote cwd', repr(subdir)) try: f.cwd(subdir) - except ftplib.error_perm, msg: - print "Can't chdir to", repr(subdir), ":", repr(msg) + except ftplib.error_perm as msg: + print("Can't chdir to", repr(subdir), ":", repr(msg)) else: - if verbose: print 'Mirroring as', repr(localsubdir) + if verbose: print('Mirroring as', repr(localsubdir)) mirrorsubdir(f, localsubdir) - if verbose > 1: print 'Remote cwd ..' + if verbose > 1: print('Remote cwd ..') f.cwd('..') newpwd = f.pwd() if newpwd != pwd: - print 'Ended up in wrong directory after cd + cd ..' - print 'Giving up now.' + print('Ended up in wrong directory after cd + cd ..') + print('Giving up now.') break else: - if verbose > 1: print 'OK.' + if verbose > 1: print('OK.') # Helper to remove a file or directory tree def remove(fullname): @@ -322,14 +322,14 @@ def remove(fullname): return 0 try: os.rmdir(fullname) - except os.error, msg: - print "Can't remove local directory %r: %s" % (fullname, msg) + except os.error as msg: + print("Can't remove local directory %r: %s" % (fullname, msg)) return 0 else: try: os.unlink(fullname) - except os.error, msg: - print "Can't remove local file %r: %s" % (fullname, msg) + except os.error as msg: + print("Can't remove local file %r: %s" % (fullname, msg)) return 0 return 1 @@ -352,6 +352,11 @@ class LoggingFile: def close(self): self.outfp.write('\n') +def raw_input(prompt): + sys.stdout.write(prompt) + sys.stdout.flush() + return sys.stdin.readline() + # Ask permission to download a file. def askabout(filetype, filename, pwd): prompt = 'Retrieve %s %s from %s ? [ny] ' % (filetype, filename, pwd) @@ -361,7 +366,7 @@ def askabout(filetype, filename, pwd): return 1 if reply in ['', 'n', 'no', 'nop', 'nope']: return 0 - print 'Please answer yes or no.' + print('Please answer yes or no.') # Create a directory if it doesn't exist. Recursively create the # parent directory as well if needed. @@ -370,7 +375,7 @@ def makedir(pathname): return dirname = os.path.dirname(pathname) if dirname: makedir(dirname) - os.mkdir(pathname, 0777) + os.mkdir(pathname, 0o777) # Write a dictionary to a file in a way that can be read back using # rval() but is still somewhat readable (i.e. not a single long line). |
