I do this to avoid installing a release that has bugs and has to be released again or pulled.
I run this script daily so it can count the days from the last update as well as the fw update script in case the RouterOS came with a FW update (usually does). I run RouterOSupdate then FirmwareInstall 15min later
I call this script RouterOSupdate
#This script looks to see if there is a RouterOS update available, if so, it starts counting in variable DaysSinceRelease until the release has been out for "DaysToWait" days or more.
#the variable is also saved in a system file to survive reboots that may occur.
#This script should run daily to keep the DaysSinceRelease variable up to date.
#G. Racino 01Oct2023
#days to wait after a new release before updating this device.
:local DaysToWait 30
:global LatestVer [/system package update get latest-version]
/system package update set channel=stable
/system package update
check-for-updates once
:delay 5s;
#initialize files if they do not exist
:if ([/file find name="DaysSinceRelease.txt"] = "") do={:log info "DaysSinceRelease file does not exists, creating"; /file add name=DaysSinceRelease.txt;/file set "DaysSinceRelease.txt" contents="0";delay 2s}
:global DaysSinceRelease [/file get [/file find name=DaysSinceRelease.txt] contents];
:if ([/file find name="CountingVer.txt"] = "") do={:log info "CountingVer file does not exists, creating"; /file add name=CountingVer.txt;/file set "CountingVer.txt" contents=[/system package update get installed-version];delay 2s}
:global CountingVer [/file get [/file find name=CountingVer.txt] contents];
:local newdays $DaysSinceRelease
:set $newdays ($newdays + 1)
:log info "~~~~~~~~~~RouterOS update check: Latest Ver=$LatestVer, Installed Ver=$CountingVer ~~~~~~~~~~~"
:if ([/system package update get status] = "New version is available") do={
:if (([/system package update get status] = "New version is available") && ($newdays <= $DaysToWait) && ($CountingVer = $LatestVer)) do={
:log info "~~~~~~~~~New RouterOS release is out for $newdays so NOT updating this device until release has been out for $DaysToWait days~~~~~~~~~~~~~~~~"
:set $DaysSinceRelease $newdays;
/file set "DaysSinceRelease.txt" contents=$newdays
} else={
:if ( ([/system package update get status] = "New version is available") && ($newdays > $DaysToWait) && ($CountingVer != $LatestVer)) do={
:log info "~~~~~~~~~RouterOS version changed, need to update on next check. Waiting period of $DaysToWait met. Wait time was $newdays of $DaysToWait, latest version is $LatestVer, tracking version was $CountingVer"
:set CountingVer $LatestVer
/file set "CountingVer.txt" content=$LatestVer
/file set "DaysSinceRelease.txt" content=0
:set $DaysSinceRelease 0
} else={
:if ( ([/system package update get status] = "New version is available") && ($newdays > $DaysToWait) && ($CountingVer = $LatestVer)) do={
:log info "~~~~~~~~~~New RouterOS release is out for $newdays so updating this device~~~~~~~~~";
:set $DaysSinceRelease 0;
/file set "DaysSinceRelease.txt" contents="0"
:delay 3s;
/system package update install
}
}}
} else={
:log info "~~~~~~~~~~RouterOS update check: No new updates.~~~~~~~~~~~~"
/file set "DaysSinceRelease.txt" content="0"
:set $DaysSinceRelease 0
}
## script to update RouterOS firmware
## check for updated firmware
:log info ("Checking for FW upgrade...")
/system routerboard
:if ( [get current-firmware] != [get upgrade-firmware]) do={
## New version of firmware available, let's upgrade
:log info ("Upgrading firmware on router $[/system identity get name] from $[/system routerboard get current-firmware] to $[/system routerboard get upgrade-firmware]")
:delay 3s;
upgrade
## Wait for upgrade, then reboot
:delay 8s;
/system reboot
} else={
:log info ("No Router FW upgrade found")
}
}