| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- #!/usr/bin/env python
- import time
- import socket
- import json
- import re
- import psutil
- import platform
- from subprocess import check_output
- from threading import Thread
- from wspy import websocket, Frame, OPCODE_TEXT, WebkitDeflateFrame
- def osname():
- if platform.system() == 'Linux':
- distro, version, codename = platform.dist()
- name = 'Linux - %s %s' % (distro, version)
- if codename:
- name += ' (%s)' % codename
- return name
- #return '%s %s' % (platform.system(), platform.release())
- return platform.platform()
- def stats():
- # OS identification
- yield 'osname', osname()
- # Uptime
- yield 'uptime', time.time() - psutil.get_boot_time()
- # CPU temperature
- try:
- temps = []
- for line in check_output('sensors').split('\n'):
- m = re.match(r'^Core \d+:\s*\+(\d+\.\d+)', line)
- if m:
- temps.append(float(m.group(1)))
- assert len(temps) == psutil.NUM_CPUS
- yield 'temps', temps
- except:
- pass
- # CPU usage
- cpu = psutil.cpu_times()
- total = sum(cpu)
- yield 'cpu_usage', round(float(total - cpu.idle) / total * 100, 2)
- # Memory usage
- mem = psutil.phymem_usage()
- yield 'memory', (mem.used, mem.total)
- # Disk usage
- disk = psutil.disk_usage('/')
- yield 'disk', (disk.used, disk.total)
- if __name__ == '__main__':
- clients = []
- def update():
- while True:
- if not clients:
- break
- status = Frame(OPCODE_TEXT, json.dumps(dict(stats())))
- for client in list(clients):
- try:
- client.send(status)
- except socket.error:
- print 'Client disconnected'
- clients.remove(client)
- time.sleep(1)
- server = websocket(extensions=[WebkitDeflateFrame()])
- server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- server.bind(('', 8100))
- server.listen(5)
- t = Thread(target=update)
- t.daemon = True
- try:
- while True:
- sock, address = server.accept()
- print 'Client connected at %s:%d' % address
- clients.append(sock)
- if not t.is_alive():
- t = Thread(target=update)
- t.daemon = True
- t.start()
- except KeyboardInterrupt:
- print 'Stopping server'
- server.close()
|