Skip to content

Commit 71cadcf

Browse files
committed
测试监控重要服务
1 parent d96e711 commit 71cadcf

File tree

9 files changed

+434
-134
lines changed

9 files changed

+434
-134
lines changed

clients/client-linux.py

Lines changed: 112 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
INTERVAL = 1
2121

2222
import socket
23+
import ssl
2324
import time
2425
import timeit
2526
import re
@@ -29,10 +30,10 @@
2930
import errno
3031
import subprocess
3132
import threading
32-
try:
33-
from queue import Queue # python3
34-
except ImportError:
35-
from Queue import Queue # python2
33+
if sys.version_info.major == 3:
34+
from queue import Queue
35+
elif sys.version_info.major == 2:
36+
from Queue import Queue
3637

3738
def get_uptime():
3839
with open('/proc/uptime', 'r') as f:
@@ -150,6 +151,7 @@ def get_network(ip_version):
150151
'read': 0,
151152
'write': 0
152153
}
154+
monitorServer = {}
153155

154156
def _ping_thread(host, mark, port):
155157
lostPacket = 0
@@ -314,6 +316,97 @@ def get_realtime_data():
314316
ti.daemon = True
315317
ti.start()
316318

319+
320+
def _monitor_thread(name, host, interval, type):
321+
lostPacket = 0
322+
packet_queue = Queue(maxsize=PING_PACKET_HISTORY_LEN)
323+
while True:
324+
if name not in monitorServer.keys():
325+
monitorServer[name] = {
326+
"type": type,
327+
"dns_time": 0,
328+
"connect_time": 0,
329+
"download_time": 0,
330+
"online_rate": 1
331+
}
332+
if packet_queue.full():
333+
if packet_queue.get() == 0:
334+
lostPacket -= 1
335+
try:
336+
if type == "http":
337+
address = host.replace("http://", "")
338+
m = timeit.default_timer()
339+
if PROBE_PROTOCOL_PREFER == 'ipv4':
340+
IP = socket.getaddrinfo(address, None, socket.AF_INET)[0][4][0]
341+
else:
342+
IP = socket.getaddrinfo(address, None, socket.AF_INET6)[0][4][0]
343+
monitorServer[name]["dns_time"] = int((timeit.default_timer() - m) * 1000)
344+
m = timeit.default_timer()
345+
k = socket.create_connection((IP, 80), timeout=6)
346+
monitorServer[name]["connect_time"] = int((timeit.default_timer() - m) * 1000)
347+
m = timeit.default_timer()
348+
k.sendall("GET / HTTP/1.2\r\nHost:{}\r\nConnection:close\r\n\r\n".format(address).encode('utf-8'))
349+
response = b""
350+
while True:
351+
data = k.recv(4096)
352+
if not data:
353+
break
354+
response += data
355+
http_code = response.decode('utf-8').split('\r\n')[0].split()[1]
356+
monitorServer[name]["download_time"] = int((timeit.default_timer() - m) * 1000)
357+
k.close()
358+
if http_code not in ['200', '204', '301', '302', '401']:
359+
raise Exception("http code not in 200, 204, 301, 302, 401")
360+
elif type == "https":
361+
context = ssl._create_unverified_context()
362+
address = host.replace("https://", "")
363+
m = timeit.default_timer()
364+
if PROBE_PROTOCOL_PREFER == 'ipv4':
365+
IP = socket.getaddrinfo(address, None, socket.AF_INET)[0][4][0]
366+
else:
367+
IP = socket.getaddrinfo(address, None, socket.AF_INET6)[0][4][0]
368+
monitorServer[name]["dns_time"] = int((timeit.default_timer() - m) * 1000)
369+
m = timeit.default_timer()
370+
k = socket.create_connection((IP, 443), timeout=6)
371+
monitorServer[name]["connect_time"] = int((timeit.default_timer() - m) * 1000)
372+
m = timeit.default_timer()
373+
kk = context.wrap_socket(k, server_hostname=address)
374+
kk.sendall("GET / HTTP/1.2\r\nHost:{}\r\nConnection:close\r\n\r\n".format(address).encode('utf-8'))
375+
response = b""
376+
while True:
377+
data = kk.recv(4096)
378+
if not data:
379+
break
380+
response += data
381+
http_code = response.decode('utf-8').split('\r\n')[0].split()[1]
382+
monitorServer[name]["download_time"] = int((timeit.default_timer() - m) * 1000)
383+
kk.close()
384+
k.close()
385+
if http_code not in ['200', '204', '301', '302', '401']:
386+
raise Exception("http code not in 200, 204, 301, 302, 401")
387+
elif type == "tcp":
388+
m = timeit.default_timer()
389+
if PROBE_PROTOCOL_PREFER == 'ipv4':
390+
IP = socket.getaddrinfo(host.split(":")[0], None, socket.AF_INET)[0][4][0]
391+
else:
392+
IP = socket.getaddrinfo(host.split(":")[0], None, socket.AF_INET6)[0][4][0]
393+
monitorServer[name]["dns_time"] = int((timeit.default_timer() - m) * 1000)
394+
m = timeit.default_timer()
395+
k = socket.create_connection((IP, int(host.split(":")[1])), timeout=6)
396+
monitorServer[name]["connect_time"] = int((timeit.default_timer() - m) * 1000)
397+
m = timeit.default_timer()
398+
k.send(b"GET / HTTP/1.2\r\n\r\n")
399+
k.recv(1024)
400+
monitorServer[name]["download_time"] = int((timeit.default_timer() - m) * 1000)
401+
k.close()
402+
packet_queue.put(1)
403+
except Exception as e:
404+
lostPacket += 1
405+
packet_queue.put(0)
406+
if packet_queue.qsize() > 5:
407+
monitorServer[name]["online_rate"] = 1 - float(lostPacket) / packet_queue.qsize()
408+
time.sleep(interval)
409+
317410
def byte_str(object):
318411
'''
319412
bytes to str, str to bytes
@@ -360,6 +453,20 @@ def byte_str(object):
360453
if data.find("You are connecting via") < 0:
361454
data = byte_str(s.recv(1024))
362455
print(data)
456+
for i in data.split('\n'):
457+
if "monitor" in i and "type" in i and "{" in i and "}" in i:
458+
jdata = json.loads(i[i.find("{"):i.find("}")+1])
459+
t = threading.Thread(
460+
target=_monitor_thread,
461+
kwargs={
462+
'name': jdata.get("name"),
463+
'host': jdata.get("host"),
464+
'interval': jdata.get("interval"),
465+
'type': jdata.get("type")
466+
}
467+
)
468+
t.daemon = True
469+
t.start()
363470

364471
timer = 0
365472
check_ip = 0
@@ -378,7 +485,6 @@ def byte_str(object):
378485
Load_1, Load_5, Load_15 = os.getloadavg()
379486
MemoryTotal, MemoryUsed, SwapTotal, SwapFree = get_memory()
380487
HDDTotal, HDDUsed = get_hdd()
381-
382488
array = {}
383489
if not timer:
384490
array['online' + str(check_ip)] = get_network(check_ip)
@@ -412,7 +518,7 @@ def byte_str(object):
412518
array['tcp'], array['udp'], array['process'], array['thread'] = tupd()
413519
array['io_read'] = diskIO.get("read")
414520
array['io_write'] = diskIO.get("write")
415-
521+
array['custom'] = "<br>".join(f"<code>{k}</code>\\t解析: {v['dns_time']}\\t连接: {v['connect_time']}\\t下载: {v['download_time']}\\t在线率: <code>{v['online_rate']*100}%</code>" for k, v in monitorServer.items())
416522
s.send(byte_str("update " + json.dumps(array) + "\n"))
417523
except KeyboardInterrupt:
418524
raise

clients/client-psutil.py

Lines changed: 112 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
INTERVAL = 1
2222

2323
import socket
24+
import ssl
2425
import time
2526
import timeit
2627
import os
@@ -29,10 +30,10 @@
2930
import errno
3031
import psutil
3132
import threading
32-
try:
33-
from queue import Queue # python3
34-
except ImportError:
35-
from Queue import Queue # python2
33+
if sys.version_info.major == 3:
34+
from queue import Queue
35+
elif sys.version_info.major == 2:
36+
from Queue import Queue
3637

3738
def get_uptime():
3839
return int(time.time() - psutil.boot_time())
@@ -148,6 +149,7 @@ def get_network(ip_version):
148149
'read': 0,
149150
'write': 0
150151
}
152+
monitorServer = {}
151153

152154
def _ping_thread(host, mark, port):
153155
lostPacket = 0
@@ -303,6 +305,97 @@ def get_realtime_data():
303305
ti.daemon = True
304306
ti.start()
305307

308+
def _monitor_thread(name, host, interval, type):
309+
lostPacket = 0
310+
packet_queue = Queue(maxsize=PING_PACKET_HISTORY_LEN)
311+
while True:
312+
if name not in monitorServer.keys():
313+
monitorServer[name] = {
314+
"type": type,
315+
"dns_time": 0,
316+
"connect_time": 0,
317+
"download_time": 0,
318+
"online_rate": 1
319+
}
320+
if packet_queue.full():
321+
if packet_queue.get() == 0:
322+
lostPacket -= 1
323+
try:
324+
if type == "http":
325+
address = host.replace("http://", "")
326+
m = timeit.default_timer()
327+
if PROBE_PROTOCOL_PREFER == 'ipv4':
328+
IP = socket.getaddrinfo(address, None, socket.AF_INET)[0][4][0]
329+
else:
330+
IP = socket.getaddrinfo(address, None, socket.AF_INET6)[0][4][0]
331+
monitorServer[name]["dns_time"] = int((timeit.default_timer() - m) * 1000)
332+
m = timeit.default_timer()
333+
k = socket.create_connection((IP, 80), timeout=6)
334+
monitorServer[name]["connect_time"] = int((timeit.default_timer() - m) * 1000)
335+
m = timeit.default_timer()
336+
k.sendall("GET / HTTP/1.2\r\nHost:{}\r\nConnection:close\r\n\r\n".format(address).encode('utf-8'))
337+
response = b""
338+
while True:
339+
data = k.recv(4096)
340+
if not data:
341+
break
342+
response += data
343+
http_code = response.decode('utf-8').split('\r\n')[0].split()[1]
344+
monitorServer[name]["download_time"] = int((timeit.default_timer() - m) * 1000)
345+
k.close()
346+
if http_code not in ['200', '204', '301', '302', '401']:
347+
raise Exception("http code not in 200, 204, 301, 302, 401")
348+
elif type == "https":
349+
context = ssl._create_unverified_context()
350+
address = host.replace("https://", "")
351+
m = timeit.default_timer()
352+
if PROBE_PROTOCOL_PREFER == 'ipv4':
353+
IP = socket.getaddrinfo(address, None, socket.AF_INET)[0][4][0]
354+
else:
355+
IP = socket.getaddrinfo(address, None, socket.AF_INET6)[0][4][0]
356+
monitorServer[name]["dns_time"] = int((timeit.default_timer() - m) * 1000)
357+
m = timeit.default_timer()
358+
k = socket.create_connection((IP, 443), timeout=6)
359+
monitorServer[name]["connect_time"] = int((timeit.default_timer() - m) * 1000)
360+
m = timeit.default_timer()
361+
kk = context.wrap_socket(k, server_hostname=address)
362+
kk.sendall("GET / HTTP/1.2\r\nHost:{}\r\nConnection:close\r\n\r\n".format(address).encode('utf-8'))
363+
response = b""
364+
while True:
365+
data = kk.recv(4096)
366+
if not data:
367+
break
368+
response += data
369+
http_code = response.decode('utf-8').split('\r\n')[0].split()[1]
370+
monitorServer[name]["download_time"] = int((timeit.default_timer() - m) * 1000)
371+
kk.close()
372+
k.close()
373+
if http_code not in ['200', '204', '301', '302', '401']:
374+
raise Exception("http code not in 200, 204, 301, 302, 401")
375+
elif type == "tcp":
376+
m = timeit.default_timer()
377+
if PROBE_PROTOCOL_PREFER == 'ipv4':
378+
IP = socket.getaddrinfo(host.split(":")[0], None, socket.AF_INET)[0][4][0]
379+
else:
380+
IP = socket.getaddrinfo(host.split(":")[0], None, socket.AF_INET6)[0][4][0]
381+
monitorServer[name]["dns_time"] = int((timeit.default_timer() - m) * 1000)
382+
m = timeit.default_timer()
383+
k = socket.create_connection((IP, int(host.split(":")[1])), timeout=6)
384+
monitorServer[name]["connect_time"] = int((timeit.default_timer() - m) * 1000)
385+
m = timeit.default_timer()
386+
k.send(b"GET / HTTP/1.2\r\n\r\n")
387+
k.recv(1024)
388+
monitorServer[name]["download_time"] = int((timeit.default_timer() - m) * 1000)
389+
k.close()
390+
packet_queue.put(1)
391+
except Exception as e:
392+
lostPacket += 1
393+
packet_queue.put(0)
394+
if packet_queue.qsize() > 5:
395+
monitorServer[name]["online_rate"] = 1 - float(lostPacket) / packet_queue.qsize()
396+
time.sleep(interval)
397+
398+
306399
def byte_str(object):
307400
'''
308401
bytes to str, str to bytes
@@ -349,6 +442,20 @@ def byte_str(object):
349442
if data.find("You are connecting via") < 0:
350443
data = byte_str(s.recv(1024))
351444
print(data)
445+
for i in data.split('\n'):
446+
if "monitor" in i and "type" in i and "{" in i and "}" in i:
447+
jdata = json.loads(i[i.find("{"):i.find("}")+1])
448+
t = threading.Thread(
449+
target=_monitor_thread,
450+
kwargs={
451+
'name': jdata.get("name"),
452+
'host': jdata.get("host"),
453+
'interval': jdata.get("interval"),
454+
'type': jdata.get("type")
455+
}
456+
)
457+
t.daemon = True
458+
t.start()
352459

