针对于linux服务器CPU利用率、CPU平均负载、内存使用率、磁盘使用率、检测的端口监控报警
import socket
import os
import platform
import requests
import time
import hmac
import hashlib
import base64
import urllib.parse
timestamp = str(round(time.time() * 1000))
secret = 'xxxxxxxxxxxxxxx'
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
def printL():
print("------------------------------")
sysstr = platform.system()
if (sysstr == "Windows"):
print("Windows tasks, no fcntl module")
printL()
elif (sysstr == "Linux"):
print("Linux tasks")
printL()
else:
print("Other System tasks, no fcntl module")
printL()
class Monitor():
g_url = "https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxx×tamp="+str(timestamp)+"&sign="+str(sign)
g_cpu_used = ''
g_aver_load = ''
g_mem_used = ''
g_disk_used = ''
g_monitor_ports = []
g_web_ip=''
headers = {
"Content-Type": "application/json",
}
@classmethod
def read_conf(cls):
global g_web_ip
global dingding
global g_url
global g_cpu_used
global g_aver_load
global g_mem_used
global g_disk_used
global g_monitor_ports
global headers
f_monitor = open('/opt/monitor.conf', 'r', encoding='utf-8')
f_monitor_lines = f_monitor.readlines()
for f_line_num, f_monitor_line in enumerate(f_monitor_lines):
tup = f_monitor_line.rstrip('\n').rstrip().split('\t')
if '=' in tup[0]:
temp = tup[0].split('=')
if temp[0] == 'web_ip':
cls.g_web_ip = temp[1]
print("read g_web_ip:", cls.g_web_ip)
elif temp[0] == 'cpu_used':
cls.g_cpu_used = temp[1]
print("read cpu_used:", cls.g_cpu_used)
elif temp[0] == 'aver_load':
cls.g_aver_load = temp[1]
print("read aver_load:", cls.g_aver_load)
elif temp[0] == 'mem_used':
cls.g_mem_used = temp[1]
print("read mem_used:", cls.g_mem_used)
elif temp[0] == 'disk_used':
cls.g_disk_used = temp[1]
print("read disk_used:", cls.g_disk_used)
elif temp[0] == 'monitor_ports':
monitor_ports = temp[1]
cls.g_monitor_ports = monitor_ports.replace(' ', '').split(',')
print("read monitor_ports:", cls.g_monitor_ports)
printL()
@classmethod
def get_ports(cls, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex(('47.x.x.x', int(port)))
if result != 0:
form_data = {"msgtype": "text",
"at": {
"atMobiles": [
"xxxxx"
]
},
"text": {
"content": cls.g_web_ip + "服务器的:" + port + '端口挂了,快去修复哈'
}
}
html = requests.post(g_url, headers=cls.headers, json=form_data).text
return html
else:
print("端口:" + port + "正常")
@classmethod
def aver_load(cls):
if (sysstr == "Linux"):
f = os.popen("uptime | sed 's/,//g' | awk '{print $10,$11,$12}'")
str_aver_load = f.read().strip().split(" ")[1].strip()
print("CPU平均负载:", str_aver_load)
if float(str_aver_load) > float(cls.g_aver_load):
form_data = {"msgtype": "text",
"at": {
"atMobiles": [
"xxxxx"
]
},
"text": {
"content": cls.g_web_ip + "服务器的CPU平均负载超过:" + cls.g_aver_load + "了,快去看看咋回事!"
}
}
html = requests.post(cls.g_url, headers=cls.headers, json=form_data).text
return html
else:
print(sysstr + " CPU Load average Cannot read.")
printL()
@classmethod
def get_disk_used(cls):
if (sysstr == "Linux"):
disk_val = os.popen("df -h | head -6 | tail -1 |awk '{print $5}'").read().strip()
int_disk_val = int(disk_val.split("%")[0])
int_g_disk_val = int(cls.g_disk_used.split("%")[0])
print("硬盘使用率:", disk_val)
if int_disk_val > int_g_disk_val:
form_data = {"msgtype": "text",
"at": {
"atMobiles": [
"xxxxx"
]
},
"text": {
"content": cls.g_web_ip + "服务器的硬盘使用率超过:" + cls.g_disk_used + "了,快去看看咋回事!",
}
}
html = requests.post(cls.g_url, headers=cls.headers, json=form_data).text
return html
else:
print(sysstr + " hard disk Cannot read.")
printL()
@classmethod
def get_mem_used(cls):
if (sysstr == "Linux"):
f = os.popen("free -m |grep Mem |awk '{print $3/$2}'")
str_men = f.read().strip()
print("内存使用率:", str_men)
if float(str_men) > float(cls.g_mem_used):
form_data = {"msgtype": "text",
"at": {
"atMobiles": [
"xxxxx"
]
},
"text": {
"content": cls.g_web_ip + "服务器的内存使用率超过:" +cls.g_mem_used + "了,快去看看咋回事!"
}
}
html = requests.post(cls.g_url, headers=cls.headers, json=form_data).text
return html
else:
print(sysstr + " RAM Cannot read.")
printL()
if __name__ == '__main__':
Monitor.read_conf()
Monitor.aver_load()
Monitor.get_disk_used()
Monitor.get_mem_used()
for port in Monitor.g_monitor_ports:
Monitor.get_ports(port)