
% Kapitola "Dohledový systém"


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\kapitola{Dohledový systém}
\label{kap:dohled}
V předchozích kapitolách byl popsán návrh hardware interface, který je schopen ve spojení s~vhodnou radiostanicí přenést povel k~restartu ke vzdálenému síťovému zařízení -- prvku. Již tato základní funkce umožňuje rychle a~poměrně efektivně řešit celou řadu problémů, které mohou na vzdálené straně vzniknout. Nevýhodou stále zůstává nutnost manuální obsluhy administrátorem nebo jiné pověřené osoby.
\par
Mezi hlavní koncepční požadavky této diplomové práce patří návrh dohledového systému, který by byl do jisté míry autonomní ve vztahu k~problémovým vzdáleným prvkům. Je zcela zřejmé, že v~provozu bezdrátové počítačové sítě mohou vzniknout situace, kdy je zásah administrátora nutný vzhledem k~jeho analytickým schopnostem a~zkušenostem. Každý výpadek síťového prvku má svoji příčinu a~úkolem administrátora je, aby se pokusil o~nápravu vedoucí ke snížení četnosti výpadků, nejlépe k jejich úplné eliminaci. To lze provést například vhodnou úpravou konfigurace prvku v~závislosti na předchozích zkušenostech s~produkty daného výrobce a~jejich chováním. Navrhnout zcela autonomní systém, který by byl schopen i~těchto pochodů je náročné a~vzhledem k~úhrnné četnosti výpadků prvků v~řádu týdnů i~poměrně zbytečné. 
\par
Zcela dostatečná funkcionalita dohledového systému spočívá v~detekci síťové dostupnosti testovaného prvku a~případnému využití navržených interface k~jeho vzdálenému restartu. Samozřejmostí je i~informování administrátora, že k~restartu prvku došlo a~je pak na jeho uvážení, jaké kroky provede dál. Výhodou tohoto řešení je snadná implementovatelnost a~nízká reakční doba při řešení výpadků, kdy vzdálený restart vyhovuje.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\sekce{Struktura dohledového systému}
Dohledový systém je založen na vzájemné interakci čtyř funkčních celků:
\medskip
\begin{itemize}
\item{\textit{DBMS (Database management system)}: datová implementace topologie sítě, jednotlivých prvků, jejich vzájemných vazeb a~provozních stavů.}
\item{\textit{Detekce}: detekuje dostupnost nebo nedostupnost prvků v~závislosti na jejich vzájemných vazbách. Spouštěno periodicky.}
\item{\textit{Akce}: komunikuje s~interface a~realizuje případný restart lokálních nebo vzdálených síťových prvků. Spouštěno periodicky po detekci.}
\item{\textit{Uživatelské rozhraní}: prostředí pro administraci prvků v~DBMS a~konfiguraci parametrů pro detekční a~akční funkční celky. Podrobný popis je uveden v~kapitole \ref{kap:webgui}.}
\end{itemize}
\medskip
\img{dohled/img/dac}%
    {105mm}%
    {Struktura funkčních celků dohledového systému}%
    {fig:dohled:dac}%
    
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newpage
\sekce{Topologie sítě Starhill}
\label{kap:dohled:topology}
Na obrázku \link{fig:dohled:sht} je znázorněna obecná topologie bezdrátové počítačové sítě Starhill. Z~uvedeného obrázku je patrné, že topologie je zakreslena ve formě orientovaného stromového grafu.
%, tzv. zakořeněného stromu. 
\par\noindent\
Faktický význam atributů grafu:
\medskip
\begin{itemize}
\item{\textit{Vrcholy (velké)}: jedná se o~souhrn aktivních síťových zařízení v~jednotlivých lokalitách, které jsou v~majetku sdružení. Např. směrovače, přístupové body nebo přepínače. Ve vrcholu M je umístěn hlavní server zajišťující většinu síťových služeb a~je pro provoz sítě klíčový.}
\item{\textit{Vrcholy (malé)}: jedná se o~uživatelské podsítě, které jsou tvořeny zpravidla klientem bezdrátového spoje a~následným metalickým vedením k~uživateli nebo skupině uživatelů.}
\item{\textit{Orientované hrany}: představují spoje mezi lokalitami. Jsou tvořeny ve většině případů bezdrátovými linkami. Orientace hran v~topologii je uvedena ve smyslu procházení grafem od počátečního vrcholu směrem ke hranici grafu. Datové linky jsou samozřejmě duplexní nebo poloduplexní.}
\end{itemize}
\medskip
\img{dohled/img/sht}%
    {110mm}%
    {Obecná topologie sítě Starhill}%
    {fig:dohled:sht}%
\par
Reálná topologie sítě se od uvedené obecné liší především expanzí vrcholů na jednotlivé konkrétní prvky, které jsou na dané lokalitě obsaženy. Popisuje tak skutečnou cestu (větev) od počátečního vrcholu až k~uživateli ve formě posloupnosti prvků, prostřednictvím kterých datová komunikace probíhá. Tuto posloupnost musí dohledový systém znát nebo si ji být schopen prohledáním grafu sestavit.
\img{dohled/img/sk_posl}%
    {160mm}%
    {Příklad skutečné posloupnosti prvků od vrcholu M k~uživateli v~uzlu v1}%
    {fig:dohled:skposl}%
\par
Z uvedené obecné topologie sítě je zřejmé, že neexistuje žádný způsob, jak se k~nějakému vrcholu dostat více než jednou cestou. Z~toho vyplývá, že v~síti nejsou použity žádné záložní linky. Tento nedostatek lze sice považovat za zásadní, ale je nutné podotknout, že operační rádius použitých radiostanic a~\mbox{Wi-Fi} spojů je 2--5 km. Nasazení redundantních bezdrátových spojů v~tak malém prostoru by ještě více zkomplikovalo situaci v~již tak velmi intenzivně využívaném frekvenčním pásmu 2.4 GHz a~5 GHz. %


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\sekce{Implementace datových struktur v~DBMS PostgreSQL}
\label{kap:dohled:dbms}
Jedna z~nejjednodušších metod popisu vrcholů a~hran stromového grafu je využití vazby rodič~–~potomek. Každý prvek obsahuje ve svém popisu informaci o~prvku, který ho v~dané větvi předchází. Vyjímkou je prvek kořenový s~hodnotou NULL.
\img{dohled/img/rodic_potomek}%
    {90mm}%
    {Znázornění vazby mezi rodičem a~potomky}%
    {fig:dohled:vazby}%
