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.

100 lines
3.2 KiB

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