coding utf-8 Получаем список серверов парсим его првоеряем доступность

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# -*- coding: utf-8 -*-
# Получаем список серверов, парсим его, првоеряем доступность серверов, выводим уведомления после сканирования
import urllib
from pysnmp.entity.rfc3413.oneliner import cmdgen
import pynotify
#IP серверов которые не надо
EXCEPT_SERVERS = (
'tcp:91.200.44.26',
'10.55.0.1',
'90.156.168.20',
'85.30.203.5',
'92.241.169.100',
'89.111.180.207',
)
#функция получения валидных серверов
def get_servers(url="http://stat.2x4.ru/list.php"):
servers = urllib.urlopen(url).readlines()
servers = [ server.strip() for server in servers ]
all_serv =[]
for line in servers:
serv = [ser for ser in line.split(" ") if not ser == '']
if not serv[0] in EXCEPT_SERVERS:
all_serv.append(serv)
return all_serv
#функция получения данных по SNMP
#выводит результат в виде кортежа, где первый параметр номер ошибки (0-ошибки нет), второй информационный параметр, третий-название, четвертый-адрес
#1-ошибка таймаута, 2-высокий LA
def get_snmp(server=[]):
errorIndication, errorStatus, errorIndex, varBinds=cmdgen.CommandGenerator().getCmd(
cmdgen.CommunityData('my', server[1], 0),
cmdgen.UdpTransportTarget((server[0], 161)),
(1,3,6,1,4,1,2021,10,1,5,3)) #узнаем LA
if errorIndication == 'requestTimedOut':
return (1, '', server[3], server[0])
if server[2] == 'nix' and isinstance(varBinds[0][1], int):
if varBinds[0][1]/100. > 10.0:
return (2, float(varBinds[0][1]/100.), server[3], server[0])
else:
return (0, float(varBinds[0][1]/100.), server[3], server[0])
else:
return (0, '', server[3], server[0])
def out_res(out_inf=()):
if out_inf[0] == 1:
message = pynotify.Notification(("%s" % out_inf[2]), (("%s - недоступен") % out_inf[3]))
message.set_urgency(pynotify.URGENCY_CRITICAL)
message.set_timeout(pynotify.EXPIRES_NEVER)
message.show()
if out_inf[2] == 2:
message = pynotify.Notification(("%s" % out_inf[2]), (("%s - перегружен %s") % (out_inf[3]), out_inf[1]))
message.set_urgency(pynotify.URGENCY_NORMAL)
message.set_timeout(90000)
message.show()
if __name__ == '__main__':
pynotify.init("summary-body")
servers = get_servers()
for serv in servers:
res = get_snmp(serv)
if not res[0] == 0:
out_res(res)