č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
}



úterý 16. října 2012

Změna DNS serveru


Hromadná změna DNS serveru pomocí powershellu:
Parametry pro sítový adaptér jsou v drtivé většině případů získávány automaticky.Jenže není tomu tak vždy.Což je i můj případ,je tu spousta serverů a dalších podpůrných PC(stanic) které mají  jak IP tak DNS servery nastaveny natvrdo.A protože přecházíme na nový DNS server...

Máme tu další důvod ke psaní powershell skriptu.Na druhou stranu proč psát další skript když jich na internetu koluje více než dost.Ale vždy je tu nějaké ALE.Například u mne byl problém s notebooky,kdy jejich integrovaný modem znamená další síťový adaptér.Dále pak OpenVPN jenž si vytváří svůj virtuální adaptér.Nemůžu měnit DNS i na těchto adaptérech.Musím vybrat jen ty kterých se to týká.
Ať už adaptér dostane IP od DHCP nebo jí má natvrdo vždy jsou ve stejném rozsahu,jasně jsou i výjimky ale vycházíme z toho že hledáme ve stejném rozsahu IP(typicky   doména) a to je podstata mého filtru který pro změnu DNS serveru vybírá jen ty adaptéry které odpovídají danému rozsahu.
Skript je myšlen pro hromadnou změnu tedy klidně stovky stanic,takže data (názvy stanic) si načítá z obyčejného txt souboru který umístíme na disk C.Txt soubor má tuto podobu:co řádek to název jedné stanice bez prázdných řádků a znaků.Soubor se musi jmenovat seznampc.txt
Výsledek se zapisuje do log souboru který je vytvořen na disku C.Zde si můžeme ověřit zda vše dopadlo tak jak mělo. 
Sekundarní DNS server co tu uvádím(8.8.8.8) patří Google a dle jejich vyjádření bude fungovat vždy až na věčné časy....a nikdy jinak.

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


#budeme menit DNS na vice stanicich takze promenna ktera bude obsahovat jmena PC musi byt
#..typu pole,takzetakto si zinicializujeme promennou typu pole
$pc = @()
#do promenne si nacteme seznam stanic z textoveho souboru ktery mame ulozen na c:
$pc = cat "c:\seznampc.txt"
#do promenne si nacteme dve hodnoty(primarni a sekundarni DNS)
$newdns = "192.168.100.249" , "8.8.8.8"
#zalozime si textovy soubor do ktereho budeme zapisovat podrobny log udalosti.Jako prvni
#...zapiseme aktualni datum a cas kdy byl log vytvoren znamenko > rika ze zakladame novy
#...soubor.Pokud uz existoval bude prepsan timto novym takze vzdy budeme mit aktualni log
Get-Date > "C:\dnsLog.txt"
#postupne si vyzvedneme vzdy jednu stanici a te priradime promenou $stroj tu pak prozeneme
#...skriptem v zavorkach(cyklus foreach)
foreach($stroj in $pc)
#zacatek hlavniho skriptu vse co je mezi touto zavorkou a zavorkou dole probehne tolikrat
#...kolik jsme zaslali PC do kolecka (vzdy jedno kolo pro jeden stroj)
{
#do promenne $connect si ulozime test spojeni na testovane pc(muze byt true nebo false)
#..true=spojeni uspesne false..spojeni neuspesne
$conect = Test-Path \\$stroj\c$
#otestujeme zda je PC nebo server dostupny
if ($conect -eq "True")
#pokud je spojeni uspesne zapiseme tuto skutecnost do logu
{"$stroj je dostupny" >> "C:\dnsLog.txt"
#promenne $dns priradime udaje o sitovem adapteru konkretniho pc
#...(tedy pc ktere momentalne proudi v roure)
$dns = Get-WmiObject win32_networkadapterconfiguration -computername $stroj
#...vybereme jen ty adaptery ktere maji konkretni IP tedy jsou v domenovem rozsahu
$dnslive = $dns | where-object {$_.ipaddress -like "192.168.100.*" }
#provedeme zmenu DNS serveru na server definovany na zacatku skriptu
$dnslive.setDNSServerSearchOrder($newdns)
#do promenne si nacteme aktualni info o parametrech sitoveho pripojeni a
#...to jen pripojeni ktere ma konkretni IP tedy rozsah domeny
$dnspote = Get-WmiObject win32_networkadapterconfiguration -computername $stroj |
where-object {$_.ipaddress -like "192.168.100.*" }
#promenne $jakedns priradime momentalni hodnotu DNS
$jakedns = $dnspote.DNSServerSearchOrder
#pokud se DNS shoduje se vzorem prvni hodnota je 192.168.100.249 a zaroven
#...druha hodnota je 8.8.8.8 pak je splnena podminka a provede se vse v zavorkach
if (($jakedns -match "192.168.100.249") -and ($jakedns -match "8.8.8.8"))
#podminka vyse byla splnena...zmena probehla v poradku..zapis uspech do logu
{ "Zmena dns na $stroj probehla v poradku ......" >> "C:\dnsLog.txt"}
#zapis se nezdaril..zapis neuspech do logu
else {"POZOR   ...  zmena dns na $stroj selhala ......" >> "C:\dnsLog.txt"}
#prazdne radky do logu(ciste jen graficka uprava vystupu)
" " >> "C:\dnsLog.txt"
" " >> "C:\dnsLog.txt"
#uzaviraci zavorka podminky(zda je dostupny server nebo PC)
}
#podminka dostupnosti PC nebo serveru nebyla splnena provede se ELSE
#..pokud spojeni selhalo zapiseme informaci do logu
else {"nepodarilo se pripojit k $stroj" >> "C:\dnsLog.txt"}
#uzavirajici zavorka bloku foreach
}