\par
K implementaci stromu byl zvolen relační databázový systém \mbox{PostgreSQL} z~důvodu, že na serveru sítě Starhill je od roku 2004 provozován systém správy sítě Netadmin, který \mbox{PostgreSQL} využívá. Základní jádro tohoto správního systému bylo vytvořeno v~rámci bakalářské práce \cite{lit:mojebp}.  Dohledový systém je v~rámci této diplomové práce chápán jako samostatná aplikace a~lze jej takovým způsobem provozovat. Ve skutečnosti je však požadována možnost kooperace se zmíněným správním systémem Netadmin. Propojení je naznačeno v~relačním diagramu na obr.~\link{fig:dohled:er}.
\img{dohled/img/relacni_diagram}%
    {120mm}%
    {Entitně-relační diagram datové struktury dohledového systému}%
    {fig:dohled:er}%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newpage
\podsekce{Tabulka prvků}
Obsahuje seznam síťových prvků včetně jejich vzájemných vazeb. Součástí jsou také doplňkové atributy pro uschování dalších informací o~prvku.
\input{dohled/codenode}%
\par\noindent
Význam atributů:
\medskip
\begin{itemize}
\item{\textit{id}: unikátní autoinkrementační identifikátor prvku. Referenční integrita relačních vazeb s~ostatními tabulkami je zajištěna pravidlem \texttt{rule\_node\_delref}. Uvedeno v~příloze \ref{kap:supp:cd}.}
\item{\textit{idp}: identifikátor předka. Případná hodnota NULL je z~důvodu snazší programové obsluhy v~detekčním a~akčním funkčním celku reprezentována numerickou nulou.}
\item{\textit{name}: krátké textové označení prvku. Je využíváno při výpisu stromu prvků v~uživatelském rozhraní a~událostními funkcemi.}
\item{\textit{desc}: atribut pro poznámku o~vlastnostech prvku.}
\item{\textit{enable}: povoluje resp. zakazuje zpracování prvku a~celé následující větve.}
\item{\textit{erc}: chybový kód popisující stav prvku. Vysvětleno v~kapitole \ref{kap:dohled:erc}.}
\item{\textit{p\_login}, \textit{p\_pass}, \textit{p\_kanal}: informativní textové atributy pro uložení 
přihlašovacích údajů a~pracovního kanálu Wi-Fi prvku. Údaje jsou v~tabulce uloženy ve formě prostého textu. Veškerá komunikace s~DBMS však probíhá zabezpečeně.}
\item{\textit{update}: časový údaj poslední modifikace záznamu v~tabulce.}
\end{itemize}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Tabulka emailových adres}
Tato tabulka obsahuje seznam emailových adres, na kterých bude administrátor informován při určitých změnách stavu daného prvku. 
\input{dohled/codenodeemail}%
\par\noindent
Význam atributů:
\medskip
\begin{itemize}
\item{\textit{idemail}: autoinkrementační primární klíč.}
\item{\textit{id}: referenční ukazatel do tabulky node na identifikátor konkrétního prvku.}
\item{\textit{email}: emailová adresa. S atributem je svázán regulární výraz, který je platný pouze pro nenulový řetězec s~výskytem znaku @ a~minimálně jedním dalším znakem na obou jeho stranách. Jedná se o~základní ochranu proti překlepům, nikoliv pravidlo pro zaručení absolutní syntaktické platnosti emailové adresy.}
\end{itemize}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Tabulka IP adres prvků}
Obsahem této tabulky je seznam IP adres těch prvků, které jsou spravovatelné a~mají přidělenou IP adresu na některém ze svých rozhraní.
\input{dohled/codenodeip}%
\par\noindent
Význam atributů:
\medskip
\begin{itemize}
\item{\textit{idip}: autoinkrementační primární klíč.}
\item{\textit{id}: referenční ukazatel do tabulky node na identifikátor konkrétního prvku. Umožňuje realizovat vazbu mezi prvkem a~jeho IP adresou, resp. několika IP adresami.}
\item{\textit{ip}: IP adresa prvku. Datový typ inet zajistí validitu IPv4 nebo IPv6 adresy. Případná síťová maska je odstraněna a~je zbytečné ji zapisovat.}
\end{itemize}



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Tabulka parametrů pro interface}
Tabulka \texttt{node\_reset} je určena pro uložení parametrů interface (adresy, výstupní port, část).  Dohledový systém tyto údaje využívá při vytváření příkazu pro interface, který je připojen k~lokálnímu sériovému portu a~zajišťuje spojení se vzdálenými interface.
\input{dohled/codenodereset}
\medskip
\begin{itemize}
\item{\textit{idreset}: autoinkrementační primární klíč.}
\item{\textit{id}: referenční ukazatel do tabulky node na identifikátor konkrétního prvku.}
\item{\textit{time}, \textit{out}: výstupní port a~čas aktivace výstupu. Hodnoty jsou testovány na správnost.}
\item{\textit{address}, \textit{repeater}: adresa vzdáleného interface, případně opakovače.}
\item{\textit{type}: Typ příkazu, který bude lokálně připojenému interface odeslán. Možnosti jsou:}
\begin{itemize}
\item{\textit{D (direct)}: bude sepnuto relé na lokálně připojeném interface.}
\item{\textit{P (remote)}: povel bude zaslán vzdálenému interface v~radiové dostupnosti.}
\item{\textit{R (repeater)}: k~přenosu povelu bude využito funkce opakovače.}
\end{itemize}
\end{itemize}
\medskip


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Tabulka textových popisů stavů}
Tabulka obsahuje krátké textové popisy stavů, ve kterých se prvek nachází.
\input{dohled/codenodeerc}
\par\noindent
Význam atributů:
\medskip
\begin{itemize}
\item{\textit{erc}: identifikátor chybového stavu s~vazbou na atribut \texttt{erc} z~tabulky \texttt{node}.}
\item{\textit{text}: krátký textový popis příslušného chybového stavu. Maximální velikost 255 znaků.}
\end{itemize}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\sekce{Typy prvků}
Dle obsahu tabulek \texttt{node\_ip}, \texttt{node\_reset} a~\texttt{node\_email} lze stanovit šest typů prvků. Uvažovány jsou tyto faktory:
\medskip
\begin{itemize}
\item{Testovatelnost.}
\item{Resetovatelnost.}
\item{Informovatelnost.}
\end{itemize}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Testovatelný prvek}
Jedná se o~aktivní prvek ve smyslu jeho vlastní síťové komunikace na úrovni TCP/IP. Alespoň na jednom ze svých rozhraních má nastavenou IP adresu, resp. několik adres. V~síti Starhill se jedná zpravidla o~přístupové body, klientské adaptéry, hardware peer-to-peer spojů a~spravovatelné přepínače. Dohledový systém je schopen ověřit dostupnost prvku na všech jeho aktivních rozhraních. Předpokladem je korektní nastavení směrovacích tabulek u~směrovačů, které jsou předcházejícími prvky testovanému prvku na stejné větvi. IP prostor prvku nesmí být izolován.
\par
Nutnou podmínkou testovatelnosti je jeden nebo několik záznamů v~tabulce \texttt{node\_ip} v~referenčním vztahu k~danému prvku.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Netestovatelný prvek}
Tento prvek obsahuje hardware pro obsluhu komunikace na fyzické a~linkové vrstvě dle ISO/OSI. Jedná se převážně o~nespravovatelné přepínače a~média konvertory z~optického kabelu na metalický apod. Dohledový systém není schopen otestovat dostupnost těchto prvků. Je však schopen odvodit korektní funkčnost netestovatelného prvku za podmínky, kdy libovolný následující prvek dané větve je testovatelný a~současně dostupný.
\img{dohled/img/netestovatelne}%
    {125mm}%
    {Znázornění vazby mezi rodičem a~potomky}%
    {fig:dohled:netest}%
