Come servizio DDNS utilizzo DynDNS.com e per verificare l'indirizzo pubblico con cui accedo a internet (questo perchè anzichè un router 3G potrei avere un router dietro un firewall o un altro router) utilizzo il servizio di "myip".
L'interfaccia PPP (scheda 3G) viene chiamata con molta fantasia "3G": inizialmente vado a controllare che sia vista la porta USB (a volte capita che la porta USB sia "invalida") e usata dall'interfaccia PPP chiamata "3G".
Poi vado a controllare che l'interfaccia 3G sia connessa (a volte è "running" ma non ho connettività con l'esterno).
In caso di problemi viene riavviato il router.
Script "DDNS_params" che serve a caricare i parametri del servizio DDNS (in questo caso DynDNS) e possono essere trovati sul sito.
L'hostname è composto dal parametro "identity" della routerboard + un siffisso (in questo caso .dyndns.org).
- Codice: Seleziona tutto
# questo file contiene i parametri per l'utilizzo del servizio con DynDNS.com
:global DDNSserver
:global username
:global password
:global DDNShost
:global suffisso "dyndns.org"
:set username "oscardabbagno"
:set password "marameo99"
:set DDNSserver "members.dyndns.org"
:set DDNShost $DDNSserver
Script "ResolveHostName" che serve a risolvere l'hostname associato al servizio DDNS:
- Codice: Seleziona tutto
:global ResolvedIP
:global DDNShostname ""
:global suffisso
:set DDNShostname (([/sys iden get name]).".".$suffisso)
:set ResolvedIP [/resolve $DDNShostname]
Schedule "Resolve_HostName": a volte con il comando /resolve "www.google.com" non funziona al primo colpo e mi ritorna una stringa vuota, oppure il DNS non è registrato, quindi ho pensato di chiamare lo script "ResolveHostName" in continuazione (a intervalli di 5 secondi), finchè non vedo che ha risolto l'indirizzo (in realtà questo schedule viene abilitato all'interno di un altro script e disabilitato quando viene risolto il DNS o comunque dopo un certo intervallo di tempo).
- Codice: Seleziona tutto
Resolve_HostName
Start Time: startup
Interval: 00:00:05
On Event: resolveHostName
Script "DDNS" che effettua tutte le operazioni:
- Codice: Seleziona tutto
:global Interfaccia3G "3G"
:global USBport false
:global DDNShostname
:global DDNSserver
:global username
:global password
:global FoundIP
:global ddnsIP
:global currentIP
:global ResolvedIP ""
:global PublicIP ""
:global globalresult
# numero di tentativi che faccio per controllare se il modem è connesso
:global checkCounter 30
# controllo se trovo la porta USB assegnata all'interfaccia 3G
:log info ("[DDNS3] avvio script...")
:put ("\r\n - controllo presenza modem 3G...")
:foreach i in=[/inter ppp-client find] do={
:local interfaccia;
:set interfaccia [/inter ppp-client get $i name]
:if ($interfaccia = $Interfaccia3G) do={
:put ("Trovata interfaccia PPP-client 3G...")
:if ([/inter ppp-client get $i disabled] = true) do={
/inter ppp-cli enable $i
}
:if ([/inter ppp-client get $i disabled] = false) do={
:put ("\t...abilitata")
:foreach i in=[/port find] do={
:local porta;
:set porta [/port get $i used-by]
:if ($porta = "PPP <3G>") do={
:set USBport true
}
}
# se non trovo la porta USB assegnata, allora riavvio la scheda
:if ($USBport = false) do={
:put ("\r\n\tReboot due to USB port not available...")
:delay (3s)
/sys reboot
}
}
}
}
# se arrivo qui è perchè ho una interfaccia USB assegnata a una ppp-client 3G abilitata
:put ("carico i parametri DynDNS....")
/sys scri run [find name="DDNS_params"]
:put ("carico l'hostname...")
:if (true) do={
# ho rilevato la presenza del modem, adesso vado a verificare se c'è il collegamento
:global contatore 0
:do {
:put (" - verifica collegamento modem 3G...")
:set FoundIP false
:foreach i in=[/ip address find] do={
:local porta;
:set porta [/ip address get $i interface]
:if ($porta = "3G") do={
:set FoundIP true
:set ddnsIP [/ip address get $i address]
:set currentIP [:pick $ddnsIP 0 [:find $ddnsIP "/"]]
}
}
:if ($FoundIP = false) do={
:delay 4s;
}
:set contatore ($contatore +1);
} while=(contatore < $checkCounter and ($FoundIP = false));
:if ($FoundIP = true) do={
# ho la connessione internet, adesso devo andare a risolvere l'host
:put ("trying to resolve hostname ".$DDNShostname."...")
/system scheduler enable [find name="Resolve_HostName"]
:set contatore 0
:do {
:put ("\t\tresolving...")
:set ResolvedIP ""
:if ($ResolvedIP = "") do={
:delay (6s)
}
:set contatore ($contatore +1);
} while=(contatore < $checkCounter and ($ResolvedIP = ""));
/system scheduler disable [find name="Resolve_HostName"]
:put ("\r\n - resolved hostname: ".$ResolvedIP)
:put ("\r\nadesso vado a controllare il mio indirizzo ip pubblico")
:set contatore 0
:do {
:set PublicIP ""
:if ([/file find name="mypublicip.txt"] != "") do={
/file remove [/file find name="mypublicip.txt"]
}
/tool fetch url="http://myip.dnsomatic.com/" mode=http dst-path=mypublicip.txt
:if ([/file find name="mypublicip.txt"] != "") do={
:set PublicIP [/file get [/file find name="mypublicip.txt"] contents]
}
:if ($PublicIP = false) do={
:delay 4s;
}
:set contatore ($contatore +1);
} while=(contatore < $checkCounter and ($PublicIP = ""));
:put ("\r\n - public IP: ".$PublicIP)
#/tool fetch url="http://myip.dnsomatic.com/" mode=http dst-path=mypublicip.txt
:put ("\r\n\r\n\r\n")
:put ("Checking addresses...")
:if ($PublicIP != $ResolvedIP) do={
:put ("Address mismatch, updating...")
:set contatore 0
:global result
:do {
:set globalresult ""
:if ([/file find name="DDNSresult.txt"] != "") do={
/file remove [/file find name="DDNSresult.txt"]
}
:global DDNSpath ("/nic/update?hostname=".$DDNShostname."&myip=".$PublicIP)
:global tmp [/tool fetch mode=http port=80 address=$DDNSserver host=$DDNSserver src-path=($DDNSpath) user=($username) password=($password) dst-path="/DDNSresult.txt"]
:if ([/file find name="DDNSresult.txt"] != "") do={
:put ("DynDNS result: ".[/file get [/file find name="DDNSresult.txt"] contents])
}
:if ($PublicIP = false) do={
:delay 4s;
}
:set contatore ($contatore +1);
} while=(contatore < $checkCounter and ($PublicIP = ""));
} else={
:put ("IP addresses matching, no updating needed...")
}
} else={
# non ho la connessione internet
:put ("Assenza connessione internet, fine script")
}
# fine :if ([/file find name="hostname.txt"] != "") do={
} else={
:put ("\r\n\r\nhostname non valido, termino lo script!!!")
}
Per eseguire periodicamente lo script "DDNS" ogni 10 minuti:
- Codice: Seleziona tutto
schedule: DDNS
Start Time: startup
Interval: 00:10:00
On Event: /sys scri run [find name="DDNS"]
Per aggiornare lo script all'accensione:
- Codice: Seleziona tutto
schedule: startup
Start Time: startup
Interval: 00:00:00
On Event:
:delay 20s
:log info ("startuo script...")
/sys scri run [find name="DDNS"]