So, it is working perfectly on RB750 v5.24:
System>Script>add script "dyndns"
############
# Set needed variables
############
# Your DynDNS account user-name, password & host-name.
:local username "yourusername"
:local password "yourpassword"
:local hostname "yourhostname"
# Which interface are we checking if DHCP has changed? [interfaces | name column in winbox]
:local DHCPInterface "yourinterface"
############
# This is the name of the file where the last recorded IP will be stored, as well as the file name of the DynDNS response.
# Make sure if another script is using files, that these names don't conflict.
# You probably also want to be sure they aren't the same as any other files on the disk - because you'll be clobbering those files.
# Finally, while I'm not aware of any "reserved" file names on the disk, it would be wise to avoid something that might conflict.
# Prefixing them with something to associate them with this script would probably be a good thing.
# You can point these files at your SD-disk too, if you have an SD card installed and ready on your RB. Just prefix the path appropriately:
# something like this [:local vLastIPFileName "micro-sd/dyndns-lastip.txt"] (don't put a leading slash)
# A user reported a bug if you use the RB flash and prefix the path with a [/]
# So for RB based flash, it's probably safest to use just something like [:local vLastIPFileName "dyndns-lastip.txt"] and not [:local vLastIPFileName "/dyndns-lastip.txt"]
# You ***MUST*** use a .txt extension. Just an oddity of ROS. Move along now.
# Code ForDD
:local vLastIPFileName "dyndns-lastip.txt"
:local vDynDNSResponseFile "dyndns-resp.txt"
# /dyndns.txt
############
# END Set needed variables
############
:local vlen;
:local vRawIP;
:local vJustIP;
:local currentIP
:local previousIP
:local vlocalurl
:local vIPChanged false
:local dyndnsresult
:local result
# Check for file existance, if not create it
# We need to do this before we try to read or write to files...
:local check [/file find name=$vLastIPFileName]
:if ( $check = "" ) do= {
/file print file=$vLastIPFileName
:delay 2
/file set [/file find name=$vLastIPFileName] contents=""
}
# Get the last saved IP from the file.
:set previousIP [/file get $vLastIPFileName contents]
#:put $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")
:log info ("UpdateDynDNS: DHCPInterface = $DHCPInterface")
# This code gets the current IP from the interface.
# The interface we're checking should be set above.
# get the raw IP from the interface, which includes a mask.
:set vRawIP [:tostr [/ip address get [find interface=$DHCPInterface] address]]
#Strip the netmask off the vRawIP address.
:for i from=( [:len $vRawIP] - 1) to=0 do={
:if ( [:pick $vRawIP $i] = "/") do={
:set vJustIP [:pick $vRawIP 0 $i]
}
}
:set currentIP $vJustIP
# Determine if dyndns update is needed
# more dyndns updater request details http://www.dyndns.com/developers/specs/syntax.html
# Update if the currentIP isn't equal to previousIP.
:if (($currentIP != $previousIP)) do={
:log info "CurrentIP: $currentIP - PreviousIP: $previousIP"
:set vlocalurl ("http://" . "$username" . ":" . "$password" . "@" . "members.dyndns.org" . "/nic/update?hostname=" . "$hostname" . "&myip=" . "$currentIP")
/tool fetch mode=http url=$vlocalurl dst-path=$vDynDNSResponseFile
:set result [/file get $vDynDNSResponseFile contents]
:set vIPChanged true
} else={
:log info ("UpdateDynDNS: No dyndns update needed")
}
# Get the result status code and pull it out for use.
# IF IPChanged = true
# Get result code
# Check DynDNS result
# if good or nochg, then
# :set previousIP $currentIP
# /file set [/file find name=$vLastIPFileName] contents="$currentIP"
# also post the result to the log file
# else badauth or !donator or notfqdn, nohost, abuse, dnserr, 911
# post to log file
# Don't update previousIP or vLastIPFileName file
:if ($vIPChanged=true) do={
:set result [/file get $vDynDNSResponseFile contents]
:local endLoc [:find $result " " -1]
:set dyndnsresult [:pick $result -1 ($endLoc)]
:put $dyndnsresult
:if (($dyndnsresult = "good") || ($dyndnsresult = "nochg") ) do={
:set previousIP $currentIP
:log info ("UpdateDynDNS: Dyndns update needed")
:log info ("UpdateDynDNS: Dyndns Update Result: ".$result)
/file set [/file find name=$vLastIPFileName] contents="$currentIP"
} \
else={
:log info ("UpdateDynDNS: Dyndns update needed")
:log info ("DynDNS Update FAILED")
:log info ("UpdateDynDNS: Dyndns Update Result: ".$result)
}
}
New Terminal> /system scheduler add name=dyndns interval=00:01 on-event="/system script run dyndns\r\n" |