server.py 2.3 KB

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