Dynamic DNS Update Script for No-IP DNS for Router OS V.6.7

Since I had problems with this script, http://wiki.mikrotik.com/wiki/Dynamic_DNS_Update_Script_for_No-IP_DNS for update IP address to No-IP DNS server I rewrite it to make compatible for RouterOS version 6.7.

The problem with that script is the function :toarray,

:set noiphostarray [:toarray $noiphost]

That line produces a malfunction of the script because it never saves the value of the current IP address in var $previousIP, so the script is constantly updating the IP address when it is not necessary because it hasn’t changed.

Here is my debugged script working on RouterOS version 6.7:

# No-IP automatic Dynamic DNS update

#--------------- Change Values in this section to match your setup ------------------

# No-IP User account info
:local noipuser "YOUR-NO-IP-USERNAME";
:local noippass "YOUR-NO-IP-PASSWORD";

# Set the hostname or label of network to be updated.
:local noiphost "YOUR-NO-IP-HOSTNAME";

# Change to the name of interface that gets the dynamic IP address
:local inetinterface "INTERFACE-THAT-YOU-WANT-TO-UPDATE-IP-ADDRESS";

#------------------------------------------------------------------------------------
# No more changes need

:global previousIP;

:if ([/interface get $inetinterface value-name=running]) do={
# Get the current IP on the interface
   :local currentIP [/ip address get [find interface="$inetinterface" disabled=no] address];

# Strip the net mask off the IP address
   :for i from=( [:len $currentIP] - 1) to=0 do={
       :if ( [:pick $currentIP $i] = "/") do={ 
           :set currentIP [:pick $currentIP 0 $i];
       } 
   }

	:if ($currentIP != $previousIP) do={
		:log info "No-IP: Current IP $currentIP is not equal to previous IP, update needed";
		:set previousIP $currentIP;
		:local url "http://dynupdate.no-ip.com/nic/update\3Fmyip=$currentIP";
		:log info "No-IP: Sending update for $noiphost";
		/tool fetch url=($url . "&hostname=$noiphost") user=$noipuser password=$noippass mode=http dst-path=("no-ip_ddns_update-" . $host . ".txt")
		:log info "No-IP: Host $noiphost updated on No-IP with IP $currentIP";
		
	} else={
	:log info "No-IP: Previous IP $previousIP is equal to current IP, no update needed";
	}
} else={
   :log info "No-IP: $inetinterface is not currently running, so therefore will not update.";
}

Credits for Riverron http://wiki.mikrotik.com/wiki/User:Riverron

Hi,

i have a RB2011UAS-2HnD-IN with OS v6.12 and always the script log this:

Current IP (A.B.C.D) is not equal to previous IP (), update needed

NOTE1: IP omitted
NOTE2: i have change this line: :log info “No-IP: Current IP ($currentIP) is not equal to previous IP ($previousIP), update needed”;

The script DO NOT saves the value of the previousIP, so always must update which it is not correct.

Any tip ?

Tip?

USE SEARCH FUNCTION.

http://forum.mikrotik.com/t/problem-with-no-ip-script-update/77731/1

Since I had some problem while updating, I decide to modify this script setting previousIP as a local variable with its IP resolved by DNS:

 :local previousIP [:resolve "$noiphost"];

so this is the updated script:

# No-IP automatic Dynamic DNS update

#--------------- Change Values in this section to match your setup ------------------

# No-IP User account info
:local noipuser "your@email.com"
:local noippass "yourpassword"

# Set the hostname or label of network to be updated.
# Hostnames with spaces are unsupported. Replace the value in the quotations below with your host names.
# To specify multiple hosts, separate them with commas.
:local noiphost "yourname.ddns.net"

# Change to the name of interface that gets the dynamic IP address
:local inetinterface "yourinterface"

#------------------------------------------------------------------------------------
# No more changes need

#:global previousIP;

