Navazuji na snad oblíbený script na sledování stavu serverů a odesílání stavu na mail (SMS).
Dlouholetá praxe ukázala nedostatky a ty se postupně pilovaly.
Napsal jsem něco jako verzi 3, která je trochu revolucí. Náměty z předchozí diskuze daly vzejít novému pohledu na problematiku.
Jako problémy se ukázalo:
1,Nepohodlné přidávání serverů
2, sekvenční zpracování, tedy postupné testovaní serverů což u většího počtu serverů natahovalo čas zpracování a přinášelo komplikace.
Nové řešení
Jako největší problém se ukázalo „paralelní puštění“ testu. MT nic takového neumí. Proto jsem napsal skript, který vyrobí jednotlivé skripty pro testování a ty pouští najednou. Každou lichou minutu se tak testují servery a každou sudou se vyhodnocují výsledky testu. Důvodem následného vyhodnocení je odeslání jedné zprávy při výpadku větší části sítě.
Bylo zde zachováno dvoustavové vyhodnocení informace o nedostupnosti, tedy pakliže nedojde ani jeden ping z pěti 1. minutu změní se stav z 0 (dostupný) na 1 (možná nedostupný) a pakliže v následujícím testu (u nás 3. minuta) zase nedojde žádný z 5 pěti pingů dojde k odeslání zprávy.
IP serverů se zadávají do address listu „IPTest“ a je potřeba vyplnit comment – to je textová identifikace serveru pro odesílání zprávy.
Požadavky a rizika:
1, žádný jiný skript se nesmí jmenovat „IPTest*“ (cokoliv začínající IPTest). Při tvorbě skriptů dojde k vymazání všech scriptů takto začínajících.
2, IP hlídaných serverů vkládejte do address listu IPTest. Nedostupné servery se v tomto listu disableují, ale i tak jsou hlídané. Je to z důvodu nastavování „počátečního“ stavu proměnných. Toto je pro případ dlouhodobě nedostupného serveru pro to aby při generování nových skriptů nedošlo k novému hlášení nedostupnosti serveru. Pakliže server nechcete hlídat, musíte jej úplně vymazat nebo přesunout do jiného listu
3, Nechte pojmenované scripty tak, jak to mám já, nebudete pak komplikovaně upravovat návaznost těchto skriptů:
Scripty pro verzi 3.x
CheckIPTest
Pouští se každou sudou minutu a odesílá případné hlášení
:local email tvujemail@t-email.cz
:global IPTestStatusDown
:global IPTestStatusUp
:if ($IPTestStatusDown!="") do={
/tool e-mail send to=$email subject=("Cas: " . [/system clock get time]) body=(" DOWN:".$IPTestStatusDown)
:set IPTestStatusDown ""
}:if ($IPTestStatusUp!="") do={
/tool e-mail send to=$email subject=("Cas: " . [/system clock get time]) body=(" UP:".$IPTestStatusUp)
:set IPTestStatusUp ""
}kod pro zavedení do scheduleru:
/system scheduler add comment="" disabled=no interval=2m name=CheckIPTest on-event=CheckIPTest start-date=jan/01/1970 start-time=00:00:00
MakeScripts
Vyrábí jednotlivé testovací scripty, zaváděcí script a nastavuje scheduler pro pouštění testovacích scriptů
:local ip
:local com
:local counter
:local initscript
:global IPTestName
:set IPTestName ""
:set counter 0
:foreach i in=[/system script find] do={
:if ([:find [/system script get $i name] "IPTest"]=0) do={
/system script remove $i
}
}
:foreach i in=[/system scheduler find] do={
:if ([:find [/system scheduler get $i name] "IPTest"]=0) do={
/system scheduler remove $i
}
}
:foreach i in=[/ip firewall address-list find list=IPTest] do={
:set ip [/ip firewall address-list get $i address]
:set com [/ip firewall address-list get $i comment]
:set initscript ($initscript.":global IPTest".$counter."\r\n")
:if [/ip firewall address-list get $i disabled] do={:set initscript ($initscript.":set IPTest".$counter." 2\r\n") }
/system script add name=("IPTest".$counter) policy=ftp,write,read,test,winbox source=("#Testuje server ".$com.", IP ".$ip."\r\n:global IPTest".$counter."\r\n:global IPTestStatusDown\r\n:global IPTestStatusUp\r\n\r\n:if ([/ping ".$ip." count=5] = 0) do={\r\n :if (\$IPTest".$counter." = 1) do={\r\n :set IPTest".$counter." 2\r\n :set IPTestStatusDown (\$IPTestStatusDown . \"".$com.", \")\r\n :foreach i in=[/ip firewall address-list find list=IPTest comment=".$com."] do={/ip firewall address-list disable \$i}\r\n }\r\n :if (\$IPTest".$counter." = 0) do={:set IPTest".$counter." 1}\r\n } else={\r\n :if (\$IPTest".$counter." = 2) do={\r\n :set IPTestStatusUp (\$IPTestStatusUp . \"".$com.", \") \r\n :foreach i in=[/ip firewall address-list find list=IPTest comment=".$com."] do={/ip firewall address-list enable \$i}\r\n }\r\n :set IPTest".$counter." 0\r\n }\r\n}")
/system scheduler add name=("IPTest".$counter) start-time=0:1:0 interval=0:2:0 on-event=("IPTest".$counter)
:set IPTestName ($IPTestName.",".$com)
:set counter ($counter+1)
}/system script add name=IPTestInit policy=ftp,write,read,test,winbox source=($initscript)
/system script run IPTestInit
/system script remove IPTestInit
Přidání adres pro testování:
/ip firewall address-list add address=1.1.1.1 comment=Test1 disabled=no list=IPTest
/ip firewall address-list add address=2.2.2.2 comment=Test2 disabled=no list=IPTest
Po zadání IP adres je potřeba pustit script MakeScripts
/system script run MakeScripts
Celý kód pro nahrání do MT (CTRL+C -> CTRL+V):
/system script add name=MakeScripts policy=ftp,read,write,policy,test,winbox source=":local ip\r\
\n:local com\r\
\n:local counter\r\
\n:local initscript\r\
\n\r\
\n:global IPTestName\r\
\n\r\
\n:set IPTestName \"\"\r\
\n:set counter 0\r\
\n\r\
\n:foreach i in=[/system script find] do={\r\
\n:if ([:find [/system script get \$i name] \"IPTest\"]=0) do={\r\
\n /system script remove \$i\r\
\n }\r\
\n} \r\
\n\r\
\n:foreach i in=[/system scheduler find] do={\r\
\n:if ([:find [/system scheduler get \$i name] \"IPTest\"]=0) do={\r\
\n /system scheduler remove \$i\r\
\n }\r\
\n} \r\
\n\r\
\n:foreach i in=[/ip firewall address-list find list=IPTest] do={\r\
\n :set ip [/ip firewall address-list get \$i address]\r\
\n :set com [/ip firewall address-list get \$i comment]\r\
\n :set initscript (\$initscript.\":global IPTest\".\$counter.\"\\r\\n\
\")\r\
\n :if [/ip firewall address-list get \$i disabled] do={:set initscript (\$initscript.\":set IPTest\".\$counter.\" 2\\r\\n\") }\r\
\n /system script add name=(\"IPTest\".\$counter) policy=ftp,write,read,test,winbox source=(\"#Testuje server \".\$com.\", IP \".\$ip.\"\\r\\n:global IPTest\".\$counter.\"\\r\\n:global IPTestStatusDown\\r\\n:global IPTestStatusUp\\r\\n\\r\\n:if ([/ping \".\$ip.\" count=5] = 0) do={\\r\\n \
:if (\\\$IPTest\".\$counter.\" = 1) do={\\r\\n :set IPTest\".\$counter.\" 2\\r\\n :set IPTestStatusDown (\\\$IPTestStatusDown . \\\"\".\$com.\", \\\")\\r\\n :foreach i in=[/ip firewall address-list find list=IPTest comment=\".\$com.\"] do={/ip firewall address-list disable \\\
\$i}\\r\\n }\\r\\n :if (\\\$IPTest\".\$counter.\" = 0) do={:set IPTest\".\$counter.\" 1}\\r\\n } else={\\r\\n :if (\\\$IPTest\".\$counter.\" = 2) do={\\r\\n :set IPTestStatusUp (\\\$IPTestStatusUp . \\\
\"\".\$com.\", \\\") \\r\\n :foreach i in=[/ip firewall address-list find list=IPTest comment=\".\$com.\"] do={/ip firewall address-list enable \\\$i}\\r\\n }\\r\\n :set IPTest\".\$counter.\" 0\\r\\n }\\r\\\
n}\")\r\
\n /system scheduler add name=(\"IPTest\".\$counter) start-time=0:1:0 interval=0:2:0 on-event=(\"IPTest\".\$counter)\r\
\n :set IPTestName (\$IPTestName.\",\".\$com)\r\
\n :set counter (\$counter+1)\r\
\n}\r\
\n/system script add name=IPTestInit policy=ftp,write,read,test,winbox source=(\$initscript)\r\
\n/system script run IPTestInit\r\
\n/system script remove IPTestInit\r\
\n\r\
\n"
/system script add name=CheckIPTest policy=ftp,read,write,test,winbox,sniff source=":local email tvujemail@t-email.cz\r\
\n\r\
\n:global IPTestStatusDown\r\
\n:global IPTestStatusUp\r\
\n\r\
\n:if (\$IPTestStatusDown!=\"\") do={\r\
\n /tool e-mail send to=\$email subject=(\"Cas: \" . [/system clock get time]) body=(\" DOWN:\".\$IPTestStatusDown)\r\
\n :set IPTestStatusDown \"\"\r\
\n}\r\
\n\r\
\n:if (\$IPTestStatusUp!=\"\") do={\r\
\n /tool e-mail send to=\$email subject=(\"Cas: \" . [/system clock get time]) body=(\" UP:\".\$IPTestStatusUp)\r\
\n :set IPTestStatusUp \"\"\r\
\n}\r\
\n"
/system scheduler add comment="" disabled=no interval=2m name=CheckIPTest on-event=CheckIPTest start-date=jan/01/1970 start-time=00:00:00
/ip firewall address-list add address=1.1.1.1 comment=Test1 disabled=no list=IPTest
/ip firewall address-list add address=2.2.2.2 comment=Test2 disabled=no list=IPTest
/system script run MakeScripts
Pakliže namáte nastavený server pro odesálání mailů nazapomeňte na:
/tool e-mail set server=1.1.1.1 from=mujserver@domena.cz
Očekávám zprávy typu "proč mi tohle nejde ...", ale uznání taky potěší. Osobně mám dobrý pocit výtězství ducha nad hmotou