| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- # coding:utf-8
- import os
- import sys
- import time
- local_path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
- if local_path not in sys.path:
- sys.path.append(local_path)
- os.environ.setdefault("DJANGO_SETTINGS_MODULE", "kedong.settings")
- from django.conf import settings
- from pyftpdlib.authorizers import DummyAuthorizer
- from pyftpdlib.handlers import FTPHandler, _strerror, FilesystemError
- from pyftpdlib.servers import FTPServer
- ftp_redis_pool = settings.ftp_redis_pool
- CONFIG = settings.CONFIG
- ftp_dict = CONFIG['ftp_config']
- ftp_config = CONFIG['ftp']
- user_list = [
- ("ftpuser", "yf_123456", "/home/ftpsite")
- ]
- user_list.extend(ftp_dict.values())
- FTPHandler.permit_foreign_addresses = True
- class MyFTPHandler(FTPHandler):
- def _get_redis_key(self, file, prefix):
- key = None
- for k in ftp_dict.keys():
- if file.startswith(k):
- key = f"{prefix}{k}"
- return key
- def push_redis(self, key, data):
- ftp_redis_pool.push(key, data)
- def on_file_received(self, file):
- """上传结束回调"""
- if not file.endswith('.jpg'):
- return None
- key = self._get_redis_key(file, prefix="/up_complete")
- if key:
- data = {
- 'path': file,
- 'create_time': int(time.time())
- }
- self.push_redis(key, data)
- def on_incomplete_file_received(self, file):
- if not file.endswith('.jpg'):
- return None
- if file.startswith("/data/ftp/photo/cbd/"):
- key = self._get_redis_key(file, prefix="/up_complete")
- if key:
- data = {
- 'path': file,
- 'create_time': int(time.time())
- }
- self.push_redis(key, data)
- def ftp_MFMT(self, path, timeval):
- """真正上传完成调用"""
- result = super().ftp_MFMT(path, timeval)
- try:
- file = result[1]
- key = self._get_redis_key(file, prefix="/up_success")
- if key:
- data = {
- 'path': file,
- 'create_time': int(time.time())
- }
- self.push_redis(key, data)
- except Exception as e:
- pass
- return result
- def ftp_SIZE(self, path):
- line = self.fs.fs2ftp(path)
- if self._current_type == 'a':
- why = "SIZE not allowed in ASCII mode"
- self.respond("550 %s." % why)
- return
- real_path = self.fs.realpath(path)
- is_file = self.fs.isfile(real_path)
- if not is_file:
- why = "%s is not retrievable" % line
- self.respond("550 %s." % why)
- return
- try:
- size = self.run_as_current_user(self.fs.getsize, path)
- except (OSError, FilesystemError) as err:
- why = _strerror(err)
- self.respond('550 %s.' % why)
- else:
- self.respond("213 %s" % size)
- def main():
- # 启动FTP服务
- authorizer = DummyAuthorizer()
- for i in user_list:
- path = i[2]
- if not os.path.isdir(path):
- os.makedirs(path)
- authorizer.add_user(i[0], i[1], path, perm="elradfmwMT")
- handler = MyFTPHandler
- handler.authorizer = authorizer
- handler.passive_ports = range(2000, 6333)
- server = FTPServer((ftp_config['ip'], ftp_config['port']), handler)
- server.max_cons = 2048
- server.serve_forever()
- if __name__ == '__main__':
- main()
|