MIKROTIK AUTOMATIC WIFI SCRIPT
MIKROTIK ON/OFF WIFI AUTOMATICO
In questo articolo vedremo come gestire l’accensione e lo spegnimento del WiFi del vostro Router Mikrotik in maniera automatica con pianificazione settimanale con differenti orari giornalieri mediante lo script “Mikrotik Automatic WiFi Script”.
Nei giorni scorsi, un utente del Gruppo Mikrotik Italia su Telegram ha postato un quesito che mi ha incuriosito.
Il messaggio diceva:
Buona domenica a tutti ragazzi, una domanda: ho uno scheduler in ROS che disabilita il wifi la notte e lo riattiva la mattina. Mi è stato chiesto il sabato e la domenica di disattivare e riattivare ad un orario diverso rispetto al Lunedi-Venerdi e qui non so come fare. Dovrei settare l’attuale scheduler per funzionare 5 giorni la settimana consecutivamente (Lun-Ven) e il secondo ogni Sabato e Domenica ma non mi viene in mente un modo.. Attualmente sono due semplici schedulazione che si ripetono ogni giorno…
Tra le varie soluzioni sono state proposti vari Scheduler concatenati che partendo da un giorno certo andavano ad attivarsi e disattivarsi in maniera sincronizzata rendendo macchinosa la gestione.
Di conseguenza ho provato a documentarmi per capire se ci fosse un metodo più semplice per gestire il tutto con un unico script.
Dalla versione 7.10 è stato modificato il formato data in RouterOS allineandolo allo standard ISO. Per cui la data ora si presenta nel formato AAAA/MM/DD.
Pare che su Mikrotik non ci sia nativamente una funzione per risalire al giorno della settimana. L’unico menu in cui ho trovato i giorni è il menu Kid Control.
Come calcolare il giorno della settimana partendo da una data in formato ISO??
Si può fare con la Congruenza di Zeller, che si basa su un algoritmo ideato da Christian Zeller nel XIX secolo per calcolare il giorno della settimana per qualsiasi data del calendario giuliano o gregoriano, basato sulla conversione fra il giorno giuliano e la data del calendario.
Per il calendario gregoriano, la congruenza di Zeller prende la forma seguente:
La formula per il calendario giuliano è:
Dove:
- h è il giorno della settimana (dove 0 = sabato, 1 = domenica, 2 = lunedì, …, 6 = venerdì);
- q è la cifra indicante il giorno del mese;
- m è il la cifra indicante il mese, contando però i mesi da 3 a 14, a partire da marzo e terminando con febbraio (3 = marzo, 4 = aprile, 5 = maggio, …, 14 = febbraio)
- K l’anno del secolo (le ultime due cifre dell’anno, ovvero ⌊ a n n o mod 1 00 ⌋ ) considerando però l’anno iniziato a marzo (vedi sotto).
- J è il secolo a base zero (cioè a n n o / 100 ). Ad esempio: i secoli in base zero per il 1995 e il 2000 sono rispettivamente 19 e 20;
- l’operatore parte intera (o floor) ⌊ . . . ⌋ (da non confondere con le parentesi quadre [ ] ) indica che solo la parte intera minore deve essere considerata;
- a mod b si riferisce all’operazione modulo, e indica il resto dopo la divisione.
In questo algoritmo, gennaio e febbraio vengono conteggiati come tredicesimo e quattordicesimo mese dell’anno precedente. Ad esempio, per il 2 febbraio 2010, l’algoritmo conta la data come il secondo giorno del quattordicesimo mese del 2009 (14/02/2009 nel formato GG/MM/AAAA)
Nel nostro caso utilizzeremo la prima espressione.
Qui di seguito, troverete uno script da copiare sul terminale Mikrotik. Esso andrà automaticamente in esecuzione ogni 5 minuti, calcolerà il giorno esegue un confronto tra l’ora attuale e la pianificazione che avete inserito nei vari giorni sulle variabili in testa allo script.
Se l’ora attuale è maggiore dell’orario corrispondente al giorno attuale viene eseguita la pianificazione secondo gli orari che avete inserito.
Apri il menù New Terminal sul Router Mikrotik e incolla il seguente script:
/system script
add dont-require-permissions=yes name=automatic-wifi-script owner=installer policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#----------------------------------------\r\
\n# AUTOMATIC SCHEDULER WIFI\r\
\n# \r\
\n# Version: 1.0\r\
\n# RouterOS v.7.16.1\r\
\n# Created: 15/04/2024\r\
\n# Updated: --/--/----\r\
\n# Author: Fois Fabio\r\
\n# Editor: Fois Fabio\r\
\n# Website: https://foisfabio.it\r\
\n# Email: consulenza@foisfabio.it\r\
\n#\r\
\n#----------------------------------------\r\
\n{\r\
\n#PERSONALIZZA LE VARIABILI SEGUENTI\r\
\n\r\
\n:local MondayEnable \"09:00:00\"\r\
\n:local MondayDisable \"19:00:00\"\r\
\n:local TuesdayEnable \"09:00:00\"\r\
\n:local TuesdayDisable \"19:00:00\"\r\
\n:local WednesdayEnable \"09:00:00\"\r\
\n:local WednesdayDisable \"19:00:00\"\r\
\n:local ThursdayEnable \"09:00:00\"\r\
\n:local ThursdayDisable \"19:00:00\"\r\
\n:local FridayEnable \"09:00:00\"\r\
\n:local FridayDisable \"19:00:00\"\r\
\n:local SaturdayEnable \"10:00:00\"\r\
\n:local SaturdayDisable \"13:00:00\"\r\
\n:local SundayEnable \"10:00:00\"\r\
\n:local SundayDisable \"13:00:00\"\r\
\n\r\
\n\r\
\n#-------------------------------------------------------------------------------------------\r\
\n#NON MODIFICARE LA PARTE SEGUENTE\r\
\n\r\
\n#----------------------------------------\r\
\n\r\
\n:local NameScript \"automatic-wifi-script\"\r\
\n:local NameScheduler \"automatic-wifi-scheduler\"\r\
\n:local IntervalTime \"00:05:00\"\r\
\n\r\
\n#----------NO MODIFY THIS SECTION----------\r\
\n\r\
\n\r\
\n#CREA LO SHEDULER SE NON ESISTE\r\
\n\r\
\n:if ([:len [/system scheduler find name=\"\$NameScheduler\"]] = 0) do={\r\
\n /log error \"[\$NameScript] Alert : lo Scheduler non esiste. Creo lo scheduler\";\r\
\n /system scheduler add name=\$NameScheduler interval=\$IntervalTime start-date=Jan/01/1970 start-time=startup on-event=\"/system script run \$NameScript\"\r\
\n /log warning \"[\$NameScript] Alert : Scheduler creato .\"\r\
\n }\r\
\n\r\
\n:local date [/system clock get date]\r\
\n:local daytbl [:toarray \"sat,sun,mon,tue,wed,thu,fri\"]\r\
\n\r\
\n:local month [:tonum [:pick \$date 5 7]]\r\
\n:local day [:tonum [:pick \$date 8 10]]\r\
\n:local year [:tonum [:pick \$date 0 4]]\r\
\n:put \"date is \$date\"\r\
\n:put \"year is \$year\"\r\
\n:put \"q is \$day (day)\"\r\
\n\r\
\n\r\
\n# Correzione per gennaio e febbraio\r\
\n:if (\$month = 1 || \$month = 2) do={\r\
\n :set month (\$month + 12)\r\
\n :set year (\$year - 1)\r\
\n}\r\
\n\r\
\n:put \"m is \$month (month)\"\r\
\n:local K [:tonum [:pick \$year 2 4]] \r\
\n:local J (\$year / 100)\r\
\n:put \"K is \$K\"\r\
\n:put \"J is \$J\"\r\
\n\r\
\n# Calcolo del giorno della settimana usando divisione intera\r\
\n:local h ([:tonum (\$day + ((13 * (\$month + 1)) / 5) + \$K + (\$K / 4) + (\$J / 4) - (2 * \$J))])\r\
\n:put \"h is \$h\"\r\
\n\r\
\n\r\
\n\r\
\n# Calcolo del modulo 7 manualmente\r\
\n:local div7 [:tonum (\$h / 7)] \r\
\n:local hmodulo (\$h - (\$div7 * 7))\r\
\n\r\
\n# Correggere risultati negativi\r\
\n:if (\$hmodulo < 0) do={ :set hmodulo (\$hmodulo + 7) }\r\
\n\r\
\n# Mappatura dei giorni della settimana\r\
\n:local result [:pick \$daytbl \$hmodulo]\r\
\n\r\
\n\r\
\n:put \"Today is \$result\"\r\
\n\r\
\n#------------------------------------------------------------------------\r\
\n:local currentTime [/system clock get time]\r\
\n:local currentHour [:tonum [:pick \$currentTime 0 2]]\r\
\n:local currentMinute [:tonum [:pick \$currentTime 3 5]]\r\
\n\r\
\n:put \$currentHour\r\
\n:put \$currentMinute\r\
\n\r\
\n:local enableTime \"\"\r\
\n:local disableTime \"\"\r\
\n:if (\$result = \"mon\") do={\r\
\n :set enableTime \$MondayEnable\r\
\n :set disableTime \$MondayDisable\r\
\n} else={\r\
\n :if (\$result = \"tue\") do={\r\
\n :set enableTime \$TuesdayEnable\r\
\n :set disableTime \$TuesdayDisable\r\
\n } else={\r\
\n :if (\$result = \"wed\") do={\r\
\n :set enableTime \$WednesdayEnable\r\
\n :set disableTime \$WednesdayDisable\r\
\n } else={\r\
\n :if (\$result = \"thu\") do={\r\
\n :set enableTime \$ThursdayEnable\r\
\n :set disableTime \$ThursdayDisable\r\
\n } else={\r\
\n :if (\$result = \"fri\") do={\r\
\n :set enableTime \$FridayEnable\r\
\n :set disableTime \$FridayDisable\r\
\n } else={\r\
\n :if (\$result = \"sat\") do={\r\
\n :set enableTime \$SaturdayEnable\r\
\n :set disableTime \$SaturdayDisable\r\
\n } else={\r\
\n :if (\$result = \"sun\") do={\r\
\n :set enableTime \$SundayEnable\r\
\n :set disableTime \$SundayDisable\r\
\n }\r\
\n }\r\
\n }\r\
\n }\r\
\n }\r\
\n }\r\
\n}\r\
\n:local enableHour [:tonum [:pick \$enableTime 0 2]]\r\
\n:local enableMinute [:tonum [:pick \$enableTime 3 5]]\r\
\n:local disableHour [:tonum [:pick \$disableTime 0 2]]\r\
\n:local disableMinute [:tonum [:pick \$disableTime 3 5]]\r\
\n\r\
\n:put \$enableHour\r\
\n:put \$enableMinute\r\
\n:put \$disableHour\r\
\n:put \$disableMinute\r\
\n\r\
\n:put \"Giorno rilevato \$result orario on \$enableTime - orario off \$disableTime\"\r\
\n\r\
\n:local enableFlag false\r\
\n:if ((\$currentHour > \$enableHour) or ((\$currentHour = \$enableHour) and (\$currentMinute >= \$enableMinute))) do={\r\
\n :if ((\$currentHour < \$disableHour) or ((\$currentHour = \$disableHour) and (\$currentMinute <= \$disableMinute))) do={\r\
\n :set enableFlag true\r\
\n }\r\
\n}\r\
\n:foreach i in=[/interface find where name~\"wlan\" || name~\"wifi\"] do={\r\
\n :local interfaceName [/interface get \$i name]\r\
\n :put (\"Interfaccia trovata: \" . \$interfaceName)\r\
\n\r\
\n# Abilita o disabilita il Wi-Fi in base al risultato\r\
\n:if (\$enableFlag = true) do={\r\
\n /interface enable \$interfaceName\r\
\n} else={\r\
\n /interface disable \$interfaceName\r\
\n}\r\
\n}\r\
\n}\r\
\n"
:delay 1s;
/system script run "automatic-wifi-script"
:delay 1s;
Dopo aver incollato lo script vai nel menu /System Script e apri lo script: “automatic-wifi-script” si presenterà in questa maniera:
Modifica le varibili evidenziate prestando attenzione a non corrompere la sintassi.
Ora lo script attiverà e disattiverà in automatico il WiFi secondo la pianificazione da voi inserita.
Ti è piaciuta questa guida MIKROTIK AUTOMATIC WIFI SCRIPT?
Scrivi il tuo parere nei commenti o contattami attraverso la sezione Contatti.
Puoi supportare foisfabio.it con una piccola donazione oppure commenta e condividi questo contenuto.
Hai riscontrato errori in questa guida?? segnalacelo tramite la scheda CONTATTI
Guida redatta da Fabio Fois.
Copyright © 2024 foisfabio.it | Powered by Fabio Fois
Quanto è stato utile questo post?
Clicca su una stella per valutarla!
Voto medio 0 / 5. Conteggio dei voti: 0
Nessun voto finora! Sii il primo a valutare questo post.