ftp_server_spider_new.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. # coding:utf-8
  2. import os
  3. import sys
  4. import time
  5. local_path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
  6. if local_path not in sys.path:
  7. sys.path.append(local_path)
  8. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "kedong.settings")
  9. from django.conf import settings
  10. from pyftpdlib.authorizers import DummyAuthorizer
  11. from pyftpdlib.handlers import FTPHandler, _strerror, FilesystemError
  12. from pyftpdlib.servers import FTPServer
  13. ftp_redis_pool = settings.ftp_redis_pool
  14. CONFIG = settings.CONFIG
  15. ftp_dict = CONFIG['ftp_config']
  16. ftp_config = CONFIG['ftp']
  17. user_list = [
  18. ("ftpuser", "yf_123456", "/home/ftpsite")
  19. ]
  20. user_list.extend(ftp_dict.values())
  21. FTPHandler.permit_foreign_addresses = True
  22. class MyFTPHandler(FTPHandler):
  23. def _get_redis_key(self, file, prefix):
  24. key = None
  25. for k in ftp_dict.keys():
  26. if file.startswith(k):
  27. key = f"{prefix}{k}"
  28. return key
  29. def push_redis(self, key, data):
  30. ftp_redis_pool.push(key, data)
  31. def on_file_received(self, file):
  32. """上传结束回调"""
  33. if not file.endswith('.jpg'):
  34. return None
  35. key = self._get_redis_key(file, prefix="/up_complete")
  36. if key:
  37. data = {
  38. 'path': file,
  39. 'create_time': int(time.time())
  40. }
  41. self.push_redis(key, data)
  42. def on_incomplete_file_received(self, file):
  43. if not file.endswith('.jpg'):
  44. return None
  45. if file.startswith("/data/ftp/photo/cbd/"):
  46. key = self._get_redis_key(file, prefix="/up_complete")
  47. if key:
  48. data = {
  49. 'path': file,
  50. 'create_time': int(time.time())
  51. }
  52. self.push_redis(key, data)
  53. def ftp_MFMT(self, path, timeval):
  54. """真正上传完成调用"""
  55. result = super().ftp_MFMT(path, timeval)
  56. try:
  57. file = result[1]
  58. key = self._get_redis_key(file, prefix="/up_success")
  59. if key:
  60. data = {
  61. 'path': file,
  62. 'create_time': int(time.time())
  63. }
  64. self.push_redis(key, data)
  65. except Exception as e:
  66. pass
  67. return result
  68. def ftp_SIZE(self, path):
  69. line = self.fs.fs2ftp(path)
  70. if self._current_type == 'a':
  71. why = "SIZE not allowed in ASCII mode"
  72. self.respond("550 %s." % why)
  73. return
  74. real_path = self.fs.realpath(path)
  75. is_file = self.fs.isfile(real_path)
  76. if not is_file:
  77. why = "%s is not retrievable" % line
  78. self.respond("550 %s." % why)
  79. return
  80. try:
  81. size = self.run_as_current_user(self.fs.getsize, path)
  82. except (OSError, FilesystemError) as err:
  83. why = _strerror(err)
  84. self.respond('550 %s.' % why)
  85. else:
  86. self.respond("213 %s" % size)
  87. def main():
  88. # 启动FTP服务
  89. authorizer = DummyAuthorizer()
  90. for i in user_list:
  91. path = i[2]
  92. if not os.path.isdir(path):
  93. os.makedirs(path)
  94. authorizer.add_user(i[0], i[1], path, perm="elradfmwMT")
  95. handler = MyFTPHandler
  96. handler.authorizer = authorizer
  97. handler.passive_ports = range(2000, 6333)
  98. server = FTPServer((ftp_config['ip'], ftp_config['port']), handler)
  99. server.max_cons = 2048
  100. server.serve_forever()
  101. if __name__ == '__main__':
  102. main()