zftpd.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #!/usr/bin/ python
  2. # -*- coding: utf-8 -*-
  3. import sys
  4. import os
  5. import traceback
  6. import time
  7. import ConfigParser
  8. from threading import Thread as thread
  9. from pyftpdlib import ftpserver
  10. from daemonlib import Daemon
  11. now = lambda: time.strftime("[%Y-%b-%d %H:%M:%S]")
  12. def standard_logger(msg):
  13. f1.write("%s %s\n" %(now(), msg))
  14. f1.flush()
  15. def line_logger(msg):
  16. f2.write("%s %s\n" %(now(), msg))
  17. f2.flush()
  18. class UpConf(thread):
  19. def run(self):
  20. while 1:
  21. time.sleep(ttl)
  22. user=[]
  23. __user_table = {}
  24. conf=ConfigParser.ConfigParser()
  25. conf.read(currdir+currname+".conf")
  26. sections=conf.sections()
  27. for i in sections:
  28. if i != '!ftpd':
  29. if not os.path.isdir(conf.get(i,'dir')):
  30. continue
  31. else:
  32. user.append(i)
  33. for i in user:
  34. __dir=conf.get(i,'dir')
  35. __password=conf.get(i,'password')
  36. __power=conf.get(i,'access')
  37. __dir = os.path.realpath(__dir)
  38. authorizer._check_permissions(i, __power)
  39. dic = {'pwd': str(__password),
  40. 'home': __dir,
  41. 'perm': __power,
  42. 'operms': {},
  43. 'msg_login': str("Login successful."),
  44. 'msg_quit': str("Goodbye.")
  45. }
  46. __user_table[i] = dic
  47. authorizer.user_table=__user_table
  48. def mainfunc():
  49. global authorizer
  50. global ttl
  51. user=[]
  52. __user_table = {}
  53. addr=("",21)
  54. ttl=60
  55. ftpserver.log = standard_logger
  56. ftpserver.logline = line_logger
  57. authorizer = ftpserver.DummyAuthorizer()
  58. conf=ConfigParser.ConfigParser()
  59. conf.read(currdir+currname+".conf")
  60. sections=conf.sections()
  61. global f1,f2
  62. for i in sections:
  63. if i != '!ftpd':
  64. if not os.path.isdir(conf.get(i,'dir')):
  65. print('No such directory: "%s"' % conf.get(i,'dir'))
  66. continue
  67. else:
  68. user.append(i)
  69. if i == '!ftpd':
  70. addr=(conf.get('!ftpd','host'),int(conf.get('!ftpd','port')))
  71. ttl=int(conf.get('!ftpd','ttl'))
  72. _servername=conf.get('!ftpd','servername')
  73. sys.stdout.write("Server Name: %s\n"%_servername)
  74. sys.stdout.flush()
  75. _maxcon=int(conf.get('!ftpd','maxconnect'))
  76. _maxconperu=int(conf.get('!ftpd','maxconperuser'))
  77. f1 = open(conf.get('!ftpd','logfile'), 'a')
  78. f2 = open(conf.get('!ftpd','lineslogfile'), 'a')
  79. if ttl==0:ttl=60
  80. for i in user:
  81. __dir=conf.get(i,'dir')
  82. __password=conf.get(i,'password')
  83. __power=conf.get(i,'access')
  84. __dir = os.path.realpath(__dir)
  85. authorizer._check_permissions(i, __power)
  86. dic = {'pwd': str(__password),
  87. 'home': __dir,
  88. 'perm': __power,
  89. 'operms': {},
  90. 'msg_login': str("Login successful."),
  91. 'msg_quit': str("Goodbye.")
  92. }
  93. __user_table[i] = dic
  94. authorizer.user_table=__user_table
  95. ftp_handler = ftpserver.FTPHandler
  96. ftp_handler.authorizer = authorizer
  97. ftp_handler.banner = _servername
  98. ftpd = ftpserver.FTPServer(addr, ftp_handler)
  99. ftpd.max_cons = _maxcon
  100. ftpd.max_cons_per_ip = _maxconperu
  101. UpConf().start()
  102. line_logger('~~~~~~~~~Serve forever......')
  103. ftpd.serve_forever()
  104. class MyDaemon(Daemon):
  105. def _run(self):
  106. #while True:
  107. reload(sys)
  108. sys.setdefaultencoding('utf-8')
  109. #mainfunc()
  110. try:
  111. mainfunc()
  112. except Exception,e:
  113. time.sleep(1)
  114. s=traceback.format_exc()
  115. sys.stderr.write("\n"+now()+"Application was shutdown by a fatal error.\n%s\n"%s)
  116. sys.stderr.flush()
  117. sys.stdout.write("A Server Session End. Restart a new session...\n")
  118. sys.stdout.flush()
  119. if __name__ == '__main__':
  120. global currdir,currname
  121. if len(sys.argv) == 2:
  122. currdir=os.getcwd()
  123. currname='zftpd'
  124. daemon = MyDaemon('/var/run/'+currname+'.pid',currdir+currname+'.in',currdir+currname+'.out',currdir+currname+'.err')
  125. if len(sys.argv) == 3:
  126. currdir=sys.argv[2]
  127. currname='zftpd'
  128. daemon = MyDaemon('/var/run/'+currname+'.pid',currdir+currname+'.in',currdir+currname+'.out',currdir+currname+'.err')
  129. else:
  130. print "Unknown command"
  131. print "usage: %s start|stop|restart [path2server]" % sys.argv[0]
  132. print "If you use sysv script to start this server, must specified path2server."
  133. sys.exit(2)
  134. if 'start' == sys.argv[1]:
  135. print "Starting... [\033[1;32;40mOK\033[0m]"
  136. daemon.start()
  137. elif 'stop' == sys.argv[1]:
  138. daemon.stop()
  139. print "Stopping... [\033[1;32;40mOK\033[0m]"
  140. elif 'restart' == sys.argv[1]:
  141. print "Stopping... [\033[1;32;40mOK\033[0m]"
  142. print "Starting... [\033[1;32;40mOK\033[0m]"
  143. daemon.restart()
  144. else:
  145. print "Unknown command"
  146. print "usage: %s start|stop|restart" % sys.argv[0]
  147. print "If you use sysv script to start this server, must specified path2server."
  148. sys.exit(2)
  149. sys.exit(0)