OK, tak si uděláme technické okénko pro zájemce.
Ze všeho nejdříve bych vás chtěl upozornit, že žádná ze změn, kterou uděláte v kódu, nepřežije nejbližší update. Stejně tak vám při hrátkách s kódem nemohu zaručit konzistenci dat apod. Ale jestli máte zájem, tak pro zájemce popíši, jak majordomo funguje.
Editoval jste soubor, který nikde nepoužíváte. majordomo_show.lua je pouze interface z příkazového řádku. Je to hodně hloupá a primitivní alternativa k tomu webovému rozhraní a používal jsem ji převážně pro debugging.
Majordomo je z jedné části plugin pro lcollect, který co minutu vypíše nové řádky do souboru /tmp/ucollect_majordomo (ucollect namísto lcollect v názvu je z historických důvodů) v poměrně čitelném formátu.
Veškerá logika zpracování dat je řízena souborem /etc/cron.d/majordomo, který:
- každých 5 minut provede operaci downsize. Aby soubor /tmp/ucollect_majordomo nerostl nad únosnou mez, tak postupně provádí zmenšování pomocí operace merge (bude vysvětleno dále), do souboru /tmp/majordomo_downsize.
- každou první minutu nové hodiny vyrobí tzv. denní soubor. Ten vyrobí tak, že provede naposledy operaci downsize a soubor /tmp/majordomo_downsize zkopíruje (a přejmenuje) jako hodinový soubor do majordomo_db (ať ji máte kdekoliv). Společně s tím provede merge dat z dané hodiny do příslušného denního a měsíčního souboru v majordomo_db.
- každou hodinu v 04 minut (tedy krátce po vytvoření nového denního souboru) zaktualizuje cache o nové adresy. To kvůli lepšímu uživatelskému zážitku. Při otevření webu nečekáte, až se na pozadí provede resolving nových záznamů, které ještě nejsou v cache.
- každé 3 dny ve 3:00 hodiny ráno zneplatní cache, aby data nezastarávala (to je to, proč se vám vaše hezké názvy mazaly)
A teď jak tyto operace vypadají z pohledu souborů:
/usr/share/lcollect/lua/majordomo_lib.lua - jedná se o společný kód, který používá více binárek, které jsou psané v lue. Obsahuje mimo jiné definice pro cache, kód, který zajistí resolving a parsování výsledků, načtení libovolného DB souboru, několik důležitých konstant a podobně.
/usr/bin/majordomo_merge.lua - implementuje zmíněnou operaci merge se soubory. V jednoduchosti se jedná o obyčejné sčítání počtu paketů a velikostí pro shodné klíče - tj. čtveřice zdroj, cíl, port, protokol. Mimo součtu hodnot se stará o to, že nad nějakou definovanou konstantu (aktuálně 6000 položek, tuším), provede součet všech ostatních do jedné položky "ostatní". Znovu pojistka proti nadměrnému růstu databázových souborů.
/usr/bin/majordomo_cache.lua - velmi jednoduché operace pro správu cache. Na příkaz majordomo_cache.lua invalidate smaže soubory majordomo_db/majordomo_serialized_* a na příkaz majordomo_cache.lua precache projde všechny hodinové, denní, měsíční soubory v majordomo_db a pro každou z položek provede resolving a uložení do cache, pokud ji v cache doposud nemá. Btw. pro větší DB je docela zajímavé udělat majordomo_cache.lua invalidate a následně time majordomo_cache.lua precache - na čase, který se cache pro větší počet položek vytváří, je vidět, jak je ta cache důležitá. (Na mém turrisu to trvalo 36 minut pro historii dlouhou 40 dní.)
/usr/bin/majordomo_show.lua - jak bylo zmíněno, pouze alternativní interface k luci. Nikde se nepoužívá automaticky.
/usr/bin/majordomo_db.sh - správa databáze. Dělá 3 základní věci. 1) Provádí operaci downsize. Logicky byla popsána výše, technicky se jedná o provedení operace merge (btw. ta je definovaná pro 3 soubory - zdroj1, zdroj2, cíl) na zdrojcíh ucollect_majordomo a majordomo_downsize do souboru majordomo_downsize. 2) Provádí operaci genhour, logicky opět výše, technicky to je merge majordomo_downsize + měsíční soubor do stejného měsíčního souboru; merge majordomo_downsize + denní soubor do stejného denního souboru; přesunutí a přejmenování majordomo_downsize na hodinový soubor. 3) Odstraňuje měsíční, denní a hodinové soubory "starší než" ty počty, které volíte v konfiguraci ve webovém rozhraní.
Poslední částí jsou kódy pro luci. Základem je adresář /usr/lib/lua/luci a zde soubory model/cbi/majordomo/settings.lua, view/majordomo/index.htm, view/majordomo/details.htm, controller/majordomo/majordomo.lua.
V krátkosti. settings.lua je popis konfiguračního souboru, toho jak data vypadají a jak má nějaká vnitřní logika luci nakreslit ty formuláře, které ve webovém rozhraní editujete. Soubory index.html a detail.html jsou šablony (+ definice nějakých konstant pro hezčí výstup) a nakonec majordomo.lua, který popisuje jak naplnit proměnné šablon, pár pomocných funkcí + nějaké základní definice, které luci vyžaduje - např. umístění aplikace v menu apod.
Obecně k té luci: Luci není úplně nejlepší příklad "webového" frameworku, takže místy to není úplně optimálně řešené. Problém luci je prakticky nulová dokumentace. Je to hodně o experimentování.
Tak, snad je můj popis dostatečně vyčerpávající. Přeji příjemnou zábavu ;-)