def connect(self, host, port, tls, timeout): if tls == '0': fp = FTP(timeout=int(timeout)) else: fp = FTP_TLS(timeout=int(timeout)) banner = fp.connect(host, int(port)) if tls != '0': fp.auth() return TCP_Connection(fp, banner)
def login(self): if self.service == 'ftp': ftp = FTP() else: #print('doing FTP SSL') ftp = FTP_TLS() try: ftp.connect(host=self.address, port=self.port, timeout=3) except socket.timeout: return ReturnCode.CONN_TIMEOUT if self.service == 'ftps': logging.info('Securing SSL/TLS connection...') print('Securing SSL/TLS connection...') try: print(ftp.auth()) print(ftp.prot_p()) #print(ftp.prot_p()) except error_perm as e: logging.info(e) #'Error during SSL/TLS setup.') print(e) #if str(e).startswith('500'): #logging.info('Maybe the server doesn\'t supports FTPS') return ReturnCode.TLS_ERROR try: #print(self.service) #ftp.connect(host=self.address, port=self.port, timeout=3) #if self.service == 'ftps': ftp.login(user=self.username, passwd=self.password) return ReturnCode.AUTH_OK except ConnectionRefusedError: return ReturnCode.CONN_REFUSED except error_perm as e: print(e) return ReturnCode.AUTH_FAILED except Exception: return ReturnCode.GENERIC_ERROR
class ProcessorFTP(BaseProcessorRemoteCP): ftp = None def __init__(self, **kwargs): super(ProcessorFTP, self).__init__(**kwargs) def __repr__(self): return "{0}@{1}:{2}".format(self.username, self.remote_host, self.remote_dir) def connect(self): try: if self.is_ssl_auth or self.is_ssl_data: log.debug("{0}: FTP with SSL/TLS".format(self.name)) self.ftp = FTP_TLS() else: log.debug("{0}: FTP no SSL".format(self.name)) self.ftp = FTP() self.ftp.set_debuglevel(self.debug_level) self.ftp.connect(self.remote_host, self.remote_port, timeout=self.timeout) if self.is_ssl_auth: self.ftp.auth() self.ftp.login(user=self.username, passwd=self.password) if self.is_ssl_data: self.ftp.prot_p() except Exception as e: log.error("{0}: Connect error to {1} {2}".format( self.name, self.remote_host, e)) return False log.info("{0}: FTP Connected to {1} with {2}".format( self.name, self.remote_host, self.username)) return True def disconnect(self): try: self.ftp.close() except Exception as e: log.error("{0}: Disconnect error to {1} {2}".format( self.name, self.remote_host, e)) return False log.info("{0}: FTP Disconnected from {1} with {2}".format( self.name, self.remote_host, self.username)) def create_path(self, remotepath): parts = remotepath.split('/') for n in range(2, len(parts)): path = '/'.join(parts[:n]) try: self.ftp.mkd(path) except: pass def run(self, file_item): super(ProcessorFTP, self).run(file_item) try: assert_file_locked(file_item) rel_path = file_item.get_relative_path() remote_path = self.remote_dir + rel_path + file_item.name self.create_path(remote_path) fd = open(file_item.full_path, 'r') self.ftp.storbinary("STOR " + remote_path, fd) fd.close() log.info("{0}: FTP Put file {1}".format(self.name, file_item)) except Exception as e: log.error("{0}: FTP Put error to {1} file {2} :{3}".format( self.name, self.remote_host, file_item, e)) return False log.debug("End Processing {0}".format(file_item)) return True