Univerzita Karlova v Praze Matematicko-fyzik´aln´ı fakulta
´ RSK ˇ ´ PRACE ´ BAKALA A
Michal Roder Distribuovan´ y monitorovac´ı syst´ em pro bezdr´ atov´ e s´ıtˇ e Katedra teoretick´e informatiky a matematick´e logiky
Vedouc´ı bakal´aˇrsk´e pr´ace: Mgr. Ondˇrej Zaj´ıˇcek Studijn´ı program: Informatika Studijn´ı obor: Obecn´a informatika (IOI)
2010
Chtˇel bych podˇekovat vedouc´ımu pr´ace za poskytnut´ı zaj´ımav´eho t´ematu a trpˇelivost pˇri vypracov´av´an´ı i odevzd´av´an´ı pr´ace.
Prohlaˇsuji, ˇze jsem svou bakal´aˇrskou pr´aci napsal samostatnˇe a v´ yhradnˇe s pouˇzit´ım citovan´ ych pramen˚ u. Souhlas´ım se zap˚ ujˇcov´an´ım pr´ace a jej´ım zveˇrejˇ nov´an´ım. V Praze dne
Michal Roder 2
Obsah 1 Syst´ em StatCenter ´ 1.1 Uvod . . . . . . . . . . . . . . . . . . 1.1.1 N´ahled do problematiky . . . 1.1.2 Struktura pr´ace . . . . . . . . 1.2 Probl´emy a jejich ˇreˇsen´ı . . . . . . . 1.2.1 Slovn´ıˇcek pouˇz´ıvan´ ych pojm˚ u 1.2.2 Pouˇzit´e zkratky . . . . . . . . 1.2.3 Rozbor poˇzadavk˚ u . . . . . . 1.2.4 Existuj´ıc´ı ˇreˇsen´ı . . . . . . . . ˇ sen´ı projektu StatCenter . 1.2.5 Reˇ 1.2.6 Syst´emov´e z´aklady . . . . . . 1.2.7 Pouˇzit´e knihovny . . . . . . . 1.2.8 Vstupy a v´ ystupy . . . . . . . 1.2.9 Synchronizace ˇcasu . . . . . . 1.2.10 Datab´aze . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
7 7 7 8 9 9 9 10 12 13 14 16 18 21 23
2 Uˇ zivatelsk´ a dokumentace 2.1 Instalace . . . . . . . . . . . . . . . 2.1.1 Prerekvizity . . . . . . . . . 2.1.2 Instalace . . . . . . . . . . . 2.1.3 Odinstalov´an´ı . . . . . . . . 2.2 Pouˇzit´ı program˚ u . . . . . . . . . . 2.2.1 Komunikace mezi programy 2.2.2 Server . . . . . . . . . . . . 2.2.3 Agent . . . . . . . . . . . . 2.2.4 Comms . . . . . . . . . . . 2.2.5 Printer . . . . . . . . . . . . 2.3 Z´akladn´ı operace . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
25 25 25 27 28 29 29 30 31 31 31 32
3
. . . . . . . . . . .
2.3.1 2.3.2 2.3.3
Zastaven´ı daemonizovan´eho procesu . . . . . . . . . . Pˇrid´an´ı agenta . . . . . . . . . . . . . . . . . . . . . Proch´azen´ı dat . . . . . . . . . . . . . . . . . . . . .
3 Program´ atorsk´ a dokumentace ´ 3.1 Uvod . . . . . . . . . . . . . . 3.2 LogSystem . . . . . . . . . . . 3.2.1 Struktura . . . . . . . 3.3 Config . . . . . . . . . . . . . 3.4 Protokoly . . . . . . . . . . . 3.4.1 DataProtocol . . . . . 3.4.2 TimeSyncProtocol . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
32 32 33 34 34 35 35 37 38 38 40
4 V´ ysledky a hodnocen´ı
41
Literatura
42
5 Dodatek A 5.1 Konfiguraˇcn´ı soubor programu 5.1.1 Agent . . . . . . . . . 5.1.2 Server . . . . . . . . . 5.1.3 Comms . . . . . . . . 5.1.4 Data . . . . . . . . . . 5.1.5 TimeSync . . . . . . . 5.1.6 Buffering . . . . . . . . 5.1.7 Memory . . . . . . . . 5.1.8 File . . . . . . . . . . . 5.1.9 Log . . . . . . . . . . . 5.1.10 Main . . . . . . . . . . 5.1.11 Plugins . . . . . . . . . 5.1.12 PluginManager . . . . 5.1.13 Plugin . . . . . . . . . 5.2 Konfiguraˇcn´ı soubor programu 5.2.1 StatCenter . . . . . . . 5.2.2 TimeSyncServer . . . . 5.2.3 CommsServer . . . . . 5.2.4 PrintServer . . . . . . 5.2.5 Log . . . . . . . . . . . 5.2.6 Main . . . . . . . . . .
43 44 44 44 45 45 45 45 46 46 46 47 47 47 48 49 49 49 49 50 50 50
4
agent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . server . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
5.3 5.4
5.2.7 Database . . . . . . . . . . . . 5.2.8 Servers . . . . . . . . . . . . . . Konfiguraˇcn´ı soubor datab´aze . . . . . Konfiguraˇcn´ı soubor modulu Database 5.4.1 Database . . . . . . . . . . . . 5.4.2 LastUsedStreamId . . . . . . . 5.4.3 LastUsedAgentId . . . . . . . . 5.4.4 Agents . . . . . . . . . . . . . . 5.4.5 Agent . . . . . . . . . . . . . . 5.4.6 Streams . . . . . . . . . . . . . 5.4.7 Stream . . . . . . . . . . . . . .
5
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
51 51 52 52 52 52 53 53 53 53 53
N´azev pr´ace: Distribuovan´ y monitorovac´ı syst´em pro bezdr´atov´e s´ıtˇe Autor: Michal Roder Katedra (´ ustav): Katedra teoretick´e informatiky a matematick´e logiky Vedouc´ı bakal´aˇrsk´e pr´ace: Mgr. Ondˇrej Zaj´ıˇcek e-mail vedouc´ıho:
[email protected] Abstrakt: C´ılem pr´ace je vytvoˇrit monitorovac´ı syst´em sloˇzen´ y z nˇekolika program˚ u, kter´ y umoˇzn´ı sledovat dˇen´ı pˇredevˇs´ım na bezdr´atov´ ych s´ıt´ıch. Tyto programy by mˇely b´ yt snadno rozˇs´ıˇriteln´e o dalˇs´ı schopnosti. Hlavn´ı zamˇeˇren´ı je na sbˇer a sd´ılen´ı dat, jejich zpracov´an´ı a interpretace je vedlejˇs´ı. Souˇc´ast´ı pr´ace je uˇzivatelsk´a a program´atorsk´a dokumentace k program˚ um. Kl´ıˇcov´a slova: WLAN, Wireless Extensions, iwlib, monitorov´an´ı
Title: Distributed Monitoring System for Wireless Networks Author: Michal Roder Department: Department of Theoretical Computer Science and Mathematical Logic Supervisor: Mgr. Ondˇrej Zaj´ıˇcek Supervisor’s e-mail address:
[email protected] Abstract: The goal of this thesis is a monitoring system composed of several programs that allow observing events primarily on wireless networks. These programs should be easily modifiable by adding additional capabilities. Main aim is at collecting and sharing of data, interpreting and processing it is of secondary importance. The thesis contains user and programmer documentation for all the programs. Keywords: WLAN, Wireless Extensions, iwlib, monitoring
6
Kapitola 1 Syst´ em StatCenter 1.1 1.1.1
´ Uvod N´ ahled do problematiky
S bezdr´atov´ ymi s´ıtˇemi se dnes setk´av´ame zcela bˇeˇznˇe. Jsou velmi obl´ıben´ ym zp˚ usobem propojen´ı menˇs´ıho i vˇetˇs´ıho mnoˇzstv´ı poˇc´ıtaˇc˚ u do s´ıtˇe. S rychl´ ym rozˇsiˇrov´an´ım pˇrenosn´ ych poˇc´ıtaˇc˚ u, kter´e maj´ı potˇrebn´ y hardware zabudov´an v sobˇe, miz´ı posledn´ı pˇrek´aˇzka pro snadn´e pouˇzit´ı. Z pohledu uˇzivatele to je vˇetˇsinou snadn´e. Najde pˇr´ıpojn´ y bod a pˇripoj´ı se s pomoc´ı hesla. Pro spr´avce bezdr´atov´ ych s´ıt´ı nen´ı vˇse tak jednoduch´e. Zprovoznˇen´ı s´ıtˇe neb´ yv´a tak obt´ıˇzn´e, probl´em m˚ uˇze nastat pˇri jej´ım spravov´an´ı. S´ıla sign´alu, poˇcet pˇripojen´ ych uˇzivatel˚ u a dalˇs´ı statistiky mohou b´ yt kl´ıˇcov´e pˇri rozhodov´an´ı, zda se na s´ıti nevyskytuje probl´em, kter´ y je tˇreba ˇreˇsit. Stejnˇe tak je nˇekdy zapotˇreb´ı sledovat zat´ıˇzen´ı s´ıtˇe. Projekt StatCenter je navrˇzen pro sledov´an´ı dˇen´ı na bezdr´atov´ ych s´ıt´ıch. Je navrˇzen pro menˇs´ı s´ıtˇe, ale bude fungovat i na vˇetˇs´ıch. Sledovac´ı syst´em je zam´ yˇslen pro nasazen´ı na mal´ ych, nepˇr´ıliˇs v´ ykonn´ ych poˇc´ıtaˇc´ıch s centr´aln´ım bodem pro sbˇer a ukl´ad´an´ı informac´ı. Sledovac´ı programy by proto mˇely b´ yt co nejjednoduˇsˇs´ı. U centr´aln´ıho serveru se ale bohuˇzel ned´a vyhnout zv´ yˇsen´ ym n´arok˚ um na v´ ykon, kapacitu operaˇcn´ı pamˇeti a pevn´ ych disk˚ u. Syst´em na sb´ır´an´ı dat by byl k niˇcemu, pokud by se z nˇej data nedala z´ıskat. Pro tuto u ´lohu je do projektu StatCenter pˇrid´an jednoduch´ y klient, kter´ y umoˇzn´ı st´ahnut´ı dat. Tento klient vˇsak nen´ı v oblasti z´ajmu t´eto pr´ace, protoˇze jeho pokroˇcil´a implementace by mohla dos´ahnout a snadno i pˇrekroˇcit rozsah projektu. 7
StatCenter je prim´arnˇe urˇcen pro operaˇcn´ı syst´em GNU/Linux. Nˇekter´e ˇca´sti se s menˇs´ımi u ´pravami daj´ı pouˇz´ıt i na jin´ ych syst´emech s j´adry zaloˇzen´ ymi na Unixu.
1.1.2
Struktura pr´ ace
Pr´ace je rozˇclenˇena do ˇctyˇr z´akladn´ıch ˇc´ast´ı a dodatku. Prvn´ı ˇc´ast Syst´em StatCenter se zab´ yv´a ˇreˇsen´ımi pouˇzit´ ymi v syst´emu a jeho strukturou. Druh´a ˇca´st Uˇzivatelsk´a dokumentace se vˇenuje oˇcek´avan´ ym ot´azk´am uˇzivatel˚ u. Obsahuje n´avody jak nainstalovat a odinstalovat programy, jak prov´est z´akladn´ı operace. Tˇret´ı ˇc´ast Program´atorsk´a dokumentace je urˇcena pro program´atory. Podrobnˇeji se zab´ yv´a fungov´an´ım a souvislostmi mezi jednotliv´ ymi moduly syst´emu. ˇ Ctvrt´ a ˇca´st V´ysledky a hodnocen´ı nab´ız´ı kr´atk´e zhodnocen´ı, v´ ysledky a moˇzn´a zlepˇsen´ı program˚ u. Dodatek obsahuje strukturu a popis konfiguraˇcn´ıch soubor˚ u a jejich hodnot. Je nezbytnou ˇca´st´ı uˇzivatelsk´e dokumentace.
8
1.2 1.2.1
Probl´ emy a jejich ˇ reˇ sen´ı Slovn´ıˇ cek pouˇ z´ıvan´ ych pojm˚ u
Pro dalˇs´ı text definujme nˇekolik pojm˚ u, kter´e budou v pr´aci pouˇzity ve specifick´em v´ yznamu. Nˇekter´e tyto pojmy maj´ı obecnˇejˇs´ı v´ yznam, kter´ y pro u ´ˇcely t´eto pr´ace m˚ uˇze b´ yt zav´adˇej´ıc´ı a matouc´ı. Agent – v t´eto pr´aci je za agenta povaˇzov´an program sb´ıraj´ıc´ı data na vzd´alen´e stanici Server – v t´eto pr´aci je za server povaˇzov´an centr´aln´ı uzel syst´emu, kter´ y sb´ır´a data Daemonizace – proces, pˇri kter´em program odstraˇ nuje veˇsker´a spojen´ı s rodiˇcovsk´ ym procesem (i z´avislosti) Printer – v t´eto pr´aci je za printer povaˇzov´an program slouˇz´ıc´ı ke staˇzen´ı dat ze serveru a k jejich v´ ypisu Comms – tato zkratka anglick´eho slova communications pˇredstavuje v t´eto pr´aci program slouˇz´ıc´ı ke komunikaci s daemonizovan´ ym procesem (server, agent)
1.2.2
Pouˇ zit´ e zkratky
POSIX Portable Operating System Interface (for Unix) TCP Transmission Control Protocol UDP User Datagram Protocol XML Extensible Markup Language UTC Coordinated Universal Time ID Identifier, unik´atn´ı identifik´ator, v programech pouˇz´ıv´ano cel´e ˇc´ıslo
9
1.2.3
Rozbor poˇ zadavk˚ u
Pˇredstava syst´emu je takov´a, ˇze agenti bˇeˇz´ı na m´alo v´ ykonn´ ych stroj´ıch s omezen´ ymi prostˇredky. Server je na druhou stranu provozov´an na stroji s dostatkem v´ ykonu i syst´emov´ ych prostˇredk˚ u (operaˇcn´ı pamˇeti a diskov´eho prostoru). Pozice program˚ u printer a comms se neˇreˇs´ı. Ani jeden nevyˇzaduje nijak velk´e syst´emov´e zdroje s v´ yjimkou pˇrenosov´e kapacity s´ıtˇe v pˇr´ıpadˇe vzd´alen´eho pˇr´ıstupu. Agenti nech´avaj´ı veˇsker´e zpracov´an´ı dat na serveru. Data se nepos´ılaj´ı pr˚ ubˇeˇznˇe, ale hromad´ı se na stranˇe agenta v bufferech, jejichˇz velikost se d´a nastavit pˇri startu. Po naplnˇen´ı bufferu se poˇsle jeho kompletn´ı obsah s dodateˇcn´ ymi informacemi serveru. Server data zpracuje a uloˇz´ı na disk. Z´aroveˇ n poskytuje rozhran´ı pro jejich sd´ılen´ı, um´ı v nich vyhled´avat. Na toto rozhran´ı se pˇripojuje program printer. Agenti by mˇeli b´ yt snadno konfigurovateln´ı. Mˇel by b´ yt k dispozici interface, kter´ y umoˇzn´ı pˇrid´av´an´ı plugin˚ u za bˇehu. Je tedy nutn´e napsat spr´avce plugin˚ u. Agenti bˇeˇz´ı jako syst´emov´ y proces bez pˇr´ıstupu ke konzoli. Pro komunikaci je zapotˇreb´ı vstup – naˇc´ıt´an´ı konfigurace – a v´ ystup – logovac´ı soubory. Agent potˇrebuje b´ yt v nˇekter´ ych pˇr´ıpadech samostatn´ y, mus´ı b´ yt schopn´ y reagovat na pˇreruˇsenou komunikaci se serverem. Agent tedy potˇrebuje dlouhodobˇejˇs´ı buffer. Je docela pravdˇepodobn´e, ˇze syst´emov´e hodiny stroj˚ u serveru a agenta nebudou synchronizovan´e (pokud nepobˇeˇz´ı na stejn´em stroji). To by bez oˇsetˇren´ı vy´ ustilo v probl´em s datab´az´ı. V´aˇznˇejˇs´ı probl´emy s nesynchronn´ımi hodinami by mohly v´est k nepouˇzitelnosti a nesmyslnosti dat v datab´azi. Potˇrebujeme tedy zajistit synchronizaci hodin (byt’ jen intern´ıch programov´ ych) se serverem. Vzhledem ke struktuˇre syst´emu pˇredpokl´adejme, ˇze server m´a spr´avn´ y ˇcas. Pokud nen´ı splnˇen ani tento pˇredpoklad, byl by velk´ y probl´em s jakoukoliv datab´az´ı rozumnˇe pracovat. Takto rozs´ahl´e programy nelze napsat najednou v celku. Kaˇzd´ y program se dˇel´ı na logick´e ˇca´sti, kter´e se daj´ı naprogramovat jako v´ıce ˇci m´enˇe samostatn´e moduly. Pˇri rozboru poˇzadavk˚ u na tyto moduly pomalu krystalizovala z´akladn´ı rozhran´ı. U vˇetˇsiny modul˚ u bylo z´akladn´ı rozhran´ı definov´ano a implementace se ˇr´ıdila podle nich. D´ıky tomu se ˇc´ast modul˚ u d´a vymˇenit za odliˇsn´e implementace splˇ nuj´ıc´ı stejn´e rozhran´ı. Vˇetˇsinou se jedn´a o moduly koncov´e, jako napˇr´ıklad logovac´ı syst´em, synchronizace ˇcasu a zpracov´an´ı dat. Ne vˇsechna rozhran´ı jsou pˇresnˇe definov´ana. U nˇekter´ ych je to ale na10
prosto nezbytn´e. Jedn´ım z tˇechto pˇr´ıpad˚ u je komunikace s dynamicky linkovan´ ymi knihovnami. Tyto jsou zde pouˇzity pro pluginy, se kter´ ymi je moˇzn´e pracovat za bˇehu programu. Jejich spr´avce i samotn´e pluginy mus´ı m´ıt pˇresnˇe definovan´e rozhran´ı, aby byla zaruˇcena funkˇcnost.
11
1.2.4
Existuj´ıc´ı ˇ reˇ sen´ı
Monitorov´an´ı syst´emu je bˇeˇzn´a souˇca´st operaˇcn´ıch syst´em˚ u. Sledov´an´ı toho, co se na syst´emu dˇeje a jak moc je zat´ıˇzen, je zapotˇreb´ı z nˇekolika d˚ uvod˚ u. K tˇem nejbˇeˇznˇejˇs´ım patˇr´ı ˇreˇsen´ı probl´em˚ u nebo kontrola z´atˇeˇze. Syst´em StatCenter nen´ı v tomto ohledu prvn´ım a urˇcitˇe taky ne posledn´ım. Mezi n´astroji pro sledov´an´ı v´ıce syst´em˚ u se syst´emu StatCenter urˇcen´ım podob´a program collectd. Projekt collectd Projekt collectd [1] je zamˇeˇren na sledov´an´ı t´emˇeˇr ˇcehokoliv. Jeho funkˇcnost lze snadno rozˇs´ıˇrit pomoc´ı plugin˚ u, kter´ ych existuje v´ıce neˇz 90. Program se skl´ad´a z j´adra, kter´e slouˇz´ı jako most umoˇzn ˇuj´ıc´ı v´ ymˇenu dat, a mnoˇzstv´ı plugin˚ u. J´adro samotn´e nedˇel´a t´emˇeˇr nic, kromˇe podpory pro naˇc´ıt´an´ı konfigurace pro pluginy a samozˇrejmˇe pˇred´av´an´ı dat mez´ı pluginy. Pluginy se dˇel´ı na dva z´akladn´ı druhy – vstupn´ı a v´ ystupn´ı. Vstupn´ı pluginy jsou vol´any v pravideln´ ych intervalech. Po proveden´ı j´adra pluginu poˇslou namˇeˇren´e hodnoty nebo jin´e informace do j´adra. Tato data jsou pot´e pˇred´ana v´ ystupn´ım plugin˚ um, kter´e je d´ale zpracuj´ı. J´adro programu i vˇsechny pˇr´ıdavn´e pluginy jsou naps´any v ˇcist´em C, na rozd´ıl od program˚ u StatCenter, kter´e byly naps´any kombinac´ı C a C++. Jazyk C byl vybr´an pro v´ ykon zkompilovan´ ych program˚ u a z´aroveˇ n velmi dobrou pˇrenositelnost a podporu na jednoduch´ ych embedded syst´emech. J´adro m´a fungovat na platform´ach Linux, r˚ uzn´ ych variant´ach BSD UNIXu, Solaris a Mac OX S. Program bˇeˇz´ı klasick´ ym zp˚ usobem na pozad´ı jako daemon. Komunikace s j´adrem prob´ıh´a pomoc´ı sign´al˚ u. J´adro zachycuje sign´aly SIGQUIT a SIGTERM, kter´e zp˚ usob´ı zastaven´ı a vypnut´ı programu. Zachycuje tak´e sign´al SIGUSR1, kter´ y zp˚ usob´ı okamˇzit´e posl´an´ı dat z cache pamˇet´ı plugin˚ u.
12
1.2.5
ˇ sen´ı projektu StatCenter Reˇ
Server obsahuje implementace vˇsech potˇrebn´ ych ˇca´st´ı, nepouˇz´ıv´a pluginy k rozˇs´ıˇren´ı funkˇcnosti. Datab´aze je ˇca´st´ı programu. Splˇ nuje z´akladn´ı rozhran´ı pro datab´azi, coˇz m˚ uˇze usnadnit pˇr´ıpadnou v´ ymˇenu implementace. Program serveru v sobˇe d´ale integruje miniservery syst´emu ˇcasov´e synchronizace, sd´ılen´ı dat a komunikace pomoc´ı programu comms. Agent poskytuje rozhran´ı pro pos´ıl´an´ı dat serveru. J´adro programu neprov´ad´ı ˇza´dn´e sledov´an´ı statistik, tuto ˇcinnost obstar´avaj´ı plugin. Program obsahuje spr´avce plugin˚ u, kter´ y implementuje rozhran´ı pro v´ ymˇenu dat mezi pluginem a j´adrem agenta. Agent v sobˇe integruje miniserver pro komunikaci s programem comms a klientskou ˇca´st syst´emu pro synchronizaci ˇcasu. Kv˚ uli podpoˇre bˇehu bez pˇripojen´ı k serveru m´a j´adro moˇznost ukl´adat data na disk. Programy comms a printer implementuj´ı jen z´akladn´ı pˇr´ıkazy. Vyuˇz´ıvaj´ı jednoduch´eho datov´eho protokolu, ˇc´ımˇz je usnadnˇena moˇznost pozdˇejˇs´ıho rozˇs´ıˇren´ı.
13
1.2.6
Syst´ emov´ e z´ aklady
Pro takto rozs´ahl´ y projekt je vhodn´e si nˇekter´e vˇeci zjednoduˇsit. Program se rozdˇel´ı do jednotliv´ ych modul˚ u, kter´e se daj´ı klasifikovat podle chov´an´ı na dvˇe z´akladn´ı kategorie. Prvn´ı kategori´ı jsou aktivn´ı moduly a druhou moduly pasivn´ı. Aktivn´ı moduly prov´adˇej´ı samostatnou nez´avislou ˇcinnost, na rozd´ıl od pasivn´ıch modul˚ u, kter´e jsou jen kontejnery dat s metodami, nebo jen soubory funkc´ı. K implementaci aktivn´ıch modul˚ u je zapotˇreb´ı vytv´aˇret nov´a vl´akna. Pro zjednoduˇsen´ı vznikla abstraktn´ı tˇr´ıda Thread, kter´a implementuje z´akladn´ı operace s vl´akny. Pro jednoduch´e pouˇzit´ı pomoc´ı dˇediˇcnosti staˇc´ı implementovat jednu metodu – ThreadProc. Tˇr´ıda neobsahuje podporu nucen´eho vypnut´ı, od implementace procedury vl´akna a vˇsech metod z n´ı volan´ ych se poˇzaduje pravideln´a kontrola intern´ı promˇenn´e, zda neindikuje poˇzadavek na vypnut´ı. Pokud je tato promˇenn´a nastavena na zastaven´ı, oˇcek´av´a se, ˇze metody svou ˇcinnost korektnˇe ukonˇc´ı. S v´ıcevl´aknov´ ymi aplikacemi automaticky pˇrich´az´ı probl´em souˇcasn´eho zach´azen´ı se sd´ılen´ ymi daty ve v´ıce vl´aknech. To bylo d˚ uvodem pro vznik dalˇs´ıho pomocn´ıka – jednoduch´eho syst´emov´eho z´amku Mutex. Z´amek je pro snazˇs´ı pouˇzit´ı opˇet ve formˇe tˇr´ıdy. V datab´azi se bˇeˇznˇe vyskytuje situace, kdy nˇekolik vl´aken ˇcte data a z´aroveˇ n jedno vl´akno (nebo i v´ıce vl´aken) do datab´aze data pˇrid´av´a. Pro tuto situaci se pˇr´ıliˇs nehod´ı typ z´amku reprezentovan´ y tˇr´ıdou Mutex. Vhodnˇejˇs´ım n´astrojem pro zamyk´an´ı s´ılen´ ych dat je z´amek typu reader(s)/writer(s), kter´ y umoˇzn ˇuje v´ıcen´asobn´ y pˇr´ıstup ˇctec´ıch vl´aken a z´aroveˇ n poskytuje exkluzivn´ı pˇr´ıstup pro zapisuj´ıc´ı vl´akna. Tento typ je reprezentov´an tˇr´ıdou RwLock. Pro mezivl´aknovou komunikaci a interakci vznikla pomocn´a tˇr´ıda Semaphore. Vyuˇz´ıv´a se v m´ıstech, kde pravideln´e kontrolov´an´ı promˇenn´e (a rozumnˇe dlouh´ y sp´anek mezi tˇemito kontrolami) neposkytuje dostateˇcnou odezvu. Tyto tˇr´ıdy jsou implementov´any pomoc´ı POSIXov´ ych vl´aken a struktur (pthread t, pthread mutex t pthread rwlock t a sem t). Vˇsechny moduly jsou kompilov´any a linkov´any s podporou POSIXov´ ych vl´aken, i kdyˇz je pˇr´ımo nevyuˇz´ıvaj´ı. J´adro projektu z´avis´ı na komunikaci po s´ıti. Potˇreba komunikovat se vyskytuje v mnoha ˇc´astech, vˇetˇsinou nejl´epe vyhovuje protokol TCP. Kv˚ uli usnadnˇen´ı pr´ace vznikla tˇr´ıda TcpSocket, kter´a implementuje z´akladn´ı operace se sockety komunikuj´ıc´ımi pomoc´ı protokolu TCP. Um´ı obˇe ˇca´sti – 14
serverovou i klientskou. Pro mˇeˇren´ı odezvy je vhodnˇejˇs´ı protokol UDP, kter´ y funguje jednoduˇseji. Proto vznikla tˇr´ıda UdpSocket, kter´a sd´ıl´ı spoleˇcn´ y z´aklad s TcpSocket. Datab´aze a logovac´ı syst´em pracuj´ı se soubory ve velk´e m´ıˇre. Pro objektov´e pouˇzit´ı byly veˇsker´e souvisej´ıc´ı funkce vloˇzeny do jedn´e tˇr´ıdy. Tˇr´ıda File m´a nav´ıc rozhran´ı rozˇs´ıˇren´e o moˇznost vytv´aˇren´ı struktury adres´aˇr˚ ua jejich maz´an´ı. Nejvˇetˇs´ım pˇr´ınosem tˇr´ıd TcpSocket a File je znaˇcn´e usnadnˇen´ı psan´ı k´odu. Za nejvˇetˇs´ı v´ yhodu lze povaˇzovat jednotn´e zpracov´an´ı chyb. Nav´ıc nen´ı probl´em pˇridat vlastn´ı chyby bez u ´prav na nˇekolika m´ıstech. Vˇsechny tyto tˇr´ıdy jsou um´ıstˇeny do jmenn´eho prostoru sys::.
15
1.2.7
Pouˇ zit´ e knihovny
Pˇri v´ yvoji bylo c´ılem napsat nen´aroˇcn´e programy. Projekt obsahuje implementace jednoduch´ ych modul˚ u, jejichˇz propracovan´e verze existuj´ı, ale maj´ı zv´ yˇsen´e n´aroky na pamˇet’ a dalˇs´ı syst´emov´e zdroje. Jsou vyuˇz´ıv´any knihovny, jejichˇz v´ yvoj by zabral ne´ umˇern´e mnoˇzstv´ı ˇcasu, pˇr´ıpadnˇe jsou nezbytnˇe nutn´e pro funkˇcnost. Tato sekce se kr´atce zab´ yv´a pouˇzit´ ymi knihovnami. Knihovny iwlib i zlib jsou velmi zn´am´e a bˇeˇznˇe pouˇz´ıvan´e. Wireless Extensions – iwlib Wireless Extensions je rozhran´ı urˇcen´e pro uniformn´ı pˇr´ıstup k ovladaˇc˚ um bezdr´atov´ ych s´ıt’ov´ ych karet. Bylo vytvoˇreno specificky pro Linux za u ´ˇcelem snazˇs´ı konfigurace a z´ısk´av´an´ı statistik z ovladaˇc˚ u s´ıt’ov´ ych karet. Rozhran´ı ’ se d´a pouˇz´ıt i ke konfiguraci s´ıt ov´e karty, ale tato pr´ace takov´e operace nevyˇzaduje. T´emˇeˇr vˇsechny ovladaˇce bezdr´atov´ ych s´ıt’ov´ ych karet dnes obsahuj´ı podporu pro Wireless Extensions. Toto rozhran´ı bylo pouˇzito, protoˇze je snadno pˇrenositeln´e navzdory sloˇzitosti ovladaˇc˚ u s´ıt’ov´ ych karet. Nav´ıc je pomˇernˇe jednoduch´e na pochopen´ı i pouˇzit´ı. Rozhran´ı je vyuˇz´ıv´ano programy pro ovl´ad´an´ı bezdr´atov´ ych s´ıt’ov´ ych rozhran´ı Wireless Tools for Linux. V novˇejˇs´ıch verz´ıch distribuc´ı b´ yvaj´ı tyto n´astroje souˇc´ast´ı instalace. Souˇcasnˇe se do syst´emu nainstaluje knihovna iwlib, kter´a d´av´a pˇr´ıstup k rozhran´ı dalˇs´ım program˚ um. V dobˇe dokonˇcen´ı pr´ace je aktu´aln´ı verze Wireless Tools 29 a Wireless Extensions 22. [3]
16
Komprese – zlib Knihovna zlib je zaloˇzena na algoritmu bezeztr´atov´e slovn´ıkov´e komprese. Tato metoda se naz´ yv´a anglicky deflation. Je to verze kompresn´ıho algoritmu LZ77. Teoretick´ y kompresn´ı limit t´eto knihovny je 1032:1. Re´aln´e v´ ysledky knihovny v bˇeˇzn´em pouˇzit´ı jsou kolem 2:1 aˇz 5:1 (podle informac´ı na str´ank´ach). [4] Pro tento projekt (hlavnˇe program serveru) je vhodn´e data pˇred uloˇzen´ım na disk komprimovat. Pˇri sbˇeru dat se totiˇz zaznamen´avaj´ı ˇcasov´e znaˇcky, kter´e nav´ yˇs´ı objem dat podle typu i o 800% v nejhorˇs´ım pˇr´ıpadˇe (uchov´an´ı 1B hodnoty s ˇcasovou znaˇckou, kter´a m´a 8 B). Pˇritom se tato ˇca´st dat (minim´alnˇe ˇcasov´e znaˇcky) d´a docela snadno komprimovat. Komprese se d´a zlepˇsit zpracov´an´ım ˇcasov´ ych znaˇcek, kter´e tvoˇr´ı rostouc´ı posloupnost. Knihovna byla vybr´ana, protoˇze se bˇeˇznˇe pouˇz´ıv´a jako souˇca´st programu gzip, je pouˇzita jako komprese form´atu .png. Oproti jin´ ym volnˇe ˇsiˇriteln´ ym kompresn´ım knihovn´am m´a lepˇs´ı kompresn´ı pomˇery. V dobˇe dokonˇcen´ı pr´ace je aktu´aln´ı verze 1.2.5. [4]
17
1.2.8
Vstupy a v´ ystupy
Pro ovl´ad´an´ı a konfiguraci program˚ u je potˇreba vytvoˇrit komunikaˇcn´ı cesty. Klasick´e pouˇzit´ı daemon˚ u totiˇz znemoˇzn ˇuje komunikaci pˇres konzoli, at’ se jedn´a o vstup, nebo v´ ystup. Vzhledem k pˇredpokl´adan´emu dlouh´em bˇehu programu by nav´ıc podobn´e vstupy a v´ ystupy nebyly praktick´e. Log – cesta ven Tato knihovna je zam´ yˇslena jako mal´ y logovac´ı syst´em. V´ ystupy log˚ u jdou do nˇekolika v´ ystupn´ıch proud˚ u podle m´ısta vzniku. Tyto vazby jsou napevno zakompilov´any. V logicky oddˇelen´ ych jednotk´ach se snadnˇeji hled´a. Ud´alosti souvisej´ıc´ı s datab´azemi jsou logicky oddˇeleny od ud´alost´ı z jin´ ych syst´em˚ u (napˇr´ıklad synchronizace ˇcasu). Souˇc´ast´ı implementace logovac´ıho syst´emu je i omezovaˇc zabran´eho m´ısta na disku. Tomuto omezovaˇci se nastav´ı poˇcet a maxim´aln´ı velikost soubor˚ u. Vˇetˇs´ı poˇcet menˇs´ıch soubor˚ u se l´epe spravuje. Z jednoho velk´eho se ˇspatnˇe odmaz´avaj´ı star´e zpr´avy, nehledˇe na riziko poˇskozen´ı i novˇejˇs´ıch z´aznam˚ u. Pˇri dosaˇzen´ı limitu se smaˇze nejstarˇs´ı soubor a vytvoˇr´ı se nov´ y, do kter´eho se zaˇcne zapisovat. Tato knihovna je urˇcena pro programy serveru a agent˚ u. Podp˚ urn´e programy comms a printer nevyˇzaduj´ı zvl´aˇstn´ı v´ ystupy – jejich zam´ yˇslen´a doba bˇehu je velmi kr´atk´a. Nav´ıc maj´ı pˇr´ım´ y pˇr´ıstup ke konzoli. Log se v programu chov´a jako statick´a tˇr´ıda. Staˇc´ı ji jen inicializovat a pak volat statick´e metody odkudkoliv. Nastaven´ım parametr˚ u se zpr´ava dostane do dan´e ˇca´sti logovac´ıho syst´emu. Pokud nen´ı log inicializov´an (nebo tˇreba i jen jeho ˇca´st, kter´a je pouˇzita pˇred svou inicializac´ı), vyp´ıˇse se zpr´ava na konzoli. Takov´e chov´an´ı se hod´ı pˇred naˇcten´ım konfigurace programu a n´asledn´ ym nastaven´ım logovac´ıho syst´emu. Pokud program bˇeˇz´ı jako daemon, zpr´ava je nen´avratnˇe ztracena. Uvnitˇr bˇeˇz´ı jedno vl´akno, kter´e jednou za ˇcas vypr´azdn´ı pamˇet’ov´e buffery jednotliv´ ych proud˚ u zpr´av, pokud nen´ı probuzeno ˇza´dost´ı o vypr´azdnˇen´ı bufferu. Log m´a implementovan´ y syst´em d˚ uleˇzitosti zpr´av. V z´akladn´ım rozhran´ı jsou to Error, Warning, Info, Debug. Pro kaˇzd´ y proud zpr´av se d´a nastavit d˚ uleˇzitost, kter´a je po zpr´avˇe vyˇzadov´ana, aby se dostala do soubor˚ u. Hranice je konfiguravateln´a a pˇri inicializaci se nastav´ı na Info – loguj vˇsechny zpr´avy, kter´e maj´ı d˚ uleˇzitost Info (velk´e nechybov´e ud´alosti) a niˇzˇs´ı (Warning, Error). Error slouˇz´ı k vyps´an´ı chyby z´avaˇzn´eho r´azu. War18
ning sp´ıˇse odkazuje na neˇza´douc´ı stav. Debug je obvykle pouˇzit na kontrolu bˇehu programu, kdy se loguj´ı pr˚ uchody d˚ uleˇzit´ ymi m´ısty a hodnoty doˇcasn´ ych promˇenn´ ych. Nastaven´ı Debug nen´ı vhodn´e pro bˇeˇzn´e pouˇzit´ı, jelikoˇz zbyteˇcnˇe zatˇeˇzuje logovac´ı syst´em a znepˇrehledˇ nuje logy. Pro pˇr´ıpad pˇrijet´ı sign´alu, kter´ y je obvykle d˚ usledkem nespr´avn´eho fungov´an´ı programu, je moˇzno zaregistrovat signal handler, kter´ y se bude snaˇzit vypsat zpr´avy z buffer˚ u na disk pˇred ukonˇcen´ım programu. D˚ uvodem vysl´an´ı sign´alu m˚ uˇze b´ yt uˇzivatel, ale i chyba v programu. Snaha dostat co nejv´ıce informac´ı do soubor˚ u m˚ uˇze pomoci pˇri hled´an´ı chyb, nebo aspoˇ n objasnit d˚ uvod ukonˇcen´ı v pˇr´ıpadˇe z´asahu zvenˇc´ı.
19
Config & comms – cesta dovnitˇ r Pro nastavov´an´ı parametr˚ u pˇri startu programu i za bˇehu je potˇreba zv´aˇzit moˇzn´e cesty. Linux nab´ız´ı pomˇernˇe ˇsirokou ˇsk´alu moˇznost´ı, jak komunikovat s programem. Nˇekter´e jsou pomˇernˇe drastick´e (pos´ıl´an´ı sign´al˚ u), nebo sloˇzit´e ’ (napˇr´ıklad sd´ılen´a pamˇet ). Velmi d˚ uleˇzit´e jsou i moˇznosti snadn´e rozˇs´ıˇritelnosti, pouˇzitelnosti a syst´emov´e kompatibility, kter´e byly krit´eriem pro zvolen´ı komunikaˇcn´ıch prostˇredk˚ u – socket˚ u a soubor˚ u. Oba prostˇredky maj´ı sv´a pro a proti. Sockety se pyˇsn´ı moˇznost´ı vysok´e interaktivity (rychl´e odezvy) a moˇznosti komunikovat na velk´e vzd´alenosti skrze s´ıtˇe za pouˇzit´ı stejn´eho n´astroje i rozhran´ı. Na druhou stranu maj´ı soubory v´ yhodu ve sv´e trvanlivosti, moˇzn´e nemˇennosti a tak´e trochu snazˇs´ım zach´azen´ı a zpracov´an´ı. V projektu StatCenter je pouˇzita kombinace. C´ılem je vyuˇzit´ı nejlepˇs´ıch vlastnost´ı z obou. Konfigurace program˚ u je uloˇzena v souborech. Pomoc´ı socket˚ u mohou b´ yt programu zasl´any pˇr´ıkazy, mezi kter´ ymi jsou napˇr´ıklad ˇza´dost o vypnut´ı, nebo pˇreˇcten´ı konfiguraˇcn´ıch soubor˚ u. Pro z´akladn´ı akce staˇc´ı velmi jednoduch´ y protokol, kter´ y se d´a pozdˇeji snadno rozˇs´ıˇrit o potˇrebn´e pˇr´ıkazy. Pro pˇrenos je pouˇzit TCP protokol, jelikoˇz vyhovuje svou spolehlivost´ı a univerz´alnost´ı. V programech agent˚ ua serveru bˇeˇz´ı jednoduch´ y miniserver, kter´ y zpracov´av´a pˇripojen´ı ovl´adac´ıch program˚ u (comms) a vykon´av´a vyˇza´dan´e akce. Config um´ı ˇc´ıst soubory ve form´atu XML. Zavol´an´ım metody um´ı pˇrev´est soubor do pamˇet’ov´e struktury, kterou lze snadno proch´azet. Nebo naopak um´ı takovou strukturu pˇrev´est do XML a uloˇzit do souboru. Tento modul neobsahuje ˇz´adn´e pokroˇcil´e funkce, je zamˇeˇren na jednoduchost a rychlost.
20
1.2.9
Synchronizace ˇ casu
V pˇredchoz´ım textu byl zm´ınˇen probl´em synchronizace ˇcasu. U syst´emu skl´adaj´ıc´ıho se z nˇekolika poˇc´ıtaˇc˚ u se ned´a oˇcek´avat, ˇze by vˇsechny syst´emov´e hodiny byly naprosto synchronizovan´e. Za takov´e situace by data z datab´aze postr´adala ˇcasov´e souvislosti, kter´e mohou b´ yt ˇcasto kl´ıˇcov´e. Synchronizace ˇcasu jako takov´a je kupodivu sloˇzit´ y probl´em. Zasahuje do n´ı mnoho veliˇcin, z nichˇz mnoh´e se nedaj´ı ovlivnit. Hodiny jednotliv´ ych jednotek nejdou stejnˇe rychle ani v pˇr´ıpadˇe stejn´eho typu hodin. Natoˇz pak v prostˇred´ı, kde jednotliv´e jednotky maj´ı r˚ uzn´e typy hodin, kter´e nav´ıc nemus´ı pˇri vypnut´ı v˚ ubec udrˇzovat v chodu. Pak je synchronizace nezbytn´a. Existuje nˇekolik situac´ı, v nichˇz se synchronizace poˇzaduje. Nen´ı neobvykl´e, ˇze kaˇzd´a situace se spokoj´ı s r˚ uzn´ ym stupnˇem synchronizovanosti. Existuj´ı syst´emy, kter´ ym staˇc´ı, aby se hodiny znaˇcn´e vˇetˇsiny jednotek pˇr´ıliˇs nerozch´azely a nemus´ı se v˚ ubec starat o skuteˇcn´ y ˇcas. Ani proces synchronizace nen´ı zcela bez neovlivniteln´ ych veliˇcin. Pˇri komunikaci po klasick´em pevn´em nebo bezdr´atov´em m´ediu mohou vznikat ˇ kolize sign´al˚ u, kter´e je pak nutno vyˇreˇsit a data poslat znovu. Sifrov´ an´ı sign´alu, dnes st´ale bˇeˇznˇejˇs´ı, zatˇeˇzuje procesor, kter´emu podle typu, zat´ıˇzen´ı a implementaci deˇsifrovac´ıho software m˚ uˇze trvat rozd´ılnou dobu dek´odovat ’ data. To sam´e plat´ı i pro s´ıt ov´e karty, nemluvˇe o ant´en´ach pro bezdr´atov´a pˇripojen´ı a spoustˇe dalˇs´ıch okolnost´ı. V projektu StatCenter je zvolen syst´em jednoho ˇcasov´eho vedouc´ıho, kter´ y vˇsem ostatn´ım urˇcuje pˇresn´ y ˇcas. Touto jednotkou je program serveru. Tento syst´em m´a sv´e v´ yhody i nev´ yhody. Je jednoduch´ y a pro mal´e s´ıtˇe i efektivn´ı. Pro vˇetˇs´ı s´ıtˇe uˇz ale nemus´ı b´ yt moˇzn´e pˇr´ım´e spojen´ı se serverem. V takov´ ych situac´ıch m˚ uˇze doch´azet k velk´emu zkreslen´ı. Za v´ yhodu lze povaˇzovat zvolen´ı vedouc´ıho, odpad´a tedy f´aze vyjedn´av´an´ı. Kdyˇz nen´ı dostupn´e spojen´ı s vedouc´ım, nasb´ıran´a data se oznaˇc´ı jako nesynchronizovan´a a po nejbliˇzˇs´ı synchronizaci se ˇcasov´e znaˇcky oprav´ı.
21
Synchronizaˇ cn´ı algoritmus Pˇri pravideln´e synchronizaci agent pos´ıl´a zpr´avy serveru, kter´ y pˇrid´a sv˚ uj ˇcas doruˇcen´ı a poˇsle ji zp´atky agentovi. Agent z nˇekolika mˇeˇren´ı spoˇc´ıt´a pravdˇepodobnou odchylku sv´eho ˇcasu od serverov´eho a uprav´ı rozd´ıl. Implementovan´ y algoritmus poˇc´ıt´an´ı odchylky: Probˇehne 9 mˇeˇr´ıc´ıch test˚ u (ping˚ u): 1. vytvoˇren´ı zpr´avy na stranˇe klienta s ˇcasem timeClient 2. odesl´an´ı zpr´avy serveru 3. server uloˇz´ı ˇcas doruˇcen´ı do zpr´avy jako ˇcas timeServer 4. server poˇsle zpr´avu zpˇet agentovi 5. agent zaznamen´a ˇcas pˇrijet´ı jako receiveTime 6. agent uloˇz´ı hodnotu: timeServer - timeClient - (receiveTime - timeClient)/2 Ve v´ ypoˇctu je pouˇzit pˇredpoklad, ˇze doby cest tam i zpˇet jsou stejn´e. Tento pˇredpoklad bude platit pro menˇs´ı s´ıtˇe, u velk´ ych by mohl zp˚ usobovat nepˇresnou synchronizaci. Na uloˇzen´e hodnoty se pak pouˇzije v´ ypoˇcet pravdˇepodobn´e odchylky. 1. odeber 2 nejmenˇs´ı hodnoty 2. odeber 2 nejvˇetˇs´ı hodnoty 3. ze zb´ yvaj´ıc´ıch 5 hodnot spoˇc´ıtej aritmetick´ y pr˚ umˇer 4. pouˇzij pr˚ umˇer jako odchylku Odebr´an´ı nejmenˇs´ıch a nejvˇetˇs´ıch hodnot by mˇelo zabr´anit ovlivnˇen´ı v´ ysledk˚ u extr´emn´ımi hodnotami. V´ ypoˇcet se bl´ıˇz´ı medi´anu, kter´ y ˇcasto l´epe vypov´ıd´a o skuteˇcn´ ych hodnot´ach. Agent neupravuje syst´emov´ y ˇcas. Uloˇz´ı si pouze namˇeˇren´ y rozd´ıl, kter´ y se pak pouˇzije pˇri manu´aln´ıch korekc´ıch. Metoda to nen´ı efektivn´ı, avˇsak nevyˇzaduje zv´ yˇsen´a opr´avnˇen´ı pro z´asah do syst´emov´eho ˇcasu.
22
1.2.10
Datab´ aze
Datab´azov´ y modul je nejsloˇzitˇejˇs´ı ˇc´ast cel´eho syst´emu. Hlavn´ım u ´kolem datab´aze je ukl´ad´an´ı a naˇc´ıt´an´ı dat, obˇe operace co nejl´epe a nejrychleji. K tomu se pˇrid´avaj´ı n´aroky na efektivn´ı vyuˇzit´ı pˇr´ıstupu k disku, diskov´eho prostoru a operaˇcn´ı pamˇeti. Pro snadnˇejˇs´ı pouˇzit´ı by datab´aze mˇela implementovat zpracov´an´ı dat, automatizaci, korekci chyb, konfigurovatelnost za bˇehu a mnoh´e dalˇs´ı. Uˇziteˇcn´ ych vlastnost´ı datab´aze je velmi mnoho. Implementace vˇsech vyjmenovan´ ych vlastnost´ı je sloˇzit´a. V souˇcasn´e verzi byla implementovan´a podmnoˇzina schopnost´ı. Do t´eto podmnoˇziny patˇr´ı vyuˇzit´ı diskov´eho prostoru, rychl´ y pˇr´ıstup k dat˚ um a moˇznost snadno manipulovat se soubory datab´aze. Ostatn´ı aspekty jsou v implementaci zohlednˇeny v menˇs´ı m´ıˇre. Souˇc´ast´ı n´avrhu datab´aze byl popis minim´aln´ıho univerz´aln´ıho rozhran´ı. Implementovan´a datab´aze samozˇrejmˇe pouˇz´ıv´a toto rozhran´ı. Pˇri n´avrhu z´akladn´ıch metod byly br´any v u ´vahu klasick´e relaˇcn´ı datab´aze, aby bylo moˇzn´e dopsat moduly, kter´e se pˇripoj´ı na extern´ı datab´azi. V implementaci je zabudovan´a podpora pro zpracov´an´ı dat. Agent pos´ıl´a data na server jako jeden proud. Datab´aze se d´a nastavit, aby tento proud zpracov´avala a vedle origin´aln´ıch dat vytvoˇrila proud dat upraven´ ych ˇci u ´plnˇe zmˇenˇen´ ych. P˚ uvodn´ı myˇslenka je poˇc´ıt´an´ı pr˚ umˇer˚ u nˇekter´ ych veliˇcin za ˇcasovou jednotku a jemn´e korekce nestejn´ ych interval˚ u mezi jednotliv´ ymi mˇeˇren´ımi hodnot veliˇcin. Tato schopnost naruˇsuje poˇzadavek na mal´e vyuˇzit´ı operaˇcn´ı pamˇeti, protoˇze kaˇzd´ y podproud mus´ı m´ıt vlastn´ı buffer. Pˇri vˇetˇs´ım poˇctu proud˚ u a velikostech buffer˚ u v ˇr´adech megabyt˚ u nar˚ ust´a spotˇreba pamˇeti. Na druhou stranu se sniˇzuje zat´ıˇzen´ı disku, na kter´ y se nemus´ı neust´ale zapisovat mal´e kousky dat (neˇz´adouc´ı situace read-modify-rewrite). Buffery se alokuj´ı aˇz v pˇr´ıpadˇe potˇreby, coˇz m˚ uˇze zlepˇsit pamˇet’ov´e n´aroky. Jak jiˇz bylo zm´ınˇeno v u ´vodu t´eto kapitoly, data sb´ıran´a t´ımto syst´emem jsou ˇcasto snadno komprimovateln´a. Proto je souˇca´st´ı datab´aze tˇr´ıda Compression, kter´a je standardnˇe aktivovan´a. D´a se vypnout v konfiguraˇcn´ım souboru. Jej´ım u ´kolem je data komprimovat. Zpracov´an´ı by mˇelo vylepˇsit kompresn´ı pomˇery. Hodnˇe z´aleˇz´ı na druhu a velikosti ukl´adan´ ych dat. Nyn´ı je implementov´ano jen pro mal´e datov´e typy. U nich velkou ˇca´st v´ ysledn´ ych dat zab´ıraj´ı ˇcasov´e znaˇcky, kter´e jsou v r´amci jednoho datov´eho proudu zcela sekvenˇcn´ı. Datov´ y typ pro ˇcasovou znaˇcku je uloˇzen v 8 bytech jako cel´e ˇc´ıslo se znam´enkem oznaˇcuj´ıc´ı poˇcet mikrosekund od poˇca´tku unixov´eho ˇcasu (1. 1. 1970 00:00:00.000000 UTC). Rozsah hodnot plnˇe dostaˇcuje na nˇekolik tis´ıc let, pˇritom zachov´av´a dostateˇcnˇe rozumnou pˇresnost. Spoˇc´ıt´an´ı 23
rozd´ılu mezi hodnotami, kter´e jsou odebr´any s 10sekundov´ ym rozd´ılem, vynuluje pˇet z osmi byt˚ u. V pˇr´ıpadˇe mal´ ych datov´ ych typ˚ u by to mohlo znaˇcnˇe usnadnit kompresi pomoc´ı slovn´ıkov´ ych metod. Stejnˇe tak se pˇredpokl´ad´a dobr´ y kompresn´ı pomˇer pro proudy textov´ ych dat.
24
Kapitola 2 Uˇ zivatelsk´ a dokumentace 2.1 2.1.1
Instalace Prerekvizity
Samozˇrejmˇe jako z´aklad potˇrebujete syst´em GNU/Linux. D´ale je z bˇeˇzn´ ych program˚ u potˇreba: • make (pokud moˇzno GNU – ostatn´ı verze nebyly testov´any, takˇze nen´ı zaruˇcena funkˇcnost konfiguraˇcn´ıch skript˚ u) • g++ (lepˇs´ı jsou novˇejˇs´ı stabiln´ı verze 4.*, chov´an´ı na starˇs´ıch nen´ı ovˇeˇreno) • doxygen (nen´ı nezbytnˇe nutn´ y, pouze pro generov´an´ı podrobnˇejˇs´ı dokumentace ze zdrojov´ ych k´od˚ u) Nav´ıc pro jednotliv´e programy jsou potˇreba knihovny: 1. Server Pro kompilaci a slinkov´an´ı serveru je zapotˇreb´ı m´ıt nainstalovanou knihovnu zlib (vˇcetnˇe hlaviˇckov´ ych soubor˚ u). [4] 2. WirelessObserver Pro kompilaci a linkov´an´ı pluginu WirelessObserver je potˇreba nainstalovan´e knihovny iwlib (vˇcetnˇe hlaviˇckov´ ych soubor˚ u). Knihovna je nezbytn´a, protoˇze sledov´an´ı bezdr´atov´ ych s´ıt´ı je z´akladn´ı vlastnost syst´emu StatCenter. [3] 25
Potˇrebn´a instalace se d´a zaˇr´ıdit dvˇema zp˚ usoby. M˚ uˇze se nainstalovat syst´emov´ y bal´ıˇcek, nebo lze knihovny zkompilovat a nainstalovat vlastnoruˇcnˇe. Pokud je zvolen syst´emov´ y bal´ık, je potˇreba instalovat v´ yvoj´aˇrsk´e (development – dev) verze, kter´e obsahuj´ı i hlaviˇckov´e soubory. Pˇri instalaci ze zdrojov´ ych k´od˚ u se nainstaluj´ı vˇsechny potˇrebn´e soubory. Vˇsechny potˇrebn´e souˇca´sti jsou kontrolov´any instalaˇcn´ımi skripty. Pˇri chybˇej´ıc´ı souˇca´sti se skripty s chybou zastav´ı a vyp´ıˇs´ı chybˇej´ıc´ı souˇc´ast. U nˇekter´ ych souˇc´ast´ı je naznaˇceno i ˇreˇsen´ı.
26
2.1.2
Instalace
Pro usnadnˇen´ı instalace je pouˇzit program autoconf, kter´ y umoˇzn ˇuje psan´ı kontroln´ıch skript˚ u. Standardn´ı adres´aˇr pro instalaci je adres´aˇr um´ıstˇen´ı instalaˇcn´ıch soubor˚ u. Projekt se skl´ad´a ze 4 program˚ u, u vˇsech je instalace obdobn´a. 1. Pˇrejdˇete do adres´aˇre, ve kter´em se nach´az´ı instalaˇcn´ı soubory program˚ u. 2. Spust’te konfiguraˇcn´ı skript pˇr´ıkazem ./configure. C´ılov´ y adres´aˇr instalace m˚ uˇzete zmˇenit pomoc´ı parametru --prefix. Standardnˇe se pouˇzije aktu´aln´ı adres´aˇr. Tento krok je nutn´ y pro vytvoˇ ren´ı kl´ıˇ cov´ ych skript˚ u a nastaven´ı promˇ enn´ ych pro program make! 3. Pokud z´akladn´ı kontrola probˇehne bez probl´em˚ u, zobraz´ı se dostupnost nˇekter´ ych voliteln´ ych ˇc´ast´ı. Mezi tyto voliteln´e ˇca´sti patˇr´ı knihovny zlib, iwlib a program doxygen. Jsou-li dostupn´e vˇsechny potˇrebn´e ˇca´sti, pokraˇcujte dalˇs´ım bodem. Pokud se objev´ı nˇejak´e chybov´e hl´aˇsen´ı nebo nedostupnost knihovny ˇci n´astroje, je nutn´e probl´em vyˇreˇsit. 4. Proved’te build pˇr´ıkazem make PROGRAM (kde PROGRAM m˚ uˇze b´ yt jeden z server, agent, comms, printer). Programy najdete v podadres´aˇri bin (standardn´ım nebo definovan´em). Knihovny program˚ u se nach´azej´ı v podadres´aˇri lib. Tento krok je z´aroveˇ n instalac´ı. Spustiteln´e soubory jsou um´ıstˇeny v podadres´aˇri bin. Knihovny a pluginy jsou um´ıstˇeny v podadres´aˇri lib.
27
2.1.3
Odinstalov´ an´ı
Ke smaz´an´ı program˚ u a knihoven lze pouˇz´ıt pˇr´ıkaz make clean. Ten zachov´a strukturu adres´aˇr˚ u, konfiguraˇcn´ı i datov´e soubory. K u ´pln´emu smaz´an´ı lze pouˇz´ıt pˇr´ıkaz make uninstall, kter´ y odstran´ı podadres´aˇre bin a lib z nakonfigurovan´eho adres´aˇre a z´aroveˇ n provede proˇciˇstˇen´ı zkompilovan´ ych ˇca´st´ı.
28
2.2 2.2.1
Pouˇ zit´ı program˚ u Komunikace mezi programy
Obr´azek 2.1: Sch´ema komunikace Kˇrivky naznaˇcuj´ı moˇzn´a spojen´ı mezi pomocn´ ymi programy a komunikaˇcn´ım minservery.
29
2.2.2
Server
Po startu a naˇcten´ı konfigurace se server daemonizuje – odpout´a se od rodiˇcovsk´eho procesu (typicky shellu) a bˇeˇz´ı na pozad´ı syst´emu. Tato akce m´a za n´asledek nemoˇznost ovlivnˇen´ı bˇehu programu pomoc´ı textov´eho nebo grafick´eho rozhran´ı. Pro z´akladn´ı komunikaci se serverem je pouˇzito socket˚ u. Pokud se pˇri spuˇstˇen´ı pˇrid´a parametr -f, program se nedaemonizuje a lze ho zastavit zad´an´ım p´ısmene q. Pˇri spuˇstˇen´ı je tak´e moˇzno zmˇenit pracovn´ı adres´aˇr programu, ˇc´ımˇz se fakticky zmˇen´ı i cesta, kde se bude hledat hlavn´ı konfiguraˇcn´ı soubor. Toho se doc´ıl´ı pouˇzit´ım parametru -d adres´ aˇ r. Ke komunikaci je potˇreba klient (program comms), kter´ y rozum´ı jednoduch´emu protokolu. T´ımto klientem se daj´ı ovlivnit z´akladn´ı akce. Protokol je velmi jednoduch´ y a pˇripraven´ y pro rozˇs´ıˇren´ı. V nynˇejˇs´ı verzi jsou implementov´any pˇr´ıkazy pro vypnut´ı serveru, naˇcten´ı konfiguraˇcn´ıch soubor˚ u a vyˇz´ad´an´ı nov´eho Agent ID pro pˇrid´an´ı nov´eho agenta. Vˇsechna moˇzn´a nastaven´ı se daj´ı zmˇenit v hlavn´ım konfiguraˇcn´ım souboru. Nˇekter´a z tˇechto nastaven´ı ale nejdou mˇenit za bˇehu. Jedn´ım z pˇr´ıklad˚ u je hlavn´ı komunikaˇcn´ı port. Mˇenit jej za bˇehu ned´av´a ˇz´adn´ y smysl, po zmˇenˇe by se museli pˇrekonfigurovat vˇsichni agenti, protoˇze by se nemohli pˇripojit a pos´ılat data. V´ıce si pˇreˇctˇete v popisu konfiguraˇcn´ıho souboru. Pˇri zmˇen´ach konfiguraˇcn´ıho souboru je tˇreba d´avat si pozor na aktualizace souboru vyvolan´e nˇejakou souˇc´ast´ı. Server totiˇz pˇrep´ıˇse p˚ uvodn´ı soubor, coˇz m˚ uˇze znamenat ztr´atu zmˇen. Uloˇzen´ı aktu´aln´ı konfigurace probˇehne vˇzdy pˇri korektn´ım vypnut´ı programu nebo pˇri vyˇza´dan´ı aktualizace. Pokud program nepobˇeˇz´ı pod uˇzivatelem root, je nutn´e d´at pozor na ˇc´ısla port˚ u. Bˇeˇzn´ y uˇzivatel nem˚ uˇze pouˇz´ıvat ˇc´ısla port˚ u pod 1024. Je tak´e d˚ uleˇzit´e vyhnout se speci´aln´ım port˚ um, kter´e jsou vyuˇz´ıv´any dalˇs´ımi programy pro vlastn´ı potˇrebu. Pˇri norm´aln´ım pouˇzit´ı nen´ı nutn´e programu d´avat rozˇs´ıˇren´a pr´ava. Hodnoty nastaven´ı v konfiguraˇcn´ıch souborech se daj´ı rozdˇelit na tˇri ˇca´sti podle moˇznosti je mˇenit – nelze mˇenit (pouze program s´am sm´ı), lze mˇenit a pˇri bˇehu programu se nedaj´ı aktualizovat a ty, kter´e lze mˇenit a vyˇz´adan´a aktualizace za bˇehu programu hodnoty pˇrenastav´ı. Podrobnˇejˇs´ı informace o hodnot´ach a struktuˇre konfiguraˇcn´ıho souboru lze naj´ıt v Dodatku A, sekci Konfiguraˇcn´ı soubor programu server. Moduly Database a PrintServer maj´ı vlastn´ı konfiguraˇcn´ı soubory. Rozhran´ı pro z´ısk´av´an´ı dat je tak´e implementov´ano pomoc´ı socketu. V konfiguraˇcn´ım souboru lze naj´ıt poloˇzku PrintServer port, na kter´ y se lze pˇripojit pomoc´ı programu comms. V´ıce o pouˇzit´ı v sekci Printer. 30
2.2.3
Agent
Agent se po startu a naˇcten´ı konfigurace daemonizuje stejnˇe jako server. Ke komunikaci s agentem slouˇz´ı opˇet program comms. Agent m´a rovnˇeˇz konfiguraˇcn´ı soubor, kter´ y se d´a zmˇenit a pot´e pomoc´ı programu comms naˇc´ıst. I zde plat´ı varov´an´ı pˇri zmˇenˇe konfiguraˇcn´ıho souboru a aktualizaci nastaven´ı programu. Komunikaˇcn´ı server v agentovi implementuje prov´adˇen´ı poˇzadavk˚ u na vypnut´ı a pˇrenaˇcten´ı konfiguraˇcn´ıch soubor˚ u. Do pˇrenaˇcten´ı jsou zahrnuty i konfiguraˇcn´ı soubory plugin˚ u. V´ıce o hodnot´ach a struktuˇre souboru lze naj´ıt v Dodatku A, ˇca´sti Konfiguraˇcn´ı soubor programu Agent.
2.2.4
Comms
Program comms vyˇzaduje pˇri spuˇstˇen´ı dva parametry – adresu a port miniserveru procesu, se kter´ ym m´a komunikovat. Po pˇripojen´ı je moˇzn´e vyvolat n´apovˇedu s moˇzn´ ymi pˇr´ıkazy zad´an´ım help. Seznam pˇr´ıkaz˚ u z´avis´ı pouze na schopnostech programu comms, nikoliv na miniserveru, se kter´ ym komunikuje. Nelze napˇr´ıklad vyvolat z´ısk´an´ı ID agenta na miniserveru bˇeˇz´ıc´ım na agentovi.
2.2.5
Printer
Program printer nepoˇzaduje pˇri spuˇstˇen´ı ˇz´adn´e parametry. Pˇrihl´aˇsen´ı k serveru poskytuj´ıc´ımu data se prov´ad´ı interaktivnˇe pomoc´ı pˇr´ıkazu connect. Po spuˇstˇen´ı lze vyvolat seznam pˇr´ıkaz˚ u pˇr´ıkazem help. Pˇresnˇejˇs´ı n´apovˇeda k urˇcit´emu pˇr´ıkazu se vyvol´a zad´an´ım help pˇ r´ ıkaz . Mezi z´akladn´ı schopnosti patˇr´ı v´ ypis registrovan´ ych agent˚ u v datab´azi, v´ ypis datov´ ych proud˚ u, jejich podproud˚ u a samozˇrejmˇe v´ ypis dat.
31
2.3 2.3.1
Z´ akladn´ı operace Zastaven´ı daemonizovan´ eho procesu
Jakmile se proces u ´spˇeˇsnˇe spust´ı a daemonizuje, jedin´a moˇznost nedestruktivn´ı komunikace s n´ım je pomoc´ı programu comms. K u ´spˇeˇsn´emu spojen´ı je potˇreba zjistit, na jak´em portu komunikuje dotyˇcn´ y proces. To lze vyˇc´ıst z konfiguraˇcn´ıho souboru (viz Dodatek A). Konfiguraˇcn´ı soubor se nal´ez´a v adres´aˇri, ze kter´eho byl proces spuˇstˇen, nebo jeho pˇrenastaven´em pracovn´ım adres´aˇri. Pot´e se pouˇzije program comms k pˇripojen´ı na adresu a komunikaˇcn´ı port procesu. Nakonec se v konzoli programu comms zad´a pˇr´ıkaz stop, kter´ ym se aktivuje proces vypnut´ı.
2.3.2
Pˇ rid´ an´ı agenta
Server standardnˇe blokuje pˇripojen´ı, kter´a nemaj´ı spr´avn´e Agent ID pˇri inicializaci protokolu. Agent tedy nem˚ uˇze o nov´e ID poˇz´adat. Agent ovˇsem m˚ uˇze bˇeˇzet a sb´ırat data. Nem˚ uˇze data poslat serveru, kter´ y pokus o pˇripojen´ı zablokuje. ID agenta je nutn´e do konfiguraˇcn´ıho souboru vepsat ruˇcnˇe. Unik´atn´ı ID spravuje datab´aze programu server, ze kter´eho se nov´e ID d´a vyˇz´adat s pomoc´ı programu comms. Po spuˇstˇen´ı programu comms s pˇripojen´ım k serveru, zaregistruje datab´aze pˇr´ıkazem requestagentid nov´eho agenta, jehoˇz ID se vyp´ıˇse na v´ ystup. Pro spr´avn´e fungov´an´ı agenta je nutn´e pˇrepsat ID v konfiguraˇcn´ım souboru a vyvolat naˇcten´ı konfigurace pomoc´ı programu comms, tentokr´at pˇripojen´eho ke komunikaˇcn´ımu miniserveru agenta (to vˇse v pˇr´ıpadˇe, ˇze agent uˇz bˇeˇz´ı). Pokud agent jeˇstˇe nebˇeˇz´ı, staˇc´ı upravit konfiguraˇcn´ı soubor a spustit. Jm´eno (respektive popis) agenta lze pot´e zmˇenit v konfiguraˇcn´ım souboru datab´aze (viz Dodatek A).
32
2.3.3
Proch´ azen´ı dat
K proch´azen´ı dat slouˇz´ı program printer. Program ke spuˇstˇen´ı nepotˇrebuje ˇza´dn´e parametry. Po spuˇstˇen´ı je nutn´e se nejdˇr´ıve pˇripojit k serveru pro sd´ılen´ı dat. To se provede zad´an´ım pˇr´ıkazu connect adresa port . Po u ´spˇeˇsn´em pˇripojen´ı budou fungovat pˇr´ıkazy: • listagents Vyp´ıˇse seznam agent˚ u. • liststreams Vyp´ıˇse seznam datov´ ych proud˚ u, pokud je pˇrid´an parametr agentId, vyp´ıˇs´ı se jen proudy agenta s t´ımto ID. • listsubstreams Poˇzaduje parametr streamId pro urˇcen´ı, podproudy kter´eho proudu se maj´ı vypsat. • listdata Poˇzaduje parametry streamId, substreamId, startTime a enˇ dTime. Casy jsou ve form´atu: DD.MM.YYYY-HH:MM:SS.U.
33
Kapitola 3 Program´ atorsk´ a dokumentace 3.1
´ Uvod
Nejvˇetˇs´ı v´ yzva pro program´atora je opravit (ˇci upravit) nedokumentovan´ y k´od programu ˇci knihovny. A to jak v tom pozitivn´ım smyslu (schopnost porozumˇet k´odu), tak v tom negativn´ım – zachovat klidnou hlavu nad zd´anlivˇe nesmysln´ ymi operacemi a zmˇet´ı vol´an´ı funkc´ı. Dokumentace by mˇela b´ yt samozˇrejmost´ı u kaˇzd´eho programu, coˇz bohuˇzel ani zdaleka neplat´ı. Tato sekce je proto vˇenov´ana program´ator˚ um, kteˇr´ı budou m´ıt z´ajem a odvahu pochopit co, jak a kde se dˇel´a. Vˇsechno dˇen´ı je komentov´ano s vˇetˇs´ı ˇci menˇs´ı hustotou pˇr´ımo v k´odu. Nav´ıc hlaviˇckov´e soubory jednotliv´ ych tˇr´ıd obsahuj´ı rozˇs´ıˇren´e koment´aˇre t´ ykaj´ıc´ı se funkˇcnosti, parametr˚ u a n´avratov´ ych hodnot ˇclensk´ ych funkc´ı. Tyto koment´aˇre jsou ps´any pro program doxygen, kter´ y um´ı z takto okomentovan´ ych zdrojov´ ych k´od˚ u vygenerovat spoustu uˇziteˇcn´ ych vˇec´ı. Um´ı napˇr´ıklad graficky zobrazit dˇediˇcnost tˇr´ıd, vztahy, volan´ı atd. Tyto informace um´ı exportovat do r˚ uzn´ ych form´at˚ u. Velmi uˇziteˇcn´e jsou HTML str´anky, kter´e se d´ıky odkaz˚ um daj´ı velmi snadno a rychle proch´azet. Jazykem pro koment´aˇre je zvolena angliˇctina kv˚ uli sv´e univerz´alnosti. V angliˇctinˇe jsou vˇsechny koment´aˇre i logovac´ı v´ ystupy a chybov´a ozn´amen´ı. Angliˇctina je pouˇzita i pro pojmenov´an´ı promˇenn´ ych, z jejichˇz jmen by mˇelo b´ yt zˇrejm´e pouˇzit´ı.
34
3.2
LogSystem
Logovac´ı syst´em je implementov´an jako singleton. Podporuje z´apis do soubor˚ u i na standardn´ı v´ ystup. Tˇr´ıda splˇ nuje rozhran´ı interfaces::LogI, kter´e definuje tvar logovac´ı metody a nastaven´ı logovac´ıch v´ ystup˚ u. Implementovan´a logovac´ı metoda se nepouˇz´ıv´a, v programu je v´ yhodnˇejˇs´ı a jednoduˇsˇs´ı pouˇzit´ı statick´ ych metod, kter´e splˇ nuj´ı rozhran´ı logovac´ı metody. ´ Urovnˇ e d˚ uleˇzitosti zpr´av jsou definov´any ve jmenn´em prostoru interfaces::. K dispozici jsou ˇctyˇri: 1. Error – chybov´a hl´aˇsen´ı 2. Warning – neˇza´douc´ı stavy 3. Info – informace o norm´aln´ım bˇehu 4. Debug – debugovac´ı informace Vˇsechny souvisej´ıc´ı tˇr´ıdy jsou um´ıstˇeny ve jmenn´em prostoru logsystem::.
3.2.1
Struktura
Tˇr´ıda obsahuje dvˇe logovac´ı ˇc´asti – v´ ystup na konzoli a v´ ystup do souboru. Konzolov´a ˇca´st se hod´ı pˇri startu programu, kdy jeˇstˇe nemus´ı b´ yt zcela jasn´e, kde m´a logovac´ı syst´em sv´e v´ ystupn´ı soubory. Lze naˇc´ıst konfiguraˇcn´ı soubor, ve kter´em se najdou potˇrebn´e informace (kde m´a log soubory, jak´e v´ ystupn´ı proudy se maj´ı aktivovat a jak se maj´ı nastavit...). Nav´ıc konzole zachyt´ı i pˇr´ıpady, kdy se zapisuje do neaktivovan´eho v´ ystupn´ıho proudu. Z´apis na konzoli je zcela synchronn´ı s vol´an´ım logovac´ıch metod, ale podl´eh´a bufferov´an´ı standardn´ıho v´ ystupu a zaˇr´ızen´ı, na kter´e je pˇripojen. Druh´a ˇca´st, kter´a zprostˇredkov´av´a ukl´ad´an´ı do soubor˚ u, je sloˇzitˇejˇs´ı. Kombinuje se zde synchronn´ı z´apis do bufferu a asynchronn´ı z´apis buffer˚ u do soubor˚ u. Logovac´ı syst´em je rozdˇelen do nˇekolika proud˚ u, kter´e mohou b´ yt jednoduˇse pˇrid´any. Proudy jsou na sobˇe nez´avisl´e, kaˇzd´ y z nich se d´a nastavit samostatnˇe. Proudu se pˇriˇrad´ı jm´eno, kter´e se stane souˇca´st´ı jmen soubor˚ u, do nichˇz se proud logovac´ıch zpr´av bude zapisovat. Kaˇzd´ y proud m´a buffer, kter´ y je pˇr´ıstupn´ y k synchronn´ımu z´apisu zpr´av pˇri bˇehu programu. Pˇri naplnˇen´ı se buffer pˇred´a j´adru logovac´ıho syst´emu a 35
signalizuje, ˇze se m´a o vypr´azdnˇen´ı bufferu postarat. Z´aroveˇ n si vyˇza´d´a nov´ y pr´azdn´ y buffer. Pomal´ y z´apis do souboru tak nebˇeˇz´ı ve volaj´ıc´ım vl´aknˇe, kter´e by bylo zbyteˇcnˇe blokov´ano. Tˇr´ıda LogSystem obsahuje vl´akno, kter´e m´a pouze dva u ´koly – pl´anovat pravideln´e vyprazdˇ nov´an´ı buffer˚ u a z´apis dat na disk. Pˇri pˇred´an´ı bufferu k z´apisu se hlavn´ı vl´akno probud´ı. Jinak se pravidelnˇe probouz´ı a sb´ır´a buffery, kter´e n´aslednˇe zapisuje na disk. Komunikace je zde zajiˇstˇena pomoc´ı semaforu. Semafor je v´ıcehodnotov´ y, poˇca´teˇcn´ı hodnota je urˇcena poˇctem moˇzn´ ych proud˚ u. Pˇri inicializaci logovac´ı syst´em cel´ y semafor zablokuje a spust´ı vl´akno, kter´e ˇcek´a v cyklech na napl´anovan´e vypr´azdnˇen´ı bufferu, nebo na uvolnˇen´ı pozice v semaforu, coˇz znaˇc´ı poˇzadavek nˇejak´eho proudu na vypr´azdnˇen´ı. Kaˇzd´ y proud m˚ uˇze zv´ yˇsit hodnotu semaforu o jedna, takˇze vl´akno nezapomene na nˇejak´ y buffer. Semafor je nav´ıc pomˇernˇe rychl´ y, takˇze nejsou zbyteˇcn´e prodlevy mezi ˇz´adost´ı a zaˇca´tkem z´apisu na disk. Pro ukl´ad´an´ı logovac´ıch dat se nastavuje omezen´ı na maxim´aln´ı velikost. Toto omezen´ı je kombinac´ı maxim´aln´ı velikosti souboru a maxim´aln´ıho poˇctu soubor˚ u. Data v souborech jsou v klasick´em textov´em form´atu. Jelikoˇz se ˇspatnˇe spravuje omezen´ı velikosti textov´eho souboru, je proud rozdˇelen do nˇekolika soubor˚ u. Pokud dojde k naplnˇen´ı limitu (existuje maxim´aln´ı poˇcet soubor˚ u dan´eho proudu), je smaz´an nejstarˇs´ı ze soubor˚ u a vytvoˇr´ı se soubor nov´ y. Pˇri spuˇstˇen´ı programu se vˇzdy vytvoˇr´ı nov´ y soubor, aˇckoliv posledn´ı star´ y soubor proudu z minul´eho spuˇstˇen´ı programu nemus´ı b´ yt pln´ y. Zv´ yˇs´ı se tak pˇrehlednost soubor˚ u – inicializaˇcn´ı zpr´avy jsou na zaˇca´tku souboru a d´ıky tomu, ˇze n´azev souboru obsahuje datum a ˇcas, lze spr´avn´ y soubor rychle naj´ıt podle n´azvu.
36
3.3
Config
Config je tˇr´ıda, kter´a sama o sobˇe pouze implementuje konverzi z textov´eho form´atu podobn´emu XML do pamˇet’ov´ ych struktur a opaˇcnˇe. Jsou k n´ı pˇrid´any pamˇet’ov´e struktury reprezentuj´ıc´ı uzly ve struktuˇre XML. Vˇsechny tˇr´ıdy n´aleˇzej´ıc´ı ke konfiguraˇcn´ı ˇc´asti jsou um´ıstˇeny ve jmenn´em prostoru config::. ˇ ı a dek´odov´an´ı soubor˚ Cten´ u prob´ıh´a stavov´ ym automatem nad ˇc´ast´ı souboru naˇctenou v bufferu. Pokud vˇse probˇehne v poˇra´dku, je vr´acen koˇrenov´ y uzel struktury souboru. V pˇr´ıpadˇe chyby dek´odov´an´ı je n´avratovou hodnotou chybov´ y k´od. Z´apis souboru prob´ıh´a rekurzivn´ım v´ ypisem jednotliv´ ych uzl˚ u. Pˇri v´ ypisu jsou pouˇzity tabul´atory pro zpˇrehlednˇen´ı v´ ysledn´eho form´atu. ’ Pamˇet ov´e struktury jsou optimalizov´any pro malou spotˇrebu pamˇeti pomoc´ı poˇc´ıt´an´ı odkaz˚ u na datov´ y obsah. Tˇr´ıdy reprezentuj´ıc´ı uzly jsou pouze obaly nad daty, kter´a jsou v pamˇeti obsaˇzena pouze jednou. Uzly nav´ıc podporuj´ı nˇekter´e bˇeˇzn´e konverze p˚ uvodnˇe textov´ ych parametr˚ u na potˇrebn´ y datov´ y typ.
37
3.4
Protokoly
Syst´em StatCenter z´avis´ı na komunikaci po s´ıti. Pomoc´ı socket˚ u prob´ıh´a t´emˇeˇr vˇsechna komunikace. Je tedy nutn´e definovat tvar zpr´av, jejich v´ yznam a pouˇzit´ı. K tomuto u ´ˇcelu slouˇz´ı n´asleduj´ıc´ı protokoly.
3.4.1
DataProtocol
DataProtocol se pouˇz´ıv´a pˇri komunikaci pˇres TCP spojen´ı. Tento protokol vyuˇz´ıv´a ke komunikaci nˇekolik modul˚ u. Kaˇzd´ y modul vyuˇz´ıv´a specifickou podmnoˇzinu zpr´av. Protokol umoˇzn ˇuje pˇren´aˇsen´ı dat v tˇele zpr´avy. Vˇetˇsina zpr´av m´a sv´e potvrzovac´ı varianty, komunikace je obousmˇern´a. T´emˇeˇr vˇsechna data jsou zak´odovan´a pomoc´ı big-endian poˇrad´ı byt˚ u (tak´e nˇekdy network). Jedinou v´ yjimkou jsou neurˇcit´a data pˇren´aˇsen´a v datov´e zpr´avˇe. Jako neurˇcit´a data se pos´ılaj´ı prakticky vˇsechna data z agent˚ u. M´a to nˇekolik d˚ uvod˚ u: 1. Znalost obsahu (a tedy i form´atu a k´odov´an´ı) dat nen´ı u ´ˇcelem protokolu. Protokol by ztratil svou univerz´alnost a jednoduchost. 2. Pos´ılan´a data jsou pravdˇepodobnˇe nejvˇetˇs´ı ˇca´st´ı pˇren´aˇsen´ ych dat (pokud se bere v u ´vahu rozumn´e nastaven´ı). Zak´odov´an´ı a dek´odov´an´ı by zabralo zbyteˇcnˇe mnoho ˇcasu a syst´emov´ ych prostˇredk˚ u. 3. Data nemus´ı b´ yt nutnˇe k´odov´ana – vˇetˇsina pouˇz´ıvan´ ych syst´em˚ u bude m´ıt stejn´e poˇrad´ı byt˚ u. Pokud ne, konverze se m˚ uˇze prov´est pouze jednou. Staˇc´ı tedy poslat informaci o tom, jak´e poˇrad´ı byt˚ u pouˇz´ıv´a zdrojov´ y syst´em. T´ım se d´a vyhnout zbyteˇcn´emu zpracov´an´ı dat. Pˇr´ıpadn´ y pˇrevod provede modul, kter´ y struktuˇre dat rozum´ı. Kaˇzd´a zpr´ava obsahuje hlaviˇcku: struct MessageHeader { uint16 type; uint16 part; uint32 size; };
38
Typ zpr´avy (type) je jeden z definovan´ ych typ˚ u, kter´e se liˇs´ı povinn´ ymi paˇ rametry. C´ast zpr´avy (part) se vyuˇz´ıv´a pˇri pˇrenosech velk´ ych dat. Velk´e datov´e bloky jsou z praktick´ ych d˚ uvod˚ u rozdˇeleny na menˇs´ı ˇca´sti. Posledn´ı ˇc´ast zpr´avy je identifikov´ana konstantou LastPart. Velikost (size) v hlaviˇcce zpr´avy oznaˇcuje velikost tˇela, nen´ı tedy do n´ı zapoˇc´ıt´ana hlaviˇcka samotn´a. Povinn´e parametry se skl´adaj´ı z hlaviˇcky parametru a hodnoty parametru. struct ParameterHeader { uint16 type uint32 size }; Datov´ y typ parametru je urˇcen polem type. Podle nˇej se rozhodne, jak´ y je typ hodnoty. Velikost hodnoty je uloˇzena v poli size (do t´eto velikosti opˇet nen´ı zahrnuta hlaviˇcka parametru). Pro porozumˇen´ı typ˚ um s promˇenlivou d´elkou je nezbytn´ y, pro zbytek typ˚ u m˚ uˇze slouˇzit jako kontrola. Protokol m´a kv˚ uli hlaviˇck´am vyˇsˇs´ı reˇzii na pˇren´aˇsen´ı z´akladn´ıch zpr´av. Stejnˇe tak k´odov´an´ı a dek´odov´an´ı do specifick´eho poˇrad´ı byt˚ u na prvn´ı pohled zbyteˇcnˇe zatˇeˇzuje syst´em. K´odov´an´ı big-endian bylo zvoleno, protoˇze je bˇeˇzn´ y standard i v dalˇs´ıch protokolech. D´ıky vyˇsˇs´ı reˇzii pˇrenesen´ ych dat a jejich struktuˇre se snadno odhaluj´ı a hledaj´ı chyby. Datov´a reˇzie nen´ı kritick´a, protoˇze z´akladn´ı zpr´avy netvoˇr´ı hlavn´ı ˇca´st komunikace.
39
3.4.2
TimeSyncProtocol
TimeSyncProtocol, se pouˇz´ıv´a pro komunikaci pˇres UDP spojen´ı a slouˇz´ı v´ yhradnˇe k synchronizaci. Pouˇz´ıvaj´ı ho pouze synchronizaˇcn´ı server a klient. Zpr´ava tohoto protokolu m´a takovou strukturu: struct TimeSyncMessage { uint16 messageType; uint16 sequenceNumber; int64 timeClient; int64 timeServer; } Nikde nen´ı pouˇzito pamˇet’ov´e v´ yplnˇe, vˇsechny poloˇzky n´asleduj´ı hned za sebou, velikost zpr´avy je 20 oktet˚ u. Hodnoty parametr˚ u jsou uloˇzeny s poˇrad´ım byt˚ u big-endian. Parametr messageType ˇr´ık´a, zda se jedn´a o ˇza´dost, nebo odpovˇed’. sequenceNumber obsahuje ˇc´ıslo synchronizaˇcn´ıho pokusu. Pˇri kaˇzd´e synchronizaci se zaˇc´ın´a poˇc´ıtat od 0. Parametry timeClient a timeServer pˇren´aˇsej´ı aktu´aln´ı ˇcasov´e znaˇcky. timeClient obsahuje ˇcas odesl´an´ı ˇz´adosti, timeServer ˇcas odesl´an´ı odpovˇedi. Tyto hodnoty jsou ve skuteˇcnosti typu Timestamp, kter´ y pouˇz´ıv´a cel´ y syst´em pro ukl´ad´an´ı ˇcasu. V´ yznamem ˇc´ısla je poˇcet mikrosekund od poˇc´atku unixov´eho ˇcasu. Komunikace pomoc´ı tohoto protokolu prob´ıh´a stylem ˇz´adost–odpovˇed’. O synchronizaci vˇzdy ˇz´ad´a klientsk´a ˇca´st. Serverov´a ˇc´ast m´a za u ´kol pouze pos´ılat zpˇet doruˇcen´e zpr´avy s aktualizovan´ ym ˇcasem. Pˇrenesen´a data pak agent vyuˇzije ke spoˇc´ıt´an´ı odchylky od ˇcasu serveru.
40
Kapitola 4 V´ ysledky a hodnocen´ı Podaˇrilo se naprogramovat syst´em pro sbˇer dat. ´ echy: Uspˇ • z´ısk´av´an´ı dat ze s´ıt’ov´ ych rozhran´ı s podporou Wireless Extensions • synchronizace ˇcasu agenta a serveru • sbˇer dat serverem • poskytov´an´ı dat • pos´ıl´an´ı pˇr´ıkaz˚ u daemon˚ um f Dobˇre ˇreˇsenou ˇca´st´ı je komunikace s daemonizovan´ ymi procesy. Pouˇzit´ı socket˚ u spolu s jednoduch´ ym protokolem umoˇzn ˇuje snadn´e rozˇs´ıˇren´ı a interaktivn´ı ovl´ad´an´ı ˇcinnosti procesu. Jednou z nev´ yhod je potˇreba pouˇzit´ı speci´aln´ıho programu. Pˇri pr´aci na programech se uk´azal nedostatek zkuˇsenost´ı s navrhov´an´ım a pl´anov´an´ım vˇetˇs´ıch projekt˚ u. Pˇri prvn´ım n´avrhu byl seznam poˇzadavk˚ u zbyteˇcnˇe dlouh´ y a poˇzadavky nere´aln´e. Postupnˇe se objevovaly probl´emy jak v navrˇzen´ ych rozhran´ıch, tak v implementac´ıch jiˇz hotov´ ych ˇca´st´ı. Jejich ˇreˇsen´ı samozˇrejmˇe pˇrispˇelo k lepˇs´ımu n´avrhu dalˇs´ıch ˇca´st´ı, ale zbyteˇcn´e lpˇen´ı na implementaci vlastn´ıch modul˚ u zp˚ usobilo velmi dlouh´ y v´ yvoj.
41
Literatura [1] collectd Home Site, http://collectd.org [2] doxygen Home Site, http://www.doxygen.org [3] Wireless Tools for Linux, http://www.hpl.hp.com/personal/Jean Tourrilhes/Linux/Tools.html [4] zlib Home Site, http://www.zlib.net/
42
Kapitola 5 Dodatek A Dodatek A obsahuje popis struktury soubor˚ u, kter´e m˚ uˇze uˇzivatel mˇenit. V hranat´ ych z´avork´ach za popisem parametr˚ u je nastaven´ı, kdy se d´a parametr zmˇenit a naˇc´ıst. Hodnoty jsou Init pro naˇcten´ı pouze pˇri startu (za bˇehu se nezmˇen´ı) a Run pro zmˇeny pˇri startu ˇci bˇehu programu. Hodnoty s nastaven´ım Init budou pˇri ukl´ad´an´ı za bˇehu pˇreps´any aktivn´ım nastaven´ım, takˇze pˇr´ıpadn´e zmˇeny budou ztraceny. Obdobnˇe u uzl˚ u se m˚ uˇze vyskytnout vlastnost Run, kter´a znamen´a, ˇze lze uzly pˇrid´avat za bˇehu. Pˇrid´av´an´ı uzl˚ u m´a na starosti program, je ale ˇ moˇzn´e uzly pˇridat ruˇcnˇe. Spatn´e nastaven´ı nˇekter´ ych parametr˚ u vˇsak m˚ uˇze zp˚ usobit chyby v nastaven´ı. Uzly lze ruˇcnˇe odeb´ırat pouze po vypnut´ı (pˇred inicializac´ı) programu. Ty uzly, u kter´ ych nen´ı vlastnost specifikov´ana, jsou povinn´e. U jmen opˇet z´aleˇz´ı na velikosti p´ısmen. Chybˇej´ıc´ı povinn´e uzly zp˚ usob´ı chybu naˇcten´ı konfiguraˇcn´ıho souboru.
43
5.1 5.1.1
Konfiguraˇ cn´ı soubor programu agent Agent
Hlavn´ı uzel konfiguraˇcn´ıho souboru.
<Server /> <Buffering /> Parametry: AgentId obsahuje unik´atn´ı ID klienta v syst´emu [Run] Poduzly: Server popisuje adresy a porty pro komunikaci se serverem Buffering popisuje nastaven´ı a velikosti buffer˚ u Log obsahuje nastaven´ı logovac´ıho syst´emu PluginManager obsahuje seznam a nastaven´ı spouˇstˇen´ı plugin˚ u
5.1.2
Server
<Server Addess="127.0.0.1">
<TimeSync /> Parametry: Address adresa serveru [Init]
44
Poduzly: Comms nastaven´ı komunikace s programem agenta Data nastaven´ı komunikace mezi agentem a serverem TimeSync nastaven´ı synchronizace ˇcasu
5.1.3
Comms
Parametry: Port port, na kter´em naslouch´a komunikaˇcn´ı miniserver [Init]
5.1.4
Data
Parametry: Port port, na kter´em server pˇrij´ım´a data [Init]
5.1.5
TimeSync
<TimeSync Port="11548" Interval="3600" /> Parametry: Port port, na kter´em naslouch´a synchronizaˇcn´ı server [Init] Interval interval v sekund´ach, jak ˇcasto m´a doj´ıt k synchronizaci [Run]
5.1.6
Buffering
<Buffering> <Memory />
45
Poduzly: Memory Obsahuje nastaven´ı pamˇet’ov´eho z´asobn´ıku File Obsahuje nastaven´ı diskov´eho z´asobn´ıku
5.1.7
Memory
<Memory MaxSize="1048576" MaxMessages="10000" /> Parametry: MaxSize Maxim´aln´ı velikost pouˇzit´e pamˇeti [Init] MaxMessages Maxim´aln´ı poˇcet datov´ ych zpr´av [Init]
5.1.8
File
Parametry: Enable Zap´ın´a ˇci vyp´ın´a buffer (hodnoty: yes, no) [Run] FileDir Adres´aˇr, ve kter´em jsou um´ıstˇeny datov´e soubory bufferu [Init] MaxSpace Limit m´ısta na disku [Run] MaxMessages Limit poˇctu uloˇzen´ ych datov´ ych zpr´av [Run] Kaˇzd´a zpr´ava je uloˇzena v samostatn´em souboru.
5.1.9
Log
Nastaven´ı logov´an´ı. Tento uzel se nastavuje zvl´aˇst’ jeˇstˇe pˇred spuˇstˇen´ım ostatn´ıch syst´em˚ u.
<Main /> 46
Parametry: Dir Adres´aˇr, kde budou uloˇzeny soubory log˚ u [Init] Poduzly: Main Nastaven´ı hlavn´ıho logovac´ıho proudu Plugins Nastaven´ı logovac´ıho proudu pro pluginy
5.1.10
Main
<Main Severity="Debug" MaxFiles="10" MaxFileSize="1048576" /> Parametry: Severity Minim´aln´ı d˚ uleˇzitost zpr´av, kter´e se zapisuj´ı do logu (hodnoty: Error, Warning, Info, Debug) [Run] MaxFiles Poˇcet logovac´ıch soubor˚ u [Run] MaxFileSize Velikost jednoho logovac´ıho souboru [Run]
5.1.11
Plugins
Parametry: Severity Minim´aln´ı d˚ uleˇzitost zpr´av, kter´e se zapisuj´ı do logu (hodnoty: Error, Warning, Info, Debug) [Run] MaxFiles Poˇcet logovac´ıch soubor˚ u [Run] MaxFileSize Velikost jednoho logovac´ıho souboru [Run]
5.1.12
PluginManager
47
Parametry: Dir Adres´aˇr, ve kter´em jsou um´ıstˇeny pluginy [Init] Poduzly: Plugin Nastaven´ı plugin˚ u [Run]
5.1.13
Plugin
Parametry: File N´azev souboru pluginu [Run] Enabled Zap´ın´a plugin (hodnoty: yes, no) [Run] ConfigFile Konfiguraˇcn´ı soubor pluginu (hled´a se ve stejn´em adres´aˇri jako plugin) [Run]
48
5.2
Konfiguraˇ cn´ı soubor programu server
Konfigurace programu server je uloˇzena v souboru Server.conf. Soubor je hled´an v pracovn´ım adres´aˇri.
5.2.1
StatCenter
<StatCenter DataPort="11546"> <TimeSyncServer />
Parametry: DataPort Port na kter´em se pˇrij´ımaj´ı data [Init] Poduzly: TimeSyncServer Nastaven´ı serveru pro synchronizaci ˇcasu CommsServer Nastaveni komunikaˇcn´ıho miniserveru PrintServer Nastaven´ı serveru pro sd´ılen´ı dat Log Nastaven´ı logovac´ıho syst´emu
5.2.2
TimeSyncServer
<TimeSyncServer Port="11547" /> Parametry: Port Port na kter´em naslouch´a synchronizaˇcn´ı modul [Init]
5.2.3
CommsServer
49
Parametry: Port Port, na kter´em naslouch´a komunikaˇcn´ı miniserver [Init]
5.2.4
PrintServer
Parametry: Port Port, na kter´em naslouch´a server pro sd´ılen´ı dat [Init]
5.2.5
Log
<Main /> <Servers /> Parametry: Dir Adres´aˇr, ve kter´em se nach´az´ı logovac´ı soubory [Init] Poduzly: Main Nastaven´ı hlavn´ıho logovac´ıho v´ ystupu Database Nastaven´ı logovac´ıho v´ ystupu pro datab´azi Servers Nastaven´ı logovac´ıho v´ ystupu pro miniservery
5.2.6
Main
<Main Severity="Debug" MaxFiles="10" MaxFileSize="10485760" />
50
Parametry: Severity Minim´aln´ı d˚ uleˇzitost zpr´av, kter´e se zapisuj´ı do logu (hodnoty: Error, Warning, Info, Debug) [Run] MaxFiles Poˇcet logovac´ıch soubor˚ u [Run] MaxFileSize Velikost jednoho logovac´ıho souboru [Run]
5.2.7
Database
Parametry: Severity Minim´aln´ı d˚ uleˇzitost zpr´av, kter´e se zapisuj´ı do logu (hodnoty: Error, Warning, Info, Debug) [Run] MaxFiles Poˇcet logovac´ıch soubor˚ u [Run] MaxFileSize Velikost jednoho logovac´ıho souboru [Run]
5.2.8
Servers
<Servers Severity="Debug" MaxFiles="10" MaxFileSize="10485760" />
51
5.3
Konfiguraˇ cn´ı soubor datab´ aze
Parametry: Severity Minim´aln´ı d˚ uleˇzitost zpr´av, kter´e se zapisuj´ı do logu (hodnoty: Error, Warning, Info, Debug) [Run] MaxFiles Poˇcet logovac´ıch soubor˚ u [Run] MaxFileSize Velikost jednoho logovac´ıho souboru [Run]
5.4 5.4.1
Konfiguraˇ cn´ı soubor modulu Database Database
<Streams /> Poduzly: LastUsedStreamId Posledn´ı pouˇzit´e stream ID LastUsedAgentId POsledn´ı pouˇzit´e agent ID Agents Seznam registrovan´ ych agent˚ u Streams Seznam registrovan´ ych proud˚ u
5.4.2
LastUsedStreamId
Parametry: Value Posledn´ı pouˇzit´e stream ID
52
5.4.3
LastUsedAgentId
Parametry: Value Posledn´ı pouˇzit´e agent ID
5.4.4
Agents
Poduzly: Agent Informace o agentovi
5.4.5
Agent
Parametry: Id ID agenta Description Popis agenta [Run]
5.4.6
Streams
<Streams> <Stream /> Poduzly: Stream Informace o proudu
5.4.7
Stream
<Stream Id="2" AgentId="2" Description="ID 2" /> 53
Parametry: Id ID proudu AgentId ID agenta, ke kter´emu proud patˇr´ı Description Popis datov´eho proudu
54