]> git.phdru.name Git - m_lib.git/blobdiff - m_lib/net/ftp/ftpscan.py
Open log with utf-8 encoding
[m_lib.git] / m_lib / net / ftp / ftpscan.py
index 319660be9d2147c8090f86dd69dd1daa32b9cfe6..ebff998f72a2c1c50ef0bd03bc537674a18618b4 100755 (executable)
@@ -2,8 +2,10 @@
 """Recursive FTP scanners"""
 
 
+from __future__ import print_function
+import codecs
 import ftplib
-from m_lib.net.ftp.ftpparse import ftpparse
+from .ftpparse import ftpparse
 
 
 class FtpScanError(Exception): pass
@@ -60,7 +62,7 @@ class ReconnectingFTPCallWrapper:
 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
@@ -93,7 +95,7 @@ def _traverse_ftp(ftp, tree, ftp_dir):
    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()
@@ -109,18 +111,18 @@ def _traverse_ftp(ftp, tree, ftp_dir):
       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
@@ -134,7 +136,7 @@ def ftpscan1(ftp_server, ftp_port=None, login=None, password=None,
       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)
@@ -143,7 +145,7 @@ def ftpscan1(ftp_server, ftp_port=None, login=None, password=None,
    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
@@ -154,7 +156,7 @@ def ftpscanrecursive(ftp_server, ftp_port=None, login=None, password=None,
       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 = []
@@ -164,7 +166,7 @@ def ftpscanrecursive(ftp_server, ftp_port=None, login=None, password=None,
       # 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 = []
@@ -177,7 +179,7 @@ def ftpscanrecursive(ftp_server, ftp_port=None, login=None, password=None,
             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 = []
@@ -192,12 +194,12 @@ def ftpscanrecursive(ftp_server, ftp_port=None, login=None, password=None,
    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)
@@ -217,10 +219,10 @@ def test(ftp_server, func, passive=None, reconnect=False):
    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')
+   log = codecs.open(logfname, 'w', encoding='utf-8')
 
    for ftp_dir, files in tree:
       if ftp_dir == ftpscan_error_mark:
@@ -268,16 +270,16 @@ if __name__ == "__main__":
    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)