server.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #!/usr/bin/env python
  2. import time
  3. import socket
  4. import json
  5. import re
  6. import psutil
  7. import platform
  8. from subprocess import check_output
  9. from threading import Thread
  10. from wspy import websocket, Frame, OPCODE_TEXT, WebkitDeflateFrame
  11. def osname():
  12. if platform.system() == 'Linux':
  13. return 'Linux %s %s (%s)' % platform.dist()
  14. #return '%s %s' % (platform.system(), platform.release())
  15. return platform.platform()
  16. def stats():
  17. # OS identification
  18. yield 'osname', osname()
  19. # Uptime
  20. yield 'uptime', time.time() - psutil.get_boot_time()
  21. # CPU temperature
  22. try:
  23. temps = []
  24. for line in check_output('sensors').split('\n'):
  25. m = re.match(r'^Core \d+:\s*\+(\d+\.\d+)', line)
  26. if m:
  27. temps.append(float(m.group(1)))
  28. assert len(temps) == psutil.NUM_CPUS
  29. yield 'temps', temps
  30. except:
  31. pass
  32. # CPU usage
  33. cpu = psutil.cpu_times()
  34. total = sum(cpu)
  35. yield 'cpu_usage', round(float(total - cpu.idle) / total * 100, 2)
  36. # Memory usage
  37. mem = psutil.phymem_usage()
  38. yield 'memory', (mem.used, mem.total)
  39. # Disk usage
  40. disk = psutil.disk_usage('/')
  41. yield 'disk', (disk.used, disk.total)
  42. if __name__ == '__main__':
  43. server = websocket(extensions=[WebkitDeflateFrame()])
  44. server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  45. server.bind(('', 12345))
  46. server.listen(5)
  47. clients = []
  48. def connect():
  49. while True:
  50. sock, address = server.accept()
  51. print 'Client connected at %s:%d' % address
  52. clients.append(sock)
  53. t = Thread(target=connect)
  54. t.daemon = True
  55. t.start()
  56. try:
  57. while True:
  58. if not clients:
  59. time.sleep(6)
  60. continue
  61. status = Frame(OPCODE_TEXT, json.dumps(dict(stats())))
  62. for client in list(clients):
  63. try:
  64. client.send(status)
  65. except socket.error:
  66. print 'Client disconnected'
  67. clients.remove(client)
  68. time.sleep(1)
  69. except KeyboardInterrupt:
  70. print 'Stopping server'
  71. server.close()