From ff7f1e479e481cd4c6fe4ec4244b4ee9074a6e5a Mon Sep 17 00:00:00 2001 From: vados-dev Date: Tue, 3 Mar 2026 09:00:03 +0300 Subject: [PATCH] Backup for MikroNUC sucessfully creatd at Mar 03 09:00:03. --- .../20260303/20260303090001-Binary.backup | Bin 0 -> 307886 bytes MikroNUC/20260303/20260303090001-Config.rsc | 2770 +++++++++++++++++ .../20260303/20260303090001-Diff-Config.rsc | 4 + 3 files changed, 2774 insertions(+) create mode 100644 MikroNUC/20260303/20260303090001-Binary.backup create mode 100644 MikroNUC/20260303/20260303090001-Config.rsc create mode 100644 MikroNUC/history/20260303/20260303090001-Diff-Config.rsc diff --git a/MikroNUC/20260303/20260303090001-Binary.backup b/MikroNUC/20260303/20260303090001-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..7422146f0f6543c5eb35470a84c0544bcee00a7a GIT binary patch literal 307886 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 SMu;o3WTk0U$g5D4H~wE-7OUI< literal 0 HcmV?d00001 diff --git a/MikroNUC/20260303/20260303090001-Config.rsc b/MikroNUC/20260303/20260303090001-Config.rsc new file mode 100644 index 0000000..d51cce1 --- /dev/null +++ b/MikroNUC/20260303/20260303090001-Config.rsc @@ -0,0 +1,2770 @@ +# 2026-03-03 09:00:01 by RouterOS 7.21.1 +# system id = NmJcEM+8XAP +# +/caps-man channel +add band=2ghz-g/n extension-channel=disabled frequency=2422 name=2G-3 \ + reselect-interval=20m save-selected=yes +add band=5ghz-a/n/ac extension-channel=XXXX frequency=5660 name=5G-5660 \ + save-selected=yes +add band=5ghz-a/n/ac extension-channel=XXXXXXXX frequency=5160,5200,5280 \ + name=5G-5160-5280 reselect-interval=30m save-selected=yes +add band=5ghz-n/ac extension-channel=XXXX frequency=5180 name=5G-36 \ + reselect-interval=30m save-selected=yes +add band=5ghz-n/ac extension-channel=XXXX frequency=5200 name=5G-40 \ + reselect-interval=30m save-selected=yes +add band=5ghz-n/ac extension-channel=XXXX frequency=5220 name=5G-44 \ + reselect-interval=30m save-selected=yes +add band=5ghz-n/ac extension-channel=XXXX frequency=5240 name=5G-48 \ + reselect-interval=30m save-selected=yes +add band=2ghz-g/n extension-channel=disabled frequency=2442 name=2G-7 \ + reselect-interval=20m save-selected=yes +add band=2ghz-g/n extension-channel=disabled frequency=2462 name=2G-11 \ + reselect-interval=20m save-selected=yes +/interface bridge +add name=Bridge-DOC +add name=Bridge-LAN port-cost-mode=short +/interface ethernet +set [ find default-name=ether1 ] disable-running-check=no name=ether2 +/interface veth +add address=172.18.20.6/30 container-mac-address=00:00:00:00:00:00 dhcp=no \ + gateway=172.18.20.5 gateway6="" name=docker-xray-vless-veth +add address=10.10.10.10/24 container-mac-address=5C:26:FE:05:6F:12 dhcp=no \ + gateway=10.10.10.1 gateway6="" mac-address=5C:26:FE:05:6F:11 name=veth1 +/caps-man datapath +add bridge=Bridge-LAN client-to-client-forwarding=yes local-forwarding=yes \ + name=xs-DataPath +add bridge=Bridge-LAN client-to-client-forwarding=yes local-forwarding=yes \ + name=DataPath +/caps-man security +add authentication-types=wpa2-psk encryption=aes-ccm group-encryption=aes-ccm \ + group-key-update=30m name=xs-Sec +add authentication-types=wpa2-psk encryption=aes-ccm group-encryption=aes-ccm \ + group-key-update=30m name=WPA2 +/caps-man configuration +add channel.band=2ghz-b/g/n country=no_country_set datapath=xs-DataPath mode=\ + ap name=xs-2G rx-chains=0,1,2,3 security=xs-Sec ssid=vados tx-chains=\ + 0,1,2,3 +add channel.band=5ghz-a/n/ac country=no_country_set datapath=xs-DataPath \ + installation=any mode=ap name=xs-5G rx-chains=0,1,2,3 security=xs-Sec \ + ssid=vados5g tx-chains=0,1,2,3 +add channel.band=2ghz-b/g/n .control-channel-width=20mhz .extension-channel=\ + XX .frequency=2422,2442,2462 .reselect-interval=20m country=belarus \ + datapath=DataPath datapath.client-to-client-forwarding=yes \ + .local-forwarding=yes hw-protection-mode=rts-cts installation=any name=2G \ + rx-chains=0,1,2,3 security=WPA2 ssid=vados tx-chains=0,1,2,3 +add channel.band=5ghz-a/n/ac .control-channel-width=20mhz .extension-channel=\ + XXXX .frequency=5180,5200,5220,5240,5260 .reselect-interval=20m \ + .skip-dfs-channels=yes country=belarus datapath=DataPath \ + datapath.client-to-client-forwarding=yes .local-forwarding=yes \ + hw-protection-mode=rts-cts installation=any name=5G security=WPA2 ssid=\ + vados5g +/disk +add slot=ramstorage tmpfs-max-size=100000000 type=tmpfs +add slot=tmpfs tmpfs-max-size=715827882 type=tmpfs +/interface list +add include=dynamic,static name=LAN +/interface wireless security-profiles +set [ find default=yes ] supplicant-identity=MikroMIC +/ip dhcp-server option +add code=12 name=HostName +add code=119 force=yes name=domain-search-list value="0x03'WORKGROUP'0x00" +/ip dhcp-server option sets +add name=P1505n options=HostName +add name=StartLife1 options=HostName +add name=amsterDev options=HostName +add name=MiTV options=HostName +add name=miller options=HostName +add name=amster options=HostName +add name=garage options=HostName +add name=domain-search-set options=domain-search-list +/ip pool +add name=dhcp ranges=10.30.30.150-10.30.30.200 +/system logging action +add email-start-tls=yes email-to=vados@vados.ru name=email target=email +/user group +add name=backup policy="telnet,ssh,ftp,read,write,policy,test,sniff,sensitive,\ + !local,!reboot,!winbox,!password,!web,!api,!romon,!rest-api" +/app settings +set auto-update=yes disk=sata1 lan-bridge=Bridge-LAN registry-mirrors="https:/\ + /reg.vados.ru:5000/:https://reg.vados.ru/,https://registry-1.docker.io" +/caps-man aaa +set called-format=ssid +/caps-man access-list +add action=reject allow-signal-out-of-range=10s disabled=no interface=all \ + signal-range=-120..-80 ssid-regexp="" +add action=accept allow-signal-out-of-range=10s disabled=no interface=all \ + signal-range=-79..120 ssid-regexp="" +/caps-man manager +# bad package path +set ca-certificate=CAPsMAN-CA-A2A7DF3D5EE6 certificate=CAPsMAN-A2A7DF3D5EE6 \ + enabled=yes package-path=/tmpfs/capsman-packages +/caps-man manager interface +set [ find default=yes ] forbid=yes +add disabled=no interface=Bridge-LAN +/caps-man provisioning +add action=create-dynamic-enabled hw-supported-modes=g,gn,b \ + master-configuration=2G name-format=prefix-identity name-prefix=2G +add action=create-dynamic-enabled hw-supported-modes=an,ac,a \ + master-configuration=5G name-format=prefix-identity name-prefix=5G +add action=create-dynamic-enabled disabled=yes hw-supported-modes=ac,an,a \ + master-configuration=2G name-format=prefix-identity name-prefix=5ghz-ac +add action=create-dynamic-enabled disabled=yes hw-supported-modes=an \ + master-configuration=5G name-format=prefix-identity name-prefix=5ghz-an +/certificate settings +set builtin-trust-store=fetch crl-store=system +/container config +set layer-dir=/sata1 registry-url=https://reg.vados.ru tmpdir=/ramstorage \ + username=amster-dev +/container envs +add key=ENV list=carkeeperbot_envs value=/root/.ashrc +add key=PATH list=carkeeperbot_envs value=\ + /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +add key=PORT list=carkeeperbot_envs value="\${SSH_PORT}" +add key=SSH_PORT list=carkeeperbot_envs value=8222 +/container mounts +add dst=/app list=carkeeper_app src=/sata1/carkeeper/app +add dst=/configs list=carkeeper_configs src=/sata1/carkeeper/configs +add dst=/root/.ashrc list=carkeeper_configs/.profile src=\ + /sata1/carkeeper/configs/.profile +add dst=/etc/php82/php.ini list=carkeeper_configs/php.ini src=\ + /sata1/carkeeper/configs/php.ini +add dst=/etc/ssh/sshd_config list=carkeeper_configs/sshd_config src=\ + /sata1/carkeeper/configs/sshd_config +add dst=/scripts list=carkeeper_scripts src=/sata1/carkeeper/scripts +add dst=/var/sync list=carkeeper_sync src=/sata1/carkeeper/sync +add dst=/var/tmp list=carkeeper_tmp src=/sata1/carkeeper/tmp +/interface bridge port +add bridge=Bridge-LAN interface=ether2 +add bridge=Bridge-DOC interface=veth1 +add bridge=Bridge-LAN interface=LAN +add bridge=Bridge-LAN interface=dynamic +/ipv6 settings +set disable-ipv6=yes disable-link-local-address=yes +/interface detect-internet +set detect-interface-list=LAN internet-interface-list=LAN lan-interface-list=\ + LAN wan-interface-list=LAN +/interface wifi capsman +set package-path=/tmpfs/capsman-packages upgrade-policy=none +/ip address +add address=10.30.30.10/24 interface=Bridge-LAN network=10.30.30.0 +add address=10.10.10.1/24 interface=Bridge-DOC network=10.10.10.0 +add address=172.18.20.5/30 interface=docker-xray-vless-veth network=\ + 172.18.20.4 +/ip dhcp-server +add add-arp=yes address-pool=dhcp always-broadcast=yes bootp-support=none \ + dhcp-option-set=domain-search-set disabled=yes interface=Bridge-LAN \ + lease-script=lease-script lease-time=10m name=nucDHCP server-address=\ + 10.30.30.10 +/ip dns +set doh-max-concurrent-queries=100 doh-max-server-connections=20 servers=\ + 10.30.30.81 verify-doh-cert=yes +/ip firewall filter +add action=accept chain=input +add action=accept chain=output +add action=accept chain=forward comment="Comment of the rule" disabled=yes +/ip firewall mangle +# docker-xray-vless-veth not ready +add action=change-mss chain=forward new-mss=1360 out-interface=\ + docker-xray-vless-veth protocol=tcp tcp-flags=syn tcp-mss=1420-65535 +/ip firewall nat +# docker-xray-vless-veth not ready +add action=masquerade chain=srcnat out-interface=docker-xray-vless-veth +/ip firewall service-port +set ftp disabled=yes +set tftp disabled=yes +set sip disabled=yes +set pptp disabled=yes +set rtsp disabled=no +/ip route +add disabled=no dst-address=0.0.0.0/0 gateway=10.30.30.81 routing-table=main +/ip service +set ftp disabled=yes +set www disabled=yes +set ssh port=2222 +set www-ssl port=4443 +set api disabled=yes +set api-ssl disabled=yes +/ip service webserver +set acme-plain=no crl-plain=no graphs-plain=no graphs-secure=no index-plain=\ + no index-secure=no rest-plain=no rest-secure=no scep-plain=no \ + webfig-plain=no webfig-secure=no +/ip ssh +set forwarding-enabled=both publickey-authentication-options=verify-required \ + strong-crypto=yes +/ip upnp +set allow-disable-external-interface=yes enabled=yes +/ipv6 firewall address-list +add address=2400:cb00::/32 list=CLOUDFLARE-IP-Address +add address=2606:4700::/32 list=CLOUDFLARE-IP-Address +add address=2803:f800::/32 list=CLOUDFLARE-IP-Address +add address=2405:b500::/32 list=CLOUDFLARE-IP-Address +add address=2405:8100::/32 list=CLOUDFLARE-IP-Address +add address=2a06:98c0::/29 list=CLOUDFLARE-IP-Address +add address=2c0f:f248::/32 list=CLOUDFLARE-IP-Address +/system clock +set time-zone-autodetect=no time-zone-name=Europe/Moscow +/system identity +set name=MikroNUC +/system note +set show-at-login=no +/system ntp client +set enabled=yes +/system ntp server +set enabled=yes manycast=yes multicast=yes +/system ntp client servers +add address=10.30.30.81 +add address=0.ru.pool.ntp.org +add address=1.ru.pool.ntp.org +add address=2.ru.pool.ntp.org +add address=3.ru.pool.ntp.org +/system scheduler +add comment="Backup Every Week" interval=1w name=BackupEveryWeek on-event=\ + "/system/script { run BackupAndUpdate; }" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-date=2025-07-07 start-time=04:41:27 +add comment="Setup Global Environment for scripts" name=Amster-SetGlobalEnv \ + on-event=\ + "/system/script { run Amster-GlobalConfig; run Amster-GlobalFunc; }" \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment="Every Day Check For Update Scripts" interval=1d name=\ + Amster-GetInstallUpdate on-event=":global getInstUpd; \$getInstUpd;" \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment="Every Day Check For Update Scripts" interval=1d name=\ + ScriptInstallUpdate on-event=\ + ":global ScriptInstallUpdate; \$ScriptInstallUpdate;" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment="Setup Global Environment for scripts" name=AM-SetGlobalEnv \ + on-event="/system/script { run AM-GlobalConfig; run AM-GlobalFunc; }" \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +add comment="Every Day Check For Update Scripts" interval=1d name=\ + AM-ScriptInstallUpdate on-event=\ + ":global ScriptInstallUpdate; \$ScriptInstallUpdate;" policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + start-time=startup +/system script +add dont-require-permissions=no name=test owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + \r\ + \n#:local ScriptName [ :jobname ];\r\ + \n:local expSrc;\r\ + \n:local FileName;\r\ + \n:local FilePath;\r\ + \n:local DirPath \"tmpfs/\";\r\ + \n:global WaitForFile;\r\ + \n:global IfThenElse;\r\ + \n\r\ + \n:foreach Script in=([ /system/script find where name~\"Amster-GlobalConf\ + *\" ]) do={\r\ + \n:local ScriptVal [ /system/script/get \$Script ];\r\ + \n\r\ + \n:local expName [ (\$ScriptVal->\"name\") ];\r\ + \n#[/system/script get \$expScript name];\r\ + \n:delay 2s;\r\ + \n\r\ + \n:set expSrc [/system/script print where name=\$expName];\r\ + \n/system/script print where name=\$expName;\r\ + \n#[:put [/system/script get \$expScript source]];\r\ + \n:put [\$expSrc];\r\ + \n:delay 2s;\r\ + \n:set FileName \$expName;\r\ + \n:set FilePath (\$DirPath . \$FileName);\r\ + \n\r\ + \n#:log warning \"\\n----------------------\\n\\\$expSrc = \$expSrc\\n____\ + ______________________________\";\r\ + \n:log info \"\\n\\\$FileName = '\$FileName'\";\r\ + \n:log info \"\\n\\\$FilePath = \$FilePath\";\r\ + \n#:log warning {/system/script/get source=[/system/script/get \$expScript\ + \_source];};\r\ + \n\r\ + \n#\$[/system script get [/system script find name=\"\$FileName\"] source]\ + \r\ + \n\r\ + \n#:local gettingScript \"\$FileName\";\r\ + \n#:execute script=\"[[:parse \\\"[:parse { :put (\"\$[/system script get \ + [/system script find name=\$FileName] source]\"); } \\\"]]\"; \\\r\ + \n\r\ + \n#:execute script={:put \"[:parse \\\"[:parse [/system/script get [/syste\ + m/script find name=\$gettingScript] source];\\\"]]\";} \\\r\ + \n# file=(\$FilePath . \".rsc\\00\");\r\ + \n:do {\r\ + \n:local fName (\$FilePath . \".rsc\");\r\ + \n#:delay 3s;\r\ + \n#/file add name=\$fName;\r\ + \n:put [:tostr [\$expSrc]];\r\ + \n/file set \$fName contents=[:put [\$expSrc]];\r\ + \n:delay 3s;\r\ + \n\$WaitForFile \$fName;\r\ + \n(\$FilePath . \".rsc\");\r\ + \n#:delay 2s;\r\ + \n\r\ + \n} on-error={\r\ + \n:log error \"\\nERROR \\\$FilePath = \$FilePath\";\r\ + \n}\r\ + \n#\$WaitForFile (\$FilePath . \".rsc\");\r\ + \n#:execute script={ :put [/system/script get [:put \$FileName] source]; }\ + ;\r\ + \n#/system/script export \$Sscript file=\$FilePath;\r\ + \n#/system/script/export [:put [/system/script/get \$expScript source]] fi\ + le=\$FilePath;\r\ + \n#:execute script={ :put [/system/script/get \$expScript source]; } \\\r\ + \n\r\ + \n#:log warning \"\\n\\\$expScript = \$expScript\";\r\ + \n# \\\r\ + \n# file=(\$FilePath . \".rsc\\00\");\r\ + \n#script={:put [/system/script/get \$FileName source];} file=(\$FilePath\ + \_. \".rsc\\00\");\r\ + \n#/system script export \$src file=(\$FilePath . \$FileName);\r\ + \n}\r\ + \n\r\ + \n:log warning \"\\nComplete!\";\r\ + \n\r\ + \n # :execute script={ :put [ /system/script/get Amster-GlobalConfig sou\ + rce ]; } \\\r\ + \n # file=(\$FilePath . \".conf\\00\");\r\ + \n # \$WaitForFile (\$FilePath . \".conf\");\r\ + \n # :onerror Err {\r\ + \n # /tool/fetch upload=yes url=(\$BackupUploadUrl . \"/\" . \$FileName\ + \_. \".conf\") \\\r\ + \n # user=\$BackupUploadUser password=\$BackupUploadPass src-path=(\ + \$FilePath . \".conf\");\r\ + \n # :set ConfigFile [ /file/get (\$FilePath . \".conf\") ];\r\ + \n # :set (\$ConfigFile->\"name\") (\$FileName . \".conf\");\r\ + \n " +add dont-require-permissions=no name=test1 owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\ + \r\ + \n#:local runningVer [:find [/system/resource/get version] \"(\"];\r\ + \n\r\ + \n:local runningChannel;\r\ + \n:local runningVersion;\r\ + \n:local ParseCustom;\r\ + \n\r\ + \n:set ParseCustom do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Start [:find [ \$Str ] [:tostr \$2]];\r\ + \n :local End [ :tostr \$3 ];\r\ + \n :local Num [ :tonum \$4 ];\r\ + \n :local Return;\r\ + \n\r\ + \n :if ([:len \$Num] = 0) do={:set Num \"0\"}\r\ + \n :local rest [:pick \$Str (\$Start+\$Num) [:len \$Str]]; \r\ + \n :if ([:len \$End ] = 0) do={:set Return [:pick \$Str \$Num \$Start]} e\ + lse={\r\ + \n :set End [:find \$rest \$End];\r\ + \n :set Return [:pick \$rest 0 \$End];\r\ + \n }\r\ + \n:return \$Return;\r\ + \n}\r\ + \n \r\ + \n:global runningChannel [\$ParseCustom [/system/resource/get version] \"(\ + \" \")\" 1];\r\ + \n:log warning [\$runningChannel];\r\ + \n:set runningVersion [\$ParseCustom [/system/resource/get version] \" \" \ + \")\" 2];\r\ + \n:log warning [\$runningVersion];\r\ + \n\r\ + \n\r\ + \n\r\ + \n# :if ([:len \$open] = 0) do={\r\ + \n# :log error \"\$SMP Could not extract installed OS channel from vers\ + ion string: `\$runningOsAndChannel`.\";\r\ + \n# :error \"\$SMP error, check logs\";\r\ + \n# }\r\ + \n# :local rest [:pick \$runningOsAndChannel (\$open+1) [:len \$runningOs\ + AndChannel]];\r\ + \n# :local close [:find \$rest \")\"];\r\ + \n# :local channel [:pick \$rest 0 \$close];\r\ + \n# :return \$channel;\r\ + \n#}" +add dont-require-permissions=no name=01-Amster-Init-Script owner=vados \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source="# Amster Initial Script\r\ + \n#\r\ + \n#:global GlobalEnvRemove true; /system/script {run Amster-GlobalEnvRemov\ + e; };\r\ + \n#:delay 1s;\r\ + \n:#global ReloadGlobal true; \r\ + \n\r\ + \n:global AmScriptsUrl \"https://ros.vados.ru/\";\r\ + \n:global defOwner \"vados\";\r\ + \n:global AmFirstRun;\r\ + \n\r\ + \n:set AmFirstRun do={\r\ + \n :global AmScriptsUrl;\r\ + \n :global defOwner;\r\ + \n #:global ParseKeyValueStore;\r\ + \n #:local AmUpdCRLF true;\r\ + \n #:local IfThenElse;\r\ + \n #:set IfThenElse do={:if ([ :tostr \$1 ] = \"true\" || [ :tobool \$1\ + \_] = true) do={:return \$2}; :return \$3}\r\ + \n #/certificate/settings/set builtin-trust-store=fetch;\r\ + \n #/tool/fetch \"\$scriptsUrl/certs/Root-YE.pem\" dst-path=\"root-ye.p\ + em\";\r\ + \n #/certificate/import file-name=\"root-ye.pem\" passphrase=\"\";\r\ + \n # For basic verification we rename the certificate and print it by f\ + ingerprint. Make sure exactly this one certificate (\"Root-YE\") is shown.\ + \r\ + \n #/certificate/set name=\"Root-YE\" [ find where common-name=\"Root Y\ + E\" ];\r\ + \n #/certificate/print proplist=name,fingerprint where fingerprint=\"e1\ + 4ffcad5b0025731006caa43a121a22d8e9700f4fb9cf852f02a708aa5d5666\";\r\ + \n #:log info \"\\nAmScriptsUrl = \$AmScriptsUrl\";\r\ + \n :local Scripts {\r\ + \n \"Amster-GlobalConfig\"\r\ + \n \"Amster-GlobalFunc\";\r\ + \n# \"Amster-SFTP-backup\"\r\ + \n# \"Amster-BkpEmail-and-upd\";\r\ + \n };\r\ + \n# /system/script/set owner=(\$ScriptVal->\"name\") \\\r\ + \n# source=[ \$IfThenElse (\$ScriptUpdatesCRLF = true) \$SourceCRLF \$S\ + ourceNew ] \$Script;\r\ + \n :foreach Script in=\$Scripts do={\r\ + \n :put \"Installing \$Script...\";\r\ + \n /system/script/remove [ find where name=\$Script ];\r\ + \n /system/script/add name=\$Script owner=\$defOwner source=([ /too\ + l/fetch (\"\$AmScriptsUrl\" . \$Script . \".rsc\") output=user as-value ]-\ + >\"data\");\r\ + \n /system/script/set source=[ :tocrlf [ get \$Script source ] ] \$\ + Script;\r\ + \n };\r\ + \n /system/script { run Amster-GlobalConfig; run Amster-GlobalFunc; }\r\ + \n}\r\ + \n:global AmUpdRun;\r\ + \n:set AmUpdRun do={\r\ + \n #:local UpdScript [ :tostr \$1 ];\r\ + \n #:global ParseKeyValueStore;\r\ + \n :global AmScriptsUrl;\r\ + \n :global defOwner;\r\ + \n :local Scripts {\r\ + \n# \"Amster-GlobalConfig\"\r\ + \n# \"Amster-GlobalFunc\"\r\ + \n# \"Amster-GlobalRemove\"\r\ + \n \"Amster-backup-SFTP\"\r\ + \n \"Amster-SFTP-backup\"\r\ + \n \"Amster-BkpEmail-and-upd\"\r\ + \n \"Amster-TG-Bot\"\r\ + \n \"Amster-TG-Notification\";\r\ + \n };\r\ + \n :foreach Script in=\$Scripts do={\r\ + \n :put \"updating \$Script...\";\r\ + \n /system/script/remove [ find where name=\$Script ];\r\ + \n /system/script/add name=\$Script owner=\$defOwner source=([ /too\ + l/fetch (\"\$AmScriptsUrl\" . \$Script . \".rsc\") output=user as-value ]-\ + >\"data\");\r\ + \n /system/script/set source=[ :tocrlf [ get \$Script source ] ] \$\ + Script;\r\ + \n };\r\ + \n# /system/script/add name=\$Script owner=\$AmOwner source=([ /tool/fe\ + tch check-certificate=yes-without-crl (\"\$AmScriptsUrl\" . \$Script . \".\ + rsc\") output=user as-value ]->\"data\"); };\r\ + \n}\r\ + \n\r\ + \n\$AmFirstRun;\r\ + \n#\$AmUpdRun;\r\ + \n\r\ + \n#\$setUpdExist;\r\ + \n#:global setUpdExist;\r\ + \n#:global ParseKeyValueStore;\r\ + \n#:set setUpdExist do={\r\ + \n#:do {\r\ + \n#:global ParseKeyValueStore;\r\ + \n# :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vad\ + os\\r\?\\n#comment=*\" ] do={\r\ + \n# :local ScriptVal [ /system/script/get \$Script ];\r\ + \n# :local ScriptInfo [ \$ParseKeyValueStore (\$ScriptVal->\"#comment\"\ + ) ];\r\ + \n# :local scriptName (\$ScriptVal->\"name\");\r\ + \n#:log warning (\"\\n\\\$scriptName = \". \$scriptName);\r\ + \n#: log warning (\"\\n\\\$ScriptInfo = \". \$ScriptInfo);\r\ + \n# }\r\ + \n#} on-error={}\r\ + \n#}\r\ + \n#\$name;\$owner;\$policy;\$dont-require-permissions;\$last-started;\$run\ + -count;\$source;\$invalid;\$comment;\$.id;\$.nextid;\$.dead;\$.about;\r\ + \n#;(evl / (evl /docommand=;(evl / (evl /foreachcounter=\$Script;do=;(evl \ + / (evl /localname=\$ScriptVal;value=(evl (evl /system/script/getnumber=\$S\ + cript))) (evl /localname=\$ScriptInfo;value=(evl (<%% \$ParseKeyValueStore\ + \_(> \$ParseKeyValueStore);(-> \$ScriptVal comment)))) (evl /localname=\$s\ + criptName) (evl /setname=\$scriptName;value=(-> #\$ScriptVal name)) (evl /\ + log/errormessage=(. \r\ + \n# \$ ScriptInfo = \$ScriptInfo)));in=(evl (evl /system/script/findwhere\ + =\$name;\$owner;\$policy;\$dont-require-permissions;\$last-started;\$run-c\ + ount;\$source;\$invalid;\$comment;\$.id;\$.nextid;\$.dead;\$.about;(~ \$so\ + urce (. ^#!rsc by Vados \r\ + \n# \? \r\ + \n#));5))));on-error=;(evl /)))\r\ + \n" +add dont-require-permissions=no name="Download cAP's Packages" owner=vados \ + policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \ + source="# +------------------------------+\r\ + \n# | |\r\ + \n# | Mikrotik RouterOS Scripts |\r\ + \n# | _Download cAP's Packages_ |\r\ + \n# | |\r\ + \n# +------------------------------+\r\ + \n# https://github.com/sebastian13/mikrotik-routeros-scripts\r\ + \n#\r\ + \n\r\ + \n# Set a directory path providing the required space\r\ + \n# Add a microSD card https://wiki.mikrotik.com/wiki/Manual:System/Disks\ + \r\ + \n# or setup a RAM-Disk via '/disk/add type=tmpfs tmpfs-max-size=20M slot=\ + ram'\r\ + \n:local dir \"/tmpfs/capsman-packages\";\r\ + \n\r\ + \n\r\ + \n# Set Package Path if required, set policy to none if using 'upgrade-cap\ + s' script\r\ + \n/interface/wifi/capsman/set package-path=\$dir upgrade-policy=none;\r\ + \n/caps-man/manager/set package-path=\$dir upgrade-policy=none;\r\ + \n#require-same-version;\r\ + \n\r\ + \n:local installed [/system package get value-name=version [find where nam\ + e=\"routeros\"]]\r\ + \n\r\ + \n# Delete old downloads\r\ + \n# /file/remove [ find type=package name~\"capsman*\" ]\r\ + \n\r\ + \n# Starting from RouterOS version 7.13, drivers for older wireless and 60\ + GHz interfaces are\r\ + \n# part of the separate \"wireless\" package. The existing \"wifiwave2\" \ + package has been divided\r\ + \n# into distinct packages: \"wifi-qcom\" and \"wifi-qcom-ac\".\r\ + \n# RouterOS >=7.12 is required to upgrade to 7.13.\r\ + \n# https://forum.mikrotik.com/viewtopic.php\?t=202423\r\ + \n\r\ + \n:foreach architecture in={ \"arm\";\r\ + \n# \"arm64\";\r\ + \n \"x86_64\";\r\ + \n \"mipsbe\"} do={\r\ + \n :foreach package in={ \"routeros\";\r\ + \n# \"wifi-qcom-ac\";\r\ + \n# \"wifi-qcom\";\r\ + \n \"wireless\"} do={ :do {\r\ + \n :put \"\"\r\ + \n :put \"Download \$package \$installed for \$architecture\"\r\ + \n /tool fetch mode=https \\\r\ + \n url=\"https://download.mikrotik.com/routeros/\$installed/\$packa\ + ge-\$installed-\$architecture.npk\" \\\r\ + \n dst-path=\"\$dir/\$package-\$installed-\$architecture.npk\"\r\ + \n } on-error={ :put \"Error downloading the file. On a 404, note t\ + hat the package may not exist for the specified architecture!\" }\r\ + \n }\r\ + \n}\r\ + \n" +add comment="Script for setup routeros scrypt system" \ + dont-require-permissions=no name=AM-setup owner=AM-setup policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-setup\r\ + \n# Script comment: Script for setup routeros scrypt system\r\ + \n# Copyright (c) 2005-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.19\r\ + \n# requires device-mode, fetch\r\ + \n#\r\ + \n# :local ScriptName [ :jobname ];\r\ + \n# Additional commands:\r\ + \n#\r\ + \n# For scripts:\r\ + \n#:global NewScript \"script_name\"; \r\ + \n#:global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ + \n#/system/script/add name=\$NewScript owner=\$NewScript source=([/tool/fe\ + tch check-certificate=yes-without-crl (\$GlobalScriptsUrl . \$ScriptAdd . \ + \".rsc\") output=user as-value ]->\"data\");\r\ + \n#:global NewScript (a);\r\ + \n#:global ScriptInstallUpdate; \$ScriptInstallUpdate;\r\ + \n#\r\ + \n# For run from terminal:\r\ + \n#/system/script/add name=AM-setup owner=AM-Setup source=([/tool/fetch ch\ + eck-certificate=yes-without-crl \"https://ros.vados.ru/AM-setup.rsc\" outp\ + ut=user as-value ]->\"data\");\r\ + \n#\r\ + \n#:foreach Script in=[ /system/script/find where source~\"^#!rsc by Vados\ + \" ] do={\r\ + \n# if (\$ScriptUpdatesCRLF = true) do={\r\ + \n# /system/script/set source=[ :tocrlf [ get \$Script source ] ] \$Scri\ + pt;\r\ + \n# } else={\r\ + \n# /system/script/set source=[ :tolf [ get \$Script source ] ] \$Script\ + ;\r\ + \n# }\r\ + \n#}\r\ + \n# /import verbose=no \$ScriptName\r\ + \n:global SetupScript [ :jobname ];\r\ + \n:global RemoveMe;\r\ + \n:global InitSetup true;\r\ + \n:global tmpfs true;\r\ + \n\r\ + \n{\r\ + \n :local RmMe [:tobool \$1];\r\ + \n\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global SetupScript;\r\ + \n :global RemoveMe;\r\ + \n :global InitSetup;\r\ + \n :global tmpfs;\r\ + \n \r\ + \n :local CertCommonName \"Root YE\";\r\ + \n :local CertFileName \"Root-YE.pem\";\r\ + \n :local CertFingerprint \"e14ffcad5b0025731006caa43a121a22d8e9700f4fb9c\ + f852f02a708aa5d5666\";\r\ + \n\r\ + \n :if (\$SetupScript = false) do={\r\ + \n :global SetupScript \"AM-setup\";\r\ + \n }\r\ + \n :if (\$RemoveMe != false) do={\r\ + \n :set RemoveMe true;\r\ + \n }\r\ + \n\r\ + \n :log warning (\"\\n\\\$GlobalScriptsUrl = \" . \$GlobalScriptsUrl);\r\ + \n \r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if (!(((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" || \ + \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \"fetch\" || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ + \n [ :len [ /certificate/builtin/find where common-name=\$CertComm\ + onName ] ] > 0)) do={\r\ + \n :put \"Importing certificate...\";\r\ + \n \r\ + \n /tool/fetch (\$GlobalScriptsUrl . \"certs/\" . \$CertFileName) dst-p\ + ath=\$CertFileName as-value;\r\ + \n :delay 1s;\r\ + \n /certificate/import file-name=\$CertFileName passphrase=\"\";\r\ + \n :if ([ :len [ /certificate/find where fingerprint=\$CertFingerprint \ + ] ] != 1) do={\r\ + \n :error \"Something is wrong with your certificates!\";\r\ + \n };\r\ + \n :delay 1s;\r\ + \n };\r\ + \n :put \"Thr tmpfs variable is true. Checking for tmpfs/scripts director\ + y...\";\r\ + \n :if (\$tmpfs = true && [/file find name=\"tmpfs/scripts\"] != \"\") do\ + ={\r\ + \n :log debug (\$0 . \"Directory tmpfs/scripts exsist.\");\r\ + \n :return \$true;\r\ + \n } else={\r\ + \n :log error (\$0 . \"Directory tmpfs/scripts does not exsist. Remove \ + global variable tmpfs!\");\r\ + \n :global tmpfs (a);\r\ + \n return false;\r\ + \n}\r\ + \n :put \"Renaming AM-GlobalConfig, if exists...\";\r\ + \n :local ConfOldName (\"AM-GlobalConfig-\" . [ /system/clock/get date ] \ + . [ /system/clock/get time ] . \".rsc\");\r\ + \n /system/script/set name=\$ConfOldName [ find where name=\"AM-GlobalCon\ + fig\" ];\r\ + \n :foreach Script in={ \"AM-GlobalConfig\"; \"AM-GlobalFunc\" } do={\r\ + \n :put \"Installing \$Script...\";\r\ + \n /system/script/remove [ find where name=\$Script ];\r\ + \n /system/script/add name=\$Script owner=\$Script source=([ /tool/fetc\ + h check-certificate=yes-without-crl url=(\$GlobalScriptsUrl . \$Script . \ + \".rsc\") output=user as-value ]->\"data\");\r\ + \n \r\ + \n /system/script run \$Script;\r\ + \n :delay 2s;\r\ + \n };\r\ + \n\r\ + \n :if ([ :len [ /certificate/find where fingerprint=\$CertFingerprint ] \ + ] > 0) do={\r\ + \n :put \"Renaming certificate by its common-name...\";\r\ + \n :global CertificateNameByCN;\r\ + \n \$CertificateNameByCN \$CertFingerprint;\r\ + \n };\r\ + \n\r\ + \n :if (\$RemoveMe = true) do={\r\ + \n :put \"Add Scheduler for remove this script...\";\r\ + \n :local OnEvent (\":delay 30s;\\n\" . \"/system/script/remove [ find \ + where name=\\\"\$SetupScript\\\" ];\\n\" . \\\r\ + \n \":delay 2s;\\n\" . \"/system/scheduler/remove [ find where name=\\\ + \"_RemoveSetup\\\" ];\\n\" . \\\r\ + \n \":delay 2s;\\n\" . \":global RemoveMe (a);\\n\");\r\ + \n :local Comment \"_RemoveSetup tmp scheduler for remove setup script.\ + \";\r\ + \n /system/scheduler/add name=\"_RemoveSetup\" comment=\$Comment start-\ + time=startup interval=30s on-event=\$OnEvent;\r\ + \n :log warning (\$0 . \"\\nI've done everything, and now I'm tired..\ + . I'm leaving.\\nThere will be an error below, this is normal.\");\r\ + \n }\r\ + \n :delay 1;\r\ + \n :put \"Loading configuration and functions...\";\r\ + \n :do { \r\ + \n :global ScriptInstallUpdate; \$ScriptInstallUpdate;\r\ + \n :put \"Normal removing temporary global environment variables.\";\ + \r\ + \n :global SetupScript (a);\r\ + \n :global InitSetup (a);\r\ + \n :global RemoveMe (a);\r\ + \n } on-error={\r\ + \n :local ErrorMsg \"Loading configuration and functions error!\";\r\ + \n :log error (\$0 . \$ErrorMsg . :error);\r\ + \n :error \$ErrorMsg;\r\ + \n }\r\ + \n}\r\ + \n" +add comment="Global Config Script" dont-require-permissions=no name=\ + AM-GlobalConfig owner=AM-GlobalConfig policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-GlobalConfig\r\ + \n# Script comment: Global Config Script\r\ + \n# Copyright (c) 2007-2026 Vados \r\ + \n#\r\ + \n#\r\ + \n# Warning: Dont touch this line!\r\ + \n:global GlobalConfReady false;\r\ + \n# \\/ start edit\r\ + \n#\r\ + \n# Global Url For Amster scripts to fetch\r\ + \n# most be defined in Amster-Init-Script\r\ + \n:global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ + \n:global ScriptsUrlSuffix \"\";\r\ + \n:global CheckSumsVerify true;\r\ + \n\r\ + \n:global ScriptUpdatesCRLF true;\r\ + \n:global CommentsInScripts true;\r\ + \n\r\ + \n# Debug output:\r\ + \n:global PrintDebug true; #false;\r\ + \n\r\ + \n# Debug output for specific script:\r\ + \n:set (\$PrintDebugOverride->\"AM-GlobalFunc\") true;\r\ + \n\r\ + \n# Debug logs\r\ + \n# Other actions (disk, email, remote or support) can be used as well.\r\ + \n# I do not recommend using echo - use debug output instead (https://rsc.\ + eworm.de/main/DEBUG.html#debug-output).\r\ + \n#/system/logging/add topics=script,debug action=memory;\r\ + \n\r\ + \n:global MikrotikUpgradeUrl \"https://upgrade.mikrotik.com/routeros\";\r\ + \n:global Domain \"WORKGROUP\";\r\ + \n\r\ + \n:global EmailGeneralTo \"vados@vados.ru\"; #:global EmailGeneralCc \"\";\ + \r\ + \n\r\ + \n# \$ScriptInstallUpdate mod/notification-telegram\r\ + \n:global TelegramTokenId \"8390868324:AAG3_d1hfVR2M6pGAgDK6ZvhOe4J97nyopw\ + \";\r\ + \n:global TelegramChatId \"-1003631309063\"; #\"454403445\";\r\ + \n# Use this to send notifications to a specific topic in group.\r\ + \n#:global TelegramThreadId \"30\";\r\ + \n# Using telegram-chat you have to define trusted chat ids (not group ids\ + !)\r\ + \n# or user names. Groups allow to chat with devices simultaneously.\r\ + \n:global TelegramChatIdsTrusted {\r\ + \n \"454403445\"\r\ + \n \"-1003631309063\"\r\ + \n \"-5124482807\"\r\ + \n \"1087968824\";\r\ + \n};\r\ + \n# \"-5294757340\";\r\ + \n\r\ + \n:global TelegramChatGroups \"(all)\";\r\ + \n#:global TelegramChatGroups \"(all|home|office)\";\r\ + \n\r\ + \n:global NotificationFunctions {\r\ + \n \"email\"\r\ + \n \"telegram\";\r\ + \n};\r\ + \n# Toggle this to disable symbols in notifications.\r\ + \n:global NotificationsWithSymbols true;\r\ + \n:global TerminalColorOutput true;\r\ + \n\r\ + \n:global DetectIpAddrDefault \"https://ipv4.mikrotik.ovh/\";\r\ + \n:global DetectIpAddrFallback \"https://api.ipify.org/\";\r\ + \n\r\ + \n## Update channel. Possible values: stable, long-term, testing, developm\ + ent\r\ + \n:global updateChannel \"stable\";\r\ + \n\r\ + \n# Script BackupAndUpdate mode, possible values: backup,\r\ + \n# updateOnce - Update once as \"osnotify\" and back \"osnotify\" mode (i\ + n terminal run :set OSUpdateMode updateOnce; \$OSUpdateMode;). \r\ + \n# osupdate - Update if available and creates backups before/after update\ + \_(ignores `forceBackup`)\r\ + \n# Set `forceBackup` to true to always create backups, even\ + \_without updates\r\ + \n# osnotify - Set `forceBackup` to always create backups on every run\r\ + \n:global DevInfoIncludeIP true;\r\ + \n:global BackupAndUpdateMode \"osnotify\"\r\ + \n\r\ + \n:global forceBackup true;\r\ + \n:global BackupPassword \"Peskar55\";\r\ + \n\r\ + \n# SFTP Backup Variables\r\ + \n:global BackupRandomDelay 0;\r\ + \n:global BackupUploadUrl \"sftp://amster.vados.ru/upload/\";\r\ + \n:global BackupUploadUser \$Identity;\r\ + \n:global BackupUploadPass \"root.mnuc.backuper\";\r\ + \n\r\ + \n:global BackupSendBinary true;\r\ + \n:global BackupSendExport true;\r\ + \n:global BackupSendGlobalConfig true;\r\ + \n:global BackupSendScripts true;\r\ + \n\r\ + \n# Remove local file after uploading if no errors\r\ + \n:global BackupRmLocal true;\r\ + \n\r\ + \n# Local Backups Root Directory \r\ + \n:global BackupLocalRoot \"tmpfs\";\r\ + \n\r\ + \n# Encrypt Backup\r\ + \n:global BackupEncrypt true;\r\ + \n\r\ + \n# Sensitive information in Backups\r\ + \n:global BackupSens true;\r\ + \n\r\ + \n# User Export\r\ + \n:global BackupUser true;\r\ + \n\r\ + \n# License Export (not for CHR, will silently skip)\r\ + \n:global BackupLicense false;\r\ + \n\r\ + \n# SSH Keys\r\ + \n:global BackupSshKeys true;\r\ + \n\r\ + \n# Certificate Export\r\ + \n:global BackupCerts true;\r\ + \n\r\ + \n# Certificate Password\r\ + \n:global BackupCertsPasswd \"\";\r\ + \n\r\ + \n# User-Manager Export\r\ + \n:global BackupUserMan false;\r\ + \n\r\ + \n# The Dude Export\r\ + \n:global BackupDude false;\r\ + \n\r\ + \n# User Files to export, comma-separated string or array of strings\r\ + \n# User Files are not removed on backup\r\ + \n# Any directory paths will be removed (/ -> _) on remote file\r\ + \n# Nonpresent files are silently skipped\r\ + \n:global BackupUserList \"autosupout.rif,autosupout.old.rif\";\r\ + \n\r\ + \n# load functions and any custom scripts\r\ + \n# [ /system/script/find where name=\"global-config-ov\ + erlay\" ], \\\r\ + \n# [ /system/script/find where name~\"^global-config-o\ + verlay\\\\.d/.\" ]\r\ + \n#\r\ + \n#:foreach Script in=([ /system/script/find where name=\"Amster-TGglobalV\ + ars\" ], [ /system/script/find where name=\"Amster-TGglobalFunc\" ]) do={\ + \r\ + \n# :onerror Err {\r\ + \n# /system/script/run \$Script;\r\ + \n# } do={\r\ + \n# :log error (\"Loading configuration from configs and functions\"\ + \_. [ /system/script/get \$Script name ] . \" failed: \" . \$Err);\r\ + \n# }\r\ + \n#}\r\ + \n#:log info \"\\ndevMode = \$devMode\";\r\ + \n#:log info \"\\ndevRunning = \$devRunning\";\r\ + \n:foreach Script in=[ /system/script/find where source~\"^#!rsc by Vados \ + GlobalRUN\\r\?\\n\" ] do={\r\ + \n :onerror Err {\r\ + \n /system/script/run \$Script;\r\ + \n } do={\r\ + \n :log error (\"Run script \" . [ /system/script/get \$Script name \ + ] . \" width marker \\\" GlobalRUN\\\" failed: \" . \$Err);\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# signal we are ready\r\ + \n:set GlobalConfReady true;\r\ + \n:while (\$GlobalConfReady != true) do={:delay 500ms};\r\ + \n" +add comment="Global functions" dont-require-permissions=no name=AM-GlobalFunc \ + owner=AM-GlobalFunc policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="#\ + !rsc by Vados\r\ + \n# RouterOS script: AM-GglobalFunc\r\ + \n# Script comment: Global functions\r\ + \n#\r\ + \n#\r\ + \n# requires RouterOS, version=7.21\r\ + \n# requires device-mode, fetch, scheduler\r\ + \n:local ExitOK false;\r\ + \n:local ScriptName [ :jobname ];\r\ + \n#:global checkRunJob \$SriptName;\r\ + \n#:global fixCRLF;\r\ + \n#:if (\$fixCRLF != false) do={\r\ + \n#:foreach fixScript in=([ /system/script/find where name~\"*\" ]) do={/s\ + ystem/script/set source=[ :tocrlf [ get \$fixScript source ] ] \$fixScript\ + }\r\ + \n#:if (\$fixCRLF != \"LF\") do={ /system/script/set source=[ :tocrlf [ g\ + et \$fixScript source ] ] \$fixScript};};\r\ + \n#}\r\ + \n:global GlobalFuncReady false;\r\ + \n\r\ + \n# The variables are received right here.\r\ + \n:global GlobalConfVersion 138;\r\ + \n\r\ + \n:global Identity [/system/identity/get name];\r\ + \n:global IdentityShort [:pick \$Identity 0 18];\r\ + \n\r\ + \n:global devBoardName [/system/resource/get board-name];\r\ + \n:global devMode [/system/device-mode/get mode];\r\ + \n:global devCurArch [/system/resource/get architecture-name];\r\ + \n:global devCurVersion [/system/resource/get version];\r\ + \n\r\ + \n# Variables defined in AM-GlobalConfig.rsc\r\ + \n:global TerminalColorOutput;\r\ + \n:global CommentsInScripts;\r\ + \n:global DetectIpAddrDefault;\r\ + \n:global DetectIpAddrFallback;\r\ + \n:global updateChannel;\r\ + \n:global Domain;\r\ + \n:global EmailGeneralTo;\r\ + \n:global BackupAndUpdateMode;\r\ + \n\r\ + \n# Single functions, without nested functions.\r\ + \n:global GlobalEnvRemove;\r\ + \n:global MiniDateTimeStamp;\r\ + \n\r\ + \n# Include globals \$PrintDebug and \$PrintDebugOverride\r\ + \n:global LogPrint;\r\ + \n\r\ + \n# DeviceInfo and Updates\r\ + \n:global IsCheckUpdates;\r\ + \n:global WaitCheckUpdates;\r\ + \n:global GetPubIp;\r\ + \n\r\ + \n:global GetArrDeviceInfo;\r\ + \n:global WaitArrDeviceInfo;\r\ + \n\r\ + \n:global devModel;\r\ + \n:global devRunningMode;\r\ + \n\r\ + \n:global devRbRevision;\r\ + \n:global devRbSerialNumber;\r\ + \n:global devRbVerAvail;\r\ + \n\r\ + \n:global runningChannelVersion;\r\ + \n:global runningChannel;\r\ + \n:global runningVersion;\r\ + \n\r\ + \n:global devBuildTime;\r\ + \n#:global ROsVerAvail;\r\ + \n:global PkgUpdStatus;\r\ + \n:global currentUpdateChannel;\r\ + \n\r\ + \n:global ScriptInstallUpdate;\r\ + \n\r\ + \n:global DeviceInfo;\r\ + \n\r\ + \n:global OldMode;\r\ + \n\r\ + \n:global ParseKeyValueStore;\r\ + \n:global RandomDelay;\r\ + \n:global GetRandomNumber;\r\ + \n:global EscapeForRegEx;\r\ + \n:global ExitError;\r\ + \n:global CleanFilePath;\r\ + \n:global CleanName;\r\ + \n:global CharacterReplace;\r\ + \n:global CharacterMultiply;\r\ + \n:global EitherOr;\r\ + \n:global FormatLine;\r\ + \n:global GetRandom20CharAlNum;\r\ + \n:global Grep;\r\ + \n:global IfThenElse;\r\ + \n:global MAX;\r\ + \n:global MIN;\r\ + \n:global HumanReadableNum;\r\ + \n\r\ + \n:global IsFullyConnected;\r\ + \n:global IsDNSResolving;\r\ + \n:global IsTimeSync;\r\ + \n:global IsTimeSyncCached;\r\ + \n:global IsTimeSyncResetNtp;\r\ + \n\r\ + \n:global WaitDNSResolving;\r\ + \n:global WaitFullyConnected;\r\ + \n:global WaitTimeSync;\r\ + \n:global MkDir;\r\ + \n:global RmDir;\r\ + \n:global RmFile;\r\ + \n:global FileGet;\r\ + \n:global Unix2Dos;\r\ + \n:global UrlEncode;\r\ + \n:global WaitForFile;\r\ + \n:global ScriptLock;\r\ + \n:global SendTelegram;\r\ + \n:global NotificationFunctions;\r\ + \n:global SendNotification;\r\ + \n:global SendNotification2;\r\ + \n:global SymbolForNotification;\r\ + \n:global SymbolByUnicodeName;\r\ + \n:global ValidateSyntax;\r\ + \n:global CheckSumsVerify;\r\ + \n:global GlobalConfChanges;\r\ + \n:global GlobalConfMigration;\r\ + \n:global VersionToNum;\r\ + \n:global RequiredRouterOS;\r\ + \n:global FetchLargeFiles;\r\ + \n:global FetchUserAgentStr;\r\ + \n:global CertificateAvailable;\r\ + \n:global CertificateDownload;\r\ + \n:global CertificateNameByCN;\r\ + \n:global CharacterMultiply;\r\ + \n\r\ + \n:global InspectVar;\r\ + \n:global InspectVarRet;\r\ + \n:global ParseCustom;\r\ + \n\r\ + \n:set IsCheckUpdates do={\r\ + \n :local isInfo [:tobool \$1];\r\ + \n :global LogPrint;\r\ + \n :global updateChannel;\r\ + \n :global PkgUpdStatus;\r\ + \n \$LogPrint debug \$0 (\"\\\$isInfo = \" . \$isInfo); \r\ + \n :local CurrentChannel [ /system/package/update/get channel ];\r\ + \n :if (\$CurrentChannel != \$updateChannel) do={\r\ + \n :retry command={/system/package/update set channel=\$updateChannel} \ + \_delay=300ms max=5 on-error={};\r\ + \n \$LogPrint debug \$0 (\"Set updates channel to: \$updateChannel\");\ + \r\ + \n }\r\ + \n \r\ + \n :local Update [ /system/package/update/get ];\r\ + \n :local Channel (\$Update->\"channel\");\r\ + \n \$LogPrint debug \$0 (\"Update Channel: \" . \$Channel . \".\");\r\ + \n \r\ + \n :local StatusPkg \"undefined\";\r\ + \n \$LogPrint debug \$0 (\"Checking for updates...\");\r\ + \n :retry command={:set \$StatusPkg ([/system/package/update/check-for-up\ + dates without-paging as-value]->\"status\")} \\\r\ + \n delay=300ms max=5 on-error={};\r\ + \n \$LogPrint debug \$0 (\"\\\$StatusPkg = \" . \$StatusPkg);\r\ + \n :if (\$StatusPkg = \"New version is available\") do={ :set PkgUpdStatu\ + s true; } else={ :set PkgUpdStatus false; }\r\ + \n \$LogPrint debug \$0 (\"\\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if (\$isInfo != false || \$PkgUpdStatus = true) do={\r\ + \n \$LogPrint debug \$0 (\"\\\$PkgUpdStatus = \" . \$PkgUpdStatus);\r\ + \n :if ([:len \$arrDeviceInfo] = 0) do={\r\ + \n :global arrDeviceInfo ({});\r\ + \n :local arrDeviceInfo ({\"section\":{\"key\":\"\"; \"value\":\"\";};}\ + );\r\ + \n }\r\ + \n # else={:local arrDeviceInfo ({})}\r\ + \n :retry command={:set (\$arrDeviceInfo->\"devUpdates\") [[ :parse \"/\ + system/package/update/get\" ]]} delay=500ms max=5 on-error={:log error (\"\ + Error\")};\r\ + \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devCurrentChannel\"; \$Cu\ + rrentChannel;};\r\ + \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devCurrentVersion\"; (\$U\ + pdate->\"installed-version\");};\r\ + \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devCurrentChannelVersion\ + \"; [/system/resource/get version];};\r\ + \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devUpdateChannel\"; [\$up\ + dateChannel];};\r\ + \n #:set (\$arrDeviceInfo->\"devUpdates\") {\"devUpdateVersion\"; (\$Up\ + date->\"latest-version\");};\r\ + \n } else={\r\ + \n :return \$PkgUpdStatus;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set WaitArrDeviceInfo do={\r\ + \n :global GetArrDeviceInfo;\r\ + \n :while ([ \$GetArrDeviceInfo ] = false) do={\r\ + \n :delay 1s;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set GetArrDeviceInfo do={\r\ + \n :global LogPrint;\r\ + \n\r\ + \n :global devBoardName;\r\ + \n :global devModel;\r\ + \n \r\ + \n :global arrDeviceInfo [:toarray {\"section\"={\"key\"=\"\"; \"value\"\ + =\"\";} }];\r\ + \n #:do {:set (\$arrDeviceInfo->\"Updates\") [[ :parse \"/system/package\ + /update/get\" ]]} on-error={}\r\ + \n :global devRbRevision;\r\ + \n :global devRbSerialNumber;\r\ + \n :global devRbCurrentFw;\r\ + \n :global devRbUpgradeFw;\r\ + \n \r\ + \n :global devRunning;\r\ + \n :global devCurArch;\r\ + \n :global ROsVerCurrent;\r\ + \n :global ROsChannelCurrent;\r\ + \n :global ROsVerAvail;\r\ + \n\r\ + \n :global ParseCustom;\r\ + \n :global runningChannelVersion;\r\ + \n :global runningChannel;\r\ + \n :global runningVersion;\r\ + \n :global devBuildTime;\r\ + \n :global GetPubIp;\r\ + \n \r\ + \n :local License [/system/license/get];\r\ + \n :local Resource [/system/resource/get];\r\ + \n :set devBuildTime (\$Resource->\"build-time\");\r\ + \n :set runningChannelVersion (\$Resource->\"version\");\r\ + \n :set runningChannel [\$ParseCustom \$runningChannelVersion \"(\" \")\ + \" 1];\r\ + \n :set runningVersion [\$ParseCustom \$runningChannelVersion \" \"];\r\ + \n \r\ + \n :do {\r\ + \n :if ([:pick \$devBoardName 0 3] != \"CHR\" or [:pick \$devBoardName 0\ + \_3] != \"x86\") do={\r\ + \n :local RouterBoard;\r\ + \n :do {:set RouterBoard [[ :parse \"/system/routerboard/get\" ]]} on\ + -error={}\r\ + \n :set devModel (\$RouterBoard->\"model\");\r\ + \n :set devRbRevision (\$RouterBoard->\"revision\");\r\ + \n :set devRbSerialNumber (\$RouterBoard->\"serial-number\");\r\ + \n #:set devRbCurrentFw (\$RouterBoard->\"current-firmware\");\r\ + \n #:set devRbUpgradeFw (\$RouterBoard->\"upgrade-firmware\");\r\ + \n :if (\$devCurArch = \"mipsbe\" || \$devCurArch = \"arm\") do={\r\ + \n :global devRunning [ /system/device-mode/get mode ];\r\ + \n } else={\r\ + \n :global devRunning [/system/device-mode/get running];}\r\ + \n } else={\r\ + \n :set devModel \$devBoardName;\r\ + \n \r\ + \n :set devRbRevision false;\r\ + \n :set devRbSerialNumber false;\r\ + \n# :set devRbCurrentFw false;\r\ + \n# :set devRbUpgradeFw false;\r\ + \n #:set devCurrentFw \$runningVersion;#:set devUpgradeFw \$ROsVerAvail\ + ;\r\ + \n :set devRunning [/system/device-mode/get running];\r\ + \n }\r\ + \n } on-error={\r\ + \n \$LogPrint error \$0 (\"Error in Function getDevice!\");\r\ + \n :return false;\r\ + \n }\r\ + \n:return true;\r\ + \n}\r\ + \n\r\ + \n:set DeviceInfo do={\r\ + \n :global WaitArrDeviceInfo;\r\ + \n # \$WaitDeviceInfo;\r\ + \n :global devBoardName;\r\ + \n :global devCurArch;\r\ + \n :global devModel;\r\ + \n :global devRunning;\r\ + \n :global devRbRevision;\r\ + \n :global devRbSerialNumber;\r\ + \n :global PiblicIpAddress;\r\ + \n\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global IfThenElse;\r\ + \n :global FormatLine;\r\ + \n :local Return;\r\ + \n :local License [/system/license/get];\r\ + \n :local Resource [/system/resource/get];\r\ + \n :local Snmp [ /snmp/get ];\r\ + \n :local Update [ /system/package/update/get ];\r\ + \n \r\ + \n :set Return ([ \$FormatLine \"Hostname:\" \$Identity ] . \"\\n\" . \\\ + \r\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"location\") ] > 0) \\\r\ + \n ([ \$FormatLine \"Location:\" (\$Snmp->\"location\") ] . \"\\n\") \ + ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$Snmp->\"contact\") ] > 0) \\\r\ + \n ([ \$FormatLine \"Contact:\" (\$Snmp->\"contact\") ] . \"\\n\") ] \ + . \\\r\ + \n \"Hardware:\\n\" . \\\r\ + \n [ \$FormatLine \" Board:\" . \$devBoardName ] . \"\\n\" . \\\r\ + \n [ \$FormatLine \" Arch:\" . \$devCurArch ] . \"\\n\" . \\\r\ + \n [ \$FormatLine \" Model:\" \$devModel ] . \\\r\ + \n [ \$IfThenElse ([ :len \$devRbRevision ] > 0) \\\r\ + \n (\" \" . \$devRbRevision) ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len \$devRbSerialNumber ] > 0) \\\r\ + \n ([ \$FormatLine \" Serial:\" . \$devRbSerialNumber ] . \"\\n\"\ + ) ] . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"nlevel\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License:\" (\"level \" . (\$License->\"nleve\ + l\")) ] . \"\\n\") ] . \"RouterOS:\\n\" . \\\r\ + \n [ \$IfThenElse ([ :len (\$License->\"level\") ] > 0) \\\r\ + \n ([ \$FormatLine \" License:\" (\"level \" . (\$License->\"level\ + \")) ] . \"\\n\") ] . \\\r\ + \n [ \$FormatLine \"Running Channel\" \$runningChannel ] . \"\\n\" . \\\ + \r\ + \n [ \$FormatLine \" Installed:\" (\$Update->\"installed-version\") \ + ] . \"\\n\" . \\\r\ + \n [ \$IfThenElse ([ :typeof (\$Update->\"latest-version\") ] != \"noth\ + ing\" && \\\r\ + \n \$Update->\"installed-version\" != \$Update->\"latest-version\")\ + \_\\\r\ + \n ([ \$FormatLine \" Available\" (\$Update->\"latest-version\") ]\ + \_. \"\\n\") ] . \\\r\ + \n [ \$IfThenElse (\$RouterBoard->\"routerboard\" = true && \\\r\ + \n \$RouterBoard->\"current-firmware\" != \$RouterBoard->\"upgrade-\ + firmware\") \\\r\ + \n ([ \$FormatLine \" Firmware\" (\$RouterBoard->\"current-firmwar\ + e\") ] . \"\\n\") ] . \\ \r\ + \n \"RouterOS-Scripts:\\n\" . \\\r\ + \n [ \$FormatLine \" Commit\" [ \$CommitBrief ] ] . \"\\n\" . \\\r\ + \n [ \$FormatLine \" Version\" \$GlobalConfVersion ]);\r\ + \n}\r\ + \n\r\ + \n:if ([ :typeof \$NotificationFunctions ] != \"array\") do={:set Notifica\ + tionFunctions ({})}\r\ + \n:set GetRandom20CharAlNum do={\r\ + \n :global EitherOr;\r\ + \n :return [ :rndstr length=[ \$EitherOr [ :tonum \$1 ] 20 ] from=\"ABCDE\ + FGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" ];\r\ + \n}\r\ + \n\r\ + \n:global checkRunJob;\r\ + \n:set checkRunJob do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLock; \r\ + \n :if ([ \$ScriptLock \$Script ] = false) do={:return false}\r\ + \n :foreach Job in=[ /system/script/job/find where script=\$Script ] do={\ + :set Job [ /system/script/job/get \$Job ];\r\ + \n :while ([ :typeof (\$Job->\"parent\") ] = \"id\") do={:set Job [ /sy\ + stem/script/job/get [ find where .id=(\$Job->\"parent\") ] ]}\r\ + \n :if ((\$Job->\"type\") = \"login\") do={:return true};}; :return fa\ + lse; \r\ + \n}\r\ + \n\r\ + \n:set InspectVar do={\r\ + \n :global InspectVarRet;\r\ + \n :put [ :tocrlf [ \$InspectVarRet \$1 ] ];\r\ + \n}\r\ + \n\r\ + \n:set InspectVarRet do={\r\ + \n :local Input \$1;\r\ + \n :local Level (0 + [ :tonum \$2 ]);\r\ + \n :global CharacterReplace;\r\ + \n :global IfThenElse;\r\ + \n :global InspectVarRet;\r\ + \n :local IndentReturn do={\r\ + \n :local Prefix [ :tostr \$1 ];\r\ + \n :local Value [ :tostr \$2 ];\r\ + \n :local Level [ :tonum \$3 ];\r\ + \n :global CharacterMultiply;\r\ + \n :return ([ \$CharacterMultiply \" \" (\$Level * 2) ] . \"-\" . \$Pre\ + fix . \"-> \" . \$Value);\r\ + \n }\r\ + \n :local TypeOf [ :typeof \$Input ];\r\ + \n :local Len [ :len \$Input ];\r\ + \n :local Return [ \$IndentReturn \"type\" \$TypeOf \$Level ];\r\ + \n :if (\$TypeOf = \"array\") do={\r\ + \n :foreach Key,Value in=\$Input do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"key\" \$Key (\$Level + 1) ] . \"\\n\" . \\\r\ + \n [ \$InspectVarRet \$Value (\$Level + 2) ]);\r\ + \n }\r\ + \n } else={\r\ + \n :if (\$TypeOf = \"str\") do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"len\" \$Len \$Level ]);\r\ + \n :if ([ :typeof [ :find \$Input (\"\\r\") ] ] = \"num\") do={\r\ + \n :set Input [ \$CharacterReplace \$Input (\"\\r\") \"\" ];\r\ + \n }\r\ + \n :if ([ :typeof [ :find \$Input (\"\\n\") ] ] = \"num\") do={\r\ + \n :set Input [ \$CharacterReplace \$Input (\"\\n\") \" \" ];\r\ + \n }\r\ + \n }\r\ + \n :if (\$TypeOf != \"nothing\") do={\r\ + \n :set \$Return (\$Return . \"\\n\" . \\\r\ + \n [ \$IndentReturn \"value\" [ \$IfThenElse ([ :len \$Input ] > 80)\ + \_\\\r\ + \n ([ :pick \$Input 0 77 ] . \"...\") \$Input ] \$Level ]);\r\ + \n }\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n# !!! The function is not ready !!!\r\ + \n:global FetchHttpInfo do={\r\ + \n :local Mac [ :tostr \$1 ];\r\ + \n :global CertificateAvailable;\r\ + \n :global IsMacLocallyAdministered;\r\ + \n :global LogPrint;\r\ + \n :local Url \"https://api.macvendors.com/\";\r\ + \n :if ([ \$IsMacLocallyAdministered \$Mac ] = true) do={:return \"locall\ + y administered\";}\r\ + \n :do {\r\ + \n :if ([ \$CertificateAvailable \"GTS Root R4\" \"fetch\" ] = false) d\ + o={\r\ + \n \$LogPrint warning \$0 (\"Downloading required certificate failed.\ + \");\r\ + \n :error false;\r\ + \n }\r\ + \n :local Vendor ([ /tool/fetch \r\ + \n (\$Url . [ :pick \$Mac 0 8 ]) output=user as-value ]->\"data\");\r\ + \n :return \$Vendor;\r\ + \n } on-error={\r\ + \n :onerror Err {\r\ + \n /tool/fetch check-certificate=yes-without-crl (\$Url) output=none \ + as-value;\r\ + \n \$LogPrint debug \$0 (\"The mac vendor is not known in database.\"\ + );\r\ + \n } do={ \$LogPrint warning \$0 (\"Failed getting mac vendor: \" . \$E\ + rr); }\r\ + \n :return \"unknown vendor\";\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set GetPubIp do={\r\ + \n :global DetectIpAddrDefault;\r\ + \n :global DetectIpAddrFallback;\r\ + \n :global LogPrint;\r\ + \n \r\ + \n :local PubIpAddr false;\r\ + \n :local Url \$DetectIpAddrDefault;\r\ + \n\r\ + \n# :retry command={abc} delay=1 max=2 on-error={:put \"got error\"} \r\ + \n :do {\r\ + \n \$LogPrint debug \$0 (\"Trying to detect public IP using default s\ + ervice: \" . \$Url . \"...\");\r\ + \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ + \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ + )} \\\r\ + \n delay=50ms max=5 on-error={\$LogPrint error [ :jobname ] (\"Fail\ + ed to detect public IP using default service: \" . \$Url . \".\")}\r\ + \n #:error \"Failed to detect public IP using default service: \$Url\ + .\"};\r\ + \n } on-error={\r\ + \n \$LogPrint error \$0 (\"Failed to detect public IP using default s\ + ervice: \" . \$Url . \".\");\r\ + \n :set Url \$DetectIpAddrFallBack;\r\ + \n \$LogPrint debug \$0 (\"Trying to detect public IP using fallback \ + service: \" . \$Url . \"...\");\r\ + \n :retry command={:set PubIpAddr ([ /tool/fetch http-method=\"get\"\ + \_check-certificate=yes-without-crl \$Url output=user as-value ]->\"data\"\ + )} \\\r\ + \n delay=200ms max=5 on-error={\$LogPrint error [ :jobname ] (\"Fai\ + led to detect public IP using fallback service: \" . \$Url . \".\")}\r\ + \n };\r\ + \n :if (\$PubIpAddr = false) do={\r\ + \n :set PubIpAddr \"not-detected\";\r\ + \n } else={\r\ + \n :set PubIpAddr [ :pick \$PubIpAddr 0 15];\r\ + \n }\r\ + \n :return \$PubIpAddr;\r\ + \n}\r\ + \n\r\ + \n:set FormatLine do={\r\ + \n :local Key [ :tostr \$1 ];\r\ + \n :local Value [ :tostr \$2 ];\r\ + \n :local Indent [ :tonum \$3 ];\r\ + \n :local Spaces;\r\ + \n :local Return \"\";\r\ + \n :global CharacterMultiply;\r\ + \n :global EitherOr;\r\ + \n :set Indent [ \$EitherOr \$Indent 16 ];\r\ + \n :local Spaces [ \$CharacterMultiply \" \" \$Indent ];\r\ + \n :if ([ :len \$Key ] > 0) do={ :set Return (\$Key . \":\")}\r\ + \n :if ([ :len \$Key ] > (\$Indent - 2)) do={:set Return (\$Return . \"\\\ + n\" . [ :pick \$Spaces 0 \$Indent ] . \$Value);\r\ + \n } else={:set Return (\$Return . [ :pick \$Spaces 0 (\$Indent - [ :len \ + \$Return ]) ] . \$Value)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ParseCustom do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Start [:find [ \$Str ] [:tostr \$2]];\r\ + \n :local End [ :tostr \$3 ];\r\ + \n :local Num [ :tonum \$4 ];\r\ + \n :local Return;\r\ + \n :if ([:len \$Num] = 0) do={:set Num \"0\"}\r\ + \n :local rest [:pick \$Str (\$Start+\$Num) [:len \$Str]]; \r\ + \n :if ([:len \$End ] = 0) do={:set Return [:pick \$Str \$Num \$Start]} e\ + lse={\r\ + \n :set End [:find \$rest \$End];\r\ + \n :set Return [:pick \$rest 0 \$End];\r\ + \n }\r\ + \n:return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set LogPrint do={\r\ + \n :local Severity [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Message [ :tostr \$3 ];\r\ + \n :global PrintDebug;\r\ + \n :global PrintDebugOverride;\r\ + \n :global EitherOr;\r\ + \n :local Debug [ \$EitherOr (\$PrintDebugOverride->\$Name) \$PrintDebug \ + ];\r\ + \n :local PrintSeverity do={\r\ + \n :global TerminalColorOutput;\r\ + \n :if (\$TerminalColorOutput != true) do={:return \$1}\r\ + \n :local Color { debug=96; info=97; warning=93; error=91 };\r\ + \n :return (\"\\1B[\" . \$Color->\$1 . \"m\" . \$1 . \"\\1B[0m\");\r\ + \n}\r\ + \n :local Log ([ \$EitherOr \$Name \"\" ] . \": \" . \$Message);\ + \r\ + \n :if (\$Severity ~ (\"^(custom|debug|error|info)\\\$\")) do={\r\ + \n :if (\$Severity = \"debug\") do={:log debug \$Log}\r\ + \n :if (\$Severity = \"error\") do={:log error \$Log}\r\ + \n :if (\$Severity = \"info\" ) do={:log info \$Log}\r\ + \n } else={:log warning \$Log; :set Severity \"warning\"}\r\ + \n :if (\$Severity != \"debug\" || \$Debug = true) do={:put ([ \$PrintSev\ + erity \$Severity ] . \": \" . \$Message)}\r\ + \n}\r\ + \n\r\ + \n:set CertificateAvailable do={\r\ + \n :local CommonName [ :tostr \$1 ];\r\ + \n :local UseFor [ :tostr \$2 ];\r\ + \n :global CertificateDownload;\r\ + \n :global EitherOr;\r\ + \n :global LogPrint;\r\ + \n :global ParseKeyValueStore;\r\ + \n :set UseFor [ \$EitherOr \$UseFor \"undefined\" ];\r\ + \n :if ([ /system/resource/get free-hdd-space ] < 8388608 && \\\r\ + \n [ /certificate/settings/get crl-download ] = true && \\\r\ + \n [ /certificate/settings/get crl-store ] = \"system\") do={\r\ + \n \$LogPrint warning \$0 (\"This system has low free flash space but \ + \" . \\\r\ + \n \"is configured to download certificate CRLs to system!\");\r\ + \n }\r\ + \n :if ([ :len \$CommonName ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"No CommonName given!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local CertSettings [ /certificate/settings/get ];\r\ + \n :if (((\$CertSettings->\"builtin-trust-anchors\") = \"trusted\" || \\\ + \r\ + \n (\$CertSettings->\"builtin-trust-store\") ~ \$UseFor || \\\r\ + \n (\$CertSettings->\"builtin-trust-store\") = \"all\") && \\\r\ + \n [ :len [ /certificate/builtin/find where common-name=\$CommonName\ + \_] ] > 0) do={\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n \$LogPrint info \$0 (\"Certificate with CommonName '\" . \$CommonNam\ + e . \"' not available.\");\r\ + \n :if ([ \$CertificateDownload \$CommonName ] = false) do={:return fal\ + se}\r\ + \n }\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] > 1\ + ) do={\r\ + \n \$LogPrint info \$0 (\"There are \" . \$CertCount . \" Certificates \ + with CommonName '\" . \$CommonName . \"'. Should be ok.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :local CertVal [ /certificate/get [ find where common-name=\$CommonNam\ + e ] ];\r\ + \n :while ((\$CertVal->\"akid\") != \"\" && (\$CertVal->\"akid\") != (\$C\ + ertVal->\"skid\")) do={\r\ + \n :if ([ :len [ /certificate/find where skid=(\$CertVal->\"akid\") ] ]\ + \_= 0) do={\r\ + \n :local IssuerCN ([ \$ParseKeyValueStore (\$CertVal->\"issuer\") ]-\ + >\"CN\");\r\ + \n \$LogPrint info \$0 (\"Certificate chain for '\" . \$CommonName . \ + \"' is incomplete, missing '\" . \$IssuerCN . \"'.\");\r\ + \n :if ([ \$CertificateDownload \$IssuerCN ] = false) do={:return fal\ + se}\r\ + \n }\r\ + \n :set CertVal [ /certificate/get [ find where skid=(\$CertVal->\"akid\ + \") ] ];\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CertificateDownload do={\r\ + \n :local CommonName [ :tostr \$1 ];\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global GlobalScriptsUrlSuffix;\r\ + \n :global CertificateNameByCN;\r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global LogPrint;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n \r\ + \n \$LogPrint info \$0 (\"Downloading and importing certificate with Comm\ + onName '\" . \$CommonName . \"'.\");\r\ + \n \r\ + \n :local FileName ([ \$CleanName \$CommonName ] . \".pem\");\r\ + \n :do {\r\ + \n /tool/fetch check-certificate=yes-without-crl http-header-field=({ [\ + \_\$FetchUserAgentStr \$0 ] }) \\\r\ + \n (\$GlobalScriptsUrl . \"certs/\" . \$FileName . \$GlobalScriptsUrl\ + Suffix) dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n } on-error={\r\ + \n \$LogPrint warning \$0 (\"Failed downloading certificate with Common\ + Name '\" . \$CommonName . \\\r\ + \n \"' from repository! Trying fallback to mkcert.org...\");\r\ + \n :do {\r\ + \n :if ([ :len [ /certificate/find where common-name=\"ISRG Root X1\"\ + \_] ] = 0) do={\r\ + \n \$LogPrint error \$0 (\"Required certificate is not available.\"\ + );\r\ + \n :return false;\r\ + \n }\r\ + \n /tool/fetch check-certificate=yes-without-crl http-header-field=({\ + \_[ \$FetchUserAgentStr \$0 ] }) \\\r\ + \n \"https://mkcert.org/generate/\" http-data=[ :serialize to=json \ + ({ \$CommonName }) ] \\\r\ + \n dst-path=\$FileName as-value;\r\ + \n \$WaitForFile \$FileName;\r\ + \n :if ([ /file/get \$FileName size ] = 0) do={\r\ + \n \$RmFile \$FileName;\r\ + \n :error false;\r\ + \n }\r\ + \n } on-error={\r\ + \n \$LogPrint warning \$0 (\"Failed downloading certificate with Comm\ + onName '\" . \$CommonName . \"'!\");\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n /certificate/import file-name=\$FileName passphrase=\"\" as-value;\r\ + \n :delay 1s;\r\ + \n \$RmFile \$FileName;\r\ + \n\r\ + \n :if ([ :len [ /certificate/find where common-name=\$CommonName ] ] = 0\ + ) do={\r\ + \n /certificate/remove [ find where name~(\"^\" . \$FileName . \"_[0-9]\ + +\\\$\") ];\r\ + \n \$LogPrint warning \$0 (\"Certificate with CommonName '\" . \$Common\ + Name . \"' still unavailable!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :foreach Cert in=[ /certificate/find where name~(\"^\" . \$FileName . \ + \"_[0-9]+\\\$\") ] do={\r\ + \n \$CertificateNameByCN [ /certificate/get \$Cert common-name ];\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CertificateNameByCN do={\r\ + \n :local Match [ :tostr \$1 ];\r\ + \n :global CleanName;\r\ + \n :global LogPrint;\r\ + \n :local Cert ([ /certificate/find where (common-name=\$Match or fingerp\ + rint=\$Match or name=\$Match) ]->0);\r\ + \n :if ([ :len \$Cert ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"No matching certificate found.\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local CommonName [ /certificate/get \$Cert common-name ];\r\ + \n /certificate/set \$Cert name=[ \$CleanName \$CommonName ];\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set CharacterMultiply do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Num [ :tonum \$2 ];\r\ + \n :if (\$Num = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set ScriptInstallUpdate do={ :onerror Err {\r\ + \n :local Scripts [ :toarray \$1 ];\r\ + \n :local NewComment [ :tostr \$2 ];\r\ + \n :global InitSetup;\r\ + \n\r\ + \n :global ScriptUpdatesCRLF;\r\ + \n :global GlobalConfVersion;\r\ + \n :global Identity;\r\ + \n :global CertificateAvailable;\r\ + \n :global CheckSumsVerify;\r\ + \n :global GlobalScriptsUrl;\r\ + \n :global GlobalScriptsUrlSuffix;\r\ + \n :global EitherOr;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global Grep;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global ParseKeyValueStore;\r\ + \n :global RequiredRouterOS;\r\ + \n :global SendNotification2;\r\ + \n :global SymbolForNotification;\r\ + \n :global ValidateSyntax;\r\ + \n :global CommentsInScripts;\r\ + \n\r\ + \n :if ([ \$CertificateAvailable \"Root YE\" \"fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, trying wit\ + hout.\");\r\ + \n }\r\ + \n\r\ + \n :foreach Script in=\$Scripts do={\r\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\ + \r\ + \n \$LogPrint info \$0 (\"Adding new script: \" . \$Script);\r\ + \n /system/script/add name=\$Script owner=\$Script source=\"#!rsc by \ + Vados\\n\" comment=\$NewComment;\r\ + \n }\r\ + \n }\r\ + \n \r\ + \n :local GlobalConfVersionBefore \$GlobalConfVersion;\r\ + \n :local ReloadGlobal false;\r\ + \n :local DeviceMode [ /system/device-mode/get ];\r\ + \n \r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :local CheckSums ({});\r\ + \n :do {\r\ + \n :local Url (\$GlobalScriptsUrl . \"checksums.json\" . \$GlobalScrip\ + tsUrlSuffix);\r\ + \n \$LogPrint debug \$0 (\"Fetching checksums from url: \" . \$Url);\ + \r\ + \n :set CheckSums [ :deserialize from=json ([ /tool/fetch check-certi\ + ficate=yes-without-crl \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url output\ + =user as-value ]->\"data\") ];\r\ + \n } on-error={ \$LogPrint warning \$0 (\"Err = \" . \$Err); }\r\ + \n }\r\ + \n\r\ + \n :foreach Script in=[ /system/script/find where source~\"^#!rsc by Vado\ + s\" ] do={\r\ + \n :local ScriptVal [ /system/script/get \$Script ];\r\ + \n :local ScriptInfo [ \$ParseKeyValueStore (\$ScriptVal->\"comment\") \ + ];\r\ + \n :local SourceNew;\r\ + \n\r\ + \n :foreach Scheduler in=[ /system/scheduler/find where on-event~(\"\\\ + \\b\" . \$ScriptVal->\"name\" . \"\\\\b\") ] do={\r\ + \n :local SchedulerVal [ /system/scheduler/get \$Scheduler ];\r\ + \n :if (\$ScriptVal->\"policy\" != \$SchedulerVal->\"policy\") do={\r\ + \n \$LogPrint warning \$0 (\"Policies differ for script '\" . \$Scr\ + iptVal->\"name\" . \"' and its scheduler '\" . \$SchedulerVal->\"name\" . \ + \"'!\");\r\ + \n }\r\ + \n }\r\ + \n :do {\r\ + \n :if (\$ScriptInfo->\"ignore\" = true) do={\r\ + \n \$LogPrint debug \$0 (\"Ignoring script '\" . \$ScriptVal->\"nam\ + e\" . \"', as requested.\");\r\ + \n :error true;\r\ + \n }\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :local CheckSum (\$CheckSums->(\$ScriptVal->\"name\"));\r\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Scri\ + ptInfo->\"url-suffix\") ] = 0 && \\\r\ + \n [ :convert transform=md5 to=hex [ :tolf (\$ScriptVal->\"sou\ + rce\") ] ] = \$CheckSum) do={\r\ + \n \$LogPrint debug \$0 (\"Checksum for script '\" . \$ScriptVal-\ + >\"name\" . \"' matches, ignoring.\");\r\ + \n :error true;\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len (\$ScriptInfo->\"certificate\") ] > 0) do={\r\ + \n :if ([ \$CertificateAvailable (\$ScriptInfo->\"certificate\") \"\ + fetch\" ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Downloading certificate failed, tryi\ + ng without.\");\r\ + \n }\r\ + \n }\r\ + \n :onerror Err {\r\ + \n :local BaseUrl [ \$EitherOr (\$ScriptInfo->\"base-url\") \$Globa\ + lScriptsUrl ];\r\ + \n :local UrlSuffix [ \$EitherOr (\$ScriptInfo->\"url-suffix\") \$G\ + lobalScriptsUrlSuffix ];\r\ + \n :local Url (\$BaseUrl . \$ScriptVal->\"name\" . \".rsc\" . \$Url\ + Suffix);\r\ + \n \$LogPrint warning \$0 (\"Fetching script '\" . (\$ScriptVal->\"\ + name\") . \"' from url: \" . \$Url);\r\ + \n :local Result [ /tool/fetch check-certificate=yes-without-crl \\\ + \r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$0 ] }) \$Url outp\ + ut=user as-value ];\r\ + \n :if (\$Result->\"status\" = \"finished\") do={\r\ + \n :set SourceNew [ :tolf (\$Result->\"data\") ];\r\ + \n } \r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Failed fetching script '\" . \$ScriptV\ + al->\"name\" . \"': \" . \$Err);\r\ + \n :if (\$Err != \"Fetch failed with status 404\") do={\r\ + \n :error false;\r\ + \n }\r\ + \n :if (\$ScriptVal->\"source\" = \"#!rsc by Vados\") do={\r\ + \n \$LogPrint warning \$0 (\"Removing dummy. Typo on installation\ + \?\");\r\ + \n /system/script/remove \$Script;\r\ + \n :error false;\r\ + \n }\r\ + \n :if (\$CheckSumsVerify = true) do={\r\ + \n :if ([ :len (\$ScriptInfo->\"base-url\") ] = 0 && [ :len (\$Sc\ + riptInfo->\"url-suffix\") ] = 0 && \\\r\ + \n [ :len \$CheckSum ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"Added the script manually\? Skip u\ + pdates with 'ignore=true' in comment.\");\r\ + \n }\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ :len \$SourceNew ] = 0) do={\r\ + \n \$LogPrint debug \$0 (\"No update for script '\" . (\$ScriptVal-\ + >\"name\") . \"'.\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :local SourceCRLF [ :tocrlf \$SourceNew ];\r\ + \n :if (\$InitSetup != true && ((\$ScriptVal->\"name\") != \"AM-Globa\ + lConfig\" || (\$ScriptVal->\"name\") != \"AM-GlobalFunc\")) do={\r\ + \n :if (\$SourceNew = (\$ScriptVal->\"source\") || \$SourceCRLF = (\ + \$ScriptVal->\"source\")) do={\r\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\") \ + . \"' source did not change. End of lines set to CRLF.\");\r\ + \n if (\$ScriptUpdatesCRLF = false) do={\r\ + \n :put [ :tolf \$SourceNew ];\r\ + \n \$LogPrint debug \$0 (\"Script '\" . (\$ScriptVal->\"name\"\ + ) . \"' source update end of lines to LF.\");\r\ + \n }\r\ + \n :error false;\r\ + \n }\r\ + \n }\r\ + \n\r\ + \n :if ([ :pick \$SourceNew 0 14 ] != \"#!rsc by Vados\") do={\r\ + \n \$LogPrint warning \$0 (\"Looks like new script '\" . \$ScriptVa\ + l->\"name\" . \"' is not valid (missing shebang = '\$shebang') Ignoring!\"\ + );\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if (\$CommentsInScripts = true) do={\r\ + \n :local CommentLine [ \$Grep \$SourceNew (\"\\23 Script comment:\ + \_\") ];\r\ + \n :if ([ :len \$CommentLine ] = 0) do={\r\ + \n \$LogPrint debug \$0 (\"The search in new script '\" . (\$Scr\ + iptVal->\"name\") . \"' for comment in script body, is not found result Ig\ + noring!\");\r\ + \n :error false;\r\ + \n } else={\r\ + \n :if ([ :len (\$ScriptVal->\"comment\")] = 0 || [ :len (\$Scri\ + ptVal->\"comment\")] != [ :pick \$CommentLine ([ :find \$CommentLine \":\"\ + ] + 2) [ :len \$CommentLine] ]) do={\r\ + \n \$LogPrint debug \$0 (\"Exsiting comment for script '\" . (\ + \$ScriptVal->\"name\") . \"' is '\" . (\$ScriptVal->\"comment\") . \"'.\")\ + ;\r\ + \n :set (\$ScriptVal->\"comment\") [ :pick \$CommentLine ([ :f\ + ind \$CommentLine \":\"] + 2) [ :len \$CommentLine] ];\r\ + \n \$LogPrint debug \$0 (\"New comment (\" . (\$ScriptVal->\"c\ + omment\") . \") for script '\" . (\$ScriptVal->\"name\") . \"' has been ad\ + ded!\");\r\ + \n } else={\r\ + \n \$LogPrint debug \$0 (\"Comment for script '\" . (\$ScriptV\ + al->\"name\") . \"' did not change.\");\r\ + \n :error false;\r\ + \n }\r\ + \n } \r\ + \n }\r\ + \n\r\ + \n :local RequiredROS ([ \$ParseKeyValueStore [ \$Grep \$SourceNew (\ + \"\\23 requires RouterOS, \") ] ]->version);\r\ + \n :if ([ \$RequiredRouterOS \$0 [ \$EitherOr \$RequiredROS \"0.0\" ]\ + \_false ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires RouterOS \" . \\\r\ + \n \$RequiredROS . \", which is not met by your installation. I\ + gnoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n :local RequiredDM [ \$ParseKeyValueStore [ \$Grep \$SourceNew (\"\ + \\23 requires device-mode, \") ] ];\r\ + \n :local MissingDM ({});\r\ + \n :foreach Feature,Value in=\$RequiredDM do={\r\ + \n :if ([ :typeof (\$DeviceMode->\$Feature) ] = \"bool\" && (\$Devi\ + ceMode->\$Feature) = false) do={\r\ + \n :set MissingDM (\$MissingDM, \$Feature);\r\ + \n }\r\ + \n }\r\ + \n :if ([ :len \$MissingDM ] > 0) do={\r\ + \n \$LogPrint warning \$0 (\"The script '\" . (\$ScriptVal->\"name\ + \") . \"' requires disabled \" . \\\r\ + \n \"device-mode features (\" . [ :tostr \$MissingDM ] . \"). I\ + gnoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n\r\ + \n :if ([ \$ValidateSyntax \$SourceNew ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Syntax validation for script '\" . (\$\ + ScriptVal->\"name\") . \"' failed! Ignoring!\");\r\ + \n :error false;\r\ + \n }\r\ + \n \r\ + \n :log info (\"Updating script: \" . (\$ScriptVal->\"name\") . \" Sc\ + ript comment: \" . (\$ScriptVal->\"comment\"));\r\ + \n\r\ + \n /system/script/set owner=(\$ScriptVal->\"name\") comment=(\$Script\ + Val->\"comment\") \\\r\ + \n source=[ \$IfThenElse (\$ScriptUpdatesCRLF = true) \$SourceCRL\ + F \$SourceNew ] \$Script;\r\ + \n :if (\$ScriptVal->\"name\" = \"AM-GlobalConfig\" || \\\r\ + \n \$ScriptVal->\"name\" = \"AM-GlobalFunc\" || \\\r\ + \n \$ScriptVal->\"name\" ~ (\"^(AM-GlobalFunc\\\\.d|mod)/.\")) d\ + o={\r\ + \n :set ReloadGlobal true;\r\ + \n }\r\ + \n } on-error={ }\r\ + \n }\r\ + \n :if (\$ReloadGlobal = true) do={\r\ + \n \$LogPrint info \$0 (\"Reloading global configuration and functions.\ + \");\r\ + \n :onerror Err {\r\ + \n :global InitSetup (a);\r\ + \n /system/script {run AM-GlobalConfig; run AM-GlobalFunc;};\r\ + \n } do={\$LogPrint error \$0 (\"Reloading global configuration and fun\ + ctions failed! \" . \$Err)}\r\ + \n }\r\ + \n :if (\$GlobalConfVersionBefore > \$GlobalConfVersion) do={\r\ + \n \$LogPrint warning \$0 (\"The configuration version decreased from \ + \" . \\\r\ + \n \$GlobalConfVersionBefore . \" to \" . \$GlobalConfVersion . \\\r\ + \n \". Installed an older version\?\");\r\ + \n }\r\ + \n :if (\$GlobalConfVersionBefore < \$GlobalConfVersion) do={\r\ + \n :global GlobalConfChanges;\r\ + \n :global GlobalConfMigration;\r\ + \n :local ChangeLogCode;\r\ + \n :if ([ :len \$ChangeLogCode ] > 0) do={\r\ + \n :if ([ \$ValidateSyntax \$ChangeLogCode ] = true) do={\r\ + \n :onerror Err {\r\ + \n [ :parse \$ChangeLogCode ];\r\ + \n } do={\$LogPrint warning \$0 (\"The changelog failed to run: \" \ + . \$Err)}\r\ + \n } else={\$LogPrint warning \$0 (\"The changelog failed syntax vali\ + dation!\")}\r\ + \n }\r\ + \n :if ([ :len \$GlobalConfMigration ] > 0) do={\r\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\r\ + \n :local Migration (\$GlobalConfMigration->[ :tostr \$I ]);\r\ + \n :do {\r\ + \n :if ([ :typeof \$Migration ] != \"str\") do={\r\ + \n \$LogPrint debug \$0 (\"Migration code for change \" . \$I .\ + \_\" is not available.\");\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$ValidateSyntax \$Migration ] = false) do={\r\ + \n \$LogPrint warning \$0 (\"Migration code for change \" . \$I\ + \_. \" failed syntax validation!\");\r\ + \n :error false}\r\ + \n \$LogPrint info \$0 (\"Applying migration for change \" . \$I \ + . \": \" . \$Migration);\r\ + \n :onerror Err {\r\ + \n [ :parse \$Migration ];\r\ + \n } do={\$LogPrint warning \$0 (\"Migration code for change \" .\ + \_\$I . \" failed to run: \" . \$Err)}\r\ + \n } on-error={ }\r\ + \n }\r\ + \n }\r\ + \n :local NotificationMessage (\"The configuration version on \" . \$Id\ + entity . \" increased \" . \\\r\ + \n \"to \" . \$GlobalConfVersion . \", current configuration may nee\ + d modification. \" . \\\r\ + \n \"Please review and update global-config-overlay, then re-run glo\ + bal-config.\");\r\ + \n \$LogPrint info \$0 (\$NotificationMessage);\r\ + \n :if ([ :len \$GlobalConfChanges ] > 0) do={\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n\\nChanges:\ + \");\r\ + \n :for I from=(\$GlobalConfVersionBefore + 1) to=\$GlobalConfVersion\ + \_do={\r\ + \n :local Change (\$GlobalConfChanges->[ :tostr \$I ]);\r\ + \n :set NotificationMessage (\$NotificationMessage . \"\\n \" . \\\ + \r\ + \n [ \$SymbolForNotification \"pushpin\" \"*\" ] . \$Change);\r\ + \n \$LogPrint info \$0 (\"Change \" . \$I . \": \" . \$Change);\r\ + \n }\r\ + \n } else={:set NotificationMessage (\$NotificationMessage . \"\\n\\nNe\ + ws and changes are not available.\")}\r\ + \n\r\ + \n :set GlobalConfChanges;\r\ + \n :set GlobalConfMigration;\r\ + \n }\r\ + \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\r\ + \n}\r\ + \n\r\ + \n:set FetchUserAgentStr do={\r\ + \n :local Caller [ :tostr \$1 ];\r\ + \n :global IfThenElse;\r\ + \n :local Resource [ /system/resource/get ];\r\ + \n :return (\"User-Agent: Mikrotik/\" . \$Resource->\"version\" . \" \" .\ + \_\$Resource->\"architecture-name\" . \\\r\ + \n \" \" . \$Caller . \"/Fetch (https://amster.vados.ru/; main/3419/3ee\ + 19780)\");\r\ + \n}\r\ + \n\r\ + \n:set Grep do={\r\ + \n :local Input ([ :tostr \$1 ] . \"\\n\");\r\ + \n :local Pattern [ :tostr \$2 ];\r\ + \n :if ([ :typeof [ :find \$Input \$Pattern ] ] = \"nil\") do={:return []\ + }\r\ + \n :do {\r\ + \n :local Line [ :pick \$Input 0 [ :find \$Input \"\\n\" ] ];\r\ + \n :if ([ :typeof [ :find \$Line \$Pattern ] ] = \"num\") do={:return \ + \$Line}\r\ + \n :set Input [ :pick \$Input ([ :find \$Input \"\\n\" ] + 1) [ :len \$\ + Input ] ];\r\ + \n } while=([ :len \$Input ] > 0);\r\ + \n :return [];\r\ + \n}\r\ + \n\r\ + \n:set HumanReadableNum do={\r\ + \n :local Input [ :tonum \$1 ];\r\ + \n :local Base [ :tonum \$2 ];\r\ + \n :global EitherOr;\r\ + \n :global IfThenElse;\r\ + \n :local Prefix \"kMGTPE\";\r\ + \n :local Pow 1;\r\ + \n :set Base [ \$EitherOr \$Base 1024 ];\r\ + \n :local Bin [ \$IfThenElse (\$Base = 1024) \"i\" \"\" ];\r\ + \n :if (\$Input < \$Base) do={:return \$Input}\r\ + \n :for I from=0 to=[ :len \$Prefix ] do={\r\ + \n :set Pow (\$Pow * \$Base);\r\ + \n :if (\$Input / \$Base < \$Pow) do={\r\ + \n :set Prefix [ :pick \$Prefix \$I ];\r\ + \n :local Tmp1 (\$Input * 100 / \$Pow);\r\ + \n :local Tmp2 (\$Tmp1 / 100);\r\ + \n :if (\$Tmp2 >= 100) do={:return (\$Tmp2 . \$Prefix . \$Bin)}\r\ + \n :return (\$Tmp2 . \".\" . \\\r\ + \n [ :pick \$Tmp1 [ :len \$Tmp2 ] ([ :len \$Tmp1 ] - [ :len \$Tmp\ + 2 ] + 1) ] . \\\r\ + \n \$Prefix . \$Bin);\r\ + \n }\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set CleanName do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :local Return \"\";\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :if ([ :typeof [ find \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr\ + stuvwxyz0123456789\" \$Char ] ] = \"nil\") do={\r\ + \n :do {:if ([ :len \$Return ] = 0) do={:error true};\r\ + \n :if ([ :pick \$Return ([ :len \$Return ] - 1) ] = \"-\") do={:er\ + ror true}; :set Char \"-\"} on-error={:set Char \"\"}; \r\ + \n };\r\ + \n :set Return (\$Return . \$Char)};\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set GetRandomNumber do={\r\ + \n :global EitherOr;\r\ + \n :return [ :rndnum from=0 to=[ \$EitherOr [ :tonum \$1 ] 4294967295 ] ]\ + \r\ + \n}\r\ + \n\r\ + \n:set RandomDelay do={\r\ + \n :local Time [ :tonum \$1 ];\r\ + \n :local Unit [ :tostr \$2 ];\r\ + \n :global EitherOr;\r\ + \n :global GetRandomNumber;\r\ + \n :global MAX;\r\ + \n :if (\$Time = 0) do={:return false}\r\ + \n :delay ([ \$MAX 10 [ \$GetRandomNumber ([ :tonsec [ :totime (\$Time . \ + [ \$EitherOr \$Unit \"s\" ]) ] ] / 1000000) ] ] . \"ms\");\r\ + \n}\r\ + \n\r\ + \n:set EscapeForRegEx do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :local Chars (\"^.[]\\\$()|*+\?{}\\\\\");\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :if ([ :find \$Chars \$Char ]) do={:set Char (\"\\\\\" . \$Char)}\r\ + \n :set Return (\$Return . \$Char);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n:set ExitError do={\r\ + \n :local ExitOK [ :tostr \$1 ];\r\ + \n :local Name [ :tostr \$2 ];\r\ + \n :local Error [ :tostr \$3 ];\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :if (\$ExitOK = \"false\") do={\r\ + \n \$LogPrint error \$Name ([ \$IfThenElse ([ :pick \$Name 0 1 ] = \"\\\ + \$\") \\\r\ + \n \"Function\" \"Script\" ] . \" '\" . \$Name . \"' exited with er\ + ror\" . \\\r\ + \n [ \$IfThenElse (!(\$Error ~ \"^(|true|false)\\\$\")) (\": \" . \ + \$Error) \".\" ]);\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n:set MiniDateTimeStamp do={\r\ + \n /system/clock;\r\ + \n :local vdate [get date];\r\ + \n :local vtime [get time];\r\ + \n :local vdoff [:toarray \"0,4,5,7,8,10\"];\r\ + \n :local MM [:pick \$vdate (\$vdoff->2) (\$vdoff->3)];\r\ + \n :local M [:tonum \$MM];\r\ + \n :if (\$vdate ~ \".../../....\") do={\r\ + \n :set vdoff [:toarray \"7,11,1,3,4,6\"];\r\ + \n :set M ([:find \"xxanebarprayunulugepctovecANEBARPRAYUNULUGE\ + PCTOVEC\" [:pick \$vdate (\$vdoff->2) (\$vdoff->3)] -1] / 2);\r\ + \n :if (\$M>12) do={:set M (\$M - 12)}\r\ + \n :set MM [:pick (100 + \$M) 1 3];\r\ + \n }\r\ + \n :local yyyy [:pick \$vdate (\$vdoff->0) (\$vdoff->1)];\r\ + \n :local dd [:pick \$vdate (\$vdoff->4) (\$vdoff->5)];\r\ + \n :local HH [:pick \$vtime 0 2];\r\ + \n :local mm [:pick \$vtime 3 5];\r\ + \n :local ss [:pick \$vtime 6 8];\r\ + \n :return ([\$yyyy] . [\$MM] . [\$dd] . [\$HH] . [\$mm] . [\$ss]);\r\ + \n}\r\ + \n\r\ + \n:set WaitForFile do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :local WaitTime [ :totime \$2 ];\r\ + \n :global CleanFilePath;\r\ + \n :global EitherOr;\r\ + \n :global MAX;\r\ + \n :set FileName [ \$CleanFilePath \$FileName ];\r\ + \n :local Delay ([ \$MAX [ \$EitherOr \$WaitTime 2s ] 100ms ] / 9);\r\ + \n :do {\r\ + \n :retry {\r\ + \n /file/get \$FileName;\r\ + \n :return true;\r\ + \n } delay=\$Delay max=10;\r\ + \n } on-error={ }\r\ + \n :while ([ :len [ /file/find where name=\$FileName ] ] > 0) do={\r\ + \n :do {\r\ + \n /file/get \$FileName;\r\ + \n :return true;\r\ + \n } on-error={ }\r\ + \n :delay \$Delay;\r\ + \n :set Delay (\$Delay * 3 / 2);\r\ + \n }\r\ + \n :return false;\r\ + \n}\r\ + \n\r\ + \n:set FileGet do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :global WaitForFile;\r\ + \n :if ([ \$WaitForFile \$FileName 0s ] = false) do={:return false}\r\ + \n :local FileVal false;\r\ + \n :do {:set FileVal [ /file/get \$FileName ];\r\ + \n } on-error={ }\r\ + \n :return \$FileVal;\r\ + \n}\r\ + \n\r\ + \n:set RmDir do={\r\ + \n :local DirName [ :tostr \$1 ];\r\ + \n :global FileGet;\r\ + \n :global LogPrint;\r\ + \n \$LogPrint debug \$0 (\"Removing directory: \". \$DirName);\r\ + \n :local DirVal [ \$FileGet \$DirName ];\r\ + \n :if (\$DirVal = false) do={\$LogPrint debug \$0 (\"... which does not \ + exist.\"); :return true};\r\ + \n :if (\$DirVal->\"type\" != \"directory\") do={\$LogPrint error \$0 (\"\ + Directory '\" . \$DirName . \"' is not a directory.\"); :return false};\r\ + \n :onerror Err {/file/remove \$DirName} do={\$LogPrint error \$0 (\"Remo\ + ving directory '\" . \$DirName . \"' failed: \" . \$Err); :return false};\ + \r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set RmFile do={\r\ + \n :local FileName [ :tostr \$1 ];\r\ + \n :global FileGet;\r\ + \n :global LogPrint;\r\ + \n \$LogPrint debug \$0 (\"Removing file: \". \$FileName);\r\ + \n :local FileVal [ \$FileGet \$FileName ];\r\ + \n :if (\$FileVal = false) do={\$LogPrint debug \$0 (\"... which does not\ + \_exist.\"); :return true}\r\ + \n :if (\$FileVal->\"type\" = \"directory\" || \$FileVal->\"type\" = \"di\ + sk\") do={\r\ + \n \$LogPrint error \$0 (\"File '\" . \$FileName . \"' is not a file.\"\ + ); :return false}\r\ + \n :onerror Err {\r\ + \n /file/remove \$FileName;\r\ + \n } do={\$LogPrint error \$0 (\"Removing file '\" . \$FileName . \"' fai\ + led: \" . \$Err); :return false}\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set MkDir do={\r\ + \n :local Path [ :tostr \$1 ];\r\ + \n :global CleanFilePath;\r\ + \n :global FileGet;\r\ + \n :global RmDir;\r\ + \n :global WaitForFile;\r\ + \n :global LogPrint;\r\ + \n :local MkTmpfs do={\r\ + \n :global WaitForFile;\r\ + \n :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ];\r\ + \n :if ([ :len \$TmpFs ] = 1) do={\r\ + \n :if ([ /disk/get \$TmpFs disabled ] = true) do={\r\ + \n \$LogPrint info \$0 (\"The tmpfs is disabled, enabling.\");\r\ + \n /disk/enable \$TmpFs;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n \$LogPrint info \$0 (\"Creating disk of type tmpfs.\");\r\ + \n \$RmDir \"tmpfs\";\r\ + \n :onerror Err {\r\ + \n /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource\ + /get total-memory ] / 3);\r\ + \n \$WaitForFile \"tmpfs\";\r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Creating disk of type tmpfs failed: \" .\ + \_\$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n }\r\ + \n :set Path [ \$CleanFilePath \$Path ];\r\ + \n :if (\$Path = \"\") do={\r\ + \n :return true;\r\ + \n }\r\ + \n \$LogPrint debug \$0 (\"Making directory: \" . \$Path);\r\ + \n :local PathVal [ \$FileGet \$Path ];\r\ + \n :if (\$PathVal->\"type\" = \"directory\") do={\r\ + \n \$LogPrint debug \$0 (\"... which already exists.\");\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ :pick \$Path 0 5 ] = \"tmpfs\") do={\r\ + \n :if ([ \$MkTmpfs ] = false) do={\r\ + \n :return false;\r\ + \n }\r\ + \n }\r\ + \n :onerror Err {\r\ + \n /file/add type=\"directory\" name=\$Path;\r\ + \n \$WaitForFile \$Path;\r\ + \n } do={\r\ + \n \$LogPrint warning \$0 (\"Making directory '\" . \$Path . \"' failed\ + : \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n:set MAX do={:if (\$1 > \$2) do={:return \$1}\r\ + \n :return \$2;\r\ + \n}\r\ + \n:set MIN do={:if (\$1 < \$2) do={:return \$1}\r\ + \n :return \$2;\r\ + \n}\r\ + \n\r\ + \n:set CharacterMultiply do={\r\ + \n :local Str [ :tostr \$1 ];\r\ + \n :local Num [ :tonum \$2 ];\r\ + \n :if (\$Num = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :for I from=1 to=\$Num do={:set Return (\$Return . \$Str)}\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n:set CharacterReplace do={\r\ + \n :local String [ :tostr \$1 ];\r\ + \n :local ReplaceFrom [ :tostr \$2 ];\r\ + \n :local ReplaceWith [ :tostr \$3 ];\r\ + \n :local Return \"\";\r\ + \n :if (\$ReplaceFrom = \"\") do={:return \$String}\r\ + \n :while ([ :typeof [ :find \$String \$ReplaceFrom ] ] != \"nil\") do={\ + \r\ + \n :local Pos [ :find \$String \$ReplaceFrom ];\r\ + \n :set Return (\$Return . [ :pick \$String 0 \$Pos ] . \$ReplaceWith);\ + \r\ + \n :set String [ :pick \$String (\$Pos + [ :len \$ReplaceFrom ]) [ :len\ + \_\$String ] ];\r\ + \n }\r\ + \n :return (\$Return . \$String);\r\ + \n}\r\ + \n\r\ + \n:set CleanFilePath do={\r\ + \n :local Path [ :tostr \$1 ];\r\ + \n :global CharacterReplace;\r\ + \n :while (\$Path ~ \"//\") do={:set \$Path [ \$CharacterReplace \$Path \ + \"//\" \"/\" ]};\r\ + \n :if ([ :pick \$Path 0 ] = \"/\") do={:set Path [ :pick \$Path 1 [ :len\ + \_\$Path ] ]};\r\ + \n :if ([ :pick \$Path ([ :len \$Path ] - 1) ] = \"/\") do={:set Path [ :\ + pick \$Path 0 ([ :len \$Path ] - 1) ]};\r\ + \n :return \$Path;\r\ + \n}\r\ + \n\r\ + \n:set IfThenElse do={\r\ + \n :if ([ :tostr \$1 ] = \"true\" || [ :tobool \$1 ] = true) do={:return \ + \$2};\r\ + \n :return \$3;\r\ + \n}\r\ + \n\r\ + \n:set EitherOr do={\r\ + \n :global IfThenElse;\r\ + \n :if ([ :typeof \$1 ] = \"num\") do={:return [ \$IfThenElse (\$1 != 0) \ + \$1 \$2 ]}\r\ + \n :if ([ :typeof \$1 ] = \"time\") do={:return [ \$IfThenElse (\$1 > 0s)\ + \_\$1 \$2 ]}\r\ + \n# this works for boolean values, literal ones with parentheses\r\ + \n :return [ \$IfThenElse ([ :len [ :tostr \$1 ] ] > 0) \$1 \$2 ];\r\ + \n}\r\ + \n\r\ + \n:set ParseKeyValueStore do={\r\ + \n :local Source \$1;\r\ + \n :if ([ :pick \$Source 0 1 ] = \"{\") do={\r\ + \n :do {\r\ + \n :return [ :deserialize from=json \$Source ];\r\ + \n } on-error={ }\r\ + \n } \r\ + \n :if ([ :typeof \$Source ] != \"array\") do={:set Source [ :tostr \$1 ]\ + }\r\ + \n :local Result ({});\r\ + \n :foreach KeyValue in=[ :toarray \$Source ] do={\r\ + \n :if ([ :find \$KeyValue \"=\" ]) do={\r\ + \n :local Key [ :pick \$KeyValue 0 [ :find \$KeyValue \"=\" ] ];\r\ + \n :local Value [ :pick \$KeyValue ([ :find \$KeyValue \"=\" ] + 1) [\ + \_:len \$KeyValue ] ];\r\ + \n :if (\$Value=\"true\") do={:set Value true}\r\ + \n :if (\$Value=\"false\") do={:set Value false}\r\ + \n :set (\$Result->\$Key) \$Value;\r\ + \n } else={:set (\$Result->\$KeyValue) true}\r\ + \n }\r\ + \n :return \$Result;\r\ + \n}\r\ + \n:set RequiredRouterOS do={\r\ + \n :local Caller [ :tostr \$1 ];\r\ + \n :local Required [ :tostr \$2 ];\r\ + \n :local Warn [ :tostr \$3 ];\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global VersionToNum;\r\ + \n :if (!(\$Required ~ \"^\\\\d+\\\\.\\\\d+((alpha|beta|rc|\\\\.)\\\\d+|)\ + \\\$\")) do={\r\ + \n \$LogPrint error \$0 (\"No valid RouterOS version: \" . \$Required);\ + \r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ \$VersionToNum \$Required ] > [ \$VersionToNum [ /system/packag\ + e/update/get installed-version ] ]) do={\r\ + \n :if (\$Warn = \"true\") do={\r\ + \n \$LogPrint warning \$0 (\"This \" . [ \$IfThenElse ([ :pick \$Call\ + er 0 ] = (\"\\\$\")) \"function\" \"script\" ] . \\\r\ + \n \" '\" . \$Caller . \"' (at least specific functionality) requir\ + es RouterOS \" . \$Required . \". Please update!\");\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n:set VersionToNum do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :local Multi 0x1000000;\r\ + \n :local Return 0;\r\ + \n :global CharacterReplace;\r\ + \n :set Input [ \$CharacterReplace \$Input \".\" \",\" ];\r\ + \n :foreach I in={ \"zero\"; \"alpha\"; \"beta\"; \"rc\" } do={\r\ + \n :set Input [ \$CharacterReplace \$Input \$I (\",\" . \$I . \",\") ];\ + \r\ + \n }\r\ + \n :foreach Value in=([ :toarray \$Input ], 0) do={\r\ + \n :local Num [ :tonum \$Value ];\r\ + \n :if (\$Multi = 0x100) do={\r\ + \n :if ([ :typeof \$Num ] = \"num\") do={\r\ + \n :set Return (\$Return + 0xff00);\r\ + \n :set Multi (\$Multi / 0x100);\r\ + \n } else={\r\ + \n :if (\$Value = \"zero\") do={ }\r\ + \n :if (\$Value = \"alpha\") do={ :set Return (\$Return + 0x3f00); \ + }\r\ + \n :if (\$Value = \"beta\") do={ :set Return (\$Return + 0x5f00); }\ + \r\ + \n :if (\$Value = \"rc\") do={ :set Return (\$Return + 0x7f00); }\r\ + \n }\r\ + \n }\r\ + \n :if ([ :typeof \$Num ] = \"num\") do={ :set Return (\$Return + (\$Va\ + lue * \$Multi)); }\r\ + \n :set Multi (\$Multi / 0x100);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n:set ScriptLock do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local WaitMax [ :totime \$2 ];\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global ScriptLockOrder;\r\ + \n :if ([ :typeof \$ScriptLockOrder ] = \"nothing\") do={\r\ + \n :set ScriptLockOrder ({});\r\ + \n }\r\ + \n :if ([ :typeof (\$ScriptLockOrder->\$Script) ] = \"nothing\") do={\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n }\r\ + \n :local JobCount do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :return [ :len [ /system/script/job/find where script=\$Script ] ];\ + \r\ + \n }\r\ + \n :local TicketCount do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :local Count 0;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:set Count (\$Count \ + + 1)}\r\ + \n }\r\ + \n :return \$Count;\r\ + \n }\r\ + \n :local IsFirstTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Check [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if (\$Ticket = \$Check) do={:return true}\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\" && \$Ticket != \$Check) d\ + o={:return false}\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :local AddTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Add [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :while (true) do={\r\ + \n :local Pos [ :len (\$ScriptLockOrder->\$Script) ];\r\ + \n :set (\$ScriptLockOrder->\$Script->\$Pos) \$Add;\r\ + \n :delay 10ms;\r\ + \n :if ((\$ScriptLockOrder->\$Script->\$Pos) = \$Add) do={:return tru\ + e}\r\ + \n }\r\ + \n }\r\ + \n :local RemoveTicket do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :local Remove [ :tostr \$2 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Id,Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :while ((\$ScriptLockOrder->\$Script->\$Id) = \$Remove) do={\r\ + \n :set (\$ScriptLockOrder->\$Script->\$Id);\r\ + \n :delay 10ms;\r\ + \n }\r\ + \n }\r\ + \n }\r\ + \n :local CleanupTickets do={\r\ + \n :local Script [ :tostr \$1 ];\r\ + \n :global ScriptLockOrder;\r\ + \n :foreach Ticket in=(\$ScriptLockOrder->\$Script) do={\r\ + \n :if ([ :typeof \$Ticket ] != \"nothing\") do={:return false}\r\ + \n }\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n }\r\ + \n :if ([ :typeof \$WaitMax ] = \"nil\" ) do={:set WaitMax 0s}\r\ + \n :if ([ :len [ /system/script/find where name=\$Script ] ] = 0) do={\r\ + \n \$LogPrint error \$0 (\"A script named '\" . \$Script . \"' does not\ + \_exist!\");\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$JobCount \$Script ] = 0) do={\r\ + \n \$LogPrint error \$0 (\"No script '\" . \$Script . \"' is running!\"\ + );\r\ + \n :error false;\r\ + \n }\r\ + \n :if ([ \$TicketCount \$Script ] >= [ \$JobCount \$Script ]) do={\r\ + \n \$LogPrint error \$0 (\"More tickets than running scripts '\" . \$Sc\ + ript . \"', resetting!\");\r\ + \n :set (\$ScriptLockOrder->\$Script) ({});\r\ + \n /system/script/job/remove [ find where script=\$Script ];\r\ + \n }\r\ + \n :local MyTicket [ \$GetRandom20CharAlNum 6 ];\r\ + \n \$AddTicket \$Script \$MyTicket;\r\ + \n :local WaitInterval (\$WaitMax / 20);\r\ + \n :local WaitTime \$WaitMax;\r\ + \n :while (\$WaitTime > 0 && \\\r\ + \n ([ \$IsFirstTicket \$Script \$MyTicket ] = false || \\\r\ + \n [ \$TicketCount \$Script ] < [ \$JobCount \$Script ])) do={\r\ + \n :set WaitTime (\$WaitTime - \$WaitInterval);\r\ + \n :delay \$WaitInterval;\r\ + \n }\r\ + \n :if ([ \$IsFirstTicket \$Script \$MyTicket ] = true && \\\r\ + \n [ \$TicketCount \$Script ] = [ \$JobCount \$Script ]) do={\r\ + \n \$RemoveTicket \$Script \$MyTicket;\r\ + \n \$CleanupTickets \$Script;\r\ + \n :return true;\r\ + \n }\r\ + \n \$RemoveTicket \$Script \$MyTicket;\r\ + \n \$LogPrint debug \$0 (\"Script '\" . \$Script . \"' started more than \ + once\" . \\\r\ + \n [ \$IfThenElse (\$WaitTime < \$WaitMax) \" and timed out waiting for\ + \_lock\" \"\" ] . \"...\");\r\ + \n :return false;\r\ + \n}\r\ + \n:set SendNotification do={ :onerror Err {\r\ + \n :global SendNotification2;\r\ + \n \$SendNotification2 ({ origin=\$0; subject=\$1; message=\$2; link=\$3;\ + \_silent=\$4 });\r\ + \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err}\r\ + \n}\r\ + \n:set SendNotification2 do={\r\ + \n :local Notification \$1;\r\ + \n :global NotificationFunctions;\r\ + \n :foreach FunctionName,Discard in=\$NotificationFunctions do={\r\ + \n (\$NotificationFunctions->\$FunctionName) (\"\\\$NotificationFunctio\ + ns->\\\"\" . \$FunctionName . \"\\\"\") \$Notification;\r\ + \n }\r\ + \n}\r\ + \n:set SymbolByUnicodeName do={\r\ + \n :local Name [ :tostr \$1 ];\r\ + \n :global EitherOr;\r\ + \n :global LogPrint;\r\ + \n :global SymbolsExtra;\r\ + \n :local Symbols ({\r\ + \n \"abacus\"=\"\\F0\\9F\\A7\\AE\";\r\ + \n \"alarm-clock\"=\"\\E2\\8F\\B0\";\r\ + \n \"arrow-down\"=\"\\E2\\AC\\87\";\r\ + \n \"arrow-up\"=\"\\E2\\AC\\86\";\r\ + \n \"calendar\"=\"\\F0\\9F\\93\\85\";\r\ + \n \"card-file-box\"=\"\\F0\\9F\\97\\83\";\r\ + \n \"chart-decreasing\"=\"\\F0\\9F\\93\\89\";\r\ + \n \"chart-increasing\"=\"\\F0\\9F\\93\\88\";\r\ + \n \"cloud\"=\"\\E2\\98\\81\";\r\ + \n \"cross-mark\"=\"\\E2\\9D\\8C\";\r\ + \n \"earth\"=\"\\F0\\9F\\8C\\8D\";\r\ + \n \"fire\"=\"\\F0\\9F\\94\\A5\";\r\ + \n \"floppy-disk\"=\"\\F0\\9F\\92\\BE\";\r\ + \n \"gear\"=\"\\E2\\9A\\99\";\r\ + \n \"heart\"=\"\\E2\\99\\A5\";\r\ + \n \"high-voltage-sign\"=\"\\E2\\9A\\A1\";\r\ + \n \"incoming-envelope\"=\"\\F0\\9F\\93\\A8\";\r\ + \n \"information\"=\"\\E2\\84\\B9\";\r\ + \n \"large-orange-circle\"=\"\\F0\\9F\\9F\\A0\";\r\ + \n \"large-red-circle\"=\"\\F0\\9F\\94\\B4\";\r\ + \n \"link\"=\"\\F0\\9F\\94\\97\";\r\ + \n \"lock-with-ink-pen\"=\"\\F0\\9F\\94\\8F\";\r\ + \n \"memo\"=\"\\F0\\9F\\93\\9D\";\r\ + \n \"mobile-phone\"=\"\\F0\\9F\\93\\B1\";\r\ + \n \"pushpin\"=\"\\F0\\9F\\93\\8C\";\r\ + \n \"scissors\"=\"\\E2\\9C\\82\";\r\ + \n \"scroll\"=\"\\F0\\9F\\93\\9C\";\r\ + \n \"smiley-partying-face\"=\"\\F0\\9F\\A5\\B3\";\r\ + \n \"smiley-smiling-face\"=\"\\E2\\98\\BA\";\r\ + \n \"smiley-winking-face-with-tongue\"=\"\\F0\\9F\\98\\9C\";\r\ + \n \"sparkles\"=\"\\E2\\9C\\A8\";\r\ + \n \"speech-balloon\"=\"\\F0\\9F\\92\\AC\";\r\ + \n \"star\"=\"\\E2\\AD\\90\";\r\ + \n \"warning-sign\"=\"\\E2\\9A\\A0\";\r\ + \n \"white-heavy-check-mark\"=\"\\E2\\9C\\85\"\r\ + \n }, \$SymbolsExtra);\r\ + \n :local Magic [ :pick [ /system/clock/get date ] 4 10 ];\r\ + \n :local Special {\r\ + \n \"information-04-01\"=\"\\F0\\9F\\9A\\BB\";\r\ + \n \"large-orange-circle-04-01\"=\"\\F0\\9F\\8D\\8A\";\r\ + \n \"large-orange-circle-10-31\"=\"\\F0\\9F\\8E\\83\";\r\ + \n \"large-red-circle-04-01\"=\"\\F0\\9F\\8D\\92\" };\r\ + \n :if ([ :len (\$Symbols->\$Name) ] = 0) do={\r\ + \n \$LogPrint warning \$0 (\"No symbol available for name '\" . \$Name \ + . \"'!\");\r\ + \n :return \"\";\r\ + \n }\r\ + \n :return ([ \$EitherOr (\$Special->(\$Name . \$Magic)) (\$Symbols->\$Na\ + me) ] . \"\\EF\\B8\\8F\");\r\ + \n}\r\ + \n:set SymbolForNotification do={\r\ + \n :global NotificationsWithSymbols;\r\ + \n :global SymbolByUnicodeName;\r\ + \n :global IfThenElse;\r\ + \n :if (\$NotificationsWithSymbols != true) do={:return [ \$IfThenElse ([\ + \_:len \$2 ] > 0) ([ :tostr \$2 ] . \" \") \"\" ]}\r\ + \n :local Return \"\";\r\ + \n :foreach Symbol in=[ :toarray \$1 ] do={:set Return (\$Return . [ \$Sy\ + mbolByUnicodeName \$Symbol ])}\r\ + \n :return (\$Return . \" \");\r\ + \n}\r\ + \n:set Unix2Dos do={:return [ :tocrlf [ :tostr \$1 ] ]}\r\ + \n:set UrlEncode do={\r\ + \n :local Input [ :tostr \$1 ];\r\ + \n :if ([ :len \$Input ] = 0) do={:return \"\"}\r\ + \n :local Return \"\";\r\ + \n :local Chars (\"\\n\\r !\\\"#\\\$%&'()*+,:;<=>\?@[\\\\]^`{|}~\");\r\ + \n :local Subs { \"%0A\"; \"%0D\"; \"%20\"; \"%21\"; \"%22\"; \"%23\"; \"\ + %24\"; \"%25\"; \"%26\"; \"%27\";\r\ + \n \"%28\"; \"%29\"; \"%2A\"; \"%2B\"; \"%2C\"; \"%3A\"; \"%3B\"; \ + \"%3C\"; \"%3D\"; \"%3E\"; \"%3F\";\r\ + \n \"%40\"; \"%5B\"; \"%5C\"; \"%5D\"; \"%5E\"; \"%60\"; \"%7B\"; \ + \"%7C\"; \"%7D\"; \"%7E\" };\r\ + \n :for I from=0 to=([ :len \$Input ] - 1) do={\r\ + \n :local Char [ :pick \$Input \$I ];\r\ + \n :local Replace [ :find \$Chars \$Char ];\r\ + \n :if ([ :typeof \$Replace ] = \"num\") do={:set Char (\$Subs->\$Repla\ + ce)}\r\ + \n :set Return (\$Return . \$Char);\r\ + \n }\r\ + \n :return \$Return;\r\ + \n}\r\ + \n:set ValidateSyntax do={\r\ + \n :local Code [ :tostr \$1 ];\r\ + \n :global LogPrint;\r\ + \n :onerror Err {\r\ + \n [ :parse (\":local Validate do={\\n\" . \$Code . \"\\n}\") ];\r\ + \n } do={\r\ + \n \$LogPrint debug \$0 (\"Valdation failed: \" . \$Err);\r\ + \n :return false;\r\ + \n }\r\ + \n :return true;\r\ + \n}\r\ + \n:set IsDNSResolving do={\r\ + \n :do {:resolve \"api.telegram.org\"} on-error={:return false}\r\ + \n :return true;\r\ + \n}\r\ + \n:set IsFullyConnected do={\r\ + \n :global IsDNSResolving;\r\ + \n :global IsTimeSync;\r\ + \n :if ([ \$IsDNSResolving ] = false) do={:return false};\r\ + \n :if ([ \$IsTimeSync ] = false) do={:return false};\r\ + \n :return true;\r\ + \n}\r\ + \n:set IsTimeSync do={\r\ + \n :global IsTimeSyncCached;\r\ + \n :global IsTimeSyncResetNtp;\r\ + \n :if (\$IsTimeSyncCached = true) do={:return true}\r\ + \n :if ([ /system/ntp/client/get enabled ] = true) do={\r\ + \n :if ([ /system/ntp/client/get status ] = \"synchronized\") do={\r\ + \n :set IsTimeSyncCached true;\r\ + \n :return true;\r\ + \n }\r\ + \n :local Uptime [ /system/resource/get uptime ];\r\ + \n :if ([ :typeof \$IsTimeSyncResetNtp ] = \"nothing\") do={\r\ + \n :set IsTimeSyncResetNtp \$Uptime;\r\ + \n }\r\ + \n :if (\$Uptime - \$IsTimeSyncResetNtp < 3m) do={:return false}\r\ + \n :log warning \"\$0 The ntp client is configured, but did not sync.\"\ + ;\r\ + \n :set IsTimeSyncResetNtp \$Uptime;\r\ + \n /system/ntp/client/set enabled=no;\r\ + \n :delay 20ms;\r\ + \n /system/ntp/client/set enabled=yes;\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ /system/license/get ]->\"level\" = \"free\" || \\\r\ + \n [ /system/resource/get ]->\"board-name\" = \"x86\") do={\r\ + \n :log debug \"\$0 No ntp client configured, relying on RTC for CHR fr\ + ee license and x86.\";\r\ + \n :return true;\r\ + \n }\r\ + \n :if ([ /ip/cloud/get update-time ] = true) do={\r\ + \n :if ([ :typeof [ /ip/cloud/get public-address ] ] = \"ip\") do={\r\ + \n :set IsTimeSyncCached true;\r\ + \n :return true;\r\ + \n }\r\ + \n :return false;\r\ + \n }\r\ + \n :log debug \"\$0 No time source configured! Returning gracefully...\";\ + \r\ + \n :return true;\r\ + \n}\r\ + \n\r\ + \n# read parts of a large file\r\ + \n:set FetchLargeFiles do={\r\ + \n :local ScriptName [:tostr \$1];\r\ + \n :local fetchUrl [:tostr \$2];\r\ + \n :local CheckCert [:tostr \$3];\r\ + \n :local fetchMode [:tostr \$4];\r\ + \n :local fetchMethod [:tostr \$5];\r\ + \n :local FetchString \"undefined\";\r\ + \n \r\ + \n :global CleanName;\r\ + \n :global FetchUserAgentStr;\r\ + \n :global GetRandom20CharAlNum;\r\ + \n :global IfThenElse;\r\ + \n :global LogPrint;\r\ + \n :global MkDir;\r\ + \n :global RmDir;\r\ + \n :global RmFile;\r\ + \n :global WaitForFile;\r\ + \n\r\ + \n :set CheckCert [ \$IfThenElse (\$CheckCert = \"false\") \"no\" \"yes-w\ + ithout-crl\" ];\r\ + \n #:set fetchMode [ \$IfThenElse (\$fetchMode != \"false\") [:tostr (\"m\ + ode=\" . \$fetchMode)] ];\r\ + \n #:set fetchMethod [\$IfThenElse (\$fetchMethod != \"false\") [:tostr (\ + \"http-method=\\\"\" . \$fetchMethod . \"\\\"\") ]];\r\ + \n \r\ + \n :local DirName (\"tmpfs/\" . [ \$CleanName \$ScriptName ]);\r\ + \n :if ([ \$MkDir \$DirName ] = false) do={\r\ + \n \$LogPrint error \$0 (\"Failed creating directory!\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local FileName (\$DirName . \"/\" . [ \$CleanName \$0 ] . \"-\" . [ \ + \$GetRandom20CharAlNum ]);\r\ + \n #/tool/fetch check-certificate=\$CheckCert \$Url dst-path=\$FileName h\ + ttp-header-field=({ [ \$FetchUserAgentStr \$ScriptName ] }) as-value;\r\ + \n #:log warning (\"\\\$fUrl =\" . \$2 . ({[ \$fMode ]}));\r\ + \n :onerror Err {\r\ + \n :set FetchString (\"/tool/fetch \" . \\\r\ + \n [\$IfThenElse ([\$fetchMethod] != \"false\") (\"http-method=\\\"\"\ + \_. \$fetchMethod . \"\\\" \")] . \\\r\ + \n \"check-certificate=\" . \$CheckCert . \" url=(\\\"\" . \$fetchUrl\ + \_. \"\\\") \" . \\\r\ + \n [\$IfThenElse ([\$fetchMode] != \"false\") (\"mode=\" . \$fetchMod\ + e . \" \")] . \\\r\ + \n http-header-field=({ [ \$FetchUserAgentStr \$ScriptName ] }) as-va\ + lue);\r\ + \n :log warning (\"\\\$FetchSring = \" . \$FetchString);\r\ + \n :put [\$FetchString];\r\ + \n #:put [/tool/fetch \$fetchMode check-certificate=\$CheckCert url=(\$\ + fetchUrl) dst-path=(\$FileName) http-header-field=({ [ \$FetchUserAgentStr\ + \_\$ScriptName ] }) as-value];\r\ + \n } do={\r\ + \n :if ([ \$WaitForFile \$FileName 500ms ] = true) do={\r\ + \n \$RmFile \$FileName;\r\ + \n }\r\ + \n \$LogPrint debug \$0 (\"Failed downloading from \" . \$fetchUrl . \"\ + \_- \" . \$Err);\r\ + \n \$RmDir \$DirName;\r\ + \n :return false;\r\ + \n }\r\ + \n :if ([ \$WaitForFile \$FileName 5s ] = false) do={\r\ + \n \$LogPrint debug \$0 (\"The file downloaded from \" . \$fetchUrl . \ + \" did not show up.\");\r\ + \n :return false;\r\ + \n }\r\ + \n :local FileSize [ /file/get \$FileName size ];\r\ + \n :local Return \"\";\r\ + \n :local VarSize 0;\r\ + \n :while (\$VarSize != \$FileSize) do={\r\ + \n :set Return (\$Return . ([ /file/read offset=\$VarSize chunk-size=32\ + 768 file=\$FileName as-value ]->\"data\"));\r\ + \n :set FileSize [ /file/get \$FileName size ];\r\ + \n :set VarSize [ :len \$Return ];\r\ + \n :if (\$VarSize > \$FileSize) do={\r\ + \n :delay 100ms;\r\ + \n }\r\ + \n }\r\ + \n \$RmDir \$DirName;\r\ + \n :return \$Return;\r\ + \n}\r\ + \n\r\ + \n# Global Environment clear. Use: \"\$GlobalEnvRemove True;\".\r\ + \n:set GlobalEnvRemove do={\r\ + \n :local doRmEnv [ :tostr \$1 ];\r\ + \n :global GlobalScriptsUrl;\r\ + \n :local ScriptsUrl;\r\ + \n :global LogPrint;\r\ + \n :if (\$doRmEnv != \"True\") do={\r\ + \n \$LogPrint error \"GlobalEnvRemove\" (\"This script is needed \\\"T\ + rue\\\" for confirm to remove global environment variables!\");\r\ + \n :return [];\r\ + \n :error true; \r\ + \n } else={\r\ + \n :set ScriptsUrl \$GlobalScriptsUrl;\r\ + \n :delay 5;\r\ + \n :foreach var in=[/system/script/environment print as-value] do={/sy\ + stem/script/environment remove (\$var->\".id\")}\r\ + \n :delay 5;\r\ + \n :global GlobalScriptsUrl \$ScriptsUrl;\r\ + \n \$LogPrint warning \"GlobalEnvRemove\" (\"Done!\");\r\ + \n :return [];\r\ + \n :error false;\r\ + \n }\r\ + \n}\r\ + \n\r\ + \n# Add and fix global scheduler\r\ + \n:put \"Add or/and fix Global scheduler...\";\r\ + \n:local OnEvent \"/system/script { run AM-GlobalConfig; run AM-GlobalFunc\ + ; }\";\r\ + \n:local Comment \"Setup Global Environment for scripts\";\r\ + \n:if ([ :len [ /system/scheduler/find where name=\"AM-SetGlobalEnv\" ] ] \ + = 0) do={\r\ + \n /system/scheduler/add name=\"AM-SetGlobalEnv\" comment=\$Comment on-ev\ + ent=\$OnEvent start-time=startup;\r\ + \n}\r\ + \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" comment ] != \$Comment)\ + \_do={\r\ + \n /system/scheduler/set \"AM-SetGlobalEnv\" comment=\$Comment;\r\ + \n}\r\ + \n:if ([ /system/scheduler/get \"AM-SetGlobalEnv\" on-event ] != \$OnEvent\ + ) do={\r\ + \n /system/scheduler/set \"AM-SetGlobalEnv\" on-event=\$OnEvent;\r\ + \n}\r\ + \n# Add Update Script scheduler\r\ + \n:put \"Add or/and fix Update Script scheduler\";\r\ + \n:set OnEvent \":global ScriptInstallUpdate; \\\$ScriptInstallUpdate;\";\ + \r\ + \n:set Comment \"Every Day Check For Update Scripts\";\r\ + \n:if ([ :len [ /system/scheduler/find where name=\"AM-ScriptInstallUpdate\ + \" ] ] = 0) do={\r\ + \n/system/scheduler/add name=\"AM-ScriptInstallUpdate\" comment=\$Comment \ + start-time=startup interval=1d on-event=\$OnEvent;\r\ + \n}\r\ + \n\r\ + \n#:local Resource [ /system/resource/get ];\r\ + \n#:log info (\$ScriptName . \" Loaded on \" . \$Resource->\"board-name\" \ + . \" with RouterOS \" . \$Resource->\"version\" . \" and Architecture \" .\ + \".\");\r\ + \n\r\ + \n:onerror Err {\r\ + \n :global GlobalConfReady;\r\ + \n :retry { :if (\$GlobalConfReady != true) do={ :error (\"Global configs\ + \_not ready.\"); }; } delay=100ms max=5;\r\ + \n\r\ + \n# signal we are ready\r\ + \n:set GlobalFuncReady true;\r\ + \n:set ExitOK true;\r\ + \n:log warning (\"This script \$ScriptName Loaded on \" . \$devBoardName .\ + \_\"\\nRouterOS: \" . \$devCurVersion . \"\\nArchitecture: \" . \$devCurAr\ + ch . \"\\nIdentity: \" . \$Identity);\r\ + \n} do={:global ExitOnError; \$ExitOnError \$0 \$Err;}\r\ + \n\r\ + \n#} do={:global ExitError; \$ExitError \$ExitOK [ :jobname ] \$Err}\r\ + \n# log the successful load of the script, or an error if it failed\r\ + \n#:if ([\$GlobalFuncReady] = true && [\$GlobalConfReady] = true) do={\r\ + \n" +add dont-require-permissions=no name=fetchCustom owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="\ + \r\ + \n\r\ + \n#root.mnuc.backuper\r\ + \n:global GlobalScriptsUrl \"https://ros.vados.ru/\";\r\ + \n/tool/fetch mode=https url=(\$GlobalScriptsUrl . \".bak/mikro_bak_rsa@10\ + .30.30.10.pub\") dst-path=\"/mikro_bak_rsa@10.30.30.10.pub\";\r\ + \n#/usb1/mikro_bak_rsa.pub" +add dont-require-permissions=yes name=MkTmpfs owner=vados policy=\ + ftp,read,write,policy,test,sniff,sensitive source=\ + ":global MkDir;\r\ + \n\r\ + \n\$MkDir /usb1/tmpfs;" +add dont-require-permissions=no name=CreateContainer owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":\ + local contIF \"veth1\";\r\ + \n:local contIP \"10.10.10.10/24\";\r\ + \n:local contGW \"10.10.10.1\";\r\ + \n#/interface/veth/add name=\$contIF address=\$contIP gateway=\$contGW;\r\ + \n:local contBridgeIF \"Bridge-DOC\";\r\ + \n:local contBridgeIP \"10.10.10.1/24\";\r\ + \n/interface/bridge/add name=\$contBridgeIF;\r\ + \n/ip/address/add address=\$contBridgeIP interface=\$contBridgeIF;\r\ + \n/interface/bridge/port/add bridge=\$contBridgeIF interface=\$contIF;\r\ + \n/container/config/set ram-high=768M registry-url=https://registry-1.dock\ + er.io tmpdir=sata1/tmp\r\ + \n" +add dont-require-permissions=no name=carkeeperbot owner=vados policy=\ + ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="/\ + container/mounts/add list=carkeeper_configs/.profile src=sata1/carkeeper/c\ + onfigs/.profile dst=/root/.ashrc;\r\ + \n/container/mounts/add list=carkeeper_configs/php.ini src=sata1/carkeeper\ + /configs/php.ini dst=/etc/php82/php.ini;\r\ + \n#/container/mounts/add list=carkeeper_configs src=sata1/carkeeper/config\ + s dst=/configs;\r\ + \n/container/mounts/add list=carkeeper_app src=sata1/carkeeper/app dst=/ap\ + p;\r\ + \n/container/mounts/add list=carkeeper_scripts src=sata1/carkeeper/scripts\ + \_dst=/scripts;\r\ + \n/container/mounts/add list=carkeeper_configs/sshd_config src=sata1/carke\ + eper/configs/sshd_config dst=/etc/ssh/sshd_config;\r\ + \n\r\ + \n/container/mounts/add list=carkeeper_tmp src=sata1/carkeeper/tmp dst=/va\ + r/tmp;\r\ + \n/container/mounts/add list=carkeeper_sync src=sata1/carkeeper/sync dst=/\ + var/sync;\r\ + \n" +/tool e-mail +set certificate-verification=no from=MikroNUC port=587 \ + server=smtp.mail.me.com tls=starttls user=vadossio@icloud.com +/tool netwatch +add disabled=yes down-script=\ + ":local msg \"Host MikroYellow is DOWN\";\r\ + \n\$TGSendMessage \$msg;" host=10.30.30.86 http-codes="" interval=10s \ + test-script="" type=simple up-script=\ + ":global TGSendMessage;\r\ + \n\$TGSendMessage \"Host MikroYellow is UP\";" +/user aaa +set accounting=no diff --git a/MikroNUC/history/20260303/20260303090001-Diff-Config.rsc b/MikroNUC/history/20260303/20260303090001-Diff-Config.rsc new file mode 100644 index 0000000..0146135 --- /dev/null +++ b/MikroNUC/history/20260303/20260303090001-Diff-Config.rsc @@ -0,0 +1,4 @@ +1c1 +< # 2026-03-03 09:00:01 by RouterOS 7.21.1 +--- +> # 2026-03-03 08:40:01 by RouterOS 7.21.1 -- 2.52.0