Indice   FAQ  
Iscriviti  Login
Indice RouterOS Wiki routerOSiTalia [GUIDE]

Script DynDns - Codice - Come eseguirlo

In questa sezione puoi trovare alcune guide su routerOS

Ti è stata utile questa guida?Dà il tuo giudizio

SI
7
88%
NO
0
Nessun voto
NON NE AVEVO BISOGNO
1
13%
 
Voti totali : 8

Re: Script DynDns - Codice - Come eseguirlo

Messaggioda El Berto » mar 4 mar 2014, 11:05

Magari a qualcuno può fare comodo: io utilizzo più apparati (RB411U o RB912 + scheda 3G) e imposto l'hostname come parametro "identity" della routerboard.
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"]
El Berto
Mikrotik-User 4° Liv
Mikrotik-User 4° Liv
 
Messaggi: 223
Iscritto il: lun 3 mag 2010, 11:15

Re: Script DynDns - Codice - Come eseguirlo

Messaggioda figheras » ven 11 apr 2014, 11:43

[SCRIPT AGGIORNATO]

Per versioni dalla 5.2x alla 6.x

Codice: Seleziona tutto
# INSERISCO LE VARIBILI
# MODIFICARE LE PRIME 4 RIGHE
:global ddnsuser "USER"
:global ddnspass "PASSWORD"
:global theinterface "INTERFACCIA PUBBLICA"
:global ddnshost "MIA-RETE.dyndns.org"
:global ipddns [:resolve $ddnshost];
:global ipfresh [ /ip address get [/ip address find interface=$theinterface ] address ]
:if ([ :typeof $ipfresh ] = nil ) do={
   :log info ("DynDNS: No ip address on $theinterface .")
} else={
   :for i from=( [:len $ipfresh] - 1) to=0 do={
      :if ( [:pick $ipfresh $i] = "/") do={
    :set ipfresh [:pick $ipfresh 0 $i];
      }
}

:if ($ipddns != $ipfresh) do={
    :log info ("DynDNS: IP-DynDNS = $ipddns")
    :log info ("DynDNS: IP-Fresh = $ipfresh")
   :log info "DynDNS: Update IP needed, Sending UPDATE...!"
   :global str "/nic/update\?hostname=$ddnshost&myip=$ipfresh&wildcard=NOCHG&mx=NOCHG&backmx=NOCHG"
   /tool fetch address=members.dyndns.org src-path=$str mode=http user=$ddnsuser \
         password=$ddnspass dst-path=("/DynDNS.".$ddnshost)
    :delay 1
    :global str [/file find name="DynDNS.$ddnshost"];
    /file remove $str
    :global ipddns $ipfresh
  :log info "DynDNS: IP updated to $ipfresh!"
    } else={
     :log info "DynDNS: dont need changes";
    }
}
Siamo tutti ignoranti. Ma non tutti ignoriamo le stesse cose! - Einstein -
Avatar utente
figheras
Staff rosIT
Staff rosIT
 
Messaggi: 1218
Iscritto il: sab 19 set 2009, 20:09
Uso routerOS dalla Versione: v2.9.x
Certificazioni Mikrotik: MTCNA, MTCRE, MTCWE
Altre certificazioni: Cisco CCNA, KalliopePBX
Preferred Training Centre: Grifonline

Re: Script DynDns - Codice - Come eseguirlo

Messaggioda faber » dom 4 mag 2014, 23:33

Scusate ma dyndns.org risulta essere a pagamento o mi sbaglio ?
Sarebbe utile modificare questo script per dyndns.it ???
Lo provo e vi dico.

Saluti.

Fabrizio
faber
Mikrotik Curious User
Mikrotik Curious User
 
Messaggi: 4
Iscritto il: mar 8 apr 2014, 21:17

Re: Script DynDns - Codice - Come eseguirlo

Messaggioda francoddi » ven 26 set 2014, 1:29

Ciao cosa metto per "interfaccia pubblica" ?
francoddi
Mikrotik Curious User
Mikrotik Curious User
 
Messaggi: 3
Iscritto il: lun 22 set 2014, 21:53

Re: Script DynDns - Codice - Come eseguirlo

Messaggioda francoddi » ven 26 set 2014, 22:07

Ho risolto da solo... nel mio caso era la PPPoe !!! :beer2:
francoddi
Mikrotik Curious User
Mikrotik Curious User
 
Messaggi: 3
Iscritto il: lun 22 set 2014, 21:53


Precedente

Torna a Wiki routerOSiTalia [GUIDE]

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti