Code: Select all
: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
}
}
Code: Select all
: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