\par\noindent
Z obr. \link{fig:dohled:netest} vyplývá, že v~případě nedostupného prvku 4 nemusí být jako problémový okamžitě označen právě on, ale nekorektní funkci mohou vykazovat také jeho netestovatelní předchůdci 3, 2 a to až do úrovně testovatelného předchůdce 1. Tato vlastnost byla při návrhu systému zohledněna.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Resetovatelný prvek}
\par
Pokud lze k~resetu nebo restartu prvku využít navrženého interface, je takový prvek označen jako resetovatelný. Není důležité, zda-li k~předání povelu dojde lokálně, vzdáleně nebo s~využitím opakovače. Klíčový je pouze fakt, aby se dohledový systém mohl pokusit obnovit korektní činnost sám bez asistence administrátora. Podmínkou resetovatelnosti je záznam, resp. záznamy v~tabulce \texttt{node\_reset} pro daný prvek. 
\par
Pokud je resetovatelný prvek zároveň prvkem netestovatelným, dohledový systém vykoná restart tohoto prvku za předpokladu, že za tímto prvkem následuje v~dané větvi prvek, který je testovatelný a~nedostupný. Modelová situace je zobrazena na obr. \link{fig:dohled:netest} a~týká se prvku 2. Tímto způsobem lze vyřešit problém nekorektně pracujících síťových přepínačů.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Neresetovatelný prvek}
Neresetovatelný prvek nelze prostřednictvím navržených interface resetovat nebo restartovat. V~případě chybné funkce je nutné, aby administrátor provedl osobní zásah v~lokalitě, kde je prvek umístěn.
\par
Pokud je tento prvek testovatelný, dohledový systém jej označí jako nedostupný a~informuje administrátora o~vzniklé situaci. V~opačném případě dojde k~situaci, kdy není možné určit chybný prvek, nelze se pokusit činnost prvku obnovit a~daná větev sítě zůstane nedostupná.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Informovatelný a~neinformovatelný prvek}
Informovatelný prvek poskytuje dohledovému systému komunikační kanál, který je využit pro předávání zpráv o~klíčových stavech prvku administrátorovi nebo jiným pověřeným osobám. Jedná se například o~detekci nedostupnosti, selhání pokusu o~restart nebo opětovnou detekci dostupnosti. Neinformovatelný prvek tímto komunikačním kanálem nedisponuje a~stavové informace jsou zobrazeny v~uživatelském rozhraní nebo v~záznamu událostí – v~logu.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\sekce{Způsob detekce dostupnosti prvků}
Realizovat detekci dostupného nebo nedostupného prvku lze několika způsoby. Jeho volba závisí na schopnostech detekčního systému a~především na vlastnostech testovaného prvku. Následující výčet možností detekce je seřazen od nejvíce vhodného po nejméně vhodný způsob.
\medskip
\begin{itemize}
\item{\textit{SNMP (Simple Network Management Protocol)}: jedná se o~komunikační protokol, který je primárně určen na správu síťových zařízení, sběr dat a~jejich vyhodnocování. Síťový prvek musí mít tento protokol implementovaný ve svém software nebo firmware a~být schopný realizovat službu SNMP agent. Velmi vhodná je i~schopnost prvku odesílat zprávy o~nastalé události bez přímého vyžádání. SNMP umožňuje pružně reagovat na stav některých vnitřních parametrů prvku a~tím snížit pravděpodobnost jeho selhání. V~levných prvcích podpora SNMP často chybí.}
\item{\textit{ICMP (Internet Control Message Protocol)}: alespoň částečná implementace tohoto protokolu je ve všech síťových prvcích využívající TCP/IP a~to bez ohledu na pořizovací cenu nebo kvalitu. ICMP datagramy Echo Request a~Echo Reply jsou základními diagnostickými metodami jak ověřit dostupnost prvku. V~mnoha operačních systémech je k~dispozici konzolový nástroj ping, jehož výstupem je čas odezvy testovaného prvku. Nejedná se však o~konstantní hodnotu, ale o~závislost na typu přenosových cest, radiové interferenci okolních bezdrátových spojů a~zatížení sítě v~oblasti konvergence ke kapacitnímu maximu linky. Na základě změny doby odezvy není možné o~prvku cokoliv usuzovat, je možné vyvodit pouze binární závěr, kde první stav reprezentuje libovolnou odezvu a~druhý žádnou odezvu.}
\item{\textit{Síťová služba}: detekce spočívá v~navázání spojení s~nějakou službou (např. http, ftp, dns, ..), kterou síťový prvek realizuje a~základě úspěšnosti komunikace stanoví závěr, zda-li je prvek dostupný nebo nikoliv. Tento způsob detekce není příliš vhodný a~to především z~důvodu, že aplikační služba má výrazně vyšší nároky na systémové zdroje než ICMP protokol. Může tak způsobovat u~méně výkonných prvků zpomalení jejich užitečné činnosti. Jedná se však o~jedinou detekční variantu v~případě, že není možné využívat SNMP nebo ICMP.}
\end{itemize}
\medskip
\par\noindent
V síti Starhill jsou v~současnosti využívány prvky s~podporou SNMP velmi málo. Důvodem je větší finanční náročnost bez přidané hodnoty v~podobě vyšší spolehlivosti. ICMP protokol je v~rámci celé sítě povolen a~jeho bezpečnostní omezení na úrovni firewallu nepředstavují pro detekci dostupnosti podstatný problém. 
\par Vzhledem k~aktuálnímu stavu sítě je nyní vhodné využít k~detekci dostupnosti pouze ICMP. SNMP bude možné implementovat do dohledového systému později za předpokladu, že počet prvků disponujících SNMP agentem bude výrazněji vyšší. 


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Nástroj ping a~argumenty}
Detekce dostupnosti prvků je realizována programem ping s~následujícími argumenty:
\input{dohled/codeping4}
respektive
\input{dohled/codeping6}
Význam jednotlivých argumentů:
\medskip
\begin{itemize}
\item[]{\texttt{<ipvx\_adresa>}: IP adresa testovaného prvku}
\item[]{\texttt{-s1}: velikost paketu 1 byte + ICMP hlavička}
\item[]{\texttt{-i1}: interval mezi požadavky na odezvu, nastavena 1 sekunda}
\item[]{\texttt{-w2}: maximální čas běhu programu ping, nastaveny 2 sekundy}
\end{itemize}
\medskip
\par\noindent
Vzhledem ke zvoleným časovým hodnotám dojde po spuštění programu ping s~uvedenými argumenty k~odeslání 2 požadavků. Pokud je přijata odpověď na alespoň jeden z~těchto požadavků, je prvek označen jako dostupný. 
\par
Z relačního diagramu na obr. \link{fig:dohled:netest} vyplývá, že vztah mezi tabulkou \texttt{node} a~\texttt{node\_email} je typu 1:N. Tabulka \texttt{node\_email} tak může obsahovat více záznamů s~IP adresami vztaženými k~jednomu prvku. To ve skutečnosti znamená, že prvek má více síťových rozhraní nebo je na jednom rozhraní nastaveno více IP adres. Dohledový systém tyto několikanásobné záznamy zpracovává konjunktivně – aby byl prvek prohlášen za dostupný, musí být dostupný na všech jeho IP adresách. Příkladem takového prvku může být bezdrátový klientský směrovač, který obsahuje 2 nezávislá rozhraní: wireless a~LAN. Každé rozhraní má jinou IP adresu a~v případě selhání prvku může dojít k~chybné funkci pouze jednoho rozhraní. Druhé poté pracuje zcela korektně a~je dostupné. V~případě disjunktního přístupu k~detekci jednotlivých IP adres by byl takový prvek vždy prohlášen za dostupný i~přesto, že je jeho funkce chybná.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\sekce{Chybový kód prvku}
\label{kap:dohled:erc}
Chybový kód je numerická reprezentace aktuálního stavu prvku. Stavem prvku je zde chápána informace o~jeho dostupnosti a o~způsobu řešení nedostupnosti dohledovým systémem. Jedná se o~celočíselnou numerickou hodnotu, která je uložena v~atributu \texttt{erc} tabulky \texttt{node}. V~současné době je využit interval hodnot $\langle1;10\rangle$, kde 1 reprezentuje korektně pracující dostupný prvek a~10~prvek, kde již nelze jeho činnost obnovit a~je nutný zásah administrátora. 
\par
Dohledový systém v~závislosti na aktuálním chybovém kódu, dostupnosti a~možnosti restartu vyhodnocuje další možné varianty operací s~prvkem a~podle zvolené akce nastavuje jiné chybové kódy. Zvyšující se hodnota chybového kódu vyjadřuje i~snižující se míru pravděpodobnosti, že dohledový systém bude schopen dostupnost prvku obnovit.
\medskip
\par\noindent
Význam jednotlivých chybových kódů:
\medskip
\begin{itemize}
\item{\textit{Kód 1}: tento kód je výchozí pro všechny prvky a~popisuje stav bezchybného a~kompletně dostupného testovatelného prvku. Za předpokladu, že je prvek netestovatelný, tak je tímto kódem označen vždy.}
\item{\textit{Kód 2}: jedná se o speciální kód v~rámci celé řady. Akční část dohledového systému provede u~takto označeného resetovatelného prvku vynucený restart. Následuje nastavení chybového kódu~1. V~případě neresetovatelného prvku dojde pouze k~nastavení kódu~1. Důvodem pro zavedení tohoto chybového kódu je implementace funkce manuálního restartu prvku administrátorem.}
\item{\textit{Kód 3}: u testovatelného prvku byla detekována první nedostupnost. Ta může být způsobena krátkodobým výpadkem přenosových cest, rekonfigurací prvků nebo servisním zásahem. Prvek není v~tomto případě prohlášen za nedostupný a~vyčká se do dalšího spuštění detekce dostupnosti.}
\item{\textit{Kód 4}: byla zjištěna opětovná nedostupnost. V~tomto případě je již prvek prohlášen za nedostupný a~bude následovat akční řešení této nedostupnosti metodou restartu nebo informováním administrátora,  pokud je to možné.}
\item{\textit{Kód 5}: pokud je prvek resetovatelný, byl proveden úspěšný restart prostřednictvím interface. Úspěšnost je zde chápána ve smyslu potvrzení předání povelu vzdálenému interface, nikoliv v~obnovení síťové komunikace. Ta již samozřejmě může být obnovena, ale bude zjištěna až při dalším spuštění detekce dostupnosti.}
\item{\textit{Kód 6}: v~případě úspěšného restartu resetovatelného vzdáleného prvku nebyla obnovena síťová komunikace nebo je prvek neresetovatelný. V~obou případech byli nalezeni resetovatelní a~netestovatelní předchůdci, kteří byli restartováni.}
\item{\textit{Kód 7}: ani po restartu resetovatelných a~netestovatelných předchůdců tohoto prvku nebyla obnovena jeho dostupnost. Byl proveden druhý pokus o~obnovu síťové komunikace opětovným restartem resetovatelných a~netestovatelných předchůdců.}
\item{\textit{Kód  8}: byl proveden neúspěšný pokus o~restart resetovatelného prvku ve smyslu potvrzení předání povelu interface. Tento stav mohl být zapříčiněn rušením na přenosové trase, výpadkem napájení ve vzdálené lokalitě apod. Pokud nedojde k~obnovení dostupnosti, bude proveden druhý pokus.}
\item{\textit{Kód 9}: byl proveden druhý neúspěšný pokus o~restart resetovatelného prvku. Pokud i~po tomto pokusu nedojde k~obnovení dostupnosti, bude proveden poslední pokus.}
\item{\textit{Kód 10}: koncový stav. Již není možné dostupnost prvku obnovit a~je definitivně nedostupný. O této skutečnosti je informován administrátor, aby mohl učinit kroky vedoucí k~obnovení dostupnosti.}
\end{itemize}
\medskip
\par\noindent
Varianta zkráceného popisu chybových kódů je využita pro zobrazení nápovědy v~uživatelském rozhraní dohledového systému. Texty jsou uloženy v~tabulce \texttt{node\_erc}.
\tabulka{Zkrácené verze popisu chybových kódů}{tab:dohled:erctxt}
\def\arraystretch{1.1}
\begin{tabular}{|c|l|} \hline
\textbf{\small Kód} & \textbf{\small Zkrácený textový popis} \\ \hline
\small 1  & \small Všechno je OK \\ %\hline
\small 2	& \small Bude proveden vynucený reset \\ %\hline
\small 3	& \small Dočasně nedostupný. Čekám na další test \\ %\hline
\small 4	& \small Nedostupný. Bude proveden restart, pokud je to možné \\ %\hline
\small 5	& \small Restart prvku byl úspěšně proveden \\ %\hline
\small 6	& \small Restart neobnovil dostupnost, netestovatelní resetovatelní předchůdci restartováni \\ %\hline
\small 7	& \small Druhý pokus restartu netestovatelných resetovatelných předchůdců \\ %\hline
\small 8	& \small První pokus o~restart prvku selhal \\ %\hline
\small 9	& \small Druhý pokus o~restart prvku selhal \\ %\hline
\small 10 & \small Prvek je definitivně nedostupný, je nutný osobní zásah \\ \hline
\end{tabular}
\endtab


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\sekce{Činnost dohledového systému}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Periodické spouštění}
Detekční a~akční část dohledového systému není koncipována ve smyslu trvale běžící služby (deamon), ale jako periodicky spouštěný programový kód, který provede požadovanou činnost a~následně se ukončí. Volbou exekuční periody lze velmi snadno ovlivnit reakční dobu systému a~také míru zatížení OS. Tento faktor je významný především při realizaci dohledového systému na jednoúčelových základních deskách určených pro malé routery s~nízkými systémovými rezervami.
\par
Detekční a~akční část dohledového systému jsou nezávislé funkční celky, které pracují se společnými daty v~DBMS. Z~tohoto důvodu jsou veškeré operace s~DB uzavřeny do transakcí pro případ časového souběhu obou částí. Z~hlediska efektivity je souběh značně nevhodný a~to především z~důvodu možných opakovaných akčních zásahů. Ty mohou nastat v~případě, kdy původně nedostupný resetovatelný prvek detekční část ještě neoznačila jako dostupný, ale souběžně spuštěná akční část provedla opětovný restart takového prvku. Vhodné je spustit akční část bezprostředně po ukončení detekční části. Znázorněno na obr. \link{fig:dohled:timeposl}.
\par  
Volba exekuční periody závisí na době běhu detekční a~akční části. Hlavním požadavkem na tuto hodnotu je, aby v~klidovém stavu (bez akčních zásahů k~nedostupným prvkům) nedocházelo k~souběhu dvou instancí detekce dostupnosti. 
\\\\
Celkovou dobu běhu detekční části $T_{D}$ a~akční části $T_{A}$ lze určit ze vztahu:
\begin{equation}T_{C}=T_{D}+T_{A}\quad[s]%
\label{eq:dohled:eq1}
\end{equation}
Pro exekuční interval platí podmínka:
\begin{equation}T_{EX}>T_{C}%
\label{eq:dohled:eq2}
\end{equation}
\img{dohled/img/casove_spousteni}%
    {108mm}%
    {Časová posloupnost spouštění detekce a~akce}%
    {fig:dohled:timeposl}%
