server.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #!/usr/bin/python
  2. from __future__ import print_function
  3. import datetime
  4. import socket
  5. import random, string
  6. import daemon, getopt, sys
  7. def myrandom(length):
  8. return ''.join(random.choice(string.lowercase) for i in range(length))
  9. def server(port, bindTo):
  10. BUFFER_SIZE = 1024
  11. s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
  12. s.bind((bindTo, port))
  13. s.listen(1)
  14. print('DebugReport server listening on [{0}]:{1}'.format(bindTo, port))
  15. while 1:
  16. conn, addr = s.accept()
  17. report_id = myrandom(10)
  18. filename = 'reports/' + datetime.date.today().strftime('%Y-%m-%d_') + report_id + '.gz'
  19. f = open(filename, 'w')
  20. while 1:
  21. data = conn.recv(BUFFER_SIZE)
  22. if not data: break
  23. f.write(data) # python will convert \n to os.linesep
  24. f.flush()
  25. f.close()
  26. # send reply to reportee
  27. conn.send(report_id)
  28. conn.close()
  29. print('new report "{0}" from [{2}]:{3} stored as "{1}"'.format(report_id, filename, addr[0], addr[1]))
  30. pass
  31. if __name__ == '__main__':
  32. try:
  33. opts, args = getopt.getopt(sys.argv[1:], "dp:b:", ["do-not-daemonize", "port", "bind-to"])
  34. except:
  35. print ('Unrecognized option')
  36. sys.exit(2)
  37. daemonize = True
  38. port = 1337
  39. bindTo = '::'
  40. for opt, arg in opts:
  41. if opt in ("-d", "--do-not-daemonize"):
  42. daemonize = False
  43. elif opt in ("-p", "--port"):
  44. port = int(arg)
  45. elif opt in ("-b", "--bind-to"):
  46. try:
  47. socket.inet_aton(arg)
  48. bindTo = str(arg)
  49. except:
  50. print('Invalid IPAdress. Using default ::')
  51. else:
  52. assert False
  53. if daemonize == False:
  54. server(port, bindTo)
  55. else:
  56. with daemon.DaemonContext():
  57. server(port, bindTo)