server.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #!/usr/bin/env python
  2. import time
  3. import socket
  4. import json
  5. import subprocess
  6. import re
  7. from threading import Thread
  8. from twspy import websocket, TextMessage
  9. def status_message():
  10. with open('/proc/uptime', 'r') as f:
  11. uptime, idletime = map(float, f.read().split(' '))
  12. temps = []
  13. for line in subprocess.check_output('sensors').split('\n'):
  14. m = re.match(r'^Core \d+:\s*\+(\d+\.\d+)', line)
  15. if m:
  16. temps.append(float(m.group(1)))
  17. cpu_idle = float(subprocess.check_output('mpstat').rsplit(' ', 1)[-1])
  18. data = {
  19. 'uptime': uptime,
  20. 'temps': temps,
  21. 'cpu_usage': max(round(100 - cpu_idle, 2), 0)
  22. }
  23. return TextMessage(json.dumps(data))
  24. if __name__ == '__main__':
  25. server = websocket()
  26. server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  27. server.bind(('', 12345))
  28. server.listen(5)
  29. clients = []
  30. def connect():
  31. while True:
  32. sock, address = server.accept()
  33. print 'Client connected at %s:%d' % address
  34. clients.append(sock)
  35. t = Thread(target=connect)
  36. t.daemon = True
  37. t.start()
  38. try:
  39. while True:
  40. if len(clients):
  41. status = status_message()
  42. for client in list(clients):
  43. try:
  44. client.send(status.frame())
  45. except socket.error:
  46. print 'Client disconnected'
  47. clients.remove(client)
  48. else:
  49. time.sleep(5)
  50. time.sleep(1)
  51. except KeyboardInterrupt:
  52. print 'Stopping server'
  53. server.close()