"""Recursive FTP scanners"""
+from __future__ import print_function
+import codecs
import ftplib
-from m_lib.net.ftp.ftpparse import ftpparse
+import sys
+from .ftpparse import ftpparse
class FtpScanError(Exception): pass
class ReconnectingFTPWrapper:
ReconnectingFTPCallWrapperClass = ReconnectingFTPCallWrapper
- def __init__(self, ftp, ftp_server, ftp_port=None, login=None, password=None, ftp_dir='/', tree=None):
+ def __init__(self, ftp, ftp_server, ftp_port=0, login=None, password=None, ftp_dir='/', tree=None):
self._ftp = ftp
self._ftp_server = ftp_server
self._ftp_port = ftp_port
get_files = GetFiles()
try:
ftp.dir(get_files)
- except ftplib.all_errors, msg:
+ except ftplib.all_errors as msg:
tree.append((ftpscan_error_mark, "Cannot list directory `%s': %s" % (ftp_dir, msg)))
return
files = get_files.files()
full_path = ftp_dir + '/' + name
try:
ftp.cwd(name)
- except ftplib.error_perm, msg:
+ except ftplib.error_perm as msg:
tree.append((ftpscan_error_mark, "Cannot enter directory `%s': %s" % (full_path, msg)))
if isinstance(ftp, ReconnectingFTPWrapper):
ftp.cwd("..", False)
- except ftplib.all_errors, msg:
+ except ftplib.all_errors as msg:
tree.append((ftpscan_error_mark, "Cannot enter directory `%s': %s" % (full_path, msg)))
else:
_traverse_ftp(ftp, tree, full_path)
ftp.cwd("..")
-def ftpscan1(ftp_server, ftp_port=None, login=None, password=None,
+def ftpscan1(ftp_server, ftp_port=0, login=None, password=None,
ftp_dir='/', passive=None, FTPClass=ftplib.FTP, reconnect=False,
ReconnectingFTPWrapperClass=ReconnectingFTPWrapper):
"""Recursive FTP scan using one-by-one directory traversing. It is slow
ftp = ReconnectingFTPWrapperClass(ftp, ftp_server, ftp_port, login, password, ftp_dir, tree)
ftp.connect(ftp_server, ftp_port)
ftp.login(login, password)
- if ftp_dir <> '/':
+ if ftp_dir != '/':
ftp.cwd(ftp_dir)
_traverse_ftp(ftp, tree, ftp_dir)
return tree
-def ftpscanrecursive(ftp_server, ftp_port=None, login=None, password=None,
+def ftpscanrecursive(ftp_server, ftp_port=0, login=None, password=None,
ftp_dir='/', passive=None, FTPClass=ftplib.FTP, reconnect=False):
"""
Recursive FTP scan using fast LIST -R command. Not all servers supports
ftp.set_pasv(passive)
ftp.connect(ftp_server, ftp_port)
ftp.login(login, password)
- if ftp_dir <> '/':
+ if ftp_dir != '/':
ftp.cwd(ftp_dir)
lines = []
# The server does not implement LIST -R and
# treats -R as a name of a directory (-:
ftp.quit()
- raise FtpScanError, "the server does not implement recursive listing"
+ raise FtpScanError("the server does not implement recursive listing")
ftp.quit()
tree = []
tree.append((current_dir, files))
if line[:2] == "./":
line = line[1:] # remove leading dot
- elif line[0] <> '/':
+ elif line[0] != '/':
line = '/' + line
current_dir = line[:-1]
files = []
tree.append((current_dir, files))
if len(tree) == 1:
- raise FtpScanError, "the server ignores -R in LIST"
+ raise FtpScanError("the server ignores -R in LIST")
return tree
-def ftpscan(ftp_server, ftp_port=None, login=None, password=None,
+def ftpscan(ftp_server, ftp_port=0, login=None, password=None,
ftp_dir='/', passive=None, FTPClass=ftplib.FTP):
try:
return ftpscanrecursive(ftp_server, ftp_port, login, password, ftp_dir, passive, FTPClass)
tree = func(ftp_server, passive=passive, reconnect=reconnect)
stop_time = time()
- print stop_time - start_time
+ print(stop_time - start_time)
logfname = "%s.list" % ftp_server
- log = open(logfname, 'w')
+ if sys.version_info[0] >= 3:
+ log = codecs.open(logfname, 'w', encoding='utf-8')
+ else:
+ log = open(logfname, 'w')
for ftp_dir, files in tree:
if ftp_dir == ftpscan_error_mark:
else:
ftp_server = arguments[0]
- print "Scanning", ftp_server
+ print("Scanning", ftp_server)
try:
test(ftp_server, ftpscanrecursive, passive)
- except FtpScanError, msg:
- print "Rescanning due to the error:", msg
+ except FtpScanError as msg:
+ print("Rescanning due to the error:", msg)
try:
test(ftp_server, ftpscan1, passive)
except EOFError:
- print "Rescanning due to the error: connection reset by peer"
+ print("Rescanning due to the error: connection reset by peer")
test(ftp_server, ftpscan1, passive, True)
except EOFError:
- print "Rescanning due to the error: connection reset by peer"
+ print("Rescanning due to the error: connection reset by peer")
test(ftp_server, ftpscan1, passive, True)