clt_server.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  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. def __init__(self, address, mgr_chan, cld_chan):
  9. self.address = address
  10. self.mgr_chan = mgr_chan
  11. self.cld_chan = cld_chan
  12. try:
  13. os.unlink(self.address)
  14. except OSError:
  15. if os.path.exists(self.address):
  16. raise Exception("file exists: {}".format(self.address))
  17. self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  18. self.sock.bind(self.address)
  19. os.chmod(address, 0700)
  20. print("Control Server listening on: {}".format(self.address))
  21. self.sock.listen(1)
  22. def serve_forever(self):
  23. while 1:
  24. conn, _ = self.sock.accept()
  25. try:
  26. length = struct.unpack('!H', conn.recv(2))[0]
  27. content = conn.recv(length)
  28. cmd = json.loads(content)
  29. self.mgr_chan.put(("CMD", (cmd['cmd'], cmd['target'])))
  30. except Exception as e:
  31. print(e)
  32. res = "Invalid Command"
  33. else:
  34. res = self.cld_chan.get()
  35. conn.sendall(struct.pack('!H', len(res)))
  36. conn.sendall(res)
  37. conn.close()
  38. def run_control_server(address, mgr_chan, cld_chan):
  39. cs = ControlServer(address, mgr_chan, cld_chan)
  40. cs.serve_forever()
  41. # vim: ts=4 sw=4 sts=4 expandtab