clt_server.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #!/usr/bin/env python2
  2. # -*- coding:utf-8 -*-
  3. import socket
  4. import os
  5. import json
  6. import struct
  7. class ControlServer(object):
  8. valid_commands = set((
  9. "start", "stop", "restart", "status", "log",
  10. ))
  11. def __init__(self, address, mgr_chan, cld_chan):
  12. self.address = address
  13. self.mgr_chan = mgr_chan
  14. self.cld_chan = cld_chan
  15. try:
  16. os.unlink(self.address)
  17. except OSError:
  18. if os.path.exists(self.address):
  19. raise Exception("file exists: {}".format(self.address))
  20. self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  21. self.sock.bind(self.address)
  22. os.chmod(address, 0o700)
  23. print("Control Server listening on: {}".format(self.address))
  24. self.sock.listen(1)
  25. def serve_forever(self):
  26. while 1:
  27. conn, _ = self.sock.accept()
  28. try:
  29. length = struct.unpack('!H', conn.recv(2))[0]
  30. content = conn.recv(length)
  31. cmd = json.loads(content)
  32. if cmd['cmd'] not in self.valid_commands:
  33. raise Exception("Invalid Command")
  34. self.mgr_chan.put(("CMD", (cmd['cmd'], cmd['target'], cmd["kwargs"])))
  35. except Exception as e:
  36. print(e)
  37. res = "Invalid Command"
  38. else:
  39. res = self.cld_chan.get()
  40. conn.sendall(struct.pack('!H', len(res)))
  41. conn.sendall(res)
  42. conn.close()
  43. def run_control_server(address, mgr_chan, cld_chan):
  44. cs = ControlServer(address, mgr_chan, cld_chan)
  45. cs.serve_forever()
  46. # vim: ts=4 sw=4 sts=4 expandtab