Differentiate between RouterOS v6.x and v7.x

Hi,

is there a proper way to differentiate between RouterOS v6.x and v7.x in a configuration script?
I tried

/system resource
:global versionStr [get value-name=version]
:if ([:pick $versionStr 0] < 7) do={
  /log info "Found RouterOS v6.x."                                
  /system ntp client              
  set enabled=yes primary-ntp=192.168.144.210
} else={
  /log info "Found RouterOS v7.x."
  /system ntp client
  set enabled=yes servers=192.168.144.210
  /system ntp server
  set enabled=yes
}

but RouterOS seems to parse the contents inside the if-brackets despite not going inside, so that it then throws the error, as the

primary-ntp

key is no longer available:

...
set enabled=yes primary-ntp=192.168.144.210
expected end of command (line 4 column 19)

Thanks,
Daniel

You probably need something like this:

:do {[:parse "/system ntp client set enabled=yes primary-ntp=192.168.144.210"]} on-error={}

I do use this to test if RouterOS is 7 or other

:if ([:tonum [:pick [/system resource get version] 0 1]] > 6) do={
 This runs if Router os is 7.x+
} else={
  This part runs if Router is is 6 .x or lower
}

Working, thank you very much!

Complete, corrected script:

:global versionStr [/system resource get version]
:if ([:pick $versionStr 0] < 7) do={
  :do {[:parse "/system ntp client set enabled=yes primary-ntp=192.168.144.210"]} on-error={}
} else={
  :do {[:parse "/system ntp client set enabled=yes servers=192.168.144.210"]} on-error={}
  :do {[:parse "/system ntp server set enabled=yes"]} on-error={}
}

From what I have learned from rextended, you should avoid on-error.
Find out what can go wrong and make a script that will not fail.
Maybe rextended will help out. :slight_smile:

You clearly didn’t read or understand the question then.
There is a syntax difference between V6 and V7. You CAN’T make something that won’t fail, except as already stated.

It is not sufficent to ckeck only RouterOS version with (s)NTP…

This is just the example for check, not for bypass syntax checking.

/system resource
:global rosVer [:tonum [:pick [get version] 0 1]]

:if ($rosVer~"(6|7)") do={
    :if ($rosVer = 6) do={
        :put "Detected RouterOS 6"
        /system package
        :if ([:len [find where name="ntp"]] = 1) do={
            :put "with NTP package installed"
        } else={
            :put "without NTP package installed, use SNTP"
        }
    }
    :if ($rosVer = 7) do={
        :put "Detected RouterOS 7"
        :put "the NTP package is always present"
    }
} else={
    :put "Unrecognized RouterOS version: >$rosVer<"
}

And this is the code without the “onhorror-resume-next”

/system resource
:global rosVer [:tonum [:pick [get version] 0 1]]
:global priNTP 0.0.0.0
:global secNTP 0.0.0.0

:if ($rosVer~"(6|7)") do={
    :local setNTP ""
    :if ($rosVer = 6) do={
        /system package
        :if ([:len [find where name="ntp"]] = 1) do={
            :set setNTP "/system ntp client set enabled=yes primary-ntp=$priNTP secondary-ntp=$secNTP; \
                         /system ntp server set enabled=yes"
        } else={
            :set setNTP "/system ntp client set enabled=yes primary-ntp=$priNTP secondary-ntp=$secNTP"
        }
    }
    :if ($rosVer = 7) do={
            :set setNTP "/system ntp client set enabled=yes servers=$priNTP,$secNTP; \
                         /system ntp server set enabled=yes"
    }
    :execute "$setNTP"
} else={
    :put "Unrecognized RouterOS version: >$rosVer<"
}