class SimpleFtpServer(multiprocessing.Process): def __init__(self): super().__init__() self.authorizer = DummyAuthorizer() handler = FTPHandler handler.authorizer = self.authorizer self.server = FTPServer(("127.0.0.1", 0), handler) def run(self): self.server.serve_forever() def stop(self): self.server.close_all() self.server.close() self.terminate() self.join() def allow_anonymous(self, cwd): self.authorizer.add_anonymous(cwd) def add_user(self, user, password, cwd): self.authorizer.add_user(user, password, cwd, perm="elradfmwMT") def base_url(self): return "ftp://127.0.0.1:{}".format(self.server.address[1])
class FtpDaemon: def __init__(self): self.daemon = None def run_in_thread(self): ftp_thread = Thread(target=self._run) ftp_thread.daemon = True ftp_thread.start() def _run(self): try: authorizer = DummyAuthorizer() # todo: make auth for every user authorizer.add_user('2aNTjQTyL8VY5zcUtF', '4Fa8PJCgQC3LUSZb4J', SRV_UPLOADS_DIR, perm='elradfmwMT') handler = FTPHandler handler.authorizer = authorizer self.daemon = FTPServer((DEFAULT_HOST, FTP_PORT), handler) self.daemon.max_cons = 256 self.daemon.max_cons_per_ip = 5 handler.banner = 'ftp-daemon is ready...' print(handler.banner) self.daemon.serve_forever() except Exception as e: print('i can' 't run ftp daemon!', e) def stop(self): self.daemon.close() print('ftp daemon stopped')
class FTPListener(threading.Thread): """ Simple thread to run the FTP Server """ def __init__(self, user=DEFAULT_USER, pwd=DEFAULT_PWD, port=DEFAULT_FTP_PORT, addr=DEFAULT_FTP_ADDR): """ Constructor """ self.user = user self.pwd = pwd self.port = port self.addr = addr threading.Thread.__init__(self) def run(self): """ Starts the FTP server """ authorizer = DummyAuthorizer() authorizer.add_user(self.user, self.pwd, ".", perm="elradfmw") handler = OneTimeFTPHandler handler.authorizer = authorizer self.server = FTPServer((self.addr, self.port), handler) self.server.serve_forever() def stop(self): """ Stops the FTP server """ if self.server is not None: self.server.close()
class FTPd(threading.Thread): def __init__(self, root_dir, address=None, timeout=0.001, dtp_handler=None): threading.Thread.__init__(self) self.__flag = threading.Event() self.__timeout = timeout authorizer = DummyAuthorizer() authorizer.add_anonymous(root_dir) handler = FTPHandler handler.authorizer = authorizer if dtp_handler is not None: handler.dtp_handler = dtp_handler self.server = FTPServer(address, handler) def start(self): self.__flag.clear() threading.Thread.start(self) self.__flag.wait() def run(self): self.__flag.set() while self.__flag.is_set(): self.server.serve_forever(timeout=self.__timeout, blocking=False) self.server.close_all() self.server.close() def stop(self): self.__flag.clear() self.join()
class FTP: def __init__(self, host="127.0.0.1", port=21, blacklist=[], whitelist=[]): self.host = host self.port = port self.blacklist = blacklist self.whitelist = whitelist # Instantiate a dummy authorizer for managing 'virtual' users authorizer = DummyAuthorizer() # Define a new user having full r/w permissions and a read-only # anonymous user authorizer.add_user('user', '12345', '.', perm='elradfmwMT') authorizer.add_anonymous(os.getcwd()) # Instantiate FTP handler class handler = FTPHandler handler.authorizer = authorizer # Define a customized banner (string returned when client connects) handler.banner = "pyftpdlib based ftpd ready." # Specify a masquerade address and the range of ports to use for # passive connections. Decomment in case you're behind a NAT. #handler.masquerade_address = '151.25.42.11' #handler.passive_ports = range(60000, 65535) # Instantiate FTP server class and listen on 0.0.0.0:2121 address = (self.host, self.port) self.server = FTPServer(address, handler) # set a limit for connections self.server.max_cons = 256 self.server.max_cons_per_ip = 5 # add blacklist self.server.blacklist = self.blacklist self.server.whitelist = self.whitelist # start ftp server def start(self): self.server.serve_forever() def close(self): self.server.close()