Disassembler

Artificial intelligence is no match for natural stupidity.
21leden2013

Automatizace upgrade a zálohy MikroTiku


S MikroTiky páchám nepřístojnosti už nějaký ten pátek a postupem času se řady mých svěřenců rozrostly do obludných rozměrů. Před vydáním verze umožňující upgrade přímo ze System -> Packages -> Check for updates mi updatování mé MikroTikové školky trvalo i několik hodin, takže tahle featura pro mě byla dar z nebes.

Udělej si sám


Co už ale tak úžasné nebylo, byl nápad mého kolegy celou operaci upgrade kompletně automatizovat. Nejprve jsem jeho nadšení nesdílel, protože se mi mnohokrát při update skrze vlastní Auto Upgrade server stalo, že některé balíčky přišly poškozené nebo v lepším případě nepřišly vůbec. Po pár verzích ručního obliklávání Download & Upgrade jsem však zjistil, že upgrade přímo z FTP serverů MikroTiku je mnohem spolehlivější než domácí autoupgrade server a protože moc dobře znám kolegovy skriptovací schopnosti, v rámci zachování přátelství a jeho vlastního života jsem mu autoupgrade skript napsal. V podobném duchu jsem pak stvořil i skript pro automatizované zálohování a odesílání záloh na e-mail, protože přetahovat myškou soubory z nějakých 250 zařízení je perfektním začátkem cesty na psychiatrickou léčebnu.

Nastavení e-mailu


Prvním krokem je nastavení mailového klienta na MikroTiku. Víte-li tedy IP cílového serveru, na kterém sedí vaše schránka, můžete mu jej zadat přímo (můj případ). V opačném případě budete pravděpodobně potřebovat uživatelské jméno a heslo, které MikroTik použije k SASL ověření, aby mu zadaný server povolil odeslat mail dále do internetu.

/tool e-mail
set address=12.34.56.78 from=mikrotik@dasm.cz

Záloha


Zálohovací skript vyrobí jak plnou zálohu (*.backup), tak i export nastavení v textové formě (*.rsc) a oboje pošle na zadanou e-mailovou adresu. Omezení MikroTiku bohužel neumožňuje přiložit více souborů k jednomu e-mailu, takže MikroTik posílá maily dva. V mailu ještě vyzvoní co že je vlastně za typ RouterBoardu a jakou má verzi RouterOSu a RouterBootu.

:local identity [/system identity get name]
:local date [/system clock get date]

/system backup save name=$identity
:delay 10
export file=$identity
:delay 10

:local mailbody ("Identity: " . $identity . "\r\nBoard name: " . [/system resource get board-name] . "\r\nRouterOS version: " . [/system resource get version] . "\r\nFirmware version: " . [/system routerboard get current-firmware])

/tool e-mail send to=admin@dasm.cz subject=($identity . " - Backup") body=$mailbody file=($identity . ".backup")
/tool e-mail send to=admin@dasm.cz subject=($identity . " - RSC") body=$mailbody file=($identity . ".rsc")

Upgrade RouterOSu


Tento skriptík drze využívá featur v /system package update, takže pojede pouze na novějších verzích RouterOSu (tuším 5.20+). Napřed se koukne, zda je k dispozici nová verze a pokud shledá, že se je schopen připojit k update serveru a že se stávající verze liší, spustí proces upgradu. V tom nejprve balíčky stáhne, pak pošle mail o tom, že proběhl upgrade, včetně čísel verzí a nakonec MikroTika rebootne.

/system package update check-for-update
:delay 10

:local identity [/system identity get name]
:local current [/system package update get current-version]
:local latest [/system package update get latest-version]

:if ([:tostr $latest] != "" && $current != $latest) do={
    /system package update download
    :delay 50
    :local mailbody ("Identity: " . $identity . "\r\nBoard name: " . [/system resource get board-name] . "\r\nFrom version: " . $current . "\r\nTo version: " . $latest)
    /tool e-mail send to=admin@dasm.cz subject=($identity . " - RouterOS has been upgraded") body=$mailbody
    :delay 3
    /system reboot
}

Upgrade RouterBootu


A aby byla automatizace dokonalá, updatuje se sám i RouterBoot. Podobným mechanismem jako výše zjistí, zda se stávající a nejnovější verze liší a spustí proces upgrade. Naneštěstí spuštění

/system routerboard upgrade

Vysype do logu informativní hlášku o tom, že se upgrade podařil, ale milý MikroTik chápe jakýkoliv výstup jako chybu a skript zastaví i přesto, že upgrade proběhl v pořádku. Proto skript pro upgrade musí být rozdělen na dvě části, z nichž jedna obstará veškerou logiku a druhá otrocky spustí příkaz pro upgrade (v mém případě se skript pro faktický upgrade jmenuje „upgrade-fw-do“). V takovém případě „selže“ pouze část obstarávající upgrade a ne celý skript. Alternativním řešením by bylo strčit upgrade na konec a MikroTik nerestartovat.

:local identity [/system identity get name]
:local current [/system routerboard get current-firmware]
:local latest [/system routerboard get upgrade-firmware]

:if ($current != $latest) do={
    /system script run upgrade-fw-do
    :delay 10
    :local mailbody ("Identity: " . $identity . "\r\nBoard name: " . [/system resource get board-name] . "\r\nFrom version: " . $current . "\r\nTo version: " . $latest)
    /tool e-mail send to=admin@dasm.cz subject=($identity . " - Firmware has been upgraded") body=$mailbody
    :delay 3
    /system reboot
}

All-in-one


A nakonec si můžete celou hromádku skriptů stáhnout jako importovatelný RSC, včetně nastavení scheduleru. Nezapomeňte si změnit mailovky a adresu serveru.