server.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. cpu = psutil.cpu_times()
  38. total = sum(cpu)
  39. yield 'cpu_usage', round(float(total - cpu.idle) / total * 100, 2)
  40. # Memory usage
  41. mem = psutil.phymem_usage()
  42. yield 'memory', (mem.used, mem.total)
  43. # Disk usage
  44. disk = psutil.disk_usage('/')
  45. yield 'disk', (disk.used, disk.total)
  46. if __name__ == '__main__':
  47. server = websocket(extensions=[WebkitDeflateFrame()])
  48. server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  49. server.bind(('', 8100))
  50. server.listen(5)
  51. clients = []
  52. def connect():
  53. while True:
  54. sock, address = server.accept()
  55. print 'Client connected at %s:%d' % address
  56. clients.append(sock)
  57. t = Thread(target=connect)
  58. t.daemon = True
  59. t.start()
  60. try:
  61. while True:
  62. if not clients:
  63. time.sleep(6)
  64. continue
  65. status = Frame(OPCODE_TEXT, json.dumps(dict(stats())))
  66. for client in list(clients):
  67. try:
  68. client.send(status)
  69. except socket.error:
  70. print 'Client disconnected'
  71. clients.remove(client)
  72. time.sleep(1)
  73. except KeyboardInterrupt:
  74. print 'Stopping server'
  75. server.close()