úterý 2. října 2012

EventLog:chyba



Máme PC nebo server u kterého je důležité aby fungoval bez problémů 24 hodin denně.Většina závad se sama ohlásí daleko předem a to zápisem do eventlogu.Může se jednat o výstrahu,upozornění a v nejhorším případě i chybová hláška.
Kontrolovat každý den několik stanic je nereálné.Takže pokud máme vše dobře nastaveno a máme moderní OS který dokáže varování odeslat emailem... je vše ok.
Jenže co když nemáme ten správný OS nebo chceme kontrolu centralizovat..no jasně máme powershell.
Tento skript si vzdáleně sáhne pro výpis z logu na jakémkoliv stroji a zpracuje ho.Zde konkrétně řešíme výpis ze systémového logu.Zajímají nás jen chyby a to jen z dnešního dne.Z tohoto důvodu je vhodné naplánovat spuštění skriptu na pozdní večerní hodiny.
Pokud se najdou nějaká chybová hlášení jsou zapsána do logu(textový soubor).Ten je následně odeslán na danou emailovou adresu jako příloha zprávy.
Skript pro odeslání emailu s přílohou není můj.Popsal ho Patrik Malina ve své knize jak vyzrát na powershell  2.0 ,ti co to myslí s powershellem vážně už jí mají a ti ostatní si ji nakonec stejně koupí.


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

#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
{
#zde je casova pauza ktera pocka 5 sekund aby predesly 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 = "skrtek@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-SYSTEMOVY LOG"
#text zpravy
$zprava.Body = "Byla zaznamenana chyba v systemovem logu"
#zde si do promenne ulozime cestu k vytvorenemu logu
$cesta = "c:\errorlog.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()
}


#zalozime textovy dokument a to na PC jenz spousti tento skript,textovy soubor..
#.. bude se jmenovat errorlog a bude umístěn na disku c:
#..první radek txt souboru bude obsahovat text z uvozovek.znamenko > znamená..
#..zaloz novy soubor pokud soubor existuje pak jej přepíše
#..to nám zajistí že log bude vzdy aktualni
"Log ze serveru srvr" > c:\errorlog.txt
#do promenne uloz aktualni datum
$datum = Get-Date
#eventlog ze stanice srvr posli do roury a pak filtruj jen objekty kde je entrytype..
#..error vyber jen prvnich deset a to vse uloz do promenne
#..jedna se o vypis z logu system
$errorpet = Get-EventLog system -ComputerName srvr |
Where-Object { $_.entrytype -like "error"} | select -First 10
#inicializuj promennou a typu pole
$zprava = @()
#do roury zasleme prvnich 10 zaznamu typu error vse co je v zavorkach se tedy 10x zopakuje..
#..pro kazdy zaznam jedno kolo
$errorpet | foreach{
#promenna $casy nabude hodnotu timewriten tedy cas zapsani zaznamu do logu
$casy = $_.timewritten
#filtr ktery porovna aktualni datum s datumem vytvoreni..
#..takze se nam vrati jen zaznamy z dnesniho dne
if($datum.Year -le $casy.Year -and $datum.Month -le $casy.Month -and $datum.Day -le $casy.Day)
{
#pokud plati podminka vyse,tedy pokud je zaznam z dnesniho dne pak se zaznam prida do $zprava
$zprava+= $_
}
#vse v zavorkach se zopakuje 10x tedy pro kazdy zaznam jedno kolecko kdy se zjisti zda..
#..je zaznam z dnesniho dne,pokud ano prida se k zaznamum ktere tuto podminku splnuji ..
#... vsechny zaznamy jsou zapsany v promenne $zprava vse co je provadeno pod..
#...zavorkou dole seprovede az po skonceni cyklu foreach
}
#zde muzou nastat dve situace,promena $zprava obsahuje zaznamy.jinak receno..
#..byla nalezena shoda(existuje error hlaska z dnesniho dne) nebo..
#...promenna $zprava je prazdna takze neexistuje zaznam z dnesniho data
#...zde je osetren pripad prvni tedy promenna $zprava ma nejakou hodnotu
if ($zprava)
{
#pokud je splnena podminka vyse pripise se zprava do errorlogu znamenko >> znamena pripsat..
#..text(v tomto pripade pripise error zaznamy)
$zprava >> c:\errorlog.txt
#a protoze byl nejaky error zaznam nalezen zavolame funkci email ktera odesle zpravu a..
#..jako prilohu txt soubor z logem
sendemail
}
#zde je osetren pripad kdy promenna $zprava je prazdna v tomto pripade vypise.. 
#..do konzole text...."nic nenalezeno" a tim beh skriptu konci
if (!$zprava) {echo "nic nenalezeno"}