Использование событий событий FTP-сервера
Класс pyftpdlib.handlers.FTPHandler(conn, server)
реализует интерпретатор протокола FTP-сервера (см. RFC-959), обрабатывая команды, полученные от клиента по каналу управления, путем вызова соответствующего метода этой команде. Например, для полученной команды
"MKD pathname"
вызывается метод
.ftp_MKD()
с
pathname
в качестве аргумента).
Вся соответствующая информация о сеансе хранится в переменных экземпляра. Аргументы conn
- это базовый экземпляр объекта сокета вновь установленного соединения, server
- это экземпляр класса pyftpdlib.servers.FTPServer
. Базовое использование просто требует создания экземпляра класса FTPHandler
и указания, какой экземпляр авторизатора он будет использовать:
>>> from pyftpdlib.handlers import FTPHandler
>>> from pyftpdlib.authorizers import DummyAuthorizer
>>> handler = FTPHandler
>>> authorizer = DummyAuthorizer()
>>> authorizer.add_anonymous(homedir='/somedir')
>>> handler.authorizer = authorizer
Через подклассы FTPHandler()
можно использовать обратные вызовы на какие то действия пользователя.
Небольшой пример, который показывает, как это сделать:
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
from pyftpdlib.authorizers import DummyAuthorizer
class MyHandler(FTPHandler):
def on_connect(self):
print (f'Connected {self.remote_ip}:{self.remote_port}')
def on_disconnect(self):
# сделать что-нибудь, когда клиент отключается
pass
def on_login(self, username):
# сделать что-нибудь, когда пользователь войдет в систему
pass
def on_logout(self, username):
# сделать что-нибудь, когда пользователь выйдет из системы
pass
def on_file_sent(self, file):
# сделать что-нибудь, когда файл был отправлен
pass
def on_file_received(self, file):
# сделать что-нибудь, когда файл был получен
pass
def on_incomplete_file_sent(self, file):
# сделать что-нибудь, когда файл частично отправлен
pass
def on_incomplete_file_received(self, file):
# удалить частично загруженные файлы
import os
os.remove(file)
def main():
authorizer = DummyAuthorizer()
authorizer.add_user('user', '12345', homedir='.', perm='elradfmwMT')
authorizer.add_anonymous(homedir='.')
handler = MyHandler
handler.authorizer = authorizer
server = FTPServer(('', 2121), handler)
server.serve_forever()
if __name__ == "__main__":
main()