The logic seems fine, but the download part using /tool fetch doesn’t work — the file never appears in /file.
Code: Select all
:global TargetVer "7.19.4"
:global Architecture
:global PkgVer
:global PkgVer1
:global PkgVer2
:global PkgVer3
:global RbVer
:global RbVer1
:global RbVer2
:global RbVer3
:global TargetVer1
:global TargetVer2
:global TargetVer3
:global PackageURL
:global urlToFetch
# --- Detect system architecture (e.g. arm, arm64, mmips, x86) ---
:set Architecture [/system resource get architecture-name]
# --- Get current RouterOS package version ---
:set PkgVer [/system package get system version]
# --- Extract version parts (major.minor.patch) for comparison ---
:set PkgVer1 [:tonum [:pick $PkgVer 0 1]]
:set PkgVer2 [:tonum [:pick $PkgVer 2 4]]
:set PkgVer3 [:tonum [:pick $PkgVer 5 6]]
# --- Get current RouterBOARD firmware version (if applicable) ---
:set RbVer [/system routerboard get current-firmware]
:set RbVer1 [:tonum [:pick $RbVer 0 1]]
:set RbVer2 [:tonum [:pick $RbVer 2 4]]
:set RbVer3 [:tonum [:pick $RbVer 5 6]]
# --- Extract version parts of the target version (major.minor.patch) ---
:set TargetVer1 [:tonum [:pick $TargetVer 0 1]]
:set TargetVer2 [:tonum [:pick $TargetVer 2 4]]
:set TargetVer3 [:tonum [:pick $TargetVer 5 6]]
# --- Construct the download URL for the correct architecture and version ---
:set PackageURL ("https://download.mikrotik.com/routeros/" . $TargetVer . "/routeros-" . $Architecture . "-" . $TargetVer . ".npk")
:set urlToFetch "$PackageURL"
# --- Log detected information ---
:log info ("Target version: " . $TargetVer)
:log info ("Detected architecture: " . $Architecture)
:log info ("Current package version: " . $PkgVer)
:log info ("Download URL: " . $urlToFetch)
# --- Main logic: compare current and target versions ---
:if ($PkgVer != $TargetVer) do={
:log info ("Package version does not match target version. Downloading package from " . $urlToFetch)
/tool fetch url=$urlToFetch mode=https
:delay 10s
# --- Verify that the package file was downloaded successfully ---
:if ([:len [/file find name=("routeros-" . $Architecture . "-" . $TargetVer . ".npk")]] = 0) do={
:log error ("Package file routeros-" . $Architecture . "-" . $TargetVer . ".npk not found after download. Aborting.")
} else={
# --- Determine whether to downgrade or upgrade ---
:if ($PkgVer1 > $TargetVer1 || $PkgVer2 > $TargetVer2 || $PkgVer3 > $TargetVer3) do={
:log info ("Target version (" . $TargetVer . ") is older than current version (" . $PkgVer . "). Executing downgrade...")
/system package downgrade
} else={
:log info ("Target version (" . $TargetVer . ") is newer than current version (" . $PkgVer . "). Rebooting to install...")
:delay 3s
/system reboot
}
}
} else={
# --- If package version matches, check firmware version ---
:if ($RbVer != $TargetVer) do={
:log info ("RouterBOARD firmware (" . $RbVer . ") does not match target version (" . $TargetVer . "). Upgrading firmware...")
/system routerboard upgrade
:delay 3s
/system reboot
} else={
:log info ("Software and firmware already match target version (" . $TargetVer . "). No action required.")
}
}