From cdaf4894ccbde4ece76bef38e71bf98bb40d5725 Mon Sep 17 00:00:00 2001 From: vados-dev Date: Mon, 2 Mar 2026 22:00:04 +0300 Subject: [PATCH] Backup for MikroNUC sucessfully creatd at Mar 02 22:00:04. --- .../20260302/20260302220001-Binary.backup | Bin 0 -> 307886 bytes MikroNUC/20260302/20260302220001-Config.rsc | 2770 +++++++++++++++++ .../20260302/20260302220001-Diff-Config.rsc | 4 + 3 files changed, 2774 insertions(+) create mode 100644 MikroNUC/20260302/20260302220001-Binary.backup create mode 100644 MikroNUC/20260302/20260302220001-Config.rsc create mode 100644 MikroNUC/history/20260302/20260302220001-Diff-Config.rsc diff --git a/MikroNUC/20260302/20260302220001-Binary.backup b/MikroNUC/20260302/20260302220001-Binary.backup new file mode 100644 index 0000000000000000000000000000000000000000..94d42f73682bf717be3d088e48968e27f086be34 GIT binary patch literal 307886 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�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 T%tnYSvt*@dRmiJQlsEog<9n;7 literal 0 HcmV?d00001 diff --git a/MikroNUC/20260302/20260302220001-Config.rsc b/MikroNUC/20260302/20260302220001-Config.rsc new file mode 100644 index 0000000..1849301 --- /dev/null +++ b/MikroNUC/20260302/20260302220001-Config.rsc @@ -0,0 +1,2770 @@ +# 2026-03-02 22: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/20260302/20260302220001-Diff-Config.rsc b/MikroNUC/history/20260302/20260302220001-Diff-Config.rsc new file mode 100644 index 0000000..a3c9364 --- /dev/null +++ b/MikroNUC/history/20260302/20260302220001-Diff-Config.rsc @@ -0,0 +1,4 @@ +1c1 +< # 2026-03-02 22:00:01 by RouterOS 7.21.1 +--- +> # 2026-03-02 21:40:02 by RouterOS 7.21.1 -- 2.52.0