\par\noindent
Hodnota $T_{A}$ je v~klidovém stavu bez akčních zásahů téměř nulová. Režijní čas na připojení k~DBMS a~prohledání stromu prvků je v~tomto případě nevýznamný. V~případě restartu nedostupného prvku se hodnota $T_{A}$ zvyšuje až na desítky sekund a~to v~závislosti na nastavení interface. Z~praktického hlediska je vhodné ponechat v~exekuční periodě prostor pro $T_{A}$ cca 60~s.
\par
Hodnota $T_{D}$ je závislá na celkovém počtu aktivních prvků, na počtu záznamů v~tabulce \texttt{node\_ip} a~časových parametrech nástroje ping. Při uvedeném nastavení je doba detekce jedné IP adresy 2 s. V~síti Starhill je nyní testováno 132 IP adres, hodnota $T_{D}$ je tedy 264 s.
Ze vztahu \ref{eq:dohled:eq1} plyne, že celková hodnota $T_{C}$ je 324 s~a~na základě podmínky \ref{eq:dohled:eq2} je exekuční perioda $T_{EX}$ nastavena na hodnotu 360~s.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Prohledávání stromu prvků v~detekční části}
Po každém spuštění detekční části dohledového systému je zahájeno prohledávání stromu prvků. Jeho počátek je určen kořenovými prvky, které nemají žádného předka. K~realizaci prohledávání je využita jednoduchá rekurzivní funkce (prohledávání do hloubky), která v~seznamu prvku prvků hledá ty prvky, jenž mají nastaveny jako předka aktuálně zpracovávaný prvek.
\medskip
\par\noindent
Během prohledávání jsou u~každého prvku seskupovány tyto údaje:
\medskip
\begin{itemize}
\item{Aktuální chybový kód.}
\item{Seznam IP adres, resp. testovatelnost.}
\item{Zjištěná dostupnost nebo nedostupnost.}
\end{itemize}
\medskip
\par\noindent
Prohledávání následujícího zbytku větve za aktuálně zpracovávaným prvkem je přerušeno po splnění jedné z~uvedených podmínek:
\medskip
\begin{itemize}
\item{Prvek má nastaven atribut \texttt{enable} na false. }
\item{Prvek má nastaven chybový kód v~intervalu $\langle4;10\rangle$. Jedná se o~stav, kdy všechny ostatní prvky za prvkem, který je označen jako nedostupný, jsou teoreticky také nedostupné a~je zbytečné je prohledávat a~jakkoliv je označovat jako nedostupné.}
\end{itemize}
\medskip
\par\noindent
Na základě seskupených údajů o~aktuálně prohledávaném prvku je soustavou pravidel vyvozen nový chybový kód, který je danému prvku nastaven. Jakákoliv další změna chybového kódu aktuálně prohledávaného prvku je možná až při následujícím spuštění detekční části dohledového systému.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Prohledávání stromu prvků v~akční části}
Metoda prohledávání stromu prvků je shodná s~detekční částí. Rozdíl je v~informacích, které jsou během prohledávání o~prvku seskupovány.
\medskip
\begin{itemize}
\item{Aktuální chybový kód.}
\item{Seznam IP adres, resp. testovatelnost.}
\item{Seznam parametrů pro interface, resp. resetovatelnost.}
\item{Seznam netestovatelných a~resetovatelných předchůdců aktuálního prvku.}
\end{itemize}
\medskip
\par\noindent
Podmínky pro přerušení prohledávání následujícího zbytku větve jsou podobné jako v~detekční části. Pokud chybový kód aktuálně prohledávaného prvku leží v~intervalu $\langle4;10\rangle$, je využito seskupených údajů k~provedení restartu. Následně je dle soustavy pravidel stanoven nový chybový kód a~je prvku nastaven.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Rozhodovací mechanismus neresetovatelných prvků}
\label{sub:dohled:roznreset}
Obrázek \link{fig:dohled:nreset} popisuje vzájemné vazby chybových kódu (vrcholy), kterých může nabývat neresetovatelný testovatelný prvek. Hrany v~uvedeném grafu reprezentují přechody mezi chybovými kódy a~jsou výsledkem posouzení seskupených informací daného prvku rozhodovacím mechanismem (sadou pravidel). V~rámci jednoho spuštění detekční nebo akční části může být proveden pouze jeden přechod pro každý prvek. Z~důvodu vyšší přehlednosti jsou obě dvě části zobrazeny v~jednom grafu a~odděleny stylem označení hran.
\medskip
\begin{itemize}
\item{Hrany A-D realizuje detekční část dohledového systému.}
\item{Hrany 1, 2, 8, 9 realizuje akční část dohledového systému.}
\end{itemize}
\medskip
\newpage
\par\noindent
Význam jednotlivých hran:
\medskip
\begin{itemize}
\item{\textit{A}: detekční část dohledového systému zjistila nedostupnost doposud dostupného prvku. V~tomto okamžiku není prvek chápán už jako nedostupný, dojde pouze k~nastavení nového kódu 3.}
\item{\textit{B}: došlo k~opětovné detekci nedostupnosti. Je nastaven chybový kód 4 a~detekční část dohledového systému označila prvek jako nedostupný. Další průchody grafem bude realizovat akční část. }
\item{\textit{C}: dohledový systém zjistil opětovnou dostupnost, bude nastaven chybový kód 1.}
\item{\textit{D}: pokud má prvek chybový kód v~intervalu $\langle4;10\rangle$ a~je detekována dostupnost, dojde k~nastavení chybového kódu 1. Nebere se přitom ohled na stádium rozpracovanosti případných restartů. Na informační emailové adresy bude odeslána příslušná zpráva z~tab. \link{tab:dohled:msgs}.}
\item{\textit{1}: jedná se o~nejkratší cestu ke koncovému stavu, ve kterém již nemá dohledový systém schopnost obnovit dostupnost prvku. Tato situace nastane za podmínky, kdy neresetovatelný prvek nemá žádné netestovatelné resetovatelné předchůdce. Na informační emailové adresy bude odeslána příslušná zpráva z~tab. \link{tab:dohled:msgs}.}
\item{\textit{2}: pokud má neresetovatelný prvek netestovatelné resetovatelné předchůdce, změní se jeho chybový kód na 6. Současně se všichni netestovatelní resetovatelní předchůdci restartují.}
\item{\textit{8}: společně s~nastavením chybového kódu 7 bude proveden druhý pokus o~restart netestovatelných resetovatelných předchůdců.}
\item{\textit{9}: opakovaný restart netestovatelných resetovatelných předchůdců nezajistil obnovení dostupnosti. Bude nastaven konečný chybový kód 10 a~odeslána zpráva o~nedostupnosti na emailové adresy odeslána příslušná zpráva z~tab. \link{tab:dohled:msgs}.}
\end{itemize}
\medskip
\par\noindent
Při průchodu hranami B, D, 1, 2, 8 a~9 je do záznamu událostí (logu) vložena informace se jménem prvku, aktuálním časem a~provedenou akcí.
\img{dohled/img/nreset_graf}%
    %{100mm}%
    {90mm}%
    {Graf vztahů mezi chybovými kódy neresetovatelného prvku}%
    {fig:dohled:nreset}%


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Rozhodovací mechanismus resetovatelných prvků}
Obrázek \link{fig:dohled:reset} popisuje vzájemné vazby chybových kódu (vrcholy), kterých může nabývat resetovatelný testovatelný prvek. Význam hran a~vrcholů je shodný s~grafem pro neresetovatelný prvek.
\medskip
\begin{itemize}
\item{Hrany A-D realizuje detekční část dohledového systému.}
\item{Hrany 3a, 3b, 4a, 4b, 5a, 5b, 6-10 realizuje akční část dohledového systému.}
\end{itemize}
\medskip
\img{dohled/img/reset_graf}%
    %{120mm}%
    {108mm}%
    {Graf vztahů mezi chybovými kódy resetovatelného prvku}%
    {fig:dohled:reset}%
