% ------------------------------------------------------------
% Autogenerated LaTeX file for books
% db2latex RELEASE: 0.8pre1
% db2latex VERSION: $Id: VERSION.xml,v 1.6 2004/01/31 12:47:11 j-devenish Exp $
% fithesis VERSION: 1.40
% ------------------------------------------------------------
\def\clsclass{rapport3}
\documentclass{fithesis}
% --------------------------------------------
% MetaFont and MetaPost logo support
% --------------------------------------------
\usepackage{mflogo}
% --------------------------------------------
% Load fithesis param 
% --------------------------------------------
\thesistitle{L-Bone server v~Javě}
\thesissubtitle{Bakalářská práce}
\thesisstudent{Miroslav Novák}
\thesiswoman{false}
\thesislang{cs}
\thesisyear{jaro 2007}
\thesisfaculty{fi}
\thesisadvisor{Mgr. Lukáš Hejtmánek}
% --------------------------------------------
\label{id2244056}\usepackage{ifthen}
% --------------------------------------------
% Check for PDFLaTeX/LaTeX 
% --------------------------------------------
\newif\ifpdf
\ifx\pdfoutput\undefined
\pdffalse % we are not running PDF\LaTeX 
\else
\pdfoutput=1 % we are running PDF\LaTeX 
\pdftrue
\fi
% --------------------------------------------
% Load graphicx package with pdf if needed 
% --------------------------------------------
\ifpdf
\usepackage[pdftex]{graphicx}
\pdfcompresslevel=9
\else
\usepackage{graphicx}
\fi
\usepackage{anysize}
\marginsize{3cm}{2.5cm}{3.5cm}{3.5cm}

