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.

85 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. return
  54. else:
  55. self.send_response(400)
  56. self.end_headers()
  57. resp = "Action not recognized".encode()
  58. self.wfile.write(resp)
  59. return
  60. self.send_response(201)
  61. self.end_headers()
  62. resp = json.dumps(ret).encode()
  63. self.wfile.write(resp)
  64. class clicker_server(server.HTTPServer):
  65. def __init__(self,location):
  66. self.manager = clicker_manager()
  67. self.serve = True
  68. super().__init__(location,handler)
  69. def serve_forever(self):
  70. while self.serve:
  71. self.handle_request()
  72. self.socket.close()
  73. def start_server(hostname,port):
  74. httpd = clicker_server((hostname,args.port))
  75. httpd.serve_forever()
  76. if __name__ == "__main__":
  77. parser = argparse.ArgumentParser()
  78. parser.add_argument('-p','--port',type=int,default=5138)
  79. args = parser.parse_args()
  80. start_server('localhost',args.port)