server.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #!/usr/bin/env python
  2. import time
  3. import socket
  4. import json
  5. import re
  6. from subprocess import check_output
  7. from threading import Thread
  8. from twspy import websocket, Frame, OPCODE_TEXT, WebkitDeflateFrame
  9. def stats():
  10. # Release
  11. dist, codename = check_output(['lsb_release', '-sdc']).rstrip().split('\n')
  12. yield 'release', '%s (%s)' % (dist, codename)
  13. # Uptime
  14. with open('/proc/uptime', 'r') as f:
  15. uptime, idletime = map(float, f.read().split(' '))
  16. yield 'uptime', uptime
  17. # CPU temperature
  18. try:
  19. temps = []
  20. for line in check_output('sensors').split('\n'):
  21. m = re.match(r'^Core \d+:\s*\+(\d+\.\d+)', line)
  22. if m:
  23. temps.append(float(m.group(1)))
  24. yield 'temps', temps
  25. except:
  26. pass
  27. # CPU usage
  28. with open('/proc/stat', 'r') as f:
  29. line = f.readlines()[0].rstrip().split()
  30. assert line[0] == 'cpu'
  31. numbers = map(int, line[1:])
  32. total = sum(numbers)
  33. idle = numbers[3]
  34. yield 'cpu_usage', round(float(total - idle) / total * 100, 2)
  35. # Memory usage
  36. with open('/proc/meminfo', 'r') as f:
  37. for line in f.readlines():
  38. if line.startswith('MemTotal'):
  39. assert line.endswith('kB\n')
  40. total = int(line.split()[1])
  41. elif line.startswith('MemFree'):
  42. assert line.endswith('kB\n')
  43. used = total - int(line.split()[1])
  44. yield 'memory', (used, total)
  45. break
  46. # Disk usage
  47. for line in check_output('df').split('\n'):
  48. parts = line.split()
  49. if parts[0].startswith('/dev/') and parts[5] == '/':
  50. used, avail = map(int, parts[2:4])
  51. yield 'disk', (used, used + avail)
  52. break
  53. if __name__ == '__main__':
  54. server = websocket(extensions=[WebkitDeflateFrame()])
  55. server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  56. server.bind(('', 12345))
  57. server.listen(5)
  58. clients = []
  59. def connect():
  60. while True:
  61. sock, address = server.accept()
  62. print 'Client connected at %s:%d' % address
  63. clients.append(sock)
  64. t = Thread(target=connect)
  65. t.daemon = True
  66. t.start()
  67. try:
  68. while True:
  69. if not clients:
  70. time.sleep(6)
  71. #time.sleep(.1)
  72. continue
  73. status = Frame(OPCODE_TEXT, json.dumps(dict(stats())))
  74. for client in list(clients):
  75. try:
  76. client.send(status)
  77. except socket.error:
  78. print 'Client disconnected'
  79. clients.remove(client)
  80. time.sleep(1)
  81. except KeyboardInterrupt:
  82. print 'Stopping server'
  83. server.close()