\makeatletter
% redefine the listoffigures and listoftables so that the name of the chapter
% is printed whenever there are figures or tables from that chapter. encourage
% pagebreak prior to the name of the chapter (discourage orphans).
\let\save@@chapter\@chapter
\let\save@@l@figure\l@figure
\let\the@l@figure@leader\relax
\def\@chapter[#1]#2{\save@@chapter[{#1}]{#2}%
\addtocontents{lof}{\protect\def\the@l@figure@leader{\protect\pagebreak[0]\protect\contentsline{chapter}{\protect\numberline{\thechapter}#1}{}{\thepage}}}%
\addtocontents{lot}{\protect\def\the@l@figure@leader{\protect\pagebreak[0]\protect\contentsline{chapter}{\protect\numberline{\thechapter}#1}{}{\thepage}}}%
}
\renewcommand*\l@figure{\the@l@figure@leader\let\the@l@figure@leader\relax\save@@l@figure}
\let\l@table\l@figure
\makeatother
\usepackage{fancyhdr}
\renewcommand{\headrulewidth}{0.4pt}
\renewcommand{\footrulewidth}{0.4pt}
% Safeguard against long headers.
\IfFileExists{truncate.sty}{
\usepackage{truncate}
% Use an ellipsis when text would be larger than x% of the text width.
% Preserve left/right text alignment using \hfill (works for English).
\fancyhead[ol]{\truncate{0.49\textwidth}{\sl\leftmark}}
\fancyhead[er]{\truncate{0.49\textwidth}{\hfill\sl\rightmark}}
\fancyhead[el]{\truncate{0.49\textwidth}{\sl\leftmark}}
\fancyhead[or]{\truncate{0.49\textwidth}{\hfill\sl\rightmark}}
}{\typeout{WARNING: truncate.sty wasn't available and functionality was skipped.}}
\pagestyle{fancy}
% ---------------------- 
% Most Common Packages   
% ---------------------- 
\usepackage{latexsym}         
\usepackage{enumerate}         
\usepackage{fancybox}      
\usepackage{float}       
\usepackage{ragged2e}       
\usepackage{fancyvrb}         
\makeatletter\@namedef{FV@fontfamily@default}{\def\FV@FontScanPrep{}\def\FV@FontFamily{}}\makeatother
\fvset{obeytabs=true,tabsize=3}
\makeatletter
\let\dblatex@center\center\let\dblatex@endcenter\endcenter
\def\dblatex@nolistI{\leftmargin\leftmargini\topsep\z@ \parsep\parskip \itemsep\z@}
\def\center{\let\@listi\dblatex@nolistI\@listi\dblatex@center\let\@listi\@listI\@listi}
\def\endcenter{\dblatex@endcenter}
\makeatother
\usepackage{rotating}         
\usepackage{subfigure}         
\usepackage{tabularx}         
\usepackage{url}         
% --------------------------------------------
% Load hyperref package with pdf if needed 
% --------------------------------------------
\ifpdf
\usepackage[pdftex,bookmarksnumbered,colorlinks,backref,bookmarks,breaklinks,linktocpage,plainpages=false, pdfstartview=FitH, plainpages=false, pdfpagelabels, unicode]{hyperref}
\else
\usepackage[bookmarksnumbered,colorlinks,backref,bookmarks,breaklinks,linktocpage,plainpages=false, plainpages=false, pdfpagelabels]{hyperref}
\fi
% --------------------------------------------
% ----------------------------------------------
% Define a new LaTeX environment (adminipage)
% ----------------------------------------------
\newenvironment{admminipage}%
{ % this code corresponds to the \begin{adminipage} command
 \begin{Sbox}%
 \begin{minipage}%
} %done
{ % this code corresponds to the \end{adminipage} command
 \end{minipage}
 \end{Sbox}
 \fbox{\TheSbox}
} %done
% ----------------------------------------------
% Define a new LaTeX length (admlength)
% ----------------------------------------------
\newlength{\admlength}
% ----------------------------------------------
% Define a new LaTeX environment (admonition)
% With 2 parameters:
% #1 The file (e.g. note.pdf)
% #2 The caption
% ----------------------------------------------
\newenvironment{admonition}[2] 
{ % this code corresponds to the \begin{admonition} command
 \hspace{0mm}\newline\hspace*\fill\newline
 \noindent
 \setlength{\fboxsep}{5pt}
 \setlength{\admlength}{\linewidth}
 \addtolength{\admlength}{-10\fboxsep}
 \addtolength{\admlength}{-10\fboxrule}
 \admminipage{\admlength}
 {\bfseries \sc\large{#2}} \newline
 \\[1mm]
 \sffamily
 \includegraphics[width=1cm]{#1}
 \addtolength{\admlength}{-1cm}
 \addtolength{\admlength}{-20pt}
 \begin{minipage}[lt]{\admlength}
 \parskip=0.5\baselineskip \advance\parskip by 0pt plus 2pt
} %done
{ % this code corresponds to the \end{admonition} command
 \vspace{5mm} 
 \end{minipage}
 \endadmminipage
 \vspace{.5em}
 \par
}
% --------------------------------------------
% Commands to manage/style/create floats      
% figures, tables, algorithms, examples, eqn  
% --------------------------------------------
 \floatstyle{plain}
 \restylefloat{figure}
 \floatstyle{plain}
 \restylefloat{table}
 \floatstyle{plain}
 \newfloat{program}{ht}{lop}[section]
 \floatstyle{plain}
 \newfloat{example}{ht}{loe}[section]
 \floatname{example}{Příklad}
 \floatstyle{plain}
 \newfloat{dbequation}{ht}{loe}[section]
 \floatname{dbequation}{Rovnice}
 \floatstyle{boxed}
 \newfloat{algorithm}{ht}{loa}[section]
 \floatname{algorithm}{Algorithm}
\ifpdf
\DeclareGraphicsExtensions{.pdf,.png,.jpg}
\else
\DeclareGraphicsExtensions{.eps}
\fi
% --------------------------------------------
% $latex.caption.swapskip enabled for $formal.title.placement support
\newlength{\docbooktolatextempskip}
\newcommand{\captionswapskip}{\setlength{\docbooktolatextempskip}{\abovecaptionskip}\setlength{\abovecaptionskip}{\belowcaptionskip}\setlength{\belowcaptionskip}{\docbooktolatextempskip}}
\usepackage[czech]{babel} 
% Guard against a problem with old package versions.
\makeatletter
\AtBeginDocument{
\DeclareRobustCommand\ref{\@refstar}
\DeclareRobustCommand\pageref{\@pagerefstar}
}
\makeatother
% --------------------------------------------
\makeatletter
\newcommand{\dbz}{\penalty \z@}
\newcommand{\docbooktolatexpipe}{\ensuremath{|}\dbz}
\newskip\docbooktolatexoldparskip
\newcommand{\docbooktolatexnoparskip}{\docbooktolatexoldparskip=\parskip\parskip=0pt plus 1pt}
\newcommand{\docbooktolatexrestoreparskip}{\parskip=\docbooktolatexoldparskip}
\def\cleardoublepage{\clearpage\if@twoside \ifodd\c@page\else\hbox{}\thispagestyle{empty}\newpage\if@twocolumn\hbox{}\newpage\fi\fi\fi}
\usepackage[latin2]{inputenc}
\usepackage[T1]{fontenc}

\ifx\dblatex@chaptersmark\@undefined\def\dblatex@chaptersmark#1{\markboth{\MakeUppercase{#1}}{}}\fi
\let\save@makeschapterhead\@makeschapterhead
\def\dblatex@makeschapterhead#1{\vspace*{-80pt}\save@makeschapterhead{#1}}
\def\@makeschapterhead#1{\dblatex@makeschapterhead{#1}\dblatex@chaptersmark{#1}}

\AtBeginDocument{\ifx\refname\@undefined\let\docbooktolatexbibname\bibname\def\docbooktolatexbibnamex{\bibname}\else\let\docbooktolatexbibname\refname\def\docbooktolatexbibnamex{\refname}\fi}
% Facilitate use of \cite with \label
\newcommand{\docbooktolatexbibaux}[2]{%
  \protected@write\@auxout{}{\string\global\string\@namedef{docbooktolatexcite@#1}{#2}}
}
% Provide support for bibliography `subsection' environments with titles
\newenvironment{docbooktolatexbibliography}[3]{
   \begingroup
   \let\save@@chapter\chapter
   \let\save@@section\section
   \let\save@@@mkboth\@mkboth
   \let\save@@bibname\bibname
   \let\save@@refname\refname
   \let\@mkboth\@gobbletwo
   \def\@tempa{#3}
   \def\@tempb{}
   \ifx\@tempa\@tempb
      \let\chapter\@gobbletwo
      \let\section\@gobbletwo
      \let\bibname\relax
   \else
      \let\chapter#2
      \let\section#2
      \let\bibname\@tempa
   \fi
   \let\refname\bibname
   \begin{thebibliography}{#1}
}{
   \end{thebibliography}
   \let\chapter\save@@chapter
   \let\section\save@@section
   \let\@mkboth\save@@@mkboth
   \let\bibname\save@@bibname
   \let\refname\save@@refname
   \endgroup
}

%\usepackage{cite}
%\renewcommand\citeleft{(}  % parentheses around list
%\renewcommand\citeright{)} % parentheses around list
\newcommand{\docbooktolatexcite}[2]{%
  \@ifundefined{docbooktolatexcite@#1}%
  {\cite{#1}}%
  {\def\@docbooktolatextemp{#2}\ifx\@docbooktolatextemp\@empty%
   \cite{\@nameuse{docbooktolatexcite@#1}}%
   \else\cite[#2]{\@nameuse{docbooktolatexcite@#1}}%
   \fi%
  }%
}
\newcommand{\docbooktolatexbackcite}[1]{%
  \ifx\Hy@backout\@undefined\else%
    \@ifundefined{docbooktolatexcite@#1}{%
      % emit warning?
    }{%
      \ifBR@verbose%
        \PackageInfo{backref}{back cite \string`#1\string' as \string`\@nameuse{docbooktolatexcite@#1}\string'}%
      \fi%
      \Hy@backout{\@nameuse{docbooktolatexcite@#1}}%
    }%
  \fi%
}

% --------------------------------------------
% A way to honour <footnoteref>s
% Blame j-devenish (at) users.sourceforge.net
% In any other LaTeX context, this would probably go into a style file.
\newcommand{\docbooktolatexusefootnoteref}[1]{\@ifundefined{@fn@label@#1}%
  {\hbox{\@textsuperscript{\normalfont ?}}%
    \@latex@warning{Footnote label `#1' was not defined}}%
  {\@nameuse{@fn@label@#1}}}
\newcommand{\docbooktolatexmakefootnoteref}[1]{%
  \protected@write\@auxout{}%
    {\global\string\@namedef{@fn@label@#1}{\@makefnmark}}%
  \@namedef{@fn@label@#1}{\hbox{\@textsuperscript{\normalfont ?}}}%
  }

\makeindex
% index labeling helper
\newif\ifdocbooktolatexprintindex\docbooktolatexprintindextrue
\let\dbtolatex@@theindex\theindex
\let\dbtolatex@@endtheindex\endtheindex
\@ifundefined{@openrighttrue}{\newif\if@openright}{}
\def\theindex{\relax}
\def\endtheindex{\relax}
\newenvironment{dbtolatexindex}[2]
   {
\if@openright\cleardoublepage\else\clearpage\fi
\let\dbtolatex@@indexname\indexname
\def\dbtolatex@current@indexname{#2}
\ifx\dbtolatex@current@indexname\@empty                                                                                             \def\dbtolatex@current@indexname{\dbtolatex@@indexname}
\fi
\def\dbtolatex@indexlabel{%
 \ifnum \c@secnumdepth >\m@ne \ifx\c@chapter\undefined\refstepcounter{section}\else\refstepcounter{chapter}\fi\fi%
 \label{#1}\hypertarget{#1}{\dbtolatex@current@indexname}%
 \global\docbooktolatexprintindexfalse}
\def\indexname{\ifdocbooktolatexprintindex\dbtolatex@indexlabel\else\dbtolatex@current@indexname\fi}
\dbtolatex@@theindex
   }
   {
\dbtolatex@@endtheindex\let\indexname\dbtolatex@@indexname
   }

\newlength\saveparskip \newlength\saveparindent
\newlength\tempparskip \newlength\tempparindent

\def\docbooktolatexgobble{\expandafter\@gobble}
% Prevent multiple openings of the same aux file
% (happens when backref is used with multiple bibliography environments)
\ifx\AfterBeginDocument\undefined\let\AfterBeginDocument\AtBeginDocument\fi
\AfterBeginDocument{
   \let\latex@@starttoc\@starttoc
   \def\@starttoc#1{%
      \@ifundefined{docbooktolatex@aux#1}{%
         \global\@namedef{docbooktolatex@aux#1}{}%
         \latex@@starttoc{#1}%
      }{}
   }
}
% --------------------------------------------
% Hacks for honouring row/entry/@align
% (\hspace not effective when in paragraph mode)
% Naming convention for these macros is:
% 'docbooktolatex' 'align' {alignment-type} {position-within-entry}
% where r = right, l = left, c = centre
\newcommand{\docbooktolatex@align}[2]{\protect\ifvmode#1\else\ifx\LT@@tabarray\@undefined#2\else#1\fi\fi}
\newcommand{\docbooktolatexalignll}{\docbooktolatex@align{\raggedright}{}}
\newcommand{\docbooktolatexalignlr}{\docbooktolatex@align{}{\hspace*\fill}}
\newcommand{\docbooktolatexaligncl}{\docbooktolatex@align{\centering}{\hfill}}
\newcommand{\docbooktolatexaligncr}{\docbooktolatex@align{}{\hspace*\fill}}
\newcommand{\docbooktolatexalignrl}{\protect\ifvmode\raggedleft\else\hfill\fi}
\newcommand{\docbooktolatexalignrr}{}
\ifx\captionswapskip\@undefined\newcommand{\captionswapskip}{}\fi
\makeatother
\title{\bfseries L-Bone server v~Javě\\[12pt]\normalsize Bakalářská práce}
\author{Miroslav Novák}
% --------------------------------------------
\makeglossary
% --------------------------------------------

\setcounter{tocdepth}{4}

\setcounter{secnumdepth}{4}
\addto\captionsczech{\def\indexname{Rejst\v{r}\'{\i}k}}
\addto\captionsczech{\def\appendixname{P\v{r}\'{i}loha}}
\addto\captionsczech{\def\refname{Literatura}}
\begin{document}
% --------------------------------------------
% Useing fithesis
% --------------------------------------------
\FrontMatter
\ThesisTitlePage
\begin{ThesisDeclaration}
\DeclarationText
\AdvisorName
\end{ThesisDeclaration}

% --------------------------------------------
% Thanks 
% --------------------------------------------
\begin{ThesisThanks}

Rád bych poděkoval svému vedoucímu práce, Mgr. Lukáši Hejtmánkovi, za pravidelnou pomoc při řešení všech problémů, které se při psaní této práce vyskytly.
\end{ThesisThanks}

% --------------------------------------------
% Abstract 
% --------------------------------------------
\begin{ThesisAbstract}

Cílem práce bylo vytvořit L-Bone server v~jazyce Java, který by poskytoval základní informace o~datových úložištích\label{id2468643}\begingroup\catcode`\#=12\footnote{tzv. depozitorech}\endgroup\docbooktolatexmakefootnoteref{id2468643} rozprostřených v~různých lokalitách. Klient na jejich základě může k~depozitorům přistupovat a pracovat s~nimi. Jako úložiště metadat o~depozitorech je využita databáze MySQL. Server komunikuje s~databazí pomocí ovladače MySQL Connector/J verze 5.0.4. Informace od datových skladů se získává pomocí protokolu IBP verze 1.4, popř. 1.3.

Oproti starší verzi L-Bone serveru v~jazyce C, byl nově implentovaný server rozšířen o~další metody pro práci s~certifikáty a digitálními podpisy. Pomocí nich se může klient serveru autentizovat a získat od něho ověření, které mu umožní s~depozitory pracovat. Celý server pak reprezentuje vrstvu L-Bone v~síťovém datovém modelu tzv. Network Storage Stack, kde tvoří součást rozhraní mezi vrstvami IBP(Internet Backplane Protocol) a LoRS(Logistical Runtime System).
\end{ThesisAbstract}

% --------------------------------------------
% KeyWords 
% --------------------------------------------
\begin{ThesisKeyWords}
JDBC, L-Bone, Certificate, IBP, Logistical Networking\end{ThesisKeyWords}

\makeatletter
\def\dbtolatex@contentsid{id2422905}
\def\dbtolatex@@contentsname{\latex@@contentsname}
\let\latex@@contentsname\contentsname
\newif\ifdocbooktolatexcontentsname\docbooktolatexcontentsnametrue
\def\dbtolatex@contentslabel{%
 \label{\dbtolatex@contentsid}\hypertarget{\dbtolatex@contentsid}{\dbtolatex@@contentsname}%
 \global\docbooktolatexcontentsnamefalse}
\def\contentsname{\ifdocbooktolatexcontentsname\dbtolatex@contentslabel\else\dbtolatex@@contentsname\fi}
\let\save@@@mkboth\@mkboth
\let\@mkboth\@gobbletwo
\tableofcontents
\let\@mkboth\save@@@mkboth
\let\contentsname\latex@@contentsname
\Hy@writebookmark{}{\dbtolatex@@contentsname}{\dbtolatex@contentsid}{0}{toc}%
\makeatother
				\MainMatter

% -------------------------------------------------------------
% Chapter Úvod 
% ------------------------------------------------------------- 	
\chapter{Úvod}
\label{ch01}\hypertarget{ch01}{}%

Internet v~posledních dvaceti letech zaznamenal mohutný vývoj. Síť tvořená obrovským množstvím počítačů se stala oblíbenou především díky různým nabízeným službám. Jednou z~nich je možnost stahování souborů. K~tomuto účelu se dnes hojně používají síťové protokoly HTTP a FTP. Jedná se o~protokoly typu klient server, kde klient posílá své požadavky na data serveru. Přestože jsou velmi rozšířené, mají své neduhy. Například při případném výpadku FTP serveru se data stanou nedostupnými.

To vedlo ke vzniku distribuovaných datových úložišť. Data jsou uložena v~tzv. depozitorech, které se mohou nacházet různě po světě a běžet na různých platformách. Dohromady poskytují na venek jednotný diskový prostor pro ukládání dat. Platí, že více depozitorů může obsahovat stejná data. Tím je zajištěna nejen vyšší úroveň dostupnosti dat, ale i možnost větší přenosové rychlosti při jejich čtení.

Lidé z~laboratoře LoCI \docbooktolatexcite{IBP5}{} na univerzitě Tennessee Knoxwille v~USA navrhli síťový model pro ukládaní dat tzv. Network Storage Stack. Ten má podobnou vrstevnatou strukturu jako OSI\label{fn010101}\begingroup\catcode`\#=12\footnote{
zkratka z~angl. Open System Interconnection
}\endgroup\docbooktolatexmakefootnoteref{fn010101} model v~síťové komunikaci. Jeho součástí je datový distribuovaný protokol IBP\label{fn010102}\begingroup\catcode`\#=12\footnote{
zkratka z~angl. Internet Backbone Protocol
}\endgroup\docbooktolatexmakefootnoteref{fn010102}\docbooktolatexcite{IBP1, IBP2, IBP3, IBP4, IBP5}{}, který poskytuje jednotné rozhraní pro práci s~datovým úložištěm bez ohledu na jeho architekturu. Nad IBP se nachází další vrstva L-Bone\label{fn010103}\begingroup\catcode`\#=12\footnote{
zkratka z~angl. Logistical Backbone
}\endgroup\docbooktolatexmakefootnoteref{fn010103}\docbooktolatexcite{IBP3, BC1}{}, která shromažďuje informace o~jednotlivých depozitorech právě pomocí IBP protokolu. Ty jsou jednotlivým klientům poskytovány na základě jejich požadavku. Server L-Bone, který je tématem této práce, poskytuje služby této vrstvy.

První verze L-Bone serveru byla napsána v~jazyce C a poskytovala pouze některé základní operace. Později, při požadavcích na rozšíření služeb serveru, bylo přistoupeno k~implementaci v~Javě a to především z~toho důvodu, že Java má jednodušší rozhraní pro komunikaci s~databázemi a správu certifikátů. Podrobně rozeberu vlastnosti L-Bone serveru ve čtrté kapitole.

% -------------------------------------------------------------
% Chapter Network storage stack 
% ------------------------------------------------------------- 	
\chapter{Network storage stack}
\label{02}\hypertarget{02}{}%

Model Network storage stack, vytvořený pro ukládání dat na síti, se skládá z~několika na sobě položených vrstvev(tab. 2.1). Podobně jako OSI model síťové komunikace poskytuje nižší vrstva svoje služby vrstvě nad ní. Fyzická a lokální přístupová vrstva je pevně daná architekturou datového úložiště. Proto se o~ní nebudu zmiňovat a podrobněji rozeberu vrstvy vyšší.

% table ------------------------------------------------------
\begin{table}[htb]
\begin{center}%
\hypertarget{id2423304}{}%
\begin{tabular}{|c|}
\hline 
{{Aplikace}} \tabularnewline
 \hline 
{{LoRS}} \tabularnewline
 \hline 
{{L-Bone + ExNode}} \tabularnewline
 \hline 
{{IBP}} \tabularnewline
 \hline 
{{Lokální přístupová vrstva}} \tabularnewline
 \hline 
{{Fyzická vrstva}} \tabularnewline
\hline 
\end{tabular}
{{\caption{Schéma network storage stack}\label{id2423304}}}
\label{id2423304}
\end{center}
\end{table}

% ------------------------   
% Section 
\section{IBP}
\label{sec0201}\hypertarget{sec0201}{}%

Základním kamenem celého modelu je vrstva IBP. Její atomickou jednotkou je depozitor disponující úložným prostorem. IBP pak poskytuje rozhraní mezi tímto depozitorem a klientem. Například pokud klientská aplikace chce zapsat nějaká data, zašle požadavek na alokaci příslušného místa. Pokud depozitor tento požadavek schválí, je klientovi zaslána trojice schopností tzv. capabilities, které mu dovolují s~alokovaným prostorem manipulovat. Základní schopnosti jsou čtení, zápis a správa souboru. Pokud je datových úložišt víc, můžou být data rozdělena na části a poslána více depozitorům. Pak jsou klientovi vráceny schopnosti od každého z~nich. Při přístupu k~depozitoru klient vidí pouze to, co sám uložil a k~čemu vlastní potřebné schopnosti. Ty může také získat od jiného uživatele nebo si je ztáhnout z~internetu. Jestliže klient posílá požadavek na alokaci místa, pak může specifikovat některé jeho další vlastnosti:

\begin{itemize}
%--- Item
\item 
Trvalá alokace -- data budou uložena trvale

%--- Item
\item 
Časově omezená alokace -- data budou po uběhnutí časového limitu vymazána

%--- Item
\item 
Nestálá alokace -- data mohou být kdykoli vymazána

%--- Item
\item 
Stálá alokace -- data jsou vymazána buď po depozitorem stanovenou dobou nebo pokud už nikdo nevlastní schopnost čtení alokovaného místa

%--- Item
\item 
Typ přístupu k~alokované paměti -- data jsou reprezentována jako pole, roura, cyklická fronta nebo buffer

\end{itemize}
\noindent 
Protokol IBP poskytuje základní možnost správy přiděleného prostoru. Klient ho může zvětšit nebo změnit čas, po který data zůstanou uložena. Ovšem využití služeb IBP přímo v~aplikacích je příliš pracné. Proto jsou k~dispozici vyšší vrstvy, které práci s~depozitory zjednodušší.

% ------------------------   
% Section 
\section{Vrstva L-Bone a ExNode}
\label{sec0202}\hypertarget{sec0202}{}%
\subsection{L-Bone}
\label{sec020201}\hypertarget{sec020201}{}%

L-Bone vrstva má přehled o~všech depozitorech na síti. Jejím hlavním úkolem je vybrat datová úložiště na základě klientova požadavku. Za tímto účelem si drží záznamy o~každém z~nich a průběžně je aktualizuje. Pokud vznikne nový depozitor, pak musí být u~L-Bone serveru zaregistrován. Informace, které si L-Bone server pamatuje o~depozitoru, jsou např. doménové jméno, port, stav úložného místa , poloha atd.
\subsection{ExNode}
\label{sec020202}\hypertarget{sec020202}{}%

Dnes prakticky žádná aplikace neukládá data na pevný disk přímo pomocí adresace sektorů. Místo toho využívá služeb souborového systému, který tvoří rozhraní mezi programem a pevným diskem. V~UNIXu jsou jednotlivé bloky na disku odkazovány pomocí I-uzlů (angl. I-nodes). Právě od tohoto návrhu je odvozená i vrstva ExNode, která jako ukazatele na alokované bloky používá exUzly (angl. exNodes)\docbooktolatexcite{IBP3, IBP4, IBP5, BC1}{}. Tím logicky odděluje klientskou aplikaci od fyzické architektury depozitotů. ExUzly nemusí mít stejnou velikost. Soubor, který klient chce uložit, může být rozsekán na více částí a poslán několika datovým skladům. Dále každá část může mít více kopií. Vrácené schopnosti slouží k~vytvoření exUzlů, které jsou předány klientovi jako jeden soubor ve formátu XML. Pokud klientská aplikace chce svoje data znovu načíst, pak pošle tento soubor vrstvě ExNode. Ta vytáhne zpět jednotlivé části od depozitorů, sestaví je a předá aplikaci. Alokované bloky mohou obsahovat kontrolní součty\label{fn02020201}\begingroup\catcode`\#=12\footnote{
např. MD5, CRC
}\endgroup\docbooktolatexmakefootnoteref{fn02020201} a být zašifrovány pomocí kryptografických algoritmů\label{fn020202}\begingroup\catcode`\#=12\footnote{
symetrické šifry AES, DES
}\endgroup\docbooktolatexmakefootnoteref{fn020202}.

V~konečném shrnutí poskytuje tato vrstva možnost ukládání velkých souborů, zajištění větší spolehlivosti, snadnou podporu u~aplikací a přenositelnost exUzlů mezi platfomami\label{fn02020201}\begingroup\catcode`\#=12\footnote{
Pomocí jazyka XML.
}\endgroup\docbooktolatexmakefootnoteref{fn02020201}.

% ------------------------   
% Section 
\section{LoRS}
\label{sec0203}\hypertarget{sec0203}{}%

Přestože vrstva L-Bone usnadní najít správné depozitory a vrstva ExNode bude spravovat IBP schopnosti vrácené od depozitorů, stále je pro uživatele náročné vše provádět manuálně. Vrstvu LoRS\label{fn020301}\begingroup\catcode`\#=12\footnote{
zkratka z~angl. Logistical Runtime System
}\endgroup\docbooktolatexmakefootnoteref{fn020301}\docbooktolatexcite{IBP3, IBP4, IBP5, BC1}{} tvoří řádkové příkazy a knihovny jazyka C pro snadnou manipulaci se soubory. Nabízí rozhraní pro zjištění lokace IBP depozitorů, pro čtení, zápis a přepsání uložených dat s~daným počtem kopií, paralelní stahování různých částí dat z~několika skladů a zapisování několika souběžně běžícími TCP proudy. Zároveň poskytuje příkazy a funkce pro práci s~exUzly. Tvůrce aplikace tedy nemusí už nic složitého programovat.

% ------------------------   
% Section 
\section{Aplikace}
\label{sec0204}\hypertarget{sec0204}{}%

Hlavní využití celé architektury je v~ukládání velkých objemů dat. Například pokud si uživatel přeje poslat velkou přílohu elektronické pošty, připojí k~ní pouze XML soubor obsahující mapu exUzlů a schopností. Příjemce si pak data stáhne z~nejbližšího datového úložiště. Další možností využití je při zpracování videa. Uživatel si může přímo přehrávat záznam uložený na IBP depozitorech, aniž by si jej musel stahovat. Dále mohou obsahovat celé distribuce operačních systémů, určené k~volnému stažení nebo jiná kapacitně náročná data.

% -------------------------------------------------------------
% Chapter Použité technologie 
% ------------------------------------------------------------- 	
\chapter{Použité technologie}
\label{ch04}\hypertarget{ch04}{}%

Nalezení správných technologií pro implementaci nebylo těžké. Pokud nebyly přímo uvedeny v~zadání, pak se daly jednoduše odvodit. Z~důvodu volby Javy jako programovacího jazyka a databáze MySQL jako datového úložistě, musely být využity služby ovladače MySQL Connector/J. Ten se postará o~správnou komunikaci serveru s~databází. Dále byl potřeba balík rozhraních a tříd implementující základní operace pro práci s~certifikáty a digitálními podpisy. Pro tento účel byla zvolena kryptografická knihovna od firmy The Legion of the Bouncy Castle. V~následujících podkapitolách podrobněji popíšu jednotlivé technologie.

% ------------------------   
% Section 
\section{MySQL}
\label{sec0201}\hypertarget{sec0201}{}%

MySQL\label{fn04020101}\begingroup\catcode`\#=12\footnote{
http://www.mysql.com
}\endgroup\docbooktolatexmakefootnoteref{fn04020101}\docbooktolatexcite{mysql}{} je databázový systém jehož hlavními autory jsou Michael \glqq Monty\textquotedblleft{} Widenius a David Axmark. Jedná se o~široce používanou aplikaci, především díky jejím dobrým vlastnostem. Je rychlá, spolehlivá a jednoduše použitelná. Pro nekomerční účely je šířena pod bezplatnou licencí GPL\label{fn04020102}\begingroup\catcode`\#=12\footnote{
zkratka z~angl. General Public License
}\endgroup\docbooktolatexmakefootnoteref{fn04020102}. Je dostupná pro mnoho různých platforem, např. Linux, Windows, OS/X, HP-UX, AIX atd.

Samotný databázový stroj obvykle obsahuje několik databází. V~nich jsou uložené tabulky do kterých se zapisují záznamy (řádky). Každý záznam v~tabulce má předem danou pevnou strukturu, která je dána schématem tabulky.

SQL\label{fn010102}\begingroup\catcode`\#=12\footnote{
zkratka z~angl. Structured Query Language
}\endgroup\docbooktolatexmakefootnoteref{fn010102} je jazyk navržený pro komunikaci s~databázemi. Pomocí něho můžeme vytvářet tabulky, upravovat je a získávat z~nich potřebné informace. MySQL se řídí podle normy {\texttt{{SQL:2003}}}, přičemž ji rozšiřuje o~některé vlastní příkazy. Proto nelze SQL příkazy, které využívá databáze MySQL, snadno použít na jiném databázovém stroji. L-Bone server spolehlivě pracuje s~databází MySQL verze 5 a vyšší.

% ------------------------   
% Section 
\section{Jazyk Java}
\label{sec0202}\hypertarget{sec0202}{}%

Pro implementaci L-Bone serveru byl vybrán jazyk Java\docbooktolatexcite{java}{}. Jedná se o~objektově orientovaný jazyk vyvíjený od počátku 90. let firmou Sun Microsystem. Aplikace napsané v~Javě jsou kompilovány do bajtového kódu, který je nezávislý na architektuře počítače. To umožňuje snadnou přenositelnost programů. Na daném zařízení musí být pouze nainstalován správný virtuální stroj, který interpretuje bajtový kód do strojového kódu. Nevýhoda tohoto postupu je, že programy napsané v~Javě mohou být při startu značně pomalejší, než kdyby byly napsané v~jazyce C nebo C++.

Naproti tomu jeho hlavní síla tkví v~syntaxtické jednoduchosti, robustnosti a bezpečnosti. Zbavil se těžko čitelných programových konstrukcí. Správu paměti automaticky řídí garbage collector\label{fn04020201}\begingroup\catcode`\#=12\footnote{
Pokud na daný objekt neexistují už žádné odkazy, odstraní ho z~paměti.
}\endgroup\docbooktolatexmakefootnoteref{fn04020201}. K~dispozici jsou také rozsáhlé knihovny, podle kterých se definují tři základní platformy Javy:

\begin{itemize}
%--- Item
\item 
Java ME (Micro Edititon) -- pro malé aplikace určené do mobilních zařízení (tzv. Embedded systems)

%--- Item
\item 
Java SE (Standard Edition) -- pro programy se zaměřením na stolní počítače a servery

%--- Item
\item 
Java EE (Enterprise Edition) -- pro rozsáhlé distribuované systémy

\end{itemize}
\noindent 
Platforma Java SE 6 obsahuje rozhraní a třídy implementující základní datové struktury, práci s~vlákny a síťovou komunikaci. Podporuje práci s~databázemi a částečně i autentizaci klientů za použití certifikátů. To jsou hlavní důvody, proč byla vybrána pro implementaci serveru.
\subsection{Vlákna v~Javě}
\label{010201}\hypertarget{010201}{}%

Java umožňuje paralelní běh dvou či více částí programu\docbooktolatexcite{thread}{}. Například aplikace může zároveň přijímat příkazy od uživatele a přitom ukládat data na disk. Paralelně spuštěné kódy jednoho programu se nazývají vlákna\label{fn010202}\begingroup\catcode`\#=12\footnote{
angl. threads
}\endgroup\docbooktolatexmakefootnoteref{fn010202}. Ta pracují na sobě nezávisle až do doby, než přistoupý ke sdíleným prostředkům. V~této fázi je třeba vlákna synchronizovat, aby byla zajištěna integrita dat. Úskalí tohoto postupu spočívá ve hrozbě vzniku tzv. \glqq deadlocku\textquotedblleft{}. To je stav, kdy každé vlákno čeká až jiné uvolní sdílený prostředek.
\subsection{JDBC}
\label{sec010202}\hypertarget{sec010202}{}%

Jedná se o~aplikační rozhraní Javy\docbooktolatexcite{jdbc}{}, které umí pracovat s~tabulkovými daty uloženými v~databázi nebo i v~souborech na disku. Logicky odstíní aplikaci od architektury datového úložiště. V~praxi programátor nemusí při portování svého programu na jinou databázi přepisovat celý zdrojový kód, ale stačí mu pouze vyměnit ovladač, který příkazy pro daný datový zdroj překládal\label{id2422309}\begingroup\catcode`\#=12\footnote{Zde je ještě dobré si dát pozor na odlišnosti jazyka SQL u~příslušného databázového stroje.}\endgroup\docbooktolatexmakefootnoteref{id2422309}. Tyto ovladače většinou poskytují samotní tvůrci datového úložiště a jsou rozděleny do čtyř kategorií:

\begin{itemize}
%--- Item
\item 
JDBC-ODBC most poskytuje rozhraní JDBC\label{fn010203}\begingroup\catcode`\#=12\footnote{
zkratka z~angl. Java Database Connectivity
}\endgroup\docbooktolatexmakefootnoteref{fn010203} přístup k~databázi přes jeden nebo více ODBC\label{fn010203}\begingroup\catcode`\#=12\footnote{
zkratka z~angl. Open Database Connectivity
}\endgroup\docbooktolatexmakefootnoteref{fn010203} ovladačů.

%--- Item
\item 
Native-API je druh ovladače, který přeloží JDBC příkazy do volání klientského rozhraní dané databáze.

%--- Item
\item 
JDBC-Net ovladač napsaný v~Javě přeloží příkazy do databázově nezávislého síťového protokolu a spojí se serverovou mezivrstvou. Ta jej přeloží do podoby, které již databáze rozumí. Tímto způsobem lze komunikovat s~mnoha typy databází najednou.

%--- Item
\item 
Native-protocol je ovladač plně napsaný v~Javě komunikující s~databází přímo pomocí vlastního protokolu.

\end{itemize}
\noindent 
Ve svém projektu používám ovladač typu Native-protocol,\label{fn010204}\begingroup\catcode`\#=12\footnote{
Více na http://java.sun.com/products/jdbc/driverdesc.html.
}\endgroup\docbooktolatexmakefootnoteref{fn010204} MySQL Connector/J verze 5.0.4. Jeho hlavním úkolem je vytvořit sdílené spojení s~databází MySQL, posílat SQL příkazy a přijímat odpovědi.
\subsection{Digitální podpisy a certifikáty}
\label{sec010203}\hypertarget{sec010203}{}%

Digitální podpis je postaven na principu asymetrické kryptografie. Ta využívá veřejného a privátního klíče k~zašifrování dat, přičemž veřejný klíč je volně k~dispozici pro každého a privátní je naše tajemství. Platí, že pomocí jednoho klíče můžeme rozšifrovat to, co zašifroval druhý a ze znalosti jednoho klíče z~daného páru lze velmi těžko zjistit podobu druhého.

Pokud chceme, aby druhá strana měla jistotu, že data, která jí posíláme, jsou skutečně od nás, musíme je podepsat naším privátním klíčem a poslat spolu s~nimi náš certifikát. V~něm je informace o~tom, kdo podpis vytvořil a náš veřejný klíč, kterým lze podpis dešifrovat. Tento certifikát musí být vydán a podepsán důvěryhodnou třetí stranou, tzv. certifikační autoritou. Příjemce si ověřením certifikátu certifikátem certifikační autority a dešifrováním podpisu potvrdí, že data jsou skutečně od nás.

Standard X.509 definuje, které informace má certifikát obsahovat:

\begin{itemize}
%--- Item
\item 
Verze -- Standard X.509 tohoto certifikátu. Říká, které informace v~něm mohou být obsaženy.

%--- Item
\item 
Sériové číslo -- Unikátní číslo, které jednoznačně rozlišuje certifikáty vydané jednou certifikační autoritou.

%--- Item
\item 
Identifikátor podepisovacího algoritmu -- Algoritmus, který byl použit cert. autoritou k~podpisu certifikátu.

%--- Item
\item 
Délka platnosti -- Časový úsek ve kterém lze certifikát použít.

%--- Item
\item 
Jméno cert. autority -- Název entity, která vydala certifikát.

%--- Item
\item 
Jméno subjektu -- Název entity jehož veřejný klíč certifikát obsahuje.

\end{itemize}
\noindent 
K~vytvoření certifikátu je nutné vlastnit veřejný a soukromý klíč. Certifikační autoritě pošleme veřejný klíč spolu s~požadavkem na vystavení certifikátu\label{fn010204}\begingroup\catcode`\#=12\footnote{
tzv. certificate signing request
}\endgroup\docbooktolatexmakefootnoteref{fn010204}. Ta po ověření naší totožnosti vytvoří nový ceritfikát, podepíše svým soukromým klíčem a pošle zpět.

Druhá strana může od nás dostat certifikát obsahující tzv. certifikační řetězec. Ten tvoří seznam certifikátů, kde jeden certifikát potvrzuje svým podpisem další. Na jeho konci se nachází kořenový certifikát, který je podepsán samotnou certifikační autoritou. Při ověřování důvěryhodnosti takto přijatého certifikátu se postupně prochází tento řetězec a zjišťuje se, zda nějaký certifikát není pro nás důvěryhodný. Pokud ano, víme že i předchozí jsou důvěryhodné a tedy certifikát nebyl podvržen a klient autentizován. Jestliže nevěříme ani kořenovému certifikátu, pak by měl být certifikát zahozen a klient odmítnut. Kořenový certifikát verifikujeme pomocí certifikátu cert. autority.
\subsection{Bouncy Castle}
\label{sec010204}\hypertarget{sec010204}{}%

I~přesto, že Java obsahuje základní třídy a rozhraní pro bezpečnostní služby, nechává prostor pro rozšíření na dalších poskytovatelích. Ti mohou implementovat nové kryptografické algoritmy, generátory náhodných čísel, podporu certifikátů a mnohé další. Jedním z~poskytovatelů je právě Bouncy Castle\docbooktolatexcite{bouncy}{}, který nabízí balík těchto služeb zdarma volně k~použití. L-Bone server využívá poslední vydanou verzi Bouncy Castle 1.36 určenou pro platformu Java SE 6.

% -------------------------------------------------------------
% Chapter Analýza L-Bone serveru 
% ------------------------------------------------------------- 	
\chapter{Analýza L-Bone serveru}
\label{ch03}\hypertarget{ch03}{}%

L-Bone vrstva poskytuje klientovi\label{fn030101}\begingroup\catcode`\#=12\footnote{
Nyní rozumějme pod pojmen klient aplikaci využívající aplikační rozhraní LoRS.
}\endgroup\docbooktolatexmakefootnoteref{fn030101} informace o~stavu jednotlivých úložišť. Základní požadavek, který musí podporovat, je vybrat množinu depozitorů na základě klientova dotazu. Původní implementace L-Bone serveru v~jazyce C, která mi byla k~dispozici, poskytovala právě jen tuto službu. K~ukládání metadat o~depozitorech využívala databázi MySQL, kterou periodicky aktualizovala. Pro každý nový požadavek od klienta bylo vytvořeno nové vlákno, které načetlo parametry, provedlo dotaz na IBP sklady nad databázovým strojem a vrácený seznam depozitorů poslalo zpět klientovi. Nutno dodat, že knihovny jazyka C pro práci s~databází nejsou zrovna pro programátora pohodlné.

Při startu server načítá svoje nastavení z~externího konfiguračního souboru. V~něm jsou především informace o~přístupu k~databázi jako např. doménové jméno databázového serveru, název databáze s~metadaty o~depozitorech, přihlašovací uživatelské jméno, heslo a atd.

Server implementovaný v~jazyce Java by měl splňovat minimálně funkčnost předchozí verze. Měl by být napsaný tak, aby ho šlo později snadno rozšířit o~další typy požadavků. Nově je vyžadována podpora autentizace klienta na základě jeho certifikátu. Pomocí něho májí být klientovi, kromě seznamu depozitorů, vráceny i jejich podpisy, které pak slouží jako vstupenka pro přístup k~depozitoru. Může se stát, že klient už zná jména depozitorů na které chce ukládat. Aby k~nim mohl přistoupit, musí si vyžádat podpisy od L-Bone serveru. Ten by měl být schopen ověřit oprávněnost tohoto požadavku a jednotlivé podpisy vygenerovat. K~dispozici mi je třída IdentityManager od Mgr. Lukáše Hejtmánka, která poskytuje základní operace pro práci s~certifikáty.

Pokud datové úložiště není při dotazování IBP protokolem dostupné, měl by jej server přeskočit a pokračovat dalším depozitorem na seznamu. Záznam o~úložišti v~databázi musí být aktualizován celý nebo nechán v~původním stavu. Nesmí dojít pouze k~změně některých atributů. MySQL databáze by se měla nacházet na stejném počítači jako L-Bone server, protože zpoždění, které je způsobeno přenosem informací po síti, má zásadní vliv na rychlost vyřizování klientova požadavku. Také odpadá hrozba odposlechu tohoto spojení.

Pokud server bude vyřizovat více požadavků najednou, může se stát, že o~spojení s~databází požádá současně více vláken. Proto bude nutné část kódu, která toto spojení vytváří, synchronizovat. Nebude tak docházet k~nedeterministickému chování programu. Jako další optimalizace komunikace s~databází může být schopnost jednotlivá spojení po uzavření recyklovat a znovu použít k~vyřízení dalšího dotazu pro jiného klienta.

Na depozitorech z~důvodu zachování kompatibility se staršími programy mohou běžet dvě různé verze IBP protokolu. Nejnovější verze\label{fn030102}\begingroup\catcode`\#=12\footnote{
V~kapitole \glqq Popis implementace\textquotedblleft{} ji označuji jako primární. Starší verze jako sekundární.
}\endgroup\docbooktolatexmakefootnoteref{fn030102} 1.4 má totiž od předešlých jiné formátování vstupu a výstupu. Proto je nutné zjistit, který IBP protokol depozitor používá a podle toho se přizpůsobit. V~páté kapitole je podrobně rozebrán způsob implementace těchto vlastností.

% -------------------------------------------------------------
% Chapter Popis implementace 
% ------------------------------------------------------------- 	
\chapter{Popis implementace}
\label{ch04}\hypertarget{ch04}{}%

Z~analýzy L-Bone serveru vyplynulo, že bude třeba zvládnout dva základní úkoly. Musí (1) aktualizovat data o~depozitorech v~databázi a (2) vyřizovat požadavky od klientů. Implementovat vše do jednoho vlákna by bylo velmi obtížné a nakonec značně neefektivní, proto kostru L-Bone serveru troří dvě vlákna. Každé má na starosti právě jednu úlohu.

% ------------------------   
% Section 
\section{Běh programu}
\label{0402}\hypertarget{0402}{}%

Při startu serveru je zavolána metoda {\texttt{{main}}} ve třídě {\texttt{{Main}}}. Ta nejdříve načte nastavení serveru z~externího souboru a uloží do statických proměnných třídy {\texttt{{SystemCfg}}}. Z~ní jsou volně přístupné všem částem programu. Následuje otestování spojení s~databází a kontrola její struktury. Pokud vše proběhne v~pořádku, je spuštěno vlákno {\texttt{{LboneServer}}}, které se stará o~příchozí požadavky klientů. To běží až do ukončení serveru správcem a tvoří právě jedno z~oněch dvou zmíněných vláken. Hned po něm je v~cyklu, po předem stanovených časových intervalech, spouštěno vlákno {\texttt{{ConnectDepot}}}, které pomocí protokolu IBP aktualizuje záznamy o~depozitorech v~databázi. To, narozdíl od vlákna {\texttt{{LboneServer}}}, neběží stále, ale skončí, jakmile se dotáže všech depozitorů. Tedy druhé vlákno tvoří samotná metoda {\texttt{{main}}}. Server lze ukončit z~příkazové řádky pomocí příkazu {\texttt{{kill}}} nebo klávesové zkratky {\texttt{{Ctrl-\dbz{}c}}}. V~následujích podkapitolách podrobně rozeberu jednotlivé části programu.

% ------------------------   
% Section 
\section{Databáze}
\label{0402}\hypertarget{0402}{}%

Aby server mohl podávat informace nashromážděné o~depozitorech na síti, musí si je někde uchovávat. Pro tento účel byla zvolena databáze MySQL verze 5.0. Do ní byly vloženy dvě tabulky {\texttt{{depots}}} a {\texttt{{depots\_\dbz{}info}}}. Ty obsahují základní údaje o~depozitorech.

% table ------------------------------------------------------
\begin{table}[htb]
\begin{center}%
\hypertarget{id2476759}{}%
\begin{tabular}{|c|c|}
\hline 
{{Název sloupce : typ}} & {{Popis}} \tabularnewline
 \hline 
{{hostname : varchar(256)}} & {{doménové jméno depozitoru}} \tabularnewline
 \hline 
{{port : integer}} & {{číslo portu}} \tabularnewline
 \hline 
{{id\_depot : integer}} & {{identifikační číslo depozitoru}} \tabularnewline
\hline 
\end{tabular}
{{\caption{Depots}\label{id2476759}}}
\label{id2476759}
\end{center}
\end{table}

% table ------------------------------------------------------
\begin{table}[htb]
\begin{center}%
\hypertarget{id2476808}{}%
\begin{tabular}{|c|c|}
\hline 
{{Název sloupce : typ}} & {{Popis}} \tabularnewline
 \hline 
{{id\_depot : integer}} & {{identifikační číslo depozitoru}} \tabularnewline
 \hline 
{{id\_group : integer}} & {{identifikační číslo skupiny dep.}} \tabularnewline
 \hline 
{{stable\_stor : integer}} & {{velikost paměti se stálými daty (MB)}} \tabularnewline
 \hline 
{{stable\_stor\_used : integer}} & {{využité místo(MB)}} \tabularnewline
 \hline 
{{vol\_stor : integer}} & {{velikost paměti s~dočasnými daty (MB)}} \tabularnewline
 \hline 
{{vol\_stor\_used : integer}} & {{využité místo (MB)}} \tabularnewline
 \hline 
{{duration : integer}} & {{čas po který data zůstanou uložena v~depozitoru}} \tabularnewline
 \hline 
{{total\_conf : integer}} & {{celková velikost paměti určená správcem depozitoru}} \tabularnewline
 \hline 
{{location : varchar(452)}} & geografická poloha depozitoru (název města){{}} \tabularnewline
 \hline 
{{lastpoll : integer}} & {{čas poslední aktualizace daného depozitoru}} \tabularnewline
\hline 
\end{tabular}
{{\caption{Depots\_info}\label{id2476808}}}
\label{id2476808}
\end{center}
\end{table}

Atribut {\texttt{{location}}} slouží k~vyhledání depozitoru geograficky blízkého klientovi. Takový depozitor je ve výsledku vrácen na prvním místě. Server nemá za úkol tabulky vytvářet nebo vkládat do nich záznamy o~nových depozitorech. Nekontroluje ani konzistenci databáze. To vše je spravováno jinak.
\subsection{Spojení s~databází}
\label{sec040201}\hypertarget{sec040201}{}%

L-Bone server komunikuje s~databází pomocí rozhraní JDBC. To poskytuje základní metody a datové struktury pro práci s~databázemi. Ovladač MySQL Connector/J zajišťuje propojení tohoto rozhraní s~databází MySQL. Pro získání spojení s~databází je třeba nejdříve vytvořit instanci třídy {\texttt{{MySQLConnectionPoolDataSource}}}, která implementuje rozhraní {\texttt{{ConnectionPoolDataSource}}} knihovny JDBC. Pokud tomuto nově vzniklému objektu sdělíme základní informace o~databázi, pak od něj můžeme obdržet spojení s~databází. To je reprezentováno instancí třídy {\texttt{{Connection}}}, která poslouží jako základ pro vytvoření dalších objektů\label{fn040201}\begingroup\catcode`\#=12\footnote{viz. další podkapitola \glqq Posílání SQL příkazů\textquotedblleft{}}\endgroup\docbooktolatexmakefootnoteref{fn040201}. Instance třídy {\texttt{{MySQLConnectionPoolDataSource}}} obsahuje zásobník, v~němž má připravevá spojení s~databází. Ty lze získat voláním metody {\texttt{{getConnection}}}. Jestliže je toto spojení později uzavřeno, pak se vrátí zpět do zásobníku. Standardně může být takto přiděleno až padesát spojení. Pokud jsou již vsechna přidělena, pak je požadavek na nové spojení odmítnut. Příjemnou vlastností třídy {\texttt{{MySQLConnectionPoolData Source}}} je, že její metody jsou synchronizované.

\begin{Verbatim}[fontsize=\small]
// vytvoření objektu datového
// zdroje reprezentujícího databázi MySQL
MysqlConnectionPoolDataSource dataSource 
	= new MysqlConnectionPoolDataSource();
// konfigurace
dataSource.setUser(username);
dataSource.setPassword(password);
dataSource.setServerName(database);
dataSource.setPort(port);
dataSource.setDatabaseName(databaseName);

// obdrží databázové spojení
Connection conn = dataSource.getConnection();
...
// spojení musí být uzavřeno, aby
// mohlo být recyklováno
conn.close();
\end{Verbatim}

Schopnost rychle přidělovat spojení s~databází je pro L-Bone server zcela zásadní. Má velký podíl na rychlosti odezvy klientovi. Pokud by pro každý požadavek klienta bylo vytvořeno nové spojení, byl by L-Bone server při větší zátěži velmi pomalý.
\subsection{Posílání SQL příkazů}
\label{040202}\hypertarget{040202}{}%

Nyní je spojení s~databází představováno instancí třídy {\texttt{{Connection}}}, která ovšem neobsahuje metody pro posílání SQL příkazů. K~tomu bude potřeba další objekt. Volání metody {\texttt{{createStatement}}} na instanci třídy {\texttt{{Connection}}}, vrátí objekt třídy {\texttt{{Statement}}}, která již obsahuje metody schopné předat SQL příkazy databázi. Pro L-Bone server jsou nejvýznamější metody {\texttt{{executeQuery}}} a {\texttt{{executeUpdate}}}. První z~nich má jako parametr řetězec obsahující SQL příkaz {\texttt{{select}}}. Výsledek vrácený tímto dotazem je uložen do objektu třídy {\texttt{{ResultSet}}}\label{fn04020201}\begingroup\catcode`\#=12\footnote{Více na http://java.sun.com/javase/6/docs/api/index.html.}\endgroup\docbooktolatexmakefootnoteref{fn04020201}. Ta obsahuje další metody pro procházení vrácených záznamů, pomocí nichž lze data vyčíst a uložit do vnitřních proměnných programu. Druhá metoda {\texttt{{executeUpdate}}} posílá SQL příkazy {\texttt{{insert}}}, {\texttt{{update}}} a {\texttt{{delete}}}. Její návratovou hodnotou je číslo udávající počet ovlivněných řádků v~databázi.

\begin{Verbatim}[fontsize=\small]
// metoda getConnection odštěpí jedno spojení
Connection conn = Database.getConnection();
// spojení je využito pro vytvoření třídy Statement
Statement stat = conn.createStatement();
// vratí jména a porty všech depozitorů
rs = stat.executeQuery("select hostname, port from depots");
// přejde na první řádek ve vráceném výsledku
rs.next();
// uloží obsah sloupce hostname na prvním řádku do proměnné host
String host = rs.getString("hostname");
\end{Verbatim}

nebo

\begin{Verbatim}[fontsize=\small]
// provede update tabulky depots_info ve sloupci stable_stor
stat.executeUpdate("update depots_info "
	+ "set stable_stor = ... where id_depot = ...");
...
// uzavření spojení
conn.close();
\end{Verbatim}

V~následujích podkapitolách se z~důvodu lepší čitelnosti textu budu zmiňovat jen o~důležitých třídách, metodách a proměnných. Pro podrobnější informace lze náhlédnout do dokumentace, která se nachází na přiloženém DVD.
\subsection{Test databáze}
\label{040202}\hypertarget{040202}{}%

Po načtení nastavení si server otestuje databázi. Kromě spojení s~databází ověří existenci tabulek {\texttt{{depots}}} a {\texttt{{depots\_\dbz{}info}}} a právo na základní operace {\texttt{{insert}}}, {\texttt{{update}}}, {\texttt{{delete}}} a {\texttt{{select}}}. Pokud nějaká část neproběhne úspěšně, je vyvolána vyjímka a celý server je ukončen s~chybovým hlášením.

Zda tabulky {\texttt{{depots}}} a {\texttt{{depots\_\dbz{}info}}} skutečně existují, zjistí server z~metadat databáze. Ty lze získat voláním metody {\texttt{{getMetaData}}} na objektu třídy {\texttt{{Connection}}}, které reprezentuje spojení s~databází. Vrácena je instance třídy {\texttt{{DatabaseMetaData}}} jejíž metoda {\texttt{{getTables}}} vygeneruje {\texttt{{ResultSet}}} obsahující názvy všech tabulek v~databázi. Pokud se v~něm jména našich tabulek vyskytují, přejde se k~ověření práv na základní operace. K~tomu je dočasně vložen do tabulky {\texttt{{depots\_\dbz{}info}}} a {\texttt{{depots}}} zkušební řádek, na nějž jsou postupně volány příkazy {\texttt{{update}}}, {\texttt{{select}}} a {\texttt{{delete}}}. Pokud nenastane žádná chyba, pak je databáze v~pořádku a může se přejít k~dalším částem programu.

% ------------------------   
% Section 
\section{Vlákno pro komunikaci s~depozitory}
\label{sec0405}\hypertarget{sec0405}{}%

Třída {\texttt{{ConnectDepot}}} implementuje vlákno\label{fn030501}\begingroup\catcode`\#=12\footnote{
Potomek třídy {\texttt{{Thread}}} implementující rozhraní {\texttt{{Runnable}}}.
}\endgroup\docbooktolatexmakefootnoteref{fn030501}, které aktualizuje informace o~depozitorech. K~tomu potřebuje jejich seznam z~databáze. Ten postupně prochází a ptá se jednotlivých depozitorů na stav úložiště. Přitom může použít dvě verze protokolu IBP. Platí, že pokud jeden protokol selže, vyvolá se vyjímka a je ošetřena zkouškou druhého protokolu. Když i on nevrátí požadovaný výsledek, vypíše se chybové hlášení a pokračuje se dalším depozitorem. IBP je textový komunikační protokol. Každý příkaz je ukončen znakem nového řádku. První je vždy otestován IBP protokol verze 1.4.

% table ------------------------------------------------------
\begin{table}[htb]
\begin{center}%
\hypertarget{id2477479}{}%
\begin{tabular}{|c|c|}
\hline 
{{version}} & {{verze protokolu}} \tabularnewline
 \hline 
{{command}} & {{typ příkazu}} \tabularnewline
 \hline 
{{resource\_id}} & {{id lokálního úložiště}} \tabularnewline
 \hline 
{{subcommand}} & {{typ podpříkazu}} \tabularnewline
 \hline 
{{password}} & {{heslo}} \tabularnewline
 \hline 
{{timeout}} & {{čas po který se má prokol zkoušet připojit}} \tabularnewline
\hline 
\end{tabular}
{{\caption{IBP protokol v. 1.4 - dotaz}\label{id2477479}}}
\label{id2477479}
\end{center}
\end{table}

% table ------------------------------------------------------
\begin{table}[htb]
\begin{center}%
\hypertarget{id2477538}{}%
\begin{tabular}{|c|c|}
\hline 
{{IBP\_errno}} & {{návratová hodnota}} \tabularnewline
 \hline 
{{input\_size}} & {{velikost druhého řádku (B)}} \tabularnewline
\hline 
\end{tabular}
{{\caption{IBP protokol v. 1.4 - odpověď (1. řádek)}\label{id2477538}}}
\label{id2477538}
\end{center}
\end{table}

% table ------------------------------------------------------
\begin{table}[htb]
\begin{center}%
\hypertarget{id2477570}{}%
\begin{tabular}{|c|c|}
\hline 
{{stable\_stor}} & {{velikost paměti se stálými daty (MB)}} \tabularnewline
 \hline 
{{stable\_stor\_used}} & {{využité místo (MB)}} \tabularnewline
 \hline 
{{vol\_stor}} & {{velikost paměti s~dočasnými daty (MB)}} \tabularnewline
 \hline 
{{vol\_stor\_used}} & {{využité místo (MB)}} \tabularnewline
 \hline 
{{duration}} & {{čas po který data zůstanou uložena v~depozitoru}} \tabularnewline
 \hline 
{{total\_conf}} & {{správcem deklarovaná paměť depozitoru}} \tabularnewline
\hline 
\end{tabular}
{{\caption{IBP protokol v. 1.4 - odpověď (2. řádek)}\label{id2477570}}}
\label{id2477570}
\end{center}
\end{table}

Výstup se skládá ze dvou řádků. První obsahuje návratovou hodnotu a v~oktetech udanou délku druhého řádku. Na něm už jsou uvedeny informace o~depozitoru. Druhý\label{id2477641}\begingroup\catcode`\#=12\footnote{verze 1.3 a níž}\endgroup\docbooktolatexmakefootnoteref{id2477641} protokol, kromě jinak formátovaného výstupu, je podobný. Výstup je jen na jednom řádku a neobsahuje položku {\texttt{{total\_\dbz{}conf}}}. Při dotazu se neposílá položka {\texttt{{resource\_\dbz{}id}}}.

Metoda {\texttt{{updateDepotsInfo}}} provádí aktualizaci příslušného záznamu depozitoru v~databázi. Využívá k~tomu metody {\texttt{{executeUpdate}}} třídy {\texttt{{Statement}}}. Příkaz update je poslán do databáze pro každý úspěšně dotázaný depozitor a aktualizuje pouze jeden řádek v~tabulce {\texttt{{depots\_\dbz{}info}}}. Všechny atributy daného záznamu jsou aktualizovány najednou jedním příkazem. Nemůže tak dojít ke vzniku nekonzistentního stavu\label{id2477711}\begingroup\catcode`\#=12\footnote{Na databázi se automaticky zavolá {\texttt{{commit}}} po každém příkazu {\texttt{{executeUpdate}}}.}\endgroup\docbooktolatexmakefootnoteref{id2477711} vlivem výpadku spojení s~databází.

% ------------------------   
% Section 
\section{Vlákno pro obsluhu klientů}
\label{sec0406}\hypertarget{sec0406}{}%

O~zprostředkování informací pro klienty se stará vlákno {\texttt{{LboneServer}}}. To ve smyčce čeká na příchozí spojení od klienta. Pokud nějaké přijde, vytvoří pro něj nové vlákno {\texttt{{Lbone ServerThread}}}, předá mu spojení s~klientem a spustí ho. Pro správu těchto vláken je vytvořen objekt třídy {\texttt{{ThreadPoolExecutor}}} implementující rozhraní {\texttt{{ExecutorService}}}. V~něm jsou vlákna vytvářena dle potřeby a po ukončení znovu recyklována. Maximální počet paralelně spuštěných vláken je implicitně nastaven na dvacet. Tuto hodnotu lze v~konfiguračnín souboru změnit pomocí parametru {\texttt{{clientCount}}}. Pokud přijde nové spojení a všechna vlákna už jsou rozebrána, je toto spojení odmítnuto.
\subsection{Běh vlákna {\texttt{{LboneServerThread}}} - typy požadavků}
\label{sec040601}\hypertarget{sec040601}{}%

Po nastartování vlákna {\texttt{{LboneServerThread}}} se na klientově spojení vytvoří vstupní a výstupní proud. Příchozí požadavek od klienta je načítán po oktetech. Prvních deset oktetů obsahuje číslo verze klienta. To prozatím nemá vliv na další zpracování. Z~dalších deseti oktetů se dozvíme typ příkazu. Podle něj se rozhodne, jakým způsobem bude dál načítán klientův požadavek. Základní příkaz je typ \glqq 1\textquotedblleft{}, který vrátí jména depozitorů s~požadovanými vlastnostmi\label{id2477854}\begingroup\catcode`\#=12\footnote{Tento požadavek byl implementován u~staršího L-Bone serveru.}\endgroup\docbooktolatexmakefootnoteref{id2477854}.

% table ------------------------------------------------------
\begin{table}[htb]
\begin{center}%
\hypertarget{id2477860}{}%
\begin{tabular}{|c|c|c|}
\hline 
{{Název parametru}} & {{Počet oktetů}} & {{Poznámka}} \tabularnewline
 \hline 
{{počet depozitorů}} & {{10}} & {{max. počet dep. vrácený ve výsledku}} \tabularnewline
 \hline 
{{minimum \glqq stable\textquotedblleft{} paměti}} & {{10}} & {{min. volné diskové paměti dep. (MB)}} \tabularnewline
 \hline 
{{minimum \glqq soft\textquotedblleft{}paměti}} & {{10}} & {{min. dočasné volné diskové paměti (MB)}} \tabularnewline
 \hline 
{{trvanlivost}} & {{10}} & {{min. čas uložení dat v~depozitoru}} \tabularnewline
 \hline 
{{lokace}} & {{452}} & {{geografická poloha klienta}} \tabularnewline
\hline 
\end{tabular}
{{\caption{Typ příkazu \glqq 1\textquotedblleft{} - vstupní parametry}\label{id2477860}}}
\label{id2477860}
\end{center}
\end{table}

O~načtení těchto položek se stará metoda {\texttt{{parseClientRequest\_\dbz{}1}}}. Ta provede základní kontrolu typu a rozsahu parametrů. Pokud klient vytvoří spojení, ale nic nepošle nebo pošle jenom část požadavku, je vlákno po uplynutí určité doby ukončeno. Nedodrží-li klient přesně danou strukturu požadavku nebo uvede nesmyslné údaje, je vyvolána vyjímka, která vede taktéž k~ukončení vlákna.

% table ------------------------------------------------------
\begin{table}[htb]
\begin{center}%
\hypertarget{id2477973}{}%
\begin{tabular}{|c|c|c|}
\hline 
{{Název parametru}} & {{Počet oktetů}} & {{Poznámka}} \tabularnewline
 \hline 
{{návratová hodnota}} & {{10}} & {{je \glqq 1\textquotedblleft{}, pokud je vše v~pořádku}} \tabularnewline
 \hline 
{{počet depozitorů}} & {{10}} & {{kolik depozitorů vyhovovalo požadavkům}} \tabularnewline
 \hline 
{{název depozitoru}} & {{256}} & doménové jméno dep.{{}} \tabularnewline
 \hline 
{{port}} & {{10}} & {{číslo portu na kterém je depozitor aktivní}} \tabularnewline
 \hline 
{{...}} & {{...}} & {{následuje název a port dalšího depozitoru}} \tabularnewline
\hline 
\end{tabular}
{{\caption{Typ příkazu \glqq 1\textquotedblleft{} - výstupní parametry}\label{id2477973}}}
\label{id2477973}
\end{center}
\end{table}

Metoda {\texttt{{createOutput\_\dbz{}1}}} je zodpovědná za sestavení odpovědi pro klienta. Z~databáze jsou vybrány záznamy vyhovující podmínkám klienta, přičemž depozitoři se stejnou lokací, jako má klient, jsou vráceny na prvních místech. Výstup je postupně ukládán do objektu třídy {\texttt{{StringBuilder}}}, která poskytuje aplikační rozhraní pro práci s~řetězci. Po vložení všech depozitorů je na začátek řetězce přidána návratová hodnota a počet depozitorů ve výsledku. Řetězec po převedení na oktety je klientovi poslán výstupním proudem. Pokud dojde k~vyvolání vyjímky, je odeslána návratová hodnota \glqq -1\textquotedblleft{} a vlákno je ukončeno.
\subsection{Třída {\texttt{{IdentityManager}}} - Autentizace pomocí certifikátů}
\label{040602}\hypertarget{040602}{}%

L-Bone server autentizuje klienta na základě jeho certifikátu. Pokud se tak nestane, je vyvolána vyjímka, která ukončí vlákno obsluhující klienta. Pro autentizaci klientů slouží třída {\texttt{{IdentityManager}}} od Mgr. Lukáše Hejtmánka. Obsahuje metody pro práci s~certifikáty, u~kterých ověřuje jejich validitu. Například zda byl certifikát podepsán důvěryhodnou třetí stranou a platí jeho časové razítko.
\subsection{Podpisy depozitorů - typy požadavků \glqq 100\textquotedblleft{} a \glqq 101\textquotedblleft{}}
\label{040603}\hypertarget{040603}{}%

Úplně nově byly u~L-Bone serveru implementovány metody pro autentizaci klientů. Pokud server načetl svůj certifikát spolu se svým soukromým klíčem a certifikáty certifikačních autorit, může vyřizovat další typy požadavků. Prvním z~nich je žádost s~identifikačním číslem příkazu \glqq 100\textquotedblleft{}. Jedná se o~rozšíření základního příkazu \glqq 1\textquotedblleft{}. Klient kromě standardních parametrů posílá na konci požadavku další dvě položky. První z~nich je velikost jeho certifikátu, druhá, samotný klientův certifikát. Odpověď obsahuje navíc podpis pro každý depozitor.

% table ------------------------------------------------------
\begin{table}[htb]
\begin{center}%
\hypertarget{id2478192}{}%
\begin{tabular}{|c|c|c|}
\hline 
{{Název parametru}} & {{Počet oktetů}} & {{Poznámka}} \tabularnewline
 \hline 
{{počet depozitorů}} & {{10}} & {{max. počet dep. vrácený ve výsledku}} \tabularnewline
 \hline 
{{minimum \glqq stable\textquotedblleft{} paměti}} & {{10}} & {{min. stálé volné paměti dep. (MB)}} \tabularnewline
 \hline 
{{minimum \glqq soft\textquotedblleft{}paměti}} & {{10}} & {{min. dočasné volné paměti (MB)}} \tabularnewline
 \hline 
{{trvanlivost}} & {{10}} & {{min. čas uložení dat v~depozitoru}} \tabularnewline
 \hline 
{{lokace}} & {{452}} & {{geografická poloha klienta}} \tabularnewline
 \hline 
{{délka certifikátu}} & {{10}} & {{velikost klientova certifikátu}} \tabularnewline
 \hline 
{{certifikát}} & {{délka certifikátu}} & {{certifikát od klienta}} \tabularnewline
\hline 
\end{tabular}
{{\caption{Typ příkazu \glqq 100\textquotedblleft{} - vstupní parametry}\label{id2478192}}}
\label{id2478192}
\end{center}
\end{table}

% table ------------------------------------------------------
\begin{table}[htb]
\begin{center}%
\hypertarget{id2478302}{}%
\begin{tabular}{|c|c|c|}
\hline 
{{Název parametru}} & {{Počet oktetů}} & {{Poznámka}} \tabularnewline
 \hline 
{{návratová hodnota}} & {{10}} & {{\glqq 1\textquotedblleft{} nebo \glqq -1\textquotedblleft{}, záleží na vyhodnocení požadavku}} \tabularnewline
 \hline 
{{počet depozitorů}} & {{10}} & {{kolik depozitorů vyhovovalo požadavkům}} \tabularnewline
 \hline 
{{název depozitoru}} & {{256}} & doménové jméno dep.{{}} \tabularnewline
 \hline 
{{port}} & {{10}} & {{číslo portu na kterém je depozitor aktivní}} \tabularnewline
 \hline 
{{délka podpisu}} & {{10}} & {{velikost podpisu}} \tabularnewline
 \hline 
{{podpis}} & {{délka podpisu}} & {{podpis k~danému depozitoru}} \tabularnewline
 \hline 
{{...}} & {{...}} & {{název, port, délka podpisu a podpis dalšího dep.}} \tabularnewline
\hline 
\end{tabular}
{{\caption{Typ příkazu \glqq 100\textquotedblleft{} - výstupní parametry}\label{id2478302}}}
\label{id2478302}
\end{center}
\end{table}

Jednotlivé parametry jsou načteny metodou {\texttt{{parseClientRequest\_\dbz{}100}}}, přičemž na vyčtení samotného certifikátu je zavolána metoda {\texttt{{readCertificate}}}. Ta ho po načtení společně se seznamem certifikačních autorit, kterým server důvěřuje, předá k~ověření jako parametr konstruktoru třídy {\texttt{{IdentityManager}}}.

Výstup pro klienta je vytvořen v~metodě {\texttt{{createOutput\_\dbz{}100}}} podobně jako u~základního příkazu. Odpověď obsahuje navíc za každou dvojicí parametrů jméno depozitoru a port, další dvě položky délka podpisu a podpis depozitoru. Podpis je zkonstruován voláním metody {\texttt{{createSign}}} z~řetězce skládajícího se z~názvu depozitoru, čísla jeho portu, aktuálního času a sériového čísla klientova certifikátu. Ten je podepsaný asymetrickým kryptografickým algoritmem RSA za použití privátního klíče serveru. Celý výstup je poslán výstupním proudem zpět klientovi a vlákno je ukončeno.

\begin{Verbatim}[fontsize=\small]
// základní příkazy metody createSign
// získání objektu třídy Cipher pro šifru rsa
Cipher RSACipher = Cipher.getInstance("RSA/ECB/NoPadding");
// inicializace šifry RSA
// servIdenMan je objekt třídy IdentityManager se serverovým cert., 
// privátním klíčem a ostatními CA certifikáty
RSACipher.init(Cipher.ENCRYPT_MODE, servIdenMan.getPrivateKey());
// základ podpisu			 
String sbs = host.trim() + ":" + port.trim() + " " 
+ Long.toString(System.currentTimeMillis()) + " " 
+ clientIdenMan.getSerial();;
// vytvoření podpisu
byte[]  subscribe = RSACipher.doFinal(sbs.getBytes());
// převedení pole oktetů na řetězec 
String subscribe = bin2hex(subscribe);
\end{Verbatim}

Důvod, proč je vytvořený podpis pomocí metody {\texttt{{bin2hex}}} převeden na řetězec je, aby neobsahoval speciální znaky pro zalamování řádků a dal se připojit k~vytvořenému výstupu pro klienta. Pokud dojde při načítání parametrů nebo vytváření výstupu k~vyvolání nějaké vyjímky, klientovi je poslána návratová hodnota \glqq -1\textquotedblleft{} a samotné vlákno je ukončeno.

Druhý příkaz, s~identifikačním číslem \glqq 101\textquotedblleft{}, vrací podpisy pro depozitory vyžádané klientem. O~načtení vstupních parametrů a vytvoření výstupu se stará metoda {\texttt{{createOutput\_\dbz{}101}}}. Nejprve je metodou {\texttt{{readCertificate}}} načten klientův certifikát a ověřen proti certifikátům certifikačních autorit třídou {\texttt{{IdentityManager}}}. Následují názvy a čísla portů depozitorů pro které se mají vytvořit podpisy. Každý takto načtený depozitor musí mít záznam v~databázi, aby pro něho byl vrácený podpis. Tento test provádí metoda {\texttt{{checkDepot}}}, která vratí hodnotu \glqq true\textquotedblleft{}, pokud v~databázi existuje záznam pro daný název a port depozitoru. Jestliže vrátí hodnotu \glqq false\textquotedblleft{}, pak je depozitor přeskočen a neobjevý se ve výsledku. Na konci vstupu musí být řetězec s~hodnotou \glqq END\textquotedblleft{}. Podpisy jsou vytvářeny stejně jako u~požadavku typu \glqq 100\textquotedblleft{} pomocí metody {\texttt{{createSign}}} a připojeny do odpovědi za jméno a port příslušného depozitoru. Na začátek výstupu je spolu s~návratovou hodnotou přídána informace o~počtu podepsaných depozitorů ve výsledku. Stejně jako u~předchozích požadavků vyvolání jakékoli vyjímky vede k~ukončení vlákna a vrácení návratové hodnoty \glqq -1\textquotedblleft{}.

% table ------------------------------------------------------
\begin{table}[htb]
\begin{center}%
\hypertarget{id2478624}{}%
\begin{tabular}{|c|c|c|}
\hline 
{{Název parametru}} & {{Počet oktetů}} & {{Poznámka}} \tabularnewline
 \hline 
{{délka certifikátu}} & {{10}} & {{velikost klientova certifikátu}} \tabularnewline
 \hline 
{{certifikát}} & {{délka certifikátu}} & {{certifikát od klienta}} \tabularnewline
 \hline 
{{název depozitoru}} & {{256}} & {{doménové jméno depozitoru}} \tabularnewline
 \hline 
{{port}} & {{10}} & {{číslo portu na kterém je depozitor aktivní}} \tabularnewline
 \hline 
{{délka podpisu}} & {{10}} & {{velikost podpisu}} \tabularnewline
 \hline 
{{podpis}} & {{délka podpisu}} & {{podpis k~danému depozitoru}} \tabularnewline
 \hline 
{{...}} & {{...}} & {{název, port, délka podpisu a podpis dalšího dep.}} \tabularnewline
 \hline 
{{\glqq END\textquotedblleft{}}} & {{256}} & {{ukončení vstupu}} \tabularnewline
\hline 
\end{tabular}
{{\caption{Typ příkazu \glqq 101\textquotedblleft{} - vstupní parametry}\label{id2478624}}}
\label{id2478624}
\end{center}
\end{table}

% table ------------------------------------------------------
\begin{table}[htb]
\begin{center}%
\hypertarget{id2478736}{}%
\begin{tabular}{|c|c|c|}
\hline 
{{Název parametru}} & {{Počet oktetů}} & {{Poznámka}} \tabularnewline
 \hline 
{{návratová hodnota}} & {{10}} & {{\glqq 1\textquotedblleft{} nebo \glqq -1\textquotedblleft{}, záleží na vyhodnocení požadavku}} \tabularnewline
 \hline 
{{počet depozitorů}} & {{10}} & {{kolik depozitorů vyhovovalo požadavkům}} \tabularnewline
 \hline 
{{název depozitoru}} & {{256}} & doménové jméno dep.{{}} \tabularnewline
 \hline 
{{port}} & {{10}} & {{číslo portu na kterém je depozitor aktivní}} \tabularnewline
 \hline 
{{délka podpisu}} & {{10}} & {{velikost podpisu}} \tabularnewline
 \hline 
{{podpis}} & {{délka podpisu}} & {{podpis k~danému depozitoru}} \tabularnewline
 \hline 
{{...}} & {{...}} & {{název, port, délka podpisu a podpis dalšího dep.}} \tabularnewline
\hline 
\end{tabular}
{{\caption{Typ příkazu \glqq 101\textquotedblleft{} - výstupní parametry}\label{id2478736}}}
\label{id2478736}
\end{center}
\end{table}

% ------------------------   
% Section 
\section{Kongurační soubor}
\label{sec0401}\hypertarget{sec0401}{}%

Hned po startu se server pokusí načíst svoje nastavení z~konfiguračního souboru. Tyto informace si uloží do struktury reprezentované třídou {\texttt{{SystemCfg}}}, odkud jsou přístupné pro ostatní části programu. Konfigurační soubor obsahuje tyto parametry:

% tabular ------------------------------------------------------
\begin{center}
\label{id2478874}\hypertarget{id2478874}{}%
\end{center}

% tabular ------------------------------------------------------
\begin{center}
\label{id2478876}\hypertarget{id2478876}{}%
\begin{tabular}{|c|c|}
\hline 
{{Název parametru}} & {{Význam}} \tabularnewline
 \hline 
{{database}} & {{doménové jméno databázového serveru}} \tabularnewline
 \hline 
{{port}} & {{číslo portu na kterém je databáze schopna přijímat SQL příkazy}} \tabularnewline
 \hline 
{{databaseName}} & {{jméno databáze na databázovém stroji}} \tabularnewline
 \hline 
{{username}} & {{uživatelské jméno pod kterým se server přihlašuje do databáze}} \tabularnewline
 \hline 
{{password}} & {{uživatelské heslo}} \tabularnewline
 \hline 
{{pollInterval}} & {{interval (v~ms) mezi jednotlivými aktualizacemi databáze}} \tabularnewline
 \hline 
{{clientCount}} & {{maximální počet spojení (vláken)}} \tabularnewline
 \hline 
{{serverCertFile}} & {{cesta k~souboru obsahující serverův privátní klíč a certifikát}} \tabularnewline
 \hline 
{{serverPort}} & {{číslu portu na kterém bude L-Bone server naslouchat}} \tabularnewline
 \hline 
{{timeout}} & {{čas (v~ms) po který se čeká, než klient pošle požadavek}} \tabularnewline
\hline 
\end{tabular}
\end{center}

% tabular ------------------------------------------------------
\begin{center}
\label{id2478987}\hypertarget{id2478987}{}%
\end{center}

Může vypadat například takto:

\begin{Verbatim}[fontsize=\small]
# komentář
database = localhost
port = 3306
databaseName = test
username = root
password = root
pollInterval = 2700000
clientCount = 20
serverCertFile = ./ca.crt
serverPort = 6767
timeout = 5000
\end{Verbatim}

Na pořadí parametrů v~konfiguračním souboru nezáleží. Můžeme je psát velkými i malými písmeny, vynechávat řádky, dělat libovolně mezery či psát komentáře. Pokud L-Bone server nenačte všechna nastavení, skončí s~chybovým hlášením. Vyjímkou je pouze parametr {\texttt{{serverCertFile}}}, který může být prázdný. Ovšem L-Bone server pak nebude vyřizovat požadavky typu \glqq 100\textquotedblleft{} a \glqq 101\textquotedblleft{}.\label{id2479033}\begingroup\catcode`\#=12\footnote{Klientovi bude vrácena návratová hodnota \glqq -1\textquotedblleft{}.}\endgroup\docbooktolatexmakefootnoteref{id2479033}

% -------------------------------------------------------------
% Chapter Závěr 
% ------------------------------------------------------------- 	
\chapter{Závěr}
\label{ch05}\hypertarget{ch05}{}%

Cílem této práce bylo implementovat L-Bone server v~programovacím jazyce Java pro distribuovaný síťový datový model. Oproti starší verzi, napsané v~jazyce C, měl být rozšířen o~další typy služeb poskytovaných klientovi. Strukturu těchto nových požadavků jsem navrhl a implementoval. Jedná se o~klientské požadavky typu \glqq 100\textquotedblleft{} a \glqq 101\textquotedblleft{}. K~dispozici mi byla třída IdentityManager od Mgr. Lukáše Hejtmánka, která poskytovala základní metody pro práci s~certifikáty.

Pro otestování celého serveru jsem napsal klientskou aplikaci, která simuluje zátěž v~reálném provozu a otestoval v~počítačové hale na Fakultě Informatiky Masarykovi univerzity. Tato aplikace nejprve vytvoří určitý počet klientských vláken, kde každé pošle paralelně s~ostatními několik různých požadavků na L-Bone server. Test byl proveden na čtyřech počítačích\label{id2479091}\begingroup\catcode`\#=12\footnote{procesor Intel Pentium 4 3.GHz s~1MB L2 cache, 1GB operační paměti, intergrovaná síťová karta Intel corporation 82562ET/EZ/GT/GZ - PRO/100 VE(LOM)}\endgroup\docbooktolatexmakefootnoteref{id2479091}, z~nichž jeden představoval L-Bone server a další tři klienty. MySQL databáze s~informacemi o~depozitorech se nacházela na jiném počítači, který měl dobu odezvy\label{id2479105}\begingroup\catcode`\#=12\footnote{angl. Round Trip Time}\endgroup\docbooktolatexmakefootnoteref{id2479105} asi {\texttt{{0,55}}} ms. Maximální počet klientských vláken u~serveru byl nastaven na padesát.

Pokud jsem nechal vytvořit patnáct vláken na každém klientském počítači, z~nichž každé poslalo dvacet různých požadavků na server, pak doba vyřízení jednoho požadavku byla průměrně {\texttt{{1570}}} ms. L-bone server přitom neodmítl ani jeden požadavek a korektně odpověděl na každý z~nich. Přitom byl počítač, na kterém L-Bone běžel, plně zatížen. Což je dáno vytvářením podpisů algoritmem RSA.

Pokud jeden klient posílá postupně pouze jeden typ požadavku, pak průměrný čas na jeho vyřízení je řádově nižší.

% tabular ------------------------------------------------------
\begin{center}
\label{id2479153}\hypertarget{id2479153}{}%
\begin{tabular}{|c|c|}
\hline 
{{číslo požadavku}} & {{průměrný čas}} \tabularnewline
 \hline 
{{1}} & {{18 ms}} \tabularnewline
 \hline 
{{100}} & {{87 ms}} \tabularnewline
 \hline 
{{101}} & {{101 ms}} \tabularnewline
\hline 
\end{tabular}
\end{center}

% tabular ------------------------------------------------------
\begin{center}
\label{id2479200}\hypertarget{id2479200}{}%
\end{center}

Strávil jsem poměrně mnoho času testováním L-Bone serveru na různé vyjímečné stavy jako např. náhlá nedostupnost databáze, výpadek spojení s~klientem, nedostupnost depozitoru. Zkoušel jsem mu posílat různě zmanipulované klientské požadavky. Na vše server zareagoval správně podle očekávání. Z~toho usuzuji, že server je schopen zvládnout svoji práci, aniž by to vedlo k~nedeterministickému chování a může být nasazen v~praxi.

Podle mého názoru se využití celé technologie Network storage stack teprve hledá. Byla nasazena v~různých projektech, kde dokázala uživatelům ušetřit práci. Ovšem na světě existují ještě další alternativy a ukáže čas, která z~nich se prosadí. Nutno poznamenat, že za širokým použitím protokolů FTP nebo HTTP je jejich jednoduchost a pro uživatele celkem intuitivní ovladatelnost. Tohoto se rodině kolem protokolu IBP ještě nepodařilo zcela dosáhnout a určitě je v~tomto směru třeba ještě mnoho udělat.
% ------------------------------------------- 
%
%  Bibliography - chapter
%
% ------------------------------------------- 
\begin{thebibliography}{123}\hypertarget{id2479231}{}

% ............. biblioentry 
\bibitem{BC1}\docbooktolatexbibaux{id2479780}{BC1}
\hypertarget{id2479780}
Radkovič, P.: \emph{Implementace LoRS stacku}, Fakulta Informatiky Masarykovy univerzity, 2006, 
			{\textless}\url{https://is.muni.cz/auth/th/98710/fi_b/}{\textgreater}
		. 

% ............. biblioentry 
\bibitem{BC2}\docbooktolatexbibaux{id2479824}{BC2}
\hypertarget{id2479824}
Šlajs, V.: \emph{DHCP server s~podporou databáze a SNMP}, Fakulta Informatiky Masarykovy univerzity, 2006, 
			{\textless}\url{https://is.muni.cz/auth/th/98710/fi_b/}{\textgreater}
		. 

% ............. biblioentry 
\bibitem{IBP1}\docbooktolatexbibaux{id2479233}{IBP1}
\hypertarget{id2479233}
Zheng, Y. a Bassi,  . a Beck, M. a Plank, J. a Wolski, R.: \emph{Internet Backplane Protocol: C API 1.4}, Department of Computer Science University of Tenesse, 
			{\textless}\url{http://loci.cs.utk.edu/ibp/documents/IBPClientAPI.pdf}{\textgreater}
		. 

% ............. biblioentry 
\bibitem{IBP2}\docbooktolatexbibaux{id2479316}{IBP2}
\hypertarget{id2479316}
Hejtmánek, L. a Holub, P.: \emph{IBP Deployment Tests and Integration with DiDaS Project}, CESNET, 23.11.2003, 
			{\textless}\url{http://www.cesnet.cz/doc/techzpravy/2003/ibpdidas/}{\textgreater}
		. 

% ............. biblioentry 
\bibitem{IBP3}\docbooktolatexbibaux{id2479371}{IBP3}
\hypertarget{id2479371}
Satrapa, P.: \emph{IBP aneb síťové disky úplně jinak}, http://www.lupa.cz/, 23. 1. 2003, 
			{\textless}\url{http://www.lupa.cz/clanky/ibp-aneb-sitove-disky-uplne-jinak}{\textgreater}
		. 

% ............. biblioentry 
\bibitem{IBP4}\docbooktolatexbibaux{id2479416}{IBP4}
\hypertarget{id2479416}
Hejtmánek, L. a Matyska, L.: \emph{Distribuované Datové Sklady}, Masarykova univerzita, prosinec 2004, 
			{\textless}\url{http://www.ics.muni.cz/to/bulletin/issues/vol15num02/}{\textgreater}
		. 

% ............. biblioentry 
\bibitem{IBP5}\docbooktolatexbibaux{id2479472}{IBP5}
\hypertarget{id2479472}
Beck, M. a S. Plank, J.: \emph{The LoCI Home Page}, The Logistical Computing and Internetworking Laboratory, 
			{\textless}\url{http://loci.cs.utk.edu/}{\textgreater}
		. 

% ............. biblioentry 
\bibitem{bouncy}\docbooktolatexbibaux{id2479661}{bouncy}
\hypertarget{id2479661}
Boncy Castle Community: \emph{Bouncy Castle Cryptography Library 1.36}, online, 
			{\textless}\url{http://www.bouncycastle.org/docs/docs1.6/index.html}{\textgreater}
		. 

% ............. biblioentry 
\bibitem{java}\docbooktolatexbibaux{id2479523}{java}
\hypertarget{id2479523}
Eckel, B.: \emph{Thinking in Java}, Prentice-Hall International (UK) Limited, London, 0-13-659723-8, 
			{\textless}\url{http://www.codeguru.com/java/tij/tij_c.shtml}{\textgreater}
		. 

% ............. biblioentry 
\bibitem{jdbc}\docbooktolatexbibaux{id2479568}{jdbc}
\hypertarget{id2479568}
Fisher, M. a White, S.: \emph{The JDBC Tutorial: Chapter 3 - Advanced Tutorial}, Sun developer network, 1999, 
			{\textless}\url{http://java.sun.com/developer/Books/JDBCTutorial/index.html}{\textgreater}
		. 

% ............. biblioentry 
\bibitem{mysql}\docbooktolatexbibaux{id2479623}{mysql}
\hypertarget{id2479623}
MySQL Community: \emph{MySQL 5.0 Reference Manual}, MySQL AB, 
			{\textless}\url{http://dev.mysql.com/doc/refman/5.0/en/index.html}{\textgreater}
		. 

% ............. biblioentry 
\bibitem{thread}\docbooktolatexbibaux{id2479735}{thread}
\hypertarget{id2479735}
Jelínek, L.: \emph{Java - vlákna}, Linuxsoft, 2005, 
			{\textless}\url{http://www.linuxsoft.cz/article.php?id_article=1006}{\textgreater}
		. 

% ............. biblioentry 
\bibitem{xlst}\docbooktolatexbibaux{id2479699}{xlst}
\hypertarget{id2479699}
Pavlovič, J.: \emph{Návod k~modulu xslt2}, 2006, 
			{\textless}\url{http://loci.cs.utk.edu/}{\textgreater}
		. 

\end{thebibliography}
\addcontentsline{toc}{chapter}{Literatura}

\newcommand{\dbappendix}[1]{\chapter{#1}}%
% ------------------------------------------------------------- 
% Appendices start here
% -------------------------------------------------------------
\appendix

% -------------------------------------------------------------
% appendix:  Instalace a spuštění L-Bone serveru 
% ------------------------------------------------------------- 	
\dbappendix{Instalace a spuštění L-Bone serveru}
\label{appA}\hypertarget{appA}{}%

Před instalací je třeba mít na serveru nainstalován virtuální stroj javy verze 6. Dále je nutné mít k~dispozici databázi MySQL verze 5.x a v~ní mít vytvořený potřebný uživatelský účet a tabulky depots a depots\_info se záznamy o~depozitorech. Na přiloženém DVD naleznete SQL skript \glqq lbone.sql\textquotedblleft{}, který tyto tabulky vytvoří. Databázi MySQL a JRE 6.0 lze stáhnout z~jejich domovských stránek, kde lze nalézt návody na jejich zprovoznění.

Server, pokud má vracet podpisy depozitorů, musí mít k~dispozici jeden soubor obsahující seznam certifikačních autorit, serverův certifikát a privátní klíč. Cesta k~tomuto souboru se zapíše spolu s~ostatními parametry do konfiguračního souboru, jehož vzor se nachází v~kořenovém adresáři L-Bone serveru na přiloženém DVD. Skript lbone.sh spustí L-Bone server. Musí se nacházet ve stejném adresáři jako soubor lboneserver.jar. Za ním může být uvedena jako parametr cesta ke konfiguračnímu souboru. Například pokud se konfigurační soubor jmenuje lbone3.cfg a nachází se ve stejném adresáři jako skript lbone.sh, pak může být L-Bone server nastartován tímto způsobem:

\begin{Verbatim}[fontsize=\small]
aisa:/home/xnovak22/lboneserver/>$ . lbone.sh ./lbone3.cfg
\end{Verbatim}

Pokud je parametr prázdný, bude konfigurační soubor standardně hledán v~souboru /etc/lbone.cfg.

% -------------------------------------------------------------
% appendix:  Obsah DVD přílohy 
% ------------------------------------------------------------- 	
\dbappendix{Obsah DVD přílohy}
\label{appB}\hypertarget{appB}{}%

% table ------------------------------------------------------
\begin{table}[htb]
\begin{center}%
\hypertarget{id2479957}{}%
\begin{tabular}{|c|c|}
\hline 
{{Adresář}} & {{Popis}} \tabularnewline
 \hline 
{{src}} & {{adresář se zdrojovými soubory}} \tabularnewline
 \hline 
{{lboneserver}} & {{adresář s~programem lboneserver}} \tabularnewline
 \hline 
{{dokumentace}} & {{adresář s~dokumentací k~programu}} \tabularnewline
 \hline 
{{prace}} & {{adresář s~textem bak. práce ve formátu pdf}} \tabularnewline
\hline 
\end{tabular}
{{\caption{}\label{id2479957}}}
\label{id2479957}
\end{center}
\end{table}

\end{document}