:if ([/interface get $inetinterface value-name=running]) do={
# Get the current IP on the interface
   :local currentIP [/ip address get [find interface="$inetinterface" disabled=no] address];

# Strip the net mask off the IP address
   :for i from=( [:len $currentIP] - 1) to=0 do={
       :if ( [:pick $currentIP $i] = "/") do={
           :set currentIP [:pick $currentIP 0 $i];
       }
   }

   :local previousIP [:resolve "$noiphost"];

   :log info "DNS IP: $previousIP, interface IP: $currentIP";

   :if ($currentIP != $previousIP) do={
      :log info "No-IP: Current IP $currentIP is not equal to previous IP $previousIP, update needed";
     # :set previousIP $currentIP;
      :local url "http://dynupdate.no-ip.com/nic/update\3Fmyip=$currentIP";
      :log info "No-IP: Sending update for $noiphost";
      /tool fetch url=($url . "&hostname=$noiphost") user=$noipuser password=$noippass mode=http dst-path=("no-ip_ddns_update-" . $host . ".txt")
      :log info "No-IP: Host $noiphost updated on No-IP with IP $currentIP";
      
   } else={
   :log info "No-IP: Previous IP $previousIP is equal to current IP, no update needed";
   }
} else={
   :log info "No-IP: $inetinterface is not currently running, so therefore will not update.";
}

Is this script working on 6.34.2 ?
Thx

This Mikrotik Noip update script works on 6.27 and it survived an upgrade to 6.34.1
You still need to setup the system scheduler just change the on-event=to match the name of the script
/system scheduler add comment=“Update No-IP DDNS” disabled=no interval=5m
name=no-ip_ddns_update on-event=no-ip_ddns_update policy=read,write,test


Thanks it’s working!

all things seems to work but the ip on no-ip page dont update…
running 6.36rc13

I have simplified the whole script like this and it works on RouterOS 6.33.5. Hope this helps.

##############Script Settings##################

:local NOIPUser "your_uname"
:local NOIPPass "your_passwd"
:local WANInter "ether1"

###############################################

:local NOIPDomain "$NOIPUser.no-ip.org"

:local IpCurrent [:resolve myip.opendns.com server=208.67.222.222];
:put $IpCurrent

:if ([:resolve $NOIPDomain] != $IpCurrent) do={
      /tool fetch mode=http user=$NOIPUser password=$NOIPPass url="http://dynupdate.no-ip.com/nic/update\3Fhostname=$NOIPDomain&myip=$Ipcurrent" keep-result=no
      :log info "NO-IP Update: $NOIPDomain - $IpCurrent"
}

Hello!

Since 6.36 os the script works , but he scheduler didn’t start it.

I noticed the same thing since June 2016. I got email’s “Please confirm your hostname now or it will be deleted”. Nothing have been changed in script.
Now I have 6.35 on Mikrotik. Any solutions?

Another working solution on 6.40.3

:# No-IP automatic Dynamic DNS update

#--------------- Change Values in this section to match your setup ------------------

# No-IP User account info
:local noipuser "YOURNOIPUSER"
:local noippass "YOURPASS"

# Set the hostname or label of network to be updated.
# Hostnames with spaces are unsupported. Replace the value in the quotations below with your host names.
# To specify multiple hosts, separate them with commas.
:local noiphost "YOURNOIP.ddns.net"

# Change to the name of interface that gets the dynamic IP address
:local inetinterface "pppoe-out1"

#------------------------------------------------------------------------------------
# No more changes need

#:global previousIP;

:if ([/interface get $inetinterface value-name=running]) do={

# Get the current IP on the interface

:local currentIP [:put [:pick [/ip address  get [:pick [find interface=$inetinterface] 1] address] 0 [:find [ip address  get [:pick [find interface=$inetinterface] 1] address] "/"]]];

# Strip the net mask off the IP address
   :for i from=( [:len $currentIP] - 1) to=0 do={
      :if ( [:pick $currentIP $i] = "/") do={
           :set currentIP [:pick $currentIP 0 $i];
       }
   }

   :local previousIP [:resolve "$noiphost"];

   :log info "DNS IP: $previousIP, interface IP: $currentIP";

   :if ($currentIP != $previousIP) do={
      :log info "No-IP: Current IP $currentIP is not equal to previous IP $previousIP, update needed";
     # :set previousIP $currentIP;
      :local url "http://dynupdate.no-ip.com/nic/update\3Fmyip=$currentIP";
      :log info "No-IP: Sending update for $noiphost";
      /tool fetch url=($url . "&hostname=$noiphost") user=$noipuser password=$noippass mode=http dst-path=("no-ip_ddns_update-" . $host . ".txt")
      :log info "No-IP: Host $noiphost updated on No-IP with IP $currentIP";
     
   } else={
   :log info "No-IP: Previous IP $previousIP is equal to current IP, no update needed";
   }
} else={
   :log info "No-IP: $inetinterface is not currently running, so therefore will not update.";
}

it dont work with my router version 6.36.2.Can you help me

try change on-event=no-ip_ddns_update for on-event=“/system script run no-ip_ddns_update”. worked for me