client-psutil.py 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. #!/usr/bin/env python
  2. # coding: utf-8
  3. # Update by : https://github.com/cppla/ServerStatus
  4. # 依赖于psutil跨平台库
  5. # 支持Python版本:2.7 to 3.7
  6. # 支持操作系统: Linux, Windows, OSX, Sun Solaris, FreeBSD, OpenBSD and NetBSD, both 32-bit and 64-bit architectures
  7. # 时间: 20200407
  8. # 说明: 默认情况下修改server和user就可以了。丢包率监测方向可以自定义,例如:CU = "www.facebook.com"。
  9. SERVER = "127.0.0.1"
  10. USER = "s01"
  11. PORT = 35601
  12. PASSWORD = "USER_DEFAULT_PASSWORD"
  13. INTERVAL = 1
  14. PORBEPORT = 80
  15. CU = "cu.tz.cloudcpp.com"
  16. CT = "ct.tz.cloudcpp.com"
  17. CM = "cm.tz.cloudcpp.com"
  18. import socket
  19. import time
  20. import timeit
  21. import os
  22. import json
  23. import psutil
  24. import sys
  25. import threading
  26. def get_uptime():
  27. return int(time.time() - psutil.boot_time())
  28. def get_memory():
  29. Mem = psutil.virtual_memory()
  30. return int(Mem.total / 1024.0), int(Mem.used / 1024.0)
  31. def get_swap():
  32. Mem = psutil.swap_memory()
  33. return int(Mem.total/1024.0), int(Mem.used/1024.0)
  34. def get_hdd():
  35. valid_fs = [ "ext4", "ext3", "ext2", "reiserfs", "jfs", "btrfs", "fuseblk", "zfs", "simfs", "ntfs", "fat32", "exfat", "xfs" ]
  36. disks = dict()
  37. size = 0
  38. used = 0
  39. for disk in psutil.disk_partitions():
  40. if not disk.device in disks and disk.fstype.lower() in valid_fs:
  41. disks[disk.device] = disk.mountpoint
  42. for disk in disks.values():
  43. usage = psutil.disk_usage(disk)
  44. size += usage.total
  45. used += usage.used
  46. return int(size/1024.0/1024.0), int(used/1024.0/1024.0)
  47. def get_cpu():
  48. return psutil.cpu_percent(interval=INTERVAL)
  49. def liuliang():
  50. NET_IN = 0
  51. NET_OUT = 0
  52. net = psutil.net_io_counters(pernic=True)
  53. for k, v in net.items():
  54. if 'lo' in k or 'tun' in k \
  55. or 'docker' in k or 'veth' in k \
  56. or 'br-' in k or 'vmbr' in k \
  57. or 'vnet' in k or 'kube' in k:
  58. continue
  59. else:
  60. NET_IN += v[1]
  61. NET_OUT += v[0]
  62. return NET_IN, NET_OUT
  63. def tupd():
  64. '''
  65. tcp, udp, process, thread count: for view ddcc attack , then send warning
  66. :return:
  67. '''
  68. if 'linux' in sys.platform:
  69. t = int(os.popen('ss -t|wc -l').read()[:-1])-1
  70. u = int(os.popen('ss -u|wc -l').read()[:-1])-1
  71. p = int(os.popen('ps -ef|wc -l').read()[:-1])-2
  72. d = int(os.popen('ps -eLf|wc -l').read()[:-1])-2
  73. else:
  74. t = int(os.popen('netstat -an|find "TCP" /c').read()[:-1])-1
  75. u = int(os.popen('netstat -an|find "UDP" /c').read()[:-1])-1
  76. p = len(psutil.pids())
  77. d = 0
  78. # cpu is high, default: 0
  79. # d = sum([psutil.Process(k).num_threads() for k in [x for x in psutil.pids()]])
  80. return t,u,p,d
  81. def ip_status():
  82. ip_check = 0
  83. for i in [CU, CT, CM]:
  84. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  85. s.settimeout(1)
  86. try:
  87. s.connect((i, PORBEPORT))
  88. except:
  89. ip_check += 1
  90. s.close()
  91. del s
  92. if ip_check >= 2:
  93. return False
  94. else:
  95. return True
  96. def get_network(ip_version):
  97. if(ip_version == 4):
  98. HOST = "ipv4.google.com"
  99. elif(ip_version == 6):
  100. HOST = "ipv6.google.com"
  101. try:
  102. s = socket.create_connection((HOST, 80), 2)
  103. s.close()
  104. return True
  105. except:
  106. return False
  107. lostRate = {
  108. '10010': 0.0,
  109. '189': 0.0,
  110. '10086': 0.0
  111. }
  112. pingTime = {
  113. '10010': 0,
  114. '189': 0,
  115. '10086': 0
  116. }
  117. netSpeed = {
  118. 'netrx': 0.0,
  119. 'nettx': 0.0,
  120. 'clock': 0.0,
  121. 'diff': 0.0,
  122. 'avgrx': 0,
  123. 'avgtx': 0
  124. }
  125. def _ping_thread(host, mark, port):
  126. lostPacket = 0
  127. allPacket = 0
  128. startTime = time.time()
  129. while True:
  130. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  131. s.settimeout(1)
  132. try:
  133. b = timeit.default_timer()
  134. s.connect((host, port))
  135. pingTime[mark] = int((timeit.default_timer() - b) * 1000)
  136. except:
  137. lostPacket += 1
  138. finally:
  139. allPacket += 1
  140. s.close()
  141. if allPacket > 100:
  142. lostRate[mark] = float(lostPacket) / allPacket
  143. endTime = time.time()
  144. if endTime - startTime > 3600:
  145. lostPacket = 0
  146. allPacket = 0
  147. startTime = endTime
  148. time.sleep(INTERVAL)
  149. def _net_speed():
  150. while True:
  151. avgrx = 0
  152. avgtx = 0
  153. for name, stats in psutil.net_io_counters(pernic=True).items():
  154. if "lo" in name or "tun" in name \
  155. or "docker" in name or "veth" in name \
  156. or "br-" in name or "vmbr" in name \
  157. or "vnet" in name or "kube" in name:
  158. continue
  159. avgrx += stats.bytes_recv
  160. avgtx += stats.bytes_sent
  161. now_clock = time.time()
  162. netSpeed["diff"] = now_clock - netSpeed["clock"]
  163. netSpeed["clock"] = now_clock
  164. netSpeed["netrx"] = int((avgrx - netSpeed["avgrx"]) / netSpeed["diff"])
  165. netSpeed["nettx"] = int((avgtx - netSpeed["avgtx"]) / netSpeed["diff"])
  166. netSpeed["avgrx"] = avgrx
  167. netSpeed["avgtx"] = avgtx
  168. time.sleep(INTERVAL)
  169. def get_realtime_date():
  170. t1 = threading.Thread(
  171. target=_ping_thread,
  172. kwargs={
  173. 'host': CU,
  174. 'mark': '10010',
  175. 'port': PORBEPORT
  176. }
  177. )
  178. t2 = threading.Thread(
  179. target=_ping_thread,
  180. kwargs={
  181. 'host': CT,
  182. 'mark': '189',
  183. 'port': PORBEPORT
  184. }
  185. )
  186. t3 = threading.Thread(
  187. target=_ping_thread,
  188. kwargs={
  189. 'host': CM,
  190. 'mark': '10086',
  191. 'port': PORBEPORT
  192. }
  193. )
  194. t4 = threading.Thread(
  195. target=_net_speed,
  196. )
  197. t1.setDaemon(True)
  198. t2.setDaemon(True)
  199. t3.setDaemon(True)
  200. t4.setDaemon(True)
  201. t1.start()
  202. t2.start()
  203. t3.start()
  204. t4.start()
  205. def byte_str(object):
  206. '''
  207. bytes to str, str to bytes
  208. :param object:
  209. :return:
  210. '''
  211. if isinstance(object, str):
  212. return object.encode(encoding="utf-8")
  213. elif isinstance(object, bytes):
  214. return bytes.decode(object)
  215. else:
  216. print(type(object))
  217. if __name__ == '__main__':
  218. for argc in sys.argv:
  219. if 'SERVER' in argc:
  220. SERVER = argc.split('SERVER=')[-1]
  221. elif 'PORT' in argc:
  222. PORT = int(argc.split('PORT=')[-1])
  223. elif 'USER' in argc:
  224. USER = argc.split('USER=')[-1]
  225. elif 'PASSWORD' in argc:
  226. PASSWORD = argc.split('PASSWORD=')[-1]
  227. elif 'INTERVAL' in argc:
  228. INTERVAL = int(argc.split('INTERVAL=')[-1])
  229. socket.setdefaulttimeout(30)
  230. get_realtime_date()
  231. while 1:
  232. try:
  233. print("Connecting...")
  234. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  235. s.connect((SERVER, PORT))
  236. data = byte_str(s.recv(1024))
  237. if data.find("Authentication required") > -1:
  238. s.send(byte_str(USER + ':' + PASSWORD + '\n'))
  239. data = byte_str(s.recv(1024))
  240. if data.find("Authentication successful") < 0:
  241. print(data)
  242. raise socket.error
  243. else:
  244. print(data)
  245. raise socket.error
  246. print(data)
  247. data = byte_str(s.recv(1024))
  248. print(data)
  249. timer = 0
  250. check_ip = 0
  251. if data.find("IPv4") > -1:
  252. check_ip = 6
  253. elif data.find("IPv6") > -1:
  254. check_ip = 4
  255. else:
  256. print(data)
  257. raise socket.error
  258. while 1:
  259. CPU = get_cpu()
  260. NET_IN, NET_OUT = liuliang()
  261. Uptime = get_uptime()
  262. Load_1, Load_5, Load_15 = os.getloadavg() if 'linux' in sys.platform else (0.0, 0.0, 0.0)
  263. MemoryTotal, MemoryUsed = get_memory()
  264. SwapTotal, SwapUsed = get_swap()
  265. HDDTotal, HDDUsed = get_hdd()
  266. IP_STATUS = ip_status()
  267. array = {}
  268. if not timer:
  269. array['online' + str(check_ip)] = get_network(check_ip)
  270. timer = 10
  271. else:
  272. timer -= 1*INTERVAL
  273. array['uptime'] = Uptime
  274. array['load_1'] = Load_1
  275. array['load_5'] = Load_5
  276. array['load_15'] = Load_15
  277. array['memory_total'] = MemoryTotal
  278. array['memory_used'] = MemoryUsed
  279. array['swap_total'] = SwapTotal
  280. array['swap_used'] = SwapUsed
  281. array['hdd_total'] = HDDTotal
  282. array['hdd_used'] = HDDUsed
  283. array['cpu'] = CPU
  284. array['network_rx'] = netSpeed.get("netrx")
  285. array['network_tx'] = netSpeed.get("nettx")
  286. array['network_in'] = NET_IN
  287. array['network_out'] = NET_OUT
  288. array['ip_status'] = IP_STATUS
  289. array['ping_10010'] = lostRate.get('10010') * 100
  290. array['ping_189'] = lostRate.get('189') * 100
  291. array['ping_10086'] = lostRate.get('10086') * 100
  292. array['time_10010'] = pingTime.get('10010')
  293. array['time_189'] = pingTime.get('189')
  294. array['time_10086'] = pingTime.get('10086')
  295. array['tcp'], array['udp'], array['process'], array['thread'] = tupd()
  296. s.send(byte_str("update " + json.dumps(array) + "\n"))
  297. except KeyboardInterrupt:
  298. raise
  299. except socket.error:
  300. print("Disconnected...")
  301. # keep on trying after a disconnect
  302. s.close()
  303. time.sleep(3)
  304. except Exception as e:
  305. print("Caught Exception:", e)
  306. s.close()
  307. time.sleep(3)