\chapter{Lokální bezdrátové sítě}
\label{sec:chapter_1}

Lokální bezdrátové sítě (WLAN) spojují dvě nebo více zařízení pomocí bezdrátové distribuční metody v~omezeném prostoru \cite{802_11_book}. Typické využití těchto sítí jsou domácnosti, školy nebo kancelářské budovy. Většina moderních sítí WLAN je založena na standardech IEEE 802.11, uváděných na trh pod značkou Wi-Fi. V~kapitole \ref{sec:802_11} budou tyto standardy popsány podrobněji.

WLAN s~větším počtem aktivních prvků (přístupových bodů, přepínačů, směrovačů) se ručně velice obtížně konfiguruje a udržuje, proto vzniklo mnoho systémů, které řeší problém centrální konfigurace a správy WLAN sítí. Tyto systémy umožňují, zpravidla přes webové rozhraní, nastavovat prvky sítě a hromadně nasazovat konfiguraci. Příkladům těchto systémů se věnuje kapitola \ref{sec:1_existujici_reseni}.

\section{Bezdrátové sítě dle standardu IEEE 802.11}
\label{sec:802_11}

IEEE 802.11 \cite{ieee_book} je množina specifikací přístupu k~médiu (MAC) a fyzické vrstvě (PHY) pro implementaci lokálních bezdrátových sítí v~různých frekvencích, nejčastěji 2,4 GHz a 5 GHz. IEEE 802.11 jsou nejrozšířenější standardy bezdrátových sítí na světě. Základní verze standardu 802.11 byla vydána v~roce 1997 a od té doby k~ní přibyla řada rozšíření.

Třída standardů 802.11 se skládá z~řady polovičně duplexních modulačních metod, které sdílí stejný základní protokol \cite{ieee_book}. První široce akceptovaný standard z~třídy bezdrátových sítí 802.11 byl 802.11b následovaný standardy 802.11a, 802.11g, 802.11n a 802.11ac. Ostatní standardy z~třídy 802.11 (\textit{c-f, h, j}) slouží jako dodatky, které rozšiřují existující standard nebo opravují nějaké jeho nedostatky. Tabulka \ref{tab_80211} obsahuje bližší přehled standardů IEEE 802.11.

Standardy 802.11b a 802.11g využívají pásmo 2,4 GHz, z~tohoto důvodu trpí zařízení v~těchto sítích rušením mikrovlnnými troubami nebo zařízeními s~Bluetooth. Oproti tomu standardy IEEE 802.11a a 802.11ac používají 5 GHz pásmo a nejsou tedy ovlivněny zařízeními pracujícími v~pásmu 2,4 GHz.


\begin{table}[ht]
\resizebox{\textwidth}{!}{\begin{tabular}{|l|l|l|l|l|}
\hline
\centering
\textbf{Standard} & \textbf{Rok vydání} & \textbf{Pásmo {[}GHz{]}} & \textbf{Maximální rychlost {[}Mbit/s{]}} & \textbf{Fyzická vrstva} \\ \hline
IEEE 802.11       & 1997                & 2,4                      & 2                                        & DSSS s~FHSS             \\ \hline
IEEE 802.11a      & 1999                & 5                        & 54                                       & OFDM                    \\ \hline
IEEE 802.11b      & 1999                & 2,4                      & 11                                       & DSSS                    \\ \hline
IEEE 802.11g      & 2003                & 2,4                      & 54                                       & OFDM                    \\ \hline
IEEE 802.11y      & 2008                & 3,7                      & 54                                       & OFDM                    \\
\hline
IEEE 802.11n      & 2009                & 2,4 nebo 5               & 600                                      & MIMO OFDM               \\\hline
IEEE 802.11ad     & 2012                & 2,4, 5 a 60              & 7000                                     & DMG                        \\\hline
IEEE 802.11ac     & 2013                & 2,4 a 5                  & 1000                                     & MU-MIMO OFDM            \\
 \hline
\end{tabular}}
\caption[Standardy IEEE 802.11 a jejich srovnání]{Standardy IEEE 802.11 a jejich srovnání.}
\label{tab_80211}
\end{table}

\subsection*{Kanály a frekvenční pásma}

Standardy 802.11b, 802.11g a 802.11n-2.4 používají 2,4 - 2,5 GHz spektrum, 802.11a a 802.11ac používají 4,915 - 5,825 GHz spektrum. Každé spektrum je ještě rozděleno do kanálů se střední frekvencí a šířkou. Pásmo 2,4 GHz je rozděleno do 14 kanálů s~5 MHz mezerami, začínající kanálem 1, který má střední frekvenci 2,412 GHz. Vizualizace pásma 2,4 GHz je zobrazena na obrázku \ref{fig:1_kanaly}.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[scale=0.23]{obrazky/openwrt/1_kanaly_pasma.png}
  \end{center}
  \caption[Kanály pásma 2,4 GHz]{Vizualizace kanálů a jejich středních frekvencí v~pásmu 2,4 GHz.}
  \label{fig:1_kanaly}
\end{figure}

% \subsection{Zabezpečení}

% Problém bezpečnosti bezdrátových sítí vyplýva zejména z důvodu, že signál sítí se šíří i mimo zapezpečený prostor.

% \subsubsection*{Zablokování vysílání SSID}

% \subsubsection*{Kontrola MAC adres}

% \subsubsection*{WEP}

% \subsubsection*{WPA}

% \subsubsection*{WPA2}


\subsection{Sady služeb}

Ve standardech IEEE 802.11 je sada služeb množina zařízení v~bezdrátové síti pracující se stejnými síťovými parametry \cite{802_11_book}. Množiny služeb jsou uspořádány hierarchicky.

\subsubsection*{Základní sada služeb (BSS)}

Základní sada služeb je množina všech zařízení, které spolu mohou komunikovat na~PHY vrstvě - pracují na stejné frekvenci, se stejnou modulací apod \cite{802_11_book}. Každý BSS má identifikační kód (ID), nazvaný BSSID, což je MAC adresa přístupového bodu obsluhující BSS. K~dispozici jsou dva typy BSS: Nezávislé BSS (označovaný také jako IBSS) a infrastrukturní síť. Nezávislé BSS (IBSS) je síť ad hoc, která neobsahuje žádné přístupové body, což znamená, že se nemůže připojit k~jiné základní sadě služeb.

% \begin{figure}[!ht]
%   \begin{center}
%     \includegraphics[scale=0.7]{obrazky/openwrt/2_BSSID.png}
%   \end{center}
%   \caption[BSSID]{Každa základní sada služeb má unikátní BSSID - MAC adresu.}
% \end{figure}

\subsubsection*{Identifikátor sady služeb (SSID)}

SSID je identifikátor logické bezdrátové sítě. Slouží zejména pro rozlišení více bezdrátových sítí pracujících ve stejném prostoru \cite{802_11_book}. SSID je zpravidla konfigurovatelné, může mít až 32 znaků. SSID je pravidelně vysíláno přístupovými body v~řídících rámcích (beacon frame) a obsahuje všechny informace o~bezdrátové síti. Ukázka přístupového bodů vysílajícího více SSID je zobrazena na obrázku \ref{fig:1_ssid}

\begin{figure}[!ht]
  \begin{center}
    \includegraphics[scale=0.7]{obrazky/openwrt/1_SSID.png}
  \end{center}
  \caption[SSID]{Přístupový bod vysílající 3 SSID.}
  \label{fig:1_ssid}
\end{figure}

\subsubsection*{Rozšiřená sada služeb (ESS)}

Rozšířená sada služba (ESS) je sada propojených základních služeb v~síti \cite{802_11_book}. Přístupové body v~ESS jsou spojeny distribučním systémem. Každý ESS má ID nazvané SSID, což je řetězec ASCII znaků dlouhý maximálně 32 znaků.


\section{Konfigurace bezdrátových přístupových bodů}
\label{sec:1_existujici_reseni}

Pro správnou konfiguraci bezdrátových přístupových je potřeba provést několik kroků:

\vskip 0.1in

\begin{itemize}
    \item nastavení místní sítě a její parametry,
    \item nastavení parametrů rádia,
    \item nastavení parametrů bezdrátové sítě (SSID, parametry zabezpečení).
\end{itemize}
\newline

\vskip 0.1in

V~případě, že se jedná o~netriviální bezdrátovou síť s~více ESSID, je potřeba také konfigurovat VLAN (Virtual Local Area Network), což je logicky nezávislá síť v~rámci jednoho nebo několika zařízení. VLAN je nutné konfigurovat jak na~přístupových bodech, tak i na přepínačích. Pokud je těchto přístupových bodů více, ruční konfigurace a správa není praktické řešení. Tento problém řeší specializované nástroje na konfiguraci sítí.

\subsection{UniFi SDN}

