BACKUP MikroTik

W urządzeniach MikroTik jak i w wirtualnych systemach z tą platformą jest możliwość tworzenia skryptów oraz ich wyzwalania przez 'scheduler’. Posiada on wbudowanego klienta poczty umożliwiającego wysyłanie maili oraz możliwość połączeń FTP. Właśnie korzystając z tych funkcji postaramy się zbudować skrypt tworzący kopię, wysłać kopie mailem oraz przekazać na FTP. Nie będzie to jednak gotowy do zastosowania pełny skrypt i zostawię dla waszej inwencji twórczej pewne elementy o których wspomnę na końcu.

Możemy wykonać kopię konfiguracji na dwa sposoby, do pliku ’.backup’ i ’.scr’. Pierwszy ’.backup’ to plik binarny którego nie można odczytać a jedynie odtworzyć na bliźniaczym urządzeniu, drugi zaś to plik teksasowy gdzie zawierające komendy które należy wydać na w wierszu poleceń by odtworzyć konfigurację.

Jak zawsze w rożnego rodzaju skryptach przydatne są 'zmienne’ i przyporządkowanie im wartości. Są dwa rodzaje globalne i lokalne i mogą to być zmienne liczbowe i znakowe, różnica jest niewielka. Każdy język ma swoją specyficzną konstrukcje i w skryptach dla MikroTik wygląda to następująco:

:global zGlobStr "8.8.8.8"
:global zGlobInt 88
:local zLocStr "aaa"
:local zLocInt 256

Jak widać różnica jest niewielka między typami zmiennych, należy pamiętać iż globalną można przekazywać do poleceń, zaś lokalne tylko wewnątrz skryptu.

Kolejnym tematem jest pobieranie danych i umieszczanie ich w zmiennych i ewentualna ich zmienianie. W poniższym przykładzie pobierzemy sobie aktualny czas i wyciągając godzinę, minuty i sekundy z pominięciem dwukropka poleceniem :pick wstawimy kropkę:

# get time
:local ts [/system clock get time]
:set ts ([:pick $ts 0 2].[:pick $ts 3 5].[:pick $ts 6 8])

W powyższym przykładzie użyliśmy linii komentarza która zaczyna się od znaku #. Pobraliśmy wartość TIME z zegara urządzenia używając metody GET co umożliwiło nam podstawienie tej wartości do zmiennej. W wierszu pleceń wykonanie komendy /system clock get time nie daje rezultatu żadnego jednak gdy wykonamy polecenie /system clock print zobaczymy jakie wartości możemy pobrać metodą GET. Należy też zauważyć iż przy wykonywaniu pobrania danych czy ich przetwarzaniu umieszczamy w nawiasie krawatowym [..].

Możemy też pobrać utworzyć zmienną z ciągiem znaków i w tekście umieścić pobranie danych z urządzenia, będzie to przydatne w tworzeniu treści maila który chcemy wysłać a by uniknąć krzaków w mailu zakodowanym w UTF8 musimy użyć ich odpowiednika dla ANSI:

:local  MBODY ("Od ostatniego restartu urządzenia mineło: ".[/system resource get uptime]."\nDane urządzenia:\n".[/system resource get board-name])

Mając już te podstawy możemy sobie przygotować skrypt tworzący wszytkie elementy potrzebne do zadeklarowania zmiennych w których zawarte będą dane wymagane do wysłania maila, przesłania pliku na serwer FTP i określenia jak się nazywać pliki.

:global  IP "domena.pl"
:global  PORT "12021"
:global  USER "backupuser"
:global  PASS "backuppass"
:global  MSERVER "poczta.int.pl"
:global  MPORT 587
:global  MLOGIN "mt.backup@mail.serwer.send.pl"
:global  MAILTO "backup@mail.docelowy.pl"
:local  MBODY ("Od ostatniego restartu urządzenia mineło: ".[/system resource get uptime]."\nDane urządzenia:\n".[/system resource get board-name]." (".[/system resource get architecture-name]."), wersja: ".[/system resource get version].", oprogramowanie fabryczne: ".[/system resource get factory-software]."\nCPU: ".[/system resource get cpu].", procesorów: ".[/system resource get cpu-count].", częstotliowść: ".[/system resource get cpu-frequency]." (obciążenie: ".[/system resource get cpu-load]." %)\nRAM: całkowity: ".([/system resource get total-memory]/1048576)." MB (".([/system resource get total-memory]/1024)." kB), wolme: ".([/system resource get free-memory]/1048576)." kB (".([/system resource get free-memory]/1024)." kB)\nHDD: całkowity: ".([/system resource get total-hdd-space]/1048576)." MB (".([/system resource get total-hdd-space]/1024)." kB), wolme: ".([/system resource get free-hdd-space]/1048576)." MB (".([/system resource get free-hdd-space]/1024)." kB)")

