| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- #!/usr/bin/env python
- import time
- import socket
- import json
- import re
- from subprocess import check_output
- from threading import Thread
- from twspy import websocket, Frame, OPCODE_TEXT, WebkitDeflateFrame
- def stats():
- # Release
- dist, codename = check_output(['lsb_release', '-sdc']).rstrip().split('\n')
- yield 'release', '%s (%s)' % (dist, codename)
- # Uptime
- with open('/proc/uptime', 'r') as f:
- uptime, idletime = map(float, f.read().split(' '))
- yield 'uptime', uptime
- # 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)))
- yield 'temps', temps
- except:
- pass
- # CPU usage
- with open('/proc/stat', 'r') as f:
- line = f.readlines()[0].rstrip().split()
- assert line[0] == 'cpu'
- numbers = map(int, line[1:])
- total = sum(numbers)
- idle = numbers[3]
- yield 'cpu_usage', round(float(total - idle) / total * 100, 2)
- # Memory usage
- with open('/proc/meminfo', 'r') as f:
- for line in f:
- if line.startswith('MemTotal'):
- assert line.endswith('kB\n')
- total = int(line.split()[1])
- elif line.startswith('MemFree'):
- assert line.endswith('kB\n')
- used = total - int(line.split()[1])
- yield 'memory', (used, total)
- break
- # Disk usage
- for line in check_output('df').split('\n'):
- parts = line.split()
- if parts[0].startswith('/dev/') and parts[5] == '/':
- used, avail = map(int, parts[2:4])
- yield 'disk', (used, used + avail)
- break
- if __name__ == '__main__':
- server = websocket(extensions=[WebkitDeflateFrame()])
- server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- server.bind(('', 12345))
- server.listen(5)
- clients = []
- def connect():
- while True:
- sock, address = server.accept()
- print 'Client connected at %s:%d' % address
- clients.append(sock)
- t = Thread(target=connect)
- t.daemon = True
- t.start()
- try:
- while True:
- if not clients:
- time.sleep(6)
- continue
- 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)
- except KeyboardInterrupt:
- print 'Stopping server'
- server.close()
|