č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

čtvrtek 3. ledna 2013

VPN a powershell


Řešil jsem úkol vzdálené zálohy PC které si každý den vytváří databázi nebo ji modifikuje.Stroj má konektivitu na internet ale pouze CDMA modem který  nestíhá ani běžný denní provoz.Z tohoto důvodu může stěhování záloh probíhat jen v noci.
A na tuto nezbytně dlouhou dobu se potřebuji připojit pomocí VPN stáhnout zálohy na server a VPN odpojit ,  aby spojení nevytěžovalo linku v denních hodinách.A toto vše z centrály naší organizace.
Celý proces zálohy je rozdělen do dvou bloků první je lokální záloha a druhý je záloha na vzdálený server

Lokální záloha:
Vzdálené PC každý den zálohuje na flash kde se  udržuje 8 záloh.Zde se v případě nouze mohu  vrátit o 8dní zpět.Tato záloha je myšlena jako ošetření havárie pevného disku.


Záloha na vzdálený server:
Vytváří dvakrát v týdnu jednu zálohu a starou maže(ve výsledku máme v adresáři vždy jednu aktuální zálohu).Soubor má název ZipPraha a je v cestě D:\ZipPraha.
Na našem serveru se v daný čas spustí powershell skript který nejdříve otestuje zda existuje starý adresář zálohy (je zde řeč o předešlé stažené záloze která se umísťuje na server  disk C:).Pokud adresář existuje,bude smazán i se všemi soubory.Tento krok nám zajišťuje že se nám adresáře nehromadí.Tedy nezvyšuje se objem dat které ještě stěhuji dále na podnikové úložiště kde už zálohy držím 20dní zpět.
Poté skript vytvoří  na serveru adresář jehož název je aktuální datum.
Dále si server sáhne na disk D vzdáleného PC a překopíruje celý adresář ZipPraha na svůj disk C: do adresáře jenž vytvořil.Veškeré své počínání(úspěch,neúspěch) zapisuje skript do logu.
Celý proces je ošetřen podmínkou.Pokud je spojení úspěšně navázáno provede se hlavní skript.Pokud spojení není zapíšeme neúspěch do logu.Skript končí tím že ukončíme VPN spojení.

Časový rozvrh vzdálené zálohy
00:10 smaže z c: soubor z předešlého dne
00:20 stáhne zálohu ze vzdáleného PC a uloží na svůj disk c:
00:50 staženou zálohu z c: umístí do podnikového úložiště(zde už držím zálohu po dnech 20dní zpět)

Skript funguje pomocí již vytvořeného spojení které musíme mít nakonfigurované předem.Jednoduše řečeno pomocí palubních prostředků windows si mezi stroji vytvoříte VPN spojení na bázi klient(vzdálené PC) server(server u vás v organizaci) a toto spojení smysluplně pojmenujete.Powershell pak spojení pomocí jména zavolá a předá parametry spojení(jméno,heslo)


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

#vytoc spojeni na PRAHA,povereni user:Administrator  heslo:tajneheslo
rasdial PRAHA Administrator tajneheslo
#pockej 30 sekund aby bylo spojeni v poradku navazano
Start-Sleep -Seconds 30
#zalozime log ktery nas bude informovat o provedeni a prubehu skriptu
"Zaloha Rohan" > "C:\VPNLog.txt"
#do logu uvedeme daum a cas spusteni skriptu
get-date >> "C:\VPNLog.txt"
#test konektivity na vzdalene PC.  IP tohoto stroje naleznete treba v
#..sit nastaveni>jmeno vpn spojeni>podrobnosti 
$connect = Test-Connection 192.168.0.10 -quiet
#pokud existuje spojeni na vzdalene pc provede se skript v zavorkach
if($connect -like "True")
{
#spojeni je uspesne zapiseme tuto skutecnost do logu
"Spojeni navazano" >> "C:\VPNLog.txt"
#datum si naformatujeme do podoby retezce ktery muze reprezentovat
#..nazev sdresare
$datum = "{0:yyyy_MM_dd}" -f (get-date)
#pokud existuje adresar zaloha
if (Test-Path C:\Zaloha\)
{
#smaze puvodni adresar jinak by cobian stehoval stale vetsi objem dat
# .. -recurse rika smaz vse vcetne podadresaru
del C:\Zaloha\ -Recurse
}
#v zadane ceste si vytvorime adresar jehoz jmeno je dnesni datum
New-Item -ItemType directory -Path C:\Zaloha\$datum
#zkopirujeme zadany adresar do zadaneho umisteni adresa 192.168.0.10
#..to je adresa meho protejsku v mini-siti VPN.Zjistite ji tak
#..ze si rozkliknete sitova spojeni pak VPN a podrobnosti
copy-item "\\192.168.0.10\d$\ZipPraha " -destination
"C:\Zaloha\$datum" -recurse -Force
#info do logu o uspesnem provedeni skriptu
"Zaloha probehla v poradku " >> "C:\VPNLog.txt"
#info o case kdy byla zaloha dokoncena
get-date >> "C:\VPNLog.txt"
#odpojime VPN spojeni ke vzdalene stanici
rasdial /disconnect
}
#vse v zavorkach vyse se provede jen v pripade ze spojeni bylo navazano
#..pokud spojeni neni navazano nastava situace else
else
{
#zapiseme do logu informaci o neuspesnem spojeni
"Selhání spojeni" >> "C:\VPNLog.txt"
#info o case kdy se zaloha nepovedla
get-date >> "C:\VPNLog.txt"
#odpojime VPN spojeni ke vzdalene stanici
rasdial /disconnect
}