Synchronizace FreeNetIS - Mikrotik
Nejdříve na úvod mírně vysvětlím, proč vůbec nějaký takový skript vzniknul. V době psaní toho textu se naše sdružení Slfree potýkalo s velkým problémem - databáze všech zařízení ve FreenetISu takřka skoro vůbec neodpovídala stavu na samotných routerech (v té době výlučně s OS RouterOS od Mikrotik) a po spuštění Přesměrování by tato entropie napáchala nakonec více škody než užitku. Ve volném čase jsem si tedy zkusil napsat jednoduchý parser exportu IP adres z dhcp-serveru z Mikrotiků a ten jsem pak použil při psaní skriptu, který naparserované informace z nich synchronizuje s db FreenetISu.
Indetifikace majitelů adres
Největší problémem bylo, jakým způsobem dosáhnout jednoznačné přiřezaní položek (leases) k majitelům (členům). Nakonec bylo rozhodnuto, že komentář každé položky bude zapsán ve tvaru ID 1 - Novák Jan (kde 1 je ID člena Jana Nováka) a synchroniční skript podle něho určí ke kterému členovi určitou IP adresu přiřadí.
Získání exportu
Nejdříve se přihlásíme na některé APčko přes ssh:
[user@pc ~]$ ssh user@10.143.10.1 user@10.143.10.1's password: MMM MMM KKK TTTTTTTTTTT KKK MMMM MMMM KKK TTTTTTTTTTT KKK MMM MMMM MMM III KKK KKK RRRRRR OOOOOO TTT III KKK KKK MMM MM MMM III KKKKK RRR RRR OOO OOO TTT III KKKKK MMM MMM III KKK KKK RRRRRR OOO OOO TTT III KKK KKK MMM MMM III KKK KKK RRR RRR OOOOOO TTT III KKK KKK MikroTik RouterOS 3.7 (c) 1999-2008 http://www.mikrotik.com/ [user@slfree_vlara] >
Vytvoříme export jménem vlara:
[user@slfree_vlara] > /ip dhcp-server lease export file=vlara
Stáhnout si ho nyní můžeme na adrese ftp://user@10.143.10.1/vlara.rsc
Spuštění skriptu
V sekci Zařízení je odkaz Import exportu DHCP z Mikrotiku. Po kliknutí na něj se nám otevře formulář, pomocí něhož nahrajeme náš export do FreenetISu a po jehož odeslání se spustí nejdůležitější synchronizační skript.
Synchronizační skript
Podrobný popis chování - pro lepší přehlednost: data z Mikrotiků jsou označeny jako M, data z FreenetISu jsou označeny jako F.
Skript je ve skutečnosti callbacková funkce parseru, takže se spustí po každém naparserování jedné položky. Nejdříve identifikuje člena, kterému položka patří a jeho hlavního uživatele. Pak se v databázi IP adres pokusí zjistit, zda IP adresa již v databázi je.
a) pokud existuje - v případě, že zařízení není přiřazeno k žádnému rozhraní => vytvoří pro něj nové zařízení (patřícími uživatelovi, se stejným adresním bodem jako on) a rozhraní a IP adresu k němu přiřadí; v případě nestejnosti původní MAC adresu v db a MAC adresy z Mikrotiku přepíše první tou druhou; v případě, že se majitelé IP adresy v F a v M liší, nastaví majitelem toho z M
b) pokud neexistuje - nejdříve testuje zda-li existuje zadaná MAC adresa z M:
I) pokud existuje - najde všechny IP adresy patřící k rozhraní této MAC adresy, 1 -> použije ji, více -> použije první, žádná -> vytvoří novou => IP adresu z M sem uloží; opět v případě, že se majitelé MAC adresy v F a v M liší, nastaví majitelem toho z M
II) pokud neexistuje - vytvoří úplně nové zařízení, s novým rozhraním a novou IP adresou, patřící majiteli z M
Problém "FreenetIS bug jak prase"
Skript počítá se stěhováním členů - pokud MAC adresa existuje, pouze změní IP adresu, segmenty, subnety, atd. Jedná se ale o dvojsečnou zbraň - pokud má člen (většinou technik sdružení) stejnou MAC adresu na více APčkách (např. NB použitý při zapojování) a tato IP adresa je "oIDečkována", je reálná možnost, že při spuštění skriptu mu to povolí NB na druhé straně sítě, ale doma bude přesměrováný (viz. Tomáš Dulík :-)). TODO: Opravit? Jak?