Answer the question
In order to leave comments, you need to log in
DynDNS.com and mikrotik hex lite rb750r2 (ROS 6.30.2). what script to take so that the dynamic IP address is assigned to the service when it changes?
Used scripts:
№1
:global ddnsuser "xxxxxx"
:global ddnspass "xxxxxx"
:global theinterface "pppoe-out1"
:global ddnshost "xxxx.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";
}
}
:local username "xxxxxx"
:local password "xxxxxx"
:global hostname "xxxx.dyndns.org"
:global dyndnsForce
:global previousIP
:local resolvedIP [:resolve $hostname]
#print some debug
#:log info ("UpdateDynDNS: username = $username")
#:log info ("UpdateDynDNS: password = $password")
:log info ("UpdateDynDNS: hostname = $hostname")
:log info ("UpdateDynDNS: previousIP = $previousIP")
:log info ("UpdateDynDNS: resolvedIP = $resolvedIP")
# 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!
# Edit: Not really needed anymore... the result is not equal... Update will happen.
#:set dyndnsForce true
# Determine if dyndns update is needed
# more dyndns updater request details http://www.dyndns.com/developers/specs/syntax.html
#This is where we check the DNS record against actual result. Thanks to jimstolz76
:if (($currentIP != $resolvedIP) || ($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 ("Update Result: " . $result)
:put ("Dyndns Update Result: " . $result)
} else= {
:log info ("UpdateDynDNS: No dyndns update needed")
}
# Set needed variables
:local username "xxxxxx"
:local password "xxxxxx"
:local hostname "xxx.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 "</body>" -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
: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)
Answer the question
In order to leave comments, you need to log in
Solution found!!! I just needed a "correct script" I did not go into the reasons and nuances - it works well! Here's a working one, if anyone runs into a problem:
# Based on a script found on the Internet.Will add attribution if I find it.
# Changed 20150719 by Graeme Ruthven ([email protected])
# Modified to:
# - update using authentication in URL as original method appeared to stop working.
# This was about the time of the RouterOS 6.30 release, but may be unrelated.
# - Get the previous IP from the contents of the dyndns.txt file, as the global variable
# doesn't appear to persist.
#
# Reference: https://help.dyn.com/remote-access-api/perform-update/
:local username "xxxx"
:local password "xxxx"
:local hostname "xxxx.dyndns.org"
:local emailAddress "[email protected]"
: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 "</body>" -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"
} else={
:log info ("UpdateDynDNS: No dyndns update needed")
}
As far as I remember, these scripts constantly wrote files / logs to the internal memory? isn't it easier to use the built-in ip/cloud? with the functionality "out of the box" flash will be more useful
The first script should work without problems, if I'm not mistaken, then this is generally a version with off. wiki.
What does it mean "none of the above scripts worked as it should." what is expressed?
Did you forget to add a case to the shedulder? :)
To the topic of settings
Configuring DinruDNS on Mikrotik routers
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question