#!rsc # RouterOS script: script-updates # Copyright (c) 2013-2019 Christian Hesse # # update installed scripts from file or url :global "script-updates-fetch"; :global "script-updates-baseurl"; :global "script-updates-urlsuffix"; :global "script-updates-ignore"; :foreach script in=[ / system script find ] do={ :local ignore 0; :local scriptname [ / system script get $script name ]; :local scriptpolicy [ / system script get $script policy ]; :local scriptfile [ / file find where name=("script-updates/" . $scriptname) ]; :local sourcenew; :if ([ :len $scriptfile ] > 0) do={ :set sourcenew [ / file get $scriptfile content ]; / file remove $scriptfile; } :foreach scheduler in=[ / system scheduler find where on-event=$scriptname ] do={ :local schedulername [ / system scheduler get $scheduler name ]; :local schedulerpolicy [ / system scheduler get $scheduler policy ]; :if ($scriptpolicy != schedulerpolicy) do={ :log warning ("Policies differ for script " . $scriptname . \ " and its scheduler " . $schedulername . "!"); } } :if ([ :len $sourcenew ] = 0 && $"script-updates-fetch" = true) do={ :foreach "ignore-loop" in=$"script-updates-ignore" do={ :if ($"ignore-loop" = $scriptname) do={ :set ignore 1; } } :if ($ignore = 0) do={ :log debug ("Fetching script from url: " . $scriptname); :do { :local result [ / tool fetch check-certificate=yes-without-crl \ ($"script-updates-baseurl" . $scriptname . $"script-updates-urlsuffix") \ output=user as-value ]; :if ($result->"status" = "finished") do={ :set sourcenew ($result->"data"); } } on-error={ :log info ("Failed fetching " . $scriptname); } } } :if ([ :len $sourcenew ] > 0) do={ :if ([ :pick $sourcenew 0 5 ] = "#!rsc") do={ :local sourcecurrent [ / system script get $script source ]; :if ($sourcenew != $sourcecurrent) do={ :local "dont-require-permissions" \ ($sourcenew~"\n# requires: dont-require-permissions=yes\n"); :log info ("Updating script: " . $scriptname); / system script set owner=$scriptname source=$sourcenew \ dont-require-permissions=$"dont-require-permissions" $script; :if ($scriptname = "global-functions") do={ / system script run global-functions; } } else={ :log debug ("Script " . $scriptname . " did not change"); } } else={ :log warning ("Looks like new script " . $scriptname . " is not valid. Ignoring!"); } } else={ :log debug ("No update for script " . $scriptname); } }