You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
2.7 KiB

7 years ago
7 years ago
  1. from clicker_control import clicker_manager
  2. from http import server
  3. from threading import Thread
  4. from urllib.parse import urlparse,parse_qs
  5. import argparse
  6. import json
  7. class handler(server.BaseHTTPRequestHandler):
  8. def do_POST(self):
  9. params = parse_qs(urlparse(self.path).query)
  10. action = params['action'][0]
  11. print(action)
  12. ret = {}
  13. if action == 'on':
  14. self.server.manager.turn_on()
  15. ret['status'] = 'on'
  16. elif action == 'off':
  17. self.server.manager.turn_off()
  18. ret['status'] = 'off'
  19. elif action == 'toggle':
  20. self.server.manager.toggle()
  21. if self.server.manager.on:
  22. ret['status'] = 'on'
  23. else:
  24. ret['status'] = 'off'
  25. elif action == 'kill':
  26. self.server.manager.kill()
  27. self.send_response(204)
  28. self.end_headers()
  29. print('server being killed')
  30. self.server.serve = False
  31. return
  32. elif action == 'set':
  33. try:
  34. state = params['state'][0]
  35. assert(state in ('on','off'))
  36. self.server.manager.on = state == 'on'
  37. resp='Toggle state set to {}'.format(state).encode()
  38. self.send_response(201)
  39. self.end_headers()
  40. self.wfile.write(resp)
  41. return
  42. except AssertionError:
  43. self.send_response(400)
  44. self.end_headers()
  45. resp = "State must either be `on` or `off`".encode()
  46. self.wfile.write(resp)
  47. return
  48. except KeyError:
  49. self.send_response(400)
  50. self.end_headers()
  51. resp = "No state specified".encode()
  52. self.wfile.write(resp)
  53. else:
  54. self.send_response(400)
  55. self.end_headers()
  56. resp = "Action not recognized".encode()
  57. self.wfile.write(resp)
  58. return
  59. self.send_response(201)
  60. self.end_headers()
  61. resp = json.dumps(ret).encode()
  62. self.wfile.write(resp)
  63. class clicker_server(server.HTTPServer):
  64. def __init__(self,location):
  65. self.manager = clicker_manager()
  66. self.serve = True
  67. super().__init__(location,handler)
  68. def serve_forever(self):
  69. while self.serve:
  70. self.handle_request()
  71. self.socket.close()
  72. def start_server(hostname,port):
  73. httpd = clicker_server((hostname,args.port))
  74. httpd.serve_forever()
  75. if __name__ == "__main__":
  76. parser = argparse.ArgumentParser()
  77. parser.add_argument('-p','--port',type=int,default=5138)
  78. args = parser.parse_args()
  79. start_server('localhost',args.port)