123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 |
- #!/usr/bin/env python
- # coding: utf-8
- # Update by : https://github.com/cppla/ServerStatus
- # 依赖于psutil跨平台库
- # 支持Python版本:2.7 to 3.7
- # 支持操作系统: Linux, Windows, OSX, Sun Solaris, FreeBSD, OpenBSD and NetBSD, both 32-bit and 64-bit architectures
- # 时间: 20200407
- # 说明: 默认情况下修改server和user就可以了。丢包率监测方向可以自定义,例如:CU = "www.facebook.com"。
- SERVER = "127.0.0.1"
- USER = "s01"
- PORT = 35601
- PASSWORD = "USER_DEFAULT_PASSWORD"
- INTERVAL = 1
- PORBEPORT = 80
- CU = "cu.tz.cloudcpp.com"
- CT = "ct.tz.cloudcpp.com"
- CM = "cm.tz.cloudcpp.com"
- import socket
- import time
- import timeit
- import os
- import json
- import psutil
- import sys
- import threading
- def get_uptime():
- return int(time.time() - psutil.boot_time())
- def get_memory():
- Mem = psutil.virtual_memory()
- return int(Mem.total / 1024.0), int(Mem.used / 1024.0)
- def get_swap():
- Mem = psutil.swap_memory()
- return int(Mem.total/1024.0), int(Mem.used/1024.0)
- def get_hdd():
- valid_fs = [ "ext4", "ext3", "ext2", "reiserfs", "jfs", "btrfs", "fuseblk", "zfs", "simfs", "ntfs", "fat32", "exfat", "xfs" ]
- disks = dict()
- size = 0
- used = 0
- for disk in psutil.disk_partitions():
- if not disk.device in disks and disk.fstype.lower() in valid_fs:
- disks[disk.device] = disk.mountpoint
- for disk in disks.values():
- usage = psutil.disk_usage(disk)
- size += usage.total
- used += usage.used
- return int(size/1024.0/1024.0), int(used/1024.0/1024.0)
- def get_cpu():
- return psutil.cpu_percent(interval=INTERVAL)
- def liuliang():
- NET_IN = 0
- NET_OUT = 0
- net = psutil.net_io_counters(pernic=True)
- for k, v in net.items():
- if 'lo' in k or 'tun' in k \
- or 'docker' in k or 'veth' in k \
- or 'br-' in k or 'vmbr' in k \
- or 'vnet' in k or 'kube' in k:
- continue
- else:
- NET_IN += v[1]
- NET_OUT += v[0]
- return NET_IN, NET_OUT
- def tupd():
- '''
- tcp, udp, process, thread count: for view ddcc attack , then send warning
- :return:
- '''
- if 'linux' in sys.platform:
- t = int(os.popen('ss -t|wc -l').read()[:-1])-1
- u = int(os.popen('ss -u|wc -l').read()[:-1])-1
- p = int(os.popen('ps -ef|wc -l').read()[:-1])-2
- d = int(os.popen('ps -eLf|wc -l').read()[:-1])-2
- else:
- t = int(os.popen('netstat -an|find "TCP" /c').read()[:-1])-1
- u = int(os.popen('netstat -an|find "UDP" /c').read()[:-1])-1
- p = len(psutil.pids())
- d = 0
- # cpu is high, default: 0
- # d = sum([psutil.Process(k).num_threads() for k in [x for x in psutil.pids()]])
- return t,u,p,d
- def ip_status():
- ip_check = 0
- for i in [CU, CT, CM]:
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.settimeout(1)
- try:
- s.connect((i, PORBEPORT))
- except:
- ip_check += 1
- s.close()
- del s
- if ip_check >= 2:
- return False
- else:
- return True
- def get_network(ip_version):
- if(ip_version == 4):
- HOST = "ipv4.google.com"
- elif(ip_version == 6):
- HOST = "ipv6.google.com"
- try:
- s = socket.create_connection((HOST, 80), 2)
- s.close()
- return True
- except:
- return False
- lostRate = {
- '10010': 0.0,
- '189': 0.0,
- '10086': 0.0
- }
- pingTime = {
- '10010': 0,
- '189': 0,
- '10086': 0
- }
- netSpeed = {
- 'netrx': 0.0,
- 'nettx': 0.0,
- 'clock': 0.0,
- 'diff': 0.0,
- 'avgrx': 0,
- 'avgtx': 0
- }
- def _ping_thread(host, mark, port):
- lostPacket = 0
- allPacket = 0
- startTime = time.time()
- while True:
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.settimeout(1)
- try:
- b = timeit.default_timer()
- s.connect((host, port))
- pingTime[mark] = int((timeit.default_timer() - b) * 1000)
- except:
- lostPacket += 1
- finally:
- allPacket += 1
- s.close()
- if allPacket > 100:
- lostRate[mark] = float(lostPacket) / allPacket
- endTime = time.time()
- if endTime - startTime > 3600:
- lostPacket = 0
- allPacket = 0
- startTime = endTime
- time.sleep(INTERVAL)
- def _net_speed():
- while True:
- avgrx = 0
- avgtx = 0
- for name, stats in psutil.net_io_counters(pernic=True).items():
- if "lo" in name or "tun" in name \
- or "docker" in name or "veth" in name \
- or "br-" in name or "vmbr" in name \
- or "vnet" in name or "kube" in name:
- continue
- avgrx += stats.bytes_recv
- avgtx += stats.bytes_sent
- now_clock = time.time()
- netSpeed["diff"] = now_clock - netSpeed["clock"]
- netSpeed["clock"] = now_clock
- netSpeed["netrx"] = int((avgrx - netSpeed["avgrx"]) / netSpeed["diff"])
- netSpeed["nettx"] = int((avgtx - netSpeed["avgtx"]) / netSpeed["diff"])
- netSpeed["avgrx"] = avgrx
- netSpeed["avgtx"] = avgtx
- time.sleep(INTERVAL)
- def get_realtime_date():
- t1 = threading.Thread(
- target=_ping_thread,
- kwargs={
- 'host': CU,
- 'mark': '10010',
- 'port': PORBEPORT
- }
- )
- t2 = threading.Thread(
- target=_ping_thread,
- kwargs={
- 'host': CT,
- 'mark': '189',
- 'port': PORBEPORT
- }
- )
- t3 = threading.Thread(
- target=_ping_thread,
- kwargs={
- 'host': CM,
- 'mark': '10086',
- 'port': PORBEPORT
- }
- )
- t4 = threading.Thread(
- target=_net_speed,
- )
- t1.setDaemon(True)
- t2.setDaemon(True)
- t3.setDaemon(True)
- t4.setDaemon(True)
- t1.start()
- t2.start()
- t3.start()
- t4.start()
- def byte_str(object):
- '''
- bytes to str, str to bytes
- :param object:
- :return:
- '''
- if isinstance(object, str):
- return object.encode(encoding="utf-8")
- elif isinstance(object, bytes):
- return bytes.decode(object)
- else:
- print(type(object))
- if __name__ == '__main__':
- for argc in sys.argv:
- if 'SERVER' in argc:
- SERVER = argc.split('SERVER=')[-1]
- elif 'PORT' in argc:
- PORT = int(argc.split('PORT=')[-1])
- elif 'USER' in argc:
- USER = argc.split('USER=')[-1]
- elif 'PASSWORD' in argc:
- PASSWORD = argc.split('PASSWORD=')[-1]
- elif 'INTERVAL' in argc:
- INTERVAL = int(argc.split('INTERVAL=')[-1])
- socket.setdefaulttimeout(30)
- get_realtime_date()
- while 1:
- try:
- print("Connecting...")
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.connect((SERVER, PORT))
- data = byte_str(s.recv(1024))
- if data.find("Authentication required") > -1:
- s.send(byte_str(USER + ':' + PASSWORD + '\n'))
- data = byte_str(s.recv(1024))
- if data.find("Authentication successful") < 0:
- print(data)
- raise socket.error
- else:
- print(data)
- raise socket.error
- print(data)
- data = byte_str(s.recv(1024))
- 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
- while 1:
- CPU = get_cpu()
- NET_IN, NET_OUT = liuliang()
- Uptime = get_uptime()
- Load_1, Load_5, Load_15 = os.getloadavg() if 'linux' in sys.platform else (0.0, 0.0, 0.0)
- MemoryTotal, MemoryUsed = get_memory()
- SwapTotal, SwapUsed = get_swap()
- HDDTotal, HDDUsed = get_hdd()
- IP_STATUS = ip_status()
- array = {}
- if not timer:
- array['online' + str(check_ip)] = get_network(check_ip)
- timer = 10
- else:
- timer -= 1*INTERVAL
- array['uptime'] = Uptime
- array['load_1'] = Load_1
- array['load_5'] = Load_5
- array['load_15'] = Load_15
- array['memory_total'] = MemoryTotal
- array['memory_used'] = MemoryUsed
- array['swap_total'] = SwapTotal
- array['swap_used'] = SwapUsed
- array['hdd_total'] = HDDTotal
- array['hdd_used'] = HDDUsed
- array['cpu'] = CPU
- array['network_rx'] = netSpeed.get("netrx")
- array['network_tx'] = netSpeed.get("nettx")
- array['network_in'] = NET_IN
- array['network_out'] = NET_OUT
- array['ip_status'] = IP_STATUS
- array['ping_10010'] = lostRate.get('10010') * 100
- array['ping_189'] = lostRate.get('189') * 100
- array['ping_10086'] = lostRate.get('10086') * 100
- array['time_10010'] = pingTime.get('10010')
- array['time_189'] = pingTime.get('189')
- array['time_10086'] = pingTime.get('10086')
- array['tcp'], array['udp'], array['process'], array['thread'] = tupd()
- s.send(byte_str("update " + json.dumps(array) + "\n"))
- except KeyboardInterrupt:
- raise
- except socket.error:
- print("Disconnected...")
- # keep on trying after a disconnect
- s.close()
- time.sleep(3)
- except Exception as e:
- print("Caught Exception:", e)
- s.close()
- time.sleep(3)
|