# -*- coding: utf-8 -*-
# Support Python Version 2.7 to 3.7
# Update by: https://github.com/CokeMine/ServerStatus-Hotaru
import socket
import time
import re
import os
import json
import subprocess
from collections import deque
SERVER = "127.0.0.1"
PORT = 35601
USER = "USER"
PASSWORD = "USER_PASSWORD"
INTERVAL = 1 # 更新间隔,单位:秒
def check_interface(net_name):
net_name = net_name.strip()
invalid_name = ['lo', 'tun', 'kube', 'docker', 'vmbr', 'br-', 'vnet', 'veth']
return not any(name in net_name for name in invalid_name)
def get_uptime():
with open('/proc/uptime', 'r') as f:
uptime = f.readline().split('.')
return int(uptime[0])
def get_memory():
re_parser = re.compile(r'(\S*):\s*(\d*)\s*kB')
result = dict()
for line in open('/proc/meminfo'):
match = re_parser.match(line)
if match:
result[match.group(1)] = int(match.group(2))
mem_total = float(result['MemTotal'])
mem_free = float(result['MemFree'])
buffers = float(result['Buffers'])
cached = float(result['Cached'])
mem_used = mem_total - (mem_free + buffers + cached)
swap_total = float(result['SwapTotal'])
swap_free = float(result['SwapFree'])
return int(mem_total), int(mem_used), int(swap_total), int(swap_free)
def get_hdd():
p = subprocess.check_output(
['df', '-Tlm', '--total', '-t', 'ext4', '-t', 'ext3', '-t', 'ext2', '-t', 'reiserfs', '-t', 'jfs', '-t', 'ntfs',
'-t', 'fat32', '-t', 'btrfs', '-t', 'fuseblk', '-t', 'zfs', '-t', 'simfs', '-t', 'xfs']).decode('utf-8')
total = p.splitlines()[-1]
used = total.split()[3]
size = total.split()[2]
return int(size), int(used)
def get_load():
return round(os.getloadavg()[0], 1)
def get_cpu_time():
with open('/proc/stat', 'r') as stat_file:
time_list = stat_file.readline().split()[1:]
time_list = list(map(int, time_list))
return sum(time_list), time_list[3]
def get_cpu():
old_total, old_idle = get_cpu_time()
time.sleep(INTERVAL)
total, idle = get_cpu_time()
return round(100 - float(idle - old_idle) / (total - old_total) * 100.00, 1)
def get_traffic_vnstat():
vnstat = os.popen('vnstat --oneline b').readline()
if "Not enough data available yet" in vnstat:
return 0, 0
v_data = vnstat.split(';')
net_in = int(v_data[8])
net_out = int(v_data[9])
return net_in, net_out
class Network:
def __init__(self):
self.rx = deque(maxlen=10)
self.tx = deque(maxlen=10)
self._get_traffic()
def _get_traffic(self):
net_in = 0
net_out = 0
re_parser = re.compile(r'([^\s]+):[\s]*(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+('
r'\d+)\s+(\d+)\s+(\d+)')
with open('/proc/net/dev') as f:
for line in f.readlines():
net_info = re_parser.findall(line)
if net_info:
if check_interface(net_info[0][0]):
net_in += int(net_info[0][1])
net_out += int(net_info[0][9])
self.rx.append(net_in)
self.tx.append(net_out)
def get_speed(self):
self._get_traffic()
avg_rx = 0
avg_tx = 0
queue_len = len(self.rx)
for x in range(queue_len - 1):
avg_rx += self.rx[x + 1] - self.rx[x]
avg_tx += self.tx[x + 1] - self.tx[x]
avg_rx = int(avg_rx / queue_len / INTERVAL)
avg_tx = int(avg_tx / queue_len / INTERVAL)
return avg_rx, avg_tx
def get_traffic(self):
queue_len = len(self.rx)
return self.rx[queue_len - 1], self.tx[queue_len - 1]
def get_network(ip_version):
if ip_version == 4:
host = 'ipv4.google.com'
elif ip_version == 6:
host = 'ipv6.google.com'
else:
return False
try:
socket.create_connection((host, 80), 2).close()
return True
except Exception:
return False
if __name__ == '__main__':
socket.setdefaulttimeout(30)
while True:
try:
print('Connecting...')
s = socket.create_connection((SERVER, PORT))
data = s.recv(1024).decode()
if data.find('Authentication required') > -1:
s.send((USER + ':' + PASSWORD + '\n').encode('utf-8'))
data = s.recv(1024).decode()
if data.find('Authentication successful') < 0:
print(data)
raise socket.error
else:
print(data)
raise socket.error
print(data)
if data.find('You are connecting via') < 0:
data = s.recv(1024).decode()
print(data)
timer = 0
check_ip = 0
if data.find('IPv4') > -1:
check_ip = 6
elif data.find('IPv6') > -1:
check_ip = 4
else:
print(data)
raise socket.error
traffic = Network()
while True:
CPU = get_cpu()
NetRx, NetTx = traffic.get_speed()
NET_IN, NET_OUT = traffic.get_traffic()
Uptime = get_uptime()
Load = get_load()
MemoryTotal, MemoryUsed, SwapTotal, SwapFree = get_memory()
HDDTotal, HDDUsed = get_hdd()
array = {}
if not timer:
array['online' + str(check_ip)] = get_network(check_ip)
timer = 150
else:
timer -= 1 * INTERVAL
array['uptime'] = Uptime
array['load'] = Load
array['memory_total'] = MemoryTotal
array['memory_used'] = MemoryUsed
array['swap_total'] = SwapTotal
array['swap_used'] = SwapTotal - SwapFree
array['hdd_total'] = HDDTotal
array['hdd_used'] = HDDUsed
array['cpu'] = CPU
array['network_rx'] = NetRx
array['network_tx'] = NetTx
array['network_in'] = NET_IN
array['network_out'] = NET_OUT
s.send(("update " + json.dumps(array) + '\n').encode('utf-8'))
except KeyboardInterrupt:
raise
except socket.error:
print('Disconnected...')
# keep on trying after a disconnect
if 's' in locals().keys():
del s
time.sleep(3)
except Exception as e:
print('Caught Exception:', e)
if 's' in locals().keys():
del s
time.sleep(3)