Scripting RouterOS: variabili, cicli e gestione errori
Guida pratica al linguaggio di scripting di RouterOS v7: variabili, array, condizioni :if, cicli :foreach e :for, funzioni, e gestione robusta degli errori con :do/on-error, per automazioni affidabili.
Il linguaggio di scripting di RouterOS permette di automatizzare praticamente qualsiasi operazione: failover, manutenzioni, notifiche, sincronizzazioni. Padroneggiarne le basi (variabili, cicli, condizioni e soprattutto la gestione degli errori) è il passo che separa uno script 'che a volte funziona' da un'automazione di produzione affidabile.
Variabili: :local, :global e tipi
# :local — visibile solo nello script/funzione corrente (usalo quasi sempre)
:local nome "CORE-NAPOLI-01"
:local soglia 90
:local attivo true
# :global — persiste tra script ed esecuzioni (usalo con parsimonia)
:global ultimoBackup [/system/clock get date]
# Interpolazione in stringhe e concatenazione
:local msg ("Router " . $nome . " soglia=" . $soglia)
:put $msg
# Conversioni di tipo esplicite
:local n [:tonum "42"]
:local s [:tostr 42]Condizioni :if con else
:local cpu [/system/resource get cpu-load]
:if ($cpu > 90) do={
:log warning "CPU critica: $cpu%"
} else={
:if ($cpu > 70) do={
:log info "CPU elevata: $cpu%"
} else={
# tutto ok, nessun log
}
}Cicli: :foreach, :for e :while
# :foreach — itera sugli ID restituiti da find (uso più comune)
# Esempio: logga ogni interfaccia che è down
:foreach i in=[/interface/find where running=no] do={
:local nome [/interface get $i name]
:log warning ("Interfaccia DOWN: " . $nome)
}
# :for — ciclo numerico
:for n from=1 to=5 do={
:put ("iterazione " . $n)
}
# :while — ripeti finché la condizione è vera (attento ai loop infiniti)
:local i 0
:while ($i < 3) do={
:put $i
:set i ($i + 1)
}Array e dizionari
# Array semplice
:local server {"0.it.pool.ntp.org"; "1.it.pool.ntp.org"}
:foreach s in=$server do={ :put $s }
# Array associativo (dizionario)
:local soglie {"cpu"=90; "mem"=20; "temp"=70}
:put ($soglie->"cpu")
# Numero di elementi
:put [:len $server]Gestione degli errori: :do { } on-error={ }
Senza gestione errori, un comando che fallisce (es. host irraggiungibile, file inesistente) interrompe lo script: nelle automazioni questo significa operazioni lasciate a metà. Il costrutto :do { ... } on-error={ ... } cattura l'errore e ti permette di reagire (loggare, riprovare, notificare).
# Prova a inviare un'email; se fallisce, logga invece di bloccare tutto
:do {
/tool/e-mail send to="noc@dominio.it" subject="Test" body="ok"
:log info "Email inviata con successo"
} on-error={
:log error "Invio email FALLITO, controllare /tool/e-mail"
}
# Retry: prova fino a 3 volte con pausa tra i tentativi
:local ok false
:for try from=1 to=3 do={
:if (!$ok) do={
:do {
/tool/fetch url="https://example.com/health" as-value output=user
:set ok true
} on-error={
:log warning ("Tentativo $try fallito, riprovo")
:delay 5s
}
}
}Funzioni riutilizzabili
# Definisci una funzione globale che logga e ritorna un valore
:global cpuAlta do={
:local soglia $1
:local cpu [/system/resource get cpu-load]
:if ($cpu > $soglia) do={
:log warning ("CPU oltre soglia: " . $cpu . "%")
:return true
}
:return false
}
# Richiamala passando un argomento posizionale
:put [$cpuAlta 80]:local salvo necessità reale di :global (le globali sopravvivono e creano effetti collaterali difficili da debuggare); (2) avvolgi nelle automazioni ogni operazione 'che può fallire' in :do/on-error; (3) logga con livelli sensati (:log info/warning/error) così il syslog racconta cosa è successo; (4) testa lo script con /system/script run PRIMA di metterlo nello scheduler; (5) assegna allo script solo le policy minime necessarie. Evita :delay lunghi negli script schedulati: bloccano lo scheduler.Continua con
Configura senza fatica con l'AI
In WispOS l'agente AI genera la configurazione RouterOS dalle tue parole e un tutor ti guida passo passo.
Prova WispOS