#!rsc # RouterOS script: script-updates # Copyright (c) 2013-2019 Christian Hesse # # update installed scripts from file or url :global GlobalConfigVersion; :global ExpectedConfigVersion; :global Identity; :global ScriptUpdatesFetch; :global ScriptUpdatesBaseUrl; :global ScriptUpdatesUrlSuffix; :global ScriptUpdatesIgnore; :global SendNotification; :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 && $ScriptUpdatesFetch = true) do={ :foreach IgnoreLoop in=$ScriptUpdatesIgnore do={ :if ($IgnoreLoop = $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 \ ($ScriptUpdatesBaseUrl . $ScriptName . $ScriptUpdatesUrlSuffix) \ 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 DontRequirePermissions \ ($SourceNew~"\n# requires: dont-require-permissions=yes\n"); :log info ("Updating script: " . $ScriptName); / system script set owner=$ScriptName source=$SourceNew \ dont-require-permissions=$DontRequirePermissions $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 . "."); } } :if ($GlobalConfigVersion < $ExpectedConfigVersion) do={ $SendNotification "Configuration warning!" \ ("Current configuration on " . $Identity . " is out of date. " . \ "Please update global-config, then increase variable " . \ "GlobalConfigVersion (currently " . $GlobalConfigVersion . \ ") to " . $ExpectedConfigVersion . " and re-run global-config."); }