# months array
:local months ("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec");

# get time
:local ts [/system clock get time]
:set ts ([:pick $ts 0 2].[:pick $ts 3 5].[:pick $ts 6 8])

# get Date
:local ds [/system clock get date]

# convert name of month to number
:local month [ :pick $ds 0 3 ];
:local mm ([ :find $months $month -1 ] + 1);
:if ($mm < 10) do={ :set mm ("0" . $mm); }

# set $ds to format YYYY-MM-DD
:set ds ([:pick $ds 7 11] . $mm . [:pick $ds 4 6])

# file name for system backup - file name will be BCKP-servername-date-time.backup
:local fname1 ("BACKUP-".[/system identity get name]."-".$ds."-".$ts.".backup")

# file name for config export - file name will be BCKP-servername-date-time.rsc
:local fname2 ("BACKUP-".[/system identity get name]."-".$ds."-".$ts.".rsc")

Wszytko już mamy w zmiennych. Przystępujemy więc do stworzenia dwóch rodzajów pliku typu BACKUP i SRC równocześnie wysyłając do logów info o dokonywanej operacji:

:log info "Backup Please wait...!!!"
/system backup save name="$fname1" 
:log info "Export Please wait...!!!"
/system export compact file="$fname2"

Pliki stworzone i zapisane na urządzeniu, następuje kolejny krok czyli przekazanie ich mailem oraz na serwer FTP. Warto pamiętać iż operacja wysłania maila czy też przesłania pliku na serwer FTP trwa jakiś czas zaś sam skrypt nie czeka na zakończenie operacji a przetwarza kolejne linie skryptu. W celu uniknięcia nakładania się na siebie operacji wykonywanych równocześnie, warto jest dać opóźnienie wykonania kolejnych linii skryptu, dokonujemy tego dodając polecenie :delay i czas opóźnienia:

:log info "Sending Backup and Export Mikrotik to mail............."
#/tool e-mail send to=$MAILTO subject=("Urządzenie własne: ".[/system identity get name]." Backup i Export OK") from=$MLOGIN port=$MPORT file="$fname1, $fname2" server=$MSERVER body=$MBODY
#:delay 10s
 
:delay 5s
:log info "Sending Backup Mikrotik to FTP Server............."
/tool fetch address=$IP src-path="$fname1" user=$USER password=$PASS port=$PORT upload=yes ascii=no mode=ftp dst-path="/DATA/BACKUP/$fname1"
:log info "Sending Export Mikrotik to FTP Server............."
/tool fetch address=$IP src-path="$fname2" user=$USER password=$PASS port=$PORT upload=yes ascii=no mode=ftp dst-path="/DATA/BACKUP/$fname2"
:delay 10s

W przypadku maila indywidualne nazwy plików kopii nie stanową problemu gdyż każdy mail i tak jest osobny jednak przy przesyłaniu plików na FTP szybko może się okazać że miejsce się skończy i kolejne pliki nie będą się przesyłać. Dla pobiegnięcia takiej sytuacji można zapobiec temu po przez na przykład nadpisywanie plików na FTP ma to jednak znaczące wady gdyż na FTP zawsze mamy tylko ostatnią wykonaną kopię, jednak mając też maile zawsze możemy wyciągnąć starszą kopię z maila. Stosując tą metodę musimy dodać dodatkowe zmienne gdzie wysyłany plik będziemy nazywać inaczej niż mamy go na urządzeniu:

# DODAJEMY:
# file name for system backup - file name will be BCKP-servername.backup
:local fname1o ("BACKUP-".[/system identity get name].".backup")

# file name for config export - file name will be BCKP-servername.rsc
:local fname2o ("BACKUP-".[/system identity get name].".rsc")


