class SFTPConnector: def __init__(self, download_folder, **kwargs): cnopts = CnOpts() cnopts.hostkeys = None self._sftp = Connection(host=kwargs["host"], username=kwargs["username"], password=kwargs["password"], cnopts=cnopts) print("File server connection established...") self._folder = kwargs["folder"] self._download_folder = download_folder def get_latest_file(self, folder=None): if folder is not None: self._sftp.chdir(folder) latest = 0 latest_file = None is_dir = False for fileattr in self._sftp.listdir_attr(): if fileattr.st_mtime > latest: is_dir = stat.S_ISDIR(fileattr.st_mode) latest = fileattr.st_mtime latest_file = fileattr.filename print(latest_file, "will be downloaded. It is the latest file") latest_downloaded = self.download_latest_file(folder, latest_file, is_dir) return latest_downloaded def download_latest_file(self, root_dir, latest, is_dir): if latest is not None: if is_dir: print(latest + " is the most recent folder. Changing directory...") return self.get_latest_file(latest) print(latest, "will be downloaded...") self._sftp.get(self._folder + latest, self._download_folder + latest) return self._download_folder + latest def get_all_files(self, folder=None): if folder is not None: self._sftp.chdir(folder) all_files = list( map(lambda x: (x.filename, stat.S_ISDIR(x.st_mode)), self._sftp.listdir_attr())) for e in all_files: yield e def close(self): self._sftp.close()
class ConnectionManager: state: str = "" svr: str = "" def __init__(self, hostname: str = "test.rebex.net", username: str = "demo", password: str = "password"): self.srv = Connection(host=hostname, username=username, password=password) self.state = self.srv.pwd def __del__(self): self.srv.close()
class SFTP: def __init__(self, sftp_server_config): self.server = sftp_server_config['host_address'] self.username = sftp_server_config['user_name'] self.private_key = sftp_server_config['key_path'] self.sftp_folder = sftp_server_config['sftp_folder'] self.connection_opts = CnOpts() self.connection_opts.hostkeys = None self.__connection: Connection = None def connect(self): if not self.__connection: self.__connection = Connection(self.server, self.username, self.private_key, cnopts=self.connection_opts) return self def put(self, file, remote_path): return self.__connection.put(file, remote_path) def remove(self, path): return self.__connection.remove(path) def rmdir(self, path): return self.__connection.rmdir(path) def listdir(self, path): return self.__connection.listdir(path) def is_dir(self, path): return self.__connection.isdir(path) def is_file(self, path): return self.__connection.isfile(path) def close(self): self.__connection.close() self.__connection = None