Community discussions

MikroTik App
 
zivtal
Frequent Visitor
Frequent Visitor
Topic Author
Posts: 57
Joined: Sun Feb 05, 2017 6:22 pm

Advanced Dynamic DNS script (DynDNS, Dynu) UPDATED

Sun Feb 18, 2018 11:27 am

ddns.rsc The script will update your dynamic dns and will create scheduler and netwatch for updates, You can update several proviaders (DynDNS and Dynu for now) and via specific interface (if you use several wan connections).
:local ddns do={
	:local dynhost
	:local dynurlv

	:if (([:len $provider]=0) or ([:len $host]=0) or ([:len $username]=0) or ([:len $password]=0)) do={
		:error "missing parameters"
	}

	:if ($provider="dynu") do={
		:set dynhost "api.dynu.com"
		:set dynurlv "/nic/update?hostname=$host"
	}
	:if ($provider="dyndns") do={
		:set dynhost "members.dyndns.org"
		:set dynurlv "/nic/update?hostname=$host&wildcard=NOCHG&mx=NOCHG&backmx=NOCHG"
	}
	:set dynhost [:resolve $dynhost];

   :local WanToIp do={
    	:if ([:len [/ip dhcp-client find where interface=[:tostr $1]]]>0) do={
    		:return [/ip dhcp-client get [find interface=[:tostr $1]] gateway]
    	} else={
    		:return [$1]
    	}
    }

	:log warning ("Updating dynamic dns '".$host."' ...");
	:if (([:len [/interface find name=$interface]]>0) and ([/interface get value-name=disabled $interface]=no)) do={
		/ip route add distance=1 gateway=[$WanToIp $interface] dst-address=$dynhost comment="updating '$host' via '$interface'"
		:delay 800ms;
	}
	:do {
		/tool fetch address=$dynhost src-path=$dynurlv mode=http user=$username password=$password dst-path=("$dynprov.".$host)
	} on-error={
		:log error ("Update dynamic dns '".$host."' failed...");
	}
	/ip route remove [/ip route find where comment="updating '$host' via '$interface'"]
}

:do {
	## Configuration file
	:local fconfig [:parse [/system script get "ddns.cfg" source]]
	:local cfg [$fconfig]
	:local HOSTS ($cfg->"hosts")
	:local ACCOUNTS ($cfg->"accounts")
	## Foreach HOSTS
	:foreach Host in=[:toarray $HOSTS] do={
		:local wan
		:local dynprov
		:local dynhost
		:local dynuser
		:local dynpass
		:if ([:len [:pick $Host (-1) ([:find $Host "|"])]]>0) do={
			:set wan [:pick $Host 0 ([:find $Host "|"])]
			:set dynprov [:pick $Host ([:find $Host "|"]+1) [:find $Host "@"]]
			:set dynhost [:pick $Host ([:find $Host "@"]+1) [:len $Host]]
		} else={
			:set dynprov [:pick $Host 0 [:find $Host "@"]]
			:set dynhost [:pick $Host ([:find $Host "@"]+1) [:len $Host]]
		}
		:if ([:len [:pick $ACCOUNTS (-1) ([:find $ACCOUNTS "|"])]]>0) do={
			:foreach account in=[:toarray $ACCOUNTS] do={
				:if ([:pick $account 0 [:find $account "|"]]=$dynprov) do={
					:set dynuser [:pick $account ([:find $account "|"]+1) [:find $account "@"]]
					:set dynpass [:pick $account ([:find $account "@"]+1) [:len $account]]
				}
			}
		} else={
			:set dynuser [:pick $ACCOUNTS 0 [:find $ACCOUNTS "@"]]
			:set dynpass [:pick $ACCOUNTS ([:find $ACCOUNTS "@"]+1) [:len $ACCOUNTS]]
		}
		:log info ("\$ddns provider=$dynprov host=$dynhost username=$dynuser password=$dynpass interface=$wan")
		$ddns provider=$dynprov host=$dynhost username=$dynuser password=$dynpass interface=$wan
	}
}
Configuration file code ("ddns.cfg")
:log info "ddns.cfg has been loaded";

:local config {
	"hosts"="dynu@YOURDOMAIN,dyndns@YOURDOMAIN,INTERFACE|dynu@YOURDOMAIN";
	"accounts"="dyndns|USERNAME@PASSWORD,dynu|USERNAME@PASSWORD";
	"storage"="";
}
return $config
 
vagelism
newbie
Posts: 36
Joined: Sun Oct 21, 2012 3:29 pm
Location: Greece

Re: Advanced Dynamic DNS script (DynDNS, Dynu) UPDATED

Mon May 06, 2019 10:33 am

Hello,
I need to run the script only for Dyn DNS...
How can I modify it?
Thank you.

Who is online

Users browsing this forum: No registered users and 32 guests