# MODYFIKUJEMY CZEŚĆ ODPOWIADAJĄCĄ ZA WYSŁANIE NA FTP:
:delay 5s
:log info "Sending Backup Mikrotik to FTP Server............."
/tool fetch address=$IP src-path="$fname1" user=$USER password=$PASS port=$PORT upload=yes ascii=no mode=ftp dst-path="/DATA/BACKUP/$fname1o"
:log info "Sending Export Mikrotik to FTP Server............."
/tool fetch address=$IP src-path="$fname2" user=$USER password=$PASS port=$PORT upload=yes ascii=no mode=ftp dst-path="/DATA/BACKUP/$fname2o"
:delay 10s

Mamy kopię na mailu i na serwerze, jednak mamy ją też na urządzeniu które nie ma zbyt wiele przestrzeni i kolejne wykonywanie tego samego skryptu będzie powodować iż zapełni nam się miejsce na urządzeniu co skutkować będzie niewykonaniem się skryptu a więc brak kopii na mailu i na FTP. Rozwiążemy ten problem usuwając na koniec pliki z lokalnego urządzenia:

:log info "Deleting Backup Files"
/file remove "$fname1"
/file remove "$fname2"
:log info "Successfully removed Temporary Backup Files"
:delay 1
:log info "Finished Backup Script...!!!!"

W zasadzie mamy już kompletny skrypt do umieszczenia na urządzeniu. Oczywiście jest to jedna z metod wykonania kopii i usuwania plików. Można podejść do tematu też inaczej, stworzyć plik bez daty i te pliki wysyłać na FTP i maila, wtedy kod się nieco skróci i kopia na urządzeniu będzie się nadpisać, choć do tego nadpisywania automatycznego nie jestem przekonany czy urządzenie pozwoli bez potwierdzenia nadpisać plik, możecie jednak poeksperymentować.

Sam skrypt umieszczony to jeszcze nie koniec bo należy go wywalać co określony czas. Tu z pomocą przychodzi nam Sheduler i możliwość ustawienia wyzwalacza. Załóżmy że skrypt nazwaliśmy 'FTPbackup’, więc w deklarując wyzwalacz musimy ten skrypt wywołać po nazwie:

/system script run FTPbackup

Dodanie takiego wyzwalacza z wierszy poleceń wygląda następująco:

/system scheduler
add interval=1w name=Email-backup-send on-event=\
    "/system script run FTPbackup\r\
    \n" policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive \
    start-date=aug/28/2020 start-time=00:15:00

Warto tu zaznaczyć że datę zaznaczoną na żółto musimy wprowadzić przyszłą a nie minioną zaś interval zaznaczony na niebiesko to 1 tydzień (1w = 1 weekend) czyli od wskazanego dnia i godziny co tydzień będzie wywoływany wcześniej utworzony skrypt o nazwie FTPbackup. Mamy tu też element policy które w tym przypadku nie były ustawiane, ale można wykonywać skrypt na określonym użytkowniku z określonymi prawami. Ma to swoje uzasadnienie, otóż kopia backup tworzona na użytkowniku przy próbie odtworzenia jej na innym użytkowniku lub na innym urządzeniu, będzie prosił o podanie hasła które będzie wspólne dla użytkownika na którym kopia była wykonana. Jeśli mamy wiele urządzeń i kto inny ma odtwarzać kopię, a kopia została wykonana na naszym użytkowniku z hasłem własnym które jest wspólne dla wielu urządzeń to kiepsko by wyglądało oddanie pliku BACKUP i podaniu hasła którego nie należy przekazywać, więc tworzymy odrębnego użytkownika z hasłem bez praw do zarządzania ale z minimalnymi prawami do wykonania kopii i przesłania jej zbudowanym skryptem i gdy przyjdzie potrzeba przekazania hasła mimo że będzie wspólne dla wielu urządzeń nie ryzykujemy że ktoś zaloguje się na inne urządzenie znając hasło. Można też przechowywać gdzieś listę haseł dla poszczególnych urządzeń a w treści maila podać oznaczenie hasła to już wasza decyzja i inwencja twórcza.

Opublikowano w BACKUP, INFORMATYKA, MikroTik, SKRYPT i oznaczono , , .