Společnost Ubiquiti Networks nabízí ke svým síťovým zařízením webovou aplikaci UniFi \cite{unifi}. UniFi slouží jako nástroj pro centralizované vytváření softwarově definovaných sítí (SDN). Z~této aplikace je možné provést naprostou většinu konfigurací všech síťových prvků. Poskytuje také grafy o~stavech sítí (vytíženost, propustnost), seznam síťových zařízení a jejich stav a notifikace o~důležitých událostech v~reálném čase. Z~této aplikace je možné provést hromadné aktualizace všech nebo vybraných zařízení. Tato aplikace se prodává ve formě kompaktního zařízení, které se připojí do sítě. Ukázka grafického rozhraní aplikace UniFi je zachycena na obrázku \ref{fig:1_unify}. Demo aplikace je dostupné na webové stránce \url{https://demo.ubnt.com/manage/site/default/dashboard}.

Jednou z~nevýhod tohoto řešení je, že funguje pouze s~jinými produkty od stejného výrobce. Pro plné využití této aplikace pro správu a~konfiguraci sítí je tedy nutné mít v~síti pouze kompatibilní zařízení.

\begin{figure}[!ht]
  \begin{center}
    \includegraphics[scale=0.43]{obrazky/openwrt/1_unifi_sdn.png}
  \end{center}
  \caption[UniFi SDN]{Uživatelské rozhrání systému UniFi. Úvodní stránka webové aplikace.}
  \label{fig:1_unify}
\end{figure}

\subsection{Platforma OpenWISP}

OpenWISP je softwarová platforma s~otevřeným kódem navržená k~usnadnění správy a~konfigurace sítí, zejména bezdrátových \cite{openwisp}. Aktuálně pouze podporuje správu a~konfiguraci distribuce OpenWrt. Projekt OpenWISP klade velký důraz na modularitu a rozšiřitelnost, existuje řada modulů, které přidávají konkrétní funkční celky do aplikace, např. modul pro autentizaci přes RADIUS. 

V~základu umožňuje nastavení sítí, správu zařízení, přidávání půdorysů budov a~zanášení polohy jednotlivých zařízení, konfiguraci VPN serverů a ukládání nebo~nahrávání konfigurace z~šablon. Ukázka webového rozhraní aplikace OpenWISP je zachycena na obrázku \ref{fig:1_openwisp}.

\begin{figure}[!ht]
  \begin{center}
    \includegraphics[scale=0.6]{obrazky/openwrt/1_openwisp.png}
  \end{center}
  \caption[OpenWISP]{Uživatelské rozhrání systému OpenWISP. Úvodní stránka webové aplikace.}
  \label{fig:1_openwisp}
\end{figure}

% \subsection{Navrhované řešení}

% Cílem je vytvořit nástroj pro snadnou konfiguraci a správu lokálních bezdrátových sítí složenou se zařízení s distribucí OpenWrt. Většina moderních konfiguračních nástrojů sítí funguje jako webová aplikace, řešení práce půjde stejným směrem. 

% %\subsubsection*{Výhody navrhovaného řešení}

% \textbf{Výhody navrhovaného řešení:}

% \begin{itemize}
%     \item jednoduchost: jedná se o aplikaci pro specifické použití - ovládání bude tedy přehledné,
%     \item rozšiřitelnost: 
% \end{itemize}


\chapter{Linuxová distribuce OpenWrt}
\label{sec:2_chap}

OpenWrt je GNU/Linux distribuce s~otevřeným kódem určená pro vestavěné zařízení, zejména směrovače \cite{openwrt_about}. Poskytuje plnohodnotný operační systém s~vlastním balíčkovacím nástrojem. Hlavními komponentami je Linuxové jádro, standardní knihovna musl nebo glibc a příkazový procesor optimalizovaný pro vestavěná zařízení BusyBox. Poskytuje mnoho možností, jak systém upravit pro specifickou potřebu či specifický hardware - umožňuje kompletní konfiguraci komponent distribuce při kompilaci  instalování balíčků. Hlavní cíl vývojářu OpenWrt je podporovat co nejvíce zařízení a zajistit co největší stabilitu systému.

Projekt OpenWrt začal v~roce 2004, kdy výrobce Linksys vytvořil firmware pro směrovač WRT54G založený na kódu licensovaného pod GNU/GPL \cite{openwrt_history}. Pod podmínkama této licence musel Linksys modifikovanou verzi kódu zveřejnit. Zveřejnění umožnilo nezávislým vývojářům pokračovat ve vývoji původního firmwaru. Podpora byla původně limitována jen na směrovače řady WRT54G, ale později rozšířila na mnoho jiných směrovačů a jiných zařízení od různých výrobců. 

\section{Kompilace}

Zařízení se systémem OpenWrt zpravidla nemají dostatečné prostředky potřebné ke~kompilaci celé distribuce či jednotlivých balíčků \cite{openwrt_compilation}. Je tedy nutné provést překlad na počítači s~využitím kompilátoru, který generuje kód pro cílovou platformu. Tomuto procesu se říká křížová kompilace.

OpenWrt používá k~tvorbě distribucí a balíčků systém založený na projektu Buildroot, což je soubor Makefilů, které uživateli umožňují konfigurovat a vytvořit distribuci pro vestavěné zařízení. Kompilaci je možno provést na systémech s~operačním systémem Linux, BSD nebo OS X. Nejprve je nutné si stáhnout git repozitář s~distribucí:

\begin{verbatim}
  $ git clone https://github.com/openwrt/openwrt.git
\end{verbatim}

Hlavní větev repozitáře (master) se označuje názvem bleeding edge. Na této větvi probíhá hlavní vývoj a často obsahuje experimentální změny, které nemusí být stabilní. Pro nasazení distribuce OpenWrt na produkční zařízení se doporučuje používat stabilní verze. Momentálně je poslední stabilní verze z~června 2018 na větvi \texttt{openwrt-18.06}:

\begin{verbatim}
  $ cd openwrt
  $ git checkout openwrt-18.06
\end{verbatim}

Dále je nutné stáhnout a nainstalovat dostupné balíčky:

\begin{verbatim}
  $ ./scripts/feeds update -a
  $ ./scripts/feeds install -a
\end{verbatim}

Konfigurace distribuce se spouští příkazem \texttt{make menuconfig} v~kořenové složce repozitáře. Po spuštění tohoto příkazu se otevře v~grafické okno, ve kterém je možné specifikovat cílovou platformu, balíčky, které se zahrnou do distribuce, ovladače pro periferie atd. Menuconfig také automaticky řeší závislosti - pokud je vybraná možnost zavislá na dílčích komponentech, budou automaticky zahrnuty také. Vzhled nástroje menuconfig je zachycen na obrázku \ref{fig:menuconfig}.

Kompilace se spouští příkazem \texttt{make}. První kompilace trvá nejdéle, jelikož se kompiluje i samotný křízový překladač. Na běžném stroji trvá kompilace 2 hodiny. Výsledkem kompilace je soubor obrazu disku, který se nahrává na cílové zařízení.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[scale=0.5]{obrazky/openwrt/menuconfig.png}
  \end{center}
  \caption[OpenWrt menuconfig]{Úvodní obrazovka nástroje menuconfig v~projektu OpenWrt. Umožňuje specifikovat nastavení parametrů kompilace a podobu výsledného obrazu disku.}
  \label{fig:menuconfig}
\end{figure}

\section{Instalace}

Existují čtyři nejběžnější metody instalace systému OpenWrt na zařízení \cite{openwrt_installation}:
\\

\begin{itemize}  
\item \textbf{Přes OEM firmware} -- je použito webové rozhraní původního firmwaru zařízení pro nahrání systému OpenWrt.
\item \textbf{Přes bootloader a ethernetový port} -- je použit protokol FTP nebo TFTP pro nahrání systému OpenWrt.
\item \textbf{Přes bootloader a sériový port} -- systém OpenWrt je nahrán sériovým portem.
\item \textbf{Přes JTAG} -- je použito rozhraní JTAG pro nahrání systému OpenWrt.
\end{itemize}

\section{První přihlášení}

Po úspěšné instalaci se může uživatel poprvé přihlásit do systému OpenWrt. Na zařízení se lze připojit pomocí protokolu Secure Shell (SSH) pod uživatelem \texttt{root} na výchozí adresu 192.168.1.1. Při prvním přihlášení je nutné, aby uživatel nastavil heslo pro uživatele \texttt{root} nástrojem \texttt{passwd}. Ukázka obrazovky při prvním přihlášení do systému OpenWrt je zachycena na obrázku \ref{fig:first_login}.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[scale=0.5]{obrazky/openwrt/first_login.png}
  \end{center}
  \caption[První přihlášení]{Úvodní obrazovka systému OpenWrt s~výzvou k~nastavení hesla pro uživatele \texttt{root}.}
  \label{fig:first_login}
\end{figure}


\section{Práce s~balíčky}

Stejně jako na většině Linuxových distribucí je možné využívat i na OpenWrt balíčkovací systém - \texttt{opkg} \cite{openwrt_packages}. \texttt{opkg} je malý balíčkovací nástroj určený pro instalaci softwaru do vestavěných zařízení. Pro instalaci nového balíčku pomocí \texttt{opkg} je nejprve nutné si stáhnout metadata o~dostupných balíčcích:

\begin{verbatim}
  $ opkg update
\end{verbatim}

Tento krok je nutné provést při každém restartu, protože se tyto informace ukládají do paměti, nikoliv na persistentní oddíl. Instalace samotného balíčku se provádí následujícím příkazem:

\begin{verbatim}
  $ opkg install <NAZEV_BALICKU>
\end{verbatim}

Pokud má instalovaný balíček závislosti na jiných balíčcích, opkg je automaticky nainstaluje také.

\section{LuCI}

Webové rozhraní LuCI \cite{luci_tech_ref} začalo být vyvíjeno v~roce 2008 jako součást vydání OpenWrt verze s~názvem \textit{Kamikaze}. Důvod, proč projekt LuCI vzniknul, byla absence volného, rozšiřitelného a udržovatelného webového rozhraní pro správu vestavěných zařízení. LuCI je založeno na programovacím jazyku Lua a využivá objektově orientované šablony a knihovny.

Pro použití je nutné mít nainstalovaný balík \texttt{luci}:

\begin{verbatim}
  $ opkg update
  $ opkg install luci
  $ /etc/init.d/uhttpd restart
\end{verbatim}

Nyní může uživatel využívat webové rozhraní LuCI pro konfiguraci a správu zařízení OpenWrt. Pro přihlášení je nutné použít přihlašovací údaje nějakého ze systémových účtů, např. účet \texttt{root}. Ukázka webového rozhraní LuCI je zachycena na obrázku \ref{fig:2_luci}.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[scale=0.5]{obrazky/openwrt/luci_overview.png}
  \end{center}
  \caption[Webové rozhraní LuCI]{Úvodní stránka webového rozhraní LuCI. Zobrazuje základní informace o~zařízení OpenWrt.}
  \label{fig:2_luci}
\end{figure}




\chapter{Konfigurační model OpenWrt}
\label{sec:3_chapter}

Distribuce OpenWrt poskytuje několik způsobů, kterými lze konfigurovat zařízení. Nejpoužívanější je systém unifikovaného konfiguračního rozhraní (UCI) \cite{openwrt_uci}, který umožňuje konfiguraci všech základních služeb ve standardizované formě. Podrobněji je systém UCI a možnosti jeho vzdáleného použití popsán v~podkapitole \ref{sec:3_ucI_sub}.

\section{Unifikované konfigurační rozhraní}
\label{sec:3_ucI_sub}

Systém UCI je založen na tvorbě meta-konfiguračních souborů se standardizovanou syntaxí v~adresáři \texttt{/etc/config} \cite{openwrt_uci}. Tyto soubory jsou při startu konkrétní služby typicky převedeny do formy konfiguračních souborů specifických pro jednotlivé aplikace. Daný přístup řeší problém odlišných verzí služeb a aplikací mezi systémy OpenWrt -- i když je v~síti více zařízení s~jinou verzí, konfigurační model UCI zůstává zpravidla stejný. Obecný proces úpravy a aplikace konfiguračních souborů UCI znázorňuje schéma \ref{fig:uci_aplikace}.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[scale=0.85]{obrazky/openwrt/3_uci_config.png}
  \end{center}
  \caption[Princip UCI]{Modifikované konfigurační soubory UCI se při restartu služby převedou do konfiguračního souboru specifické služby.}
  \label{fig:uci_aplikace}
\end{figure}

Konfigurační soubory je možné ručně editovat běžným textovým editorem nebo s~nimi lze pracovat pomocí utility \texttt{uci}. Konfigurační soubory lze také upravovat pomocí několika různých programových rozhraní, jsou podporované skriptovací jazyky Lua a Shell a dále kompilovaný jazyk C \cite{openwrt_uci}. Webové konfigurační rozhraní LuCI využívá právě jazyk Lua pro modifikaci UCI souborů \cite{luci_tech_ref}. Schéma \ref{fig:uci_konfig_strom1} zobrazuje závislosti přístupů, kterými je možné upravovat konfigurační soubory UCI, na nástrojích či knihovnách.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[scale=1]{obrazky/openwrt/3_uci_api.png}
  \end{center}
  \caption[Možnosti modifikace UCI]{Přístupy, kterými je možno manipulovat s~konfiguračními soubory UCI a~jejich závislosti na nástrojích či
  knihovnách.}
  \label{fig:uci_konfig_strom1}
\end{figure}

\subsection{Syntaxe}

Konfigurační soubor UCI je složen z~jedné nebo více \texttt{config} sekcí, které obsahují jeden nebo více \texttt{option} řádků, které definují konkrétní hodnoty.

Komentáře (řádky, které nejsou zpracovávané) jsou zapisované znakem \texttt{\#} \cite{openwrt_uci}. Pokud tímto znakem začíná řádek, je celý ignorován, jinak je ignorována jen část řádku, od kterého znak \texttt{#} začíná.

Níže je ukázka konfigurační sekce UCI:

\begin{verbatim}
config 'ukazka' 'jmeno_sekce'
        option  nazev_volby 'volba1'
\end{verbatim}

\begin{itemize}
    \item Řádek \texttt{config 'ukazka' 'jmeno\textunderscore sekce'} definuje začátek sekce typu \texttt{ukazka} se jménem \texttt{jmeno\textunderscore sekce}. Existují také anonymní sekce - sekce bez jména obsahující pouze typ sekce. 
    
    \item Řádek \texttt{option nazev\textunderscore volby 'volba1'} název volby a její hodnotu v~sekci.
    
    \item Odsazení jaké je použito v~příkladu není potřeba dodržovat, ale zvyšuje čitelnost konfiguračního souboru.
\end{itemize}

\subsection{Konfigurace nástrojem uci}
\label{sec:3_uci_app}

Pro jednoduché úpravy je možné upravovat konfigurační souboru napřímo textovým editorem. Pro automatizovanou správu je vhodné použít aplikaci \texttt{uci}. Tento nástroj umožňuje veškerou manipulaci s~konfiguračními soubory UCI, poskytuje také kontrolu uživatelských chyb.

Aplikaci \texttt{uci} funguje režimem transakcí, což znamená, že všechny modifikace provedené na konfiguračních objektech jsou provedeny až po explicitním aplikování \cite{openwrt_uci}. Tento proces je vysvětlen na příkladu níže:

\begin{verbatim}
1    root@OpenWrt:~# uci set uhttpd.main.listen_http=8080
2    root@OpenWrt:~# uci commit uhttpd
\end{verbatim}

\begin{itemize}
    \item Na řádku 1 se přes aplikaci \texttt{uci} změnil port, na kterém webový server uhttpd poslouchá na http komunikaci. Po provedení tohoto řádku se konfigurační soubor \texttt{/etc/config/uhttpd/uhttpd.conf} nezměnil.
    \item Na řádku 2 se explicitně zapsaly provedené změny konfigurace služby uhttpd.
\end{itemize}

\vskip 0.1in

Tímto principem lze vytvořit mnoho změn v~rámci jedné transakce.

\subsection{Konfigurace přes rozhraní JSON-RPC}
\label{sec:jsonrpc}

Projekt LuCI poskytuje některé z~jeho knihoven k~použití vzdáleně externími aplikacemi přes rozhraní JSON-RPC. 

\subsubsection*{Rozhraní JSON-RPC}

JSON-RPC je volání vzdálené procedury (RPC) vložené do javascriptové objektové notace (JSON) \cite{jsonrpc}. Tento protokol funguje na základě komunikace klient-server, kde požadavek na server i odpověď serveru klientovi jsou v~JSON formátu, které obsahují protokolem definované parametry.

\vskip 0.1in

JSON objekt, který posílá klient, musí obsahovat atributy:

\vskip 0.1in

\begin{itemize}
    \item \textbf{method} -- textový řetězec obsahující jméno volané metody,
    \item \textbf{params} -- pole parametrů,
    \item \textbf{id} -- hodnota jakéhokoliv typu, která identifikuje požadavek.
\end{itemize}

\vskip 0.1in

JSON objekt, kterým odpovídá server, musí obsahovat atributy:

\vskip 0.1in

\begin{itemize}
    \item \textbf{result} -- data vrácená metodou. Pokud nastala chyba, musí být hodnota \texttt{null}.
    \item \textbf{error} -- pokud nastala chyba, tak její číslo, jinak \texttt{null},
    \item \textbf{id} -- hodnota, která byla v~klientském požadavku.
\end{itemize}

\vskip 0.1in

\subsubsection*{Rozhraní JSON-RPC na distribuci OpenWrt}

V~základní distribuci OpenWrt není JSON-RPC nainstalované, je potřeba si nainstalovat balíček \texttt{luci-mod-rpc} a následně restartovat webový server \cite{luci_jsonrpc}:

\begin{verbatim}
    $ opkg update
    $ opkg install luci-mod-rpc
    $ /etc/init.d/uhttpd restart
\end{verbatim}

Po instalaci je možné využívat JSON-RPC rozhraní pro správu a~konfiguraci OpenWrt z~externích zařízení. Požadavky se zasílají HTTP metodou POST na rpc koncový bod rozhraní OpenWrt: \texttt{<OPENWRT\textunderscore IP>/cgi-bin/luci/rpc/<MODUL>}, kde \texttt{<MODUL>} je název knihovny rozhraní. OpenWrt poskytuje přes JSON-RPC následující knihovny \cite{luci_jsonrpc}:

\vskip 0.1in

\begin{itemize}
    \item \textbf{uci}  -- umožňuje modifikovat UCI konfigurační soubory,
    \item \textbf{fs}   -- poskytuje rozhraní do souborového systému OpenWrt,
    \item \textbf{sys}  -- umožňuje interagovat s~operačním systémem OpenWrt,
    \item \textbf{ipkg} -- poskytuje rozhraní do balíčkovacího systému (IPKG nebo OPKG).
\end{itemize}

\vskip 0.1in

Pro volání většiny metod v~rozhraní je potřeba provést autentizaci, lde OpenWrt dává k~dispozici \texttt{login} metodu v~JSON-RPC knihovně \texttt{auth} \cite{luci_jsonrpc}. Invokace této metody s~parametry uživatelského jména a hesla následně vrátí OpenWrt token, který je použit pro volání metod vyžadující autentizaci.

JSON-RPC knihovna \texttt{uci} poskytuje téměř stejnou funkcionalitu, jako aplikace \texttt{uci} z~kapitoly \ref{sec:3_uci_app}, lze tedy plně konfigurovat zařízení s~distribucí OpenWrt externí službou. Příklad, kterým lze modifikovat UCI konfigurační možnost služby uhttpd:

\begin{verbatim}
$ curl http://<OPENWRT_IP>/cgi-bin/luci/rpc/uci?auth=<TOKEN> --data '
{
  "id": 1,
  "method": "set",
  "params": [
    "uhttpd",
    "main",
    "listen_http",
    "8080"
  ]
}'
\end{verbatim}

Obdobným způsobem lze přidávat celé sekce, mazat či měnit konfigurační možnosti. Všechny změny v~UCI se i přes JSON-RPC chovají transakčně, pro aplikování změn je tedy nutné zavolat metodu \texttt{commit} \cite{luci_jsonrpc}. Přehled JSON-RPC metod dostupných v~knihovně \texttt{uci} je uveden v~dokumentaci \cite{luci_jsonrpc}.






\chapter{Použité technologie}
\label{sec:4_pouzite_technologie}

Existuje mnoho frameworků k~tvorbě webových aplikací. Jelikož kontrolér je v~principu jednoduchá webová aplikace, byl pro jeho implementaci zvolen lehký Python framework Flask \cite{flask_book}. Pro tvorbu moderního a responzivního vzhledu aplikace byla vybrána knihovna Bootstrap 3, který má přes modeul podporu ve frameworku Flask. V~následujících kapitolách jsou využité technologie podrobněji popsány.

% Jako CSS knihovna byl zvolen Bootstrap 3, který má podporu v samotném Flask frameworku.

\section{Webový aplikační framework Flask}

Flask je lehký webový aplikační framework napsaný v~programovacím jazyce Python. Jelikož je jeho jádro velice jednoduché, nazývá se někdy jako mikroframework. Flask je založen na jednoduché rozšířitelnosti \cite{flask_book}, bylo pro něj vyvinuto mnoho modulů implementující řešení specifických problémů, jako databáze nebo validace formulářů. Kostra fungující Flask aplikace, uvedená ve výpisu \ref{lst:flask_helloworld}, vyžaduje pouze 9 řádku.

\vskip 0.1in

\begin{lstlisting}[language=Python,frame=single,numbers=left,caption={Ukázka kostry aplikace s~frameworkem Flask},label={lst:flask_helloworld}, keywordstyle=\color{blue},captionpos=b]
from flask import Flask
app = Flask(__name__)

@app.route('/')
def ahoj_svete():
	return 'Ahoj Svete !'
	
if __name__ == '__main__':
    app.run()
\end{lstlisting}

\vskip 0.1in

Flask je postaven na Web Server Gateway Interface (WSGI), což je specifikace pro univerzální rozhraní mezi webovými aplikacemi a webovými servery. Vývoj a nasazení aplikací je velice jednoduché, protože Flask obsahuje vlastní vývojový server, který je součástí instalace. Pro generování HTML šablon využívá Flask šablonovací jazyk Jinja2.

Hlavní důvody pro volbu frameworku Flask:

\vskip 0.1in

\begin{itemize}
    \item \textbf{Rychlost vývoje} -- Vývoj jednoduché webové aplikace je prakticky vždy rychlejší s~minimalistickým frameworkem Flask oproti např. frameworku Django.
    \item \textbf{Učící křivka} -- Flask má velice snadnou konfiguraci a plnou dokumentaci v~kódu pomocí nástroje Docstrings.
    \item \textbf{Multiplatformí podpora} -- Flask může běžet na všech moderních operačních systémech.
    \item \textbf{Licence} -- Flask má otevřený kód pod licencí BSD.
\end{itemize}

\subsubsection*{Routování}

Python dekorátor \texttt{@app.route} je použit pro svázání funkce s~URL \cite{flask_book}. Parametr použitý v~dekorátoru svazuje funkci k~relativní cestě. Příklad cesty je \texttt{'/'} pro kořen stránky a \texttt{'/ahoj\_svete'} pro vnořenou stránku. Příklad uvedený v~\ref{lst:flask_helloworld} svazuje funkci \texttt{ahoj\_svete()} k~URL \texttt{hostname/}.

\subsubsection*{HTTP metody}

Nepovinným parametrem pro \texttt{@app.route} dekorátor je pole povolených HTTP metod. Pokud není tento parametr specifikován, je vždy povolena HTTP metoda \texttt{GET} \cite{flask_book}. Příklad povolení HTTP metody POST je uveden ve výpisu \ref{lst:flask_methods}.

\vskip 0.1in

\begin{lstlisting}[language=Python,frame=single,numbers=left,caption={Povolení POST metody pro přihlašovací formulář.},label={lst:flask_methods}, keywordstyle=\color{blue},captionpos=b]
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        prihlas_uzivatele()
    else:
        zobraz_prihlasovaci_formular()
\end{lstlisting}

\vskip 0.1in

\subsubsection*{Požadavky}

Práce s~příchozími požadavky se děje přes globální objekt \texttt{request} \cite{flask_book}. Tento objekt obsahuje všechny atributy příchozího požadavku jako řetězec dotazu, HTTP hlavičky, formulářová data nebo požadavek POST a nahrané soubory. Výpis \ref{lst:flask_requests} ukazuje jednoduché použití objektu \texttt{request} pro získání položky \texttt{'User-Agent'} z~HTTP hlavičky.

\vskip 0.1in

\begin{lstlisting}[language=Python,frame=single,numbers=left,caption={Využití objektu request k~získání položky z~HTTP hlavičky.},label={lst:flask_requests}, keywordstyle=\color{blue},captionpos=b]
@app.route('/user_agent')
def user_agent():
    user_agent_name = request.headers.get('User-Agent')
    return user_agent_name
\end{lstlisting}

\vskip 0.1in

\subsubsection*{Odpovědi}

Při navracení odpovědi, která bude renderována jako webová stránka, Flask poskytuje několik možností, které tento proces dělají flexibilní. Například vrácený řetězec bude automaticky převeden na validní HTML stránku. Existuje několik funkcí pro vytváření specifických odpovědí, například \texttt{send\_file(cesta, souboru)}, která uživateli pošle soubor. HTML soubory mohou být renderovány funkcí \texttt{make\_response()}, složitější stránky můžou být vytvořeny s~pomocí šablonovacího jazyka. Šablonovací jazyk použitý ve frameworku Flask je vysvětlen v~následující sekci.

\subsubsection*{Šablony}

Flask používá šablonovací jazyk zvaný \texttt{Jinja2}, který značně pomáhá vývojáři k~zajištění bezpečnosti aplikace. Šablonovací jazyk automaticky ukončuje potencionálně nebezpečné uživatelské vstupy, aniž by na to musel vývojář myslet \cite{flask_book}.

\vskip 0.1in

\begin{lstlisting}[language=Python,frame=single,numbers=left,caption={Renderování šablony, která zobrazí parametr jmeno.},label={lst:flask_template_render}, keywordstyle=\color{blue},captionpos=b]
from flask import render_template

@app.route('/<jmeno>')
def ahoj(jmeno=None):
    return render_template('ahoj.html', jmeno=jmeno)
\end{lstlisting}

\vskip 0.1in

\begin{lstlisting}[language=html,frame=single,numbers=left,caption={Příklad šablony jazyka Jinja2.},label={lst:flask_jinja2}, keywordstyle=\color{blue},captionpos=b]
<!doctype html>
<title>Flask Jinja2 priklad</title>

<h1>Ahoj {{ jmeno }}!</h1>
\end{lstlisting}

\vskip 0.1in

Výpis \ref{lst:flask_template_render} zobrazuje jednoduchý příklad renderování HTML stránky pomocí šablony. Funkce \texttt{render\_template} načte šablonu uvedenou ve výpisu \ref{lst:flask_jinja2} a dosadí za proměnnou \texttt{jmeno} řetězcem zadaným v~URL. Šablonovací jazyk se postará o~všechna ukončení uživatelských vstupů, takže potencionalní útočník nemůže poškodit stránku přes URL.

\subsubsection*{SQLAlchemy}
\label{sec:sqlalchemy}

SQLAlchemy je knihovna určená pro práci nad SQL databázemi přimo z~prostředí jazyka Python \cite{flask_sqlalchemy}. Cílem knihovny je poskytnout efektivní a výkonný databázový přístup. SQLAlchemy podporuje všechny běžné poskytovatele databáze, např. MySQL, PostgreSQL nebo SQLite, což je databáze držená v~paměti programu.

Kód zobrazený ve výpisu \ref{lst:flask_sqlalchemy_model} ukazuje, jak se vytváří spojení k~databázi. Databázové URI je knihovně předáno přes konfigurační atribut Flask aplikace a následně je vytvořen databázový objekt. Tento objekt obsahuje třídu \texttt{Model}, která může být použita k~deklaraci databázového modelu - databázové tabulky. V~tomto příkladu je vytvořen model \texttt{Uzivatel}.

\vskip 0.1in

\begin{lstlisting}[language=Python,frame=single,numbers=left,caption={Databázový model SQLAlchemy.},label={lst:flask_sqlalchemy_model}, keywordstyle=\color{blue},captionpos=b]
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config ['SQLALCHEMY_DATABASE_URI'] = \
    'sqlite:///tmp/db.sqlite'
db = SQLAlchemy(app)

class Uzivatel(db.Model)
    id = db.Column(db.Integer, primary_key=True)
    jmeno = db.Column(db.String(64), unique=True)
    email = db.Column(db.String(128), unique=True)
    
    def __init__(self, jmeno, email)
        self.jmeno = jmeno
        self.email = email
\end{lstlisting}

\vskip 0.1in

Po vytvoření databázového modelu se může databáze naplnit konkrétními záznamy. Výpis \ref{lst:flask_sqlalchemy_create} zobrazuje práci s~SQLAlchemy databází. Mezi řádky 1 až 6 jsou uživatelé vytvořeni a vloženi do databáze. Následně je databáze dotazována. Nejprve je dotázána na všechny uživatele, poté je dotázána pouze na prvního uzivatele se jménem 'Host'.

\vskip 0.1in

\begin{lstlisting}[frame=single,numbers=left,caption={Naplnění a dotazování SQLAlchemy databáze.},label={lst:flask_sqlalchemy_create}, keywordstyle=\color{blue},captionpos=b]
admin = Uzivatel('admin', 'admin@admin.cz')
host = Uzivatel('host', 'host@host.cz')

db.session.add(admin)
db.session.add(host)
db.session.commit()

uzivatele = Uzivatel.query.all()
host = Uzivatel.query.filter_by(jmeno='host').first()
\end{lstlisting}

\vskip 0.1in

\section{JavaScriptová knihovna jQuery}

jQuery je JavaScriptová knihovna běžící na straně klienta (prohlížeče), která slouží k~manipulaci objektové reprezentace HTML dokumentu (DOM) \cite{jquery_book}. Důvodem použití jQuery oproti čistému JavaScriptu je podstatné zjednodušení práce a zpřehlednění zdrojového kódu. Dále jQuery abstrahuje typ prohlížeče, ve kterém běží, takže vývojář automaticky píše kód, který bude fungovat ve všech podporovaných prohlížečích.

jQuery poskytuje následující funkcionalitu:

\vskip 0.1in

\begin{itemize}
    \item Manipulaci s~HTML/DOM,
    \item manipulaci s~CSS,
    \item registrace na události vyvolané v~dokumentu,
    \item efekty a animace,
    \item AJAX a pomocné funkce.
\end{itemize}

\vskip 0.1in

Pro ilustraci síly a důvodu širokého použití jQuery, výpis \ref{lst:javascript_pure} napsaný v~klasickém JavaScriptu na 5 řádků vykonává stejnou akci jako výpis \ref{lst:jquery} napsaný pomocí knihovny jQuery na 1 rádek.

\vskip 0.1in

\begin{lstlisting}[frame=single,numbers=left,caption={Ukázka vykonání akce v~čistém JavaScriptu.},label={lst:javascript_pure}, keywordstyle=\color{blue},captionpos=b]
var d = document.getElementByClassName("element");
var i;
for (i = 0; i < d.length; i++) {
    d[i].className = d[i].className + " selected";
}
\end{lstlisting}

\vskip 0.1in

\begin{lstlisting}[frame=single,numbers=left,caption={Ukázka vykonání akce pomocí jQuery.},label={lst:jquery}, keywordstyle=\color{blue},captionpos=b]
$(".element").addClass("selected");
\end{lstlisting}


\chapter{Návrh řešení}
\label{sec:chapter_4}

V~této kapitole bude popsán návrh kontroléru, který bude sloužit pro centralizovanou konfiguraci a správu přístupových bodů v~sítích IEEE 802.11 se systémy OpenWrt. 

Kontrolér je koncipovaný jako webová aplikace postavená na frameworku Flask \cite{flask_book}, který je napsán v~programovacím jazyku Python \cite{python_book}. Ke komunikaci s~jednotlivými přístupovými body se systémem OpenWrt bylo zvoleno rozhraní JSON-RPC, které je popsané v~kapitole \ref{sec:jsonrpc}.

\section{Role kontroléru}

Kontrolér má roli centralizovaného nástroje, který sbírá informace o~jednotlivých zařízení s~OpenWrt systémy a dokáže je konfigurovat. Kontrolér tedy musí být ve stejné síti, jako OpenWrt zařízení, aby s~nimi mohl komunikovat. Pro přístup na kontrolér stačí jakýkoliv webový prohlížeč.

Příklad síťové topologie, do které je zapojený kontrolér a dva přístupové body OpenWrt, je znázorněn na obrázku \ref{fig:role_kontroleru}.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[scale=0.6]{obrazky/openwrt/OpenWrt_Topology_Example.png}
  \end{center}
  \caption[Role kontroléru v~ukázkové topologii sítě]{Role kontroléru v~ukázkové topologii sítě. Kontrolér konfiguruje přístupové body OpenWrt, aby vytvořily přístup ke studentské a hostovské síti přes bezdrátové sítě \texttt{SSID\_Student} a \texttt{SSID\_Host}.}
  \label{fig:role_kontroleru}
\end{figure}

V~rámci ukázkové topologie se nejprve nakonfigurují jednotlivé porty na přepínači:

\vskip 0.1in

\begin{itemize}
    \item Portu, do kterého je připojena hostovská síť, se přiřadí tag VID 50.
    \item Portu, do kterého je připojena studentská síť, se přiřadí tag VID 100.
    \item Porty, do kterých jsou zapojeny zařízení OpenWrt, se nakonfigurují jako trunk.
\end{itemize}

\vskip 0.1in

Poté se na webovém rozhraní kontroléru nakonfigurují bezdrátové sítě, jejich parametry a přiřadí se k~lokálním sítím, ke kterým budou koncový klienti připojení:

\vskip 0.1in

\begin{itemize}
    \item Paketům, které přijdou z~bezdrátové hostovské sítě \texttt{SSID\_Host}, se přiřadí VLAN tag 50, tím budou klienti schopni komunikovat se zařízeními v~hostovské síti.
    \item Paketům, které přijdou z~bezdrátové hostovské sítě \texttt{SSID\_Student}, se přiřadí VLAN tag 100, tím budou klienti schopni komunikovat se zařízeními ve studentské síti.
\end{itemize}

\vskip 0.1in

Nakonec se tato nadefinovaná konfigurace nasadí na OpenWrt zařízení. Způsob nasazení konfigurace je popsán níže.


\subsubsection*{Způsob nasazení konfigurace}

Kontrolér komunikuje s~OpenWrt zařízeními přes rozhraní JSON-RPC, které je popsáno v~sekci \ref{sec:jsonrpc}. Princip konfigurace je znázorněn sekvenčním diagramem na schématu \ref{fig:4_sekv}. Nejprve je nutné na provést na webovém rozhraní kontroléru konfiguraci lokálních a bezdrátových sítí, poté se tato konfigurace může nasadit na jednotlivá OpenWrt zařízení. Dále je nutné získat autentizační token pro rozhraní JSON-RPC. Poté se vymaže stará konfigurace na OpenWrt zařízení, nahraje aktuální a aplikuje se potvrzením transakce. Nakonec dá webové rozhraní kontroléru uživateli zpětnou vazbu o~výsledku provedení nasazení konfigurace.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[scale=0.4]{obrazky/openwrt/4_sekvencni_diagram.png}
  \end{center}
  \caption[Komunikační schéma]{Sekvenční diagram znázorňující nasazení konfigurace na jednotlivé přístupové body se systémem OpenWrt.}
  \label{fig:4_sekv}
\end{figure}


\section{Formulace požadavků}

Kontrolér musí umožnit uživateli zejména vytvořit ucelenou síť, nakonfigurovat bezdrátové sítě a získat základní přehled o~stavu jednotlivých přístupových bodů. Při přidání nového přístupového bodu do sítě musí kontrolér umožnit jeho jednoduchou adaptaci. Na obrázku \ref{fig:usecase} je popsán diagram případů použití z~pohledu správce sítě.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[scale=0.5]{obrazky/openwrt/usecase.png}
  \end{center}
  \caption[Případy použití kontroléru]{UML Diagram případů použití kontroléru z~pohledu uživatele (správce sítě).}
  \label{fig:usecase}
\end{figure}

%\subsection{Vytvoření sítě}
%\label{sec:4_vytvoreni_site}
%
%Při vytváření nové sítě je nutné definovat následující informace:
%
%\vskip 0.1in
%
%\begin{itemize}
%    \item Název sítě,
%    \item IP adresu a masku sítě,
%    \item výchozí bránu,
%    \item VLAN identifikátor,
%    \item mód DHCP,
%    \item IP adresu NTP serveru.
%\end{itemize}

\subsection{Definování bezdrátových sítí}

Bezdrátová síť je definována následujícími parametry:

\vskip 0.1in

\begin{itemize}
    \item Identifikátorem bezdrátové sítě (SSID),
    \item způsobem zabezpečení, 
%    \item odpovídající síť vytvořená v \ref{sec:4_vytvoreni_site}.
    \item lokální sítí, se kterou je v~bridge módu,
    \item možností skrýt SSID,
    \item možností izolování klientů v~bezdrátové síti.
    
\end{itemize}

\subsection{Zobrazení stavu zařízení}

Kontrolér musí mít přehled o~stavu sledovaných přístupových bodů, zejména o:

\vskip 0.1in

\begin{itemize}
    \item Názvu zařízení,
    \item dostupnosti zařízení (dostupné / nedostupné),
    \item stavu rozhraní JSON-RPC (dostupné / nedostupné),
    \item verzi systému,
    \item hardwarové revizi zařízení,
    \item době běhu systému,
    \item aktuálním zatížení zařízení,
    \item aktuálním stavu paměti zařízení,
    \item aktuálním nastavení lokálních sítí,
    \item aktuálním nastavení bezdrátových sítí,
    \item systémovém logu,
    \item seznamu asociovaných klientů v~bezdrátových sítích.
\end{itemize}


% Co všechno tady přidat ?
%\subsubsection*{Šablonovací jazyk Jinja2}


\section{Návrh uživatelského rozhraní}

Uživatelské rozhraní musí uživateli umožnit vykonávání všech funkcí, které jsou popsané v~diagramu případu použití \ref{fig:usecase}. Jednotlivé části uživatelského rozhraní popisují obrázky v~následujících podkapitolách, které blíže popisuje doprovodný text.

\subsection{Přihlašovací stránka}

Při prvním spuštění aplikace je uživatel vyzván k~přihlášení na stránce \texttt{'/login'}. Pro přihlášení musí uživatel zadat platné uživatelské jméno a heslo v~přihlašovacím formuláři zobrazeném na obrázku \ref{fig:prihlaseni}. Pokud je zadána neplatná kombinace uživatelského jména a hesla, zobrazí se uživateli informační zpráva \ref{fig:neplatne_udaje} o~této události.

Pokud se uživatel pokusí zobrazit přihlašovací stránku a je již přihlášen, bude automaticky přesměrován na hlavní stránku.

\begin{figure}[!h]
\centering
\begin{subfigure}{.5\textwidth}
  \centering
  \includegraphics[width=1\linewidth]{obrazky/openwrt/authorization_required.png}
  \caption{Přihlašovací okno kontroléru.}
  \label{fig:prihlaseni}
\end{subfigure}%
\begin{subfigure}{.5\textwidth}
  \centering
  \includegraphics[width=1\linewidth]{obrazky/openwrt/invalid_username_or_password.png}
  \caption{Chybová hláška při zadání nesprávných přihlašovacích údajů.}
  \label{fig:neplatne_udaje}
\end{subfigure}
\caption{Pokus o~přihlášení do kontroléru.}
\label{fig:test}
\end{figure}

\subsection{Hlavní stránka}

Po úspěšném přihlášení je uživatel přesměrován na hlavní stránku. Účelem hlavní stránky je zobrazení přehledu dostupných OpenWrt zařízení ve sledované síti, zobrazení informací o~jejich stavu a možnost vykonávat akce nad jednotlivými zařízeními. Obrázek \ref{fig:hlavni_stranka} ilustruje vzhled hlavní stránky.

Hlavním elementem stránky je tabulka, kde každý její řádek je detekované OpenWrt zařízení ve spravované síti, která je uvedena v~nadpisu nad tabulkou. V~samotné tabulce jsou obsaženy základní informace o~zařízení, ze kterých uživatel může na první pohled zjistit, zda se zařízení nachází v~dobrém nebo nežádoucím stavu. Dále obsahuje tabulka prvky umožňující provádění změn na zařízení.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[scale=0.65]{obrazky/openwrt/4_main_page.png}
  \end{center}
  \caption[Hlavní stránka kontroléru]{Hlavní stránka kontroléru.}
  \label{fig:hlavni_stranka}
\end{figure}

Tabulka seznamu zařízení obsahuje následující sloupce:

\vskip 0.1in

\begin{itemize}
    \item \textbf{Name} -- obsahuje tlačítko s~vygenerovaným unikátním jménem pro zařízení, po jehož zmáčknutí se zobrazí stránka s~detailními informacemi o~zařízení popsaná v~kapitole \ref{sec:detail_zarizeni}.
    \item \textbf{IP Address} -- odkaz s~IP adresou, na které je zařízení dostupné.
    \item \textbf{Ping} -- indikuje, zda je zařízení dostupné na síti.
    \item \textbf{LuCI} -- indikuje, zda je na zařízení dostupné rozhraní JSON-RPC.
    \item \textbf{SSH} -- indikuje, zda je zařízení dostupné přes protokol Secure Shell (SSH).
    \item \textbf{Hostname} -- trvalé jméno zařízení.
    \item \textbf{Uptime} -- celková doba provozu zařízení od jeho posledního spuštění či restartu.
    \item \textbf{Clients} -- počet wifi klientů připojených přes zařízení.
    \item \textbf{Comment} -- komentář, který může uživatel ke konkrétnímu zařízení nastavit pro jeho bližší identifikaci.
    \item \textbf{WiFi channel} -- WiFi kanál, na kterém zařízení vysílá. Je možné nastavit konkrétní kanál nebo nastavit automatický mód, kdy se zařízení pokusí zvolit nejvhodnější kanál.
    \item \textbf{Actions} -- tlačítko, které po jeho kliknutí nahraje aktuální konfiguraci definovanou na kontroléru na zařízení.
\end{itemize}

\vskip 0.1in

Pod tabulkou se nachází sekce s~informacemi o~probíhajícím či posledním vyhledávání dostupných OpenWrt zařízení ve sledované síti. Pokud aktuálně sken sítě neprobíhá, je zobrazeno datum a čas posledního vykonaného skenu. Uživatel tak ví, jestli jsou informace o~zobrazených zařízeních v~tabulce aktuální. Při zmáčknutí tlačítka \texttt{Scan Network} se spustí procedura hledání dostupných zařízení a uživatel je o~jejím stavu informován grafickým indikátorem zobrazující průběh skenování.


\subsubsection{Navigační menu}

Pokud je uživatel přihlášen, zobrazí se mu na všech stránkách navigační menu v~horní části obrazovky znázorněné na obrázku \ref{fig:menu}. 

\vskip 0.1in

\begin{itemize}
    \item Nápis \texttt{OpenWRT ACP} a tlačitko \texttt{Devices} směřují na domovskou stránku pod adresou \texttt{'/'},
    \item tlačítko \texttt{Networks} směřuje na stránku s~definicí lokálních sítí pod adresou \texttt{'/network'},
    \item tlačítko \texttt{Wireless} směřuje na stránku s~definicí bezdrátových sítí pod adresou \texttt{'/wireless'},
    \item tlačítko \texttt{Clients} směřuje na stránku s~tabulkou obsahující všechny připojené klienty pod adresou \texttt{'/clients'},
    \item tlačítko \texttt{Log Out} odhlásí uživatele a přesměruje na přihlašovací stránku pod adresou \texttt{'/login'}.
\end{itemize}

\vskip 0.1in

\begin{figure}[!h]
  \begin{center}
    \includegraphics[scale=0.65]{obrazky/openwrt/4_navigacni_bar.png}
  \end{center}
  \caption[Navigační menu kontroléru]{Navigační menu kontroléru.}
  \label{fig:menu}
\end{figure}

\subsection{Detail zařízení}
\label{sec:detail_zarizeni}

Stránka s~detailem zařízení \ref{fig:detail_zarizeni} obsahuje množství bližších informací o~konkrétním zařízení. Slouží zejména pro stavy, kdy zařízení nepracuje správně. Z~informací obsažených na této stránce dokáže uživatel s~velkou pravděpodobností určit příčinu, proč je zařízení v~nežádoucím stavu.

Stránka obsahuje pět záložek:

\vskip 0.1in

\begin{itemize}
    \item \textbf{Device} -- informace o~systému, zejména o~typu hardwarového modelu zařízení, míry zatížení a stavu paměti.
    \item \textbf{Network} --vVýpis aktuální konfigurace síťových rozhraní.
    \item \textbf{Wireless} -- výpis aktuální konfigurace bezdrátových rozhraní.
    \item \textbf{Syslog} -- systémový log zařízení.
    \item \textbf{Kernel Log} -- log linuxového jádra zařízení.
\end{itemize}

\vskip 0.1in

\begin{figure}[!h]
  \begin{center}
    \includegraphics[scale=0.75]{obrazky/openwrt/detail_zarizeni.png}
  \end{center}
  \caption[Stránka detailu zařízení]{Stránka detailních informací o~zařízení.}
  \label{fig:detail_zarizeni}
\end{figure}


\subsection{Definice lokálních sítí}
\label{sec:definice_lokalnich_siti}

Seznam definovaných lokálních sítí se nechází na stránce \ref{fig:lokalni_site} dostupné pod adresou \texttt{'/network'}. V~tabulce jsou zobrazeny již nadefinované sítě, které jdou upravit nebo mazat tlačítky ve sloupci \textbf{Actions}. Definovat novou síť lze kliknutím na tlačítko \textbf{+ Add Network}.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[scale=0.8]{obrazky/openwrt/networks_overview.png}
  \end{center}
  \caption[Přehled definovaných lokálních sítí v~kontroléru]{Přehled definovaných lokálních sítí v~kontroléru.}
  \label{fig:lokalni_site}
\end{figure}

Stránka \ref{fig:detail_lokalni_site} s~editací nebo definováním nové sítě obsahuje formulář, ve kterém musí uživatel vyplnit následující textová pole:

\vskip 0.1in
\begin{itemize}
    \item \textbf{Name} -- unikátní název sítě v~rámci kontroléru,
    \item \textbf{VLAN} -- číslo VLAN identifikátoru, musí být unikátní v~rámci kontroléru.
\end{itemize}
\vskip 0.1in

\begin{figure}[!h]
  \begin{center}
    \includegraphics[scale=0.8]{obrazky/openwrt/new_network.png}
  \end{center}
  \caption[Formulář pro definování nové lokální sítě]{Formulář pro definování nové lokální sítě v~kontroléru.}
  \label{fig:detail_lokalni_site}
\end{figure}

Volitelně může uživatel nadefinovat výchozí bránu sítě. Tato možnost má využití zejména v~případě, že v~definované síti neexistuje žádný DHCP server.




\subsection{Definice bezdrátových sítí}

Seznam definovaných bezdrátových sítí se nachází na stránce \ref{fig:bezdratove_site} dostupné pod adresou \texttt{'/wireless'}. Podobně jako u~stránky s~přehledem lokálních sítí je zde přehled definovaných bezdrátových sítí s~možností jejich úpravy, mazání či vytvoření nové bezdrátové sítě.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[scale=0.8]{obrazky/openwrt/wireless_networks.png}
  \end{center}
  \caption[Přehled definovaných bezdrátových sítí v~kontroléru]{Přehled definovaných bezdrátových sítí v~kontroléru.}
  \label{fig:bezdratove_site}
\end{figure}

Stránka \ref{fig:detail_bezdratove_site} s~editací nebo definováním nové sítě obsahuje formulář, pomocí něhož uživatel definuje parametry bezdrátové sítě:

\vskip 0.1in
\begin{itemize}
    \item \textbf{SSID} -- název bezdrátové sítě tak, jak se zobrazí klientům.
    \item \textbf{Enabled} -- přepínač indikující zda bude tato bezdrátová síť povolena.
    \item \textbf{Security} -- typ zabezpečení bezdrátové sítě. Pokud je vybráno zabezpěčení \textbf{WPA Personal}, musí uživatel vyplnit heslo k~přístupu k~této bezdrátové síti.
    \item \textbf{Network} -- dropdown, ze kterého uživatel musí vybrat nadefinovanou lokální síť z~\ref{sec:definice_lokalnich_siti}, do které bude bezdrátová síť patřit.
    \item \textbf{Hide SSID} -- přepínač indikující, zda budou SSID vyditelné.
    \item \textbf{Isolate Clients} -- přepínač indikující, zda mezi sebou budou moci bezdrátová klienti komunikovat.
\end{itemize}
\vskip 0.1in

\begin{figure}[!h]
  \begin{center}
    \includegraphics[scale=0.8]{obrazky/openwrt/new_wireless_network.png}
  \end{center}
  \caption[Formulář pro definování nové bezdrátové sítě]{Formulář pro definování nové bezdrátové sítě v~kontroléru.}
  \label{fig:detail_bezdratove_site}
\end{figure}


\subsection{Seznam asociovaných klientů}

Stránka obsaující seznam asociovaných klientů zobrazena na obrázku \ref{fig:asoc_clients} je dostupná pod adresou \texttt{'/clients'}. Obsahuje seznam všech zařízení připojených k~bezdrátovým sítím na přístupových bodech OpenWrt, které jsou ve stejné síti jako je kontrolér. Informace o~asociovaných zařízeních zahrnují:

\vskip 0.1in
\begin{itemize}
    \item \textbf{SSID} -- odkaz s~názvem bezdrátové sítě, ke které je klient připojen. Po kliknutí na odkaz je uživatel přesměrován na stránku definice této bezdrátové sítě.
    \item \textbf{Client IP Address} -- odkaz s~IP adresou klienta.
    \item \textbf{Client MAC Adress} -- MAC adresa zařízení klienta.
    \item \textbf{Signal/Noise} -- síla signálu a šumu na přístupovém bodě OpenWrt, ke kterému je daný klient připojen.
    \item \textbf{TX/RX} -- počet přijatých/odeslaných paketů mezi zařízením a přístupovým bodem a aktuální propustnost na přístupovém bodě.
\end{itemize}
\vskip 0.1in

\begin{figure}[!h]
  \begin{center}
    \includegraphics[scale=0.8]{obrazky/openwrt/tabulka_asociovanych_klientu.png}
  \end{center}
  \caption[Tabulka se seznamem všech asociovaných klientů]{Tabulka se seznamem všech asociovaných klientů.}
  \label{fig:asoc_clients}
\end{figure}

\chapter{Implementace}
\label{sec:chapter_6}

Tato kapitola se věnuje implementaci práce. Nejprve je popsán datový model využitý na kontroléru, dále jsou popsány typy autentizace ke kontroléru a k~zařízením OpenWrt. Následuje popis principu zjišťování dostupnosti zařízení OpenWrt ve sledovaném síťovém segmentu. Nakonec je popsána implementace získávání informace ze sledovaných zařízení a způsob nasazení konfigurace.

Kontrolér byl vyvíjen a testován na zařízení TP-Link TL-WR1043N/ND v4 \cite{tplink_techdata}.

\section{Datový model}
\label{sec:datovy_model}

Stav a aktuální konfigurace kontroléru je uložena v~perzistentní databázi. Pro přístup k~databázi a mapování relační databáze na objekty je využita knihovna SQLAlchemy popsaná v~kapitole \ref{sec:sqlalchemy}. Při startu aplikace kontroléru se vytvoří databázový model deklarovaný ve zdrojovém souboru \texttt{app/models.py}. Pokud existují uložená data z~předchozího spuštění kontroléru, jsou automaticky přidána do databáze. UML diagram databáze kontroléru je zobrazen na obrázku \ref{fig:databazovy_model}.

Kontrolér pracuje s~následujícími databázovými tabulkami:

\vskip 0.1in
\begin{itemize}
    \item \textbf{users} -- tabulka obsahující uživatelské přihlašovací údaje ke kontroléru.
    \item \textbf{openwrts} -- tabulka obsahující záznamy aktuálních dostupných zařízení OpenWrt ve sledované síti.
    \item \textbf{openwrt\_comments} -- tabulka obsahující komentáře, které se vážou na konkrétní OpenWrt zařízení přes jejich MAC adresu rozhraní eth0.
    \item \textbf{networks} -- tabulka obsahující definované lokální sítě.
    \item \textbf{wireless\_networks} -- tabulka obsahující definované bezdrátové sítě a jejich parametry.
\end{itemize}
\vskip 0.1in

\begin{figure}[!h]
  \begin{center}
    \includegraphics[scale=0.53]{obrazky/openwrt/datovy_model.png}
  \end{center}
  \caption[Diagram databázového modelu kontroléru]{Diagram databázového modelu kontroléru.}
  \label{fig:databazovy_model}
\end{figure}



\section{Přihlášení uživatele do kontroléru}

V~současné době se při vývoji webových aplikací klade velký důraz na bezpečnost. V~případě kontroléru je důležitá autentizace - ověření identity uživatele.

Identita uživatele je ověřena zadáním platného uživatelského jména a hesla v~přihlašovací formě \ref{fig:prihlaseni}. Zaslání vyplněného uživatelského jména a hesla zavolá HTTP metodu POST s~daty ve formuláři na URL \texttt{'/login'}. Kontrolér se poté pokusí získat záznam o~uživateli z~databázové tabulky \texttt{users} \ref{sec:datovy_model} a porovná uložené heslo s~přijatým heslem. Poté přihlásí uživatele do kontroléru voláním metody \texttt{login\_user} z~knihovny Flask-Login \cite{flask_login}, čímž uživateli zašle autentizační data, která se uloží do webového prohlížeče jako cookie \footnote{Jako cookie se v~protokolu HTTP označuje malé množství dat, která WWW server pošle prohlížeči, který si je následně uloží.}, které je použito pro autentizaci všech dalších požadavků uživatele. URL kontroléru, které jsou přístupné pouze přihlášeným uživatelům, obsahují dekorátor \texttt{@login\_required}. Tento dekorátor znepřístupní dekorovaná URL uživatelům, kteří nejsou přihlášení. Sekvenční diagram znázorňující autentizaci ke kontroléru je uveden na obrázku \ref{fig:autentizace_sekv}.

Uživatelské jméno a heslo nutné pro přihlášení do kontroléru je načteno při startu aplikace přes proměnné prostředí \texttt{LOGIN\_USERNAME} a \texttt{LOGIN\_PASSWORD}. Tyto proměnné lze také nastavit v~konfiguračním souboru \texttt{config.env}.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[scale=0.43]{obrazky/openwrt/autentizace_sekvencni_diagram.png}
  \end{center}
  \caption[Sekvenční diagram autentizace uživatele ke kontroléru]{Sekvenční diagram autentizace uživatele ke kontroléru.}
  \label{fig:autentizace_sekv}
\end{figure}


%\vskip 0.1in
%\begin{lstlisting}[language=Python,frame=single,numbers=left,caption={Použití dekorátoru @login\_required},label={lst:flask_login_required}, %keywordstyle=\color{blue},captionpos=b]
%@auth.route('/logout')
%@login_required
%def logout():
%\end{lstlisting}
%\vskip 0.1in



\section{Autentizace k~zařízení OpenWrt}

Většina JSON-RPC volání do zařízení OpenWrt vyžaduje autentizaci klienta, která se ověřuje přidáním autentizačního tokenu do požadavku URL. Autentizační token se získá JSON-RPC voláním knihovny \texttt{auth} s~požadavkem obsahující následující tělo:

\begin{verbatim}
    {"method": "login", "params": ["<UZIVATEL>", "<HESLO>"]}
\end{verbatim}

Autentizační pár \texttt{<UZIVATEL>} a \texttt{<HESLO>} je stejný, jako uživatelské jméno a heslo nutné pro přihlášení do webového rozhraní LuCI na zařízení OpenWrt. V~kontroléru jsou přihlašovací údaje nastaveny přes proměnné prostředí \texttt{OPENWRT\_USERNAME} a \texttt{OPENWRT\_PASSWORD}. Tyto údaje je také možné definovat v~konfiguračním souboru \texttt{config.env}.

Po zaslání autentizačního požadavku se správnými přihlašovacími údaji vrátí OpenWrt následující odpověď:

\begin{verbatim}
    {
      "result": "ebdd919a48e721c23ab29748cb32147b",
      "error": null
    }
\end{verbatim}

Klíč \texttt{result} v~sobě obsahuje autentizační token, který je nutné přidat jako URL parametr \texttt{auth} pro volání všech JSON-RPC metod, které vyžadují autentizaci.

Ve zdrojovém souboru \texttt{apps/openwrt\_api.py} je definována metoda \texttt{call\_luci}, která je využívána pro všechna JSON-RPC volání v~kontroléru. Zapouzdřuje získání autentizačního tokenu a jeho přidání do URL požadavku.

\section{Skenování sítě}

Skenování sítě se provádí za účelem nalezení všech dostupných OpenWrt zařízení, které může kontrolér spravovat. Síťový segment, na kterém skenování probíhá, je definován systémovou proměnnou \texttt{OPENWRT\_NETWORK} nebo může být definovaný v~konfiguračním souboru \texttt{config.env}. Skenují se všechny adresy v~daném síťovém segmentu kromě adresy sítě a broadcastové adresy.

Způsob skenování sítě spočívá ve vytvoření vlákna pro každou skenovanou IP adresu v~segmentu, kde každé vlákno volá metodu, která se pokusí asynchronně připojit k~portu 80 cílové IP adresy. Výpis \ref{lst:test_port_80} obsahuje kód implementující zkoušku připojení na port 80. Pokud se do sekundy nepodaří připojit k~portu 80 na cílové IP adrese, tak se předpokládá, že na dané adrese není dostupné OpenWrt zařízení. Port 80 byl zvolen, jelikož zařízení OpenWrt na tomto portu vždy poslouchá, pokud je aktivní webové rozhraní LuCI a rozhraní JSON-RPC. 

Způsob detekce pomocí zkoušky připojení k~portu 80 se projevil více spolehlivým a rychlejším, než voláním programu ping. Sken segmentu sítě o~rozsahu \texttt{/24} je vždy do sekundy hotový.


\vskip 0.1in
\begin{lstlisting}[language=Python,frame=single,numbers=left,caption={Kód zkoušející dostupnost portu 80.},label={lst:test_port_80}, keywordstyle=\color{blue},captionpos=b]
s~= socket.socket()
s.settimeout(1.0)
connected = False
try:
    s.connect((ip_address, 80))
    connected = True
except Exception as e:
    connected = False
finally:
    s.close()
\end{lstlisting}
\vskip 0.1in

\section{Získávání informací o~OpenWrt zařízeních}

Kontrolér získává informace o~jednotlivých OpenWrt zařízeních pro sestavení přehledu stavu všech dostupných zařízení, zobrazení detailních informací o~konkrétním zařízení a vytvoření seznamu všech asociovaných klientů. Některé informace jdou získat napřímo voláním specifické metody v~JSON-RPC rozhraní, jiné informace se musejí získat voláním obecné JSON-RPC metody \texttt{exec} knihovny \texttt{sys}, přes kterou lze spustit příkaz podobným způsobem jako z~příkazové řádky. V~tabulce \ref{tab:openwrt_informace} jsou uvedeny způsoby získání hlavních informací o~zařízeních OpenWrt přes rozhraní JSON-RPC.


\begin{table}[]
\begin{tabular}{|l|l|l|l|}
\hline
\textbf{\begin{tabular}[c]{@{}l@{}}Získané informace o~\\ zařízení\end{tabular}}         & \textbf{\begin{tabular}[c]{@{}l@{}}JSON-RPC\\ Knihovna\end{tabular}} & \textbf{\begin{tabular}[c]{@{}l@{}}JSON-RPC\\ Metoda\end{tabular}} & \textbf{\begin{tabular}[c]{@{}l@{}}JSON-RPC\\ Parametry\end{tabular}} \\ \hline
Firmware a hardware                                                                      & sys                                                                  & exec                                                               & ubus call system board                                                \\ \hline
Aktuální čas a stav paměti                                                               & sys                                                                  & exec                                                               & ubus call system info                                                 \\ \hline
Aktuální zatížení                                                                        & sys                                                                  & exec                                                               & cat /proc/loadavg                                                     \\ \hline
\begin{tabular}[c]{@{}l@{}}Seznam nakonfigurovaných\\ bezdrátových rozhraní\end{tabular} & sys                                                                  & exec                                                               & iwinfo                                                                \\ \hline
Systémový log                                                                            & sys                                                                  & syslog                                                             & -                                                                     \\ \hline
Nakonfigurovaný WiFi kanál                                                               & uci                                                                  & get                                                                & wireless radio0 channel                                               \\ \hline
\end{tabular}
\caption[Způsoby získání hlavních informací ze zařízení OpenWrt]{Způsoby získání hlavních informací ze zařízení OpenWrt.}
\label{tab:openwrt_informace}
\end{table}

%\section{Vytvoření konfigurace sítí}

%davat tuto sekce vubec sem ? pokud jo:





\section{Nasazení konfigurace}

Princip nasazení konfigurace na zařízení OpenWrt spočívá ve vytvoření změn v~konfiguračních objektech UCI modelu zařízení a následném aplikování těchto změn. Tento princip využívá transakční způsob vykonání změn popsaný v~kapitole \ref{sec:3_uci_app}. Postupně provedené změny se aplikují až po potvrzení transakce. Postup nasazení konfigurace se skládá z~následujících kroků:

\vskip 0.1in
\begin{enumerate}
    \item Smazání existující konfigurace lokálních sítí a nahrání aktuální konfigurace lokálních sítí.
    \item Smazání existující konfigurace bezdrátových rozhraní a nahrání aktuální konfigurace bezdrátových rozhraní.
    \item Aplikování změn - potvrzení transakce.
\end{enumerate}
\vskip 0.1in

V~sekcích níže jsou jednotlivé kroky popsány blíže.

\subsubsection*{Konfigurace sítí}

Kontrolér nejprve získá aktuální konfiguraci sítí a interního switche na zařízení pomocí JSON-RPC volání knihovny \texttt{uci} s~následujícím tělem:

\begin{verbatim}
    {"method": "get_all", "params": ["network"]}
\end{verbatim}

Výsledkem tohoto volání je JSON objekt obsahující definice všech nakonfigurovaných sítí a definice interního switche. V~dalším kroku se provede iterace nad všemi nakonfigurovanými sítěmi ve vráceném JSON objektu a smazání těch, které jsou považovány jako výchozí nastavení na zařízení. Názvy sítí, které se zachovávají, jsou \texttt{wan\_dev, lan\_dev, wan6, globals, loopback, lan, wan}. U~nastavení interního switche se zachovají konfigurace pro VID 1 (výchozí lokální síť) a VID 2 (internetová síť).

Smazání konfigurační položky sítě se vykoná JSON-RPC voláním knihovny \texttt{uci} s~následujícím tělem:

\begin{verbatim}
    {"method": "delete", "params": ["network", <NAZEV_SITE>]}
\end{verbatim}

Dále se vytvoří konfigurace interního switche. Pro každý záznam v~databázi \texttt{networks} \ref{sec:datovy_model} se vytvoří nová sekce nastavení interního switche v~OpenWrt. Sekci definuje JSON s~následujícím tělem:

\begin{verbatim}
    {"method": "section", 
     "params": ["network", "switch_vlan", "switch_vlan_<VID>",
                 {"device": "switch0",
                  "ports": "0t 4t",
                  "vlan": <VLAN_INDEX>,
                  "vid": <VID>}]}
\end{verbatim}

Níže je blíže popsán význam hlavních konfiguračních páru v~JSON objektu.

\vskip 0.1in
\begin{itemize}
    \item \textbf{device} -- při konfigurací interního switche je název zařízení vždy \texttt{switch0}.
    \item \textbf{ports} -- seznam portů, které mají být tagovány/netagovány, zápis \texttt{"0t 4t"} znamená, že porty 0 a 4 jsou trunk.
    \item \textbf{vlan} -- index VLAN nastavení. Většina OpenWrt zařízení má 2 výchozí VLAN nastavení, takže nová nastavení začínají indexem 3.
    \item \textbf{vid} -- VLAN identifikátor, který je definovaný v~konfiguraci sítí kontroléru pro každou síť.
\end{itemize}
\vskip 0.1in

Vizualizace nastavení interního switche zařízení OpenWrt modelu TP-Link TL-WR1043N/ND v4 pro záznam s~konfigurací \texttt{"vid": "10", "ports": "0t 4t"} je zobrazen na obrázku \ref{fig:openwrt_switch}. 

Vytvoření nových VLAN nastavení způsobí vytvoření nových síťových rozhraní. Vytvoření konfigurace s~\texttt{"vid": "10"} automaticky vytvoří nové síťové rozhraní s~názvem \texttt{eth0.10}.

\begin{figure}[!h]
  \begin{center}
    \includegraphics[scale=0.68]{obrazky/openwrt/openwrt_switch_vlan_10.png}
  \end{center}
  \caption[Vizualizace nastavení interního switche OpenWrt]{Vizualizace nastavení interního switche OpenWrt pro konfiguraci \texttt{"vid": "10", "ports": "0t 4t"}.}
  \label{fig:openwrt_switch}
\end{figure}




Poté se vytvoří konfigurace lokálních sítí, které budou poté svázány s~vytvořenými SSID. Podobně jako u~konfigurace interního switche OpenWrt se pro konfiguraci lokálních sítí vytvoří nová síť pro každý záznam v~tabulce \texttt{networks}. Sekci sítě definuje JSON-RPC požadavkem knihovny \texttt{uci} s~následujícím tělem:

\begin{verbatim}
    {"method": "section", 
     "params": ["network", "interface", "<NAZEV_SITE>",
                 {"proto": "none",
                  "type": "bridge",
                  "ifname": "eth0.+<VID>"}]}
\end{verbatim}

Níže je blíže popsán význam hlavních konfiguračních párů v~JSON objektu.

\vskip 0.1in
\begin{itemize}
    \item \textbf{type} -- označuje typ sítě. Takto vytvořená síť bude vždy v~bridge módu, což umožní WiFi klientům připojit se do této sítě.
    \item \textbf{ifname} -- název síťového rozhraní sítě. Síť je vždy svázána s~rozhraním, které bylo vytvořeno po přidání konfigurační sekce interního switche OpenWrt.
\end{itemize}
\vskip 0.1in


\subsubsection*{Konfigurace bezdrátových rozhraní}

Při nasazení konfigurace bezdrátových rozhraní na zařízení OpenWrt získá kontrolér nejprve aktuální konfiguraci pomocí JSON-RPC volání knihovny \texttt{uci} s~následujícím tělem:

\begin{verbatim}
    {"method": "get_all", "params": ["wireless"]}
\end{verbatim}

Následně se provede iterace nad aktuálně nakonfigurovanými bezdrátovými rozhraními vrácenými v~JSON odpovědi a vytvoří se seznam bezdrátových rozhraní, které budou vymazány. Vymazány budou všechna rozhraní, která nezačínají řetězcem \texttt{radio}, jelikož rozhraní s~názvem \texttt{radio0} bývá výchozí. Vymazání bezdrátového rozhraní se provede JSON-RPC požadavkem s~následujícím tělem:

\begin{verbatim}
    {"method": "delete", "params": ["wireless", <NAZEV_ROZHRANI>]}
\end{verbatim}

Dále se nahraje konfigurace všech bezdrátových rozhraní, která jsou uložena v~databázové tabulce \texttt{wireless\_networks}. Vytvoření bezdrátového rozhraní se provede JSON-RPC požadavkem knihovny \texttt{uci} s~následujícím tělem:

\begin{verbatim}
    {"method": "section", 
     "params": ["network", "wifi-iface", "<SSID>",
                 {"device": "radio0",
                  "mode": "ap",
                  "ssid": "<SSID>",
                  "network": "<NAZEV_SITE>"}]}
\end{verbatim}

Níže je blíže popsán význam hlavních konfiguračních páru v~JSON objektu.

\vskip 0.1in
\begin{itemize}
    \item \textbf{mode} -- Označuje v~jakém módu bude bezdrátové rozhraní fungovat, v~případě konfigurace z~kontroléru je to vždy \texttt{"ap"} - přístupový bod.
    \item \textbf{ssid} -- Název bezdrátové sítě, která se bude zobrazovat na klientských zařízení pro připojení.
    \item \textbf{network} -- Název sítě svázané s~konkrétním bezdrátovým rozhraním. Sítě byly nakonfigurovány v~předchozím kroce. 
\end{itemize}
\vskip 0.1in

Následně se na vytvořená bezdrátová rozhraní aplikují dodatečná nastavení, jako typ zabezpečení, izolování klientů nebo skrytí vysílaných SSID. Dodatečné parametry se aplikují zasláním JSON-RPC požadavku knihovny \texttt{uci} s~následujícím tělem:

\begin{verbatim}
    {"method": "set", "params": ["wireless", <SSID>, 
        <NAZEV_NASTAVENI>, <HODNOTA_NASTAVENI>]}
\end{verbatim}

Tabulka \ref{wifi_conf} poskytuje přehled konfiguračních možností pro konfigurační páry \texttt{<NAZEV\_NASTAVENI>} a \texttt{<HODNOTA\_NASTAVENI>}.

\begin{table}[ht]
\resizebox{\textwidth}{!}{\begin{tabular}{|l|l|l|l|l|}
\hline
\centering
\textbf{Účel} & \texttt{<NAZEV\_NASTAVENI>} & \texttt{<HODNOTA\_NASTAVENI>} \\ \hline
Žádné zabezpečení & "encryption" & "none" \\ \hline
Zabezpečení WPA Personal & "encryption" & "psk2" \\ \hline
Prístupové heslo & "key" & řetězec znaků \\ \hline
Skrytí SSID & "hidden" & "1" nebo "0" \\ \hline
Izolování klientů & "isolate" & "1" nebo "0" \\ \hline
\end{tabular}}
\caption[Konfigurační parametry bezdrátové sítě]{Dodatečné konfigurační parametry bezdrátové sítě zařízení OpenWrt.}
\label{wifi_conf}
\end{table}


\subsubsection*{Aplikování transakce}

Vytvořené změny z~předchozích sekcí je nutné aplikovat potvrzením transakce. Transakce se potvrdí zasláním následujících JSON-RPC požadavků knihovny \texttt{uci}:

\begin{verbatim}
    {"method": "commit", "params": ["network"]}
    {"method": "commit", "params": ["wireless"]}
\end{verbatim}

Tímto jsou provedené změny v~definici sítí i bezdrátových rozhraní na zařízení OpenWrt aplikovány.