\par\noindent
Význam jednotlivých hran:
\medskip
\begin{itemize}
\item{\textit{A-D}: činnost je shodná jako u~neresetovatelného prvku. Kapitola \ref{sub:dohled:roznreset}.}
\item{\textit{3a}: byl proveden první pokus o~restart prostřednictvím interface s~negativním výsledkem ve smyslu předání povelu.}
\item{\textit{3b}: byl proveden první pokus o~restart prostřednictvím interface. Předání povelu proběhlo úspěšně.}
\item{\textit{4a}: na základě předchozího neúspěšného pokusu o~restart prvku byl proveden druhý pokus. Výsledek je opět negativní.}
\item{\textit{4b}: druhý pokus o~restart prvku byl vykonán a~povel úspěšně předán vzdálenému interface. Zde je vhodné, aby administrátor analyzoval, proč došlo k~předání povelu až na druhý pokus. Zda-li bylo příčinou jednorázové rušení přenosové cesty nebo se jedná o~stav dlouhodobějšího charakteru.}
\item{\textit{5a}: poslední pokus o~restart prvku selhal a~bude nastaven koncový stav s~chybovým kódem~10. V~tomto okamžiku již nelze s~prvkem provést žádnou akci, která by vedla k~obnovení dostupnosti. O vzniklé situaci bude informován administrátor zasláním příslušné zprávy z~tab. \link{tab:dohled:msgs} na emailové adresy patřící danému prvku.}
\item{\textit{5b}: poslední pokus o~restart prvku byl úspěšný. Zde je opět vhodné analyzovat příčinu dvojnásobného selhání při předávání povelu k~restartu.}
\item{\textit{6}: pokud akční část dohledového systému nalezne prvek s~chybovým kódem 5, znamená to, že povel k~provedení restartu prvku byl vzdálenému interface řádně předán (byl potvrzen), ale síťová dostupnost prvku nebyla obnovena. Jelikož prvek nemá žádného netestovatelného neresetovatelného předchůdce, je nastaven koncový stav s~chybovým kódem 10. Na informační emailové adresy bude odeslána příslušná zpráva z~tab. \link{tab:dohled:msgs}.}
\item{\textit{7}: prvek má minimálně jednoho netestovatelného resetovatelného předchůdce, který byl restartován. Pokud má takových předchůdců více, restartováni byli všichni.}
\item{\textit{8}: první pokus o~restart netestovatelných resetovatelných předchůdců nezajistil obnovení síťové dostupnosti prvku. Byl proveden druhý restart těchto prvků.}
\item{\textit{9}: opakovaný restart netestovatelných resetovatelných předchůdců selhal. Je nastaven koncový stav s~chybovým kódem 10. Na informační emailové adresy bude odeslána příslušná zpráva z~tab. \link{tab:dohled:msgs}.}
\item{\textit{10}: tato hrana mezi chybovým kódem 2 a~1 řeší funkci vynuceného manuálního restartu resetovatelného prvku. Není brán ohled na dostupnost prvku. K~provedení restartu dojde za každých okolností a následně pak bude nastaven chybový kód 1.}
\end{itemize}
\medskip
\par\noindent
Při průchodu všemi hranami bude do záznamu událostí (logu) vložena informace se jménem prvku, aktuálním časem a~provedenou akcí. Vyjímkou jsou hrany A a~C.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Stavové informační zprávy}
Tabulka \link{tab:dohled:msgs} obsahuje seznam zpráv, které se zašlou administrátorovi nebo pověřeným osobám při průchodu přes určité hrany grafu. Označení hran je v~obou grafech unikátní, tabulka je tedy platná pro resetovatelný i~neresetovatelný prvek. Forma zprávy je email nebo SMS. 
\tabulka{Stavové zprávy zasílané administrátorovi}{tab:dohled:msgs}
\def\arraystretch{1.1}
\begin{tabular}{|c|l|} \hline
\textbf{\small Hrana} & \textbf{\small Text zprávy} \\ \hline
\small 1 & OFFLINE: $<$název$>$ $<$dd.MM. hh:mm$>$  \\ %\hline
\small 5a	& \small OFFLINE - NEUSPESNE RESETY: $<$název$>$ $<$dd.MM. hh:mm$>$ \\ %\hline
\small 6	& \small OFFLINE – PO USPESNEM RESETU: $<$název$>$ $<$dd.MM. hh:mm$>$ \\ %\hline
\small 9	& \small OFFLINE – PO RESETECH PREDCH: $<$název$>$ $<$dd.MM. hh:mm$>$ \\ %\hline
\small D	& \small ONLINE: $<$název$>$ $<$dd.MM. hh:mm$>$ \\ \hline
\end{tabular}
\endtab
\medskip
\par\noindent
Význam polí:
\medskip
\begin{itemize}
\item{\textit{$<$název$>$}: název prvku s~odstraněnou interpunkcí}
\item{\textit{$<$dd.MM. hh:mm$>$}: datum a~čas odeslání zprávy. Př. 27.08. 13:35}
\end{itemize}
%Formát textu zpráv je zvolen s~ohledem na zobrazitelnost v~mobilních telefonech, kam jsou informační emailové zprávy obvykle přeposílány. Obvyklá doba doručení takto přeposlaného emailu na mobilní telefon je 20-90 s. Časový rozptyl je závislý na provozovateli mobilní sítě, vytížením obou komunikujících SMTP serverů a~SMS centra.   


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\sekce{Implementace detekční a~akční části}
V kapitole \ref{kap:dohled:dbms} je uveden požadavek na kooperaci dohledového systému se správním systémem Netadmin. Modulární koncepce dohledového systému a~systému Netadmin je založena na vzájemném sdílení dat v~DBMS a~z tohoto pohledu je sloučení obou systémů snadné.
\par
Implementace aplikačních modulů systému Netadmin je provedena v~jazyce PERL jako sada skriptů, jejichž ústřední činností je rekonfigurace různých síťových služeb dle aktuálních dat. V~současné době existuje několik dalších perspektivních skriptovacích jazyků, jejichž prostřednictvím by byla implementace detekční a~akční části realizovatelná. Jsou jimi například Python a~Ruby. V~obou případech se jedná o~jazyky s~výraznou podporou objektového programování a~v některých vlastnostech převyšující možnosti PERLu. Je však vhodné zachovat určitou společnou homogenitu programového řešení a~z tohoto důvodu byl PERL využit i~pro dohledový systém.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Struktura}
Z důvodu přehlednosti, snadné modifikovatelnosti a~opakované použitelnosti byla realizace detekční a~akční části dohledového systému rozdělena do následujících souborů:
\medskip
\begin{itemize}
\item{\textit{link}: realizuje detekční část dohledového systému.}
\item{\textit{analyze}: realizuje akční část dohledového systému.}
\item{\textit{tradioreset}: třída s~metodami pro obsluhu interface.}
\item{\textit{tlogger}: třída pro jednoduché logování (záznam událostí) do souboru.}
\item{\textit{temail}: třída realizující vytvoření a~odesílání zpráv na emailové adresy.}
\end{itemize}
\medskip
\par\noindent
K úspěšnému spuštění skriptu link a~analyze je nutné, aby měl interpret jazyka PERL k~dispozici následující dvě třídy třetích stran:
\medskip
\begin{itemize}
\item{\textit{DBI}: spojení s~DBMS, zpracování SQL dotazů.}
\item{\textit{Device::SerialPort}: rozhraní pro komunikaci po sériové lince RS-232.}
\end{itemize}
\medskip
\img{dohled/img/perl_tridy}%
    {120mm}%
    {Vzájemné vazby tříd detekční a~akční části dohledového systému}%
    {fig:dohled:perl}%
