server.py 2.4 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. 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. distro, version, codename = platform.dist()
  14. name = 'Linux - %s %s' % (distro, version)
  15. if codename:
  16. name += ' (%s)' % codename
  17. return name
  18. #return '%s %s' % (platform.system(), platform.release())
  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 'Client disconnected'
  56. clients.remove(client)
  57. time.sleep(1)
  58. #server = websocket(extensions=[WebkitDeflateFrame()])
  59. server = websocket()
  60. server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  61. server.bind(('', 8100))
  62. server.listen(5)
  63. t = Thread(target=update)
  64. t.daemon = True
  65. try:
  66. while True:
  67. try:
  68. sock, address = server.accept()
  69. except:
  70. continue
  71. print 'Client connected at %s:%d' % address
  72. clients.append(sock)
  73. if not t.is_alive():
  74. t = Thread(target=update)
  75. t.daemon = True
  76. t.start()
  77. except KeyboardInterrupt:
  78. print 'Stopping server'
  79. server.close()