353460
timer = 0
354461
check_ip = 0
@@ -368,7 +475,6 @@ def byte_str(object):
368475
MemoryTotal, MemoryUsed = get_memory()
369476
SwapTotal, SwapUsed = get_swap()
370477
HDDTotal, HDDUsed = get_hdd()
371-
372478
array = {}
373479
if not timer:
374480
array['online' + str(check_ip)] = get_network(check_ip)
@@ -402,7 +508,7 @@ def byte_str(object):
402508
array['tcp'], array['udp'], array['process'], array['thread'] = tupd()
403509
array['io_read'] = diskIO.get("read")
404510
array['io_write'] = diskIO.get("write")
405-
511+
array['custom'] = "<br>".join(f"<code>{k}</code>\\t解析: {v['dns_time']}\\t连接: {v['connect_time']}\\t下载: {v['download_time']}\\t在线率: <code>{v['online_rate']*100}%</code>" for k, v in monitorServer.items())
406512
s.send(byte_str("update " + json.dumps(array) + "\n"))
407513
except KeyboardInterrupt:
408514
raise

server/config.json

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,26 @@
3838
"monthstart": 1
3939
}
4040
],
41+
"monitors": [
42+
{
43+
"name": "百度一下",
44+
"host": "https://www.baidu.com",
45+
"interval": 60,
46+
"type": "https"
47+
},
48+
{
49+
"name": "主机交流",
50+
"host": "https://www.hostloc.com",
51+
"interval": 60,
52+
"type": "https"
53+
},
54+
{
55+
"name": "DNS服务",
56+
"host": "114.114.114.114:53",
57+
"interval": 60,
58+
"type": "tcp"
59+
}
60+
],
4161
"watchdog": [
4262
{
4363
"name": "cpu high warning,exclude username s01",
@@ -58,17 +78,17 @@
5878
"callback": "https://yourSMSurl"
5979
},
6080
{
61-
"name": "ddcc attack,limit type Oracle",
62-
"rule": "tcp_count>600&type='Oracle'",
63-
"interval": 300,
64-
"callback": "https://yourSMSurl"
65-
},
81+
"name": "ddcc attack,limit type Oracle",
82+
"rule": "tcp_count>600&type='Oracle'",
83+
"interval": 300,
84+
"callback": "https://yourSMSurl"
85+
},
6686
{
67-
"name": "month traffic warning",
68-
"rule": "(network_out-last_network_out)/1024/1024/1024>999",
69-
"interval": 3600,
70-
"callback": "https://yourSMSurl"
71-
},
87+
"name": "month traffic warning",
88+
"rule": "(network_out-last_network_out)/1024/1024/1024>999",
89+
"interval": 3600,
90+
"callback": "https://yourSMSurl"
91+
},
7292
{
7393
"name": "you can parse an expression combining any known field",
7494
"rule": "load_5>3",

0 commit comments

Comments
 (0)