\par\noindent
Třída DBI je obvykle součástí základní instalace jazyka PERL ve většině distribucí OS Linux a~FreeBSD. Pokud tomu tak není, je dostupná pomocí rozšiřujících instalačních balíků zvolené distribuce nebo z~archivu tříd a~modulů CPAN. Třída Device::SerialPort v~základní instalaci nebývá a~je nutné ji ve většině případů doinstalovat výhradně z~archivu CPAN. Pokud má operační systém přístup k~internetu, instalaci této třídy lze uskutečnit spuštěním následujícího příkazu:
\par
\input{dohled/codeperl}%
\par\noindent
Na obr. \link{fig:dohled:perl} jsou znázorněny vazby mezi jednotlivými třídami detekční a~akční části dohledového systému. Periodické spouštění je realizováno pomocí časového plánovače cron. V~uvedeném obrázku je znázorněno šipkami červené barvy. Z~nich je zřejmé, že je nejprve spuštěn skript link a~až po jeho ukončení akční část analyze. Periodicita spouštění je dána volbou exekuční periody a~následnou konfigurací programu cron.
%\img{dohled/img/perl_tridy}%
%    {120mm}%
%    {Vzájemné vazby tříd detekční a~akční části dohledového systému}%
%    {fig:dohled:perl}%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\podsekce{Třída tradioreset}
Motivací pro vznik této třídy byla snaha o~zapouzdření metod pro komunikaci s~připojeným interface. Důvodem je teoretická možnost využití více instancí této třídy pro připojení několika interface na různých sériových portech.
\par
Pro komunikaci po sériové lince RS-232 je využita třída Device::SerialPort a~to z~důvodu, že poskytuje uživatelsky přívětivé metody pro přenos dat. Nahrazuje tak prosté využití příkazů cat a~echo pro přímý přístup k~souboru reprezentující sériový port v~operačních systémech unixového typu. Hlavní výhodou této třídy je snadná konfigurace parametrů pomocí jednoúčelových metod a~především možnost nastavení časového limitu pro příjem dat ze sériového portu. Tímto způsobem lze komunikační metody třídy radioreset ošetřit tak, aby respektovaly předpokládanou dobu odpovědi od interface a~nezpůsobovaly zbytečnou časovou latenci v~případě, že interface nekomunikuje nebo je jeho komunikace chybná.
\medskip
\par\noindent
Metody pro komunikaci s~interface jsou následující:
\medskip
\begin{itemize}
\item{\textit{ping}: ověření dostupnosti interface. Návratová hodnota je 1 v případě, že interface zašle odpověď na příkaz P řetězec \uv{OK.}}
\item{\textit{dreset}: uskuteční restart prvku prostřednictvím lokálního interface. Argumenty jsou čas a~výstupní port. Hodnota 1 bude vrácena, pokud interface odešle metodě řetězec \uv{GM-2 Direct reset accepted.}}
\item{\textit{remotereset}: realizuje restart vzdáleného prvku. Argumenty jsou čas, výstupní port a~adresa. Návratová hodnota 1 bude vrácena za předpokladu, že interface odešle metodě odpověď začínající podřetězcem \uv{GM-.} Pokud tato metoda přijme od interface chybovou zprávu začínající podřetězcem \uv{EM-,} bude okamžitě ukončena s~návratovou hodnotou 0 a~nebude čekat na uplynutí časového limitu.}
\item{\textit{rptrreset}: k~přenosu povelu využije funkci opakovače. Funkčně je shodná s~metodou remotereset. Mezi argumenty patří navíc adresa opakovače.}
\end{itemize}

