httpserver.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #
  2. # SPDX-License-Identifier: MIT
  3. #
  4. import http.server
  5. import multiprocessing
  6. import os
  7. import traceback
  8. import signal
  9. import logging
  10. from socketserver import ThreadingMixIn
  11. class HTTPServer(ThreadingMixIn, http.server.HTTPServer):
  12. def server_start(self, root_dir, logger):
  13. os.chdir(root_dir)
  14. self.serve_forever()
  15. class HTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
  16. def log_message(self, format_str, *args):
  17. pass
  18. class HTTPService(object):
  19. def __init__(self, root_dir, host='', port=0, logger=None):
  20. self.root_dir = root_dir
  21. self.host = host
  22. self.port = port
  23. if not logger:
  24. logger = logging.getLogger()
  25. self.logger = logger
  26. def start(self):
  27. print(self.root_dir)
  28. if not os.path.exists(self.root_dir):
  29. self.logger.info("Not starting HTTPService for directory %s which doesn't exist" % (self.root_dir))
  30. return
  31. self.server = HTTPServer((self.host, self.port), HTTPRequestHandler)
  32. if self.port == 0:
  33. self.port = self.server.server_port
  34. self.process = multiprocessing.Process(target=self.server.server_start, args=[self.root_dir, self.logger])
  35. # The signal handler from testimage.bbclass can cause deadlocks here
  36. # if the HTTPServer is terminated before it can restore the standard
  37. #signal behaviour
  38. orig = signal.getsignal(signal.SIGTERM)
  39. signal.signal(signal.SIGTERM, signal.SIG_DFL)
  40. self.process.start()
  41. signal.signal(signal.SIGTERM, orig)
  42. if self.logger:
  43. self.logger.info("Started HTTPService on %s:%s" % (self.host, self.port))
  44. def stop(self):
  45. if hasattr(self, "server"):
  46. self.server.server_close()
  47. if hasattr(self, "process"):
  48. self.process.terminate()
  49. self.process.join()
  50. if self.logger:
  51. self.logger.info("Stopped HTTPService on %s:%s" % (self.host, self.port))