Grateful thanks goes to "webasdf" on the forums (http://forum.mikrotik.com/viewtopic.php?p=171805#p171805) for this. I just edited it so that we can use the same identical script at every single one of our hotspots that are behind a Dynamic IP. The great ability of the original script by webasdf is that it uses DynDNS's html access method which means it will work behind a NAT'ed connection.
Script minimum Policy permissions required: read | write | test
:local username ""
:local password ""
:local hostname ""
:local emailAddress ""
:local url "dummy"
:local previousIP
:global dyndnsForce
:set dyndnsForce false
:log info ("UpdateDynDNS starts.")
# print some debug info
#:log info ("UpdateDynDNS: username = $username")
#:log info ("UpdateDynDNS: password = $password")
#:log info ("UpdateDynDNS: hostname = $hostname")
#:log info ("UpdateDynDNS: previousIP = $previousIP")
# I have some doubt over the persistence of the global previousIP.
# This value should be stored in /dyndns.txt after the last update attempt,
# preceded by the status and a space.
# For status values see: https://help.dyn.com/remote-access-api/return-codes/
:if ([:len [/file find name=dyndns.txt]] > 0) do={
:local ipfile [/file get dyndns.txt contents]
:local ipstart ([find $ipfile " " -1] + 1)
:local ipend [:len $ipfile]
:set previousIP [:pick $ipfile $ipstart $ipend]
} else={
:set previousIP "0.0.0.0"
}
# get the current IP address from the internet (in case of double-nat)
/tool fetch mode=http address="checkip.dyn.com" 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]
# 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={
:log info ("Changing IP from $previousIP to $currentIP.")
:set dyndnsForce false
:set url "http://$username:[email protected]/nic/update?hostname=$hostname&myip=$currentIP&wildcard=no"
/tool fetch url=$url mode=http dst-path="/dyndns.txt"
# Original code:
# /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
# :set previousIP $currentIP
:local result [/file get dyndns.txt contents]
:log info ("UpdateDynDNS: Dyndns update needed")
:log info ("UpdateDynDNS: Dyndns Update Result: ".$result)
# email result:
:local output "DynDNS Update Result: $result"
/tool e-mail send to="$emailAddress" subject="DynDNS update $currentTime" body="$output"
} else={
:log info ("UpdateDynDNS: No dyndns update needed")
}
Credit: https://wiki.mikrotik.com