# Dynamic DNS Update Script for dynDNS - MikroTik Script RouterOS

    in order to support dyndns i took some parts from the changeip script and made it work for.

    1) add a script called dynDNS:

    # Define User Variables
    :global ddnsuser "DYNDNSUSER"
    :global ddnspass "DYNDNSPASS"
    :global ddnshost "DYNDNSHOST"

    # Define Global Variables
    :global ddnsip
    :global ddnslastip
    :if ([ :typeof $ddnslastip ] = nil ) do={ :global ddnslastip "0" }

    :global ddnsinterface
    :global ddnssystem ("mt-" . [/system package get system version] )

    # Define Local Variables
    :local int

    # Loop thru interfaces and look for ones containing
    # default gateways without routing-marks
    :foreach int in=[/ip route find dst-address=0.0.0.0/0 active=yes ] do={
      :if ([:typeof [/ip route get $int routing-mark ]] != str ) do={
         :global ddnsinterface [/ip route get $int interface]
      }
    }

    # Grab the current IP address on that interface.
    :global ddnsip [ /ip address get [/ip address find interface=$ddnsinterface ] address ]

    # Did we get an IP address to compare?
    :if ([ :typeof $ddnsip ] = nil ) do={
       :log info ("DynDNS: No ip address present on " . $ddnsinterface . ", please check.")
    } else={
      :if ($ddnsip != $ddnslastip) do={
        :log info "DynDNS: Sending UPDATE!"
        :local str "/nic/update?hostname=$ddnshost&myip=$ddnsip&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
        :local str [/file find name="DynDNS.$ddnshost"];
        /file remove $str
        :global ddnslastip $ddnsip
      }
    }
    2) Add a scheduler entry to run every minute

    /system scheduler add name=dynDNS interval=00:01 on-event="/system script run dynDns\r"
    There is a thread for further questions.

    Getting it to work with 4.XX

    # Set needed variables
    :local username "YourUsername"
    :local password "YourPassword"
    :local hostname "nohostset"
    :global systemname [/system identity get name]

    :if ($systemname  = "Site1" ) do= {
    :set hostname "yourdomain1.dyndns.org"
    }
    :if ($systemname  = "Site2" ) do= {
    :set hostname "yourdomain2.dyndns.org"
    }
    :if ($systemname  = "Site3" ) do= {
    :set hostname "yourdomain3.dyndns.org"
    }

    :global dyndnsForce
    :global previousIP

    # print some debug info
    :log info ("UpdateDynDNS: username = $username")
    :log info ("UpdateDynDNS: password = $password")
    :log info ("UpdateDynDNS: hostname = $hostname")
    :log info ("UpdateDynDNS: previousIP = $previousIP")

    # get the current IP address from the internet (in case of double-nat)
    /tool fetch mode=http address="checkip.dyndns.org" src-path="/" dst-path="/dyndns.checkip.html"
    :local result [/file get dyndns.checkip.html contents]

    # parse the current IP result
    :local resultLen [:len $result]
    :local startLoc [:find $result ": " -1]
    :set startLoc ($startLoc + 2)
    :local endLoc [:find $result "

" -1] :local currentIP [:pick $result $startLoc $endLoc] :log info "UpdateDynDNS: currentIP = $currentIP" # Remove the # on next line to force an update every single time - useful for debugging, # but you could end up getting blacklisted by DynDNS! #:set dyndnsForce true # Determine if dyndns update is needed # more dyndns updater request details http://www.dyndns.com/developers/specs/syntax.html :if (($currentIP != $previousIP) || ($dyndnsForce = true)) do={ :set dyndnsForce false :set previousIP $currentIP /tool fetch user=$username password=$password mode=http address="members.dyndns.org" \ src-path="/nic/update?hostname=$hostname&myip=$currentIP" dst-path="/dyndns.txt" :local result [/file get dyndns.txt contents] :log info ("UpdateDynDNS: Dyndns update needed") :log info ("UpdateDynDNS: Dyndns Update Result: ".$result) :put ("Dyndns Update Result: ".$result) } else={ :log info ("UpdateDynDNS: No dyndns update needed") } If have problems to run these scripts, try it: `:local ddnsuser "your user name" :local ddnspass "your password" :local theinterface "device to renove IP" :local ddnshost "yourhost.dyndns.org" :local ipddns [:resolve $ddnshost]; :local 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...!" :local 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 :local 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"; } }` another version of this script working in 5.x `# Set needed variables :local username "YOURUSER" :local password "YOURPASWORD" :local hostname "YOURHOSTNAME.dyndns.org" :global dyndnsForce :global previousIP # print some debug info :log info ("UpdateDynDNS: username = $username") :log info ("UpdateDynDNS: password = $password") :log info ("UpdateDynDNS: hostname = $hostname") :log info ("UpdateDynDNS: previousIP = $previousIP") # get the current IP address from the internet (in case of double-nat) /tool fetch mode=http address="checkip.dyndns.org" src-path="/" dst-path="/dyndns.checkip.html" :delay 1 :local result [/file get dyndns.checkip.html contents] # parse the current IP result :local resultLen [:len $result] :local startLoc [:find $result ": " -1] :set startLoc ($startLoc + 2) :local endLoc [:find $result "" -1] :local currentIP [:pick $result $startLoc $endLoc] :log info "UpdateDynDNS: currentIP = $currentIP" # Remove the # on next line to force an update every single time - useful for debugging, # but you could end up getting blacklisted by DynDNS! #:set dyndnsForce true # Determine if dyndns update is needed # more dyndns updater request details http://www.dyndns.com/developers/specs/syntax.html :if (($currentIP != $previousIP) || ($dyndnsForce = true)) do={ :set dyndnsForce false :set previousIP $currentIP :log info "$currentIP or $previousIP" /tool fetch user=$username password=$password mode=http address="members.dyndns.org" \ src-path="nic/update?system=dyndns&hostname=$hostname&myip=$currentIP&wildcard=no" \ dst-path="/dyndns.txt" :delay 1 :local result [/file get dyndns.txt contents] :log info ("UpdateDynDNS: Dyndns update needed") :log info ("UpdateDynDNS: Dyndns Update Result: ".$result) :put ("Dyndns Update Result: ".$result) } else={ :log info ("UpdateDynDNS: No dyndns update needed") }` Debugged version for RoS 6.x: `:global ddnsuser "theddnsusername" :global ddnspass "theddnspassword" :global theinterface "interfacename" :global ddnshost blabla.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"; } }` Scheduler: `/system scheduler add interval=1m name=DynDns on-event=DynDns policy=ftp,reboot,read,write,policy,test,winbox,password,sniff,sensitive,api start-time=startup` Credit: https://wiki.mikrotik.com