čtvrtek 4. července 2013

Watchdog programu


Musíme ohlídat zda nám na serveru běží konkrétní software:
Představte si firmu kde je několik video serverů.Přesněji servery pro nahrávání videa z kamerového IP systému.Na každém serveru běží program Nuoo který nahrává záznam,ale dokáže si i ohlídat IP kamery a v případě ztráty signálu poslat email.Jenže pokud Nuoo neběží,pak žijeme v blahé nevědomosti že se záznamy vesele tvoří. Z tohoto blaženého pocitu vás vytrhne až žádost policie o kamerový záznam ,který nemáte a vy vše musíte vysvětlovat nadřízenému,policii atd.
Co se stalo? mám nástroje které nám včas nahlásí že nějaký server není na síti.Jenže server byl na síti a byl funkční jen neběžel program pro záznam videa.
Jinými slovy je tu důvod sáhnout po powershellu.
Cíl:zkontrolovat zda na serveru běží konkrétní proces a pokud ne odeslat email s výstražnou zprávou.
V zájmu čistoty kodu jsem ještě přidal test na dostupnost serveru na síti,plus dostupnost disku c který je pro běh programu nezbytný.
Skript nejdříve otestuje zda je server na síti a zda má dostupný disk c.Pokud je toto splněno tak teprve poté je server přidán do seznamu serveru na kterých se provede test na běžící procesy.
Jistě dalo by se to ošetřit podmínkou a k závěrečnému testování připustit jen ty servery které jsou živé,ale tento způsob jsem použil už v předešlých ukázkách a tak nabízím další alternativu.



################################  Vytvoril:Petr Skrivan ####################################

#pozor tato funkce se provadi az nakonec i kdyz je na zacatku skriptu tak je ignorovana..
#..a spusti se az po zavolani(funkce se vola pomoci jmena)


#pojmenovani funkce:tato se stara o odeslání emailu s přílohou pochazi z knihy...
#..Jak vyzrát na powershell 2.0 (vrele doporucuji)od Patrika Maliny
function sendemail
{
#testujeme zda promenna $odesleemail ma hodnotu 1 pokud ano odesle email..
#..vzdy kdyz se neco pokazi(neni ping atd)tak promenne $odesleemail priradime hodnotu 1
#..zde tedy testneme zda se v prubehu skriptu neco pokazilo
if($odesleemail -eq 1)
{
#zde je casova pauza ktera pocka 5 sekund aby skript mel dostatek casu na ulozeni text-logu
Start-Sleep -Seconds 5
$smtpKlient = new-object system.net.mail.smtpClient
$zprava = New-Object system.net.mail.mailmessage
$prihlaseni = New-Object system.net.NetworkCredential
#zde uvedete vase prihlasovaci udaje na postovnim serveru
$prihlaseni.username = "skritek@neco.cz"
$prihlaseni.Password = "heslo"
#adresa postovniho serveru
$smtpKlient.Host = "192.168.100.100"
#prihlasovaci procedura
$smtpKlient.Credentials = $prihlaseni
#od koho byla zprava odeslana
$zprava.From = "error@neco.cz"
#komu odesilame zpravu
$zprava.To.Add("skritek@neco.cz")
#predmet zpravy
$zprava.Subject = "VAROVANI-Software Nuoo"
#text zpravy
$zprava.Body = "Byla zaznamenana chyba v kamerovem systemu"
#zde si do promenne ulozime cestu k vytvorenemu logu
$cesta = "c:\kamery.txt"
#novy objekt priradime promenne $priloha
$priloha = New-Object system.net.mail.attachment($cesta)
#zde prilohu pridame do zpravy
$zprava.Attachments.Add($priloha)
#odesleme zpravu
$smtpKlient.Send($zprava)
#uvolni prilohu(treba pro dalsi zpracovani)
$priloha.Dispose()
}
#ac to tak nevypada tak toto je posledni prikaz skriptu protoze je uzavren ve funkci..
#..ktera se provadi az na zavolani funkce jmenem v nasem pripade sendmail na konci skriptu
exit
}
#zde si deklarujeme globalni promennou a priradime ji hodnotu 0
[int] $global:odesleemail = 0
$datumacas=Get-Date
#zalozime textovy log pojmenujeme a zaroven zapiseme text v uvozovkach,plus..
#..pridame aktualni datum a cas jeden znak > znamena zaloz txt soubor,pokud..
#..existuje pak ho prepis,timto si osetrime ze se nam logy nebudou hromadit..
#..protoze novy log prepise automaticky ten stary
"Zacatek testu $datumacas" > c:\kamery.txt
#seznam serveru ulozime do promenne
$comp="kamery","kamery2","kamery3","kamery4","kamery5","kamery6","kamery7"
#deklarujeme promennou typu pole
$overenecompy = @()
#seznam serveru posleme do roury vzdy jeden ze seznamu,promena $_ je jmeno serveru ktery..
#..je momentalne v roure je to vlastne cyklus ktery se zopakuje tolikrat kolik serveru..
#..do roury posleme
$comp | foreach {
#otestujeme zda je server na siti,rovnou zde testuji zda je dostupny disk c,ktery je pro..
#..beh softwaru nezbytny...POZOR skript musi spoustet PC s admin pravy na domenu
$zijeserver=Test-Path "\\$_\c$"
#pokud byla cesta v siti nalezena
if ($zijeserver -eq "true")
{
echo "Server $_ je online"
#do logu zapiseme ze server je online a bezi,dve znamenka >> znaci ze text se ma pridat..
#..do stavajiciho logu,promenna $_ reprezentuje jmeno serveru ktery momentalne testujeme
"Server $_ je online" >> c:\kamery.txt
#server je v poradku je na siti,takze ho pridame do seznamu pro testovani zda na nem bezi..
#..i nas hledany software
$overenecompy += $_
}
#pokud neni server na siti nebo nema pristupny disk c provede se else
else
{
echo "Server $_ ,nebo disk C: neni dostupny"
#zapis do logu..zvyraznime pomoci grafiky(povystrčíme upozornění)
          "Server $_ ,nebo disk C: neni dostupny.. !!!!! POZOR !!!" >> c:\nuoo.txt
#neco je spatne potrebujeme odeslat email takze nasi promenne priradime hodnotu 1
$global:odesleemail = 1
#a protoze server nebyl nalezen,neni pridan do promenne $overenecompy,timto je vyrazen..
#..z dalsiho testovani protoze nadale budeme pracovat se seznamem $overenecompy
}
}
#graficka uprava logu
"------------------------------------------------------" >> c:\kamery.txt
" " >> c:\kamery.txt
#opet roura stejne jako vyse zde si jen objekt proudici v roure pojmenujeme..
#..takze nepracujeme s promennou $_ ale $finalcomp,ktera postupne nabude vsechny..
#..hodnoty(jmeno serveru) z naseho seznamu overenych serveru
##
foreach ($finalcomp in $overenecompy)
{
#do promenne $proces si nacteme jmena vsech bezicich procesu a vyhledame ten ktery nas zajima
#pokud hledany proces najdeme je jasne ze software bezi a promenna $proces nabude hodnotu..
$proces=Get-Process -ComputerName $finalcomp|where-object{$_.processname -like “mainconsole”}
#zajimava podminka ktera testuje zda ma promena jakoukoliv hodnotu,pokud neni null pak ..
#..podminka projde
if ($proces)
{
#vse je v poradku neni treba odesilat email zapiseme uspech do logu
"Software Nuoo na serveru $finalcomp je zcela funkcni" >> c:\kamery.txt
echo "Nuoo na serveru $finalcomp ok"
}
#promenna $proces ma hodnotu null jinymi slovy proces nebyl,nalezen uplne proste...
#..program na serveru nebezi,provedeme tedy else
else
{
#musime odeslat email o coz se postara promenna odesleemail
$global:odesleemail = 1
#
echo "Na serveru $finalcomp nebezi Nuoo "
#vysledek testu(neuspech) zapiseme do logu
"Na serveru $finalcomp doslo k potizim se softwarem Nuoo...!!! POZOR !!!" >> c:\kamery.txt
}
}
#zavolame funkci
sendemail