From 6f6840680359757838664b1ae5f38cc47e90e37a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 1 Apr 2024 23:40:09 +0200 Subject: [PATCH 001/893] mod/notification-matrix: add new configuration snippet... ... instead of appending to global-config-overlay. --- .../01-authenticate.avif | Bin 4209 -> 3870 bytes .../notification-matrix.d/02-join-room.avif | Bin 3955 -> 3745 bytes doc/mod/notification-matrix.md | 7 +++++-- mod/notification-matrix.rsc | 15 +++++++++------ 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/doc/mod/notification-matrix.d/01-authenticate.avif b/doc/mod/notification-matrix.d/01-authenticate.avif index 1db516b784b2779b1ab1054fcb149753b2c53dbf..b897943b1fc7d8c7c0ac6a9f225733d24dff9e37 100644 GIT binary patch delta 2829 zcmV+o3-a{wAf6tOdK3wf000Gz00IC2009610b2k72sV+9#{vz@lUD(N0;~tK*#Ub3 zf8bxk*LQNobem?QSjNg1WC-uim`wLe;=Ao zm+$o&BR}Z+GDP#I`p(N0lLR%2$wB9JUIv;PxZdxT$rGQgkUcrFkN@avpXd z;;c&ATAreA&nxo;q_^7s{-NsYW#)Gi^U6(b5B@ z=H64_hEz+4k^<6z9FnVs$;0HKe;nj<&r(hz!D(e`Zf|@uIn&(2R!!^)!Z2cACmWfR z;9ztfm4Ldoq_M{u>K9=nAfkzz3yfm}JYxeNN=bEHMtf0fHT~3<;9x}aF+e!u1mm#$ zg;SekM-2$8CjRz!^GRWGti8;B2WZdTFku2HQpA9~4a5LCXXQTiUe3o(e_yb&_!{x% z^Ajxdv5rH}7$+Df9eBV!tCO+UHE-=ZX%3}!%p^gUnT|j_1Cz+)@$P+T_d5QtZEWNI z)x8L@a0Ki*5;h6vlkfEOquMbnBoeZ3?|tgAH3&4{_(!F>xlteyr2biLrbp!D zbQm0xNL&uo?-JYEE}tZke|TEr!c}yS?FK?oLL#9U91>U(PjcS1%g29t70TR4cREg> zg_UF>fH}?&UUGjkQe0~KmD~mkoks3xOKvgAGcuFwf^nK$&ekbVikCIt-pYH@gRi082 z(zyYw>VoI(BT~E<8+Li3cHOr-v7F}_=N`06tm>1(@Xe`SNfUq>9(F3gX8?kE>VGII`)h|#)yCVy5<6`l^=YhcE*j3AIPWIEovzu$FA$jh{n$hf5&NM9i@zjrJz{TK4PF;h5!+g zpqw9GxjDn4iU260iU260iU260iU85kf8+800PC6lVz+AxMgIVg$NvDXXZecVpb!7q z5&#MbI3;p8*g!);q%!>qOvnV>gUn8L^U<9O&$%+0w`#KYA*%KrmdO!#yl1n5_^(n` zSEOf?f0Aid#mxDd`A%ziOmGlDunhQ<7iOxZMf|Cb4HIC4jK4`($}N%cPg< zZhYSED&D6~&M1|ihy(Ot9QH&{c2pfwc-{QsJ4lK@VuY7fA6|4-9xB))=XWxz&M8aQ5980Zz&1pa}*3t z6D@4vBG#V14{;mdJHW-kUWO0jdoc<890=;S40s?KDT2z2pt2vtT}7WE73~TlJDubG zomL4QbZOI8v)QIQtHXiqSF@Lp06DkO1z+b47dc~$+JV$G7zcWst`0M4+k124%Eqy; ze@<3ku?49z_!U{@c9+>&k|ssSAu$|uq$#3OB`rpi60N(~M*u&t!3O7w+)8ETdvWLYMwHV?$^UI z*x``4BN`!bC1G(e=sq-m(n852c{F-2j%>u(_s!V+pX*T7)W5DpYtE!(J60v;BFPY zCx4sA)yU!6@vT#9pE=;9;~dxF&6G+#3k0#OLM;sZKGhXwRyfhS7|Cx3v;9UGbIe-7 z>8B~!va$@2R@hlY|B~#G4MQ*j%0P0nG}q-FWT(+SH~rq9>)>-BPl&IX60o5 z-!)s9F@PHePbhw`e-}UrM}h8!$kAwQ*?r3z$Y}dS7lwo3W%Vns7INCse_xhT4edCA zZrpS;ASQ*71WC0tfFr>h;`2q$$NHIRX@yXU`Dvg?$Q~hbyIbZPI5d#0Dfy@r?i*U0 z+f&wz;gNZH`JG(?8sT=!GuCF!Fe)>lS<||BZj%hb&c}mf+H(cDj*g5Xhw%_7I(6l8 z9TAo;D3)@8e2weAo^LWURSN=$Mh`%gYyituUa zUkbPd`qX4JG9}NZ^&kt)k2|xCEMm%ZCe(pE0bOPx_52j4)AOk_qM^NBBl1uAX?hx% z5{Uh4-=sTLyKr%Ff8}Z<689gUBs;f=8PHACwlFz4%@)$IQC3!Y}@%}FicU)=qXk6)>_!W$GQdis6cJvK9d5MmwV`%jYyeBB!p00-|^mxFKM=-0hTYKimu2cpim3O!E;(j fO9X$sZ0tKx(FVvoX?{SiPU$5pd@nWyn2X;Cj2d3n delta 3171 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 L(XQ(=Q&YQu{cNRZ diff --git a/doc/mod/notification-matrix.md b/doc/mod/notification-matrix.md index 88628e4..92383be 100644 --- a/doc/mod/notification-matrix.md +++ b/doc/mod/notification-matrix.md @@ -70,6 +70,9 @@ and write first part of the configuration: ![authenticate](notification-matrix.d/01-authenticate.avif) +The configuration is written to a new configuration snippet +`global-config-overlay.d/mod/notification-matrix`. + #### Join Room Every Matix chat is a room, so we have to create one. Do that with your @@ -87,8 +90,8 @@ the invite. ![join room](notification-matrix.d/02-join-room.avif) -The settings have been appended to `global-config-overlay`. You may want to -edit to move it to an appropriate place. +The configuration is appended to the configuration snippet +`global-config-overlay.d/mod/notification-matrix`. Usage and invocation -------------------- diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 8234779..5a08146 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -217,12 +217,14 @@ } :do { - /system/script/set global-config-overlay source=([ get global-config-overlay source ] . "\n" . \ + /system/script/remove [ find where name="global-config-overlay.d/mod/notification-matrix" ]; + /system/script/add name="global-config-overlay.d/mod/notification-matrix" source=( \ + "# configuration snippet: mod/notification-matrix\n\n" . \ ":global MatrixHomeServer \"" . $MatrixHomeServer . "\";\n" . \ ":global MatrixAccessToken \"" . $MatrixAccessToken . "\";\n"); - $LogPrint info $0 ("Appended configuration to global-config-overlay. Now create and join a room, please!"); + $LogPrint info $0 ("Added configuration snippet. Now create and join a room, please!"); } on-error={ - $LogPrint error $0 ("Failed appending configuration to global-config-overlay!"); + $LogPrint error $0 ("Failed adding configuration snippet!"); :return false; } } @@ -250,11 +252,12 @@ } :do { - /system/script/set global-config-overlay source=([ get global-config-overlay source ] . "\n" . \ + :local Snippet [ /system/script/find where name="global-config-overlay.d/mod/notification-matrix" ]; + /system/script/set $Snippet source=([ get $Snippet source ] . \ ":global MatrixRoom \"" . $MatrixRoom . "\";\n"); - $LogPrint info $0 ("Appended configuration to global-config-overlay. Please review and cleanup!"); + $LogPrint info $0 ("Appended configuration to configuration snippet. Please review!"); } on-error={ - $LogPrint error $0 ("Failed appending configuration to global-config-overlay!"); + $LogPrint error $0 ("Failed appending configuration to snippet!"); :return false; } } From 444f56f9b44baf8a2553e2e475f796626c5da3ae Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 4 Apr 2024 19:09:00 +0200 Subject: [PATCH 002/893] update list of contributors --- CONTRIBUTIONS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index dff933b..20a1140 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -33,6 +33,7 @@ Add yourself to the list, * Andrea Ruffini Perico * Andrew Cox * Christoph Boss (@Kampfwurst) +* Daniel Ziegenberg (@ziegenberg) * Devin Dean (@dd2594gh) * Evaldo Gardenal * Giorgio Bikos From 1d8347d8ea0b4c16d4a3763e2f73c186da360a01 Mon Sep 17 00:00:00 2001 From: netravnen <1938389+netravnen@users.noreply.github.com> Date: Wed, 3 Apr 2024 18:11:36 +0000 Subject: [PATCH 003/893] README: add start-time & change interval in scheduler example Set the interval to once a day, Instead of every 1 hour. Add start-time to start-up. Thereby introducing randomization based on when the user last rebooted there device. As the interval is counted based on last boot time. --- README.d/11-schedule-script.avif | Bin 1847 -> 4113 bytes README.md | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.d/11-schedule-script.avif b/README.d/11-schedule-script.avif index 27541b75d69575591c432fe49b06da2b47a5ebf3..d6eb0f895d413232e27710b9a0ba2fae9e3d26c5 100644 GIT binary patch literal 4113 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 V659%C*l99!+jD6bz1FIc{x6~x&wc;^ delta 1600 zcmV-G2EX}{Ah!;XA_4&Nkt9JW9%*cEV*mgE07L))0RRC200031009~R00tcZ001ay zX>Mi!000000g;>?k?d&}1|@A|VRRAz3JEwRay-~TLqVi6jSQ2I2{3;oi|ja&nr%tA z3fh;(7tV^=51B3Lxt>LFq(F|Z|W_gRgBzG%sX4$_T zmXyO(Z5Q_XakN?V;!U#e$m_kW(F6nMDGL}MbJ*qz!U-`BV0Pk3alIj}&{O`$Vs^v^ z-=NRKLY4{W`msc2{3CyF2IY3I!+!^v!AUvI<9No1Rq$_*5u&SzoLUK$PUVKyMyfTj z_?F%=W9Kvq56Nxz^?GWKUq7KcG~X z181@h-vNbL&X4+Z>JJMQIkctNgAv4C9F$zUxcs}LU}pM8VXukYJg`u|5{FC9vt!Zs>L`DTAvo_qypKkWw=aUWVjamt z{PnM>TU9WHBK6QULfsO@#>Mm#${6BVY$>%Pr?V_aEt~mqZS}>rwfx@8Y(WMto?2n72M7yPt=8$tm7DC;eF3h=Wraz-;w zUA>dEcrHX-4cifjWTE@;5j39g&U`a!S@U})&FO!?K*ZxtJ?Cax8Q7NxUG0WYzF5PS zm_SFPMdR3$jUcfJnurYK8bXnS5v9k29@G{dD@65K5uPwzJ)`p;L#8Jmz1f?~-9*?wm7Y62tM=skFs3+r_o|;4BK03ed19tPwgxO#JH- z_bA9L%wJ#4%ye&ySykYg#l}5GC`1ORTC<9zcBnMB+&+~}@jFX=rvCa;diPy*KewbO z7%uGN9OU%jZniVPBs$^V6E~sd)>7cK0V2BFgsLvsEQ?pi17=tmn#N;Y!YW>!NqNPsIgf~*A#4zKE ziZkQ7@X!v?-en!zZYbp7bf{EV&4GmD{Er4?iFh)|q0^jEC6%4-e3#-5-AMSp2cLhn zK6zNRKX7?0RR;Dq`g#B-A&u%6`w0`4ny9m5-NL{IBIn3H(#HR^>e_*CTzcp=YMlDapgMPV)jWPhGBnk-~$Xw#WbK}?jT|h;{o;f(iz#`CLVB14RR_P9^ Date: Thu, 4 Apr 2024 19:10:55 +0200 Subject: [PATCH 004/893] update list of contributors --- CONTRIBUTIONS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index 20a1140..f4056e5 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -21,6 +21,7 @@ for details! * [Ben Harris](mailto:mail@bharr.is) (@bharrisau) * [Daniel Ziegenberg](mailto:daniel@ziegenberg.at) (@ziegenberg) * [Michael Gisbers](mailto:michael@gisbers.de) (@mgisbers) +* @netravnen * [netztrip](mailto:dave-tvg@netztrip.de) (@netztrip) * [Stefan Müller](mailto:stefan.mueller.83@gmail.com) (@PackElend) From 86d0f71acb760793c8ccd5320351320f684ce052 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 4 Apr 2024 21:14:17 +0200 Subject: [PATCH 005/893] README: update screenshot on lease script setup --- README.d/12-setup-lease-script.avif | Bin 1686 -> 7642 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/README.d/12-setup-lease-script.avif b/README.d/12-setup-lease-script.avif index 365e0e8d05470af99aef604d1ec24c292113d926..fb4024e2a730947774c6f165c7c5e3b191a4804c 100644 GIT binary patch literal 7642 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 Date: Wed, 27 Mar 2024 23:01:38 +0100 Subject: [PATCH 006/893] global-functions: introduce $FetchHuge --- README.md | 2 +- global-functions.rsc | 39 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5109173..4516736 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ RouterOS Scripts [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/global-functions.rsc b/global-functions.rsc index e19ed65..bd35cdf 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # global functions # https://git.eworm.de/cgit/routeros-scripts/about/ @@ -32,6 +32,7 @@ :global DownloadPackage; :global EitherOr; :global EscapeForRegEx; +:global FetchHuge; :global FetchUserAgentStr; :global FormatLine; :global FormatMultiLines; @@ -389,6 +390,42 @@ :return $Return; } +# fetch huge data to file, read in chunks +:set FetchHuge do={ + :local ScriptName [ :tostr $1 ]; + :local Url [ :tostr $2 ]; + + :global GetRandom20CharAlNum; + :global LogPrint; + :global MkDir; + :global WaitForFile; + + :if ([ $MkDir "tmpfs/" . $ScriptName ] = false) do={ + $LogPrint error $0 ("Failed creating directory!"); + :return false; + } + + :local FileName ("tmpfs/" . $ScriptName . "/" . $0 . "-" . [ $GetRandom20CharAlNum ]); + + :do { + /tool/fetch check-certificate=yes-without-crl $Url dst-path=$FileName as-value; + } on-error={ + $LogPrint debug $0 ("Failed downloading from: " . $Url); + :return false; + } + $WaitForFile $FileName; + + :local FileSize [ /file/get $FileName size ]; + :local Return ""; + :local VarSize 0; + :while ($VarSize < $FileSize) do={ + :set Return ($Return . ([ /file/read offset=$VarSize chunk-size=32768 file=$FileName as-value ]->"data")); + :set VarSize [ :len $Return ]; + } + /file/remove $FileName; + :return $Return; +} + # generate user agent string for fetch :set FetchUserAgentStr do={ :local Caller [ :tostr $1 ]; From ab6fd8855881681d7c69af3e5ce18b3a6e2e69fb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 27 Mar 2024 23:37:31 +0100 Subject: [PATCH 007/893] global-functions: $FetchHuge: use custom user agent string --- global-functions.rsc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index bd35cdf..0ea7120 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -395,6 +395,7 @@ :local ScriptName [ :tostr $1 ]; :local Url [ :tostr $2 ]; + :global FetchUserAgentStr; :global GetRandom20CharAlNum; :global LogPrint; :global MkDir; @@ -408,7 +409,8 @@ :local FileName ("tmpfs/" . $ScriptName . "/" . $0 . "-" . [ $GetRandom20CharAlNum ]); :do { - /tool/fetch check-certificate=yes-without-crl $Url dst-path=$FileName as-value; + /tool/fetch check-certificate=yes-without-crl $Url dst-path=$FileName \ + http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) as-value; } on-error={ $LogPrint debug $0 ("Failed downloading from: " . $Url); :return false; From 2edf983698a18d45de1c9e7823dad0959bff2504 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 27 Mar 2024 23:35:01 +0100 Subject: [PATCH 008/893] global-functions: $FetchHuge: control check-certificate with parameter --- global-functions.rsc | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 0ea7120..65dd06e 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -392,15 +392,19 @@ # fetch huge data to file, read in chunks :set FetchHuge do={ - :local ScriptName [ :tostr $1 ]; - :local Url [ :tostr $2 ]; + :local ScriptName [ :tostr $1 ]; + :local Url [ :tostr $2 ]; + :local CheckCert [ :tobool $3 ]; :global FetchUserAgentStr; :global GetRandom20CharAlNum; + :global IfThenElse; :global LogPrint; :global MkDir; :global WaitForFile; + :set CheckCert [ $IfThenElse ($CheckCert = false) "no" "yes-without-crl" ]; + :if ([ $MkDir "tmpfs/" . $ScriptName ] = false) do={ $LogPrint error $0 ("Failed creating directory!"); :return false; @@ -409,7 +413,7 @@ :local FileName ("tmpfs/" . $ScriptName . "/" . $0 . "-" . [ $GetRandom20CharAlNum ]); :do { - /tool/fetch check-certificate=yes-without-crl $Url dst-path=$FileName \ + /tool/fetch check-certificate=$CheckCert $Url dst-path=$FileName \ http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) as-value; } on-error={ $LogPrint debug $0 ("Failed downloading from: " . $Url); From 61ee5cbd6cbce28385857f9cca184387234fe326 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 3 Apr 2024 17:03:27 +0200 Subject: [PATCH 009/893] global-functions: $FetchHuge: make sure to work with clean file names --- global-functions.rsc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 65dd06e..3c14f22 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -396,6 +396,7 @@ :local Url [ :tostr $2 ]; :local CheckCert [ :tobool $3 ]; + :global CleanName; :global FetchUserAgentStr; :global GetRandom20CharAlNum; :global IfThenElse; @@ -405,13 +406,13 @@ :set CheckCert [ $IfThenElse ($CheckCert = false) "no" "yes-without-crl" ]; - :if ([ $MkDir "tmpfs/" . $ScriptName ] = false) do={ + :local FileName ("tmpfs/" . [ $CleanName $ScriptName ]); + :if ([ $MkDir $FileName ] = false) do={ $LogPrint error $0 ("Failed creating directory!"); :return false; } - :local FileName ("tmpfs/" . $ScriptName . "/" . $0 . "-" . [ $GetRandom20CharAlNum ]); - + :set FileName ($FileName . "/" . [ $CleanName $0 ] . "-" . [ $GetRandom20CharAlNum ]); :do { /tool/fetch check-certificate=$CheckCert $Url dst-path=$FileName \ http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) as-value; From 402f847db2b7446a67634d3720d824a7e6b87e71 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 3 Apr 2024 17:36:47 +0200 Subject: [PATCH 010/893] global-functions: $FetchHuge: remove file on failed download --- global-functions.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 3c14f22..ab8860f 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -417,6 +417,9 @@ /tool/fetch check-certificate=$CheckCert $Url dst-path=$FileName \ http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) as-value; } on-error={ + :if ([ $WaitForFile $FileName 500ms ] = true) do={ + /file/remove $FileName; + } $LogPrint debug $0 ("Failed downloading from: " . $Url); :return false; } From c3809f240d292e80c936e104e8aa9414b3dd3367 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 27 Mar 2024 23:39:55 +0100 Subject: [PATCH 011/893] fw-addr-lists: use $FetchHuge --- doc/fw-addr-lists.md | 6 +++++- fw-addr-lists.rsc | 18 ++++++------------ 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/doc/fw-addr-lists.md b/doc/fw-addr-lists.md index 70ca6e9..ac34c88 100644 --- a/doc/fw-addr-lists.md +++ b/doc/fw-addr-lists.md @@ -4,7 +4,7 @@ Download, import and update firewall address-lists [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) @@ -29,6 +29,10 @@ see situation when the lists are not populated. To mitigate man-in-the-middle attacks with altered lists the server's certificate is checked. +> ⚠️ **Warning**: The script does not limit the size of a list, but keep in +> mind that huge lists can exhaust your device's resources (RAM and CPU), +> and may take a long time to process. + Requirements and installation ----------------------------- diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 68775b4..66f8581 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2023-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # download, import and update firewall address-lists # https://git.eworm.de/cgit/routeros-scripts/about/doc/fw-addr-lists.md @@ -19,7 +19,7 @@ :global CertificateAvailable; :global EitherOr; - :global FetchUserAgentStr; + :global FetchHuge; :global LogPrint; :global LogPrintOnce; :global ScriptLock; @@ -50,12 +50,12 @@ :local Failure false; :foreach List in=$FwList do={ - :local CheckCertificate "no"; + :local CheckCertificate false; :local Data false; :local TimeOut [ $EitherOr [ :totime ($List->"timeout") ] $FwAddrListTimeOut ]; :if ([ :len ($List->"cert") ] > 0) do={ - :set CheckCertificate "yes-without-crl"; + :set CheckCertificate true; :if ([ $CertificateAvailable ($List->"cert") ] = false) do={ $LogPrint warning $ScriptName ("Downloading required certificate failed, trying anyway."); } @@ -63,10 +63,8 @@ :for I from=1 to=5 do={ :if ($Data = false) do={ - :do { - :set Data ([ /tool/fetch check-certificate=$CheckCertificate output=user \ - http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) ($List->"url") as-value ]->"data"); - } on-error={ + :set Data [ $FetchHuge $ScriptName ($List->"url") $CheckCertificate ]; + :if ($Data = false) do={ :if ($I < 5) do={ $LogPrint debug $ScriptName ("Failed downloading, " . $I . ". try: " . $List->"url"); :delay (($I * $I) . "s"); @@ -81,10 +79,6 @@ $LogPrint warning $ScriptName ("Failed downloading list from: " . $List->"url"); } - :if ([ :len $Data ] > 63000) do={ - $LogPrintOnce warning $ScriptName ("The list is huge and may be truncated: " . $List->"url"); - } - :while ([ :len $Data ] != 0) do={ :local Line [ :pick $Data 0 [ :find $Data "\n" ] ]; :local Address ([ :pick $Line 0 [ $FindDelim $Line ] ] . ($List->"cidr")); From 4b6d0c02f134f4c6535d4df44016dc9ae2ae5db2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 5 Apr 2024 00:20:33 +0200 Subject: [PATCH 012/893] fw-addr-lists: try with less regexp matches --- fw-addr-lists.rsc | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 66f8581..7e7ee38 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -82,14 +82,21 @@ :while ([ :len $Data ] != 0) do={ :local Line [ :pick $Data 0 [ :find $Data "\n" ] ]; :local Address ([ :pick $Line 0 [ $FindDelim $Line ] ] . ($List->"cidr")); - :if ($Address ~ "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}(/[0-9]{1,2})?\$" || \ - $Address ~ "^[\\.a-zA-Z0-9-]+\\.[a-zA-Z]{2,}\$") do={ - :set ($IPv4Addresses->$Address) $TimeOut; - } - :if ($Address ~ "^[0-9a-zA-Z]*:[0-9a-zA-Z:\\.]+(/[0-9]{1,3})?\$" || \ - $Address ~ "^[\\.a-zA-Z0-9-]+\\.[a-zA-Z]{2,}\$") do={ - :set ($IPv6Addresses->$Address) $TimeOut; - } + :do { + :if ($Address ~ "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}(/[0-9]{1,2})?\$") do={ + :set ($IPv4Addresses->$Address) $TimeOut; + :error true; + } + :if ($Address ~ "^[0-9a-zA-Z]*:[0-9a-zA-Z:\\.]+(/[0-9]{1,3})?\$") do={ + :set ($IPv6Addresses->$Address) $TimeOut; + :error true; + } + :if ($Address ~ "^[\\.a-zA-Z0-9-]+\\.[a-zA-Z]{2,}\$") do={ + :set ($IPv4Addresses->$Address) $TimeOut; + :set ($IPv6Addresses->$Address) $TimeOut; + :error true; + } + } on-error={ } :set Data [ :pick $Data ([ :len $Line ] + 1) [ :len $Data ] ]; } } From af6556bdba9d68174b45561215ea3be2e098e349 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 4 Apr 2024 19:37:38 +0200 Subject: [PATCH 013/893] fw-addr-lists: add debug message on successful download --- fw-addr-lists.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 7e7ee38..5cdd379 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -20,6 +20,7 @@ :global CertificateAvailable; :global EitherOr; :global FetchHuge; + :global HumanReadableNum; :global LogPrint; :global LogPrintOnce; :global ScriptLock; @@ -77,6 +78,8 @@ :set Data ""; :set Failure true; $LogPrint warning $ScriptName ("Failed downloading list from: " . $List->"url"); + } else={ + $LogPrint debug $ScriptName ("Downloaded " . [ $HumanReadableNum [ :len $Data ] 1024 ] . "B from: " . $List->"url"); } :while ([ :len $Data ] != 0) do={ From 70cc1ff53b7d113f8aff24034e5f5a25efb8b261 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 5 Apr 2024 23:41:17 +0200 Subject: [PATCH 014/893] fw-addr-lists: rework log messages, always include list name --- fw-addr-lists.rsc | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 5cdd379..c9f894b 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -58,7 +58,8 @@ :if ([ :len ($List->"cert") ] > 0) do={ :set CheckCertificate true; :if ([ $CertificateAvailable ($List->"cert") ] = false) do={ - $LogPrint warning $ScriptName ("Downloading required certificate failed, trying anyway."); + $LogPrint warning $ScriptName ("Downloading required certificate (" . $FwListName . \ + " / " . $List->"url" . ") failed, trying anyway."); } } @@ -67,7 +68,8 @@ :set Data [ $FetchHuge $ScriptName ($List->"url") $CheckCertificate ]; :if ($Data = false) do={ :if ($I < 5) do={ - $LogPrint debug $ScriptName ("Failed downloading, " . $I . ". try: " . $List->"url"); + $LogPrint debug $ScriptName ("Failed downloading for list '" . $FwListName . \ + "', " . $I . ". try from: " . $List->"url"); :delay (($I * $I) . "s"); } } @@ -77,9 +79,11 @@ :if ($Data = false) do={ :set Data ""; :set Failure true; - $LogPrint warning $ScriptName ("Failed downloading list from: " . $List->"url"); + $LogPrint warning $ScriptName ("Failed downloading for list '" . $FwListName . \ + "' from: " . $List->"url"); } else={ - $LogPrint debug $ScriptName ("Downloaded " . [ $HumanReadableNum [ :len $Data ] 1024 ] . "B from: " . $List->"url"); + $LogPrint debug $ScriptName ("Downloaded " . [ $HumanReadableNum [ :len $Data ] 1024 ] . \ + "B for list '" . $FwListName . "' from: " . $List->"url"); } :while ([ :len $Data ] != 0) do={ @@ -107,13 +111,15 @@ :foreach Entry in=[ /ip/firewall/address-list/find where list=$FwListName comment=$ListComment ] do={ :local Address [ /ip/firewall/address-list/get $Entry address ]; :if ([ :typeof ($IPv4Addresses->$Address) ] = "time") do={ - $LogPrint debug $ScriptName ("Renewing IPv4 address for " . ($IPv4Addresses->$Address) . ": " . $Address); + $LogPrint debug $ScriptName ("Renewing IPv4 address in list '" . $FwListName . \ + "' with " . ($IPv4Addresses->$Address) . ": " . $Address); /ip/firewall/address-list/set $Entry timeout=($IPv4Addresses->$Address); :set ($IPv4Addresses->$Address); :set CntRenew ($CntRenew + 1); } else={ :if ($Failure = false) do={ - $LogPrint debug $ScriptName ("Removing IPv4 address: " . $Address); + $LogPrint debug $ScriptName ("Removing IPv4 address from list '" . $FwListName . \ + "': " . $Address); /ip/firewall/address-list/remove $Entry; :set CntRemove ($CntRemove + 1); } @@ -123,13 +129,15 @@ :foreach Entry in=[ /ipv6/firewall/address-list/find where list=$FwListName comment=$ListComment ] do={ :local Address [ /ipv6/firewall/address-list/get $Entry address ]; :if ([ :typeof ($IPv6Addresses->$Address) ] = "time") do={ - $LogPrint debug $ScriptName ("Renewing IPv6 address for " . ($IPv6Addresses->$Address) . ": " . $Address); + $LogPrint debug $ScriptName ("Renewing IPv6 address in list '" . $FwListName . \ + "' with " . ($IPv6Addresses->$Address) . ": " . $Address); /ipv6/firewall/address-list/set $Entry timeout=($IPv6Addresses->$Address); :set ($IPv6Addresses->$Address); :set CntRenew ($CntRenew + 1); } else={ :if ($Failure = false) do={ - $LogPrint debug $ScriptName ("Removing: " . $Address); + $LogPrint debug $ScriptName ("Removing IPv6 address from list '" . $FwListName . \ + "': " . $Address); /ipv6/firewall/address-list/remove $Entry; :set CntRemove ($CntRemove + 1); } @@ -137,27 +145,32 @@ } :foreach Address,Timeout in=$IPv4Addresses do={ - $LogPrint debug $ScriptName ("Adding IPv4 address for " . $Timeout . ": " . $Address); + $LogPrint debug $ScriptName ("Adding IPv4 address to list '" . $FwListName . \ + "' with " . $Timeout . ": " . $Address); :do { /ip/firewall/address-list/add list=$FwListName comment=$ListComment address=$Address timeout=$Timeout; :set ($IPv4Addresses->$Address); :set CntAdd ($CntAdd + 1); } on-error={ - $LogPrint warning $ScriptName ("Failed to add IPv4 address " . $Address . " to list '" . $FwListName . "'."); + $LogPrint warning $ScriptName ("Failed to add IPv4 address to list '" . $FwListName . \ + "': " . $Address); } } :foreach Address,Timeout in=$IPv6Addresses do={ - $LogPrint debug $ScriptName ("Adding IPv6 address for " . $Timeout . ": " . $Address); + $LogPrint debug $ScriptName ("Adding IPv6 address to list '" . $FwListName . \ + "' with " . $Timeout . ": " . $Address); :do { /ipv6/firewall/address-list/add list=$FwListName comment=$ListComment address=$Address timeout=$Timeout; :set ($IPv6Addresses->$Address); :set CntAdd ($CntAdd + 1); } on-error={ - $LogPrint warning $ScriptName ("Failed to add IPv6 address " . $Address . " to list '" . $FwListName . "'."); + $LogPrint warning $ScriptName ("Failed to add IPv6 address to list '" . $FwListName . \ + "': " . $Address); } } - $LogPrint info $ScriptName ("list: " . $FwListName . " -- added: " . $CntAdd . " - renewed: " . $CntRenew . " - removed: " . $CntRemove); + $LogPrint info $ScriptName ("list: " . $FwListName . " -- added: " . $CntAdd . \ + " - renewed: " . $CntRenew . " - removed: " . $CntRemove); } } on-error={ } From 491d85000d607db09b7abd67d6002c9ca1a870f2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sun, 7 Apr 2024 20:54:41 +0200 Subject: [PATCH 015/893] fw-addr-lists: human readable numbers for counts --- fw-addr-lists.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index c9f894b..15d292e 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -170,7 +170,9 @@ } } - $LogPrint info $ScriptName ("list: " . $FwListName . " -- added: " . $CntAdd . \ - " - renewed: " . $CntRenew . " - removed: " . $CntRemove); + $LogPrint info $ScriptName ("list: " . $FwListName . \ + " -- added: " . [ $HumanReadableNum $CntAdd 1000 ] . \ + " - renewed: " . [ $HumanReadableNum $CntRenew 1000 ] . \ + " - removed: " . [ $HumanReadableNum $CntRemove 1000 ]); } } on-error={ } From 19c52ed2a7a59c7ecfb472a9f0bbf4843fc5d713 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sun, 7 Apr 2024 22:50:04 +0200 Subject: [PATCH 016/893] fw-addr-lists: show count of active addresses --- fw-addr-lists.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 15d292e..ab417cd 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -171,6 +171,7 @@ } $LogPrint info $ScriptName ("list: " . $FwListName . \ + " (" . [ $HumanReadableNum ($CntAdd + $CntRenew) 1000 ] . ")" . \ " -- added: " . [ $HumanReadableNum $CntAdd 1000 ] . \ " - renewed: " . [ $HumanReadableNum $CntRenew 1000 ] . \ " - removed: " . [ $HumanReadableNum $CntRemove 1000 ]); From c4d2ea19dda3434c92f604605c1d3f06ec8148c2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 5 Apr 2024 23:53:05 +0200 Subject: [PATCH 017/893] fw-addr-lists: break long lines --- fw-addr-lists.rsc | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index ab417cd..007282c 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -108,7 +108,8 @@ } } - :foreach Entry in=[ /ip/firewall/address-list/find where list=$FwListName comment=$ListComment ] do={ + :foreach Entry in=[ /ip/firewall/address-list/find where \ + list=$FwListName comment=$ListComment ] do={ :local Address [ /ip/firewall/address-list/get $Entry address ]; :if ([ :typeof ($IPv4Addresses->$Address) ] = "time") do={ $LogPrint debug $ScriptName ("Renewing IPv4 address in list '" . $FwListName . \ @@ -126,7 +127,8 @@ } } - :foreach Entry in=[ /ipv6/firewall/address-list/find where list=$FwListName comment=$ListComment ] do={ + :foreach Entry in=[ /ipv6/firewall/address-list/find where \ + list=$FwListName comment=$ListComment ] do={ :local Address [ /ipv6/firewall/address-list/get $Entry address ]; :if ([ :typeof ($IPv6Addresses->$Address) ] = "time") do={ $LogPrint debug $ScriptName ("Renewing IPv6 address in list '" . $FwListName . \ @@ -148,7 +150,8 @@ $LogPrint debug $ScriptName ("Adding IPv4 address to list '" . $FwListName . \ "' with " . $Timeout . ": " . $Address); :do { - /ip/firewall/address-list/add list=$FwListName comment=$ListComment address=$Address timeout=$Timeout; + /ip/firewall/address-list/add list=$FwListName comment=$ListComment \ + address=$Address timeout=$Timeout; :set ($IPv4Addresses->$Address); :set CntAdd ($CntAdd + 1); } on-error={ @@ -161,7 +164,8 @@ $LogPrint debug $ScriptName ("Adding IPv6 address to list '" . $FwListName . \ "' with " . $Timeout . ": " . $Address); :do { - /ipv6/firewall/address-list/add list=$FwListName comment=$ListComment address=$Address timeout=$Timeout; + /ipv6/firewall/address-list/add list=$FwListName comment=$ListComment \ + address=$Address timeout=$Timeout; :set ($IPv6Addresses->$Address); :set CntAdd ($CntAdd + 1); } on-error={ From 009674b5bcf27589cd3469bc418dea72c9b4e979 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 4 Apr 2024 21:45:02 +0200 Subject: [PATCH 018/893] bump RouterOS requirement for all scripts and modules... ... now that global-functions requires RouterOS 7.13 anyway. --- BRANCHES.md | 2 +- CONTRIBUTIONS.md | 2 +- INITIAL-COMMANDS.md | 2 +- accesslist-duplicates.capsman.rsc | 2 +- accesslist-duplicates.local.rsc | 2 +- accesslist-duplicates.template.rsc | 2 +- accesslist-duplicates.wifi.rsc | 2 +- backup-cloud.rsc | 2 +- backup-email.rsc | 2 +- backup-partition.rsc | 2 +- backup-upload.rsc | 2 +- capsman-download-packages.capsman.rsc | 2 +- capsman-download-packages.template.rsc | 2 +- capsman-download-packages.wifi.rsc | 2 +- capsman-rolling-upgrade.capsman.rsc | 2 +- capsman-rolling-upgrade.template.rsc | 2 +- capsman-rolling-upgrade.wifi.rsc | 2 +- certificate-renew-issued.rsc | 2 +- check-certificates.rsc | 2 +- check-health.rsc | 2 +- check-lte-firmware-upgrade.rsc | 2 +- check-routeros-update.rsc | 2 +- collect-wireless-mac.capsman.rsc | 2 +- collect-wireless-mac.local.rsc | 2 +- collect-wireless-mac.template.rsc | 2 +- collect-wireless-mac.wifi.rsc | 2 +- daily-psk.capsman.rsc | 2 +- daily-psk.local.rsc | 2 +- daily-psk.template.rsc | 2 +- daily-psk.wifi.rsc | 2 +- dhcp-lease-comment.capsman.rsc | 2 +- dhcp-lease-comment.local.rsc | 2 +- dhcp-lease-comment.template.rsc | 2 +- dhcp-lease-comment.wifi.rsc | 2 +- dhcp-to-dns.rsc | 2 +- doc/accesslist-duplicates.md | 2 +- doc/backup-cloud.md | 2 +- doc/backup-email.md | 2 +- doc/backup-partition.md | 2 +- doc/backup-upload.md | 2 +- doc/capsman-download-packages.md | 2 +- doc/capsman-rolling-upgrade.md | 2 +- doc/certificate-renew-issued.md | 2 +- doc/check-certificates.md | 2 +- doc/check-health.md | 2 +- doc/check-lte-firmware-upgrade.md | 2 +- doc/check-routeros-update.md | 2 +- doc/collect-wireless-mac.md | 2 +- doc/daily-psk.md | 2 +- doc/dhcp-lease-comment.md | 2 +- doc/dhcp-to-dns.md | 2 +- doc/firmware-upgrade-reboot.md | 2 +- doc/global-wait.md | 2 +- doc/gps-track.md | 2 +- doc/hotspot-to-wpa.md | 2 +- doc/ip-addr-bridge.md | 2 +- doc/ipsec-to-dns.md | 2 +- doc/ipv6-update.md | 2 +- doc/lease-script.md | 2 +- doc/leds-mode.md | 2 +- doc/log-forward.md | 2 +- doc/mod/bridge-port-to.md | 2 +- doc/mod/bridge-port-vlan.md | 2 +- doc/mod/inspectvar.md | 2 +- doc/mod/ipcalc.md | 2 +- doc/mod/notification-email.md | 2 +- doc/mod/notification-ntfy.md | 2 +- doc/mod/scriptrunonce.md | 2 +- doc/mod/ssh-keys-import.md | 2 +- doc/mode-button.md | 2 +- doc/netwatch-dns.md | 2 +- doc/netwatch-notify.md | 2 +- doc/ospf-to-leds.md | 2 +- doc/ppp-on-up.md | 2 +- doc/sms-action.md | 2 +- doc/sms-forward.md | 2 +- doc/super-mario-theme.md | 2 +- doc/unattended-lte-firmware-upgrade.md | 2 +- doc/update-gre-address.md | 2 +- doc/update-tunnelbroker.md | 2 +- firmware-upgrade-reboot.rsc | 2 +- global-wait.rsc | 2 +- gps-track.rsc | 2 +- hotspot-to-wpa-cleanup.capsman.rsc | 2 +- hotspot-to-wpa-cleanup.template.rsc | 2 +- hotspot-to-wpa-cleanup.wifi.rsc | 2 +- hotspot-to-wpa.capsman.rsc | 2 +- hotspot-to-wpa.template.rsc | 2 +- hotspot-to-wpa.wifi.rsc | 2 +- ipsec-to-dns.rsc | 2 +- ipv6-update.rsc | 2 +- lease-script.rsc | 2 +- log-forward.rsc | 2 +- mod/bridge-port-to.rsc | 2 ++ mod/bridge-port-vlan.rsc | 2 ++ mod/inspectvar.rsc | 2 ++ mod/ipcalc.rsc | 2 ++ mod/notification-email.rsc | 2 +- mod/notification-ntfy.rsc | 2 ++ mod/scriptrunonce.rsc | 2 ++ mod/ssh-keys-import.rsc | 2 +- mode-button.rsc | 2 +- netwatch-dns.rsc | 2 +- netwatch-notify.rsc | 2 +- ospf-to-leds.rsc | 2 +- ppp-on-up.rsc | 2 +- sms-action.rsc | 2 +- sms-forward.rsc | 2 +- update-gre-address.rsc | 2 +- update-tunnelbroker.rsc | 2 +- 110 files changed, 116 insertions(+), 104 deletions(-) diff --git a/BRANCHES.md b/BRANCHES.md index 0fdbdb4..f1062bb 100644 --- a/BRANCHES.md +++ b/BRANCHES.md @@ -4,7 +4,7 @@ Installing from branches [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index f4056e5..13d0508 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -4,7 +4,7 @@ Past Contributions [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 0de50ae..0320fe8 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -4,7 +4,7 @@ Initial commands [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/accesslist-duplicates.capsman.rsc b/accesslist-duplicates.capsman.rsc index 2ce8302..781ae78 100644 --- a/accesslist-duplicates.capsman.rsc +++ b/accesslist-duplicates.capsman.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # print duplicate antries in wireless access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/accesslist-duplicates.md diff --git a/accesslist-duplicates.local.rsc b/accesslist-duplicates.local.rsc index 51ef6f3..b79a724 100644 --- a/accesslist-duplicates.local.rsc +++ b/accesslist-duplicates.local.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # print duplicate antries in wireless access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/accesslist-duplicates.md diff --git a/accesslist-duplicates.template.rsc b/accesslist-duplicates.template.rsc index 770fb30..b8067c8 100644 --- a/accesslist-duplicates.template.rsc +++ b/accesslist-duplicates.template.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # print duplicate antries in wireless access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/accesslist-duplicates.md diff --git a/accesslist-duplicates.wifi.rsc b/accesslist-duplicates.wifi.rsc index 65f8aaa..c05e02c 100644 --- a/accesslist-duplicates.wifi.rsc +++ b/accesslist-duplicates.wifi.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # print duplicate antries in wireless access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/accesslist-duplicates.md diff --git a/backup-cloud.rsc b/backup-cloud.rsc index cccb41b..9a062f2 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: backup-script, order=40 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # upload backup to MikroTik cloud # https://git.eworm.de/cgit/routeros-scripts/about/doc/backup-cloud.md diff --git a/backup-email.rsc b/backup-email.rsc index 64ca69c..c32eb27 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: backup-script, order=20 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # create and email backup and config file # https://git.eworm.de/cgit/routeros-scripts/about/doc/backup-email.md diff --git a/backup-partition.rsc b/backup-partition.rsc index 503d382..fc186c0 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: backup-script, order=70 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # save configuration to fallback partition # https://git.eworm.de/cgit/routeros-scripts/about/doc/backup-partition.md diff --git a/backup-upload.rsc b/backup-upload.rsc index ef5b7c7..18223bb 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: backup-script, order=50 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # create and upload backup and config file # https://git.eworm.de/cgit/routeros-scripts/about/doc/backup-upload.md diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index a3bd4a5..f5695f4 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # download and cleanup packages for CAP installation from CAPsMAN # https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-download-packages.md diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index cad3bcb..762dbb6 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # download and cleanup packages for CAP installation from CAPsMAN # https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-download-packages.md diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 909688f..79aa9a7 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # download and cleanup packages for CAP installation from CAPsMAN # https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-download-packages.md diff --git a/capsman-rolling-upgrade.capsman.rsc b/capsman-rolling-upgrade.capsman.rsc index 11bfd69..2c9ae3d 100644 --- a/capsman-rolling-upgrade.capsman.rsc +++ b/capsman-rolling-upgrade.capsman.rsc @@ -5,7 +5,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: capsman-rolling-upgrade -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # upgrade CAPs one after another # https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-rolling-upgrade.md diff --git a/capsman-rolling-upgrade.template.rsc b/capsman-rolling-upgrade.template.rsc index e0effd4..2098bc0 100644 --- a/capsman-rolling-upgrade.template.rsc +++ b/capsman-rolling-upgrade.template.rsc @@ -5,7 +5,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: capsman-rolling-upgrade -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # upgrade CAPs one after another # https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-rolling-upgrade.md diff --git a/capsman-rolling-upgrade.wifi.rsc b/capsman-rolling-upgrade.wifi.rsc index 8ec6f26..36b8c0f 100644 --- a/capsman-rolling-upgrade.wifi.rsc +++ b/capsman-rolling-upgrade.wifi.rsc @@ -5,7 +5,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: capsman-rolling-upgrade -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # upgrade CAPs one after another # https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-rolling-upgrade.md diff --git a/certificate-renew-issued.rsc b/certificate-renew-issued.rsc index 45805c5..77ed3d0 100644 --- a/certificate-renew-issued.rsc +++ b/certificate-renew-issued.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # renew locally issued certificates # https://git.eworm.de/cgit/routeros-scripts/about/doc/certificate-renew-issued.md diff --git a/check-certificates.rsc b/check-certificates.rsc index 20e2902..e9235f1 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # check for certificate validity # https://git.eworm.de/cgit/routeros-scripts/about/doc/check-certificates.md diff --git a/check-health.rsc b/check-health.rsc index 2a97ad6..1e8fcc0 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # check for RouterOS health state # https://git.eworm.de/cgit/routeros-scripts/about/doc/check-health.md diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index e7f06f3..3a25f83 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # check for LTE firmware upgrade, send notification # https://git.eworm.de/cgit/routeros-scripts/about/doc/check-lte-firmware-upgrade.md diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index c9ab93b..6dca99a 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # check for RouterOS update, send notification and/or install # https://git.eworm.de/cgit/routeros-scripts/about/doc/check-routeros-update.md diff --git a/collect-wireless-mac.capsman.rsc b/collect-wireless-mac.capsman.rsc index dcb303c..74c0754 100644 --- a/collect-wireless-mac.capsman.rsc +++ b/collect-wireless-mac.capsman.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=40 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # collect wireless mac adresses in access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/collect-wireless-mac.md diff --git a/collect-wireless-mac.local.rsc b/collect-wireless-mac.local.rsc index 7c1122c..8a60fea 100644 --- a/collect-wireless-mac.local.rsc +++ b/collect-wireless-mac.local.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=40 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # collect wireless mac adresses in access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/collect-wireless-mac.md diff --git a/collect-wireless-mac.template.rsc b/collect-wireless-mac.template.rsc index b8c5ff8..c5cf74a 100644 --- a/collect-wireless-mac.template.rsc +++ b/collect-wireless-mac.template.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=40 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # collect wireless mac adresses in access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/collect-wireless-mac.md diff --git a/collect-wireless-mac.wifi.rsc b/collect-wireless-mac.wifi.rsc index b8ad939..12c3361 100644 --- a/collect-wireless-mac.wifi.rsc +++ b/collect-wireless-mac.wifi.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=40 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # collect wireless mac adresses in access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/collect-wireless-mac.md diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index 43651d0..64e8ce7 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # update daily PSK (pre shared key) # https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index 2dbc61b..48e2b8d 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # update daily PSK (pre shared key) # https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index e190ffb..5097b00 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # update daily PSK (pre shared key) # https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index ee3e1b0..9d7f285 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # update daily PSK (pre shared key) # https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md diff --git a/dhcp-lease-comment.capsman.rsc b/dhcp-lease-comment.capsman.rsc index 4ac228b..b7f3589 100644 --- a/dhcp-lease-comment.capsman.rsc +++ b/dhcp-lease-comment.capsman.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=60 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # update dhcp-server lease comment with infos from access-list # https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-lease-comment.md diff --git a/dhcp-lease-comment.local.rsc b/dhcp-lease-comment.local.rsc index a49f74f..e35bbe7 100644 --- a/dhcp-lease-comment.local.rsc +++ b/dhcp-lease-comment.local.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=60 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # update dhcp-server lease comment with infos from access-list # https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-lease-comment.md diff --git a/dhcp-lease-comment.template.rsc b/dhcp-lease-comment.template.rsc index 0f0975b..d4323ad 100644 --- a/dhcp-lease-comment.template.rsc +++ b/dhcp-lease-comment.template.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=60 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # update dhcp-server lease comment with infos from access-list # https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-lease-comment.md diff --git a/dhcp-lease-comment.wifi.rsc b/dhcp-lease-comment.wifi.rsc index c9c091b..f67ce6e 100644 --- a/dhcp-lease-comment.wifi.rsc +++ b/dhcp-lease-comment.wifi.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=60 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # update dhcp-server lease comment with infos from access-list # https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-lease-comment.md diff --git a/dhcp-to-dns.rsc b/dhcp-to-dns.rsc index 5b6e64a..a3d41c9 100644 --- a/dhcp-to-dns.rsc +++ b/dhcp-to-dns.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=20 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # check DHCP leases and add/remove/update DNS entries # https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-to-dns.md diff --git a/doc/accesslist-duplicates.md b/doc/accesslist-duplicates.md index 109bebf..a1f9198 100644 --- a/doc/accesslist-duplicates.md +++ b/doc/accesslist-duplicates.md @@ -4,7 +4,7 @@ Find and remove access list duplicates [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/backup-cloud.md b/doc/backup-cloud.md index 03d5953..be6e06d 100644 --- a/doc/backup-cloud.md +++ b/doc/backup-cloud.md @@ -4,7 +4,7 @@ Upload backup to Mikrotik cloud [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/backup-email.md b/doc/backup-email.md index 56b0540..a506543 100644 --- a/doc/backup-email.md +++ b/doc/backup-email.md @@ -4,7 +4,7 @@ Send backup via e-mail [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/backup-partition.md b/doc/backup-partition.md index e2ca8e0..ba20657 100644 --- a/doc/backup-partition.md +++ b/doc/backup-partition.md @@ -4,7 +4,7 @@ Save configuration to fallback partition [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/backup-upload.md b/doc/backup-upload.md index 953ac93..f524adb 100644 --- a/doc/backup-upload.md +++ b/doc/backup-upload.md @@ -4,7 +4,7 @@ Upload backup to server [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/capsman-download-packages.md b/doc/capsman-download-packages.md index 20fb007..c68900e 100644 --- a/doc/capsman-download-packages.md +++ b/doc/capsman-download-packages.md @@ -4,7 +4,7 @@ Download packages for CAP upgrade from CAPsMAN [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/capsman-rolling-upgrade.md b/doc/capsman-rolling-upgrade.md index 8362794..27d855f 100644 --- a/doc/capsman-rolling-upgrade.md +++ b/doc/capsman-rolling-upgrade.md @@ -4,7 +4,7 @@ Run rolling CAP upgrades from CAPsMAN [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/certificate-renew-issued.md b/doc/certificate-renew-issued.md index 2df8be3..91a1914 100644 --- a/doc/certificate-renew-issued.md +++ b/doc/certificate-renew-issued.md @@ -4,7 +4,7 @@ Renew locally issued certificates [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/check-certificates.md b/doc/check-certificates.md index 62b9ceb..636f719 100644 --- a/doc/check-certificates.md +++ b/doc/check-certificates.md @@ -4,7 +4,7 @@ Renew certificates and notify on expiration [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/check-health.md b/doc/check-health.md index ee52b61..f94a0bf 100644 --- a/doc/check-health.md +++ b/doc/check-health.md @@ -4,7 +4,7 @@ Notify about health state [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/check-lte-firmware-upgrade.md b/doc/check-lte-firmware-upgrade.md index bec3177..59a62c7 100644 --- a/doc/check-lte-firmware-upgrade.md +++ b/doc/check-lte-firmware-upgrade.md @@ -4,7 +4,7 @@ Notify on LTE firmware upgrade [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/check-routeros-update.md b/doc/check-routeros-update.md index dbb2b89..f9d485c 100644 --- a/doc/check-routeros-update.md +++ b/doc/check-routeros-update.md @@ -4,7 +4,7 @@ Notify on RouterOS update [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/collect-wireless-mac.md b/doc/collect-wireless-mac.md index b0a2298..57032d8 100644 --- a/doc/collect-wireless-mac.md +++ b/doc/collect-wireless-mac.md @@ -4,7 +4,7 @@ Collect MAC addresses in wireless access list [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/daily-psk.md b/doc/daily-psk.md index f723617..3894d52 100644 --- a/doc/daily-psk.md +++ b/doc/daily-psk.md @@ -4,7 +4,7 @@ Use wireless network with daily psk [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/dhcp-lease-comment.md b/doc/dhcp-lease-comment.md index 4831b8c..f95b124 100644 --- a/doc/dhcp-lease-comment.md +++ b/doc/dhcp-lease-comment.md @@ -4,7 +4,7 @@ Comment DHCP leases with info from access list [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/dhcp-to-dns.md b/doc/dhcp-to-dns.md index e7f3b88..13d5ef3 100644 --- a/doc/dhcp-to-dns.md +++ b/doc/dhcp-to-dns.md @@ -4,7 +4,7 @@ Create DNS records for DHCP leases [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/firmware-upgrade-reboot.md b/doc/firmware-upgrade-reboot.md index 420dfe1..bac17a7 100644 --- a/doc/firmware-upgrade-reboot.md +++ b/doc/firmware-upgrade-reboot.md @@ -4,7 +4,7 @@ Automatically upgrade firmware and reboot [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/global-wait.md b/doc/global-wait.md index a3fe6d6..4b42717 100644 --- a/doc/global-wait.md +++ b/doc/global-wait.md @@ -4,7 +4,7 @@ Wait for global functions and modules [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/gps-track.md b/doc/gps-track.md index 03f79a7..7006fb3 100644 --- a/doc/gps-track.md +++ b/doc/gps-track.md @@ -4,7 +4,7 @@ Send GPS position to server [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/hotspot-to-wpa.md b/doc/hotspot-to-wpa.md index 6ce4421..275fe4d 100644 --- a/doc/hotspot-to-wpa.md +++ b/doc/hotspot-to-wpa.md @@ -4,7 +4,7 @@ Use WPA network with hotspot credentials [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ip-addr-bridge.md b/doc/ip-addr-bridge.md index 8bb9811..941a8ae 100644 --- a/doc/ip-addr-bridge.md +++ b/doc/ip-addr-bridge.md @@ -4,7 +4,7 @@ Manage IP addresses with bridge status [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ipsec-to-dns.md b/doc/ipsec-to-dns.md index ca5b86c..0a91960 100644 --- a/doc/ipsec-to-dns.md +++ b/doc/ipsec-to-dns.md @@ -4,7 +4,7 @@ Create DNS records for IPSec peers [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ipv6-update.md b/doc/ipv6-update.md index a5661fc..20265fe 100644 --- a/doc/ipv6-update.md +++ b/doc/ipv6-update.md @@ -4,7 +4,7 @@ Update configuration on IPv6 prefix change [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/lease-script.md b/doc/lease-script.md index f346621..4d2f3bc 100644 --- a/doc/lease-script.md +++ b/doc/lease-script.md @@ -4,7 +4,7 @@ Run other scripts on DHCP lease [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/leds-mode.md b/doc/leds-mode.md index 5dd5f63..90ea418 100644 --- a/doc/leds-mode.md +++ b/doc/leds-mode.md @@ -4,7 +4,7 @@ Manage LEDs dark mode [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/log-forward.md b/doc/log-forward.md index 4183d7b..44409dc 100644 --- a/doc/log-forward.md +++ b/doc/log-forward.md @@ -4,7 +4,7 @@ Forward log messages via notification [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/bridge-port-to.md b/doc/mod/bridge-port-to.md index 838d1e0..5c8bebc 100644 --- a/doc/mod/bridge-port-to.md +++ b/doc/mod/bridge-port-to.md @@ -4,7 +4,7 @@ Manage ports in bridge [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/bridge-port-vlan.md b/doc/mod/bridge-port-vlan.md index 5660b9d..d23d5b5 100644 --- a/doc/mod/bridge-port-vlan.md +++ b/doc/mod/bridge-port-vlan.md @@ -4,7 +4,7 @@ Manage VLANs on bridge ports [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/inspectvar.md b/doc/mod/inspectvar.md index 7ec74f2..d4e59b3 100644 --- a/doc/mod/inspectvar.md +++ b/doc/mod/inspectvar.md @@ -4,7 +4,7 @@ Inspect variables [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/ipcalc.md b/doc/mod/ipcalc.md index 5b24952..cb655bc 100644 --- a/doc/mod/ipcalc.md +++ b/doc/mod/ipcalc.md @@ -4,7 +4,7 @@ IP address calculation [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/notification-email.md b/doc/mod/notification-email.md index 76816c1..2138e31 100644 --- a/doc/mod/notification-email.md +++ b/doc/mod/notification-email.md @@ -4,7 +4,7 @@ Send notifications via e-mail [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/notification-ntfy.md b/doc/mod/notification-ntfy.md index a3fdf88..afa3109 100644 --- a/doc/mod/notification-ntfy.md +++ b/doc/mod/notification-ntfy.md @@ -4,7 +4,7 @@ Send notifications via Ntfy [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/scriptrunonce.md b/doc/mod/scriptrunonce.md index 6619efb..c5fa891 100644 --- a/doc/mod/scriptrunonce.md +++ b/doc/mod/scriptrunonce.md @@ -4,7 +4,7 @@ Download script and run it once [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/ssh-keys-import.md b/doc/mod/ssh-keys-import.md index 3d81566..db8e322 100644 --- a/doc/mod/ssh-keys-import.md +++ b/doc/mod/ssh-keys-import.md @@ -4,7 +4,7 @@ Import ssh keys for public key authentication [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mode-button.md b/doc/mode-button.md index 22ec215..8734352 100644 --- a/doc/mode-button.md +++ b/doc/mode-button.md @@ -4,7 +4,7 @@ Mode button with multiple presses [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/netwatch-dns.md b/doc/netwatch-dns.md index e00ccd0..443106f 100644 --- a/doc/netwatch-dns.md +++ b/doc/netwatch-dns.md @@ -4,7 +4,7 @@ Manage DNS and DoH servers from netwatch [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/netwatch-notify.md b/doc/netwatch-notify.md index 806bb3a..90cd830 100644 --- a/doc/netwatch-notify.md +++ b/doc/netwatch-notify.md @@ -4,7 +4,7 @@ Notify on host up and down [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ospf-to-leds.md b/doc/ospf-to-leds.md index a7d4e9a..121f77b 100644 --- a/doc/ospf-to-leds.md +++ b/doc/ospf-to-leds.md @@ -4,7 +4,7 @@ Visualize OSPF state via LEDs [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ppp-on-up.md b/doc/ppp-on-up.md index 418f05e..21847c7 100644 --- a/doc/ppp-on-up.md +++ b/doc/ppp-on-up.md @@ -4,7 +4,7 @@ Run scripts on ppp connection [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/sms-action.md b/doc/sms-action.md index 18ca574..b4678af 100644 --- a/doc/sms-action.md +++ b/doc/sms-action.md @@ -4,7 +4,7 @@ Act on received SMS [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/sms-forward.md b/doc/sms-forward.md index 2fe9486..597410b 100644 --- a/doc/sms-forward.md +++ b/doc/sms-forward.md @@ -4,7 +4,7 @@ Forward received SMS [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/super-mario-theme.md b/doc/super-mario-theme.md index ec59b39..e4bae2e 100644 --- a/doc/super-mario-theme.md +++ b/doc/super-mario-theme.md @@ -4,7 +4,7 @@ Play Super Mario theme [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/unattended-lte-firmware-upgrade.md b/doc/unattended-lte-firmware-upgrade.md index a6bf994..6680447 100644 --- a/doc/unattended-lte-firmware-upgrade.md +++ b/doc/unattended-lte-firmware-upgrade.md @@ -4,7 +4,7 @@ Install LTE firmware upgrade [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/update-gre-address.md b/doc/update-gre-address.md index fba2a65..80902b9 100644 --- a/doc/update-gre-address.md +++ b/doc/update-gre-address.md @@ -4,7 +4,7 @@ Update GRE configuration with dynamic addresses [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/update-tunnelbroker.md b/doc/update-tunnelbroker.md index 5aca581..2539e2f 100644 --- a/doc/update-tunnelbroker.md +++ b/doc/update-tunnelbroker.md @@ -4,7 +4,7 @@ Update tunnelbroker configuration [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.12-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/firmware-upgrade-reboot.rsc b/firmware-upgrade-reboot.rsc index 038f74e..169a2e0 100644 --- a/firmware-upgrade-reboot.rsc +++ b/firmware-upgrade-reboot.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2022-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # install firmware upgrade, and reboot # https://git.eworm.de/cgit/routeros-scripts/about/doc/firmware-upgrade-reboot.md diff --git a/global-wait.rsc b/global-wait.rsc index f8c767b..239f575 100644 --- a/global-wait.rsc +++ b/global-wait.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # wait for global-functions to finish # https://git.eworm.de/cgit/routeros-scripts/about/doc/global-wait.md diff --git a/gps-track.rsc b/gps-track.rsc index 1aeab84..dbca38a 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # track gps data by sending json data to http server # https://git.eworm.de/cgit/routeros-scripts/about/doc/gps-track.md diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index 0540ad5..8f55d71 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=80 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # manage and clean up private WPA passphrase after hotspot login # https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index 6f3b3e1..7ac996c 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=80 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # manage and clean up private WPA passphrase after hotspot login # https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index 9c79628..39c9f25 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=80 -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # manage and clean up private WPA passphrase after hotspot login # https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa.capsman.rsc b/hotspot-to-wpa.capsman.rsc index 37c8464..113c95d 100644 --- a/hotspot-to-wpa.capsman.rsc +++ b/hotspot-to-wpa.capsman.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # add private WPA passphrase after hotspot login # https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa.template.rsc b/hotspot-to-wpa.template.rsc index cbce42a..10f0c7e 100644 --- a/hotspot-to-wpa.template.rsc +++ b/hotspot-to-wpa.template.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # add private WPA passphrase after hotspot login # https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa.wifi.rsc b/hotspot-to-wpa.wifi.rsc index 86aeed7..dbf50e0 100644 --- a/hotspot-to-wpa.wifi.rsc +++ b/hotspot-to-wpa.wifi.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # add private WPA passphrase after hotspot login # https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md diff --git a/ipsec-to-dns.rsc b/ipsec-to-dns.rsc index dd40ca2..8894eee 100644 --- a/ipsec-to-dns.rsc +++ b/ipsec-to-dns.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2021-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # and add/remove/update DNS entries from IPSec mode-config # https://git.eworm.de/cgit/routeros-scripts/about/doc/ipsec-to-dns.md diff --git a/ipv6-update.rsc b/ipv6-update.rsc index 65bb959..ec9a03a 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # update firewall and dns settings on IPv6 prefix change # https://git.eworm.de/cgit/routeros-scripts/about/doc/ipv6-update.md diff --git a/lease-script.rsc b/lease-script.rsc index 8e1e8f6..a9d4b68 100644 --- a/lease-script.rsc +++ b/lease-script.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # run scripts on DHCP lease # https://git.eworm.de/cgit/routeros-scripts/about/doc/lease-script.md diff --git a/log-forward.rsc b/log-forward.rsc index a919d8f..7abcb4d 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # forward log messages via notification # https://git.eworm.de/cgit/routeros-scripts/about/doc/log-forward.md diff --git a/mod/bridge-port-to.rsc b/mod/bridge-port-to.rsc index 567a762..000532a 100644 --- a/mod/bridge-port-to.rsc +++ b/mod/bridge-port-to.rsc @@ -3,6 +3,8 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # +# requires RouterOS, version=7.13 +# # reset bridge ports to default bridge # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/bridge-port-to.md diff --git a/mod/bridge-port-vlan.rsc b/mod/bridge-port-vlan.rsc index aee5ef9..760e8a6 100644 --- a/mod/bridge-port-vlan.rsc +++ b/mod/bridge-port-vlan.rsc @@ -3,6 +3,8 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # +# requires RouterOS, version=7.13 +# # manage VLANs on bridge ports # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/bridge-port-vlan.md diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index 577abf3..5adca0a 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -3,6 +3,8 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # +# requires RouterOS, version=7.13 +# # inspect variables # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/inspectvar.md diff --git a/mod/ipcalc.rsc b/mod/ipcalc.rsc index b098b44..128ca54 100644 --- a/mod/ipcalc.rsc +++ b/mod/ipcalc.rsc @@ -3,6 +3,8 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # +# requires RouterOS, version=7.13 +# # ip address calculation # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/ipcalc.md diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index 0d83d69..dbd648b 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # send notifications via e-mail # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/notification-email.md diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 6d48a59..5da575a 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -3,6 +3,8 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # +# requires RouterOS, version=7.13 +# # send notifications via Ntfy (ntfy.sh) # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/notification-ntfy.md diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index 85d465a..c3972a0 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -3,6 +3,8 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # +# requires RouterOS, version=7.13 +# # download script and run it once # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/scriptrunonce.md diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index 6716958..f37c28b 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # import ssh keys for public key authentication # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/ssh-keys-import.md diff --git a/mode-button.rsc b/mode-button.rsc index f453f11..4994f6b 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # act on multiple mode and reset button presses # https://git.eworm.de/cgit/routeros-scripts/about/doc/mode-button.md diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 50c2b4c..09365ba 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2022-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # monitor and manage dns/doh with netwatch # https://git.eworm.de/cgit/routeros-scripts/about/doc/netwatch-dns.md diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index bdabe2e..0b6c366 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # monitor netwatch and send notifications # https://git.eworm.de/cgit/routeros-scripts/about/doc/netwatch-notify.md diff --git a/ospf-to-leds.rsc b/ospf-to-leds.rsc index a22e5a5..0932815 100644 --- a/ospf-to-leds.rsc +++ b/ospf-to-leds.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # visualize ospf instance state via leds # https://git.eworm.de/cgit/routeros-scripts/about/doc/ospf-to-leds.md diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index 61766c0..4ed92c5 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # run scripts on ppp up # https://git.eworm.de/cgit/routeros-scripts/about/doc/ppp-on-up.md diff --git a/sms-action.rsc b/sms-action.rsc index 4c37565..70bfb28 100644 --- a/sms-action.rsc +++ b/sms-action.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # run action on received SMS # https://git.eworm.de/cgit/routeros-scripts/about/doc/sms-action.md diff --git a/sms-forward.rsc b/sms-forward.rsc index b0966c3..477d11e 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -4,7 +4,7 @@ # Anatoly Bubenkov # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # forward SMS to e-mail # https://git.eworm.de/cgit/routeros-scripts/about/doc/sms-forward.md diff --git a/update-gre-address.rsc b/update-gre-address.rsc index 74967cd..76d0c81 100644 --- a/update-gre-address.rsc +++ b/update-gre-address.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # update gre interface remote address with dynamic address from # ipsec remote peer diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index c76b7ec..364dc08 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -5,7 +5,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: ppp-on-up -# requires RouterOS, version=7.12 +# requires RouterOS, version=7.13 # # update local address of tunnelbroker interface # https://git.eworm.de/cgit/routeros-scripts/about/doc/update-tunnelbroker.md From 36cf4d028bcf9597143249aed238dc5e131fda50 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 18 Mar 2024 10:30:32 +0100 Subject: [PATCH 019/893] global-functions: drop $LogPrintExit2 --- global-functions.rsc | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index ab8860f..c8fec8d 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -50,7 +50,6 @@ :global IsMacLocallyAdministered; :global IsTimeSync; :global LogPrint; -:global LogPrintExit2; :global LogPrintOnce; :global MAX; :global MIN; @@ -744,27 +743,6 @@ } } -# log and print with same text, optionally exit -# Deprectated! - TODO: remove later -:set LogPrintExit2 do={ - :local Severity [ :tostr $1 ]; - :local Name [ :tostr $2 ]; - :local Message [ :tostr $3 ]; - :local Exit [ :tostr $4 ]; - - :global LogPrint; - :global LogPrintOnce; - - $LogPrintOnce warning $0 \ - ("This function is deprecated and will be removed. Please make your adjustments!"); - - $LogPrint $1 $2 $3; - - :if ($Exit = "true") do={ - :error ("Hard error to exit."); - } -} - # log and print, once until reboot :set LogPrintOnce do={ :local Severity [ :tostr $1 ]; From 3015743b19883d2e19605b819fd2bbcbc6597d8f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sun, 7 Apr 2024 21:11:03 +0200 Subject: [PATCH 020/893] global-functions: $HumanReadableNum: indicate binary base... ... and update scripts to match the change. --- backup-cloud.rsc | 2 +- backup-upload.rsc | 2 +- check-health.rsc | 6 +++--- global-functions.rsc | 8 ++++++-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index 9a062f2..8e29c67 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -71,7 +71,7 @@ message=("Uploaded backup for " . $Identity . " to cloud.\n\n" . \ [ $DeviceInfo ] . "\n\n" . \ [ $FormatLine "Name" ($Cloud->"name") ] . "\n" . \ - [ $FormatLine "Size" ([ $HumanReadableNum ($Cloud->"size") 1024 ] . "iB") ] . "\n" . \ + [ $FormatLine "Size" ([ $HumanReadableNum ($Cloud->"size") 1024 ] . "B") ] . "\n" . \ [ $FormatLine "Download key" ($Cloud->"secret-download-key") ]); silent=true }); } else={ $SendNotification2 ({ origin=$ScriptName; \ diff --git a/backup-upload.rsc b/backup-upload.rsc index 18223bb..63e5b7f 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -140,7 +140,7 @@ :return \ [ $IfThenElse ([ :typeof $File ] = "array") \ ($Name . ":\n" . [ $FormatLine " name" ($File->"name") ] . "\n" . \ - [ $FormatLine " size" ([ $HumanReadableNum ($File->"size") 1024 ] . "iB") ]) \ + [ $FormatLine " size" ([ $HumanReadableNum ($File->"size") 1024 ] . "B") ]) \ [ $FormatLine $Name $File ] ]; } diff --git a/check-health.rsc b/check-health.rsc index 1e8fcc0..a769fa8 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -64,9 +64,9 @@ $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "card-file-box,chart-increasing" ] . "Health warning: RAM utilization"); \ message=("The RAM utilization on " . $Identity . " is at " . $CheckHealthRAMUtilization . "%!\n\n" . \ - [ $FormatLine "total" ([ $HumanReadableNum ($Resource->"total-memory") 1024 ] . "iB") 8 ] . "\n" . \ - [ $FormatLine "used" ([ $HumanReadableNum ($Resource->"total-memory" - $Resource->"free-memory") 1024 ] . "iB") 8 ] . "\n" . \ - [ $FormatLine "free" ([ $HumanReadableNum ($Resource->"free-memory") 1024 ] . "iB") 8 ]) }); + [ $FormatLine "total" ([ $HumanReadableNum ($Resource->"total-memory") 1024 ] . "B") 8 ] . "\n" . \ + [ $FormatLine "used" ([ $HumanReadableNum ($Resource->"total-memory" - $Resource->"free-memory") 1024 ] . "B") 8 ] . "\n" . \ + [ $FormatLine "free" ([ $HumanReadableNum ($Resource->"free-memory") 1024 ] . "B") 8 ]) }); :set CheckHealthRAMUtilizationNotified true; } :if ($CheckHealthRAMUtilization < 70 && $CheckHealthRAMUtilizationNotified = true) do={ diff --git a/global-functions.rsc b/global-functions.rsc index c8fec8d..aa39118 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -578,11 +578,13 @@ :local Base [ :tonum $2 ]; :global EitherOr; + :global IfThenElse; :local Prefix "kMGTPE"; :local Pow 1; :set Base [ $EitherOr $Base 1024 ]; + :local Bin [ $IfThenElse ($Base = 1024) "i" "" ]; :if ($Input < $Base) do={ :return $Input; @@ -595,9 +597,11 @@ :local Tmp1 ($Input * 100 / $Pow); :local Tmp2 ($Tmp1 / 100); :if ($Tmp2 >= 100) do={ - :return ($Tmp2 . $Prefix); + :return ($Tmp2 . $Prefix . $Bin); } - :return ($Tmp2 . "." . [ :pick $Tmp1 [ :len $Tmp2 ] ([ :len $Tmp1 ] - [ :len $Tmp2 ] + 1) ] . $Prefix); + :return ($Tmp2 . "." . \ + [ :pick $Tmp1 [ :len $Tmp2 ] ([ :len $Tmp1 ] - [ :len $Tmp2 ] + 1) ] . \ + $Prefix . $Bin); } } } From c5a5fb58363805efb824fb3336e95a1f6bf3dbb8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 10 Apr 2024 08:27:55 +0200 Subject: [PATCH 021/893] global-functions: $SendNotification: set origin --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index aa39118..c98a012 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1299,7 +1299,7 @@ :set SendNotification do={ :global SendNotification2; - $SendNotification2 ({ subject=$1; message=$2; link=$3; silent=$4 }); + $SendNotification2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); } # send notification via NotificationFunctions - expects one array argument From 012d259ca1421e31390358cb6749fda80ef4e3ab Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 9 Apr 2024 23:59:00 +0200 Subject: [PATCH 022/893] mod/notification-email: $SendEMail: set origin --- mod/notification-email.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index dbd648b..df2e81a 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -227,7 +227,7 @@ :set SendEMail do={ :global SendEMail2; - $SendEMail2 ({ subject=$1; message=$2; link=$3 }); + $SendEMail2 ({ origin=$0; subject=$1; message=$2; link=$3 }); } # send notification via e-mail - expects one array argument From a9b9f853ffb6b6a9b331f055d47463654bd2a5e2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 9 Apr 2024 23:58:29 +0200 Subject: [PATCH 023/893] mod/notification-matrix: $SendMatrix: set origin --- mod/notification-matrix.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 5a08146..477bb09 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -168,7 +168,7 @@ :set SendMatrix do={ :global SendMatrix2; - $SendMatrix2 ({ subject=$1; message=$2; link=$3 }); + $SendMatrix2 ({ origin=$0; subject=$1; message=$2; link=$3 }); } # send notification via Matrix - expects one array argument From 9e2b72ccdc59bc6abc936bf271d9bfaf2a986107 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 9 Apr 2024 23:56:36 +0200 Subject: [PATCH 024/893] mod/notification-ntfy: $SendNtfy: set origin --- mod/notification-ntfy.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 5da575a..dc03903 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -125,7 +125,7 @@ :set SendNtfy do={ :global SendNtfy2; - $SendNtfy2 ({ subject=$1; message=$2; link=$3; silent=$4 }); + $SendNtfy2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); } # send notification via ntfy - expects one array argument From 9e4749a5b71e97c7732639019cff6ba7f6e84d57 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 9 Apr 2024 23:57:40 +0200 Subject: [PATCH 025/893] mod/notification-telegram: $SendTelegram: set origin --- mod/notification-telegram.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index a43ff10..c78a8ad 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -175,7 +175,7 @@ :set SendTelegram do={ :global SendTelegram2; - $SendTelegram2 ({ subject=$1; message=$2; link=$3; silent=$4 }); + $SendTelegram2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); } # send notification via telegram - expects one array argument From e53c31e9e669738fa50e45387d88d97a934f7e4d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 11 Apr 2024 13:39:40 +0200 Subject: [PATCH 026/893] global-functions: $ScriptLock: degrade message to debug --- global-functions.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index c98a012..ded34c3 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1290,8 +1290,8 @@ } $RemoveTicket $Script $MyTicket; - $LogPrint info $0 ("Script '" . $Script . "' started more than once" . [ $IfThenElse ($WaitCount > 0) \ - " and timed out waiting for lock" "" ] . "..."); + $LogPrint debug $0 ("Script '" . $Script . "' started more than once" . \ + [ $IfThenElse ($WaitCount > 0) " and timed out waiting for lock" "" ] . "..."); :return false; } From 6db3355858157aceb92af47faa7937008d9cbf28 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 11 Apr 2024 13:40:55 +0200 Subject: [PATCH 027/893] global-functions: $ScriptLock: break long lines --- global-functions.rsc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index ded34c3..25c248d 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1278,12 +1278,15 @@ $AddTicket $Script $MyTicket; :local WaitCount 0; - :while ($WaitMax > $WaitCount && ([ $IsFirstTicket $Script $MyTicket ] = false || [ $TicketCount $Script ] < [ $JobCount $Script ])) do={ + :while ($WaitMax > $WaitCount && \ + ([ $IsFirstTicket $Script $MyTicket ] = false || \ + [ $TicketCount $Script ] < [ $JobCount $Script ])) do={ :set WaitCount ($WaitCount + 1); :delay 100ms; } - :if ([ $IsFirstTicket $Script $MyTicket ] = true && [ $TicketCount $Script ] = [ $JobCount $Script ]) do={ + :if ([ $IsFirstTicket $Script $MyTicket ] = true && \ + [ $TicketCount $Script ] = [ $JobCount $Script ]) do={ $RemoveTicket $Script $MyTicket; $CleanupTickets $Script; :return true; From 5f76c245b016125f9e56d45bef381bae38731491 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 11 Apr 2024 13:57:11 +0200 Subject: [PATCH 028/893] global-functions: $ScriptFromTerminal: check multiple invocations... ... and return false. We can not tell which job is us... So better safe than sorry. --- global-functions.rsc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 25c248d..abb9e22 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -931,6 +931,11 @@ :local Script [ :tostr $1 ]; :global LogPrint; + :global ScriptLock; + + :if ([ $ScriptLock $Script ] = false) do={ + :return false; + } :foreach Job in=[ /system/script/job/find where script=$Script ] do={ :set Job [ /system/script/job/get $Job ]; @@ -942,8 +947,8 @@ :return true; } } - $LogPrint debug $0 ("Script " . $Script . " NOT started from terminal."); + $LogPrint debug $0 ("Script " . $Script . " NOT started from terminal."); :return false; } From ca2e5f2a017c20f272419c5539b7c234a02f45a4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 9 Apr 2024 23:46:32 +0200 Subject: [PATCH 029/893] mod/notification-ntfy: support basic auth Closes #59 --- doc/mod/notification-ntfy.md | 5 +++++ global-config.rsc | 2 ++ global-functions.rsc | 2 +- mod/notification-ntfy.rsc | 14 +++++++++++--- news-and-changes.rsc | 1 + 5 files changed, 20 insertions(+), 4 deletions(-) diff --git a/doc/mod/notification-ntfy.md b/doc/mod/notification-ntfy.md index afa3109..b2330a5 100644 --- a/doc/mod/notification-ntfy.md +++ b/doc/mod/notification-ntfy.md @@ -47,6 +47,11 @@ Then reload the configuration. > [`global-config`](../../global-config.rsc) (the one without `-overlay`) to > your local `global-config-overlay` and modify it to your specific needs. +Using a paid account or running a server on-premises allows to add additional +basic authentication. Configure `NtfyServerUser` and `NtfyServerPass` for this. +Even authentication via access token is possible, adding it as password with +a blank username. + Usage and invocation -------------------- diff --git a/global-config.rsc b/global-config.rsc index f393abb..6a37c0c 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -56,6 +56,8 @@ # install the module: # $ScriptInstallUpdate mod/notification-ntfy :global NtfyServer "ntfy.sh"; +:global NtfyServerUser []; +:global NtfyServerPass []; :global NtfyTopic ""; # It is possible to override e-mail, Telegram, Matrix and Ntfy setting diff --git a/global-functions.rsc b/global-functions.rsc index abb9e22..8f2f179 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -12,7 +12,7 @@ :local ScriptName [ :jobname ]; # expected configuration version -:global ExpectedConfigVersion 126; +:global ExpectedConfigVersion 127; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index dc03903..ffe0c50 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -38,7 +38,8 @@ :if ([ :typeof $Message ] = "array" ) do={ :do { /tool/fetch check-certificate=yes-without-crl output=none http-method=post \ - ($Message->"url") http-header-field=($Message->"headers") http-data=($Message->"text") as-value; + http-header-field=($Message->"headers") http-data=($Message->"text") \ + ($Message->"url") user=($Message->"user") password=($Message->"pass") as-value; :set ($NtfyQueue->$Id); } on-error={ $LogPrint debug $0 ("Sending queued Ntfy message failed."); @@ -62,6 +63,10 @@ :global NtfyQueue; :global NtfyServer; :global NtfyServerOverride; + :global NtfyServerPass; + :global NtfyServerPassOverride; + :global NtfyServerUser; + :global NtfyServerUserOverride; :global NtfyTopic; :global NtfyTopicOverride; @@ -73,6 +78,8 @@ :global UrlEncode; :local Server [ $EitherOr ($NtfyServerOverride->($Notification->"origin")) $NtfyServer ]; + :local User [ $EitherOr ($NtfyServerUserOverride->($Notification->"origin")) $NtfyServerUser ]; + :local Pass [ $EitherOr ($NtfyServerPassOverride->($Notification->"origin")) $NtfyServerPass ]; :local Topic [ $EitherOr ($NtfyTopicOverride->($Notification->"origin")) $NtfyTopic ]; :if ([ :len $Topic ] = 0) do={ @@ -95,7 +102,7 @@ } } /tool/fetch check-certificate=yes-without-crl output=none http-method=post \ - $Url http-header-field=$Headers http-data=$Text as-value; + http-header-field=$Headers http-data=$Text $Url user=$User password=$Pass as-value; } on-error={ $LogPrint info $0 ("Failed sending ntfy notification! Queuing..."); @@ -105,7 +112,8 @@ :set Text ($Text . "\n" . [ $SymbolForNotification "alarm-clock" ] . \ "This message was queued since " . [ /system/clock/get date ] . " " . \ [ /system/clock/get time ] . " and may be obsolete."); - :set ($NtfyQueue->[ :len $NtfyQueue ]) { url=$Url; headers=$Headers; text=$Text }; + :set ($NtfyQueue->[ :len $NtfyQueue ]) \ + { url=$Url; user=$User; pass=$Pass; headers=$Headers; text=$Text }; :if ([ :len [ /system/scheduler/find where name="_FlushNtfyQueue" ] ] = 0) do={ /system/scheduler/add name="_FlushNtfyQueue" interval=1m start-time=startup \ on-event=(":global FlushNtfyQueue; \$FlushNtfyQueue;"); diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 2b04c29..8ddeb91 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -51,6 +51,7 @@ 124="Added support for links in 'netwatch-notify', these are added below the formatted notification text."; 125=("April's Fool! " . [ $SymbolForNotification "smiley-partying-face" ] . "Well, you missed it... - no charge nor fees. (Anyway... Donations are much appreciated, " . [ $SymbolForNotification "smiley-smiling-face" ] . "thanks!)"); 126="Made 'telegram-chat' capable of handling large command output. Telegram messages still limit the size, so it is truncated now."; + 127="Added support for authentication to Ntfy notification module."; }; # Migration steps to be applied on script updates From fb865ba114e610bcb272d8de7c1c882705e6e06e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 9 Apr 2024 23:50:00 +0200 Subject: [PATCH 030/893] mod/notification-ntfy: use custom user agent string --- mod/notification-ntfy.rsc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index ffe0c50..4413f07 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -72,6 +72,7 @@ :global CertificateAvailable; :global EitherOr; + :global FetchUserAgentStr; :global IfThenElse; :global LogPrint; :global SymbolForNotification; @@ -87,7 +88,8 @@ } :local Url ("https://" . $NtfyServer . "/" . [ $UrlEncode $NtfyTopic ]); - :local Headers ({ ("Priority: " . [ $IfThenElse ($Notification->"silent") "low" "default" ]); \ + :local Headers ({ [ $FetchUserAgentStr ($Notification->"origin") ]; \ + ("Priority: " . [ $IfThenElse ($Notification->"silent") "low" "default" ]); \ ("Title: " . "[" . $IdentityExtra . $Identity . "] " . ($Notification->"subject")) }); :local Text (($Notification->"message") . "\n"); :if ([ :len ($Notification->"link") ] > 0) do={ From 9dfa11eac534019d08a5cfa289d7cde0f22c2a92 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 10 Apr 2024 11:51:47 +0200 Subject: [PATCH 031/893] mod/notification-matrix: use custom user agent string --- mod/notification-matrix.rsc | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 477bb09..12a0e33 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -39,7 +39,8 @@ :foreach Id,Message in=$MatrixQueue do={ :if ([ :typeof $Message ] = "array" ) do={ :do { - /tool/fetch check-certificate=yes-without-crl output=none http-method=post \ + /tool/fetch check-certificate=yes-without-crl output=none \ + http-header-field=($Message->"headers") http-method=post \ ("https://" . $Message->"homeserver" . "/_matrix/client/r0/rooms/" . $Message->"room" . \ "/send/m.room.message?access_token=" . $Message->"accesstoken") \ http-data=("{ \"msgtype\": \"m.text\", \"body\": \"" . $Message->"plain" . "\"," . \ @@ -74,6 +75,7 @@ :global MatrixRoomOverride; :global EitherOr; + :global FetchUserAgentStr; :global LogPrint; :global SymbolForNotification; @@ -115,6 +117,7 @@ :return false; } + :local Headers ({ [ $FetchUserAgentStr ($Notification->"origin") ] }); :local Plain [ $PrepareText ("## [" . $IdentityExtra . $Identity . "] " . \ ($Notification->"subject") . "\n```\n" . ($Notification->"message") . "\n```") "plain" ]; :local Formatted ("

" . [ $PrepareText ("[" . $IdentityExtra . $Identity . "] " . \ @@ -129,7 +132,8 @@ } :do { - /tool/fetch check-certificate=yes-without-crl output=none http-method=post \ + /tool/fetch check-certificate=yes-without-crl output=none \ + http-header-field=$Headers http-method=post \ ("https://" . $HomeServer . "/_matrix/client/r0/rooms/" . $Room . \ "/send/m.room.message?access_token=" . $AccessToken) \ http-data=("{ \"msgtype\": \"m.text\", \"body\": \"" . $Plain . "\"," . \ @@ -146,9 +150,9 @@ " " . [ /system/clock/get time ] . " and may be obsolete."); :set Plain ($Plain . "\\n" . $Text); :set Formatted ($Formatted . "
" . $Text); - :set ($MatrixQueue->[ :len $MatrixQueue ]) { room=$Room; \ - accesstoken=$AccessToken; homeserver=$HomeServer; \ - plain=$Plain; formatted=$Formatted }; + :set ($MatrixQueue->[ :len $MatrixQueue ]) { headers=$Headers; \ + accesstoken=$AccessToken; homeserver=$HomeServer; room=$Room; \ + plain=$Plain; formatted=$Formatted }; :if ([ :len [ /system/scheduler/find where name="_FlushMatrixQueue" ] ] = 0) do={ /system/scheduler/add name="_FlushMatrixQueue" interval=1m start-time=startup \ on-event=(":global FlushMatrixQueue; \$FlushMatrixQueue;"); @@ -185,6 +189,7 @@ :local User [ :tostr $1 ]; :local Pass [ :tostr $2 ]; + :global FetchUserAgentStr; :global LogPrint; :global MatrixAccessToken; @@ -193,6 +198,7 @@ :local Domain [ :pick $User ([ :find $User ":" ] + 1) [ :len $User] ]; :do { :local Data ([ /tool/fetch check-certificate=yes-without-crl output=user \ + http-header-field=({ [ $FetchUserAgentStr $0 ] }) \ ("https://" . $Domain . "/.well-known/matrix/client") as-value ]->"data"); :set MatrixHomeServer ([ :deserialize from=json value=$Data ]->"m.homeserver"->"base_url"); $LogPrint debug $0 ("Home server is: " . $MatrixHomeServer); @@ -207,7 +213,8 @@ :do { :local Data ([ /tool/fetch check-certificate=yes-without-crl output=user \ - http-method=post http-data=("{\"type\":\"m.login.password\", \"user\":\"" . $User . "\", \"password\":\"" . $Pass . "\"}") \ + http-header-field=({ [ $FetchUserAgentStr $0 ] }) http-method=post \ + http-data=("{\"type\":\"m.login.password\", \"user\":\"" . $User . "\", \"password\":\"" . $Pass . "\"}") \ ("https://" . $MatrixHomeServer . "/_matrix/client/r0/login") as-value ]->"data"); :set MatrixAccessToken ([ :deserialize from=json value=$Data ]->"access_token"); $LogPrint debug $0 ("Access token is: " . $MatrixAccessToken); @@ -233,6 +240,7 @@ :set SetupMatrixJoinRoom do={ :global MatrixRoom [ :tostr $1 ]; + :global FetchUserAgentStr; :global LogPrint; :global UrlEncode; @@ -242,7 +250,7 @@ :do { /tool/fetch check-certificate=yes-without-crl output=none \ - http-method=post http-data="" \ + http-header-field=({ [ $FetchUserAgentStr $0 ] }) http-method=post http-data="" \ ("https://" . $MatrixHomeServer . "/_matrix/client/r0/rooms/" . [ $UrlEncode $MatrixRoom ] . \ "/join?access_token=" . [ $UrlEncode $MatrixAccessToken ]) as-value; $LogPrint debug $0 ("Joined the room."); From 2a232ad2f5eef4b60c97306ef731bc5883bf5cfb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 12 Apr 2024 11:03:14 +0200 Subject: [PATCH 032/893] mod/notification-matrix: generate JSON with :serialize --- mod/notification-matrix.rsc | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 12a0e33..3e3a33e 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -40,12 +40,11 @@ :if ([ :typeof $Message ] = "array" ) do={ :do { /tool/fetch check-certificate=yes-without-crl output=none \ - http-header-field=($Message->"headers") http-method=post \ - ("https://" . $Message->"homeserver" . "/_matrix/client/r0/rooms/" . $Message->"room" . \ - "/send/m.room.message?access_token=" . $Message->"accesstoken") \ - http-data=("{ \"msgtype\": \"m.text\", \"body\": \"" . $Message->"plain" . "\"," . \ - "\"format\": \"org.matrix.custom.html\", \"formatted_body\": \"" . \ - $Message->"formatted" . "\" }") as-value; + http-header-field=($Message->"headers") http-method=post \ + http-data=[ :serialize to=json { "msgtype"="m.text"; "body"=($Message->"plain"); + "format"="org.matrix.custom.html"; "formatted_body"=($Message->"formatted") } ] \ + ("https://" . $Message->"homeserver" . "/_matrix/client/r0/rooms/" . $Message->"room" . \ + "/send/m.room.message?access_token=" . $Message->"accesstoken") as-value; :set ($MatrixQueue->$Id); } on-error={ $LogPrint debug $0 ("Sending queued Matrix message failed."); @@ -133,12 +132,11 @@ :do { /tool/fetch check-certificate=yes-without-crl output=none \ - http-header-field=$Headers http-method=post \ - ("https://" . $HomeServer . "/_matrix/client/r0/rooms/" . $Room . \ - "/send/m.room.message?access_token=" . $AccessToken) \ - http-data=("{ \"msgtype\": \"m.text\", \"body\": \"" . $Plain . "\"," . \ - "\"format\": \"org.matrix.custom.html\", \"formatted_body\": \"" . \ - $Formatted . "\" }") as-value; + http-header-field=$Headers http-method=post \ + http-data=[ :serialize to=json { "msgtype"="m.text"; "body"=$Plain; + "format"="org.matrix.custom.html"; "formatted_body"=$Formatted } ] \ + ("https://" . $HomeServer . "/_matrix/client/r0/rooms/" . $Room . \ + "/send/m.room.message?access_token=" . $AccessToken) as-value; } on-error={ $LogPrint info $0 ("Failed sending Matrix notification! Queuing..."); @@ -214,7 +212,7 @@ :do { :local Data ([ /tool/fetch check-certificate=yes-without-crl output=user \ http-header-field=({ [ $FetchUserAgentStr $0 ] }) http-method=post \ - http-data=("{\"type\":\"m.login.password\", \"user\":\"" . $User . "\", \"password\":\"" . $Pass . "\"}") \ + http-data=[ :serialize to=json { "type"="m.login.password"; "user"=$User; "password"=$Pass } ] \ ("https://" . $MatrixHomeServer . "/_matrix/client/r0/login") as-value ]->"data"); :set MatrixAccessToken ([ :deserialize from=json value=$Data ]->"access_token"); $LogPrint debug $0 ("Access token is: " . $MatrixAccessToken); From d31afc9ec330634a2b66b346ee2d830ea5e5d436 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 12 Apr 2024 11:10:34 +0200 Subject: [PATCH 033/893] gps-track: generate JSON with :serialize --- gps-track.rsc | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/gps-track.rsc b/gps-track.rsc index dbca38a..f78dfe7 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -33,11 +33,8 @@ :do { /tool/fetch check-certificate=yes-without-crl $GpsTrackUrl output=none \ http-method=post http-header-field=({ "Content-Type: application/json" }) \ - http-data=("{" . \ - "\"lat\":\"" . ($Gps->"latitude") . "\"," . \ - "\"lon\":\"" . ($Gps->"longitude") . "\"," . \ - "\"identity\":\"" . $Identity . "\"" . \ - "}") as-value; + http-data=[ :serialize to=json { "identity"=$Identity; \ + "lat"=($Gps->"latitude"); "lon"=($Gps->"longitude") } ] as-value; $LogPrint debug $ScriptName ("Sending GPS data in " . $CoordinateFormat . " format: " . \ "lat: " . ($Gps->"latitude") . " " . \ "lon: " . ($Gps->"longitude")); From 5736ecebc53a8e97e986eb50e4a1611b410dcc14 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 12 Apr 2024 11:14:01 +0200 Subject: [PATCH 034/893] gps-track: use custom user agent string --- gps-track.rsc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/gps-track.rsc b/gps-track.rsc index f78dfe7..e2a4e16 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -17,6 +17,7 @@ :global GpsTrackUrl; :global Identity; + :global FetchUserAgentStr; :global LogPrint; :global ScriptLock; :global WaitFullyConnected; @@ -31,10 +32,10 @@ :if ($Gps->"valid" = true) do={ :do { - /tool/fetch check-certificate=yes-without-crl $GpsTrackUrl output=none \ - http-method=post http-header-field=({ "Content-Type: application/json" }) \ + /tool/fetch check-certificate=yes-without-crl output=none http-method=post \ + http-header-field=({ [ $FetchUserAgentStr $ScriptName ]; "Content-Type: application/json" }) \ http-data=[ :serialize to=json { "identity"=$Identity; \ - "lat"=($Gps->"latitude"); "lon"=($Gps->"longitude") } ] as-value; + "lat"=($Gps->"latitude"); "lon"=($Gps->"longitude") } ] $GpsTrackUrl as-value; $LogPrint debug $ScriptName ("Sending GPS data in " . $CoordinateFormat . " format: " . \ "lat: " . ($Gps->"latitude") . " " . \ "lon: " . ($Gps->"longitude")); From 7aa5059f6d478fb8984caae7c906154a1d598488 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 12 Apr 2024 11:18:42 +0200 Subject: [PATCH 035/893] global-functions: $CertificateAvailable: use single quotes --- global-functions.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 8f2f179..17aa38f 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -107,7 +107,7 @@ } :if ([ :len [ /certificate/find where common-name=$CommonName ] ] = 0) do={ - $LogPrint info $0 ("Certificate with CommonName \"" . $CommonName . "\" not available."); + $LogPrint info $0 ("Certificate with CommonName '" . $CommonName . "' not available."); :if ([ $CertificateDownload $CommonName ] = false) do={ :return false; } @@ -116,8 +116,8 @@ :local CertVal [ /certificate/get [ find where common-name=$CommonName ] ]; :while (($CertVal->"akid") != "" && ($CertVal->"akid") != ($CertVal->"skid")) do={ :if ([ :len [ /certificate/find where skid=($CertVal->"akid") ] ] = 0) do={ - $LogPrint info $0 ("Certificate chain for \"" . $CommonName . \ - "\" is incomplete, missing \"" . ([ $ParseKeyValueStore ($CertVal->"issuer") ]->"CN") . "\"."); + $LogPrint info $0 ("Certificate chain for '" . $CommonName . \ + "' is incomplete, missing '" . ([ $ParseKeyValueStore ($CertVal->"issuer") ]->"CN") . "'."); :if ([ $CertificateDownload $CommonName ] = false) do={ :return false; } From e1781fb8053db5cdb3b26d04009c216f7d2204ac Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 12 Apr 2024 11:19:37 +0200 Subject: [PATCH 036/893] global-functions: $CertificateDownload: use single quotes --- global-functions.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 17aa38f..918ea9a 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -141,7 +141,7 @@ :global WaitForFile; $LogPrint info $0 ("Downloading and importing certificate with " . \ - "CommonName \"" . $CommonName . "\"."); + "CommonName '" . $CommonName . "'."); :do { :local FileName ([ $CleanName $CommonName ] . ".pem"); /tool/fetch check-certificate=yes-without-crl http-header-field=({ [ $FetchUserAgentStr $0 ] }) \ @@ -156,7 +156,7 @@ $CertificateNameByCN [ /certificate/get $Cert common-name ]; } } on-error={ - $LogPrint warning $0 ("Failed importing certificate with CommonName \"" . $CommonName . "\"!"); + $LogPrint warning $0 ("Failed importing certificate with CommonName '" . $CommonName . "'!"); :return false; } :return true; From 8c1543a402570278a8dfdcf8d052ab8bb6f282e5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 12 Apr 2024 11:21:54 +0200 Subject: [PATCH 037/893] certificate-renew-issued: use single quotes --- certificate-renew-issued.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/certificate-renew-issued.rsc b/certificate-renew-issued.rsc index 77ed3d0..7815443 100644 --- a/certificate-renew-issued.rsc +++ b/certificate-renew-issued.rsc @@ -36,13 +36,13 @@ /certificate/export-certificate ($CertVal->"name") type=pkcs12 \ file-name=("cert-issued/" . $CertVal->"common-name") \ export-passphrase=($CertIssuedExportPass->($CertVal->"common-name")); - $LogPrint info $ScriptName ("Issued a new certificate for \"" . $CertVal->"common-name" . \ - "\", exported to \"cert-issued/" . $CertVal->"common-name" . ".p12\"."); + $LogPrint info $ScriptName ("Issued a new certificate for '" . $CertVal->"common-name" . \ + "', exported to 'cert-issued/" . $CertVal->"common-name" . ".p12'."); } else={ $LogPrint warning $ScriptName ("Failed creating directory, not exporting certificate."); } } else={ - $LogPrint info $ScriptName ("Issued a new certificate for \"" . $CertVal->"common-name" . "\"."); + $LogPrint info $ScriptName ("Issued a new certificate for '" . $CertVal->"common-name" . "'."); } } } on-error={ } From 3a36db6de8a69cba493bdd0baf86c60401fe971c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 18 Apr 2024 08:43:41 +0200 Subject: [PATCH 038/893] mod/notification-matrix: fix double escaping That was introduced with 2a232ad2f5eef4b60c97306ef731bc5883bf5cfb when switching to :serialize... --- mod/notification-matrix.rsc | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 3e3a33e..86e6b5f 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -86,21 +86,15 @@ } :local Return ""; - :local Chars { - "plain"={ "\\"; "\""; "\n" }; - "format"={ "\\"; "\""; "\n"; "&"; "<"; ">" }; - } - :local Subs { - "plain"={ "\\\\"; "\\\""; "\\n" }; - "format"={ "\\\\"; """; "
"; "&"; "<"; ">" }; - } + :local Chars { "\""; "\n"; "&"; "<"; ">" }; + :local Subs { """; "
"; "&"; "<"; ">" }; :for I from=0 to=([ :len $Input ] - 1) do={ :local Char [ :pick $Input $I ]; - :local Replace [ :find ($Chars->$2) $Char ]; + :local Replace [ :find $Chars $Char ]; :if ([ :typeof $Replace ] = "num") do={ - :set Char ($Subs->$2->$Replace); + :set Char ($Subs->$Replace); } :set Return ($Return . $Char); } @@ -117,17 +111,17 @@ } :local Headers ({ [ $FetchUserAgentStr ($Notification->"origin") ] }); - :local Plain [ $PrepareText ("## [" . $IdentityExtra . $Identity . "] " . \ - ($Notification->"subject") . "\n```\n" . ($Notification->"message") . "\n```") "plain" ]; + :local Plain ("## [" . $IdentityExtra . $Identity . "] " . \ + ($Notification->"subject") . "\n```\n" . ($Notification->"message") . "\n```"); :local Formatted ("

" . [ $PrepareText ("[" . $IdentityExtra . $Identity . "] " . \ - ($Notification->"subject")) "format" ] . "

" . "
" . \
-    [ $PrepareText ($Notification->"message") "format" ] . "
"); + ($Notification->"subject")) ] . "

" . "
" . \
+    [ $PrepareText ($Notification->"message") ] . "
"); :if ([ :len ($Notification->"link") ] > 0) do={ :set Plain ($Plain . "\\n" . [ $SymbolForNotification "link" ] . \ - [ $PrepareText ("[" . $Notification->"link" . "](" . $Notification->"link" . ")") "plain" ]); + "[" . $Notification->"link" . "](" . $Notification->"link" . ")"); :set Formatted ($Formatted . "
" . [ $SymbolForNotification "link" ] . \ - ""link") "format" ] . "\\\">" . \ - [ $PrepareText ($Notification->"link") "format" ] . ""); + ""link") ] . "\">" . \ + [ $PrepareText ($Notification->"link") ] . ""); } :do { From b50a5b294a50729e70d96c65ed1a12657bd1adf3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 18 Apr 2024 21:47:50 +0200 Subject: [PATCH 039/893] mod/notification-matrix: ... and more double escaping --- mod/notification-matrix.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 86e6b5f..7eae1b0 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -117,7 +117,7 @@ ($Notification->"subject")) ] . "" . "
" . \
     [ $PrepareText ($Notification->"message") ] . "
"); :if ([ :len ($Notification->"link") ] > 0) do={ - :set Plain ($Plain . "\\n" . [ $SymbolForNotification "link" ] . \ + :set Plain ($Plain . "\n" . [ $SymbolForNotification "link" ] . \ "[" . $Notification->"link" . "](" . $Notification->"link" . ")"); :set Formatted ($Formatted . "
" . [ $SymbolForNotification "link" ] . \ ""link") ] . "\">" . \ @@ -140,7 +140,7 @@ :local Text ([ $SymbolForNotification "alarm-clock" ] . \ "This message was queued since " . [ /system/clock/get date ] . \ " " . [ /system/clock/get time ] . " and may be obsolete."); - :set Plain ($Plain . "\\n" . $Text); + :set Plain ($Plain . "\n" . $Text); :set Formatted ($Formatted . "
" . $Text); :set ($MatrixQueue->[ :len $MatrixQueue ]) { headers=$Headers; \ accesstoken=$AccessToken; homeserver=$HomeServer; room=$Room; \ From 6fd0becf64184184642e719e288bc537a0bee499 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 19 Apr 2024 08:59:51 +0200 Subject: [PATCH 040/893] global-functions: introduce $ProtocolStrip --- global-functions.rsc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 918ea9a..3b9f27c 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -58,6 +58,7 @@ :global ParseDate; :global ParseKeyValueStore; :global PrettyPrint; +:global ProtocolStrip; :global RandomDelay; :global RequiredRouterOS; :global ScriptFromTerminal; @@ -885,6 +886,17 @@ :put [ $Unix2Dos $Input ]; } +# strip protocol from from url string +:set ProtocolStrip do={ + :local Input [ :tostr $1 ]; + + :local Pos [ :find $Input "://" ]; + :if ([ :typeof $Pos ] = "nil") do={ + :return $Input; + } + :return [ :pick $Input ($Pos + 3) [ :len $Input ] ]; +} + # delay a random amount of seconds :set RandomDelay do={ :local Time [ :tonum $1 ]; From 8cd03167ca0bd47efd9b7c9b12aabebbe228b36c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 19 Apr 2024 09:04:08 +0200 Subject: [PATCH 041/893] mod/notification-matrix: string protocol for display --- mod/notification-matrix.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 7eae1b0..9442f54 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -76,6 +76,7 @@ :global EitherOr; :global FetchUserAgentStr; :global LogPrint; + :global ProtocolStrip; :global SymbolForNotification; :local PrepareText do={ @@ -117,11 +118,12 @@ ($Notification->"subject")) ] . "" . "
" . \
     [ $PrepareText ($Notification->"message") ] . "
"); :if ([ :len ($Notification->"link") ] > 0) do={ + :local Label [ $ProtocolStrip ($Notification->"link") ]; :set Plain ($Plain . "\n" . [ $SymbolForNotification "link" ] . \ - "[" . $Notification->"link" . "](" . $Notification->"link" . ")"); + "[" . $Label . "](" . $Notification->"link" . ")"); :set Formatted ($Formatted . "
" . [ $SymbolForNotification "link" ] . \ "
"link") ] . "\">" . \ - [ $PrepareText ($Notification->"link") ] . ""); + [ $PrepareText $Label ] . ""); } :do { From ee54956a6909190eceb5eae696ad8590720bc3c3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 19 Apr 2024 09:09:13 +0200 Subject: [PATCH 042/893] mod/notification-telegram: string protocol for display --- mod/notification-telegram.rsc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index c78a8ad..745367a 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -76,6 +76,7 @@ :global EitherOr; :global IfThenElse; :global LogPrint; + :global ProtocolStrip; :global SymbolForNotification; :global UrlEncode; @@ -117,7 +118,7 @@ ($Notification->"subject")) "plain" ] . "__*\n\n"); :local LenSubject [ :len $Text ]; :local LenMessage [ :len ($Notification->"message") ]; - :local LenLink [ :len ($Notification->"link") ]; + :local LenLink ([ :len ($Notification->"link") ] * 2); :local LenSum ($LenSubject + $LenMessage + $LenLink); :if ($LenSum > 3968) do={ :set Text ($Text . [ $EscapeMD ([ :pick ($Notification->"message") 0 (3840 - $LenSubject - $LenLink) ] . "...") "body" ]); @@ -126,7 +127,9 @@ :set Text ($Text . [ $EscapeMD ($Notification->"message") "body" ]); } :if ($LenLink > 0) do={ - :set Text ($Text . "\n" . [ $SymbolForNotification "link" ] . [ $EscapeMD ($Notification->"link") "plain" ]); + :set Text ($Text . "\n" . [ $SymbolForNotification "link" ] . \ + "[" . [ $EscapeMD [ $ProtocolStrip ($Notification->"link") ] "plain" ] . "]" . \ + "(" . [ $EscapeMD ($Notification->"link") "plain" ] . ")"); } :if ($Truncated = true) do={ :set Text ($Text . "\n" . [ $SymbolForNotification "scissors" ] . \ From b0cd53f813be602edf59db2ec18e085d84fbebeb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 19 Apr 2024 10:05:52 +0200 Subject: [PATCH 043/893] netwatch-notify: allow to suppress resolve failure --- doc/netwatch-notify.md | 9 +++++++++ netwatch-notify.rsc | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/doc/netwatch-notify.md b/doc/netwatch-notify.md index 90cd830..2db32bb 100644 --- a/doc/netwatch-notify.md +++ b/doc/netwatch-notify.md @@ -104,6 +104,15 @@ powered off, but accessibility is of interest. Go and get your coffee ☕️ before sending the print job. +### No log on failed resolve + +A message is writting to log after three failed attemts to resolve a host. +However this can cause some noise for hosts that are expected to have +failures, for example when the name is dynamically added by +[`dhcp-to-dns`](dhcp-to-dns.md). This can be suppressed: + + /tool/netwatch/add comment="notify, name=client, resolve=client.dhcp.example.com, no-resolve-fail" host=10.0.0.0; + ### Add a note in notification For some extra information it is possible to add a text note. This is diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index 0b6c366..9b0beb9 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -116,7 +116,7 @@ } } on-error={ :set ($Metric->"resolve-failcnt") ($Metric->"resolve-failcnt" + 1); - :if ($Metric->"resolve-failcnt" = 3) do={ + :if ($Metric->"resolve-failcnt" = 3 && $HostInfo->"no-resolve-fail" != true) do={ $LogPrint warning $ScriptName ("Resolving name '" . $HostInfo->"resolve" . [ $IfThenElse \ ($HostInfo->"resolve" != $HostInfo->"name") ("' for " . $Type . " '" . \ $HostInfo->"name") "" ] . "' failed."); From 0f2a4aedab31a7f697158d3d34ac6ce08756ebce Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 19 Apr 2024 11:34:35 +0200 Subject: [PATCH 044/893] global-functions: $CertificateDownload: remove with find... ... to make sure this does not break when the file does no longer exist. Starting with RouterOS 7.15rc1 the file is automatically removed on import. --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 3b9f27c..66765bf 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -151,7 +151,7 @@ $WaitForFile $FileName; /certificate/import file-name=$FileName passphrase="" as-value; :delay 1s; - /file/remove $FileName; + /file/remove [ find where name=$FileName ]; :foreach Cert in=[ /certificate/find where name~("^" . $FileName . "_[0-9]+\$") ] do={ $CertificateNameByCN [ /certificate/get $Cert common-name ]; From e42f8843bd3e25657d7af1ced4a4ce0270817358 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 19 Apr 2024 11:53:32 +0200 Subject: [PATCH 045/893] INITIAL-COMMANDS: remove the certificate file with find Required as RouterOS 7.15rc1 removes it automatically. --- INITIAL-COMMANDS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 0320fe8..4a12197 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -23,7 +23,7 @@ Run the complete base installation: :if ([ :len [ /certificate/find where fingerprint="46494e30379059df18be52124305e606fc59070e5b21076ce113954b60517cda" or fingerprint="69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470" ] ] != 2) do={ :error "Something is wrong with your certificates!"; }; - /file/remove "letsencrypt-E1.pem"; + /file/remove [ find where name="letsencrypt-E1.pem" ]; :delay 1s; /system/script/set name=("global-config-overlay-" . [ /system/clock/get date ] . "-" . [ /system/clock/get time ]) [ find where name="global-config-overlay" ]; :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ From de8da38a0cf60be3f79f5a64ad766343c18cb2a2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 19 Apr 2024 11:59:03 +0200 Subject: [PATCH 046/893] README: remove left over certificate file But use find as RouterOS 7.15rc1 removes it automatically. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4516736..a92f71d 100644 --- a/README.md +++ b/README.md @@ -91,11 +91,12 @@ a sensitive property, the passphrase. For basic verification we rename the certificates and print them by fingerprint. Make sure exactly these two certificates ("*E1*" and -"*ISRG-Root-X2*") are shown. +"*ISRG-Root-X2*") are shown. Also remove the left over file. /certificate/set name="E1" [ find where common-name="E1" ]; /certificate/set name="ISRG-Root-X2" [ find where common-name="ISRG Root X2" ]; /certificate/print proplist=name where fingerprint="46494e30379059df18be52124305e606fc59070e5b21076ce113954b60517cda" or fingerprint="69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470"; + /file/remove [ find where name="letsencrypt-E1.pem" ]; ![screenshot: check certs](README.d/03-check-certs.avif) From b0e4449e4f3f6318bbe9ad83fe1b8e30a77ea1ab Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 19 Apr 2024 12:00:13 +0200 Subject: [PATCH 047/893] README: show fingerprints in output This is not scrictly necessary, as we filter by fingerprint already... But it gives better overview and feeling. --- README.d/03-check-certs.avif | Bin 9339 -> 12089 bytes README.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/README.d/03-check-certs.avif b/README.d/03-check-certs.avif index 33bdc408e4dcd3c35e95c87109926d801f8c9fe8..0477c398b41b439ec6eff03c8bcd2357f2637857 100644 GIT binary patch delta 10851 zcmV-pDxB5(NV#5+dK4Ic000)c00IC2009610b2k77bKC6egVXj4FMSeA(JNoE&?s) zlUD&a0X~zE0Y?Iv7L(ZlumL`^iUQUFf3PD}+000C+fFjaE%S4R8Kz4PpXJSs0_{*g zPvTR@zHyJkCaeiTTWy;Bal|2ma+4b|K2m3}#@uY@C*=B4ODq2S{wiph_i*@3Fv#uo z=Q-#)S42|f{{V(Odh(aHdj2x~6@$cZTQ7)6e+|uP7m~S#AUSVQu)-QPI$>bH~0ABwROp2e-dxD@hPAE90744Rsd)2u z`<#~OKNE~pzC<2%sJGB=Grc^+e=5Ek*8rRh`_yo{e`;zZ>cy3u?VN#`+b8BByJJ6? zsqP9HEPVZNN~-bgSfgLvez+Lv-n%34{{X`r)tmOMU;h9~?d72Bc$00p8d9`nW6QFp zU*vw7IOl`w$33bvg3}ipG+V6VO|0nHjdmWnY!W*E04j7cKpxn(rdCa{e~*=;3ZEnQ z$8MPa0BgNTy9sl@T#12c4%JAY;b`!wfWX}G;&7jTNy$~J;?x%rZ}%5UK46>Z&&{S0O6%mf7nh@sP)^c{MY1a zYB~`<09zuDJ2IBlT83lbSENGgOM%U@2O4jixfq+0rkRTb_IU_vh z80N3r>sQHTXsfSzX#{zW9kG&*RE{(GbL-cdv7f3BTwZ-=3o{gXNv<XUo@DLdTsf@T;v{u47{E>K8B@j9BEo) zGHRMjCgOLq%%HY1a0cwD#yG&~S3F51vH22@6~U@HPF#6Wpeex14te{l^7rDbUs+h| z_lauWCQ^~zNpB373XaU905(?yhUcDh#c5glRcEKBpOEW6e{7PLo|=9~GbplX@fM!S z^Qikd^GP|$1d*Ryenzz{AH%Vbx0)T*!SYc^jz%B60ES{i^ehSJFe=Rc7P7aV-rxQb zXddP{mK2F0QqhuGj(&bHLC>Ky$TXcQ3GXde#PR;-Br7mQ2-yXSfLQN5S0P2 zwA=YIRT?c?e@Rc!3Fq-$vx%zKZJubH>z=z3&eXCKt1%)3OF16|%!xK#)X zkVqcA@INZ#nsJ{hZr-fmsTT?IrtQ;NU+^tnCXsspf0sn?#-aw|LzZ_?27bBinzI{D zH0WWU!&fbL_E{tI2ADF^nF&|UGH^DoG1{o3B_2&NoBY=*> zQIc8Se|;|L%K(RMsrgRf*a3rpM{0&`8&i#)n@hZn2R}8tj12MAS6yoyi7nN{UNVg_ zBtltCE3}{9D&sBGDz^ZC5c<=t^#;~$qFes}7s&(?6!VdmGXs9;YdZU-FaoL5P7bi4TOtna*8 zEY|HRu#e4*midS-Uv4@mAx9tpJu9j%=FeBMpSjU@*KJjEn^aC&>x z6G1J!tsKZvm5PvkLBaiNy1UVQEpUF=fBNf9b1bE%{q#$YdE;*+{ztBAE8Q2vCge1l z^ISBSA$Lb4L*-@#nUA(xpKb;^&%JWAvBObawEh+F+pV~_@hmYjMp{;t(ZDzd0|Xr8 zk>96o`P#mbp;~DM;>!J|xh?{y+9Pf|lA{EEy+^(%ld4!Bf+Q58v$=mCJ!3Q`M&PO(%HmLE-s%o~Q zG5IcrZ!x0?`5+zK1CGPKG0iTwai`hD>1X2IPU>a^5Q zt|HV#Ho6X#xjf5Z6jxbI!H}@pf2c-&ah^IU>58c|I>_u^3+BX8$!|Xb};JBA?xrQkvFXl9j^8vs)U7Zd|u7kqjCcS6ZE_Ht@ zN#PMl!r@v-#`61oyybz~Mo&!lpbnTxtw(Qj6uKp-fRgPaUYx3?1_2AWe`Fpzwx3#7`#JkVL}qs08HWI{7~pg`H=` z$&j~ci8mv1eoTx6IVYc#e-3%dYMQO&Ru?z-8g+oOmuzx`xqOB=WyTXDh9KZ_7RqfI|c$sT+9`U9vQv z>%rvb{f^lu>x0^$@ujzht)fw-yr%femJX9C^0N5IkPqSVx_`CpTx})hH*4s2(fIlV zwvqE ziefseZx`D_ECjkVe{=nZh>Vg3VlXkdl_!SD7{KHVa4RcY)#KG}%(m8RV+#+O2;VBr zl6M{lIKccXDvAKTdw(6wv9uO&+p2T5R2-jvI(t_5@r|VS?LGd9Z*Y%wB+RZuZAK#q z2HwC9c+NXlB}HWD!KAE3T5+oHJ^t^=>+U>NqP*&m_;S)ae{nLiNMb`HAkIcHfJr02 z7^qjpwrg{C%i;Sqx0*Fnw@{%_f%lKg^K;KVF+S^DN;BXG!I$?3#n&T*~BM8M= z8>MKdt&!Z1e~5^F(6eaCJaUBrWtbhiNF(?;IURcR>57ba_T4WM>MaTg=Mn6ARzO|O zRDwxE(`fDebH!0qGq;1s*4D`4EdmiE$Q|S}WuFupo(01 z$`~_AfZaCCN)SvL2 zM39ApNJyPsqy=Z%rb02eg;BfsbCPlw+?wO)pbpFa6N^NKTWEYeYZaub;h|R;EKFrv zJ9~M5`1W&=nyoL4nnq_9TV=$Eht0@TaEpQp{KP7CVtF~oL0q*I0ocEeAuvl4Xt0Hv zQzW~ce@T4Eu0i=a5W7By+Jy1FvNHjo+q7*5l2x1>4l%TC+6G2Q+k#KwTy+!y+sEVU zNIbu@czzpk8Zsz~RT#+x^RqoiU~aZ_-9?#d|`EYr$cR` z+kpw5LnIHifsquCz2A3E<0HLt+LP#ssHgl(FKq4J#{p!E=kp09NC9D$#xc)o6|5uF zu2%C#xQI5MJeZc;~u ze{{@!j(Yo61b-PkOA=e6+v&K4gK-m$_yl3F{W;DCIRd$@Ye=}4QJQ@}Mbu!jDi|b| zth+EU-n?WU^_ZGv{Fdo(mNzW}=VXf$6>f3C#t%GD1?2Gq!K=rq+Syw{aH37XZ)9TO zhel(717Hts{VR7#_?@lj_L18|ZKuf^f5On8HYO#*79^Z7=jJ^yE0ldQ{yAca?511) z`}`@ayzxi`%&`))a5|ji{orsh)DD#`%o+>Z-aB|dS%E@=vMfvj5uE2ILEOee>vX#(0mykKwypSth=Qceo@4h!O@B zSdiTa`PRBgm&3X8WAKKqE0IvDX{&21xb&X|~Vd$rV)iKU9&{MgXO`JI6T4 z-PatDJvz__ozY%}0r0kb#_+bWAV=r-9Bs}HaKoI8eMuDtn7SX?_TPA8QkHgr?hsnG z)nd*A48C!a26+3l0m4yT^e}jOB)37~oo&wiW=n0xR=~>r@25<4&$TiXf6&$eB%T)3 zfa#q0Q)&Cz)0K64cNd2 zFg-qD=xW#=ACe~WydSHdf4jC%vy;GVImYZ~AF0P2PzRn-UV>uq`!$c7;Vou6f}3ST zw>V}ha#R-QoRObF=s}89@cb^yd^M^dcV@(vjg?Z3v=82Yx_<(D@BzWmUWsy^95dX< z{{RS%wF)vZP%X%Kv5t9fP1(;(4_+!sr|7Z9%O8eyu`59*GFveLf3w2{-<%8(dG-7N zIBF}i$8U&MCSmYT1ZWo3V77nTWz`8GH_fm^zxSy%r)y4m16rkw&lYn!4^O7 zlZ@l1J!-f1)}4rpXpt9=IFmcn0#yQ&fV}P?vCeru)Q_xbe{JRgp+u_ZAbG!cr$e{X z{A*RoZGTgSqr`K*TigEK{awzJRMz!aH4$kKi>3BtW5PJSlVula+ zNTOl4ZW1)wm>hF~*p7PV-Dy|EI?cRuBwFR7qm?YF3_u;AV1c)cZ5YR(u11QrI9pi$ zEa`;d7}`<0?sZf6vtE|wUpHBbLmVe-2qMFOv(p{VuYX#S*T!BTb%=j%Buozf0GbGf z(hfN|fA`PfT#Xe8r6$_buqnd#<! z{{RUEkXZK1l!`D*DKY_oIRTiQcRjjSB}HdZIZE+%MipZz%J6)vw*LT`*V=2Ew6oah zpYV{|!D?c{%43WOKvF;_93DF7IW@62_JP}UfBrSn8d#LZsstp3B?-Xk_mxl4c=WG0 zqM^cXX?_TaQ>g7}{s`+VwJVK6Ni1d7qqp3y?JUtkBX5&#-1Qky7a8a}R@d9LJBErc z_)KgDBvMO9Zh;7qWK*2-19EZbK-??NXsr^lyLV@#3$0BeU7k170wkVZ&9MLh?~dRP ze?V|}9CKDyZE|Zkbqk*s*~M#eV#JbK!=IQhP;9ChyVZy=s(Fc z#CO&@js4xVnVZGd5j0X5QZsKBU|pk}w%+&|85sbAdq6(CHr!DhzM3T(PRPuS3kq( z2jnS@<1KxWlxUv#k;p0e?)x$@0JH+A$;IQp4e*o+nt=ey%mv`gLCeK!X^P{J)W+%t*2KvNc;4F zcc@$X*a4V#;23E2M1%|KFQ~sd4^h1N?MpTz049J^B0ty%aIa7@G;M-SThk zObM>mcxS9Whmeubhv51Aqm4NS_#wh0B$*Zf$NBqkO@D#MX4n~{dnt9go?N48@#Ku5 zWxZ^L*CmpDJa#EfAhuEZHE_^qkEJx(=HS|nhG*Paa!w4B=;FXKOU z&7K)9+|bBenFdAWtxEK zAwtQNi-gToo&2nR^6BhAM4u>ev(nwTmD5m^eW)J{ zz<;3>3LKIp45n@M-ec3|?l4Zo{$|bWZ51#rERXNlAOwD9AkhQGjzw%Jz%+ERV}bGn zSd7H@{6r7i50nllQi04{{F8iGF$5fk&eXmzyfoa|qHVkbOMl4PGSrAm1;3vYy=e$&m^h9N)U4vOr}i8gs~*0O#@SzP)oZWs|%}D#_{3= z0svZb{A*6Bk@vm&J6{_0h4{f+{1up00hTa>Bd&=YqT0KjPDu0ifHPJW3*4bp#zunX$G)%Q}!N5bNu@bm&_bUOQopdiH za7d~E5}FGiCL9C;V^d=WwRDN$2@jT*jMS)ypIu_?lex@MeY%qDoiy|qr*b$48S`Xp zatY6+w5?y#v(=vF@0U-
~Ad|OiebR&nCfD=zhGjc}pM}Lf+ZgAF-v1})sNey4t zdOXQe!0V@-g20;MNsD+l^)JpdZB%TVx*%u=oVUZKlc;TdDO=fUr~r7T@V1dftI2cV zeo6hq&=ZGAwvC7__C?Nf_QZH;hU8Xo7A%{xpxWD-G?4!0u{{`UsawTzv_mLanXCWo z-*xzB}n6Zef!mpUqWi2`%Ar|J}_zcAC zDtu!!heBI8U#ql+`8!RVA6NMTonNPUz!xh1bb_$b(|=;7B_W<4Y}D%oK$_eE5xZGQ zy}(@7^T-E_eq<|%4tp(26<{rf?UA{$lOp?KLW9F6iZwHoFmbkM=r!2tx6}WVX&7LY z1z$6==_Bea^h$h5yKVjYq(M6P_M3Ngn8L>QDla$KV!zM12Eb#!31{=7ikP~D5mTMh zjfS#3{(t91pS~aMzio`;Uf|4D_|$r)KQ|a?6gr2f@3Lz2g}#|H5P!}JP8f&1dOVi< zUzsbSH?t;Elw6f~KY_+((OLC$#cAxEFZ-(0JxTi%3Y6v=-j12!QkF^B|BvN_>sL&? zZ~s@nYpAOol6>s4H*{QOpQ7`S+U$S^pykKVYkw_SvKQ1~xieh?e;NMNt3DDu$@jfg zw>sOkYkj(jzj@z)ft!;9zzzGIXQ`{NcdFe97CwG<> z){)ldV(Ign%3V8Ym@{rwTSgcqcSU~1Mc$MLJRStt9o8U`3Yf0nT82trw~2@|`7;fJ z-Y2SIUc*{oqxU5H)-spGGlM(h4W!W*`d4)*x66U`;2Ym z;UH83J9}wNbXNyP$QO-2&%ec|6o9A)BHu5R-}6;I1o=P2ox7l9nZD~Inig9n7|u9} z)c*j{5Uv)<3gabNKNj*PGhfMjv{SlMvkKNs^lT=EBrD_O#c88cMTlYun@6RO^M6J< zo?Zj^85o8`jHdxcyM#@XU)f8efoxcbWG-SA4XHr0+wXwK%~?}}>}@==7~m}-cpPv> zh@73hi6Lef8)Fz*h=s*rTdTf$$y|L(dUp- z<2PHWGO`Rh^rOY=paE?$24E)Ecv!HPriFU{)ems&X0GU9?tJ&(D>Ts$r5ylL%^XM= zZEO1K*D`32UE2xaxN{>gyr$8+P;N2S_qc(dIt^_u3^h%$Qw1Cw<)D7T|DMc7;P=D4 zw6fZ%OO147nI`YJ*F0};I)84{h97ONR}eAJV>{E?cEcHh)22ZZ`t&Q=evUVCX&GR5|m3X!^jj66d`pHc}?@kDlUqi~maZ zah@yyAEHk=@~1BTX-hz2<>%rkrV`_rDS$LAY2H@pwJ5ux?rs)G;>WJ-Wt4kafQujp znoQrP&E6#ZnaTwGNJ(5lTe2`oY=(#a4;DO^5%Hv6Uc&_2UVmDk@rEP+ZC-HsJk(s< zjb3=B*`~c|=EkHnGQb}^cAuw;7Qi=3HTv9akwY_f@Q`$uP5Do;j(tVZN?{PTqvG5D zMAe1?O{jv#g{wA`g8yI;&GPs{6_zD zAV%0IwvmfHmT9NC%Qeum-fz+#>Yh!JZKQbHYYZA;xx5!;eIo*)s3p|LyW_1&L3|<*F zzUzu5x=M*b#z@Zp5@UWe6o;ok3&=x`$mkhPz<*Th!BF?&I$Z8M>eFpKI@{`v$g{fX zF4ofea}4fEyOGE)+Lg!4(oD>MsR#Kyqh|J(}=Ok%KwNmU#R+f6m(z`Rn~ z9sH6tI}9oAR?^Edt-Zd<+vhg;>@(#?e-(oW%734T`)n4Fj*OIC$3N=9 zi&Ss~FAlgPGbf>;)y*fiJQ_O&ue(nF^fhcf zpgF=~Ij=t5ZE+8a+rOoxUxOGHn6)SfK-4C$X4Ofk{F64|a?JpWy{nMs=;%ED9?D!2 zDf)zBs}b79AiWO9v=TM`b2f0Jgphc02vW+dY*&kaB~sIP0Yd7%O&e$6o`2!fqGN%0 z!gKw8d)D6=TU z)u}=iOQmzEO%FRraI!yF;D6X@8>Kr)NnU+b*zFP(L-SN=B%iG~3rL=KlDqcx6}|V( zM`YOGz)_M(lF)Q`L)-V&#j5OZ6G?wEDl7Ef&omM9kL}loE zaMH4&7>0&I^~vcHMN{QXr0NGsv#7B?4wz5+ENbCF9dIC;i2e{j5tMuB%dTb#Ek56q z%*hyQI1f4X!>X&+suokzo{(+^$0etwqiql*hm55tiLN*A3e5JsPk;JKob>IPmDmsU zjGhw%=n@gLGEmBQ%zwG|=VmdD!~W!$wd=|8kobUwb6uS31F8G%58)6>sa>r2?zpYA zIT$Y{K*&li0M#wen;|DyID19xg( z!bL+IKn=Ygpa;YyPyrA;#Wl9FAoi069BpT903(A{3wtfew{fKtOr91Jmg}C z;G|(#7&F1C)6(Aa3eP!l#KZ2n2yqkO`B(Tbm8(3|3HJ%ZwCR}6j~e5dw?<_EuHHzx!OQ|F2Bz32?NGSs;1p) z*xJr&f7{2v!3e9p3_Vj?@?tx+yqsE%a)FkiV_vQSZ;?XQGZ&>RPbOTYCy*|8)Nj_x z1-sAU>lfr4%ksL~&sm8fa z3*n0ML7GDSw^cvuRq3f;!UHf(&eW5CUeNR5#bD@%Xs!r#Ha%cOVV3(DDXY6NiK8^Y zO)m|VXq8u7zc#tt3Wj2Y!0yYXXw!K}R0U`vi$HGsZC6y)z(E=Jg}695>`iueP&hm1 t_scl#3gMHt{jdQvEef-5xOB1#+kDLcOCypKCW4HA?P+EuBU(&JnNS#?H^u+} delta 8079 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�Ibb~WfBjIbKo zifkkfG){P~t}rzz^1sD8z6PJ91Z|A6FyWwmb6!S~KUmLhL^$WSwO0TkUmue%=OE#! z*uzT@YN?d7O3SIVX_wVRSvUpt9$>!s4MA5mnGK~Ju+1K8x-J*>n^m4GB6&PVw3L*d z2Y6TgoQ}8&eY$uT(bu?kt|HQctP6|fhNb^|EaHlUbV(?{>ubmTGuPs_}7-r44x1^s2 zly#4OZ>s5Dp%0tXQc#lkO|AvoD@YP*;PQ#n=Xb2}X1?gk`>W^@r6=@n%`xl7aEmmP zDr#?kF&BjKicc8Y2DY`2#p)KgS+p|h(Ti$^oD9P*F0AU1d5?@J(e?np!bp;o`(}+x zoj>BEGnhRE?6;<-*e@IRexX=awWSF_Nr9i9lWFqUAEjtx0Iw`7>sb3Yv z^zi55JY-9Gk8GMD_{7DBL5;~Tu^(KeotVZmS$X@pDM^m}$4J{57OS095Pg-+7M6+p zL*si(_FRVhW1;G34pM4IQUAoXD?Iw&GYt=(x;d0upkiQnBlD67*V&6DG_BPDBpL5c zb;U@WKIsgqw`AXMz15CmuB2oSIL2B+PfTSR@RMSjd=wOJMUrxlex99=evLS4d=OcC zIHdijmEvA<-(ou_69;J{G`T>1`e$OVPr!MxnEd!PbZAEY$VH*gRsF@P~ zj4ynfzwm(k#T$MEC(8o(DVM~~-zAOgQu9;HAEt6p&COS%c1={^OvEa~`_-Bzh;^ur z`vgw_LM;q;C+UdgIlfPjaSmnK*L!O_)XK0&{nYgDT{l@pM6S@*R%xjeo^}fok3E&Z3VxCC8n}KXkkOLl zW8jw&{qXIyQf&D;cPJ^m1U~C9?oQ4RS1qB7Ao$mk6rXTP4cpIr-G{*^zJfA+!R`ax zwjO`0gYVz5LWq6<_(IPGvn*4;GO&P~-yI^OgCwYF+67WY&oLUh=wn~zhQ?7=iG!JQ z&5vrNc`F}iK9e9M_eOmDq44z^+Dx4LPmfpbIn&^l`80v9eiCEu#=`0+SJQiBwfSnM z1T_;Xm>=V(T0UQ*q~G)K2c^mchAg8O-g*MQRLFS8Uk2r=04ZUAM;8eN7{NI6ldZO~7fXz6tUuS``M{Kp9EhuChu zZogg#t_LTs08k_w@G>6&+3aW43CONHISj=)3dKGK!c*MwDvAvYuT?mRxYfp&|d5Q$OVI|pR`Hz zeg)0SjJRo{izN72x{_aJ;f{q?2@4Ol*LC^v`82o3wI+vj^$K$f1m zd&LvHo#44GL^APLzdddKoN0LK)BK0cj8OO3LRI@&ywZ~EoBn0 zLD+82AG-iwxCzMs1|#d_)`N;KiT8BmJWyFq&GWKFP&(YVCO=HFj1*Z%Crl+Av!jOw zatc1`^%5j31n@FQq%fJ!2P4r^Kl&WBJ9cOSlEE2^)B0MSB&gVgr(Xr(28tmwZ~^~VZQVKpusFtBdFdGg4&8FsJ`Mc9 z=@we66ZjS)(VAP0$C1aL`Mzu~WQB&5SLTlQ$z3*QOa?nKFrm9Kw)?YS67Ut9S2;82Jm_1&hfa%sb5P>$1)n(o3z?_y_OoY7aWE z%?zwTiZ$|Z0*%o#-o0|sM}@khccChE=nUdcQgG&Df=!-+e`s2BAc&vab7eXd0U`ZO z_@Z`;lS}A1Ke>vlI3&w|xo+c-9U2s4dT@u{S&yxrPSmthJ~JW}s3vX*Y6g@W9&mo= ze^U+&HC)oNP!*l^y0%@1`nfZHFL^H036XqQ%M76UY`QPniInW|3b~eCv~b8o#8Z0323R8Yd8`SWBO?(_^eW$DEZz$j?RKPN{VqN1qNewG z+gR0gEhJb*D@?ApfK`7#UKLGL!!ydilFonq`As;*xl?Eq@^y|E#l3k4lVw!w#8%kndld&N*^8-Q10R?50Ri^NReMkl6%x;2BjapJ6gEHL#1ci?_UtDc4= zG9apUfuM`v)z@%}QsKruBUYAz8BrqD07ag2>cqBvZxfZpp~}}0fmFlW89zrg52X`~ z=ZKN#TV(fe)6{KXmaIBzf_tRIf@>ulUV7||(f4g+fwlzdr<5R$>YI85_JmQI>h?FK zXVI8Gu_p?9o*ltj#KX;CZ7jVav6-U|zqd!41YA^A*n3OmiL6p-i%-gG%-LmC*t?OG g9gomMY$x< Date: Tue, 23 Apr 2024 10:43:19 +0200 Subject: [PATCH 048/893] netwatch-notify: log to debug... ... instead of discarding the message completely. --- netwatch-notify.rsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index 9b0beb9..17682f0 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -116,8 +116,9 @@ } } on-error={ :set ($Metric->"resolve-failcnt") ($Metric->"resolve-failcnt" + 1); - :if ($Metric->"resolve-failcnt" = 3 && $HostInfo->"no-resolve-fail" != true) do={ - $LogPrint warning $ScriptName ("Resolving name '" . $HostInfo->"resolve" . [ $IfThenElse \ + :if ($Metric->"resolve-failcnt" = 3) do={ + $LogPrint [ $IfThenElse ($HostInfo->"no-resolve-fail" != true) warning debug ] \ + $ScriptName ("Resolving name '" . $HostInfo->"resolve" . [ $IfThenElse \ ($HostInfo->"resolve" != $HostInfo->"name") ("' for " . $Type . " '" . \ $HostInfo->"name") "" ] . "' failed."); } From db1faf1091ed300931793e2e198acf83e8eca4d2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 23 Apr 2024 13:41:36 +0200 Subject: [PATCH 049/893] backup-upload: remove temporary directory --- backup-upload.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/backup-upload.rsc b/backup-upload.rsc index 63e5b7f..1b9058d 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -158,4 +158,5 @@ :set PackagesUpdateBackupFailure true; :error false; } + /file/remove $DirName; } on-error={ } From b3b7643661b13856437ff75cca0bb48f1e1aa0bc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 29 Apr 2024 18:03:08 +0200 Subject: [PATCH 050/893] backup-upload: no early exit... --- backup-upload.rsc | 1 - 1 file changed, 1 deletion(-) diff --git a/backup-upload.rsc b/backup-upload.rsc index 1b9058d..1dc98d5 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -156,7 +156,6 @@ :if ($Failed = 1) do={ :set PackagesUpdateBackupFailure true; - :error false; } /file/remove $DirName; } on-error={ } From 505074e6d333f9696eb1b2e6afc90a59a5e1e1d6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 23 Apr 2024 14:09:21 +0200 Subject: [PATCH 051/893] backup-cloud: no early exit... ... as we want to make sure the directory (and its content) is removed. --- backup-cloud.rsc | 1 - 1 file changed, 1 deletion(-) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index 8e29c67..1085f05 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -79,7 +79,6 @@ message=("Failed uploading backup for " . $Identity . " to cloud!\n\n" . [ $DeviceInfo ]) }); $LogPrint error $ScriptName ("Failed uploading backup for " . $Identity . " to cloud!"); :set PackagesUpdateBackupFailure true; - :error false; } /file/remove "tmpfs/backup-cloud"; } on-error={ } From 5f1656b7ce439e6567803299eaddca215e8cb7cf Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 23 Apr 2024 13:53:04 +0200 Subject: [PATCH 052/893] backup-cloud: clean up and simplify code --- backup-cloud.rsc | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index 1085f05..bdc6c34 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -49,13 +49,11 @@ :execute { :global BackupPassword; - # we are not interested in output, but print is - # required to fetch information from cloud - /system/backup/cloud/print as-value; - :delay 20ms; - :if ([ :len [ /system/backup/cloud/find ] ] > 0) do={ + + :local Backup ([ /system/backup/cloud/find ]->0); + :if ([ :typeof $Backup ] = "id") do={ /system/backup/cloud/upload-file action=create-and-upload \ - password=$BackupPassword replace=[ get ([ find ]->0) name ]; + password=$BackupPassword replace=$Backup; } else={ /system/backup/cloud/upload-file action=create-and-upload \ password=$BackupPassword; From 57ebcfb41cbd078ba62c7d4e7e921ffdae834521 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 29 Apr 2024 17:37:28 +0200 Subject: [PATCH 053/893] backup-cloud: retry on error... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Let's see if brute force helps. 🤪 --- backup-cloud.rsc | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index bdc6c34..88dd345 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -47,19 +47,23 @@ :error false; } - :execute { - :global BackupPassword; + :local I 5; + :do { + :execute { + :global BackupPassword; - :local Backup ([ /system/backup/cloud/find ]->0); - :if ([ :typeof $Backup ] = "id") do={ - /system/backup/cloud/upload-file action=create-and-upload \ - password=$BackupPassword replace=$Backup; - } else={ - /system/backup/cloud/upload-file action=create-and-upload \ - password=$BackupPassword; - } - /file/add name="tmpfs/backup-cloud/done"; - } as-string; + :local Backup ([ /system/backup/cloud/find ]->0); + :if ([ :typeof $Backup ] = "id") do={ + /system/backup/cloud/upload-file action=create-and-upload \ + password=$BackupPassword replace=$Backup; + } else={ + /system/backup/cloud/upload-file action=create-and-upload \ + password=$BackupPassword; + } + /file/add name="tmpfs/backup-cloud/done"; + } as-string; + :set I ($I - 1); + } while=([ $WaitForFile "tmpfs/backup-cloud/done" 200ms ] = false && $I > 0); :if ([ $WaitForFile "tmpfs/backup-cloud/done" ] = true) do={ :local Cloud [ /system/backup/cloud/get ([ find ]->0) ]; From 4006d07222511b94fd84aa4578a0b857a59639d5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 23 Apr 2024 14:20:30 +0200 Subject: [PATCH 054/893] global-functions: $FetchHuge: remove temporary directory --- global-functions.rsc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 66765bf..b0bde7e 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -406,13 +406,13 @@ :set CheckCert [ $IfThenElse ($CheckCert = false) "no" "yes-without-crl" ]; - :local FileName ("tmpfs/" . [ $CleanName $ScriptName ]); - :if ([ $MkDir $FileName ] = false) do={ + :local DirName ("tmpfs/" . [ $CleanName $ScriptName ]); + :if ([ $MkDir $DirName ] = false) do={ $LogPrint error $0 ("Failed creating directory!"); :return false; } - :set FileName ($FileName . "/" . [ $CleanName $0 ] . "-" . [ $GetRandom20CharAlNum ]); + :local FileName ($DirName . "/" . [ $CleanName $0 ] . "-" . [ $GetRandom20CharAlNum ]); :do { /tool/fetch check-certificate=$CheckCert $Url dst-path=$FileName \ http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) as-value; @@ -421,6 +421,7 @@ /file/remove $FileName; } $LogPrint debug $0 ("Failed downloading from: " . $Url); + /file/remove $DirName; :return false; } $WaitForFile $FileName; @@ -432,7 +433,7 @@ :set Return ($Return . ([ /file/read offset=$VarSize chunk-size=32768 file=$FileName as-value ]->"data")); :set VarSize [ :len $Return ]; } - /file/remove $FileName; + /file/remove $DirName; :return $Return; } From f1ad80873498e314bbc04f3f2be5feff33d7e9ff Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 23 Apr 2024 14:26:05 +0200 Subject: [PATCH 055/893] mod/ssh-keys-import: create directory later --- mod/ssh-keys-import.rsc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index f37c28b..e920762 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -38,11 +38,6 @@ :return false; } - :if ([ $MkDir "tmpfs/ssh-keys-import" ] = false) do={ - $LogPrint warning $0 ("Creating directory 'tmpfs/ssh-keys-import' failed!"); - :return false; - } - :local FingerPrintMD5 [ :convert from=base64 transform=md5 to=hex ($KeyVal->1) ]; :if ([ :len [ /user/ssh-keys/find where user=$User key-owner~("\\bmd5=" . $FingerPrintMD5 . "\\b") ] ] > 0) do={ @@ -51,6 +46,11 @@ :return false; } + :if ([ $MkDir "tmpfs/ssh-keys-import" ] = false) do={ + $LogPrint warning $0 ("Creating directory 'tmpfs/ssh-keys-import' failed!"); + :return false; + } + :local FileName ("tmpfs/ssh-keys-import/key-" . [ $GetRandom20CharAlNum 6 ] . ".pub"); /file/add name=$FileName contents=($Key . ", md5=" . $FingerPrintMD5); $WaitForFile $FileName; From b0f58696f334c9c378229f68f7e5e6d69a4b6af7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 23 Apr 2024 14:30:42 +0200 Subject: [PATCH 056/893] mod/ssh-keys-import: remove temporary directory --- mod/ssh-keys-import.rsc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index e920762..6272a93 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -59,8 +59,10 @@ /user/ssh-keys/import public-key-file=$FileName user=$User; $LogPrint info $0 ("Imported ssh public key (" . $KeyVal->2 . ", " . $KeyVal->0 . ", " . \ "MD5:" . $FingerPrintMD5 . ") for user '" . $User . "'."); + /file/remove "tmpfs/ssh-keys-import"; } on-error={ $LogPrint warning $0 ("Failed importing key."); + /file/remove "tmpfs/ssh-keys-import"; :return false; } } From 755db5d66db8e24872fb7bf959e09b047f7cd5f9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 23 Apr 2024 14:50:57 +0200 Subject: [PATCH 057/893] global-functions: $CleanName: do not start with a dash --- global-functions.rsc | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index b0bde7e..5135fc1 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -230,11 +230,19 @@ :for I from=0 to=([ :len $Input ] - 1) do={ :local Char [ :pick $Input $I ]; :if ([ :typeof [ find "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-" $Char ] ] = "nil") do={ - :set Char "-"; - } - :if ($Char != "-" || [ :pick $Return ([ :len $Return ] - 1) ] != "-") do={ - :set Return ($Return . $Char); + :do { + :if ([ :len $Return ] = 0) do={ + :error true; + } + :if ([ :pick $Return ([ :len $Return ] - 1) ] = "-") do={ + :error true; + } + :set Char "-"; + } on-error={ + :set Char ""; + } } + :set Return ($Return . $Char); } :return $Return; } From e7cdb2d7f454fa093b6b9be3e38a86a90d344d55 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 25 Apr 2024 23:59:11 +0200 Subject: [PATCH 058/893] mod/notification-matrix: format date & time italic --- mod/notification-matrix.rsc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 9442f54..196633a 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -139,11 +139,12 @@ :if ([ :typeof $MatrixQueue ] = "nothing") do={ :set MatrixQueue ({}); } - :local Text ([ $SymbolForNotification "alarm-clock" ] . \ - "This message was queued since " . [ /system/clock/get date ] . \ - " " . [ /system/clock/get time ] . " and may be obsolete."); - :set Plain ($Plain . "\n" . $Text); - :set Formatted ($Formatted . "
" . $Text); + :local Symbol [ $SymbolForNotification "alarm-clock" ]; + :local DateTime ([ /system/clock/get date ] . " " . [ /system/clock/get time ]); + :set Plain ($Plain . "\n" . $Symbol . "This message was queued since *" . \ + $DateTime . "* and may be obsolete."); + :set Formatted ($Formatted . "
" . $Symbol . "This message was queued since " . \ + $DateTime . " and may be obsolete."); :set ($MatrixQueue->[ :len $MatrixQueue ]) { headers=$Headers; \ accesstoken=$AccessToken; homeserver=$HomeServer; room=$Room; \ plain=$Plain; formatted=$Formatted }; From d6e315580bf354e7a5620955c707e604d3cdaf9e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 26 Apr 2024 00:18:07 +0200 Subject: [PATCH 059/893] mod/notification-telegram: capitalize Telegram in message --- mod/notification-telegram.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 745367a..440e0dd 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -149,7 +149,7 @@ "&parse_mode=MarkdownV2&text=" . [ $UrlEncode $Text ]) as-value ]->"data"); :set ($TelegramMessageIDs->[ :tostr ([ :deserialize from=json value=$Data ]->"result"->"message_id") ]) 1; } on-error={ - $LogPrint info $0 ("Failed sending telegram notification! Queuing..."); + $LogPrint info $0 ("Failed sending Telegram notification! Queuing..."); :if ([ :typeof $TelegramQueue ] = "nothing") do={ :set TelegramQueue ({}); From 4b6cd7ba2911b44f8d0890c19c5342ce28a6b3a8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 26 Apr 2024 08:15:56 +0200 Subject: [PATCH 060/893] mod/notification-telegram: use proper variable naming... ... in local escaping function. --- mod/notification-telegram.rsc | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 440e0dd..efde85a 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -81,24 +81,26 @@ :global UrlEncode; :local EscapeMD do={ + :local Text [ :tostr $1 ]; + :local Mode [ :tostr $2 ]; + :global CharacterReplace; :global IfThenElse; - :local Return $1; :local Chars { - "body"={ "\\"; "`" }; + "body"={ "\\"; "`" }; "plain"={ "_"; "*"; "["; "]"; "("; ")"; "~"; "`"; ">"; "#"; "+"; "-"; "="; "|"; "{"; "}"; "."; "!" }; } - :foreach Char in=($Chars->$2) do={ - :set Return [ $CharacterReplace $Return $Char ("\\" . $Char) ]; + :foreach Char in=($Chars->$Mode) do={ + :set Text [ $CharacterReplace $Text $Char ("\\" . $Char) ]; } - :if ($2 = "body") do={ - :return ("```\n" . $Return . "\n```"); + :if ($Mode = "body") do={ + :return ("```\n" . $Text . "\n```"); } - :return $Return; + :return $Text; } :local ChatId [ $EitherOr ($Notification->"chatid") \ From f8856ae7423d2b969b02094cc002e75388ee6374 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 26 Apr 2024 08:24:06 +0200 Subject: [PATCH 061/893] mod/notification-telegram: support excluding characters from escaping... ... to support formatting in plain text. Handle with care, this can break the request if done wrong! --- mod/notification-telegram.rsc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index efde85a..858ab1b 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -83,6 +83,7 @@ :local EscapeMD do={ :local Text [ :tostr $1 ]; :local Mode [ :tostr $2 ]; + :local Excl [ :tostr $3 ]; :global CharacterReplace; :global IfThenElse; @@ -93,7 +94,9 @@ "#"; "+"; "-"; "="; "|"; "{"; "}"; "."; "!" }; } :foreach Char in=($Chars->$Mode) do={ - :set Text [ $CharacterReplace $Text $Char ("\\" . $Char) ]; + :if ([ :typeof [ :find $Excl $Char ] ] = "nil") do={ + :set Text [ $CharacterReplace $Text $Char ("\\" . $Char) ]; + } } :if ($Mode = "body") do={ From 0fd1e506badcce5580fc6505c423e4fe65db4d1e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 25 Apr 2024 23:59:38 +0200 Subject: [PATCH 062/893] mod/notification-telegram: format date & time italic --- mod/notification-telegram.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 858ab1b..4c2fd94 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -160,8 +160,8 @@ :set TelegramQueue ({}); } :set Text ($Text . "\n" . [ $SymbolForNotification "alarm-clock" ] . \ - [ $EscapeMD ("This message was queued since " . [ /system/clock/get date ] . \ - " " . [ /system/clock/get time ] . " and may be obsolete.") "plain" ]); + [ $EscapeMD ("This message was queued since _" . [ /system/clock/get date ] . \ + " " . [ /system/clock/get time ] . "_ and may be obsolete.") "plain" "_" ]); :set ($TelegramQueue->[ :len $TelegramQueue ]) { chatid=$ChatId; tokenid=$TokenId; text=$Text; silent=($Notification->"silent"); replyto=($Notification->"replyto") }; :if ([ :len [ /system/scheduler/find where name="_FlushTelegramQueue" ] ] = 0) do={ From 40f13b6ca45a15def2e63bab22d87ddf398c3cc7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 29 Apr 2024 13:34:30 +0200 Subject: [PATCH 063/893] mod/notification-telegram: format percentage italic --- mod/notification-telegram.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 4c2fd94..9a628ce 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -138,8 +138,8 @@ } :if ($Truncated = true) do={ :set Text ($Text . "\n" . [ $SymbolForNotification "scissors" ] . \ - [ $EscapeMD ("The message was too long and has been truncated, cut off " . \ - (($LenSum - [ :len $Text ]) * 100 / $LenSum) . "%!") "plain" ]); + [ $EscapeMD ("The message was too long and has been truncated, cut off _" . \ + (($LenSum - [ :len $Text ]) * 100 / $LenSum) . "%_!") "plain" "_" ]); } :do { From 6ba1faca4c156097448c766098688cc5c4ef6045 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 26 Apr 2024 20:50:08 +0200 Subject: [PATCH 064/893] telegram-chat: shorten the message --- telegram-chat.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index c1a1cbc..f8dcd42 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -81,7 +81,7 @@ } :if ($Data = false) do={ - $LogPrint warning $ScriptName ("Failed getting updates from Telegram."); + $LogPrint warning $ScriptName ("Failed getting updates."); :error false; } From 52ec6b7ea19256e47d9ffd1519ef9d7799ca48ba Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 29 Apr 2024 17:57:22 +0200 Subject: [PATCH 065/893] global-functions: $WaitForFile: use fewer steps --- global-functions.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 5135fc1..1c36e2a 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1520,10 +1520,10 @@ :set FileName [ $CleanFilePath $FileName ]; :local I 1; - :local Delay ([ :totime [ $EitherOr $WaitTime 2s ] ] / 20); + :local Delay ([ :totime [ $EitherOr $WaitTime 2s ] ] / 10); :while ([ :len [ /file/find where name=$FileName ] ] = 0) do={ - :if ($I >= 20) do={ + :if ($I >= 10) do={ :return false; } :delay $Delay; From 517ed7bf8cefe47e6c409915a4b27384f081715d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 29 Apr 2024 17:55:48 +0200 Subject: [PATCH 066/893] global-functions: $WaitForFile: respect minimum delay --- global-functions.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 1c36e2a..9c009ae 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1517,10 +1517,11 @@ :global CleanFilePath; :global EitherOr; + :global MAX; :set FileName [ $CleanFilePath $FileName ]; :local I 1; - :local Delay ([ :totime [ $EitherOr $WaitTime 2s ] ] / 10); + :local Delay ([ :totime [ $MAX [ $EitherOr $WaitTime 2s ] 100ms ] ] / 10); :while ([ :len [ /file/find where name=$FileName ] ] = 0) do={ :if ($I >= 10) do={ From eae8dbbb378dbfe43c83e77529895747da0e260e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 29 Apr 2024 17:59:41 +0200 Subject: [PATCH 067/893] global-functions: $WaitForFile: drop extra conversion --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 9c009ae..e8163ed 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1521,7 +1521,7 @@ :set FileName [ $CleanFilePath $FileName ]; :local I 1; - :local Delay ([ :totime [ $MAX [ $EitherOr $WaitTime 2s ] 100ms ] ] / 10); + :local Delay ([ $MAX [ $EitherOr $WaitTime 2s ] 100ms ] / 10); :while ([ :len [ /file/find where name=$FileName ] ] = 0) do={ :if ($I >= 10) do={ From fb7170f3121dd9e25cc320e5f0c98d1829e49d33 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 8 May 2024 12:30:13 +0200 Subject: [PATCH 068/893] global-functions: $IsTimeSync: log just once --- global-functions.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index e8163ed..5cc665c 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -673,7 +673,7 @@ :global IsTimeSyncCached; :global IsTimeSyncResetNtp; - :global LogPrint; + :global LogPrintOnce; :if ($IsTimeSyncCached = true) do={ :return true; @@ -702,7 +702,7 @@ :if ([ /system/license/get ]->"level" = "free" || \ [ /system/resource/get ]->"board-name" = "x86") do={ - $LogPrint debug $0 ("No ntp client configured, relying on RTC for CHR free license and x86."); + $LogPrintOnce debug $0 ("No ntp client configured, relying on RTC for CHR free license and x86."); :return true; } @@ -714,7 +714,7 @@ :return false; } - $LogPrint debug $0 ("No time source configured! Returning gracefully..."); + $LogPrintOnce debug $0 ("No time source configured! Returning gracefully..."); :return true; } From 2745597b93901d34a4ade63d789c984adccd8b54 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 8 May 2024 14:25:02 +0200 Subject: [PATCH 069/893] global-functions: $IsTimeSync: add (one time) warning on failed ntp sync --- global-functions.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/global-functions.rsc b/global-functions.rsc index 5cc665c..b1833b1 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -693,6 +693,7 @@ :return false; } + $LogPrintOnce warning $0 ("The ntp client is configured, but did not sync."); :set IsTimeSyncResetNtp $Uptime; /system/ntp/client/set enabled=no; :delay 20ms; From c87a7519fe03249b8dbc5da3233e593c0290095d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 10 May 2024 13:17:02 +0200 Subject: [PATCH 070/893] fw-addr-lists: add 'strongips' list from blocklist.de --- certs/Certum-Domain-Validation-CA-SHA2.pem | 176 +++++++++++++++++++++ doc/fw-addr-lists.md | 4 +- global-config.rsc | 2 + global-functions.rsc | 2 +- news-and-changes.rsc | 1 + 5 files changed, 182 insertions(+), 3 deletions(-) create mode 100644 certs/Certum-Domain-Validation-CA-SHA2.pem diff --git a/certs/Certum-Domain-Validation-CA-SHA2.pem b/certs/Certum-Domain-Validation-CA-SHA2.pem new file mode 100644 index 0000000..0cc17ac --- /dev/null +++ b/certs/Certum-Domain-Validation-CA-SHA2.pem @@ -0,0 +1,176 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 279744 (0x444c0) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=PL, O=Unizeto Technologies S.A., OU=Certum Certification Authority, CN=Certum Trusted Network CA + Validity + Not Before: Oct 22 12:07:37 2008 GMT + Not After : Dec 31 12:07:37 2029 GMT + Subject: C=PL, O=Unizeto Technologies S.A., OU=Certum Certification Authority, CN=Certum Trusted Network CA + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:e3:fb:7d:a3:72:ba:c2:f0:c9:14:87:f5:6b:01: + 4e:e1:6e:40:07:ba:6d:27:5d:7f:f7:5b:2d:b3:5a: + c7:51:5f:ab:a4:32:a6:61:87:b6:6e:0f:86:d2:30: + 02:97:f8:d7:69:57:a1:18:39:5d:6a:64:79:c6:01: + 59:ac:3c:31:4a:38:7c:d2:04:d2:4b:28:e8:20:5f: + 3b:07:a2:cc:4d:73:db:f3:ae:4f:c7:56:d5:5a:a7: + 96:89:fa:f3:ab:68:d4:23:86:59:27:cf:09:27:bc: + ac:6e:72:83:1c:30:72:df:e0:a2:e9:d2:e1:74:75: + 19:bd:2a:9e:7b:15:54:04:1b:d7:43:39:ad:55:28: + c5:e2:1a:bb:f4:c0:e4:ae:38:49:33:cc:76:85:9f: + 39:45:d2:a4:9e:f2:12:8c:51:f8:7c:e4:2d:7f:f5: + ac:5f:eb:16:9f:b1:2d:d1:ba:cc:91:42:77:4c:25: + c9:90:38:6f:db:f0:cc:fb:8e:1e:97:59:3e:d5:60: + 4e:e6:05:28:ed:49:79:13:4b:ba:48:db:2f:f9:72: + d3:39:ca:fe:1f:d8:34:72:f5:b4:40:cf:31:01:c3: + ec:de:11:2d:17:5d:1f:b8:50:d1:5e:19:a7:69:de: + 07:33:28:ca:50:95:f9:a7:54:cb:54:86:50:45:a9: + f9:49 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Subject Key Identifier: + 08:76:CD:CB:07:FF:24:F6:C5:CD:ED:BB:90:BC:E2:84:37:46:75:F7 + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + Signature Algorithm: sha1WithRSAEncryption + Signature Value: + a6:a8:ad:22:ce:01:3d:a6:a3:ff:62:d0:48:9d:8b:5e:72:b0: + 78:44:e3:dc:1c:af:09:fd:23:48:fa:bd:2a:c4:b9:55:04:b5: + 10:a3:8d:27:de:0b:82:63:d0:ee:de:0c:37:79:41:5b:22:b2: + b0:9a:41:5c:a6:70:e0:d4:d0:77:cb:23:d3:00:e0:6c:56:2f: + e1:69:0d:0d:d9:aa:bf:21:81:50:d9:06:a5:a8:ff:95:37:d0: + aa:fe:e2:b3:f5:99:2d:45:84:8a:e5:42:09:d7:74:02:2f:f7: + 89:d8:99:e9:bc:27:d4:47:8d:ba:0d:46:1c:77:cf:14:a4:1c: + b9:a4:31:c4:9c:28:74:03:34:ff:33:19:26:a5:e9:0d:74:b7: + 3e:97:c6:76:e8:27:96:a3:66:dd:e1:ae:f2:41:5b:ca:98:56: + 83:73:70:e4:86:1a:d2:31:41:ba:2f:be:2d:13:5a:76:6f:4e: + e8:4e:81:0e:3f:5b:03:22:a0:12:be:66:58:11:4a:cb:03:c4: + b4:2a:2a:2d:96:17:e0:39:54:bc:48:d3:76:27:9d:9a:2d:06: + a6:c9:ec:39:d2:ab:db:9f:9a:0b:27:02:35:29:b1:40:95:e7: + f9:e8:9c:55:88:19:46:d6:b7:34:f5:7e:ce:39:9a:d9:38:f1: + 51:f7:4f:2c +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 26:dd:d2:2b:46:c9:c4:4d:5a:69:4d:39:80:7e:72:ad + Signature Algorithm: sha256WithRSAEncryption + Issuer: C=PL, O=Unizeto Technologies S.A., OU=Certum Certification Authority, CN=Certum Trusted Network CA + Validity + Not Before: Sep 11 12:00:00 2014 GMT + Not After : Jun 9 10:46:39 2027 GMT + Subject: C=PL, O=Unizeto Technologies S.A., OU=Certum Certification Authority, CN=Certum Domain Validation CA SHA2 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:a1:25:63:df:8d:e4:20:07:d9:54:d1:d1:04:f6: + 17:e2:3e:47:fb:c3:74:25:b8:c4:bf:12:12:bc:e0: + 70:d1:39:05:c2:17:b3:f7:82:70:a0:4e:07:fe:10: + 2a:ff:db:0d:46:5e:24:94:a3:8b:45:9f:18:9b:ce: + 42:c4:ae:db:83:33:bc:c2:bb:b4:30:b6:a7:37:87: + 78:7b:48:cb:25:2c:82:bb:0a:48:12:60:76:89:ec: + 8e:cc:8f:1e:52:48:e9:86:02:5a:c2:b0:8a:7c:85: + 3d:d9:ff:60:4f:33:6c:a6:a1:a0:85:e1:d7:53:f2: + ea:27:3d:65:a9:72:c1:08:83:cc:b0:25:9c:11:46: + 24:e0:3e:f4:a7:ef:ed:51:b1:65:93:42:b4:f6:e6: + 86:0a:10:79:32:36:58:b2:6b:a8:dc:d5:7a:1e:9d: + 14:ee:40:e7:b2:46:4c:bd:9a:29:c2:ec:f8:30:c1: + 62:02:2a:e2:1c:83:62:d0:85:36:1a:83:de:12:84: + 29:65:ef:d2:32:be:31:60:42:a8:cf:f8:dd:ea:d0: + 56:47:1d:bd:76:96:24:13:e7:be:d9:99:2b:fa:30: + 64:f1:8a:38:7a:a6:e1:2a:96:02:b0:9d:ba:d8:8f: + 6d:4e:7a:94:69:7d:b0:93:aa:74:e5:93:90:13:fa: + a2:99 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Subject Key Identifier: + E5:31:AD:BF:3A:11:96:F4:83:BC:50:3C:D4:B7:90:9B:90:EE:DE:25 + X509v3 Authority Key Identifier: + 08:76:CD:CB:07:FF:24:F6:C5:CD:ED:BB:90:BC:E2:84:37:46:75:F7 + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 CRL Distribution Points: + Full Name: + URI:http://crl.certum.pl/ctnca.crl + Authority Information Access: + OCSP - URI:http://subca.ocsp-certum.com + CA Issuers - URI:http://repository.certum.pl/ctnca.cer + X509v3 Certificate Policies: + Policy: X509v3 Any Policy + CPS: http://www.certum.pl/CPS + Signature Algorithm: sha256WithRSAEncryption + Signature Value: + ba:bf:f0:e1:dd:4d:2b:42:43:64:58:df:64:f3:ff:80:1a:5f: + 56:be:3b:a9:b2:76:f7:54:7a:4c:30:c1:99:24:4b:72:d2:ca: + d4:fa:08:c6:90:de:88:12:ed:f8:90:f9:fc:a9:84:fd:92:f2: + 78:e5:db:c9:22:57:ab:41:30:42:6b:0b:9f:d7:73:33:fb:01: + 67:1c:42:5c:8f:27:67:c7:6e:07:03:8d:0e:96:cb:0a:03:cc: + 3e:f8:87:3c:35:30:cd:18:8c:d5:71:dd:cd:dd:61:b0:13:a3: + 64:46:4e:fe:71:4e:6b:65:e9:14:04:f2:3f:a8:bd:0c:36:3d: + 2a:5d:9e:07:f2:c2:4f:90:c5:5e:4d:18:37:d1:27:28:80:a4: + 36:e5:ca:93:6a:65:0e:f8:93:b9:af:52:58:4b:7a:71:d8:ba: + f3:ef:d2:f3:f6:a2:97:e4:5d:14:02:9a:cb:e5:ae:b6:93:e1: + 23:9f:9b:3f:46:f7:ee:8e:a1:00:5b:66:c3:1e:68:23:86:0f: + 5d:77:ba:53:ad:f9:52:fb:70:15:c5:75:eb:cf:79:ad:49:7c: + f2:76:62:ae:44:2f:c5:5f:51:34:25:41:6a:12:0a:5f:8e:ae: + 10:c4:43:89:35:fd:ec:ff:31:e6:ec:1e:87:e9:3a:7c:29:50: + 45:41:a3:14 +-----BEGIN CERTIFICATE----- +MIIEzjCCA7agAwIBAgIQJt3SK0bJxE1aaU05gH5yrTANBgkqhkiG9w0BAQsFADB+ +MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5B +LjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIwIAYD +VQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMB4XDTE0MDkxMTEyMDAwMFoX +DTI3MDYwOTEwNDYzOVowgYUxCzAJBgNVBAYTAlBMMSIwIAYDVQQKExlVbml6ZXRv +IFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxKTAnBgNVBAMTIENlcnR1bSBEb21haW4gVmFsaWRhdGlvbiBD +QSBTSEEyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoSVj343kIAfZ +VNHRBPYX4j5H+8N0JbjEvxISvOBw0TkFwhez94JwoE4H/hAq/9sNRl4klKOLRZ8Y +m85CxK7bgzO8wru0MLanN4d4e0jLJSyCuwpIEmB2ieyOzI8eUkjphgJawrCKfIU9 +2f9gTzNspqGgheHXU/LqJz1lqXLBCIPMsCWcEUYk4D70p+/tUbFlk0K09uaGChB5 +MjZYsmuo3NV6Hp0U7kDnskZMvZopwuz4MMFiAiriHINi0IU2GoPeEoQpZe/SMr4x +YEKoz/jd6tBWRx29dpYkE+e+2Zkr+jBk8Yo4eqbhKpYCsJ262I9tTnqUaX2wk6p0 +5ZOQE/qimQIDAQABo4IBPjCCATowDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +5TGtvzoRlvSDvFA81LeQm5Du3iUwHwYDVR0jBBgwFoAUCHbNywf/JPbFze27kLzi +hDdGdfcwDgYDVR0PAQH/BAQDAgEGMC8GA1UdHwQoMCYwJKAioCCGHmh0dHA6Ly9j +cmwuY2VydHVtLnBsL2N0bmNhLmNybDBrBggrBgEFBQcBAQRfMF0wKAYIKwYBBQUH +MAGGHGh0dHA6Ly9zdWJjYS5vY3NwLWNlcnR1bS5jb20wMQYIKwYBBQUHMAKGJWh0 +dHA6Ly9yZXBvc2l0b3J5LmNlcnR1bS5wbC9jdG5jYS5jZXIwOQYDVR0gBDIwMDAu +BgRVHSAAMCYwJAYIKwYBBQUHAgEWGGh0dHA6Ly93d3cuY2VydHVtLnBsL0NQUzAN +BgkqhkiG9w0BAQsFAAOCAQEAur/w4d1NK0JDZFjfZPP/gBpfVr47qbJ291R6TDDB +mSRLctLK1PoIxpDeiBLt+JD5/KmE/ZLyeOXbySJXq0EwQmsLn9dzM/sBZxxCXI8n +Z8duBwONDpbLCgPMPviHPDUwzRiM1XHdzd1hsBOjZEZO/nFOa2XpFATyP6i9DDY9 +Kl2eB/LCT5DFXk0YN9EnKICkNuXKk2plDviTua9SWEt6cdi68+/S8/ail+RdFAKa +y+WutpPhI5+bP0b37o6hAFtmwx5oI4YPXXe6U635UvtwFcV16895rUl88nZirkQv +xV9RNCVBahIKX46uEMRDiTX97P8x5uweh+k6fClQRUGjFA== +-----END CERTIFICATE----- diff --git a/doc/fw-addr-lists.md b/doc/fw-addr-lists.md index ac34c88..e9a8ff7 100644 --- a/doc/fw-addr-lists.md +++ b/doc/fw-addr-lists.md @@ -19,8 +19,8 @@ Description This script downloads, imports and updates firewall address-lists. Its main purpose is to block attacking ip addresses, spam hosts, command-and-control servers and similar malicious entities. The default configuration contains -lists from [abuse.ch](https://abuse.ch/) and -[dshield.org](https://dshield.org/), and +lists from [abuse.ch](https://abuse.ch/), [dshield.org](https://dshield.org/) +and [blocklist.de](https://www.blocklist.de/), and lists from [spamhaus.org](https://spamhaus.org/) are prepared. The address-lists are updated in place, so after initial import you will not diff --git a/global-config.rsc b/global-config.rsc index 6a37c0c..646eddb 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -101,6 +101,8 @@ cert="GlobalSign Atlas R3 DV TLS CA 2022 Q3" }; { url="https://www.dshield.org/block.txt"; cidr="/24"; cert="R3" }; + { url="https://lists.blocklist.de/lists/strongips.txt"; + cert="Certum Domain Validation CA SHA2" }; # { url="https://www.spamhaus.org/drop/drop.txt"; # cert="Cloudflare Inc ECC CA-3" }; # { url="https://www.spamhaus.org/drop/edrop.txt"; diff --git a/global-functions.rsc b/global-functions.rsc index b1833b1..f890376 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -12,7 +12,7 @@ :local ScriptName [ :jobname ]; # expected configuration version -:global ExpectedConfigVersion 127; +:global ExpectedConfigVersion 128; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 8ddeb91..13a358f 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -52,6 +52,7 @@ 125=("April's Fool! " . [ $SymbolForNotification "smiley-partying-face" ] . "Well, you missed it... - no charge nor fees. (Anyway... Donations are much appreciated, " . [ $SymbolForNotification "smiley-smiling-face" ] . "thanks!)"); 126="Made 'telegram-chat' capable of handling large command output. Telegram messages still limit the size, so it is truncated now."; 127="Added support for authentication to Ntfy notification module."; + 128="Added another list from blocklist.de to default configuration for 'fw-addr-lists'."; }; # Migration steps to be applied on script updates From 545fb5583aee9e8971749a7eab71b4040cf7847f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 15 May 2024 14:27:11 +0200 Subject: [PATCH 071/893] global-functions: $IsTimeSync: initialize with uptime... ... to make sure the warning is not issued too early. --- global-functions.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index f890376..3800ad5 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -685,10 +685,10 @@ :return true; } - :if ([ :typeof $IsTimeSyncResetNtp ] = "nothing") do={ - :set IsTimeSyncResetNtp 0s; - } :local Uptime [ /system/resource/get uptime ]; + :if ([ :typeof $IsTimeSyncResetNtp ] = "nothing") do={ + :set IsTimeSyncResetNtp $Uptime; + } :if ($Uptime - $IsTimeSyncResetNtp < 3m) do={ :return false; } From ca7a592dfd9f19e07bbabc32d999b604bff0d0c9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 15 May 2024 14:15:54 +0200 Subject: [PATCH 072/893] daily-psk: adopt syntax changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RouterOS 7.15beta8 came with this change: *) wifi - show inherited properties with "print" command (replaces "actual-configuration") and added "print config" for showing only configured values; While the old code is bad syntax with RouterOS 7.15, the new code is valid for older RouterOS, but produces different (and more or less unexpected) results. 🥴 Let's use the new code, and add a check on the RouterOS version. With old RouterOS this now sends the notification even if the interface is disabled. --- daily-psk.capsman.rsc | 1 + daily-psk.local.rsc | 1 + daily-psk.template.rsc | 3 ++- daily-psk.wifi.rsc | 3 ++- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index 64e8ce7..985bc47 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -23,6 +23,7 @@ :global FormatLine; :global LogPrint; + :global RequiredRouterOS; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index 48e2b8d..185165a 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -23,6 +23,7 @@ :global FormatLine; :global LogPrint; + :global RequiredRouterOS; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 5097b00..434410b 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -24,6 +24,7 @@ :global FormatLine; :global LogPrint; + :global RequiredRouterOS; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; @@ -85,7 +86,7 @@ /interface/wireless/access-list/set $AccList private-pre-shared-key=$NewPsk; :if ([ :len [ /caps-man/actual-interface-configuration/find where configuration.ssid=$Ssid !disabled ] ] > 0) do={ - :if ([ :len [ /interface/wifi/actual-configuration/find where configuration.ssid=$Ssid ] ] > 0) do={ + :if ([ $RequiredRouterOS $ScriptName "7.15beta8" false ] = false || [ :len [ /interface/wifi/find where configuration.ssid=$Ssid !disabled ] ] > 0) do={ :if ([ :len [ /interface/wireless/find where name=$IntName !disabled ] ] = 1) do={ :if ($Seen->$Ssid = 1) do={ $LogPrint debug $ScriptName ("Already sent a mail for SSID " . $Ssid . ", skipping."); diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index 9d7f285..9b938dc 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -23,6 +23,7 @@ :global FormatLine; :global LogPrint; + :global RequiredRouterOS; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; @@ -71,7 +72,7 @@ $LogPrint info $ScriptName ("Updating daily PSK for " . $Ssid . " to " . $NewPsk . " (was " . $OldPsk . ")"); /interface/wifi/access-list/set $AccList passphrase=$NewPsk; - :if ([ :len [ /interface/wifi/actual-configuration/find where configuration.ssid=$Ssid ] ] > 0) do={ + :if ([ $RequiredRouterOS $ScriptName "7.15beta8" false ] = false || [ :len [ /interface/wifi/find where configuration.ssid=$Ssid !disabled ] ] > 0) do={ :if ($Seen->$Ssid = 1) do={ $LogPrint debug $ScriptName ("Already sent a mail for SSID " . $Ssid . ", skipping."); } else={ From 169c1ab6e1fce71c50cc4eaadeaae7cc685ee7bc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 15 May 2024 15:51:34 +0200 Subject: [PATCH 073/893] daily-psk: decrease indention in notification --- daily-psk.capsman.rsc | 6 +++--- daily-psk.local.rsc | 6 +++--- daily-psk.template.rsc | 6 +++--- daily-psk.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index 985bc47..51eea36 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -81,9 +81,9 @@ $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "calendar" ] . "daily PSK " . $Ssid); \ message=("This is the daily PSK on " . $Identity . ":\n\n" . \ - [ $FormatLine "SSID" $Ssid ] . "\n" . \ - [ $FormatLine "PSK" $NewPsk ] . "\n" . \ - [ $FormatLine "Date" $Date ] . "\n\n" . \ + [ $FormatLine "SSID" $Ssid 8 ] . "\n" . \ + [ $FormatLine "PSK" $NewPsk 8 ] . "\n" . \ + [ $FormatLine "Date" $Date 8 ] . "\n\n" . \ "A client device specific rule must not exist!"); link=$Link }); :set ($Seen->$Ssid) 1; } diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index 185165a..46d03a8 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -80,9 +80,9 @@ $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "calendar" ] . "daily PSK " . $Ssid); \ message=("This is the daily PSK on " . $Identity . ":\n\n" . \ - [ $FormatLine "SSID" $Ssid ] . "\n" . \ - [ $FormatLine "PSK" $NewPsk ] . "\n" . \ - [ $FormatLine "Date" $Date ] . "\n\n" . \ + [ $FormatLine "SSID" $Ssid 8 ] . "\n" . \ + [ $FormatLine "PSK" $NewPsk 8 ] . "\n" . \ + [ $FormatLine "Date" $Date 8 ] . "\n\n" . \ "A client device specific rule must not exist!"); link=$Link }); :set ($Seen->$Ssid) 1; } diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 434410b..6c67a57 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -96,9 +96,9 @@ $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "calendar" ] . "daily PSK " . $Ssid); \ message=("This is the daily PSK on " . $Identity . ":\n\n" . \ - [ $FormatLine "SSID" $Ssid ] . "\n" . \ - [ $FormatLine "PSK" $NewPsk ] . "\n" . \ - [ $FormatLine "Date" $Date ] . "\n\n" . \ + [ $FormatLine "SSID" $Ssid 8 ] . "\n" . \ + [ $FormatLine "PSK" $NewPsk 8 ] . "\n" . \ + [ $FormatLine "Date" $Date 8 ] . "\n\n" . \ "A client device specific rule must not exist!"); link=$Link }); :set ($Seen->$Ssid) 1; } diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index 9b938dc..9c28e9c 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -81,9 +81,9 @@ $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "calendar" ] . "daily PSK " . $Ssid); \ message=("This is the daily PSK on " . $Identity . ":\n\n" . \ - [ $FormatLine "SSID" $Ssid ] . "\n" . \ - [ $FormatLine "PSK" $NewPsk ] . "\n" . \ - [ $FormatLine "Date" $Date ] . "\n\n" . \ + [ $FormatLine "SSID" $Ssid 8 ] . "\n" . \ + [ $FormatLine "PSK" $NewPsk 8 ] . "\n" . \ + [ $FormatLine "Date" $Date 8 ] . "\n\n" . \ "A client device specific rule must not exist!"); link=$Link }); :set ($Seen->$Ssid) 1; } From 787ae4440ccc795e82373e80ed5e0266e529374a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 15 May 2024 15:54:12 +0200 Subject: [PATCH 074/893] daily-psk: quote ssid and passphrase --- daily-psk.capsman.rsc | 2 +- daily-psk.local.rsc | 2 +- daily-psk.template.rsc | 2 +- daily-psk.wifi.rsc | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index 51eea36..cd5b6b0 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -69,7 +69,7 @@ :local Skip 0; :if ($NewPsk != $OldPsk) do={ - $LogPrint info $ScriptName ("Updating daily PSK for " . $Ssid . " to " . $NewPsk . " (was " . $OldPsk . ")"); + $LogPrint info $ScriptName ("Updating daily PSK for '" . $Ssid . "' to '" . $NewPsk . "' (was '" . $OldPsk . "')"); /caps-man/access-list/set $AccList private-passphrase=$NewPsk; :if ([ :len [ /caps-man/actual-interface-configuration/find where configuration.ssid=$Ssid !disabled ] ] > 0) do={ diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index 46d03a8..fbdb784 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -68,7 +68,7 @@ :local Skip 0; :if ($NewPsk != $OldPsk) do={ - $LogPrint info $ScriptName ("Updating daily PSK for " . $Ssid . " to " . $NewPsk . " (was " . $OldPsk . ")"); + $LogPrint info $ScriptName ("Updating daily PSK for '" . $Ssid . "' to '" . $NewPsk . "' (was '" . $OldPsk . "')"); /interface/wireless/access-list/set $AccList private-pre-shared-key=$NewPsk; :if ([ :len [ /interface/wireless/find where name=$IntName !disabled ] ] = 1) do={ diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 6c67a57..35fa82c 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -80,7 +80,7 @@ :local Skip 0; :if ($NewPsk != $OldPsk) do={ - $LogPrint info $ScriptName ("Updating daily PSK for " . $Ssid . " to " . $NewPsk . " (was " . $OldPsk . ")"); + $LogPrint info $ScriptName ("Updating daily PSK for '" . $Ssid . "' to '" . $NewPsk . "' (was '" . $OldPsk . "')"); /caps-man/access-list/set $AccList private-passphrase=$NewPsk; /interface/wifi/access-list/set $AccList passphrase=$NewPsk; /interface/wireless/access-list/set $AccList private-pre-shared-key=$NewPsk; diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index 9c28e9c..c1f7133 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -69,7 +69,7 @@ :local Skip 0; :if ($NewPsk != $OldPsk) do={ - $LogPrint info $ScriptName ("Updating daily PSK for " . $Ssid . " to " . $NewPsk . " (was " . $OldPsk . ")"); + $LogPrint info $ScriptName ("Updating daily PSK for '" . $Ssid . "' to '" . $NewPsk . "' (was '" . $OldPsk . "')"); /interface/wifi/access-list/set $AccList passphrase=$NewPsk; :if ([ $RequiredRouterOS $ScriptName "7.15beta8" false ] = false || [ :len [ /interface/wifi/find where configuration.ssid=$Ssid !disabled ] ] > 0) do={ From 51331ea2acd5f5563ed3641090bbb7f2104d3e96 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 22 May 2024 09:26:13 +0200 Subject: [PATCH 075/893] backup-partition: support RouterOS copy-over... ... when run interactively from CLI. --- backup-partition.rsc | 17 +++++++++++++++++ doc/backup-partition.md | 11 ++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index fc186c0..9eeb1ae 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -18,6 +18,7 @@ :global PackagesUpdateBackupFailure; :global LogPrint; + :global ScriptFromTerminal; :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ @@ -41,6 +42,22 @@ :local FallbackTo [ /partitions/get $ActiveRunning fallback-to ]; + :if ([ /partitions/get $ActiveRunning version ] != [ /partitions/get $FallbackTo version]) do={ + :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ + :put ("The partitions have different RouterOS versions. Copy over to '" . $FallbackTo . "'? [y/N]"); + :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ + :do { + /partitions/copy-to $FallbackTo; + $LogPrint info $ScriptName ("Copied RouterOS to partition '" . $FallbackTo . "'."); + } on-error={ + $LogPrint error $ScriptName ("Failed copying RouterOS to partition '" . $FallbackTo . "'!"); + :set PackagesUpdateBackupFailure true; + :error false; + } + } + } + } + :do { /system/scheduler/add start-time=startup name="running-from-backup-partition" \ on-event=(":log warning (\"Running from partition '\" . " . \ diff --git a/doc/backup-partition.md b/doc/backup-partition.md index ba20657..8996203 100644 --- a/doc/backup-partition.md +++ b/doc/backup-partition.md @@ -18,6 +18,7 @@ Description This script saves the current configuration to fallback [partition](https://wiki.mikrotik.com/wiki/Manual:Partitions). +It can also copy-over the RouterOS installation when run interactively. For this to work you need a device with sufficient flash storage that is properly partitioned. @@ -26,9 +27,10 @@ To make you aware of a possible issue a scheduler logging a warning is added in the backup partition's configuration. You may want to use [log-forward](log-forward.md) to be notified. -> ⚠️ **Warning**: Only the configuration is saved to backup partition. -> Every now and then you should copy your installation over for a recent -> RouterOS version! +> ⚠️ **Warning**: By default only the configuration is saved to backup +> partition. Every now and then you should copy your installation over +> for a recent RouterOS version! For that run the script from terminal +> manually. Requirements and installation ----------------------------- @@ -44,6 +46,9 @@ Just run the script: /system/script/run backup-partition; +When run interactively from terminal it supports to copy-over the RouterOS +installation when versions differ. + Creating a scheduler may be an option: /system/scheduler/add interval=1w name=backup-partition on-event="/system/script/run backup-partition;" start-time=09:30:00; From c26e44ae4673f58a89833c15faf06828e7e2dd3f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 23 May 2024 12:09:02 +0200 Subject: [PATCH 076/893] doc/backup-cloud: fix link for backup-partition --- doc/backup-cloud.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/backup-cloud.md b/doc/backup-cloud.md index be6e06d..1f9e123 100644 --- a/doc/backup-cloud.md +++ b/doc/backup-cloud.md @@ -68,7 +68,7 @@ See also -------- * [Send backup via e-mail](backup-email.md) -* [Save configuration to fallback partition](doc/backup-partition.md) +* [Save configuration to fallback partition](backup-partition.md) * [Upload backup to server](backup-upload.md) --- From 6cbe13a135fe39c097b6a7078506d99eedde2e06 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 22 May 2024 11:58:26 +0200 Subject: [PATCH 077/893] backup-partition: move code to a local function --- backup-partition.rsc | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index 9eeb1ae..a72dd0b 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -21,6 +21,22 @@ :global ScriptFromTerminal; :global ScriptLock; + :local CopyTo do={ + :local ScriptName [ :tostr $1 ]; + :local FallbackTo [ :tostr $2 ]; + + :global LogPrint; + + :do { + /partitions/copy-to $FallbackTo; + $LogPrint info $ScriptName ("Copied RouterOS to partition '" . $FallbackTo . "'."); + :return true; + } on-error={ + $LogPrint error $ScriptName ("Failed copying RouterOS to partition '" . $FallbackTo . "'!"); + :return false; + } + } + :if ([ $ScriptLock $ScriptName ] = false) do={ :set PackagesUpdateBackupFailure true; :error false; @@ -46,11 +62,7 @@ :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ :put ("The partitions have different RouterOS versions. Copy over to '" . $FallbackTo . "'? [y/N]"); :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ - :do { - /partitions/copy-to $FallbackTo; - $LogPrint info $ScriptName ("Copied RouterOS to partition '" . $FallbackTo . "'."); - } on-error={ - $LogPrint error $ScriptName ("Failed copying RouterOS to partition '" . $FallbackTo . "'!"); + :if ([ $CopyTo $ScriptName $FallbackTo ] = false) do={ :set PackagesUpdateBackupFailure true; :error false; } From 16831aa1e8aa0ecb7ba95918e42aae2659530385 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 23 May 2024 12:09:28 +0200 Subject: [PATCH 078/893] doc/backup-email: fix link for backup-partition --- doc/backup-email.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/backup-email.md b/doc/backup-email.md index a506543..3b1dbb2 100644 --- a/doc/backup-email.md +++ b/doc/backup-email.md @@ -59,7 +59,7 @@ See also -------- * [Upload backup to Mikrotik cloud](backup-cloud.md) -* [Save configuration to fallback partition](doc/backup-partition.md) +* [Save configuration to fallback partition](backup-partition.md) * [Send notifications via e-mail](mod/notification-email.md) * [Upload backup to server](backup-upload.md) From affa11816182fa2bff454b3e82df3166c6cdd744 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 22 May 2024 12:03:53 +0200 Subject: [PATCH 079/893] backup-partition: support copy before feature update --- backup-partition.rsc | 13 +++++++++++++ doc/backup-partition.md | 18 +++++++++++++++--- global-config.rsc | 2 ++ 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index a72dd0b..3c883f7 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -15,11 +15,13 @@ :do { :local ScriptName [ :jobname ]; + :global BackupPartitionCopyBeforeFeatureUpdate; :global PackagesUpdateBackupFailure; :global LogPrint; :global ScriptFromTerminal; :global ScriptLock; + :global VersionToNum; :local CopyTo do={ :local ScriptName [ :tostr $1 ]; @@ -67,6 +69,17 @@ :error false; } } + } else={ + :local Update [ /system/package/update/get ]; + :local NumInstalled [ $VersionToNum ($Update->"installed-version") ]; + :local NumLatest [ $VersionToNum ($Update->"latest-version") ]; + :if ($BackupPartitionCopyBeforeFeatureUpdate = true && $NumLatest > 0 && \ + ($NumInstalled & 0xffff0000) != ($NumLatest & 0xffff0000)) do={ + :if ([ $CopyTo $ScriptName $FallbackTo ] = false) do={ + :set PackagesUpdateBackupFailure true; + :error false; + } + } } } diff --git a/doc/backup-partition.md b/doc/backup-partition.md index 8996203..1cef2c9 100644 --- a/doc/backup-partition.md +++ b/doc/backup-partition.md @@ -18,7 +18,8 @@ Description This script saves the current configuration to fallback [partition](https://wiki.mikrotik.com/wiki/Manual:Partitions). -It can also copy-over the RouterOS installation when run interactively. +It can also copy-over the RouterOS installation when run interactively +or just before a feature update. For this to work you need a device with sufficient flash storage that is properly partitioned. @@ -29,8 +30,7 @@ added in the backup partition's configuration. You may want to use > ⚠️ **Warning**: By default only the configuration is saved to backup > partition. Every now and then you should copy your installation over -> for a recent RouterOS version! For that run the script from terminal -> manually. +> for a recent RouterOS version! See below for options. Requirements and installation ----------------------------- @@ -39,6 +39,18 @@ Just install the script: $ScriptInstallUpdate backup-partition; +Configuration +------------- + +The configuration goes to `global-config-overlay`, the only parameter is: + +* `BackupPartitionCopyBeforeFeatureUpdate`: copy-over the RouterOS + installation when a feature update is pending + +> ℹ️ **Info**: Copy relevant configuration from +> [`global-config`](../global-config.rsc) (the one without `-overlay`) to +> your local `global-config-overlay` and modify it to your specific needs. + Usage and invocation -------------------- diff --git a/global-config.rsc b/global-config.rsc index 646eddb..8a42b81 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -85,6 +85,8 @@ :global BackupUploadUrl "sftp://example.com/backup/"; :global BackupUploadUser "mikrotik"; :global BackupUploadPass "v3ry-s3cr3t"; +# Copy the RouterOS installation to backup partition before feature update. +:global BackupPartitionCopyBeforeFeatureUpdate false; # This defines the settings for firewall address-lists (fw-addr-lists). :global FwAddrLists { From 0a46fb536f929f3248085072979b7acfe119dbd5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 23 May 2024 12:09:46 +0200 Subject: [PATCH 080/893] doc/backup-upload: fix link for backup-partition --- doc/backup-upload.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/backup-upload.md b/doc/backup-upload.md index f524adb..c44217c 100644 --- a/doc/backup-upload.md +++ b/doc/backup-upload.md @@ -85,7 +85,7 @@ See also * [Upload backup to Mikrotik cloud](backup-cloud.md) * [Send backup via e-mail](backup-email.md) -* [Save configuration to fallback partition](doc/backup-partition.md) +* [Save configuration to fallback partition](backup-partition.md) --- [⬅️ Go back to main README](../README.md) From 33a495beb76f438ba79e56ab8e4872d2df5c4da8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 23 May 2024 12:18:13 +0200 Subject: [PATCH 081/893] backup-partition: news on support for copy-over --- global-functions.rsc | 2 +- news-and-changes.rsc | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 3800ad5..96ed71d 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -12,7 +12,7 @@ :local ScriptName [ :jobname ]; # expected configuration version -:global ExpectedConfigVersion 128; +:global ExpectedConfigVersion 129; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 13a358f..b20bbaf 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -53,6 +53,7 @@ 126="Made 'telegram-chat' capable of handling large command output. Telegram messages still limit the size, so it is truncated now."; 127="Added support for authentication to Ntfy notification module."; 128="Added another list from blocklist.de to default configuration for 'fw-addr-lists'."; + 129="Extended 'backup-partition' to support RouterOS copy-over - interactively or before feature update."; }; # Migration steps to be applied on script updates From d6648563267a3c807a3b99f14881767b6e9826f0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 May 2024 20:00:03 +0200 Subject: [PATCH 082/893] telegram-chat: convert the message (command) to string RouterOS 7.15beta4 fixed a bug in JSON parser: *) console - do not convert string to array in ":deserialize" command; Before that change commands with a comma caused very crazy issues. Let's convert the message to a string. This does not give exactly the expected result, but mitigates telegram-chat to explode. A command like... /ip/address/print proplist=address,network; ... is converted to... /ip/address/print proplist=address;network; ... and results in: Columns: ADDRESS # ADDRESS 0 10.0.0.1/24 1 127.0.0.1/8 bad command name network (line 1 column 36) --- telegram-chat.rsc | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index f8dcd42..f3efd08 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -97,6 +97,7 @@ :local Trusted false; :local Chat ($Message->"chat"); :local From ($Message->"from"); + :local Command [ :tostr ($Message->"text") ]; :foreach IdsTrusted in=($TelegramChatId, $TelegramChatIdsTrusted) do={ :if ($From->"id" = $IdsTrusted || $From->"username" = $IdsTrusted) do={ @@ -106,15 +107,15 @@ :if ($Trusted = true) do={ :local Done false; - :if ($Message->"text" = "?") do={ + :if ($Command = "?") do={ $LogPrint info $ScriptName ("Sending notice for update " . $UpdateID . "."); $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=true; replyto=($Message->"message_id"); \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ message=("Online" . [ $IfThenElse $TelegramChatActive " (and active!)" ] . ", awaiting your commands!") }); :set Done true; } - :if ($Done = false && [ :pick ($Message->"text") 0 1 ] = "!") do={ - :if ($Message->"text" ~ ("^! *(" . [ $EscapeForRegEx $Identity ] . "|@" . $TelegramChatGroups . ")\$")) do={ + :if ($Done = false && [ :pick ($Command) 0 1 ] = "!") do={ + :if ($Command ~ ("^! *(" . [ $EscapeForRegEx $Identity ] . "|@" . $TelegramChatGroups . ")\$")) do={ :set TelegramChatActive true; } else={ :set TelegramChatActive false; @@ -123,16 +124,16 @@ " from update " . $UpdateID . "!"); :set Done true; } - :if ($Done = false && ($IsMyReply = 1 || ($IsReply = 0 && $TelegramChatActive = true)) && [ :len ($Message->"text") ] > 0) do={ - :if ([ $ValidateSyntax ($Message->"text") ] = true) do={ + :if ($Done = false && ($IsMyReply = 1 || ($IsReply = 0 && $TelegramChatActive = true)) && [ :len ($Command) ] > 0) do={ + :if ([ $ValidateSyntax ($Command) ] = true) do={ :local State ""; :local File ("tmpfs/telegram-chat/" . [ $GetRandom20CharAlNum 6 ]); :if ([ $MkDir "tmpfs/telegram-chat" ] = false) do={ $LogPrint error $ScriptName ("Failed creating directory!"); :error false; } - $LogPrint info $ScriptName ("Running command from update " . $UpdateID . ": " . $Message->"text"); - :execute script=(":do {\n" . $Message->"text" . "\n} on-error={ /file/add name=\"" . $File . ".failed\" };" . \ + $LogPrint info $ScriptName ("Running command from update " . $UpdateID . ": " . $Command); + :execute script=(":do {\n" . $Command . "\n} on-error={ /file/add name=\"" . $File . ".failed\" };" . \ "/file/add name=\"" . $File . ".done\"") file=($File . "\00"); :if ([ $WaitForFile ($File . ".done") [ $EitherOr $TelegramChatRunTime 20s ] ] = false) do={ :set State ([ $SymbolForNotification "warning-sign" ] . "The command did not finish, still running in background.\n\n"); @@ -143,7 +144,7 @@ :local Content ([ /file/read chunk-size=32768 file=$File as-value ]->"data"); $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=true; replyto=($Message->"message_id"); \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ - message=([ $SymbolForNotification "gear" ] . "Command:\n" . $Message->"text" . "\n\n" . \ + message=([ $SymbolForNotification "gear" ] . "Command:\n" . $Command . "\n\n" . \ $State . [ $IfThenElse ([ :len $Content ] > 0) \ ([ $SymbolForNotification "memo" ] . "Output:\n" . $Content) \ ([ $SymbolForNotification "memo" ] . "No output.") ]) }); @@ -152,7 +153,7 @@ $LogPrint info $ScriptName ("The command from update " . $UpdateID . " failed syntax validation!"); $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=false; replyto=($Message->"message_id"); \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ - message=([ $SymbolForNotification "gear" ] . "Command:\n" . $Message->"text" . "\n\n" . \ + message=([ $SymbolForNotification "gear" ] . "Command:\n" . $Command . "\n\n" . \ [ $SymbolForNotification "cross-mark" ] . "The command failed syntax validation!") }); } } @@ -160,7 +161,7 @@ :local MessageText ("Received a message from untrusted contact " . \ [ $IfThenElse ([ :len ($From->"username") ] = 0) "without username" ("'" . $From->"username" . "'") ] . \ " (ID " . $From->"id" . ") in update " . $UpdateID . "!"); - :if ($Message->"text" ~ ("^! *" . [ $EscapeForRegEx $Identity ] . "\$")) do={ + :if ($Command ~ ("^! *" . [ $EscapeForRegEx $Identity ] . "\$")) do={ $LogPrint warning $ScriptName $MessageText; $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=false; replyto=($Message->"message_id"); \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ From a97820d12a5833bce5160da674e5085b2882b53a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 25 May 2024 19:55:13 +0200 Subject: [PATCH 083/893] telegram-chat: drop extra parenthesis --- telegram-chat.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index f3efd08..0fd8a06 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -114,7 +114,7 @@ message=("Online" . [ $IfThenElse $TelegramChatActive " (and active!)" ] . ", awaiting your commands!") }); :set Done true; } - :if ($Done = false && [ :pick ($Command) 0 1 ] = "!") do={ + :if ($Done = false && [ :pick $Command 0 1 ] = "!") do={ :if ($Command ~ ("^! *(" . [ $EscapeForRegEx $Identity ] . "|@" . $TelegramChatGroups . ")\$")) do={ :set TelegramChatActive true; } else={ @@ -124,8 +124,8 @@ " from update " . $UpdateID . "!"); :set Done true; } - :if ($Done = false && ($IsMyReply = 1 || ($IsReply = 0 && $TelegramChatActive = true)) && [ :len ($Command) ] > 0) do={ - :if ([ $ValidateSyntax ($Command) ] = true) do={ + :if ($Done = false && ($IsMyReply = 1 || ($IsReply = 0 && $TelegramChatActive = true)) && [ :len $Command ] > 0) do={ + :if ([ $ValidateSyntax $Command ] = true) do={ :local State ""; :local File ("tmpfs/telegram-chat/" . [ $GetRandom20CharAlNum 6 ]); :if ([ $MkDir "tmpfs/telegram-chat" ] = false) do={ From e35ba4b06ce300b698a8bf684503437961e1343a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 1 Jun 2024 23:06:24 +0200 Subject: [PATCH 084/893] global-functions: $CleanName: no exception for dash... ... as we still want to deduplicate it when it is inside the input string. This also unbreak certificate import for "Go Daddy Secure Certificate Authority - G2" (and more)... --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 96ed71d..447d6e9 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -229,7 +229,7 @@ :for I from=0 to=([ :len $Input ] - 1) do={ :local Char [ :pick $Input $I ]; - :if ([ :typeof [ find "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-" $Char ] ] = "nil") do={ + :if ([ :typeof [ find "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" $Char ] ] = "nil") do={ :do { :if ([ :len $Return ] = 0) do={ :error true; From cd4ac2c0881f92327ce173f2294b066ca4bc2ba2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 5 Jun 2024 14:50:55 +0200 Subject: [PATCH 085/893] backup-cloud: log note on previous connection errors --- backup-cloud.rsc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index 88dd345..8f5575e 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -66,6 +66,10 @@ } while=([ $WaitForFile "tmpfs/backup-cloud/done" 200ms ] = false && $I > 0); :if ([ $WaitForFile "tmpfs/backup-cloud/done" ] = true) do={ + :if ($I < 4) do={ + :log warning ($ScriptName . ": Retry successful, please discard previous connection errors."); + } + :local Cloud [ /system/backup/cloud/get ([ find ]->0) ]; $SendNotification2 ({ origin=$ScriptName; \ From 0a085e6610aadf546b936076f6e3ae68538b1cfa Mon Sep 17 00:00:00 2001 From: netravnen <1938389+netravnen@users.noreply.github.com> Date: Mon, 10 Jun 2024 10:53:17 +0200 Subject: [PATCH 086/893] check-lte-firmware-upgrade: omit once Omit `once` from the `/interface/lte/firmware-upgrade` command to make sure it does acutally return a valid result. --- check-lte-firmware-upgrade.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index 3a25f83..5ea094e 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -44,7 +44,7 @@ :local Firmware; :local Info; :do { - :set Firmware [ /interface/lte/firmware-upgrade $Interface once as-value ]; + :set Firmware [ /interface/lte/firmware-upgrade $Interface as-value ]; :set Info [ /interface/lte/monitor $Interface once as-value ]; } on-error={ $LogPrint debug $ScriptName ("Could not get latest LTE firmware version for interface " . \ From c2dd9de9b1789c81f2a7db14f5dbba87d5881286 Mon Sep 17 00:00:00 2001 From: netravnen <1938389+netravnen@users.noreply.github.com> Date: Sun, 9 Jun 2024 13:13:59 +0200 Subject: [PATCH 087/893] unattended-lte-firmware-upgrade: omit once Omit `once` from the `/interface/lte/firmware-upgrade` command to make sure it does acutally return a valid result. Fixes #69 --- unattended-lte-firmware-upgrade.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unattended-lte-firmware-upgrade.rsc b/unattended-lte-firmware-upgrade.rsc index 904f952..ba22c6f 100644 --- a/unattended-lte-firmware-upgrade.rsc +++ b/unattended-lte-firmware-upgrade.rsc @@ -10,7 +10,7 @@ :local Firmware; :local IntName [ /interface/lte/get $Interface name ]; :do { - :set Firmware [ /interface/lte/firmware-upgrade $Interface once as-value ]; + :set Firmware [ /interface/lte/firmware-upgrade $Interface as-value ]; } on-error={ :log debug ("Could not get latest LTE firmware version for interface " . $IntName . "."); } From 9c899f871d672d599564d94911abcabad0ea069b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Jun 2024 18:10:22 +0200 Subject: [PATCH 088/893] backup-cloud: remove trailing spaces MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit How did I produce these!? 😳 --- backup-cloud.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index 8f5575e..697ee95 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -69,7 +69,7 @@ :if ($I < 4) do={ :log warning ($ScriptName . ": Retry successful, please discard previous connection errors."); } - + :local Cloud [ /system/backup/cloud/get ([ find ]->0) ]; $SendNotification2 ({ origin=$ScriptName; \ From 2166f262c8aed8b30560e37ea01c458567892a52 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Jun 2024 21:07:17 +0200 Subject: [PATCH 089/893] unattended-lte-firmware-upgrade: omit just another once --- unattended-lte-firmware-upgrade.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unattended-lte-firmware-upgrade.rsc b/unattended-lte-firmware-upgrade.rsc index ba22c6f..af2b6e5 100644 --- a/unattended-lte-firmware-upgrade.rsc +++ b/unattended-lte-firmware-upgrade.rsc @@ -28,7 +28,7 @@ /interface/lte/firmware-upgrade $1 upgrade=yes; :log info ("LTE firmware upgrade on '" . $1 . "' finished, waiting for reset."); :delay 240s; - :local Firmware [ /interface/lte/firmware-upgrade $1 once as-value ]; + :local Firmware [ /interface/lte/firmware-upgrade $1 as-value ]; :if (($Firmware->"installed") != ($Firmware->"latest")) do={ :log warning ("LTE firmware versions still differ. Resetting again..."); /interface/lte/at-chat $1 input="AT+RESET"; From 1e1c9be94522a6dfe24440321950c3dd0b2256a8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Jun 2024 21:09:06 +0200 Subject: [PATCH 090/893] unattended-lte-firmware-upgrade: drop the AT reset The AT command to reset is specific to modem. So this worked for some only... Let's just drop it, and update the log message. --- unattended-lte-firmware-upgrade.rsc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/unattended-lte-firmware-upgrade.rsc b/unattended-lte-firmware-upgrade.rsc index af2b6e5..a8182e5 100644 --- a/unattended-lte-firmware-upgrade.rsc +++ b/unattended-lte-firmware-upgrade.rsc @@ -30,8 +30,7 @@ :delay 240s; :local Firmware [ /interface/lte/firmware-upgrade $1 as-value ]; :if (($Firmware->"installed") != ($Firmware->"latest")) do={ - :log warning ("LTE firmware versions still differ. Resetting again..."); - /interface/lte/at-chat $1 input="AT+RESET"; + :log warning ("LTE firmware versions still differ. Upgrade failed anyway?"); } } on-error={ :log error ("LTE firmware upgrade on '" . $1 . "' failed."); From d01362dbaa352efccf4d64a5e0404b2d43060cd5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Jun 2024 21:12:46 +0200 Subject: [PATCH 091/893] unattended-lte-firmware-upgrade: check on valid version first --- unattended-lte-firmware-upgrade.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/unattended-lte-firmware-upgrade.rsc b/unattended-lte-firmware-upgrade.rsc index a8182e5..7ce4028 100644 --- a/unattended-lte-firmware-upgrade.rsc +++ b/unattended-lte-firmware-upgrade.rsc @@ -29,7 +29,8 @@ :log info ("LTE firmware upgrade on '" . $1 . "' finished, waiting for reset."); :delay 240s; :local Firmware [ /interface/lte/firmware-upgrade $1 as-value ]; - :if (($Firmware->"installed") != ($Firmware->"latest")) do={ + :if ([ :len ($Firmware->"latest") ] > 0 && \ + ($Firmware->"installed") != ($Firmware->"latest")) do={ :log warning ("LTE firmware versions still differ. Upgrade failed anyway?"); } } on-error={ From 76dd069fa653ad9ed8f100f71124fc5027b159df Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 19 Jun 2024 08:56:07 +0200 Subject: [PATCH 092/893] Let's Encrypt changed their intermediate certificates https://letsencrypt.org/2024/03/19/new-intermediate-certificates https://letsencrypt.org/certificates/ But let's keep the old ones around for now, as some sites are still using the old intermediate. --- INITIAL-COMMANDS.md | 10 +- README.d/01-download-certs.avif | Bin 4420 -> 4578 bytes README.d/03-check-certs.avif | Bin 12089 -> 12118 bytes README.md | 14 +- certs/E5.pem | 119 ++++++++++++++++ certs/R10.pem | 231 ++++++++++++++++++++++++++++++++ global-config.rsc | 6 +- global-functions.rsc | 2 +- 8 files changed, 366 insertions(+), 16 deletions(-) create mode 100644 certs/E5.pem create mode 100644 certs/R10.pem diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 4a12197..889192d 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -17,13 +17,13 @@ Initial commands Run the complete base installation: { - /tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/E1.pem" dst-path="letsencrypt-E1.pem" as-value; + /tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/E5.pem" dst-path="letsencrypt-E5.pem" as-value; :delay 1s; - /certificate/import file-name=letsencrypt-E1.pem passphrase=""; - :if ([ :len [ /certificate/find where fingerprint="46494e30379059df18be52124305e606fc59070e5b21076ce113954b60517cda" or fingerprint="69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470" ] ] != 2) do={ + /certificate/import file-name=letsencrypt-E5.pem passphrase=""; + :if ([ :len [ /certificate/find where fingerprint="e788d14b0436b5120bbee3f15c15badf08c1407fe72568a4f16f9151c380e1e3" or fingerprint="69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470" ] ] != 2) do={ :error "Something is wrong with your certificates!"; }; - /file/remove [ find where name="letsencrypt-E1.pem" ]; + /file/remove [ find where name="letsencrypt-E5.pem" ]; :delay 1s; /system/script/set name=("global-config-overlay-" . [ /system/clock/get date ] . "-" . [ /system/clock/get time ]) [ find where name="global-config-overlay" ]; :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ @@ -34,7 +34,7 @@ Run the complete base installation: /system/scheduler/remove [ find where name="global-scripts" ]; /system/scheduler/add name="global-scripts" start-time=startup on-event="/system/script { run global-config; run global-functions; }"; :global CertificateNameByCN; - $CertificateNameByCN "E1"; + $CertificateNameByCN "E5"; $CertificateNameByCN "ISRG Root X2"; }; diff --git a/README.d/01-download-certs.avif b/README.d/01-download-certs.avif index b27b23b8ca7990d261be1e4b23349de6d493f767..b543aff2848235791b59fc0805e850a748f17a23 100644 GIT binary patch delta 3558 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 delta 3399 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 diff --git a/README.d/03-check-certs.avif b/README.d/03-check-certs.avif index 0477c398b41b439ec6eff03c8bcd2357f2637857..f24c6b567a0696bfd30899f66157ec7c23248212 100644 GIT binary patch delta 10014 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 LW+fw9Oi7tgtG9@| diff --git a/README.md b/README.md index b6e529d..1ad5aca 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ download the certificates. If you intend to download the scripts from a different location (for example from github.com) install the corresponding certificate chain. - /tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/E1.pem" dst-path="letsencrypt-E1.pem"; + /tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/E5.pem" dst-path="letsencrypt-E5.pem"; ![screenshot: download certs](README.d/01-download-certs.avif) @@ -78,11 +78,11 @@ want to be safe download with your workstations's browser and transfer the files to your MikroTik device. * [ISRG Root X2](https://letsencrypt.org/certs/isrg-root-x2.pem) -* Let's Encrypt [E1](https://letsencrypt.org/certs/lets-encrypt-e1.pem) +* Let's Encrypt [E5](https://letsencrypt.org/certs/2024/e5.pem) Then we import the certificates. - /certificate/import file-name=letsencrypt-E1.pem passphrase=""; + /certificate/import file-name=letsencrypt-E5.pem passphrase=""; Do not worry that the command is not shown - that happens because it contains a sensitive property, the passphrase. @@ -90,13 +90,13 @@ a sensitive property, the passphrase. ![screenshot: import certs](README.d/02-import-certs.avif) For basic verification we rename the certificates and print them by -fingerprint. Make sure exactly these two certificates ("*E1*" and +fingerprint. Make sure exactly these two certificates ("*E5*" and "*ISRG-Root-X2*") are shown. Also remove the left over file. - /certificate/set name="E1" [ find where common-name="E1" ]; + /certificate/set name="E5" [ find where common-name="E5" ]; /certificate/set name="ISRG-Root-X2" [ find where common-name="ISRG Root X2" ]; - /certificate/print proplist=name,fingerprint where fingerprint="46494e30379059df18be52124305e606fc59070e5b21076ce113954b60517cda" or fingerprint="69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470"; - /file/remove [ find where name="letsencrypt-E1.pem" ]; + /certificate/print proplist=name,fingerprint where fingerprint="e788d14b0436b5120bbee3f15c15badf08c1407fe72568a4f16f9151c380e1e3" or fingerprint="69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470"; + /file/remove [ find where name="letsencrypt-E5.pem" ]; ![screenshot: check certs](README.d/03-check-certs.avif) diff --git a/certs/E5.pem b/certs/E5.pem new file mode 100644 index 0000000..3f9e915 --- /dev/null +++ b/certs/E5.pem @@ -0,0 +1,119 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 18:6e:75:d4:ee:b0:a0:5d:fd:2d:a8:20:86:5d:1e:31 + Signature Algorithm: ecdsa-with-SHA384 + Issuer: C=US, O=Internet Security Research Group, CN=ISRG Root X2 + Validity + Not Before: Mar 13 00:00:00 2024 GMT + Not After : Mar 12 23:59:59 2027 GMT + Subject: C=US, O=Let's Encrypt, CN=E5 + Subject Public Key Info: + Public Key Algorithm: id-ecPublicKey + Public-Key: (384 bit) + pub: + 04:0d:0b:3a:8a:6b:61:8e:b6:ef:dc:5f:58:e7:c6: + 42:45:54:ab:63:f6:66:61:48:0a:2e:59:75:b4:81: + 02:37:50:b7:3f:16:79:dc:98:ec:a1:28:97:72:20: + 1c:2c:cf:d5:7c:52:20:4e:54:78:5b:84:14:6b:c0: + 90:ae:85:ec:c0:51:41:3c:5a:87:7f:06:4d:d4:fe: + 60:d1:fa:6c:2d:e1:7d:95:10:88:a2:08:54:0f:99: + 1a:4c:e6:ea:0a:ac:d8 + ASN1 OID: secp384r1 + NIST CURVE: P-384 + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Extended Key Usage: + TLS Web Client Authentication, TLS Web Server Authentication + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + X509v3 Subject Key Identifier: + 9F:2B:5F:CF:3C:21:4F:9D:04:B7:ED:2B:2C:C4:C6:70:8B:D2:D7:0D + X509v3 Authority Key Identifier: + 7C:42:96:AE:DE:4B:48:3B:FA:92:F8:9E:8C:CF:6D:8B:A9:72:37:95 + Authority Information Access: + CA Issuers - URI:http://x2.i.lencr.org/ + X509v3 Certificate Policies: + Policy: 2.23.140.1.2.1 + X509v3 CRL Distribution Points: + Full Name: + URI:http://x2.c.lencr.org/ + Signature Algorithm: ecdsa-with-SHA384 + Signature Value: + 30:64:02:30:1b:6d:2e:45:41:1c:45:3e:d9:5f:34:18:74:67: + 13:79:ba:ab:29:b5:b6:10:4e:83:27:4a:8b:45:4e:c7:7b:cf: + f4:40:30:1d:61:a5:e6:1c:6d:a4:90:09:92:6e:46:4b:02:30: + 46:29:18:84:34:7a:bc:fb:de:d8:1b:d8:19:a7:04:f5:cb:7e: + e7:6d:84:d9:da:8e:ea:ce:36:30:b9:a2:80:4c:2c:e6:60:12: + 4b:a9:76:aa:e8:6d:95:47:da:72:09:0c +-----BEGIN CERTIFICATE----- +MIICtDCCAjugAwIBAgIQGG511O6woF39Lagghl0eMTAKBggqhkjOPQQDAzBPMQsw +CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg +R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yNDAzMTMwMDAwMDBaFw0y +NzAzMTIyMzU5NTlaMDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNy +eXB0MQswCQYDVQQDEwJFNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABA0LOoprYY62 +79xfWOfGQkVUq2P2ZmFICi5ZdbSBAjdQtz8WedyY7KEol3IgHCzP1XxSIE5UeFuE +FGvAkK6F7MBRQTxah38GTdT+YNH6bC3hfZUQiKIIVA+ZGkzm6gqs2KOB+DCB9TAO +BgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIG +A1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFJ8rX888IU+dBLftKyzExnCL0tcN +MB8GA1UdIwQYMBaAFHxClq7eS0g7+pL4nozPbYupcjeVMDIGCCsGAQUFBwEBBCYw +JDAiBggrBgEFBQcwAoYWaHR0cDovL3gyLmkubGVuY3Iub3JnLzATBgNVHSAEDDAK +MAgGBmeBDAECATAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veDIuYy5sZW5jci5v +cmcvMAoGCCqGSM49BAMDA2cAMGQCMBttLkVBHEU+2V80GHRnE3m6qym1thBOgydK +i0VOx3vP9EAwHWGl5hxtpJAJkm5GSwIwRikYhDR6vPve2BvYGacE9ct+522E2dqO +6s42MLmigEws5mASS6l2quhtlUfacgkM +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 41:d2:9d:d1:72:ea:ee:a7:80:c1:2c:6c:e9:2f:87:52 + Signature Algorithm: ecdsa-with-SHA384 + Issuer: C = US, O = Internet Security Research Group, CN = ISRG Root X2 + Validity + Not Before: Sep 4 00:00:00 2020 GMT + Not After : Sep 17 16:00:00 2040 GMT + Subject: C = US, O = Internet Security Research Group, CN = ISRG Root X2 + Subject Public Key Info: + Public Key Algorithm: id-ecPublicKey + Public-Key: (384 bit) + pub: + 04:cd:9b:d5:9f:80:83:0a:ec:09:4a:f3:16:4a:3e: + 5c:cf:77:ac:de:67:05:0d:1d:07:b6:dc:16:fb:5a: + 8b:14:db:e2:71:60:c4:ba:45:95:11:89:8e:ea:06: + df:f7:2a:16:1c:a4:b9:c5:c5:32:e0:03:e0:1e:82: + 18:38:8b:d7:45:d8:0a:6a:6e:e6:00:77:fb:02:51: + 7d:22:d8:0a:6e:9a:5b:77:df:f0:fa:41:ec:39:dc: + 75:ca:68:07:0c:1f:ea + ASN1 OID: secp384r1 + NIST CURVE: P-384 + X509v3 extensions: + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Subject Key Identifier: + 7C:42:96:AE:DE:4B:48:3B:FA:92:F8:9E:8C:CF:6D:8B:A9:72:37:95 + Signature Algorithm: ecdsa-with-SHA384 + 30:65:02:30:7b:79:4e:46:50:84:c2:44:87:46:1b:45:70:ff: + 58:99:de:f4:fd:a4:d2:55:a6:20:2d:74:d6:34:bc:41:a3:50: + 5f:01:27:56:b4:be:27:75:06:af:12:2e:75:98:8d:fc:02:31: + 00:8b:f5:77:6c:d4:c8:65:aa:e0:0b:2c:ee:14:9d:27:37:a4: + f9:53:a5:51:e4:29:83:d7:f8:90:31:5b:42:9f:0a:f5:fe:ae: + 00:68:e7:8c:49:0f:b6:6f:5b:5b:15:f2:e7 +-----BEGIN CERTIFICATE----- +MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw +CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg +R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00 +MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT +ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw +EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW ++1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9 +ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI +zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW +tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1 +/q4AaOeMSQ+2b1tbFfLn +-----END CERTIFICATE----- diff --git a/certs/R10.pem b/certs/R10.pem new file mode 100644 index 0000000..e8c1c4a --- /dev/null +++ b/certs/R10.pem @@ -0,0 +1,231 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 4b:a8:52:93:f7:9a:2f:a2:73:06:4b:a8:04:8d:75:d0 + Signature Algorithm: sha256WithRSAEncryption + Issuer: C=US, O=Internet Security Research Group, CN=ISRG Root X1 + Validity + Not Before: Mar 13 00:00:00 2024 GMT + Not After : Mar 12 23:59:59 2027 GMT + Subject: C=US, O=Let's Encrypt, CN=R10 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:cf:57:e5:e6:c4:54:12:ed:b4:47:fe:c9:27:58: + 76:46:50:28:8c:1d:3e:88:df:05:9d:d5:b5:18:29: + bd:dd:b5:5a:bf:fa:f6:ce:a3:be:af:00:21:4b:62: + 5a:5a:3c:01:2f:c5:58:03:f6:89:ff:8e:11:43:eb: + c1:b5:e0:14:07:96:8f:6f:1f:d7:e7:ba:81:39:09: + 75:65:b7:c2:af:18:5b:37:26:28:e7:a3:f4:07:2b: + 6d:1a:ff:ab:58:bc:95:ae:40:ff:e9:cb:57:c4:b5: + 5b:7f:78:0d:18:61:bc:17:e7:54:c6:bb:49:91:cd: + 6e:18:d1:80:85:ee:a6:65:36:bc:74:ea:bc:50:4c: + ea:fc:21:f3:38:16:93:94:ba:b0:d3:6b:38:06:cd: + 16:12:7a:ca:52:75:c8:ad:76:b2:c2:9c:5d:98:45: + 5c:6f:61:7b:c6:2d:ee:3c:13:52:86:01:d9:57:e6: + 38:1c:df:8d:b5:1f:92:91:9a:e7:4a:1c:cc:45:a8: + 72:55:f0:b0:e6:a3:07:ec:fd:a7:1b:66:9e:3f:48: + 8b:71:84:71:58:c9:3a:fa:ef:5e:f2:5b:44:2b:3c: + 74:e7:8f:b2:47:c1:07:6a:cd:9a:b7:0d:96:f7:12: + 81:26:51:54:0a:ec:61:f6:f7:f5:e2:f2:8a:c8:95: + 0d:8d + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + X509v3 Extended Key Usage: + TLS Web Client Authentication, TLS Web Server Authentication + X509v3 Basic Constraints: critical + CA:TRUE, pathlen:0 + X509v3 Subject Key Identifier: + BB:BC:C3:47:A5:E4:BC:A9:C6:C3:A4:72:0C:10:8D:A2:35:E1:C8:E8 + X509v3 Authority Key Identifier: + 79:B4:59:E6:7B:B6:E5:E4:01:73:80:08:88:C8:1A:58:F6:E9:9B:6E + Authority Information Access: + CA Issuers - URI:http://x1.i.lencr.org/ + X509v3 Certificate Policies: + Policy: 2.23.140.1.2.1 + X509v3 CRL Distribution Points: + Full Name: + URI:http://x1.c.lencr.org/ + Signature Algorithm: sha256WithRSAEncryption + Signature Value: + 92:b1:e7:41:37:eb:79:9d:81:e6:cd:e2:25:e1:3a:20:e9:90: + 44:95:a3:81:5c:cf:c3:5d:fd:bd:a0:70:d5:b1:96:28:22:0b: + d2:f2:28:cf:0c:e7:d4:e6:43:8c:24:22:1d:c1:42:92:d1:09: + af:9f:4b:f4:c8:70:4f:20:16:b1:5a:dd:01:f6:1f:f8:1f:61: + 6b:14:27:b0:72:8d:63:ae:ee:e2:ce:4b:cf:37:dd:bb:a3:d4: + cd:e7:ad:50:ad:bd:bf:e3:ec:3e:62:36:70:99:31:a7:e8:8d: + dd:ea:62:e2:12:ae:f5:9c:d4:3d:2c:0c:aa:d0:9c:79:be:ea: + 3d:5c:44:6e:96:31:63:5a:7d:d6:7e:4f:24:a0:4b:05:7f:5e: + 6f:d2:d4:ea:5f:33:4b:13:d6:57:b6:ca:de:51:b8:5d:a3:09: + 82:74:fd:c7:78:9e:b3:b9:ac:16:da:4a:2b:96:c3:b6:8b:62: + 8f:f9:74:19:a2:9e:03:de:e9:6f:9b:b0:0f:d2:a0:5a:f6:85: + 5c:c2:04:b7:c8:d5:4e:32:c4:bf:04:5d:bc:29:f6:f7:81:8f: + 0c:5d:3c:53:c9:40:90:8b:fb:b6:08:65:b9:a4:21:d5:09:e5: + 13:84:84:37:82:ce:10:28:fc:76:c2:06:25:7a:46:52:4d:da: + 53:72:a4:27:3f:62:70:ac:be:69:48:00:fb:67:0f:db:5b:a1: + e8:d7:03:21:2d:d7:c9:f6:99:42:39:83:43:df:77:0a:12:08: + f1:25:d6:ba:94:19:54:18:88:a5:c5:8e:e1:1a:99:93:79:6b: + ec:1c:f9:31:40:b0:cc:32:00:df:9f:5e:e7:b4:92:ab:90:82: + 91:8d:0d:e0:1e:95:ba:59:3b:2e:4b:5f:c2:b7:46:35:52:39: + 06:c0:bd:aa:ac:52:c1:22:a0:44:97:99:f7:0c:a0:21:a7:a1: + 6c:71:47:16:17:01:68:c0:ca:a6:26:65:04:7c:b3:ae:c9:e7: + 94:55:c2:6f:9b:3c:1c:a9:f9:2e:c5:20:1a:f0:76:e0:be:ec: + 18:d6:4f:d8:25:fb:76:11:e8:bf:e6:21:0f:e8:e8:cc:b5:b6: + a7:d5:b8:f7:9f:41:cf:61:22:46:6a:83:b6:68:97:2e:7c:ea: + 4e:95:db:23:eb:2e:c8:2b:28:84:a4:60:e9:49:f4:44:2e:3b: + f9:ca:62:57:01:e2:5d:90:16:f9:c9:fc:7a:23:48:8e:a6:d5: + 81:72:f1:28:fa:5d:ce:fb:ed:4e:73:8f:94:2e:d2:41:94:98: + 99:db:a7:af:70:5f:f5:be:fb:02:20:bf:66:27:6c:b4:ad:fa: + 75:12:0b:2b:3e:ce:03:9e +-----BEGIN CERTIFICATE----- +MIIFBTCCAu2gAwIBAgIQS6hSk/eaL6JzBkuoBI110DANBgkqhkiG9w0BAQsFADBP +MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy +Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa +Fw0yNzAzMTIyMzU5NTlaMDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF +bmNyeXB0MQwwCgYDVQQDEwNSMTAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQDPV+XmxFQS7bRH/sknWHZGUCiMHT6I3wWd1bUYKb3dtVq/+vbOo76vACFL +YlpaPAEvxVgD9on/jhFD68G14BQHlo9vH9fnuoE5CXVlt8KvGFs3Jijno/QHK20a +/6tYvJWuQP/py1fEtVt/eA0YYbwX51TGu0mRzW4Y0YCF7qZlNrx06rxQTOr8IfM4 +FpOUurDTazgGzRYSespSdcitdrLCnF2YRVxvYXvGLe48E1KGAdlX5jgc3421H5KR +mudKHMxFqHJV8LDmowfs/acbZp4/SItxhHFYyTr6717yW0QrPHTnj7JHwQdqzZq3 +DZb3EoEmUVQK7GH29/Xi8orIlQ2NAgMBAAGjgfgwgfUwDgYDVR0PAQH/BAQDAgGG +MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATASBgNVHRMBAf8ECDAGAQH/ +AgEAMB0GA1UdDgQWBBS7vMNHpeS8qcbDpHIMEI2iNeHI6DAfBgNVHSMEGDAWgBR5 +tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKG +Fmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0gBAwwCjAIBgZngQwBAgEwJwYD +VR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVuY3Iub3JnLzANBgkqhkiG9w0B +AQsFAAOCAgEAkrHnQTfreZ2B5s3iJeE6IOmQRJWjgVzPw139vaBw1bGWKCIL0vIo +zwzn1OZDjCQiHcFCktEJr59L9MhwTyAWsVrdAfYf+B9haxQnsHKNY67u4s5Lzzfd +u6PUzeetUK29v+PsPmI2cJkxp+iN3epi4hKu9ZzUPSwMqtCceb7qPVxEbpYxY1p9 +1n5PJKBLBX9eb9LU6l8zSxPWV7bK3lG4XaMJgnT9x3ies7msFtpKK5bDtotij/l0 +GaKeA97pb5uwD9KgWvaFXMIEt8jVTjLEvwRdvCn294GPDF08U8lAkIv7tghluaQh +1QnlE4SEN4LOECj8dsIGJXpGUk3aU3KkJz9icKy+aUgA+2cP21uh6NcDIS3XyfaZ +QjmDQ993ChII8SXWupQZVBiIpcWO4RqZk3lr7Bz5MUCwzDIA359e57SSq5CCkY0N +4B6Vulk7LktfwrdGNVI5BsC9qqxSwSKgRJeZ9wygIaehbHFHFhcBaMDKpiZlBHyz +rsnnlFXCb5s8HKn5LsUgGvB24L7sGNZP2CX7dhHov+YhD+jozLW2p9W4959Bz2Ei +RmqDtmiXLnzqTpXbI+suyCsohKRg6Un0RC47+cpiVwHiXZAW+cn8eiNIjqbVgXLx +KPpdzvvtTnOPlC7SQZSYmdunr3Bf9b77AiC/ZidstK36dRILKz7OA54= +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 82:10:cf:b0:d2:40:e3:59:44:63:e0:bb:63:82:8b:00 + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = US, O = Internet Security Research Group, CN = ISRG Root X1 + Validity + Not Before: Jun 4 11:04:38 2015 GMT + Not After : Jun 4 11:04:38 2035 GMT + Subject: C = US, O = Internet Security Research Group, CN = ISRG Root X1 + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (4096 bit) + Modulus: + 00:ad:e8:24:73:f4:14:37:f3:9b:9e:2b:57:28:1c: + 87:be:dc:b7:df:38:90:8c:6e:3c:e6:57:a0:78:f7: + 75:c2:a2:fe:f5:6a:6e:f6:00:4f:28:db:de:68:86: + 6c:44:93:b6:b1:63:fd:14:12:6b:bf:1f:d2:ea:31: + 9b:21:7e:d1:33:3c:ba:48:f5:dd:79:df:b3:b8:ff: + 12:f1:21:9a:4b:c1:8a:86:71:69:4a:66:66:6c:8f: + 7e:3c:70:bf:ad:29:22:06:f3:e4:c0:e6:80:ae:e2: + 4b:8f:b7:99:7e:94:03:9f:d3:47:97:7c:99:48:23: + 53:e8:38:ae:4f:0a:6f:83:2e:d1:49:57:8c:80:74: + b6:da:2f:d0:38:8d:7b:03:70:21:1b:75:f2:30:3c: + fa:8f:ae:dd:da:63:ab:eb:16:4f:c2:8e:11:4b:7e: + cf:0b:e8:ff:b5:77:2e:f4:b2:7b:4a:e0:4c:12:25: + 0c:70:8d:03:29:a0:e1:53:24:ec:13:d9:ee:19:bf: + 10:b3:4a:8c:3f:89:a3:61:51:de:ac:87:07:94:f4: + 63:71:ec:2e:e2:6f:5b:98:81:e1:89:5c:34:79:6c: + 76:ef:3b:90:62:79:e6:db:a4:9a:2f:26:c5:d0:10: + e1:0e:de:d9:10:8e:16:fb:b7:f7:a8:f7:c7:e5:02: + 07:98:8f:36:08:95:e7:e2:37:96:0d:36:75:9e:fb: + 0e:72:b1:1d:9b:bc:03:f9:49:05:d8:81:dd:05:b4: + 2a:d6:41:e9:ac:01:76:95:0a:0f:d8:df:d5:bd:12: + 1f:35:2f:28:17:6c:d2:98:c1:a8:09:64:77:6e:47: + 37:ba:ce:ac:59:5e:68:9d:7f:72:d6:89:c5:06:41: + 29:3e:59:3e:dd:26:f5:24:c9:11:a7:5a:a3:4c:40: + 1f:46:a1:99:b5:a7:3a:51:6e:86:3b:9e:7d:72:a7: + 12:05:78:59:ed:3e:51:78:15:0b:03:8f:8d:d0:2f: + 05:b2:3e:7b:4a:1c:4b:73:05:12:fc:c6:ea:e0:50: + 13:7c:43:93:74:b3:ca:74:e7:8e:1f:01:08:d0:30: + d4:5b:71:36:b4:07:ba:c1:30:30:5c:48:b7:82:3b: + 98:a6:7d:60:8a:a2:a3:29:82:cc:ba:bd:83:04:1b: + a2:83:03:41:a1:d6:05:f1:1b:c2:b6:f0:a8:7c:86: + 3b:46:a8:48:2a:88:dc:76:9a:76:bf:1f:6a:a5:3d: + 19:8f:eb:38:f3:64:de:c8:2b:0d:0a:28:ff:f7:db: + e2:15:42:d4:22:d0:27:5d:e1:79:fe:18:e7:70:88: + ad:4e:e6:d9:8b:3a:c6:dd:27:51:6e:ff:bc:64:f5: + 33:43:4f + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Key Usage: critical + Certificate Sign, CRL Sign + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Subject Key Identifier: + 79:B4:59:E6:7B:B6:E5:E4:01:73:80:08:88:C8:1A:58:F6:E9:9B:6E + Signature Algorithm: sha256WithRSAEncryption + 55:1f:58:a9:bc:b2:a8:50:d0:0c:b1:d8:1a:69:20:27:29:08: + ac:61:75:5c:8a:6e:f8:82:e5:69:2f:d5:f6:56:4b:b9:b8:73: + 10:59:d3:21:97:7e:e7:4c:71:fb:b2:d2:60:ad:39:a8:0b:ea: + 17:21:56:85:f1:50:0e:59:eb:ce:e0:59:e9:ba:c9:15:ef:86: + 9d:8f:84:80:f6:e4:e9:91:90:dc:17:9b:62:1b:45:f0:66:95: + d2:7c:6f:c2:ea:3b:ef:1f:cf:cb:d6:ae:27:f1:a9:b0:c8:ae: + fd:7d:7e:9a:fa:22:04:eb:ff:d9:7f:ea:91:2b:22:b1:17:0e: + 8f:f2:8a:34:5b:58:d8:fc:01:c9:54:b9:b8:26:cc:8a:88:33: + 89:4c:2d:84:3c:82:df:ee:96:57:05:ba:2c:bb:f7:c4:b7:c7: + 4e:3b:82:be:31:c8:22:73:73:92:d1:c2:80:a4:39:39:10:33: + 23:82:4c:3c:9f:86:b2:55:98:1d:be:29:86:8c:22:9b:9e:e2: + 6b:3b:57:3a:82:70:4d:dc:09:c7:89:cb:0a:07:4d:6c:e8:5d: + 8e:c9:ef:ce:ab:c7:bb:b5:2b:4e:45:d6:4a:d0:26:cc:e5:72: + ca:08:6a:a5:95:e3:15:a1:f7:a4:ed:c9:2c:5f:a5:fb:ff:ac: + 28:02:2e:be:d7:7b:bb:e3:71:7b:90:16:d3:07:5e:46:53:7c: + 37:07:42:8c:d3:c4:96:9c:d5:99:b5:2a:e0:95:1a:80:48:ae: + 4c:39:07:ce:cc:47:a4:52:95:2b:ba:b8:fb:ad:d2:33:53:7d: + e5:1d:4d:6d:d5:a1:b1:c7:42:6f:e6:40:27:35:5c:a3:28:b7: + 07:8d:e7:8d:33:90:e7:23:9f:fb:50:9c:79:6c:46:d5:b4:15: + b3:96:6e:7e:9b:0c:96:3a:b8:52:2d:3f:d6:5b:e1:fb:08:c2: + 84:fe:24:a8:a3:89:da:ac:6a:e1:18:2a:b1:a8:43:61:5b:d3: + 1f:dc:3b:8d:76:f2:2d:e8:8d:75:df:17:33:6c:3d:53:fb:7b: + cb:41:5f:ff:dc:a2:d0:61:38:e1:96:b8:ac:5d:8b:37:d7:75: + d5:33:c0:99:11:ae:9d:41:c1:72:75:84:be:02:41:42:5f:67: + 24:48:94:d1:9b:27:be:07:3f:b9:b8:4f:81:74:51:e1:7a:b7: + ed:9d:23:e2:be:e0:d5:28:04:13:3c:31:03:9e:dd:7a:6c:8f: + c6:07:18:c6:7f:de:47:8e:3f:28:9e:04:06:cf:a5:54:34:77: + bd:ec:89:9b:e9:17:43:df:5b:db:5f:fe:8e:1e:57:a2:cd:40: + 9d:7e:62:22:da:de:18:27 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- diff --git a/global-config.rsc b/global-config.rsc index 8a42b81..a0835f8 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -92,11 +92,11 @@ :global FwAddrLists { # "allow"={ # { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/allow"; -# cert="E1"; timeout=1w }; +# cert="E5"; timeout=1w }; # }; "block"={ # { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/block"; -# cert="E1" }; +# cert="E5" }; { url="https://feodotracker.abuse.ch/downloads/ipblocklist_recommended.txt"; cert="GlobalSign Atlas R3 DV TLS CA 2022 Q3" }; { url="https://sslbl.abuse.ch/blacklist/sslipblacklist.txt"; @@ -112,7 +112,7 @@ }; # "mikrotik"={ # { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/mikrotik"; -# cert="E1"; timeout=1w }; +# cert="E5"; timeout=1w }; # }; }; :global FwAddrListTimeOut 1d; diff --git a/global-functions.rsc b/global-functions.rsc index 447d6e9..eb700ef 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -999,7 +999,7 @@ :global SymbolForNotification; :global ValidateSyntax; - :if ([ $CertificateAvailable "E1" ] = false) do={ + :if ([ $CertificateAvailable "E5" ] = false) do={ $LogPrint warning $0 ("Downloading certificate failed, trying without."); } From 35f4ec0b1d1d8c26ec9293efe2d9091993d7bf89 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Jun 2024 10:42:36 +0200 Subject: [PATCH 093/893] doc/mod/notification-matrix: drop certificate hint... ... as matrix.org switched to Let's Encrypt with ISRG Root X2. --- doc/mod/notification-matrix.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/doc/mod/notification-matrix.md b/doc/mod/notification-matrix.md index 92383be..18b6607 100644 --- a/doc/mod/notification-matrix.md +++ b/doc/mod/notification-matrix.md @@ -46,9 +46,6 @@ The Matrix server is connected via encrypted https, and certificate verification is applied. So make sure you have the certificate chain for your server in device's certificate store. -> ℹ️ **Info**: The *matrix.org* server uses a Cloudflare certificate. You can -> install that with: `$CertificateAvailable "Cloudflare Inc ECC CA-3"` - ### From other device If you have setup your Matrix *notification account* before just reuse that. From d1693a241b0ec444d7ad469681e4ba81c1b398df Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Jun 2024 09:50:39 +0200 Subject: [PATCH 094/893] certs: E1 / E5 -> ISRG Root X2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In the beginning of Let's Encrypt their root certificate ISRG Root X1 was not widely trusted, at least some older and/or mobile platforms were missing that certificate in their root certificate store. At that time Let's Encrypt was using an alternative chain of trust, where a certificate was cross-signed with DST Root CA X3. To make sure a valid chain of trust is available under all circumstances a set of all certificates had to be supplied: both root vertificates ISRG Root X1 & DST Root CA X3, and an intermediate certificate. This was still true after DST Root CA X3 expired, as it could still be used as a root anchor and was shipped by Let's Encrypt when requested. 🤪 This time is finally over, and we have a clean chain for trust ending in ISRG Root X1 (or ISRG Root X2). Well, actually it is the other way round... Let's Encrypt signs with different tantamount intermediate certificates. There is not only E5, but also E6 - and we can not know beforehand which one is used on renew. So let's jetzt drop the intermediate certificates now, and rely on root certificates only. We are perfectly fine with this these days. Follow-up commits will do the same for *all* certificates. The certificate is downloaded with: curl -d '["ISRG Root X2"]' https://mkcert.org/generate/ | grep -v '^$' > certs/ISRG-Root-X2.pem --- INITIAL-COMMANDS.md | 9 ++- README.d/01-download-certs.avif | Bin 4578 -> 4596 bytes README.d/02-import-certs.avif | Bin 3606 -> 3605 bytes README.d/03-check-certs.avif | Bin 12118 -> 8932 bytes README.md | 20 +++--- certs/E1.pem | 124 -------------------------------- certs/E5.pem | 119 ------------------------------ certs/ISRG-Root-X2.pem | 21 ++++++ global-config.rsc | 6 +- global-functions.rsc | 2 +- 10 files changed, 38 insertions(+), 263 deletions(-) delete mode 100644 certs/E1.pem delete mode 100644 certs/E5.pem create mode 100644 certs/ISRG-Root-X2.pem diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 889192d..b3eff35 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -17,13 +17,13 @@ Initial commands Run the complete base installation: { - /tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/E5.pem" dst-path="letsencrypt-E5.pem" as-value; + /tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/ISRG-Root-X2.pem" dst-path="ISRG-Root-X2.pem" as-value; :delay 1s; - /certificate/import file-name=letsencrypt-E5.pem passphrase=""; - :if ([ :len [ /certificate/find where fingerprint="e788d14b0436b5120bbee3f15c15badf08c1407fe72568a4f16f9151c380e1e3" or fingerprint="69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470" ] ] != 2) do={ + /certificate/import file-name=ISRG-Root-X2.pem passphrase=""; + :if ([ :len [ /certificate/find where fingerprint="69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470" ] ] != 1) do={ :error "Something is wrong with your certificates!"; }; - /file/remove [ find where name="letsencrypt-E5.pem" ]; + /file/remove [ find where name="ISRG-Root-X2.pem" ]; :delay 1s; /system/script/set name=("global-config-overlay-" . [ /system/clock/get date ] . "-" . [ /system/clock/get time ]) [ find where name="global-config-overlay" ]; :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ @@ -34,7 +34,6 @@ Run the complete base installation: /system/scheduler/remove [ find where name="global-scripts" ]; /system/scheduler/add name="global-scripts" start-time=startup on-event="/system/script { run global-config; run global-functions; }"; :global CertificateNameByCN; - $CertificateNameByCN "E5"; $CertificateNameByCN "ISRG Root X2"; }; diff --git a/README.d/01-download-certs.avif b/README.d/01-download-certs.avif index b543aff2848235791b59fc0805e850a748f17a23..4a074eb59dce96fbf79c0b50dfdf028f7eff9d4f 100644 GIT binary patch delta 2976 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 delta 2958 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�R1WN5% zg-tJ%wPX*GuD@b+3_&3F=D-hV{b&G`{ZV;95^SikZitbU?F~VVRM&x1gelrAyjUKY zn_F8i(`<8UlU`Ix zCa~VK8~U70|EGhk9s!M@h{J?Cg2nm;3=3vgnzn0f9b?QJ4&LNcKGyRnJ3(lEmJpy_ zUTmiPV#jYTnhi^)?6Hxp44pJu$GJM4;v(y$B2}9e&yBFFYodEaJsnPBLWGY v6AxLT2LpoCn6B^KE^+4-CCMJ+U$KG$VAX*k6%!x5arK#GJ@R8$|JKfbcmJgf delta 1460 zcma*c|3A|S0LSr)YHb_>7oup<^(wsn7WgBg}wPIho;=Wl3P z2i*F_t9Y)+-un#}dM(zgKJ^TuD3M!n`Y{R-F?qn_k3aWoc^aVhqv&7-O+?6a5xt8; z9^8~Qmu@BPgT2)tmceCaC2eVyE69y1u(maJg$dV{l6kj}5a+jm=S)ySZ z)PFPQCTvg;GG&5(5H{Eo-Ua!wlS!y@m*=>D> zRkV^S{3Ug-J)hjtwqQrM8Eq=o^cp2DqSo9Vrc`PpSL9G`iu!33b_E0@2Ao$dn}gz<7Iq5P~d$jWWU^fhXs(_s`aJ`%5(7L?PUF7x24l9yzY6a=|1RXuzG6+hN8lo+wRj z2E);N5{(=?#A{tC!!TXarbx}^))Lr>SZv#xC>~To4rTU(06A#&r3mdqz)=KAWw?Ui zdX;gWwU`dh;6h}nP+#@LZkpW<%t<{D5-FAHlM_D=%=j%6w*Fy7jEvmE#FP*2TQ~H6 zst>sfVhYP$tEWdaTL~RUoBtox|B8x- zFBl3ldjq$g1rFJEv(0>^(&Q+H@O1FeWSg@t>iG#2fPN8PXPnFvk~^eV&gy)OO9HwZ zQUXvV_qe5W%kp&9&)k56J{qQ4HUkR(KoLBI#nm}c8n|cdo0TN13bhNcJ0eV)`6E;S z71t6oz*4>zAR9}I+%TThxN*uV}rv=-V;J` z`qUAS+WW?09`ywUiI7Ph^x>B<*G%1le(Q-TNVg1Nu;ALTOz3_Pv6x+$XzlQNKDq3e z?Xb&Nq=1X21wxVLKFQ}u6-#l-Lg?TORhm2+5LjH%uB*?I0g)-W33}e2__8P;Hdua2 zUo2LkReU+9XaB^Uaml*TlY`9nheKbgeM^%*VfM?`ou$Z}fZDk8SmvKuHma#UC8kkr zp(~Y3v{|cSq~)0wMyQ9BeDj>AQ#~ML+o11+Yq`gRSWH7-jm5;5|^Xs?wv)JXHotpBwBnbbTxnJ2uOizp0VhE$6M#{MC()R2qC@F z4UnLb3*y*bC#rx&ciq9aJux295$MsHZ+b5hVo4-Cwo$$5kqfam@9M$qOW1bYzxvXq AY5)KL diff --git a/README.d/03-check-certs.avif b/README.d/03-check-certs.avif index f24c6b567a0696bfd30899f66157ec7c23248212..46b7220f1df02c8379e95113aeb13bf91859de0f 100644 GIT binary patch delta 7712 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 a&VeHE+7Y9`eJGj|@?~PMWFSj}fDV{(%j#DE delta 10923 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 Date: Thu, 20 Jun 2024 09:52:17 +0200 Subject: [PATCH 095/893] certs: R3 / R10 -> ISRG Root X1 --- certs/ISRG-Root-X1.pem | 38 ++++++ certs/R10.pem | 231 ------------------------------------- certs/R3.pem | 237 -------------------------------------- global-config.rsc | 2 +- global-functions.rsc | 2 +- mod/notification-ntfy.rsc | 2 +- 6 files changed, 41 insertions(+), 471 deletions(-) create mode 100644 certs/ISRG-Root-X1.pem delete mode 100644 certs/R10.pem delete mode 100644 certs/R3.pem diff --git a/certs/ISRG-Root-X1.pem b/certs/ISRG-Root-X1.pem new file mode 100644 index 0000000..995c95d --- /dev/null +++ b/certs/ISRG-Root-X1.pem @@ -0,0 +1,38 @@ +# Issuer: CN=ISRG Root X1 O=Internet Security Research Group +# Subject: CN=ISRG Root X1 O=Internet Security Research Group +# Label: "ISRG Root X1" +# Serial: 172886928669790476064670243504169061120 +# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e +# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 +# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- diff --git a/certs/R10.pem b/certs/R10.pem deleted file mode 100644 index e8c1c4a..0000000 --- a/certs/R10.pem +++ /dev/null @@ -1,231 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 4b:a8:52:93:f7:9a:2f:a2:73:06:4b:a8:04:8d:75:d0 - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, O=Internet Security Research Group, CN=ISRG Root X1 - Validity - Not Before: Mar 13 00:00:00 2024 GMT - Not After : Mar 12 23:59:59 2027 GMT - Subject: C=US, O=Let's Encrypt, CN=R10 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) - Modulus: - 00:cf:57:e5:e6:c4:54:12:ed:b4:47:fe:c9:27:58: - 76:46:50:28:8c:1d:3e:88:df:05:9d:d5:b5:18:29: - bd:dd:b5:5a:bf:fa:f6:ce:a3:be:af:00:21:4b:62: - 5a:5a:3c:01:2f:c5:58:03:f6:89:ff:8e:11:43:eb: - c1:b5:e0:14:07:96:8f:6f:1f:d7:e7:ba:81:39:09: - 75:65:b7:c2:af:18:5b:37:26:28:e7:a3:f4:07:2b: - 6d:1a:ff:ab:58:bc:95:ae:40:ff:e9:cb:57:c4:b5: - 5b:7f:78:0d:18:61:bc:17:e7:54:c6:bb:49:91:cd: - 6e:18:d1:80:85:ee:a6:65:36:bc:74:ea:bc:50:4c: - ea:fc:21:f3:38:16:93:94:ba:b0:d3:6b:38:06:cd: - 16:12:7a:ca:52:75:c8:ad:76:b2:c2:9c:5d:98:45: - 5c:6f:61:7b:c6:2d:ee:3c:13:52:86:01:d9:57:e6: - 38:1c:df:8d:b5:1f:92:91:9a:e7:4a:1c:cc:45:a8: - 72:55:f0:b0:e6:a3:07:ec:fd:a7:1b:66:9e:3f:48: - 8b:71:84:71:58:c9:3a:fa:ef:5e:f2:5b:44:2b:3c: - 74:e7:8f:b2:47:c1:07:6a:cd:9a:b7:0d:96:f7:12: - 81:26:51:54:0a:ec:61:f6:f7:f5:e2:f2:8a:c8:95: - 0d:8d - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Extended Key Usage: - TLS Web Client Authentication, TLS Web Server Authentication - X509v3 Basic Constraints: critical - CA:TRUE, pathlen:0 - X509v3 Subject Key Identifier: - BB:BC:C3:47:A5:E4:BC:A9:C6:C3:A4:72:0C:10:8D:A2:35:E1:C8:E8 - X509v3 Authority Key Identifier: - 79:B4:59:E6:7B:B6:E5:E4:01:73:80:08:88:C8:1A:58:F6:E9:9B:6E - Authority Information Access: - CA Issuers - URI:http://x1.i.lencr.org/ - X509v3 Certificate Policies: - Policy: 2.23.140.1.2.1 - X509v3 CRL Distribution Points: - Full Name: - URI:http://x1.c.lencr.org/ - Signature Algorithm: sha256WithRSAEncryption - Signature Value: - 92:b1:e7:41:37:eb:79:9d:81:e6:cd:e2:25:e1:3a:20:e9:90: - 44:95:a3:81:5c:cf:c3:5d:fd:bd:a0:70:d5:b1:96:28:22:0b: - d2:f2:28:cf:0c:e7:d4:e6:43:8c:24:22:1d:c1:42:92:d1:09: - af:9f:4b:f4:c8:70:4f:20:16:b1:5a:dd:01:f6:1f:f8:1f:61: - 6b:14:27:b0:72:8d:63:ae:ee:e2:ce:4b:cf:37:dd:bb:a3:d4: - cd:e7:ad:50:ad:bd:bf:e3:ec:3e:62:36:70:99:31:a7:e8:8d: - dd:ea:62:e2:12:ae:f5:9c:d4:3d:2c:0c:aa:d0:9c:79:be:ea: - 3d:5c:44:6e:96:31:63:5a:7d:d6:7e:4f:24:a0:4b:05:7f:5e: - 6f:d2:d4:ea:5f:33:4b:13:d6:57:b6:ca:de:51:b8:5d:a3:09: - 82:74:fd:c7:78:9e:b3:b9:ac:16:da:4a:2b:96:c3:b6:8b:62: - 8f:f9:74:19:a2:9e:03:de:e9:6f:9b:b0:0f:d2:a0:5a:f6:85: - 5c:c2:04:b7:c8:d5:4e:32:c4:bf:04:5d:bc:29:f6:f7:81:8f: - 0c:5d:3c:53:c9:40:90:8b:fb:b6:08:65:b9:a4:21:d5:09:e5: - 13:84:84:37:82:ce:10:28:fc:76:c2:06:25:7a:46:52:4d:da: - 53:72:a4:27:3f:62:70:ac:be:69:48:00:fb:67:0f:db:5b:a1: - e8:d7:03:21:2d:d7:c9:f6:99:42:39:83:43:df:77:0a:12:08: - f1:25:d6:ba:94:19:54:18:88:a5:c5:8e:e1:1a:99:93:79:6b: - ec:1c:f9:31:40:b0:cc:32:00:df:9f:5e:e7:b4:92:ab:90:82: - 91:8d:0d:e0:1e:95:ba:59:3b:2e:4b:5f:c2:b7:46:35:52:39: - 06:c0:bd:aa:ac:52:c1:22:a0:44:97:99:f7:0c:a0:21:a7:a1: - 6c:71:47:16:17:01:68:c0:ca:a6:26:65:04:7c:b3:ae:c9:e7: - 94:55:c2:6f:9b:3c:1c:a9:f9:2e:c5:20:1a:f0:76:e0:be:ec: - 18:d6:4f:d8:25:fb:76:11:e8:bf:e6:21:0f:e8:e8:cc:b5:b6: - a7:d5:b8:f7:9f:41:cf:61:22:46:6a:83:b6:68:97:2e:7c:ea: - 4e:95:db:23:eb:2e:c8:2b:28:84:a4:60:e9:49:f4:44:2e:3b: - f9:ca:62:57:01:e2:5d:90:16:f9:c9:fc:7a:23:48:8e:a6:d5: - 81:72:f1:28:fa:5d:ce:fb:ed:4e:73:8f:94:2e:d2:41:94:98: - 99:db:a7:af:70:5f:f5:be:fb:02:20:bf:66:27:6c:b4:ad:fa: - 75:12:0b:2b:3e:ce:03:9e ------BEGIN CERTIFICATE----- -MIIFBTCCAu2gAwIBAgIQS6hSk/eaL6JzBkuoBI110DANBgkqhkiG9w0BAQsFADBP -MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy -Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa -Fw0yNzAzMTIyMzU5NTlaMDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF -bmNyeXB0MQwwCgYDVQQDEwNSMTAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQDPV+XmxFQS7bRH/sknWHZGUCiMHT6I3wWd1bUYKb3dtVq/+vbOo76vACFL -YlpaPAEvxVgD9on/jhFD68G14BQHlo9vH9fnuoE5CXVlt8KvGFs3Jijno/QHK20a -/6tYvJWuQP/py1fEtVt/eA0YYbwX51TGu0mRzW4Y0YCF7qZlNrx06rxQTOr8IfM4 -FpOUurDTazgGzRYSespSdcitdrLCnF2YRVxvYXvGLe48E1KGAdlX5jgc3421H5KR -mudKHMxFqHJV8LDmowfs/acbZp4/SItxhHFYyTr6717yW0QrPHTnj7JHwQdqzZq3 -DZb3EoEmUVQK7GH29/Xi8orIlQ2NAgMBAAGjgfgwgfUwDgYDVR0PAQH/BAQDAgGG -MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATASBgNVHRMBAf8ECDAGAQH/ -AgEAMB0GA1UdDgQWBBS7vMNHpeS8qcbDpHIMEI2iNeHI6DAfBgNVHSMEGDAWgBR5 -tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKG -Fmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0gBAwwCjAIBgZngQwBAgEwJwYD -VR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVuY3Iub3JnLzANBgkqhkiG9w0B -AQsFAAOCAgEAkrHnQTfreZ2B5s3iJeE6IOmQRJWjgVzPw139vaBw1bGWKCIL0vIo -zwzn1OZDjCQiHcFCktEJr59L9MhwTyAWsVrdAfYf+B9haxQnsHKNY67u4s5Lzzfd -u6PUzeetUK29v+PsPmI2cJkxp+iN3epi4hKu9ZzUPSwMqtCceb7qPVxEbpYxY1p9 -1n5PJKBLBX9eb9LU6l8zSxPWV7bK3lG4XaMJgnT9x3ies7msFtpKK5bDtotij/l0 -GaKeA97pb5uwD9KgWvaFXMIEt8jVTjLEvwRdvCn294GPDF08U8lAkIv7tghluaQh -1QnlE4SEN4LOECj8dsIGJXpGUk3aU3KkJz9icKy+aUgA+2cP21uh6NcDIS3XyfaZ -QjmDQ993ChII8SXWupQZVBiIpcWO4RqZk3lr7Bz5MUCwzDIA359e57SSq5CCkY0N -4B6Vulk7LktfwrdGNVI5BsC9qqxSwSKgRJeZ9wygIaehbHFHFhcBaMDKpiZlBHyz -rsnnlFXCb5s8HKn5LsUgGvB24L7sGNZP2CX7dhHov+YhD+jozLW2p9W4959Bz2Ei -RmqDtmiXLnzqTpXbI+suyCsohKRg6Un0RC47+cpiVwHiXZAW+cn8eiNIjqbVgXLx -KPpdzvvtTnOPlC7SQZSYmdunr3Bf9b77AiC/ZidstK36dRILKz7OA54= ------END CERTIFICATE----- -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 82:10:cf:b0:d2:40:e3:59:44:63:e0:bb:63:82:8b:00 - Signature Algorithm: sha256WithRSAEncryption - Issuer: C = US, O = Internet Security Research Group, CN = ISRG Root X1 - Validity - Not Before: Jun 4 11:04:38 2015 GMT - Not After : Jun 4 11:04:38 2035 GMT - Subject: C = US, O = Internet Security Research Group, CN = ISRG Root X1 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public-Key: (4096 bit) - Modulus: - 00:ad:e8:24:73:f4:14:37:f3:9b:9e:2b:57:28:1c: - 87:be:dc:b7:df:38:90:8c:6e:3c:e6:57:a0:78:f7: - 75:c2:a2:fe:f5:6a:6e:f6:00:4f:28:db:de:68:86: - 6c:44:93:b6:b1:63:fd:14:12:6b:bf:1f:d2:ea:31: - 9b:21:7e:d1:33:3c:ba:48:f5:dd:79:df:b3:b8:ff: - 12:f1:21:9a:4b:c1:8a:86:71:69:4a:66:66:6c:8f: - 7e:3c:70:bf:ad:29:22:06:f3:e4:c0:e6:80:ae:e2: - 4b:8f:b7:99:7e:94:03:9f:d3:47:97:7c:99:48:23: - 53:e8:38:ae:4f:0a:6f:83:2e:d1:49:57:8c:80:74: - b6:da:2f:d0:38:8d:7b:03:70:21:1b:75:f2:30:3c: - fa:8f:ae:dd:da:63:ab:eb:16:4f:c2:8e:11:4b:7e: - cf:0b:e8:ff:b5:77:2e:f4:b2:7b:4a:e0:4c:12:25: - 0c:70:8d:03:29:a0:e1:53:24:ec:13:d9:ee:19:bf: - 10:b3:4a:8c:3f:89:a3:61:51:de:ac:87:07:94:f4: - 63:71:ec:2e:e2:6f:5b:98:81:e1:89:5c:34:79:6c: - 76:ef:3b:90:62:79:e6:db:a4:9a:2f:26:c5:d0:10: - e1:0e:de:d9:10:8e:16:fb:b7:f7:a8:f7:c7:e5:02: - 07:98:8f:36:08:95:e7:e2:37:96:0d:36:75:9e:fb: - 0e:72:b1:1d:9b:bc:03:f9:49:05:d8:81:dd:05:b4: - 2a:d6:41:e9:ac:01:76:95:0a:0f:d8:df:d5:bd:12: - 1f:35:2f:28:17:6c:d2:98:c1:a8:09:64:77:6e:47: - 37:ba:ce:ac:59:5e:68:9d:7f:72:d6:89:c5:06:41: - 29:3e:59:3e:dd:26:f5:24:c9:11:a7:5a:a3:4c:40: - 1f:46:a1:99:b5:a7:3a:51:6e:86:3b:9e:7d:72:a7: - 12:05:78:59:ed:3e:51:78:15:0b:03:8f:8d:d0:2f: - 05:b2:3e:7b:4a:1c:4b:73:05:12:fc:c6:ea:e0:50: - 13:7c:43:93:74:b3:ca:74:e7:8e:1f:01:08:d0:30: - d4:5b:71:36:b4:07:ba:c1:30:30:5c:48:b7:82:3b: - 98:a6:7d:60:8a:a2:a3:29:82:cc:ba:bd:83:04:1b: - a2:83:03:41:a1:d6:05:f1:1b:c2:b6:f0:a8:7c:86: - 3b:46:a8:48:2a:88:dc:76:9a:76:bf:1f:6a:a5:3d: - 19:8f:eb:38:f3:64:de:c8:2b:0d:0a:28:ff:f7:db: - e2:15:42:d4:22:d0:27:5d:e1:79:fe:18:e7:70:88: - ad:4e:e6:d9:8b:3a:c6:dd:27:51:6e:ff:bc:64:f5: - 33:43:4f - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Subject Key Identifier: - 79:B4:59:E6:7B:B6:E5:E4:01:73:80:08:88:C8:1A:58:F6:E9:9B:6E - Signature Algorithm: sha256WithRSAEncryption - 55:1f:58:a9:bc:b2:a8:50:d0:0c:b1:d8:1a:69:20:27:29:08: - ac:61:75:5c:8a:6e:f8:82:e5:69:2f:d5:f6:56:4b:b9:b8:73: - 10:59:d3:21:97:7e:e7:4c:71:fb:b2:d2:60:ad:39:a8:0b:ea: - 17:21:56:85:f1:50:0e:59:eb:ce:e0:59:e9:ba:c9:15:ef:86: - 9d:8f:84:80:f6:e4:e9:91:90:dc:17:9b:62:1b:45:f0:66:95: - d2:7c:6f:c2:ea:3b:ef:1f:cf:cb:d6:ae:27:f1:a9:b0:c8:ae: - fd:7d:7e:9a:fa:22:04:eb:ff:d9:7f:ea:91:2b:22:b1:17:0e: - 8f:f2:8a:34:5b:58:d8:fc:01:c9:54:b9:b8:26:cc:8a:88:33: - 89:4c:2d:84:3c:82:df:ee:96:57:05:ba:2c:bb:f7:c4:b7:c7: - 4e:3b:82:be:31:c8:22:73:73:92:d1:c2:80:a4:39:39:10:33: - 23:82:4c:3c:9f:86:b2:55:98:1d:be:29:86:8c:22:9b:9e:e2: - 6b:3b:57:3a:82:70:4d:dc:09:c7:89:cb:0a:07:4d:6c:e8:5d: - 8e:c9:ef:ce:ab:c7:bb:b5:2b:4e:45:d6:4a:d0:26:cc:e5:72: - ca:08:6a:a5:95:e3:15:a1:f7:a4:ed:c9:2c:5f:a5:fb:ff:ac: - 28:02:2e:be:d7:7b:bb:e3:71:7b:90:16:d3:07:5e:46:53:7c: - 37:07:42:8c:d3:c4:96:9c:d5:99:b5:2a:e0:95:1a:80:48:ae: - 4c:39:07:ce:cc:47:a4:52:95:2b:ba:b8:fb:ad:d2:33:53:7d: - e5:1d:4d:6d:d5:a1:b1:c7:42:6f:e6:40:27:35:5c:a3:28:b7: - 07:8d:e7:8d:33:90:e7:23:9f:fb:50:9c:79:6c:46:d5:b4:15: - b3:96:6e:7e:9b:0c:96:3a:b8:52:2d:3f:d6:5b:e1:fb:08:c2: - 84:fe:24:a8:a3:89:da:ac:6a:e1:18:2a:b1:a8:43:61:5b:d3: - 1f:dc:3b:8d:76:f2:2d:e8:8d:75:df:17:33:6c:3d:53:fb:7b: - cb:41:5f:ff:dc:a2:d0:61:38:e1:96:b8:ac:5d:8b:37:d7:75: - d5:33:c0:99:11:ae:9d:41:c1:72:75:84:be:02:41:42:5f:67: - 24:48:94:d1:9b:27:be:07:3f:b9:b8:4f:81:74:51:e1:7a:b7: - ed:9d:23:e2:be:e0:d5:28:04:13:3c:31:03:9e:dd:7a:6c:8f: - c6:07:18:c6:7f:de:47:8e:3f:28:9e:04:06:cf:a5:54:34:77: - bd:ec:89:9b:e9:17:43:df:5b:db:5f:fe:8e:1e:57:a2:cd:40: - 9d:7e:62:22:da:de:18:27 ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- diff --git a/certs/R3.pem b/certs/R3.pem deleted file mode 100644 index 837b709..0000000 --- a/certs/R3.pem +++ /dev/null @@ -1,237 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 91:2b:08:4a:cf:0c:18:a7:53:f6:d6:2e:25:a7:5f:5a - Signature Algorithm: sha256WithRSAEncryption - Issuer: C = US, O = Internet Security Research Group, CN = ISRG Root X1 - Validity - Not Before: Sep 4 00:00:00 2020 GMT - Not After : Sep 15 16:00:00 2025 GMT - Subject: C = US, O = Let's Encrypt, CN = R3 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public-Key: (2048 bit) - Modulus: - 00:bb:02:15:28:cc:f6:a0:94:d3:0f:12:ec:8d:55: - 92:c3:f8:82:f1:99:a6:7a:42:88:a7:5d:26:aa:b5: - 2b:b9:c5:4c:b1:af:8e:6b:f9:75:c8:a3:d7:0f:47: - 94:14:55:35:57:8c:9e:a8:a2:39:19:f5:82:3c:42: - a9:4e:6e:f5:3b:c3:2e:db:8d:c0:b0:5c:f3:59:38: - e7:ed:cf:69:f0:5a:0b:1b:be:c0:94:24:25:87:fa: - 37:71:b3:13:e7:1c:ac:e1:9b:ef:db:e4:3b:45:52: - 45:96:a9:c1:53:ce:34:c8:52:ee:b5:ae:ed:8f:de: - 60:70:e2:a5:54:ab:b6:6d:0e:97:a5:40:34:6b:2b: - d3:bc:66:eb:66:34:7c:fa:6b:8b:8f:57:29:99:f8: - 30:17:5d:ba:72:6f:fb:81:c5:ad:d2:86:58:3d:17: - c7:e7:09:bb:f1:2b:f7:86:dc:c1:da:71:5d:d4:46: - e3:cc:ad:25:c1:88:bc:60:67:75:66:b3:f1:18:f7: - a2:5c:e6:53:ff:3a:88:b6:47:a5:ff:13:18:ea:98: - 09:77:3f:9d:53:f9:cf:01:e5:f5:a6:70:17:14:af: - 63:a4:ff:99:b3:93:9d:dc:53:a7:06:fe:48:85:1d: - a1:69:ae:25:75:bb:13:cc:52:03:f5:ed:51:a1:8b: - db:15 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Extended Key Usage: - TLS Web Client Authentication, TLS Web Server Authentication - X509v3 Basic Constraints: critical - CA:TRUE, pathlen:0 - X509v3 Subject Key Identifier: - 14:2E:B3:17:B7:58:56:CB:AE:50:09:40:E6:1F:AF:9D:8B:14:C2:C6 - X509v3 Authority Key Identifier: - keyid:79:B4:59:E6:7B:B6:E5:E4:01:73:80:08:88:C8:1A:58:F6:E9:9B:6E - - Authority Information Access: - CA Issuers - URI:http://x1.i.lencr.org/ - - X509v3 CRL Distribution Points: - - Full Name: - URI:http://x1.c.lencr.org/ - - X509v3 Certificate Policies: - Policy: 2.23.140.1.2.1 - Policy: 1.3.6.1.4.1.44947.1.1.1 - - Signature Algorithm: sha256WithRSAEncryption - 85:ca:4e:47:3e:a3:f7:85:44:85:bc:d5:67:78:b2:98:63:ad: - 75:4d:1e:96:3d:33:65:72:54:2d:81:a0:ea:c3:ed:f8:20:bf: - 5f:cc:b7:70:00:b7:6e:3b:f6:5e:94:de:e4:20:9f:a6:ef:8b: - b2:03:e7:a2:b5:16:3c:91:ce:b4:ed:39:02:e7:7c:25:8a:47: - e6:65:6e:3f:46:f4:d9:f0:ce:94:2b:ee:54:ce:12:bc:8c:27: - 4b:b8:c1:98:2f:a2:af:cd:71:91:4a:08:b7:c8:b8:23:7b:04: - 2d:08:f9:08:57:3e:83:d9:04:33:0a:47:21:78:09:82:27:c3: - 2a:c8:9b:b9:ce:5c:f2:64:c8:c0:be:79:c0:4f:8e:6d:44:0c: - 5e:92:bb:2e:f7:8b:10:e1:e8:1d:44:29:db:59:20:ed:63:b9: - 21:f8:12:26:94:93:57:a0:1d:65:04:c1:0a:22:ae:10:0d:43: - 97:a1:18:1f:7e:e0:e0:86:37:b5:5a:b1:bd:30:bf:87:6e:2b: - 2a:ff:21:4e:1b:05:c3:f5:18:97:f0:5e:ac:c3:a5:b8:6a:f0: - 2e:bc:3b:33:b9:ee:4b:de:cc:fc:e4:af:84:0b:86:3f:c0:55: - 43:36:f6:68:e1:36:17:6a:8e:99:d1:ff:a5:40:a7:34:b7:c0: - d0:63:39:35:39:75:6e:f2:ba:76:c8:93:02:e9:a9:4b:6c:17: - ce:0c:02:d9:bd:81:fb:9f:b7:68:d4:06:65:b3:82:3d:77:53: - f8:8e:79:03:ad:0a:31:07:75:2a:43:d8:55:97:72:c4:29:0e: - f7:c4:5d:4e:c8:ae:46:84:30:d7:f2:85:5f:18:a1:79:bb:e7: - 5e:70:8b:07:e1:86:93:c3:b9:8f:dc:61:71:25:2a:af:df:ed: - 25:50:52:68:8b:92:dc:e5:d6:b5:e3:da:7d:d0:87:6c:84:21: - 31:ae:82:f5:fb:b9:ab:c8:89:17:3d:e1:4c:e5:38:0e:f6:bd: - 2b:bd:96:81:14:eb:d5:db:3d:20:a7:7e:59:d3:e2:f8:58:f9: - 5b:b8:48:cd:fe:5c:4f:16:29:fe:1e:55:23:af:c8:11:b0:8d: - ea:7c:93:90:17:2f:fd:ac:a2:09:47:46:3f:f0:e9:b0:b7:ff: - 28:4d:68:32:d6:67:5e:1e:69:a3:93:b8:f5:9d:8b:2f:0b:d2: - 52:43:a6:6f:32:57:65:4d:32:81:df:38:53:85:5d:7e:5d:66: - 29:ea:b8:dd:e4:95:b5:cd:b5:56:12:42:cd:c4:4e:c6:25:38: - 44:50:6d:ec:ce:00:55:18:fe:e9:49:64:d4:4e:ca:97:9c:b4: - 5b:c0:73:a8:ab:b8:47:c2 ------BEGIN CERTIFICATE----- -MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw -WhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg -RW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cP -R5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdx -sxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8Zutm -NHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxg -Z3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG -/kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYB -Af8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaA -FHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcw -AoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRw -Oi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQB -gt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6W -PTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wl -ikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQz -CkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BIm -lJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4 -avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2 -yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1O -yK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90Ids -hCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+ -HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv -MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX -nLRbwHOoq7hHwg== ------END CERTIFICATE----- -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 82:10:cf:b0:d2:40:e3:59:44:63:e0:bb:63:82:8b:00 - Signature Algorithm: sha256WithRSAEncryption - Issuer: C = US, O = Internet Security Research Group, CN = ISRG Root X1 - Validity - Not Before: Jun 4 11:04:38 2015 GMT - Not After : Jun 4 11:04:38 2035 GMT - Subject: C = US, O = Internet Security Research Group, CN = ISRG Root X1 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public-Key: (4096 bit) - Modulus: - 00:ad:e8:24:73:f4:14:37:f3:9b:9e:2b:57:28:1c: - 87:be:dc:b7:df:38:90:8c:6e:3c:e6:57:a0:78:f7: - 75:c2:a2:fe:f5:6a:6e:f6:00:4f:28:db:de:68:86: - 6c:44:93:b6:b1:63:fd:14:12:6b:bf:1f:d2:ea:31: - 9b:21:7e:d1:33:3c:ba:48:f5:dd:79:df:b3:b8:ff: - 12:f1:21:9a:4b:c1:8a:86:71:69:4a:66:66:6c:8f: - 7e:3c:70:bf:ad:29:22:06:f3:e4:c0:e6:80:ae:e2: - 4b:8f:b7:99:7e:94:03:9f:d3:47:97:7c:99:48:23: - 53:e8:38:ae:4f:0a:6f:83:2e:d1:49:57:8c:80:74: - b6:da:2f:d0:38:8d:7b:03:70:21:1b:75:f2:30:3c: - fa:8f:ae:dd:da:63:ab:eb:16:4f:c2:8e:11:4b:7e: - cf:0b:e8:ff:b5:77:2e:f4:b2:7b:4a:e0:4c:12:25: - 0c:70:8d:03:29:a0:e1:53:24:ec:13:d9:ee:19:bf: - 10:b3:4a:8c:3f:89:a3:61:51:de:ac:87:07:94:f4: - 63:71:ec:2e:e2:6f:5b:98:81:e1:89:5c:34:79:6c: - 76:ef:3b:90:62:79:e6:db:a4:9a:2f:26:c5:d0:10: - e1:0e:de:d9:10:8e:16:fb:b7:f7:a8:f7:c7:e5:02: - 07:98:8f:36:08:95:e7:e2:37:96:0d:36:75:9e:fb: - 0e:72:b1:1d:9b:bc:03:f9:49:05:d8:81:dd:05:b4: - 2a:d6:41:e9:ac:01:76:95:0a:0f:d8:df:d5:bd:12: - 1f:35:2f:28:17:6c:d2:98:c1:a8:09:64:77:6e:47: - 37:ba:ce:ac:59:5e:68:9d:7f:72:d6:89:c5:06:41: - 29:3e:59:3e:dd:26:f5:24:c9:11:a7:5a:a3:4c:40: - 1f:46:a1:99:b5:a7:3a:51:6e:86:3b:9e:7d:72:a7: - 12:05:78:59:ed:3e:51:78:15:0b:03:8f:8d:d0:2f: - 05:b2:3e:7b:4a:1c:4b:73:05:12:fc:c6:ea:e0:50: - 13:7c:43:93:74:b3:ca:74:e7:8e:1f:01:08:d0:30: - d4:5b:71:36:b4:07:ba:c1:30:30:5c:48:b7:82:3b: - 98:a6:7d:60:8a:a2:a3:29:82:cc:ba:bd:83:04:1b: - a2:83:03:41:a1:d6:05:f1:1b:c2:b6:f0:a8:7c:86: - 3b:46:a8:48:2a:88:dc:76:9a:76:bf:1f:6a:a5:3d: - 19:8f:eb:38:f3:64:de:c8:2b:0d:0a:28:ff:f7:db: - e2:15:42:d4:22:d0:27:5d:e1:79:fe:18:e7:70:88: - ad:4e:e6:d9:8b:3a:c6:dd:27:51:6e:ff:bc:64:f5: - 33:43:4f - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Subject Key Identifier: - 79:B4:59:E6:7B:B6:E5:E4:01:73:80:08:88:C8:1A:58:F6:E9:9B:6E - Signature Algorithm: sha256WithRSAEncryption - 55:1f:58:a9:bc:b2:a8:50:d0:0c:b1:d8:1a:69:20:27:29:08: - ac:61:75:5c:8a:6e:f8:82:e5:69:2f:d5:f6:56:4b:b9:b8:73: - 10:59:d3:21:97:7e:e7:4c:71:fb:b2:d2:60:ad:39:a8:0b:ea: - 17:21:56:85:f1:50:0e:59:eb:ce:e0:59:e9:ba:c9:15:ef:86: - 9d:8f:84:80:f6:e4:e9:91:90:dc:17:9b:62:1b:45:f0:66:95: - d2:7c:6f:c2:ea:3b:ef:1f:cf:cb:d6:ae:27:f1:a9:b0:c8:ae: - fd:7d:7e:9a:fa:22:04:eb:ff:d9:7f:ea:91:2b:22:b1:17:0e: - 8f:f2:8a:34:5b:58:d8:fc:01:c9:54:b9:b8:26:cc:8a:88:33: - 89:4c:2d:84:3c:82:df:ee:96:57:05:ba:2c:bb:f7:c4:b7:c7: - 4e:3b:82:be:31:c8:22:73:73:92:d1:c2:80:a4:39:39:10:33: - 23:82:4c:3c:9f:86:b2:55:98:1d:be:29:86:8c:22:9b:9e:e2: - 6b:3b:57:3a:82:70:4d:dc:09:c7:89:cb:0a:07:4d:6c:e8:5d: - 8e:c9:ef:ce:ab:c7:bb:b5:2b:4e:45:d6:4a:d0:26:cc:e5:72: - ca:08:6a:a5:95:e3:15:a1:f7:a4:ed:c9:2c:5f:a5:fb:ff:ac: - 28:02:2e:be:d7:7b:bb:e3:71:7b:90:16:d3:07:5e:46:53:7c: - 37:07:42:8c:d3:c4:96:9c:d5:99:b5:2a:e0:95:1a:80:48:ae: - 4c:39:07:ce:cc:47:a4:52:95:2b:ba:b8:fb:ad:d2:33:53:7d: - e5:1d:4d:6d:d5:a1:b1:c7:42:6f:e6:40:27:35:5c:a3:28:b7: - 07:8d:e7:8d:33:90:e7:23:9f:fb:50:9c:79:6c:46:d5:b4:15: - b3:96:6e:7e:9b:0c:96:3a:b8:52:2d:3f:d6:5b:e1:fb:08:c2: - 84:fe:24:a8:a3:89:da:ac:6a:e1:18:2a:b1:a8:43:61:5b:d3: - 1f:dc:3b:8d:76:f2:2d:e8:8d:75:df:17:33:6c:3d:53:fb:7b: - cb:41:5f:ff:dc:a2:d0:61:38:e1:96:b8:ac:5d:8b:37:d7:75: - d5:33:c0:99:11:ae:9d:41:c1:72:75:84:be:02:41:42:5f:67: - 24:48:94:d1:9b:27:be:07:3f:b9:b8:4f:81:74:51:e1:7a:b7: - ed:9d:23:e2:be:e0:d5:28:04:13:3c:31:03:9e:dd:7a:6c:8f: - c6:07:18:c6:7f:de:47:8e:3f:28:9e:04:06:cf:a5:54:34:77: - bd:ec:89:9b:e9:17:43:df:5b:db:5f:fe:8e:1e:57:a2:cd:40: - 9d:7e:62:22:da:de:18:27 ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- diff --git a/global-config.rsc b/global-config.rsc index 734b51e..f99fdf1 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -102,7 +102,7 @@ { url="https://sslbl.abuse.ch/blacklist/sslipblacklist.txt"; cert="GlobalSign Atlas R3 DV TLS CA 2022 Q3" }; { url="https://www.dshield.org/block.txt"; cidr="/24"; - cert="R3" }; + cert="ISRG Root X1" }; { url="https://lists.blocklist.de/lists/strongips.txt"; cert="Certum Domain Validation CA SHA2" }; # { url="https://www.spamhaus.org/drop/drop.txt"; diff --git a/global-functions.rsc b/global-functions.rsc index 6c5ce02..567444e 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -334,7 +334,7 @@ :return true; } - :if ([ $CertificateAvailable "R3" ] = false) do={ + :if ([ $CertificateAvailable "ISRG Root X1" ] = false) do={ $LogPrint error $0 ("Downloading required certificate failed."); :return false; } diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 4413f07..cdc10e7 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -98,7 +98,7 @@ :do { :if ($NtfyServer = "ntfy.sh") do={ - :if ([ $CertificateAvailable "R3" ] = false) do={ + :if ([ $CertificateAvailable "ISRG Root X1" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); :error false; } From b875d64724a8ac3218b2e0779effe19c1729e11a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Jun 2024 10:25:53 +0200 Subject: [PATCH 096/893] certs: GlobalSign Atlas R3 DV TLS CA 2022 Q3 -> GlobalSign --- .../GlobalSign-Atlas-R3-DV-TLS-CA-2022-Q3.pem | 177 ------------------ certs/GlobalSign.pem | 28 +++ global-config.rsc | 4 +- 3 files changed, 30 insertions(+), 179 deletions(-) delete mode 100644 certs/GlobalSign-Atlas-R3-DV-TLS-CA-2022-Q3.pem create mode 100644 certs/GlobalSign.pem diff --git a/certs/GlobalSign-Atlas-R3-DV-TLS-CA-2022-Q3.pem b/certs/GlobalSign-Atlas-R3-DV-TLS-CA-2022-Q3.pem deleted file mode 100644 index b514c11..0000000 --- a/certs/GlobalSign-Atlas-R3-DV-TLS-CA-2022-Q3.pem +++ /dev/null @@ -1,177 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 7c:2a:0c:21:3f:c6:55:53:45:c9:1f:19:1f:b8:4e:fa - Signature Algorithm: sha256WithRSAEncryption - Issuer: OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign - Validity - Not Before: Apr 20 12:00:00 2022 GMT - Not After : Apr 20 00:00:00 2025 GMT - Subject: C = BE, O = GlobalSign nv-sa, CN = GlobalSign Atlas R3 DV TLS CA 2022 Q3 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) - Modulus: - 00:b8:a8:7a:66:3c:4e:66:9c:ce:37:a5:54:35:4d: - 36:c7:99:d3:a8:27:36:f2:2f:c6:d5:18:3e:e9:09: - dd:05:d6:d7:2c:34:32:7c:08:63:49:d1:10:37:e5: - 78:5d:11:62:ce:6d:fb:2f:3f:37:94:db:8f:7b:30: - e9:5e:2c:d9:55:3f:b2:db:b9:a0:b5:60:37:8b:a4: - 06:32:35:50:a4:09:af:0a:45:ff:a8:1f:9b:65:8e: - dd:4a:e0:40:a1:e3:63:37:58:90:dd:75:3b:fc:0e: - 1c:82:40:98:bd:70:b1:c1:48:14:14:3c:04:4b:69: - dd:d4:9c:01:a6:e9:21:e3:82:0a:fe:e4:aa:bf:34: - a0:8c:cb:c9:79:6e:3e:5c:6a:52:9e:c4:ed:2b:c5: - 69:fe:50:3c:93:9d:b5:ff:2d:28:a8:6c:06:6c:9d: - c5:af:b2:59:fb:59:77:0d:74:7a:88:84:a4:d4:1d: - d4:ba:20:06:cc:b5:1e:48:4e:74:21:15:86:75:c0: - cc:5a:d1:05:cf:57:16:7a:13:17:ec:c2:4a:ae:d5: - 1e:72:aa:22:5a:8c:9c:82:32:c4:10:e6:42:6e:21: - 86:68:7c:80:23:30:35:d3:bd:b0:5e:0a:29:2b:f0: - 14:b1:18:37:d9:59:25:c3:e7:38:d9:e9:d4:2d:36: - 35:65 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Extended Key Usage: - TLS Web Server Authentication, TLS Web Client Authentication - X509v3 Basic Constraints: critical - CA:TRUE, pathlen:0 - X509v3 Subject Key Identifier: - FA:91:39:63:9A:FB:AD:10:24:E5:BE:B5:B9:DA:AB:D9:C4:46:69:AB - X509v3 Authority Key Identifier: - 8F:F0:4B:7F:A8:2E:45:24:AE:4D:50:FA:63:9A:8B:DE:E2:DD:1B:BC - Authority Information Access: - OCSP - URI:http://ocsp2.globalsign.com/rootr3 - CA Issuers - URI:http://secure.globalsign.com/cacert/root-r3.crt - X509v3 CRL Distribution Points: - Full Name: - URI:http://crl.globalsign.com/root-r3.crl - X509v3 Certificate Policies: - Policy: 2.23.140.1.2.1 - Policy: 1.3.6.1.4.1.4146.10.1.3 - Signature Algorithm: sha256WithRSAEncryption - Signature Value: - 14:33:2c:79:e5:3f:82:c6:70:3f:da:59:38:a7:bb:a2:76:ac: - 61:18:05:68:57:d9:0d:fb:8a:46:bc:f1:a8:e8:0c:70:02:1d: - c6:2f:97:ed:36:3e:9e:52:86:2f:5c:62:d8:d5:47:43:9a:73: - d1:2b:25:87:9f:44:b4:14:eb:26:bc:21:47:74:20:bd:9f:a4: - bf:b3:80:1d:4d:35:7d:cd:b9:b5:da:55:f2:90:50:c8:b2:17: - 4e:0e:b4:61:88:29:5f:44:5d:03:7f:57:91:81:d0:eb:30:ae: - d5:2a:ec:82:20:ce:4e:d2:b0:8b:95:02:61:73:d8:69:34:f4: - ad:63:0e:5c:e4:20:1f:a9:7d:ed:8e:e5:1c:04:bb:22:9f:c7: - a9:22:ca:99:3d:02:a7:67:e8:06:2d:fa:04:6b:bb:49:d2:6c: - 99:57:63:6c:2d:c2:61:78:e1:20:b1:fb:f6:bf:e1:82:39:39: - 3c:7b:ef:7d:1a:95:4a:b2:72:da:55:90:ae:ed:dd:e2:70:90: - 7c:1a:ee:b5:32:5a:5d:cf:d6:fa:45:f2:9e:01:0c:31:2f:89: - 84:fe:31:60:0f:fd:ee:a6:5b:84:d5:c7:18:e6:a4:f9:40:30: - 29:18:1e:fe:fc:41:b5:b9:29:05:75:8b:62:1a:5b:22:2e:bf: - e4:59:6c:b0 ------BEGIN CERTIFICATE----- -MIIEjzCCA3egAwIBAgIQfCoMIT/GVVNFyR8ZH7hO+jANBgkqhkiG9w0BAQsFADBM -MSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xv -YmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjAeFw0yMjA0MjAxMjAwMDBaFw0y -NTA0MjAwMDAwMDBaMFgxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWdu -IG52LXNhMS4wLAYDVQQDEyVHbG9iYWxTaWduIEF0bGFzIFIzIERWIFRMUyBDQSAy -MDIyIFEzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuKh6ZjxOZpzO -N6VUNU02x5nTqCc28i/G1Rg+6QndBdbXLDQyfAhjSdEQN+V4XRFizm37Lz83lNuP -ezDpXizZVT+y27mgtWA3i6QGMjVQpAmvCkX/qB+bZY7dSuBAoeNjN1iQ3XU7/A4c -gkCYvXCxwUgUFDwES2nd1JwBpukh44IK/uSqvzSgjMvJeW4+XGpSnsTtK8Vp/lA8 -k521/y0oqGwGbJ3Fr7JZ+1l3DXR6iISk1B3UuiAGzLUeSE50IRWGdcDMWtEFz1cW -ehMX7MJKrtUecqoiWoycgjLEEOZCbiGGaHyAIzA1072wXgopK/AUsRg32Vklw+c4 -2enULTY1ZQIDAQABo4IBXzCCAVswDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQG -CCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQW -BBT6kTljmvutECTlvrW52qvZxEZpqzAfBgNVHSMEGDAWgBSP8Et/qC5FJK5NUPpj -move4t0bvDB7BggrBgEFBQcBAQRvMG0wLgYIKwYBBQUHMAGGImh0dHA6Ly9vY3Nw -Mi5nbG9iYWxzaWduLmNvbS9yb290cjMwOwYIKwYBBQUHMAKGL2h0dHA6Ly9zZWN1 -cmUuZ2xvYmFsc2lnbi5jb20vY2FjZXJ0L3Jvb3QtcjMuY3J0MDYGA1UdHwQvMC0w -K6ApoCeGJWh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5jb20vcm9vdC1yMy5jcmwwIQYD -VR0gBBowGDAIBgZngQwBAgEwDAYKKwYBBAGgMgoBAzANBgkqhkiG9w0BAQsFAAOC -AQEAFDMseeU/gsZwP9pZOKe7onasYRgFaFfZDfuKRrzxqOgMcAIdxi+X7TY+nlKG -L1xi2NVHQ5pz0Sslh59EtBTrJrwhR3QgvZ+kv7OAHU01fc25tdpV8pBQyLIXTg60 -YYgpX0RdA39XkYHQ6zCu1SrsgiDOTtKwi5UCYXPYaTT0rWMOXOQgH6l97Y7lHAS7 -Ip/HqSLKmT0Cp2foBi36BGu7SdJsmVdjbC3CYXjhILH79r/hgjk5PHvvfRqVSrJy -2lWQru3d4nCQfBrutTJaXc/W+kXyngEMMS+JhP4xYA/97qZbhNXHGOak+UAwKRge -/vxBtbkpBXWLYhpbIi6/5FlssA== ------END CERTIFICATE----- -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 04:00:00:00:00:01:21:58:53:08:a2 - Signature Algorithm: sha256WithRSAEncryption - Issuer: OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign - Validity - Not Before: Mar 18 10:00:00 2009 GMT - Not After : Mar 18 10:00:00 2029 GMT - Subject: OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) - Modulus: - 00:cc:25:76:90:79:06:78:22:16:f5:c0:83:b6:84: - ca:28:9e:fd:05:76:11:c5:ad:88:72:fc:46:02:43: - c7:b2:8a:9d:04:5f:24:cb:2e:4b:e1:60:82:46:e1: - 52:ab:0c:81:47:70:6c:dd:64:d1:eb:f5:2c:a3:0f: - 82:3d:0c:2b:ae:97:d7:b6:14:86:10:79:bb:3b:13: - 80:77:8c:08:e1:49:d2:6a:62:2f:1f:5e:fa:96:68: - df:89:27:95:38:9f:06:d7:3e:c9:cb:26:59:0d:73: - de:b0:c8:e9:26:0e:83:15:c6:ef:5b:8b:d2:04:60: - ca:49:a6:28:f6:69:3b:f6:cb:c8:28:91:e5:9d:8a: - 61:57:37:ac:74:14:dc:74:e0:3a:ee:72:2f:2e:9c: - fb:d0:bb:bf:f5:3d:00:e1:06:33:e8:82:2b:ae:53: - a6:3a:16:73:8c:dd:41:0e:20:3a:c0:b4:a7:a1:e9: - b2:4f:90:2e:32:60:e9:57:cb:b9:04:92:68:68:e5: - 38:26:60:75:b2:9f:77:ff:91:14:ef:ae:20:49:fc: - ad:40:15:48:d1:02:31:61:19:5e:b8:97:ef:ad:77: - b7:64:9a:7a:bf:5f:c1:13:ef:9b:62:fb:0d:6c:e0: - 54:69:16:a9:03:da:6e:e9:83:93:71:76:c6:69:85: - 82:17 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Subject Key Identifier: - 8F:F0:4B:7F:A8:2E:45:24:AE:4D:50:FA:63:9A:8B:DE:E2:DD:1B:BC - Signature Algorithm: sha256WithRSAEncryption - Signature Value: - 4b:40:db:c0:50:aa:fe:c8:0c:ef:f7:96:54:45:49:bb:96:00: - 09:41:ac:b3:13:86:86:28:07:33:ca:6b:e6:74:b9:ba:00:2d: - ae:a4:0a:d3:f5:f1:f1:0f:8a:bf:73:67:4a:83:c7:44:7b:78: - e0:af:6e:6c:6f:03:29:8e:33:39:45:c3:8e:e4:b9:57:6c:aa: - fc:12:96:ec:53:c6:2d:e4:24:6c:b9:94:63:fb:dc:53:68:67: - 56:3e:83:b8:cf:35:21:c3:c9:68:fe:ce:da:c2:53:aa:cc:90: - 8a:e9:f0:5d:46:8c:95:dd:7a:58:28:1a:2f:1d:de:cd:00:37: - 41:8f:ed:44:6d:d7:53:28:97:7e:f3:67:04:1e:15:d7:8a:96: - b4:d3:de:4c:27:a4:4c:1b:73:73:76:f4:17:99:c2:1f:7a:0e: - e3:2d:08:ad:0a:1c:2c:ff:3c:ab:55:0e:0f:91:7e:36:eb:c3: - 57:49:be:e1:2e:2d:7c:60:8b:c3:41:51:13:23:9d:ce:f7:32: - 6b:94:01:a8:99:e7:2c:33:1f:3a:3b:25:d2:86:40:ce:3b:2c: - 86:78:c9:61:2f:14:ba:ee:db:55:6f:df:84:ee:05:09:4d:bd: - 28:d8:72:ce:d3:62:50:65:1e:eb:92:97:83:31:d9:b3:b5:ca: - 47:58:3f:5f ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- diff --git a/certs/GlobalSign.pem b/certs/GlobalSign.pem new file mode 100644 index 0000000..47035e4 --- /dev/null +++ b/certs/GlobalSign.pem @@ -0,0 +1,28 @@ +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- diff --git a/global-config.rsc b/global-config.rsc index f99fdf1..16de721 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -98,9 +98,9 @@ # { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/block"; # cert="ISRG Root X2" }; { url="https://feodotracker.abuse.ch/downloads/ipblocklist_recommended.txt"; - cert="GlobalSign Atlas R3 DV TLS CA 2022 Q3" }; + cert="GlobalSign" }; { url="https://sslbl.abuse.ch/blacklist/sslipblacklist.txt"; - cert="GlobalSign Atlas R3 DV TLS CA 2022 Q3" }; + cert="GlobalSign" }; { url="https://www.dshield.org/block.txt"; cidr="/24"; cert="ISRG Root X1" }; { url="https://lists.blocklist.de/lists/strongips.txt"; From 944e125ef9186d933609c131dfdd85178a57453b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Jun 2024 10:29:40 +0200 Subject: [PATCH 097/893] certs: Certum Domain Validation CA SHA2 -> Certum Trusted Network CA --- certs/Certum-Domain-Validation-CA-SHA2.pem | 176 --------------------- certs/Certum-Trusted-Network-CA.pem | 29 ++++ global-config.rsc | 2 +- 3 files changed, 30 insertions(+), 177 deletions(-) delete mode 100644 certs/Certum-Domain-Validation-CA-SHA2.pem create mode 100644 certs/Certum-Trusted-Network-CA.pem diff --git a/certs/Certum-Domain-Validation-CA-SHA2.pem b/certs/Certum-Domain-Validation-CA-SHA2.pem deleted file mode 100644 index 0cc17ac..0000000 --- a/certs/Certum-Domain-Validation-CA-SHA2.pem +++ /dev/null @@ -1,176 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 279744 (0x444c0) - Signature Algorithm: sha1WithRSAEncryption - Issuer: C=PL, O=Unizeto Technologies S.A., OU=Certum Certification Authority, CN=Certum Trusted Network CA - Validity - Not Before: Oct 22 12:07:37 2008 GMT - Not After : Dec 31 12:07:37 2029 GMT - Subject: C=PL, O=Unizeto Technologies S.A., OU=Certum Certification Authority, CN=Certum Trusted Network CA - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) - Modulus: - 00:e3:fb:7d:a3:72:ba:c2:f0:c9:14:87:f5:6b:01: - 4e:e1:6e:40:07:ba:6d:27:5d:7f:f7:5b:2d:b3:5a: - c7:51:5f:ab:a4:32:a6:61:87:b6:6e:0f:86:d2:30: - 02:97:f8:d7:69:57:a1:18:39:5d:6a:64:79:c6:01: - 59:ac:3c:31:4a:38:7c:d2:04:d2:4b:28:e8:20:5f: - 3b:07:a2:cc:4d:73:db:f3:ae:4f:c7:56:d5:5a:a7: - 96:89:fa:f3:ab:68:d4:23:86:59:27:cf:09:27:bc: - ac:6e:72:83:1c:30:72:df:e0:a2:e9:d2:e1:74:75: - 19:bd:2a:9e:7b:15:54:04:1b:d7:43:39:ad:55:28: - c5:e2:1a:bb:f4:c0:e4:ae:38:49:33:cc:76:85:9f: - 39:45:d2:a4:9e:f2:12:8c:51:f8:7c:e4:2d:7f:f5: - ac:5f:eb:16:9f:b1:2d:d1:ba:cc:91:42:77:4c:25: - c9:90:38:6f:db:f0:cc:fb:8e:1e:97:59:3e:d5:60: - 4e:e6:05:28:ed:49:79:13:4b:ba:48:db:2f:f9:72: - d3:39:ca:fe:1f:d8:34:72:f5:b4:40:cf:31:01:c3: - ec:de:11:2d:17:5d:1f:b8:50:d1:5e:19:a7:69:de: - 07:33:28:ca:50:95:f9:a7:54:cb:54:86:50:45:a9: - f9:49 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Subject Key Identifier: - 08:76:CD:CB:07:FF:24:F6:C5:CD:ED:BB:90:BC:E2:84:37:46:75:F7 - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - Signature Algorithm: sha1WithRSAEncryption - Signature Value: - a6:a8:ad:22:ce:01:3d:a6:a3:ff:62:d0:48:9d:8b:5e:72:b0: - 78:44:e3:dc:1c:af:09:fd:23:48:fa:bd:2a:c4:b9:55:04:b5: - 10:a3:8d:27:de:0b:82:63:d0:ee:de:0c:37:79:41:5b:22:b2: - b0:9a:41:5c:a6:70:e0:d4:d0:77:cb:23:d3:00:e0:6c:56:2f: - e1:69:0d:0d:d9:aa:bf:21:81:50:d9:06:a5:a8:ff:95:37:d0: - aa:fe:e2:b3:f5:99:2d:45:84:8a:e5:42:09:d7:74:02:2f:f7: - 89:d8:99:e9:bc:27:d4:47:8d:ba:0d:46:1c:77:cf:14:a4:1c: - b9:a4:31:c4:9c:28:74:03:34:ff:33:19:26:a5:e9:0d:74:b7: - 3e:97:c6:76:e8:27:96:a3:66:dd:e1:ae:f2:41:5b:ca:98:56: - 83:73:70:e4:86:1a:d2:31:41:ba:2f:be:2d:13:5a:76:6f:4e: - e8:4e:81:0e:3f:5b:03:22:a0:12:be:66:58:11:4a:cb:03:c4: - b4:2a:2a:2d:96:17:e0:39:54:bc:48:d3:76:27:9d:9a:2d:06: - a6:c9:ec:39:d2:ab:db:9f:9a:0b:27:02:35:29:b1:40:95:e7: - f9:e8:9c:55:88:19:46:d6:b7:34:f5:7e:ce:39:9a:d9:38:f1: - 51:f7:4f:2c ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM -MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D -ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU -cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 -WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg -Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw -IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH -UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM -TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU -BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM -kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x -AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV -HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y -sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL -I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 -J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY -VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 26:dd:d2:2b:46:c9:c4:4d:5a:69:4d:39:80:7e:72:ad - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=PL, O=Unizeto Technologies S.A., OU=Certum Certification Authority, CN=Certum Trusted Network CA - Validity - Not Before: Sep 11 12:00:00 2014 GMT - Not After : Jun 9 10:46:39 2027 GMT - Subject: C=PL, O=Unizeto Technologies S.A., OU=Certum Certification Authority, CN=Certum Domain Validation CA SHA2 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) - Modulus: - 00:a1:25:63:df:8d:e4:20:07:d9:54:d1:d1:04:f6: - 17:e2:3e:47:fb:c3:74:25:b8:c4:bf:12:12:bc:e0: - 70:d1:39:05:c2:17:b3:f7:82:70:a0:4e:07:fe:10: - 2a:ff:db:0d:46:5e:24:94:a3:8b:45:9f:18:9b:ce: - 42:c4:ae:db:83:33:bc:c2:bb:b4:30:b6:a7:37:87: - 78:7b:48:cb:25:2c:82:bb:0a:48:12:60:76:89:ec: - 8e:cc:8f:1e:52:48:e9:86:02:5a:c2:b0:8a:7c:85: - 3d:d9:ff:60:4f:33:6c:a6:a1:a0:85:e1:d7:53:f2: - ea:27:3d:65:a9:72:c1:08:83:cc:b0:25:9c:11:46: - 24:e0:3e:f4:a7:ef:ed:51:b1:65:93:42:b4:f6:e6: - 86:0a:10:79:32:36:58:b2:6b:a8:dc:d5:7a:1e:9d: - 14:ee:40:e7:b2:46:4c:bd:9a:29:c2:ec:f8:30:c1: - 62:02:2a:e2:1c:83:62:d0:85:36:1a:83:de:12:84: - 29:65:ef:d2:32:be:31:60:42:a8:cf:f8:dd:ea:d0: - 56:47:1d:bd:76:96:24:13:e7:be:d9:99:2b:fa:30: - 64:f1:8a:38:7a:a6:e1:2a:96:02:b0:9d:ba:d8:8f: - 6d:4e:7a:94:69:7d:b0:93:aa:74:e5:93:90:13:fa: - a2:99 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Subject Key Identifier: - E5:31:AD:BF:3A:11:96:F4:83:BC:50:3C:D4:B7:90:9B:90:EE:DE:25 - X509v3 Authority Key Identifier: - 08:76:CD:CB:07:FF:24:F6:C5:CD:ED:BB:90:BC:E2:84:37:46:75:F7 - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 CRL Distribution Points: - Full Name: - URI:http://crl.certum.pl/ctnca.crl - Authority Information Access: - OCSP - URI:http://subca.ocsp-certum.com - CA Issuers - URI:http://repository.certum.pl/ctnca.cer - X509v3 Certificate Policies: - Policy: X509v3 Any Policy - CPS: http://www.certum.pl/CPS - Signature Algorithm: sha256WithRSAEncryption - Signature Value: - ba:bf:f0:e1:dd:4d:2b:42:43:64:58:df:64:f3:ff:80:1a:5f: - 56:be:3b:a9:b2:76:f7:54:7a:4c:30:c1:99:24:4b:72:d2:ca: - d4:fa:08:c6:90:de:88:12:ed:f8:90:f9:fc:a9:84:fd:92:f2: - 78:e5:db:c9:22:57:ab:41:30:42:6b:0b:9f:d7:73:33:fb:01: - 67:1c:42:5c:8f:27:67:c7:6e:07:03:8d:0e:96:cb:0a:03:cc: - 3e:f8:87:3c:35:30:cd:18:8c:d5:71:dd:cd:dd:61:b0:13:a3: - 64:46:4e:fe:71:4e:6b:65:e9:14:04:f2:3f:a8:bd:0c:36:3d: - 2a:5d:9e:07:f2:c2:4f:90:c5:5e:4d:18:37:d1:27:28:80:a4: - 36:e5:ca:93:6a:65:0e:f8:93:b9:af:52:58:4b:7a:71:d8:ba: - f3:ef:d2:f3:f6:a2:97:e4:5d:14:02:9a:cb:e5:ae:b6:93:e1: - 23:9f:9b:3f:46:f7:ee:8e:a1:00:5b:66:c3:1e:68:23:86:0f: - 5d:77:ba:53:ad:f9:52:fb:70:15:c5:75:eb:cf:79:ad:49:7c: - f2:76:62:ae:44:2f:c5:5f:51:34:25:41:6a:12:0a:5f:8e:ae: - 10:c4:43:89:35:fd:ec:ff:31:e6:ec:1e:87:e9:3a:7c:29:50: - 45:41:a3:14 ------BEGIN CERTIFICATE----- -MIIEzjCCA7agAwIBAgIQJt3SK0bJxE1aaU05gH5yrTANBgkqhkiG9w0BAQsFADB+ -MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5B -LjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIwIAYD -VQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMB4XDTE0MDkxMTEyMDAwMFoX -DTI3MDYwOTEwNDYzOVowgYUxCzAJBgNVBAYTAlBMMSIwIAYDVQQKExlVbml6ZXRv -IFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkxKTAnBgNVBAMTIENlcnR1bSBEb21haW4gVmFsaWRhdGlvbiBD -QSBTSEEyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoSVj343kIAfZ -VNHRBPYX4j5H+8N0JbjEvxISvOBw0TkFwhez94JwoE4H/hAq/9sNRl4klKOLRZ8Y -m85CxK7bgzO8wru0MLanN4d4e0jLJSyCuwpIEmB2ieyOzI8eUkjphgJawrCKfIU9 -2f9gTzNspqGgheHXU/LqJz1lqXLBCIPMsCWcEUYk4D70p+/tUbFlk0K09uaGChB5 -MjZYsmuo3NV6Hp0U7kDnskZMvZopwuz4MMFiAiriHINi0IU2GoPeEoQpZe/SMr4x -YEKoz/jd6tBWRx29dpYkE+e+2Zkr+jBk8Yo4eqbhKpYCsJ262I9tTnqUaX2wk6p0 -5ZOQE/qimQIDAQABo4IBPjCCATowDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU -5TGtvzoRlvSDvFA81LeQm5Du3iUwHwYDVR0jBBgwFoAUCHbNywf/JPbFze27kLzi -hDdGdfcwDgYDVR0PAQH/BAQDAgEGMC8GA1UdHwQoMCYwJKAioCCGHmh0dHA6Ly9j -cmwuY2VydHVtLnBsL2N0bmNhLmNybDBrBggrBgEFBQcBAQRfMF0wKAYIKwYBBQUH -MAGGHGh0dHA6Ly9zdWJjYS5vY3NwLWNlcnR1bS5jb20wMQYIKwYBBQUHMAKGJWh0 -dHA6Ly9yZXBvc2l0b3J5LmNlcnR1bS5wbC9jdG5jYS5jZXIwOQYDVR0gBDIwMDAu -BgRVHSAAMCYwJAYIKwYBBQUHAgEWGGh0dHA6Ly93d3cuY2VydHVtLnBsL0NQUzAN -BgkqhkiG9w0BAQsFAAOCAQEAur/w4d1NK0JDZFjfZPP/gBpfVr47qbJ291R6TDDB -mSRLctLK1PoIxpDeiBLt+JD5/KmE/ZLyeOXbySJXq0EwQmsLn9dzM/sBZxxCXI8n -Z8duBwONDpbLCgPMPviHPDUwzRiM1XHdzd1hsBOjZEZO/nFOa2XpFATyP6i9DDY9 -Kl2eB/LCT5DFXk0YN9EnKICkNuXKk2plDviTua9SWEt6cdi68+/S8/ail+RdFAKa -y+WutpPhI5+bP0b37o6hAFtmwx5oI4YPXXe6U635UvtwFcV16895rUl88nZirkQv -xV9RNCVBahIKX46uEMRDiTX97P8x5uweh+k6fClQRUGjFA== ------END CERTIFICATE----- diff --git a/certs/Certum-Trusted-Network-CA.pem b/certs/Certum-Trusted-Network-CA.pem new file mode 100644 index 0000000..a48e706 --- /dev/null +++ b/certs/Certum-Trusted-Network-CA.pem @@ -0,0 +1,29 @@ +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- diff --git a/global-config.rsc b/global-config.rsc index 16de721..73a9ca0 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -104,7 +104,7 @@ { url="https://www.dshield.org/block.txt"; cidr="/24"; cert="ISRG Root X1" }; { url="https://lists.blocklist.de/lists/strongips.txt"; - cert="Certum Domain Validation CA SHA2" }; + cert="Certum Trusted Network CA" }; # { url="https://www.spamhaus.org/drop/drop.txt"; # cert="Cloudflare Inc ECC CA-3" }; # { url="https://www.spamhaus.org/drop/edrop.txt"; From 7553870f2aac7182f5181273fb4a73e219fc68c7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Jun 2024 10:32:01 +0200 Subject: [PATCH 098/893] certs: Cloudflare Inc ECC CA-3 -> Baltimore CyberTrust Root --- certs/Baltimore-CyberTrust-Root.pem | 28 +++++ certs/Cloudflare-Inc-ECC-CA-3.pem | 163 ---------------------------- global-config.rsc | 4 +- 3 files changed, 30 insertions(+), 165 deletions(-) create mode 100644 certs/Baltimore-CyberTrust-Root.pem delete mode 100644 certs/Cloudflare-Inc-ECC-CA-3.pem diff --git a/certs/Baltimore-CyberTrust-Root.pem b/certs/Baltimore-CyberTrust-Root.pem new file mode 100644 index 0000000..de8121a --- /dev/null +++ b/certs/Baltimore-CyberTrust-Root.pem @@ -0,0 +1,28 @@ +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- diff --git a/certs/Cloudflare-Inc-ECC-CA-3.pem b/certs/Cloudflare-Inc-ECC-CA-3.pem deleted file mode 100644 index fa91603..0000000 --- a/certs/Cloudflare-Inc-ECC-CA-3.pem +++ /dev/null @@ -1,163 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 0a:37:87:64:5e:5f:b4:8c:22:4e:fd:1b:ed:14:0c:3c - Signature Algorithm: sha256WithRSAEncryption - Issuer: C = IE, O = Baltimore, OU = CyberTrust, CN = Baltimore CyberTrust Root - Validity - Not Before: Jan 27 12:48:08 2020 GMT - Not After : Dec 31 23:59:59 2024 GMT - Subject: C = US, O = "Cloudflare, Inc.", CN = Cloudflare Inc ECC CA-3 - Subject Public Key Info: - Public Key Algorithm: id-ecPublicKey - Public-Key: (256 bit) - pub: - 04:b9:ad:4d:66:99:14:0b:46:ec:1f:81:d1:2a:50: - 1e:9d:03:15:2f:34:12:7d:2d:96:b8:88:38:9b:85: - 5f:8f:bf:bb:4d:ef:61:46:c4:c9:73:d4:24:4f:e0: - ee:1c:ce:6c:b3:51:71:2f:6a:ee:4c:05:09:77:d3: - 72:62:a4:9b:d7 - ASN1 OID: prime256v1 - NIST CURVE: P-256 - X509v3 extensions: - X509v3 Subject Key Identifier: - A5:CE:37:EA:EB:B0:75:0E:94:67:88:B4:45:FA:D9:24:10:87:96:1F - X509v3 Authority Key Identifier: - E5:9D:59:30:82:47:58:CC:AC:FA:08:54:36:86:7B:3A:B5:04:4D:F0 - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Extended Key Usage: - TLS Web Server Authentication, TLS Web Client Authentication - X509v3 Basic Constraints: critical - CA:TRUE, pathlen:0 - Authority Information Access: - OCSP - URI:http://ocsp.digicert.com - X509v3 CRL Distribution Points: - Full Name: - URI:http://crl3.digicert.com/Omniroot2025.crl - X509v3 Certificate Policies: - Policy: 2.16.840.1.114412.1.1 - CPS: https://www.digicert.com/CPS - Policy: 2.16.840.1.114412.1.2 - Policy: 2.23.140.1.2.1 - Policy: 2.23.140.1.2.2 - Policy: 2.23.140.1.2.3 - Signature Algorithm: sha256WithRSAEncryption - Signature Value: - 05:24:1d:dd:1b:b0:2a:eb:98:d6:85:e3:39:4d:5e:6b:57:9d: - 82:57:fc:eb:e8:31:a2:57:90:65:05:be:16:44:38:5a:77:02: - b9:cf:10:42:c6:e1:92:a4:e3:45:27:f8:00:47:2c:68:a8:56: - 99:53:54:8f:ad:9e:40:c1:d0:0f:b6:d7:0d:0b:38:48:6c:50: - 2c:49:90:06:5b:64:1d:8b:cc:48:30:2e:de:08:e2:9b:49:22: - c0:92:0c:11:5e:96:92:94:d5:fc:20:dc:56:6c:e5:92:93:bf: - 7a:1c:c0:37:e3:85:49:15:fa:2b:e1:74:39:18:0f:b7:da:f3: - a2:57:58:60:4f:cc:8e:94:00:fc:46:7b:34:31:3e:4d:47:82: - 81:3a:cb:f4:89:5d:0e:ef:4d:0d:6e:9c:1b:82:24:dd:32:25: - 5d:11:78:51:10:3d:a0:35:23:04:2f:65:6f:9c:c1:d1:43:d7: - d0:1e:f3:31:67:59:27:dd:6b:d2:75:09:93:11:24:24:14:cf: - 29:be:e6:23:c3:b8:8f:72:3f:e9:07:c8:24:44:53:7a:b3:b9: - 61:65:a1:4c:0e:c6:48:00:c9:75:63:05:87:70:45:52:83:d3: - 95:9d:45:ea:f0:e8:31:1d:7e:09:1f:0a:fe:3e:dd:aa:3c:5e: - 74:d2:ac:b1 ------BEGIN CERTIFICATE----- -MIIDzTCCArWgAwIBAgIQCjeHZF5ftIwiTv0b7RQMPDANBgkqhkiG9w0BAQsFADBa -MQswCQYDVQQGEwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJl -clRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTIw -MDEyNzEyNDgwOFoXDTI0MTIzMTIzNTk1OVowSjELMAkGA1UEBhMCVVMxGTAXBgNV -BAoTEENsb3VkZmxhcmUsIEluYy4xIDAeBgNVBAMTF0Nsb3VkZmxhcmUgSW5jIEVD -QyBDQS0zMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEua1NZpkUC0bsH4HRKlAe -nQMVLzQSfS2WuIg4m4Vfj7+7Te9hRsTJc9QkT+DuHM5ss1FxL2ruTAUJd9NyYqSb -16OCAWgwggFkMB0GA1UdDgQWBBSlzjfq67B1DpRniLRF+tkkEIeWHzAfBgNVHSME -GDAWgBTlnVkwgkdYzKz6CFQ2hns6tQRN8DAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0l -BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8CAQAwNAYI -KwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5j -b20wOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL09t -bmlyb290MjAyNS5jcmwwbQYDVR0gBGYwZDA3BglghkgBhv1sAQEwKjAoBggrBgEF -BQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzALBglghkgBhv1sAQIw -CAYGZ4EMAQIBMAgGBmeBDAECAjAIBgZngQwBAgMwDQYJKoZIhvcNAQELBQADggEB -AAUkHd0bsCrrmNaF4zlNXmtXnYJX/OvoMaJXkGUFvhZEOFp3ArnPEELG4ZKk40Un -+ABHLGioVplTVI+tnkDB0A+21w0LOEhsUCxJkAZbZB2LzEgwLt4I4ptJIsCSDBFe -lpKU1fwg3FZs5ZKTv3ocwDfjhUkV+ivhdDkYD7fa86JXWGBPzI6UAPxGezQxPk1H -goE6y/SJXQ7vTQ1unBuCJN0yJV0ReFEQPaA1IwQvZW+cwdFD19Ae8zFnWSfda9J1 -CZMRJCQUzym+5iPDuI9yP+kHyCREU3qzuWFloUwOxkgAyXVjBYdwRVKD05WdRerw -6DEdfgkfCv4+3ao8XnTSrLE= ------END CERTIFICATE----- -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 33554617 (0x20000b9) - Signature Algorithm: sha1WithRSAEncryption - Issuer: C = IE, O = Baltimore, OU = CyberTrust, CN = Baltimore CyberTrust Root - Validity - Not Before: May 12 18:46:00 2000 GMT - Not After : May 12 23:59:00 2025 GMT - Subject: C = IE, O = Baltimore, OU = CyberTrust, CN = Baltimore CyberTrust Root - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) - Modulus: - 00:a3:04:bb:22:ab:98:3d:57:e8:26:72:9a:b5:79: - d4:29:e2:e1:e8:95:80:b1:b0:e3:5b:8e:2b:29:9a: - 64:df:a1:5d:ed:b0:09:05:6d:db:28:2e:ce:62:a2: - 62:fe:b4:88:da:12:eb:38:eb:21:9d:c0:41:2b:01: - 52:7b:88:77:d3:1c:8f:c7:ba:b9:88:b5:6a:09:e7: - 73:e8:11:40:a7:d1:cc:ca:62:8d:2d:e5:8f:0b:a6: - 50:d2:a8:50:c3:28:ea:f5:ab:25:87:8a:9a:96:1c: - a9:67:b8:3f:0c:d5:f7:f9:52:13:2f:c2:1b:d5:70: - 70:f0:8f:c0:12:ca:06:cb:9a:e1:d9:ca:33:7a:77: - d6:f8:ec:b9:f1:68:44:42:48:13:d2:c0:c2:a4:ae: - 5e:60:fe:b6:a6:05:fc:b4:dd:07:59:02:d4:59:18: - 98:63:f5:a5:63:e0:90:0c:7d:5d:b2:06:7a:f3:85: - ea:eb:d4:03:ae:5e:84:3e:5f:ff:15:ed:69:bc:f9: - 39:36:72:75:cf:77:52:4d:f3:c9:90:2c:b9:3d:e5: - c9:23:53:3f:1f:24:98:21:5c:07:99:29:bd:c6:3a: - ec:e7:6e:86:3a:6b:97:74:63:33:bd:68:18:31:f0: - 78:8d:76:bf:fc:9e:8e:5d:2a:86:a7:4d:90:dc:27: - 1a:39 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Subject Key Identifier: - E5:9D:59:30:82:47:58:CC:AC:FA:08:54:36:86:7B:3A:B5:04:4D:F0 - X509v3 Basic Constraints: critical - CA:TRUE, pathlen:3 - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - Signature Algorithm: sha1WithRSAEncryption - Signature Value: - 85:0c:5d:8e:e4:6f:51:68:42:05:a0:dd:bb:4f:27:25:84:03: - bd:f7:64:fd:2d:d7:30:e3:a4:10:17:eb:da:29:29:b6:79:3f: - 76:f6:19:13:23:b8:10:0a:f9:58:a4:d4:61:70:bd:04:61:6a: - 12:8a:17:d5:0a:bd:c5:bc:30:7c:d6:e9:0c:25:8d:86:40:4f: - ec:cc:a3:7e:38:c6:37:11:4f:ed:dd:68:31:8e:4c:d2:b3:01: - 74:ee:be:75:5e:07:48:1a:7f:70:ff:16:5c:84:c0:79:85:b8: - 05:fd:7f:be:65:11:a3:0f:c0:02:b4:f8:52:37:39:04:d5:a9: - 31:7a:18:bf:a0:2a:f4:12:99:f7:a3:45:82:e3:3c:5e:f5:9d: - 9e:b5:c8:9e:7c:2e:c8:a4:9e:4e:08:14:4b:6d:fd:70:6d:6b: - 1a:63:bd:64:e6:1f:b7:ce:f0:f2:9f:2e:bb:1b:b7:f2:50:88: - 73:92:c2:e2:e3:16:8d:9a:32:02:ab:8e:18:dd:e9:10:11:ee: - 7e:35:ab:90:af:3e:30:94:7a:d0:33:3d:a7:65:0f:f5:fc:8e: - 9e:62:cf:47:44:2c:01:5d:bb:1d:b5:32:d2:47:d2:38:2e:d0: - fe:81:dc:32:6a:1e:b5:ee:3c:d5:fc:e7:81:1d:19:c3:24:42: - ea:63:39:a9 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- diff --git a/global-config.rsc b/global-config.rsc index 73a9ca0..cdc1d5c 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -106,9 +106,9 @@ { url="https://lists.blocklist.de/lists/strongips.txt"; cert="Certum Trusted Network CA" }; # { url="https://www.spamhaus.org/drop/drop.txt"; -# cert="Cloudflare Inc ECC CA-3" }; +# cert="Baltimore CyberTrust Root" }; # { url="https://www.spamhaus.org/drop/edrop.txt"; -# cert="Cloudflare Inc ECC CA-3" }; +# cert="Baltimore CyberTrust Root" }; }; # "mikrotik"={ # { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/mikrotik"; From a744508d4f59bb95106b454c930fbb3f9eb28066 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Jun 2024 10:34:49 +0200 Subject: [PATCH 099/893] certs: Starfield Secure Certificate Authority - G2 -> Starfield Root Certificate Authority - G2 --- ...tarfield-Root-Certificate-Authority-G2.pem | 30 +++ ...rfield-Secure-Certificate-Authority-G2.pem | 179 ------------------ update-tunnelbroker.rsc | 2 +- 3 files changed, 31 insertions(+), 180 deletions(-) create mode 100644 certs/Starfield-Root-Certificate-Authority-G2.pem delete mode 100644 certs/Starfield-Secure-Certificate-Authority-G2.pem diff --git a/certs/Starfield-Root-Certificate-Authority-G2.pem b/certs/Starfield-Root-Certificate-Authority-G2.pem new file mode 100644 index 0000000..4e6774d --- /dev/null +++ b/certs/Starfield-Root-Certificate-Authority-G2.pem @@ -0,0 +1,30 @@ +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- diff --git a/certs/Starfield-Secure-Certificate-Authority-G2.pem b/certs/Starfield-Secure-Certificate-Authority-G2.pem deleted file mode 100644 index 7772e6b..0000000 --- a/certs/Starfield-Secure-Certificate-Authority-G2.pem +++ /dev/null @@ -1,179 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 7 (0x7) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C = US, ST = Arizona, L = Scottsdale, O = "Starfield Technologies, Inc.", CN = Starfield Root Certificate Authority - G2 - Validity - Not Before: May 3 07:00:00 2011 GMT - Not After : May 3 07:00:00 2031 GMT - Subject: C = US, ST = Arizona, L = Scottsdale, O = "Starfield Technologies, Inc.", OU = http://certs.starfieldtech.com/repository/, CN = Starfield Secure Certificate Authority - G2 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public-Key: (2048 bit) - Modulus: - 00:e5:90:66:4b:ec:f9:46:71:a9:20:83:be:e9:6c: - bf:4a:c9:48:69:81:75:4e:6d:24:f6:cb:17:13:f8: - b0:71:59:84:7a:6b:2b:85:a4:34:b5:16:e5:cb:cc: - e9:41:70:2c:a4:2e:d6:fa:32:7d:e1:a8:de:94:10: - ac:31:c1:c0:d8:6a:ff:59:27:ab:76:d6:fc:0b:74: - 6b:b8:a7:ae:3f:c4:54:f4:b4:31:44:dd:93:56:8c: - a4:4c:5e:9b:89:cb:24:83:9b:e2:57:7d:b7:d8:12: - 1f:c9:85:6d:f4:d1:80:f1:50:9b:87:ae:d4:0b:10: - 05:fb:27:ba:28:6d:17:e9:0e:d6:4d:b9:39:55:06: - ff:0a:24:05:7e:2f:c6:1d:72:6c:d4:8b:29:8c:57: - 7d:da:d9:eb:66:1a:d3:4f:a7:df:7f:52:c4:30:c5: - a5:c9:0e:02:c5:53:bf:77:38:68:06:24:c3:66:c8: - 37:7e:30:1e:45:71:23:35:ff:90:d8:2a:9d:8d:e7: - b0:92:4d:3c:7f:2a:0a:93:dc:cd:16:46:65:f7:60: - 84:8b:76:4b:91:27:73:14:92:e0:ea:ee:8f:16:ea: - 8d:0e:3e:76:17:bf:7d:89:80:80:44:43:e7:2d:e0: - 43:09:75:da:36:e8:ad:db:89:3a:f5:5d:12:8e:23: - 04:83 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Subject Key Identifier: - 25:45:81:68:50:26:38:3D:3B:2D:2C:BE:CD:6A:D9:B6:3D:B3:66:63 - X509v3 Authority Key Identifier: - keyid:7C:0C:32:1F:A7:D9:30:7F:C4:7D:68:A3:62:A8:A1:CE:AB:07:5B:27 - - Authority Information Access: - OCSP - URI:http://ocsp.starfieldtech.com/ - - X509v3 CRL Distribution Points: - - Full Name: - URI:http://crl.starfieldtech.com/sfroot-g2.crl - - X509v3 Certificate Policies: - Policy: X509v3 Any Policy - CPS: https://certs.starfieldtech.com/repository/ - - Signature Algorithm: sha256WithRSAEncryption - 56:65:ca:fe:f3:3f:0a:a8:93:8b:18:c7:de:43:69:13:34:20: - be:4e:5f:78:a8:6b:9c:db:6a:4d:41:db:c1:13:ec:dc:31:00: - 22:5e:f7:00:9e:0c:e0:34:65:34:f9:b1:3a:4e:48:c8:12:81: - 88:5c:5b:3e:08:53:7a:f7:1a:64:df:b8:50:61:cc:53:51:40: - 29:4b:c2:f4:ae:3a:5f:e4:ca:ad:26:cc:4e:61:43:e5:fd:57: - a6:37:70:ce:43:2b:b0:94:c3:92:e9:e1:5f:aa:10:49:b7:69: - e4:e0:d0:1f:64:a4:2b:cd:1f:6f:a0:f8:84:24:18:ce:79:3d: - a9:91:bf:54:18:13:89:99:54:11:0d:55:c5:26:0b:79:4f:5a: - 1c:6e:f9:63:db:14:80:a4:07:ab:fa:b2:a5:b9:88:dd:91:fe: - 65:3b:a4:a3:79:be:89:4d:e1:d0:b0:f4:c8:17:0c:0a:96:14: - 7c:09:b7:6c:e1:c2:d8:55:d4:18:a0:aa:41:69:70:24:a3:b9: - ef:e9:5a:dc:3e:eb:94:4a:f0:b7:de:5f:0e:76:fa:fb:fb:69: - 03:45:40:50:ee:72:0c:a4:12:86:81:cd:13:d1:4e:c4:3c:ca: - 4e:0d:d2:26:f1:00:b7:b4:a6:a2:e1:6e:7a:81:fd:30:ac:7a: - 1f:c7:59:7b ------BEGIN CERTIFICATE----- -MIIFADCCA+igAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTExMDUwMzA3MDAw -MFoXDTMxMDUwMzA3MDAwMFowgcYxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTMwMQYDVQQLEypodHRwOi8vY2VydHMuc3RhcmZpZWxk -dGVjaC5jb20vcmVwb3NpdG9yeS8xNDAyBgNVBAMTK1N0YXJmaWVsZCBTZWN1cmUg -Q2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDlkGZL7PlGcakgg77pbL9KyUhpgXVObST2yxcT+LBxWYR6ayuF -pDS1FuXLzOlBcCykLtb6Mn3hqN6UEKwxwcDYav9ZJ6t21vwLdGu4p64/xFT0tDFE -3ZNWjKRMXpuJyySDm+JXfbfYEh/JhW300YDxUJuHrtQLEAX7J7oobRfpDtZNuTlV -Bv8KJAV+L8YdcmzUiymMV33a2etmGtNPp99/UsQwxaXJDgLFU793OGgGJMNmyDd+ -MB5FcSM1/5DYKp2N57CSTTx/KgqT3M0WRmX3YISLdkuRJ3MUkuDq7o8W6o0OPnYX -v32JgIBEQ+ct4EMJddo26K3biTr1XRKOIwSDAgMBAAGjggEsMIIBKDAPBgNVHRMB -Af8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUJUWBaFAmOD07LSy+ -zWrZtj2zZmMwHwYDVR0jBBgwFoAUfAwyH6fZMH/EfWijYqihzqsHWycwOgYIKwYB -BQUHAQEELjAsMCoGCCsGAQUFBzABhh5odHRwOi8vb2NzcC5zdGFyZmllbGR0ZWNo -LmNvbS8wOwYDVR0fBDQwMjAwoC6gLIYqaHR0cDovL2NybC5zdGFyZmllbGR0ZWNo -LmNvbS9zZnJvb3QtZzIuY3JsMEwGA1UdIARFMEMwQQYEVR0gADA5MDcGCCsGAQUF -BwIBFitodHRwczovL2NlcnRzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkv -MA0GCSqGSIb3DQEBCwUAA4IBAQBWZcr+8z8KqJOLGMfeQ2kTNCC+Tl94qGuc22pN -QdvBE+zcMQAiXvcAngzgNGU0+bE6TkjIEoGIXFs+CFN69xpk37hQYcxTUUApS8L0 -rjpf5MqtJsxOYUPl/VemN3DOQyuwlMOS6eFfqhBJt2nk4NAfZKQrzR9voPiEJBjO -eT2pkb9UGBOJmVQRDVXFJgt5T1ocbvlj2xSApAer+rKluYjdkf5lO6Sjeb6JTeHQ -sPTIFwwKlhR8Cbds4cLYVdQYoKpBaXAko7nv6VrcPuuUSvC33l8Odvr7+2kDRUBQ -7nIMpBKGgc0T0U7EPMpODdIm8QC3tKai4W56gf0wrHofx1l7 ------END CERTIFICATE----- -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 0 (0x0) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C = US, ST = Arizona, L = Scottsdale, O = "Starfield Technologies, Inc.", CN = Starfield Root Certificate Authority - G2 - Validity - Not Before: Sep 1 00:00:00 2009 GMT - Not After : Dec 31 23:59:59 2037 GMT - Subject: C = US, ST = Arizona, L = Scottsdale, O = "Starfield Technologies, Inc.", CN = Starfield Root Certificate Authority - G2 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public-Key: (2048 bit) - Modulus: - 00:bd:ed:c1:03:fc:f6:8f:fc:02:b1:6f:5b:9f:48: - d9:9d:79:e2:a2:b7:03:61:56:18:c3:47:b6:d7:ca: - 3d:35:2e:89:43:f7:a1:69:9b:de:8a:1a:fd:13:20: - 9c:b4:49:77:32:29:56:fd:b9:ec:8c:dd:22:fa:72: - dc:27:61:97:ee:f6:5a:84:ec:6e:19:b9:89:2c:dc: - 84:5b:d5:74:fb:6b:5f:c5:89:a5:10:52:89:46:55: - f4:b8:75:1c:e6:7f:e4:54:ae:4b:f8:55:72:57:02: - 19:f8:17:71:59:eb:1e:28:07:74:c5:9d:48:be:6c: - b4:f4:a4:b0:f3:64:37:79:92:c0:ec:46:5e:7f:e1: - 6d:53:4c:62:af:cd:1f:0b:63:bb:3a:9d:fb:fc:79: - 00:98:61:74:cf:26:82:40:63:f3:b2:72:6a:19:0d: - 99:ca:d4:0e:75:cc:37:fb:8b:89:c1:59:f1:62:7f: - 5f:b3:5f:65:30:f8:a7:b7:4d:76:5a:1e:76:5e:34: - c0:e8:96:56:99:8a:b3:f0:7f:a4:cd:bd:dc:32:31: - 7c:91:cf:e0:5f:11:f8:6b:aa:49:5c:d1:99:94:d1: - a2:e3:63:5b:09:76:b5:56:62:e1:4b:74:1d:96:d4: - 26:d4:08:04:59:d0:98:0e:0e:e6:de:fc:c3:ec:1f: - 90:f1 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Subject Key Identifier: - 7C:0C:32:1F:A7:D9:30:7F:C4:7D:68:A3:62:A8:A1:CE:AB:07:5B:27 - Signature Algorithm: sha256WithRSAEncryption - 11:59:fa:25:4f:03:6f:94:99:3b:9a:1f:82:85:39:d4:76:05: - 94:5e:e1:28:93:6d:62:5d:09:c2:a0:a8:d4:b0:75:38:f1:34: - 6a:9d:e4:9f:8a:86:26:51:e6:2c:d1:c6:2d:6e:95:20:4a:92: - 01:ec:b8:8a:67:7b:31:e2:67:2e:8c:95:03:26:2e:43:9d:4a: - 31:f6:0e:b5:0c:bb:b7:e2:37:7f:22:ba:00:a3:0e:7b:52:fb: - 6b:bb:3b:c4:d3:79:51:4e:cd:90:f4:67:07:19:c8:3c:46:7a: - 0d:01:7d:c5:58:e7:6d:e6:85:30:17:9a:24:c4:10:e0:04:f7: - e0:f2:7f:d4:aa:0a:ff:42:1d:37:ed:94:e5:64:59:12:20:77: - 38:d3:32:3e:38:81:75:96:73:fa:68:8f:b1:cb:ce:1f:c5:ec: - fa:9c:7e:cf:7e:b1:f1:07:2d:b6:fc:bf:ca:a4:bf:d0:97:05: - 4a:bc:ea:18:28:02:90:bd:54:78:09:21:71:d3:d1:7d:1d:d9: - 16:b0:a9:61:3d:d0:0a:00:22:fc:c7:7b:cb:09:64:45:0b:3b: - 40:81:f7:7d:7c:32:f5:98:ca:58:8e:7d:2a:ee:90:59:73:64: - f9:36:74:5e:25:a1:f5:66:05:2e:7f:39:15:a9:2a:fb:50:8b: - 8e:85:69:f4 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw -MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp -Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg -nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 -HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N -Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN -dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 -HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G -CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU -sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 -4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg -8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 -mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index 364dc08..f9ba202 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -25,7 +25,7 @@ :error false; } - :if ([ $CertificateAvailable "Starfield Secure Certificate Authority - G2" ] = false) do={ + :if ([ $CertificateAvailable "Starfield Root Certificate Authority - G2" ] = false) do={ $LogPrint error $ScriptName ("Downloading required certificate failed."); :error false; } From 0ae3d31c58d57578092e76368ebd82bdc859123d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Jun 2024 10:38:35 +0200 Subject: [PATCH 100/893] certs: GTS CA 1C3 / GTS CA 1P5 -> GTS Root R1 --- certs/GTS-CA-1C3.pem | 242 ------------------------------------------ certs/GTS-CA-1P5.pem | 238 ----------------------------------------- certs/GTS-Root-R1.pem | 38 +++++++ doc/netwatch-dns.md | 2 +- global-functions.rsc | 2 +- 5 files changed, 40 insertions(+), 482 deletions(-) delete mode 100644 certs/GTS-CA-1C3.pem delete mode 100644 certs/GTS-CA-1P5.pem create mode 100644 certs/GTS-Root-R1.pem diff --git a/certs/GTS-CA-1C3.pem b/certs/GTS-CA-1C3.pem deleted file mode 100644 index a8432d2..0000000 --- a/certs/GTS-CA-1C3.pem +++ /dev/null @@ -1,242 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 02:03:bc:53:59:6b:34:c7:18:f5:01:50:66 - Signature Algorithm: sha256WithRSAEncryption - Issuer: C = US, O = Google Trust Services LLC, CN = GTS Root R1 - Validity - Not Before: Aug 13 00:00:42 2020 GMT - Not After : Sep 30 00:00:42 2027 GMT - Subject: C = US, O = Google Trust Services LLC, CN = GTS CA 1C3 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public-Key: (2048 bit) - Modulus: - 00:f5:88:df:e7:62:8c:1e:37:f8:37:42:90:7f:6c: - 87:d0:fb:65:82:25:fd:e8:cb:6b:a4:ff:6d:e9:5a: - 23:e2:99:f6:1c:e9:92:03:99:13:7c:09:0a:8a:fa: - 42:d6:5e:56:24:aa:7a:33:84:1f:d1:e9:69:bb:b9: - 74:ec:57:4c:66:68:93:77:37:55:53:fe:39:10:4d: - b7:34:bb:5f:25:77:37:3b:17:94:ea:3c:e5:9d:d5: - bc:c3:b4:43:eb:2e:a7:47:ef:b0:44:11:63:d8:b4: - 41:85:dd:41:30:48:93:1b:bf:b7:f6:e0:45:02:21: - e0:96:42:17:cf:d9:2b:65:56:34:07:26:04:0d:a8: - fd:7d:ca:2e:ef:ea:48:7c:37:4d:3f:00:9f:83:df: - ef:75:84:2e:79:57:5c:fc:57:6e:1a:96:ff:fc:8c: - 9a:a6:99:be:25:d9:7f:96:2c:06:f7:11:2a:02:80: - 80:eb:63:18:3c:50:49:87:e5:8a:ca:5f:19:2b:59: - 96:81:00:a0:fb:51:db:ca:77:0b:0b:c9:96:4f:ef: - 70:49:c7:5c:6d:20:fd:99:b4:b4:e2:ca:2e:77:fd: - 2d:dc:0b:b6:6b:13:0c:8c:19:2b:17:96:98:b9:f0: - 8b:f6:a0:27:bb:b6:e3:8d:51:8f:bd:ae:c7:9b:b1: - 89:9d - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Extended Key Usage: - TLS Web Server Authentication, TLS Web Client Authentication - X509v3 Basic Constraints: critical - CA:TRUE, pathlen:0 - X509v3 Subject Key Identifier: - 8A:74:7F:AF:85:CD:EE:95:CD:3D:9C:D0:E2:46:14:F3:71:35:1D:27 - X509v3 Authority Key Identifier: - keyid:E4:AF:2B:26:71:1A:2B:48:27:85:2F:52:66:2C:EF:F0:89:13:71:3E - - Authority Information Access: - OCSP - URI:http://ocsp.pki.goog/gtsr1 - CA Issuers - URI:http://pki.goog/repo/certs/gtsr1.der - - X509v3 CRL Distribution Points: - - Full Name: - URI:http://crl.pki.goog/gtsr1/gtsr1.crl - - X509v3 Certificate Policies: - Policy: 1.3.6.1.4.1.11129.2.5.3 - CPS: https://pki.goog/repository/ - Policy: 2.23.140.1.2.1 - Policy: 2.23.140.1.2.2 - - Signature Algorithm: sha256WithRSAEncryption - 89:7d:ac:20:5c:0c:3c:be:9a:a8:57:95:1b:b4:ae:fa:ab:a5: - 72:71:b4:36:95:fd:df:40:11:03:4c:c2:46:14:bb:14:24:ab: - f0:50:71:22:db:ad:c4:6e:7f:cf:f1:6a:6f:c8:83:1b:d8:ce: - 89:5f:87:6c:87:b8:a9:0c:a3:9b:a1:62:94:93:95:df:5b:ae: - 66:19:0b:02:96:9e:fc:b5:e7:10:69:3e:7a:cb:46:49:5f:46: - e1:41:b1:d7:98:4d:65:34:00:80:1a:3f:4f:9f:6c:7f:49:00: - 81:53:41:a4:92:21:82:82:1a:f1:a3:44:5b:2a:50:12:13:4d: - c1:53:36:f3:42:08:af:54:fa:8e:77:53:1b:64:38:27:17:09: - bd:58:c9:1b:7c:39:2d:5b:f3:ce:d4:ed:97:db:14:03:bf:09: - 53:24:1f:c2:0c:04:79:98:26:f2:61:f1:53:52:fd:42:8c:1b: - 66:2b:3f:15:a1:bb:ff:f6:9b:e3:81:9a:01:06:71:89:35:28: - 24:dd:e1:bd:eb:19:2d:e1:48:cb:3d:59:83:51:b4:74:c6:9d: - 7c:c6:b1:86:5b:af:cc:34:c4:d3:cc:d4:81:11:95:00:a1:f4: - 12:22:01:fa:b4:83:71:af:8c:b7:8c:73:24:ac:37:53:c2:00: - 90:3f:11:fe:5c:ed:36:94:10:3b:bd:29:ae:e2:c7:3a:62:3b: - 6c:63:d9:80:bf:59:71:ac:63:27:b9:4c:17:a0:da:f6:73:15: - bf:2a:de:8f:f3:a5:6c:32:81:33:03:d0:86:51:71:99:34:ba: - 93:8d:5d:b5:51:58:f7:b2:93:e8:01:f6:59:be:71:9b:fd:4d: - 28:ce:cf:6d:c7:16:dc:f7:d1:d6:46:9b:a7:ca:6b:e9:77:0f: - fd:a0:b6:1b:23:83:1d:10:1a:d9:09:00:84:e0:44:d3:a2:75: - 23:b3:34:86:f6:20:b0:a4:5e:10:1d:e0:52:46:00:9d:b1:0f: - 1f:21:70:51:f5:9a:dd:06:fc:55:f4:2b:0e:33:77:c3:4b:42: - c2:f1:77:13:fc:73:80:94:eb:1f:bb:37:3f:ce:02:2a:66:b0: - 73:1d:32:a5:32:6c:32:b0:8e:e0:c4:23:ff:5b:7d:4d:65:70: - ac:2b:9b:3d:ce:db:e0:6d:8e:32:80:be:96:9f:92:63:bc:97: - bb:5d:b9:f4:e1:71:5e:2a:e4:ef:03:22:b1:8a:65:3a:8f:c0: - 93:65:d4:85:cd:0f:0f:5b:83:59:16:47:16:2d:9c:24:3a:c8: - 80:a6:26:14:85:9b:f6:37:9b:ac:6f:f9:c5:c3:06:51:f3:e2: - 7f:c5:b1:10:ba:51:f4:dd ------BEGIN CERTIFICATE----- -MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAw -MDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzp -kgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsX -lOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcm -BA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKA -gOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwL -tmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1Ud -DwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0T -AQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYD -VR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYG -CCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcw -AoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQt -MCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcG -A1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3Br -aS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcN -AQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQ -cSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrL -RklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U -+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2Yr -PxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IER -lQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGs -Yye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjO -z23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJG -AJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKw -juDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl -1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd ------END CERTIFICATE----- -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 6e:47:a9:c5:4b:47:0c:0d:ec:33:d0:89:b9:1c:f4:e1 - Signature Algorithm: sha384WithRSAEncryption - Issuer: C = US, O = Google Trust Services LLC, CN = GTS Root R1 - Validity - Not Before: Jun 22 00:00:00 2016 GMT - Not After : Jun 22 00:00:00 2036 GMT - Subject: C = US, O = Google Trust Services LLC, CN = GTS Root R1 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public-Key: (4096 bit) - Modulus: - 00:b6:11:02:8b:1e:e3:a1:77:9b:3b:dc:bf:94:3e: - b7:95:a7:40:3c:a1:fd:82:f9:7d:32:06:82:71:f6: - f6:8c:7f:fb:e8:db:bc:6a:2e:97:97:a3:8c:4b:f9: - 2b:f6:b1:f9:ce:84:1d:b1:f9:c5:97:de:ef:b9:f2: - a3:e9:bc:12:89:5e:a7:aa:52:ab:f8:23:27:cb:a4: - b1:9c:63:db:d7:99:7e:f0:0a:5e:eb:68:a6:f4:c6: - 5a:47:0d:4d:10:33:e3:4e:b1:13:a3:c8:18:6c:4b: - ec:fc:09:90:df:9d:64:29:25:23:07:a1:b4:d2:3d: - 2e:60:e0:cf:d2:09:87:bb:cd:48:f0:4d:c2:c2:7a: - 88:8a:bb:ba:cf:59:19:d6:af:8f:b0:07:b0:9e:31: - f1:82:c1:c0:df:2e:a6:6d:6c:19:0e:b5:d8:7e:26: - 1a:45:03:3d:b0:79:a4:94:28:ad:0f:7f:26:e5:a8: - 08:fe:96:e8:3c:68:94:53:ee:83:3a:88:2b:15:96: - 09:b2:e0:7a:8c:2e:75:d6:9c:eb:a7:56:64:8f:96: - 4f:68:ae:3d:97:c2:84:8f:c0:bc:40:c0:0b:5c:bd: - f6:87:b3:35:6c:ac:18:50:7f:84:e0:4c:cd:92:d3: - 20:e9:33:bc:52:99:af:32:b5:29:b3:25:2a:b4:48: - f9:72:e1:ca:64:f7:e6:82:10:8d:e8:9d:c2:8a:88: - fa:38:66:8a:fc:63:f9:01:f9:78:fd:7b:5c:77:fa: - 76:87:fa:ec:df:b1:0e:79:95:57:b4:bd:26:ef:d6: - 01:d1:eb:16:0a:bb:8e:0b:b5:c5:c5:8a:55:ab:d3: - ac:ea:91:4b:29:cc:19:a4:32:25:4e:2a:f1:65:44: - d0:02:ce:aa:ce:49:b4:ea:9f:7c:83:b0:40:7b:e7: - 43:ab:a7:6c:a3:8f:7d:89:81:fa:4c:a5:ff:d5:8e: - c3:ce:4b:e0:b5:d8:b3:8e:45:cf:76:c0:ed:40:2b: - fd:53:0f:b0:a7:d5:3b:0d:b1:8a:a2:03:de:31:ad: - cc:77:ea:6f:7b:3e:d6:df:91:22:12:e6:be:fa:d8: - 32:fc:10:63:14:51:72:de:5d:d6:16:93:bd:29:68: - 33:ef:3a:66:ec:07:8a:26:df:13:d7:57:65:78:27: - de:5e:49:14:00:a2:00:7f:9a:a8:21:b6:a9:b1:95: - b0:a5:b9:0d:16:11:da:c7:6c:48:3c:40:e0:7e:0d: - 5a:cd:56:3c:d1:97:05:b9:cb:4b:ed:39:4b:9c:c4: - 3f:d2:55:13:6e:24:b0:d6:71:fa:f4:c1:ba:cc:ed: - 1b:f5:fe:81:41:d8:00:98:3d:3a:c8:ae:7a:98:37: - 18:05:95 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Subject Key Identifier: - E4:AF:2B:26:71:1A:2B:48:27:85:2F:52:66:2C:EF:F0:89:13:71:3E - Signature Algorithm: sha384WithRSAEncryption - 38:96:0a:ee:3d:b4:96:1e:5f:ef:9d:9c:0b:33:9f:2b:e0:ca: - fd:d2:8e:0a:1f:41:74:a5:7c:aa:84:d4:e5:f2:1e:e6:37:52: - 32:9c:0b:d1:61:1d:bf:28:c1:b6:44:29:35:75:77:98:b2:7c: - d9:bd:74:ac:8a:68:e3:a9:31:09:29:01:60:73:e3:47:7c:53: - a8:90:4a:27:ef:4b:d7:9f:93:e7:82:36:ce:9a:68:0c:82:e7: - cf:d4:10:16:6f:5f:0e:99:5c:f6:1f:71:7d:ef:ef:7b:2f:7e: - ea:36:d6:97:70:0b:15:ee:d7:5c:56:6a:33:a5:e3:49:38:0c: - b8:7d:fb:8d:85:a4:b1:59:5e:f4:6a:e1:dd:a1:f6:64:44:ae: - e6:51:83:21:66:c6:11:3e:f3:ce:47:ee:9c:28:1f:25:da:ff: - ac:66:95:dd:35:0f:5c:ef:20:2c:62:fd:91:ba:a9:cc:fc:5a: - 9c:93:81:83:29:97:4a:7c:5a:72:b4:39:d0:b7:77:cb:79:fd: - 69:3a:92:37:ed:6e:38:65:46:7e:e9:60:bd:79:88:97:5f:38: - 12:f4:ee:af:5b:82:c8:86:d5:e1:99:6d:8c:04:f2:76:ba:49: - f6:6e:e9:6d:1e:5f:a0:ef:27:82:76:40:f8:a6:d3:58:5c:0f: - 2c:42:da:42:c6:7b:88:34:c7:c1:d8:45:9b:c1:3e:c5:61:1d: - d9:63:50:49:f6:34:85:6a:e0:18:c5:6e:47:ab:41:42:29:9b: - f6:60:0d:d2:31:d3:63:98:23:93:5a:00:81:48:b4:ef:cd:8a: - cd:c9:cf:99:ee:d9:9e:aa:36:e1:68:4b:71:49:14:36:28:3a: - 3d:1d:ce:9a:8f:25:e6:80:71:61:2b:b5:7b:cc:f9:25:16:81: - e1:31:5f:a1:a3:7e:16:a4:9c:16:6a:97:18:bd:76:72:a5:0b: - 9e:1d:36:e6:2f:a1:2f:be:70:91:0f:a8:e6:da:f8:c4:92:40: - 6c:25:7e:7b:b3:09:dc:b2:17:ad:80:44:f0:68:a5:8f:94:75: - ff:74:5a:e8:a8:02:7c:0c:09:e2:a9:4b:0b:a0:85:0b:62:b9: - ef:a1:31:92:fb:ef:f6:51:04:89:6c:e8:a9:74:a1:bb:17:b3: - b5:fd:49:0f:7c:3c:ec:83:18:20:43:4e:d5:93:ba:b4:34:b1: - 1f:16:36:1f:0c:e6:64:39:16:4c:dc:e0:fe:1d:c8:a9:62:3d: - 40:ea:ca:c5:34:02:b4:ae:89:88:33:35:dc:2c:13:73:d8:27: - f1:d0:72:ee:75:3b:22:de:98:68:66:5b:f1:c6:63:47:55:1c: - ba:a5:08:51:75:a6:48:25 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH -MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM -QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy -MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl -cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM -f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX -mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 -zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P -fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc -vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 -Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp -zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO -Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW -k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ -DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF -lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW -Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 -d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z -XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR -gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 -d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv -J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg -DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM -+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy -F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 -SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws -E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl ------END CERTIFICATE----- diff --git a/certs/GTS-CA-1P5.pem b/certs/GTS-CA-1P5.pem deleted file mode 100644 index 5be738d..0000000 --- a/certs/GTS-CA-1P5.pem +++ /dev/null @@ -1,238 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 02:03:bc:50:a3:27:53:f0:91:80:22:ed:f1 - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, O=Google Trust Services LLC, CN=GTS Root R1 - Validity - Not Before: Aug 13 00:00:42 2020 GMT - Not After : Sep 30 00:00:42 2027 GMT - Subject: C=US, O=Google Trust Services LLC, CN=GTS CA 1P5 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) - Modulus: - 00:b3:82:f0:24:8c:bf:2d:87:af:b2:d9:a7:ae:fa: - ca:ba:44:d6:5b:3e:fe:b2:f7:b2:65:16:dc:de:10: - e8:4f:2d:10:58:5a:28:86:87:a1:ee:6a:b3:a0:d9: - 75:4f:7f:a1:52:01:8b:55:a8:4a:5b:06:48:c8:36: - 12:25:ab:89:f9:f2:23:5f:9d:60:65:f9:5c:da:be: - 3a:e8:5c:6d:7d:9c:d0:84:18:85:30:cd:4e:9b:ec: - 3c:d8:b3:e1:96:d4:f3:c5:0b:65:db:8f:b0:74:cb: - f6:1e:f3:78:f1:ac:95:c5:dd:73:c3:31:88:81:af: - 74:aa:6f:fd:0c:e3:05:95:f0:c5:10:4f:65:63:fa: - a0:af:c6:18:3d:c5:a1:df:97:79:d7:05:89:b3:30: - b0:74:ae:3d:92:10:6b:8c:15:77:dd:0b:04:57:fb: - 81:03:dd:ea:22:34:d5:e5:56:b2:f0:c4:8d:41:b1: - c3:02:db:62:ec:80:d0:ff:76:d4:86:e4:04:1a:b6: - b6:0c:2b:62:71:7d:d9:af:d9:f1:5e:fa:c0:1e:ca: - a0:19:5c:55:f0:80:d1:2a:0c:07:86:90:9f:35:e3: - 28:2b:5b:ef:23:c8:a3:1d:a4:a3:3a:ee:fe:83:dc: - 82:4c:25:b0:4d:c5:51:ad:9e:9b:d3:5b:84:c2:1a: - 5a:e9 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Extended Key Usage: - TLS Web Server Authentication, TLS Web Client Authentication - X509v3 Basic Constraints: critical - CA:TRUE, pathlen:0 - X509v3 Subject Key Identifier: - D5:FC:9E:0D:DF:1E:CA:DD:08:97:97:6E:2B:C5:5F:C5:2B:F5:EC:B8 - X509v3 Authority Key Identifier: - E4:AF:2B:26:71:1A:2B:48:27:85:2F:52:66:2C:EF:F0:89:13:71:3E - Authority Information Access: - OCSP - URI:http://ocsp.pki.goog/gtsr1 - CA Issuers - URI:http://pki.goog/repo/certs/gtsr1.der - X509v3 CRL Distribution Points: - Full Name: - URI:http://crl.pki.goog/gtsr1/gtsr1.crl - X509v3 Certificate Policies: - Policy: 1.3.6.1.4.1.11129.2.5.3 - CPS: https://pki.goog/repository/ - Policy: 2.23.140.1.2.1 - Signature Algorithm: sha256WithRSAEncryption - Signature Value: - 6c:63:27:ee:23:df:e5:52:68:4d:81:66:91:85:df:7d:65:e5: - 5b:37:31:08:26:b2:07:5d:9a:be:b1:ca:01:b9:ad:bf:9d:77: - f6:51:1d:d7:98:c5:0b:49:a1:7b:a1:d7:d3:68:e5:44:0f:8b: - ba:36:dd:42:82:77:d2:8d:dd:f5:3f:fb:eb:c8:07:98:93:ee: - 5a:d0:b5:3d:de:4b:1c:2d:8c:4d:ec:7e:8c:7b:fe:4e:40:fd: - f0:b4:b3:59:02:10:51:5c:e3:c0:2b:fd:b7:06:48:51:7e:09: - 5e:3f:0f:dc:a7:fe:97:e7:79:c5:0e:44:89:78:c5:69:59:29: - a0:9a:3a:48:36:29:a6:94:93:55:2d:b8:47:b5:e9:96:b5:9f: - 07:cd:a6:ab:3e:32:8a:c0:86:83:c5:c1:41:c8:9f:2f:35:8e: - 0d:c0:07:7a:e1:ac:c9:65:b5:cb:8a:a7:dd:71:d8:61:65:39: - 84:ac:32:3e:f7:7a:36:f1:56:9f:57:a9:41:6d:5a:90:a7:db: - 3a:ea:75:80:0c:63:0b:69:74:6f:07:4c:15:f3:37:28:a5:19: - a4:6e:f5:f6:20:cd:63:b2:7e:c4:2b:09:75:89:da:d1:3c:2e: - 72:4f:36:1a:a1:9e:44:d0:cd:9b:a6:23:08:3f:97:a1:a7:9e: - 5a:a5:f7:09:94:ad:5d:76:5d:28:56:d1:1a:66:51:51:07:7b: - de:3d:b0:c8:ef:30:7a:24:2d:be:b8:b3:86:f6:4b:f7:f0:b5: - 4f:ff:ce:c6:f9:f6:3f:2a:27:08:0f:09:3e:23:5a:c7:e3:42: - 2d:7a:36:e4:3d:98:96:60:39:98:ea:d1:db:63:2a:eb:78:09: - b1:4e:21:b3:8e:b7:ce:3e:92:f1:95:5c:a4:39:d0:c0:2b:c8: - 53:15:f5:d2:2f:82:cd:06:74:67:99:90:77:37:0a:97:2d:c5: - 1c:1e:f4:d0:5b:e9:15:e3:ea:02:09:c8:13:d7:13:70:65:bf: - fb:88:9b:5a:25:be:77:09:e1:a7:6a:4e:11:75:b9:1e:4d:f1: - 00:1b:6a:66:79:8e:c3:6e:d8:6d:a2:22:a2:6d:05:fb:2c:f2: - f1:50:e5:a0:d1:d8:9f:35:7d:fc:70:ab:59:2a:02:f1:be:b0: - d3:f1:f8:cd:12:b9:6a:25:90:5b:e3:85:20:e6:f5:da:cb:40: - 1c:19:34:20:03:61:77:ba:7f:48:0f:49:0b:29:eb:e7:61:64: - c7:63:d1:47:eb:1c:e1:ee:94:46:ef:39:73:cc:ee:4f:2b:8d: - dc:fb:58:a7:b3:65:20:99:95:b9:fb:55:6f:d7:96:6e:94:3d: - f4:7a:92:8e:63:1d:df:6d ------BEGIN CERTIFICATE----- -MIIFjDCCA3SgAwIBAgINAgO8UKMnU/CRgCLt8TANBgkqhkiG9w0BAQsFADBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAw -MDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFQNTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBALOC8CSMvy2Hr7LZp676yrpE1ls+/rL3smUW3N4Q6E8tEFha -KIaHoe5qs6DZdU9/oVIBi1WoSlsGSMg2EiWrifnyI1+dYGX5XNq+OuhcbX2c0IQY -hTDNTpvsPNiz4ZbU88ULZduPsHTL9h7zePGslcXdc8MxiIGvdKpv/QzjBZXwxRBP -ZWP6oK/GGD3Fod+XedcFibMwsHSuPZIQa4wVd90LBFf7gQPd6iI01eVWsvDEjUGx -wwLbYuyA0P921IbkBBq2tgwrYnF92a/Z8V76wB7KoBlcVfCA0SoMB4aQnzXjKCtb -7yPIox2kozru/oPcgkwlsE3FUa2em9NbhMIaWukCAwEAAaOCAXYwggFyMA4GA1Ud -DwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0T -AQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU1fyeDd8eyt0Il5duK8VfxSv17LgwHwYD -VR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYG -CCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcw -AoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQt -MCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsME0G -A1UdIARGMEQwOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3Br -aS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATANBgkqhkiG9w0BAQsFAAOCAgEA -bGMn7iPf5VJoTYFmkYXffWXlWzcxCCayB12avrHKAbmtv5139lEd15jFC0mhe6HX -02jlRA+LujbdQoJ30o3d9T/768gHmJPuWtC1Pd5LHC2MTex+jHv+TkD98LSzWQIQ -UVzjwCv9twZIUX4JXj8P3Kf+l+d5xQ5EiXjFaVkpoJo6SDYpppSTVS24R7XplrWf -B82mqz4yisCGg8XBQcifLzWODcAHeuGsyWW1y4qn3XHYYWU5hKwyPvd6NvFWn1ep -QW1akKfbOup1gAxjC2l0bwdMFfM3KKUZpG719iDNY7J+xCsJdYna0Twuck82GqGe -RNDNm6YjCD+XoaeeWqX3CZStXXZdKFbRGmZRUQd73j2wyO8weiQtvrizhvZL9/C1 -T//Oxvn2PyonCA8JPiNax+NCLXo25D2YlmA5mOrR22Mq63gJsU4hs463zj6S8ZVc -pDnQwCvIUxX10i+CzQZ0Z5mQdzcKly3FHB700FvpFePqAgnIE9cTcGW/+4ibWiW+ -dwnhp2pOEXW5Hk3xABtqZnmOw27YbaIiom0F+yzy8VDloNHYnzV9/HCrWSoC8b6w -0/H4zRK5aiWQW+OFIOb12stAHBk0IANhd7p/SA9JCynr52Fkx2PRR+sc4e6URu85 -c8zuTyuN3PtYp7NlIJmVuftVb9eWbpQ99HqSjmMd320= ------END CERTIFICATE----- -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 02:03:e5:93:6f:31:b0:13:49:88:6b:a2:17 - Signature Algorithm: sha384WithRSAEncryption - Issuer: C=US, O=Google Trust Services LLC, CN=GTS Root R1 - Validity - Not Before: Jun 22 00:00:00 2016 GMT - Not After : Jun 22 00:00:00 2036 GMT - Subject: C=US, O=Google Trust Services LLC, CN=GTS Root R1 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (4096 bit) - Modulus: - 00:b6:11:02:8b:1e:e3:a1:77:9b:3b:dc:bf:94:3e: - b7:95:a7:40:3c:a1:fd:82:f9:7d:32:06:82:71:f6: - f6:8c:7f:fb:e8:db:bc:6a:2e:97:97:a3:8c:4b:f9: - 2b:f6:b1:f9:ce:84:1d:b1:f9:c5:97:de:ef:b9:f2: - a3:e9:bc:12:89:5e:a7:aa:52:ab:f8:23:27:cb:a4: - b1:9c:63:db:d7:99:7e:f0:0a:5e:eb:68:a6:f4:c6: - 5a:47:0d:4d:10:33:e3:4e:b1:13:a3:c8:18:6c:4b: - ec:fc:09:90:df:9d:64:29:25:23:07:a1:b4:d2:3d: - 2e:60:e0:cf:d2:09:87:bb:cd:48:f0:4d:c2:c2:7a: - 88:8a:bb:ba:cf:59:19:d6:af:8f:b0:07:b0:9e:31: - f1:82:c1:c0:df:2e:a6:6d:6c:19:0e:b5:d8:7e:26: - 1a:45:03:3d:b0:79:a4:94:28:ad:0f:7f:26:e5:a8: - 08:fe:96:e8:3c:68:94:53:ee:83:3a:88:2b:15:96: - 09:b2:e0:7a:8c:2e:75:d6:9c:eb:a7:56:64:8f:96: - 4f:68:ae:3d:97:c2:84:8f:c0:bc:40:c0:0b:5c:bd: - f6:87:b3:35:6c:ac:18:50:7f:84:e0:4c:cd:92:d3: - 20:e9:33:bc:52:99:af:32:b5:29:b3:25:2a:b4:48: - f9:72:e1:ca:64:f7:e6:82:10:8d:e8:9d:c2:8a:88: - fa:38:66:8a:fc:63:f9:01:f9:78:fd:7b:5c:77:fa: - 76:87:fa:ec:df:b1:0e:79:95:57:b4:bd:26:ef:d6: - 01:d1:eb:16:0a:bb:8e:0b:b5:c5:c5:8a:55:ab:d3: - ac:ea:91:4b:29:cc:19:a4:32:25:4e:2a:f1:65:44: - d0:02:ce:aa:ce:49:b4:ea:9f:7c:83:b0:40:7b:e7: - 43:ab:a7:6c:a3:8f:7d:89:81:fa:4c:a5:ff:d5:8e: - c3:ce:4b:e0:b5:d8:b3:8e:45:cf:76:c0:ed:40:2b: - fd:53:0f:b0:a7:d5:3b:0d:b1:8a:a2:03:de:31:ad: - cc:77:ea:6f:7b:3e:d6:df:91:22:12:e6:be:fa:d8: - 32:fc:10:63:14:51:72:de:5d:d6:16:93:bd:29:68: - 33:ef:3a:66:ec:07:8a:26:df:13:d7:57:65:78:27: - de:5e:49:14:00:a2:00:7f:9a:a8:21:b6:a9:b1:95: - b0:a5:b9:0d:16:11:da:c7:6c:48:3c:40:e0:7e:0d: - 5a:cd:56:3c:d1:97:05:b9:cb:4b:ed:39:4b:9c:c4: - 3f:d2:55:13:6e:24:b0:d6:71:fa:f4:c1:ba:cc:ed: - 1b:f5:fe:81:41:d8:00:98:3d:3a:c8:ae:7a:98:37: - 18:05:95 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Subject Key Identifier: - E4:AF:2B:26:71:1A:2B:48:27:85:2F:52:66:2C:EF:F0:89:13:71:3E - Signature Algorithm: sha384WithRSAEncryption - Signature Value: - 9f:aa:42:26:db:0b:9b:be:ff:1e:96:92:2e:3e:a2:65:4a:6a: - 98:ba:22:cb:7d:c1:3a:d8:82:0a:06:c6:f6:a5:de:c0:4e:87: - 66:79:a1:f9:a6:58:9c:aa:f9:b5:e6:60:e7:e0:e8:b1:1e:42: - 41:33:0b:37:3d:ce:89:70:15:ca:b5:24:a8:cf:6b:b5:d2:40: - 21:98:cf:22:34:cf:3b:c5:22:84:e0:c5:0e:8a:7c:5d:88:e4: - 35:24:ce:9b:3e:1a:54:1e:6e:db:b2:87:a7:fc:f3:fa:81:55: - 14:62:0a:59:a9:22:05:31:3e:82:d6:ee:db:57:34:bc:33:95: - d3:17:1b:e8:27:a2:8b:7b:4e:26:1a:7a:5a:64:b6:d1:ac:37: - f1:fd:a0:f3:38:ec:72:f0:11:75:9d:cb:34:52:8d:e6:76:6b: - 17:c6:df:86:ab:27:8e:49:2b:75:66:81:10:21:a6:ea:3e:f4: - ae:25:ff:7c:15:de:ce:8c:25:3f:ca:62:70:0a:f7:2f:09:66: - 07:c8:3f:1c:fc:f0:db:45:30:df:62:88:c1:b5:0f:9d:c3:9f: - 4a:de:59:59:47:c5:87:22:36:e6:82:a7:ed:0a:b9:e2:07:a0: - 8d:7b:7a:4a:3c:71:d2:e2:03:a1:1f:32:07:dd:1b:e4:42:ce: - 0c:00:45:61:80:b5:0b:20:59:29:78:bd:f9:55:cb:63:c5:3c: - 4c:f4:b6:ff:db:6a:5f:31:6b:99:9e:2c:c1:6b:50:a4:d7:e6: - 18:14:bd:85:3f:67:ab:46:9f:a0:ff:42:a7:3a:7f:5c:cb:5d: - b0:70:1d:2b:34:f5:d4:76:09:0c:eb:78:4c:59:05:f3:33:42: - c3:61:15:10:1b:77:4d:ce:22:8c:d4:85:f2:45:7d:b7:53:ea: - ef:40:5a:94:0a:5c:20:5f:4e:40:5d:62:22:76:df:ff:ce:61: - bd:8c:23:78:d2:37:02:e0:8e:de:d1:11:37:89:f6:bf:ed:49: - 07:62:ae:92:ec:40:1a:af:14:09:d9:d0:4e:b2:a2:f7:be:ee: - ee:d8:ff:dc:1a:2d:de:b8:36:71:e2:fc:79:b7:94:25:d1:48: - 73:5b:a1:35:e7:b3:99:67:75:c1:19:3a:2b:47:4e:d3:42:8e: - fd:31:c8:16:66:da:d2:0c:3c:db:b3:8e:c9:a1:0d:80:0f:7b: - 16:77:14:bf:ff:db:09:94:b2:93:bc:20:58:15:e9:db:71:43: - f3:de:10:c3:00:dc:a8:2a:95:b6:c2:d6:3f:90:6b:76:db:6c: - fe:8c:bc:f2:70:35:0c:dc:99:19:35:dc:d7:c8:46:63:d5:36: - 71:ae:57:fb:b7:82:6d:dc ------BEGIN CERTIFICATE----- -MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo -27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w -Cl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw -TcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl -qAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH -szVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8 -Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk -MiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 -wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p -aDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN -VjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID -AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb -C5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe -QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy -h6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4 -7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J -ZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef -MgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/ -Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT -6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ -0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm -2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb -bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c ------END CERTIFICATE----- diff --git a/certs/GTS-Root-R1.pem b/certs/GTS-Root-R1.pem new file mode 100644 index 0000000..a6095d2 --- /dev/null +++ b/certs/GTS-Root-R1.pem @@ -0,0 +1,38 @@ +# Issuer: CN=GTS Root R1 O=Google Trust Services LLC +# Subject: CN=GTS Root R1 O=Google Trust Services LLC +# Label: "GTS Root R1" +# Serial: 159662320309726417404178440727 +# MD5 Fingerprint: 05:fe:d0:bf:71:a8:a3:76:63:da:01:e0:d8:52:dc:40 +# SHA1 Fingerprint: e5:8c:1c:c4:91:3b:38:63:4b:e9:10:6e:e3:ad:8e:6b:9d:d9:81:4a +# SHA256 Fingerprint: d9:47:43:2a:bd:e7:b7:fa:90:fc:2e:6b:59:10:1b:12:80:e0:e1:c7:e4:e4:0f:a3:c6:88:7f:ff:57:a7:f4:cf +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo +27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w +Cl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw +TcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl +qAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH +szVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8 +Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk +MiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 +wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p +aDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN +VjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID +AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb +C5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe +QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy +h6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4 +7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J +ZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef +MgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/ +Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT +6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ +0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm +2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb +bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c +-----END CERTIFICATE----- diff --git a/doc/netwatch-dns.md b/doc/netwatch-dns.md index 443106f..3214368 100644 --- a/doc/netwatch-dns.md +++ b/doc/netwatch-dns.md @@ -64,7 +64,7 @@ the repository (see `certs` sub directory). /tool/netwatch/add comment="doh, doh-cert=DigiCert Global G2 TLS RSA SHA256 2020 CA1" host=1.1.1.1; /tool/netwatch/add comment="doh, doh-cert=DigiCert TLS Hybrid ECC SHA384 2020 CA1" host=9.9.9.9; - /tool/netwatch/add comment="doh, doh-cert=GTS CA 1C3" host=8.8.8.8; + /tool/netwatch/add comment="doh, doh-cert=GTS Root R1" host=8.8.8.8; Sometimes using just one specific (possibly internal) DNS server may be desired, with fallback in case it fails. This is possible as well: diff --git a/global-functions.rsc b/global-functions.rsc index 567444e..ca8ecb1 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -509,7 +509,7 @@ } :do { - :if ([ $CertificateAvailable "GTS CA 1P5" ] = false) do={ + :if ([ $CertificateAvailable "GTS Root R1" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); :error false; } From 588dacb5af93819021b71a88f200464359dee701 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Jun 2024 10:47:42 +0200 Subject: [PATCH 101/893] certs: Go Daddy Secure Certificate Authority - G2 -> Go Daddy Root Certificate Authority - G2 --- ...Go-Daddy-Root-Certificate-Authority-G2.pem | 30 +++ ...-Daddy-Secure-Certificate-Authority-G2.pem | 178 ------------------ mod/notification-telegram.rsc | 2 +- telegram-chat.rsc | 2 +- 4 files changed, 32 insertions(+), 180 deletions(-) create mode 100644 certs/Go-Daddy-Root-Certificate-Authority-G2.pem delete mode 100644 certs/Go-Daddy-Secure-Certificate-Authority-G2.pem diff --git a/certs/Go-Daddy-Root-Certificate-Authority-G2.pem b/certs/Go-Daddy-Root-Certificate-Authority-G2.pem new file mode 100644 index 0000000..c61f300 --- /dev/null +++ b/certs/Go-Daddy-Root-Certificate-Authority-G2.pem @@ -0,0 +1,30 @@ +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- diff --git a/certs/Go-Daddy-Secure-Certificate-Authority-G2.pem b/certs/Go-Daddy-Secure-Certificate-Authority-G2.pem deleted file mode 100644 index 4faba90..0000000 --- a/certs/Go-Daddy-Secure-Certificate-Authority-G2.pem +++ /dev/null @@ -1,178 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 7 (0x7) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C = US, ST = Arizona, L = Scottsdale, O = "GoDaddy.com, Inc.", CN = Go Daddy Root Certificate Authority - G2 - Validity - Not Before: May 3 07:00:00 2011 GMT - Not After : May 3 07:00:00 2031 GMT - Subject: C = US, ST = Arizona, L = Scottsdale, O = "GoDaddy.com, Inc.", OU = http://certs.godaddy.com/repository/, CN = Go Daddy Secure Certificate Authority - G2 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public-Key: (2048 bit) - Modulus: - 00:b9:e0:cb:10:d4:af:76:bd:d4:93:62:eb:30:64: - b8:81:08:6c:c3:04:d9:62:17:8e:2f:ff:3e:65:cf: - 8f:ce:62:e6:3c:52:1c:da:16:45:4b:55:ab:78:6b: - 63:83:62:90:ce:0f:69:6c:99:c8:1a:14:8b:4c:cc: - 45:33:ea:88:dc:9e:a3:af:2b:fe:80:61:9d:79:57: - c4:cf:2e:f4:3f:30:3c:5d:47:fc:9a:16:bc:c3:37: - 96:41:51:8e:11:4b:54:f8:28:be:d0:8c:be:f0:30: - 38:1e:f3:b0:26:f8:66:47:63:6d:de:71:26:47:8f: - 38:47:53:d1:46:1d:b4:e3:dc:00:ea:45:ac:bd:bc: - 71:d9:aa:6f:00:db:db:cd:30:3a:79:4f:5f:4c:47: - f8:1d:ef:5b:c2:c4:9d:60:3b:b1:b2:43:91:d8:a4: - 33:4e:ea:b3:d6:27:4f:ad:25:8a:a5:c6:f4:d5:d0: - a6:ae:74:05:64:57:88:b5:44:55:d4:2d:2a:3a:3e: - f8:b8:bd:e9:32:0a:02:94:64:c4:16:3a:50:f1:4a: - ae:e7:79:33:af:0c:20:07:7f:e8:df:04:39:c2:69: - 02:6c:63:52:fa:77:c1:1b:c8:74:87:c8:b9:93:18: - 50:54:35:4b:69:4e:bc:3b:d3:49:2e:1f:dc:c1:d2: - 52:fb - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Subject Key Identifier: - 40:C2:BD:27:8E:CC:34:83:30:A2:33:D7:FB:6C:B3:F0:B4:2C:80:CE - X509v3 Authority Key Identifier: - keyid:3A:9A:85:07:10:67:28:B6:EF:F6:BD:05:41:6E:20:C1:94:DA:0F:DE - - Authority Information Access: - OCSP - URI:http://ocsp.godaddy.com/ - - X509v3 CRL Distribution Points: - - Full Name: - URI:http://crl.godaddy.com/gdroot-g2.crl - - X509v3 Certificate Policies: - Policy: X509v3 Any Policy - CPS: https://certs.godaddy.com/repository/ - - Signature Algorithm: sha256WithRSAEncryption - 08:7e:6c:93:10:c8:38:b8:96:a9:90:4b:ff:a1:5f:4f:04:ef: - 6c:3e:9c:88:06:c9:50:8f:a6:73:f7:57:31:1b:be:bc:e4:2f: - db:f8:ba:d3:5b:e0:b4:e7:e6:79:62:0e:0c:a2:d7:6a:63:73: - 31:b5:f5:a8:48:a4:3b:08:2d:a2:5d:90:d7:b4:7c:25:4f:11: - 56:30:c4:b6:44:9d:7b:2c:9d:e5:5e:e6:ef:0c:61:aa:bf:e4: - 2a:1b:ee:84:9e:b8:83:7d:c1:43:ce:44:a7:13:70:0d:91:1f: - f4:c8:13:ad:83:60:d9:d8:72:a8:73:24:1e:b5:ac:22:0e:ca: - 17:89:62:58:44:1b:ab:89:25:01:00:0f:cd:c4:1b:62:db:51: - b4:d3:0f:51:2a:9b:f4:bc:73:fc:76:ce:36:a4:cd:d9:d8:2c: - ea:ae:9b:f5:2a:b2:90:d1:4d:75:18:8a:3f:8a:41:90:23:7d: - 5b:4b:fe:a4:03:58:9b:46:b2:c3:60:60:83:f8:7d:50:41:ce: - c2:a1:90:c3:bb:ef:02:2f:d2:15:54:ee:44:15:d9:0a:ae:a7: - 8a:33:ed:b1:2d:76:36:26:dc:04:eb:9f:f7:61:1f:15:dc:87: - 6f:ee:46:96:28:ad:a1:26:7d:0a:09:a7:2e:04:a3:8d:bc:f8: - bc:04:30:01 ------BEGIN CERTIFICATE----- -MIIE0DCCA7igAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTExMDUwMzA3MDAwMFoXDTMxMDUwMzA3 -MDAwMFowgbQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjEtMCsGA1UE -CxMkaHR0cDovL2NlcnRzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkvMTMwMQYDVQQD -EypHbyBEYWRkeSBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC54MsQ1K92vdSTYuswZLiBCGzD -BNliF44v/z5lz4/OYuY8UhzaFkVLVat4a2ODYpDOD2lsmcgaFItMzEUz6ojcnqOv -K/6AYZ15V8TPLvQ/MDxdR/yaFrzDN5ZBUY4RS1T4KL7QjL7wMDge87Am+GZHY23e -cSZHjzhHU9FGHbTj3ADqRay9vHHZqm8A29vNMDp5T19MR/gd71vCxJ1gO7GyQ5HY -pDNO6rPWJ0+tJYqlxvTV0KaudAVkV4i1RFXULSo6Pvi4vekyCgKUZMQWOlDxSq7n -eTOvDCAHf+jfBDnCaQJsY1L6d8EbyHSHyLmTGFBUNUtpTrw700kuH9zB0lL7AgMB -AAGjggEaMIIBFjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV -HQ4EFgQUQMK9J47MNIMwojPX+2yz8LQsgM4wHwYDVR0jBBgwFoAUOpqFBxBnKLbv -9r0FQW4gwZTaD94wNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8v -b2NzcC5nb2RhZGR5LmNvbS8wNQYDVR0fBC4wLDAqoCigJoYkaHR0cDovL2NybC5n -b2RhZGR5LmNvbS9nZHJvb3QtZzIuY3JsMEYGA1UdIAQ/MD0wOwYEVR0gADAzMDEG -CCsGAQUFBwIBFiVodHRwczovL2NlcnRzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkv -MA0GCSqGSIb3DQEBCwUAA4IBAQAIfmyTEMg4uJapkEv/oV9PBO9sPpyIBslQj6Zz -91cxG7685C/b+LrTW+C05+Z5Yg4MotdqY3MxtfWoSKQ7CC2iXZDXtHwlTxFWMMS2 -RJ17LJ3lXubvDGGqv+QqG+6EnriDfcFDzkSnE3ANkR/0yBOtg2DZ2HKocyQetawi -DsoXiWJYRBuriSUBAA/NxBti21G00w9RKpv0vHP8ds42pM3Z2Czqrpv1KrKQ0U11 -GIo/ikGQI31bS/6kA1ibRrLDYGCD+H1QQc7CoZDDu+8CL9IVVO5EFdkKrqeKM+2x -LXY2JtwE65/3YR8V3Idv7kaWKK2hJn0KCacuBKONvPi8BDAB ------END CERTIFICATE----- -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 0 (0x0) - Signature Algorithm: sha256WithRSAEncryption - Issuer: C = US, ST = Arizona, L = Scottsdale, O = "GoDaddy.com, Inc.", CN = Go Daddy Root Certificate Authority - G2 - Validity - Not Before: Sep 1 00:00:00 2009 GMT - Not After : Dec 31 23:59:59 2037 GMT - Subject: C = US, ST = Arizona, L = Scottsdale, O = "GoDaddy.com, Inc.", CN = Go Daddy Root Certificate Authority - G2 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public-Key: (2048 bit) - Modulus: - 00:bf:71:62:08:f1:fa:59:34:f7:1b:c9:18:a3:f7: - 80:49:58:e9:22:83:13:a6:c5:20:43:01:3b:84:f1: - e6:85:49:9f:27:ea:f6:84:1b:4e:a0:b4:db:70:98: - c7:32:01:b1:05:3e:07:4e:ee:f4:fa:4f:2f:59:30: - 22:e7:ab:19:56:6b:e2:80:07:fc:f3:16:75:80:39: - 51:7b:e5:f9:35:b6:74:4e:a9:8d:82:13:e4:b6:3f: - a9:03:83:fa:a2:be:8a:15:6a:7f:de:0b:c3:b6:19: - 14:05:ca:ea:c3:a8:04:94:3b:46:7c:32:0d:f3:00: - 66:22:c8:8d:69:6d:36:8c:11:18:b7:d3:b2:1c:60: - b4:38:fa:02:8c:ce:d3:dd:46:07:de:0a:3e:eb:5d: - 7c:c8:7c:fb:b0:2b:53:a4:92:62:69:51:25:05:61: - 1a:44:81:8c:2c:a9:43:96:23:df:ac:3a:81:9a:0e: - 29:c5:1c:a9:e9:5d:1e:b6:9e:9e:30:0a:39:ce:f1: - 88:80:fb:4b:5d:cc:32:ec:85:62:43:25:34:02:56: - 27:01:91:b4:3b:70:2a:3f:6e:b1:e8:9c:88:01:7d: - 9f:d4:f9:db:53:6d:60:9d:bf:2c:e7:58:ab:b8:5f: - 46:fc:ce:c4:1b:03:3c:09:eb:49:31:5c:69:46:b3: - e0:47 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Key Usage: critical - Certificate Sign, CRL Sign - X509v3 Subject Key Identifier: - 3A:9A:85:07:10:67:28:B6:EF:F6:BD:05:41:6E:20:C1:94:DA:0F:DE - Signature Algorithm: sha256WithRSAEncryption - 99:db:5d:79:d5:f9:97:59:67:03:61:f1:7e:3b:06:31:75:2d: - a1:20:8e:4f:65:87:b4:f7:a6:9c:bc:d8:e9:2f:d0:db:5a:ee: - cf:74:8c:73:b4:38:42:da:05:7b:f8:02:75:b8:fd:a5:b1:d7: - ae:f6:d7:de:13:cb:53:10:7e:8a:46:d1:97:fa:b7:2e:2b:11: - ab:90:b0:27:80:f9:e8:9f:5a:e9:37:9f:ab:e4:df:6c:b3:85: - 17:9d:3d:d9:24:4f:79:91:35:d6:5f:04:eb:80:83:ab:9a:02: - 2d:b5:10:f4:d8:90:c7:04:73:40:ed:72:25:a0:a9:9f:ec:9e: - ab:68:12:99:57:c6:8f:12:3a:09:a4:bd:44:fd:06:15:37:c1: - 9b:e4:32:a3:ed:38:e8:d8:64:f3:2c:7e:14:fc:02:ea:9f:cd: - ff:07:68:17:db:22:90:38:2d:7a:8d:d1:54:f1:69:e3:5f:33: - ca:7a:3d:7b:0a:e3:ca:7f:5f:39:e5:e2:75:ba:c5:76:18:33: - ce:2c:f0:2f:4c:ad:f7:b1:e7:ce:4f:a8:c4:9b:4a:54:06:c5: - 7f:7d:d5:08:0f:e2:1c:fe:7e:17:b8:ac:5e:f6:d4:16:b2:43: - 09:0c:4d:f6:a7:6b:b4:99:84:65:ca:7a:88:e2:e2:44:be:5c: - f7:ea:1c:f5 ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz -NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE -AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD -E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH -/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy -DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh -GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR -tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA -AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX -WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu -9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr -gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo -2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI -4uJEvlz36hz1 ------END CERTIFICATE----- diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 9a628ce..1890483 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -143,7 +143,7 @@ } :do { - :if ([ $CertificateAvailable "Go Daddy Secure Certificate Authority - G2" ] = false) do={ + :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); :error false; } diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 0fd8a06..1c274ec 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -55,7 +55,7 @@ :set TelegramRandomDelay 0; } - :if ([ $CertificateAvailable "Go Daddy Secure Certificate Authority - G2" ] = false) do={ + :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={ $LogPrint warning $ScriptName ("Downloading required certificate failed."); :error false; } From a05efdc07fa912d0d17f4994ee9e892b51030be1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Jun 2024 10:55:13 +0200 Subject: [PATCH 102/893] certs: DigiCert Global G2 TLS RSA SHA256 2020 CA1 -> DigiCert Global Root G2 This is used by Cloudflare DNS (1.1.1.1). $CertificateAvailable "DigiCert Global Root G2"; /ip/dns/set use-doh-server=https://1.1.1.1/dns-query verify-doh-cert=yes; --- ...Cert-Global-G2-TLS-RSA-SHA256-2020-CA1.pem | 182 ------------------ certs/DigiCert-Global-Root-G2.pem | 29 +++ doc/netwatch-dns.md | 2 +- 3 files changed, 30 insertions(+), 183 deletions(-) delete mode 100644 certs/DigiCert-Global-G2-TLS-RSA-SHA256-2020-CA1.pem create mode 100644 certs/DigiCert-Global-Root-G2.pem diff --git a/certs/DigiCert-Global-G2-TLS-RSA-SHA256-2020-CA1.pem b/certs/DigiCert-Global-G2-TLS-RSA-SHA256-2020-CA1.pem deleted file mode 100644 index 12084ee..0000000 --- a/certs/DigiCert-Global-G2-TLS-RSA-SHA256-2020-CA1.pem +++ /dev/null @@ -1,182 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 0c:f5:bd:06:2b:56:02:f4:7a:b8:50:2c:23:cc:f0:66 - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root G2 - Validity - Not Before: Mar 30 00:00:00 2021 GMT - Not After : Mar 29 23:59:59 2031 GMT - Subject: C=US, O=DigiCert Inc, CN=DigiCert Global G2 TLS RSA SHA256 2020 CA1 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) - Modulus: - 00:cc:f7:10:62:4f:a6:bb:63:6f:ed:90:52:56:c5: - 6d:27:7b:7a:12:56:8a:f1:f4:f9:d6:e7:e1:8f:bd: - 95:ab:f2:60:41:15:70:db:12:00:fa:27:0a:b5:57: - 38:5b:7d:b2:51:93:71:95:0e:6a:41:94:5b:35:1b: - fa:7b:fa:bb:c5:be:24:30:fe:56:ef:c4:f3:7d:97: - e3:14:f5:14:4d:cb:a7:10:f2:16:ea:ab:22:f0:31: - 22:11:61:69:90:26:ba:78:d9:97:1f:e3:7d:66:ab: - 75:44:95:73:c8:ac:ff:ef:5d:0a:8a:59:43:e1:ac: - b2:3a:0f:f3:48:fc:d7:6b:37:c1:63:dc:de:46:d6: - db:45:fe:7d:23:fd:90:e8:51:07:1e:51:a3:5f:ed: - 49:46:54:7f:2c:88:c5:f4:13:9c:97:15:3c:03:e8: - a1:39:dc:69:0c:32:c1:af:16:57:4c:94:47:42:7c: - a2:c8:9c:7d:e6:d4:4d:54:af:42:99:a8:c1:04:c2: - 77:9c:d6:48:e4:ce:11:e0:2a:80:99:f0:43:70:cf: - 3f:76:6b:d1:4c:49:ab:24:5e:c2:0d:82:fd:46:a8: - ab:6c:93:cc:62:52:42:75:92:f8:9a:fa:5e:5e:b2: - b0:61:e5:1f:1f:b9:7f:09:98:e8:3d:fa:83:7f:47: - 69:a1 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:TRUE, pathlen:0 - X509v3 Subject Key Identifier: - 74:85:80:C0:66:C7:DF:37:DE:CF:BD:29:37:AA:03:1D:BE:ED:CD:17 - X509v3 Authority Key Identifier: - 4E:22:54:20:18:95:E6:E3:6E:E6:0F:FA:FA:B9:12:ED:06:17:8F:39 - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Extended Key Usage: - TLS Web Server Authentication, TLS Web Client Authentication - Authority Information Access: - OCSP - URI:http://ocsp.digicert.com - CA Issuers - URI:http://cacerts.digicert.com/DigiCertGlobalRootG2.crt - X509v3 CRL Distribution Points: - Full Name: - URI:http://crl3.digicert.com/DigiCertGlobalRootG2.crl - X509v3 Certificate Policies: - Policy: 2.16.840.1.114412.2.1 - Policy: 2.23.140.1.1 - Policy: 2.23.140.1.2.1 - Policy: 2.23.140.1.2.2 - Policy: 2.23.140.1.2.3 - Signature Algorithm: sha256WithRSAEncryption - Signature Value: - 90:f1:70:cb:28:97:69:97:7c:74:fd:c0:fa:26:7b:53:ab:ad: - cd:65:fd:ba:9c:06:9c:8a:d7:5a:43:87:ed:4d:4c:56:5f:ad: - c1:c5:b5:05:20:2e:59:d1:ff:4a:f5:a0:2a:d8:b0:95:ad:c9: - 2e:4a:3b:d7:a7:f6:6f:88:29:fc:30:3f:24:84:bb:c3:b7:7b: - 93:07:2c:af:87:6b:76:33:ed:00:55:52:b2:59:9e:e4:b9:d0: - f3:df:e7:0f:fe:dd:f8:c4:b9:10:72:81:09:04:5f:cf:97:9e: - 2e:32:75:8e:cf:9a:58:d2:57:31:7e:37:01:81:b2:66:6d:29: - 1a:b1:66:09:6d:d1:6e:90:f4:b9:fa:2f:01:14:c5:5c:56:64: - 01:d9:7d:87:a8:38:53:9f:8b:5d:46:6d:5c:c6:27:84:81:d4: - 7e:8c:8c:a3:9b:52:e7:c6:88:ec:37:7c:2a:fb:f0:55:5a:38: - 72:10:d8:00:13:cf:4c:73:db:aa:37:35:a8:29:81:69:9c:76: - bc:de:18:7b:90:d4:ca:cf:ef:67:03:fd:04:5a:21:16:b1:ff: - ea:3f:df:dc:82:f5:eb:f4:59:92:23:0d:24:2a:95:25:4c:ca: - a1:91:e6:d4:b7:ac:87:74:b3:f1:6d:a3:99:db:f9:d5:bd:84: - 40:9f:07:98 ------BEGIN CERTIFICATE----- -MIIEyDCCA7CgAwIBAgIQDPW9BitWAvR6uFAsI8zwZjANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0yMTAzMzAwMDAwMDBaFw0zMTAzMjkyMzU5NTlaMFkxCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxMzAxBgNVBAMTKkRpZ2lDZXJ0IEdsb2Jh -bCBHMiBUTFMgUlNBIFNIQTI1NiAyMDIwIENBMTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMz3EGJPprtjb+2QUlbFbSd7ehJWivH0+dbn4Y+9lavyYEEV -cNsSAPonCrVXOFt9slGTcZUOakGUWzUb+nv6u8W+JDD+Vu/E832X4xT1FE3LpxDy -FuqrIvAxIhFhaZAmunjZlx/jfWardUSVc8is/+9dCopZQ+GssjoP80j812s3wWPc -3kbW20X+fSP9kOhRBx5Ro1/tSUZUfyyIxfQTnJcVPAPooTncaQwywa8WV0yUR0J8 -osicfebUTVSvQpmowQTCd5zWSOTOEeAqgJnwQ3DPP3Zr0UxJqyRewg2C/Uaoq2yT -zGJSQnWS+Jr6Xl6ysGHlHx+5fwmY6D36g39HaaECAwEAAaOCAYIwggF+MBIGA1Ud -EwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFHSFgMBmx9833s+9KTeqAx2+7c0XMB8G -A1UdIwQYMBaAFE4iVCAYlebjbuYP+vq5Eu0GF485MA4GA1UdDwEB/wQEAwIBhjAd -BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwdgYIKwYBBQUHAQEEajBoMCQG -CCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQAYIKwYBBQUHMAKG -NGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RH -Mi5jcnQwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQuY29t -L0RpZ2lDZXJ0R2xvYmFsUm9vdEcyLmNybDA9BgNVHSAENjA0MAsGCWCGSAGG/WwC -ATAHBgVngQwBATAIBgZngQwBAgEwCAYGZ4EMAQICMAgGBmeBDAECAzANBgkqhkiG -9w0BAQsFAAOCAQEAkPFwyyiXaZd8dP3A+iZ7U6utzWX9upwGnIrXWkOH7U1MVl+t -wcW1BSAuWdH/SvWgKtiwla3JLko716f2b4gp/DA/JIS7w7d7kwcsr4drdjPtAFVS -slme5LnQ89/nD/7d+MS5EHKBCQRfz5eeLjJ1js+aWNJXMX43AYGyZm0pGrFmCW3R -bpD0ufovARTFXFZkAdl9h6g4U5+LXUZtXMYnhIHUfoyMo5tS58aI7Dd8KvvwVVo4 -chDYABPPTHPbqjc1qCmBaZx2vN4Ye5DUys/vZwP9BFohFrH/6j/f3IL16/RZkiMN -JCqVJUzKoZHm1Lesh3Sz8W2jmdv51b2EQJ8HmA== ------END CERTIFICATE----- -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 03:3a:f1:e6:a7:11:a9:a0:bb:28:64:b1:1d:09:fa:e5 - Signature Algorithm: sha256WithRSAEncryption - Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root G2 - Validity - Not Before: Aug 1 12:00:00 2013 GMT - Not After : Jan 15 12:00:00 2038 GMT - Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root G2 - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) - Modulus: - 00:bb:37:cd:34:dc:7b:6b:c9:b2:68:90:ad:4a:75: - ff:46:ba:21:0a:08:8d:f5:19:54:c9:fb:88:db:f3: - ae:f2:3a:89:91:3c:7a:e6:ab:06:1a:6b:cf:ac:2d: - e8:5e:09:24:44:ba:62:9a:7e:d6:a3:a8:7e:e0:54: - 75:20:05:ac:50:b7:9c:63:1a:6c:30:dc:da:1f:19: - b1:d7:1e:de:fd:d7:e0:cb:94:83:37:ae:ec:1f:43: - 4e:dd:7b:2c:d2:bd:2e:a5:2f:e4:a9:b8:ad:3a:d4: - 99:a4:b6:25:e9:9b:6b:00:60:92:60:ff:4f:21:49: - 18:f7:67:90:ab:61:06:9c:8f:f2:ba:e9:b4:e9:92: - 32:6b:b5:f3:57:e8:5d:1b:cd:8c:1d:ab:95:04:95: - 49:f3:35:2d:96:e3:49:6d:dd:77:e3:fb:49:4b:b4: - ac:55:07:a9:8f:95:b3:b4:23:bb:4c:6d:45:f0:f6: - a9:b2:95:30:b4:fd:4c:55:8c:27:4a:57:14:7c:82: - 9d:cd:73:92:d3:16:4a:06:0c:8c:50:d1:8f:1e:09: - be:17:a1:e6:21:ca:fd:83:e5:10:bc:83:a5:0a:c4: - 67:28:f6:73:14:14:3d:46:76:c3:87:14:89:21:34: - 4d:af:0f:45:0c:a6:49:a1:ba:bb:9c:c5:b1:33:83: - 29:85 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Subject Key Identifier: - 4E:22:54:20:18:95:E6:E3:6E:E6:0F:FA:FA:B9:12:ED:06:17:8F:39 - Signature Algorithm: sha256WithRSAEncryption - Signature Value: - 60:67:28:94:6f:0e:48:63:eb:31:dd:ea:67:18:d5:89:7d:3c: - c5:8b:4a:7f:e9:be:db:2b:17:df:b0:5f:73:77:2a:32:13:39: - 81:67:42:84:23:f2:45:67:35:ec:88:bf:f8:8f:b0:61:0c:34: - a4:ae:20:4c:84:c6:db:f8:35:e1:76:d9:df:a6:42:bb:c7:44: - 08:86:7f:36:74:24:5a:da:6c:0d:14:59:35:bd:f2:49:dd:b6: - 1f:c9:b3:0d:47:2a:3d:99:2f:bb:5c:bb:b5:d4:20:e1:99:5f: - 53:46:15:db:68:9b:f0:f3:30:d5:3e:31:e2:8d:84:9e:e3:8a: - da:da:96:3e:35:13:a5:5f:f0:f9:70:50:70:47:41:11:57:19: - 4e:c0:8f:ae:06:c4:95:13:17:2f:1b:25:9f:75:f2:b1:8e:99: - a1:6f:13:b1:41:71:fe:88:2a:c8:4f:10:20:55:d7:f3:14:45: - e5:e0:44:f4:ea:87:95:32:93:0e:fe:53:46:fa:2c:9d:ff:8b: - 22:b9:4b:d9:09:45:a4:de:a4:b8:9a:58:dd:1b:7d:52:9f:8e: - 59:43:88:81:a4:9e:26:d5:6f:ad:dd:0d:c6:37:7d:ed:03:92: - 1b:e5:77:5f:76:ee:3c:8d:c4:5d:56:5b:a2:d9:66:6e:b3:35: - 37:e5:32:b6 ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI -2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx -1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ -q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz -tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ -vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV -5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY -1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 -NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG -Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 -8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe -pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- diff --git a/certs/DigiCert-Global-Root-G2.pem b/certs/DigiCert-Global-Root-G2.pem new file mode 100644 index 0000000..8af6c7a --- /dev/null +++ b/certs/DigiCert-Global-Root-G2.pem @@ -0,0 +1,29 @@ +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- diff --git a/doc/netwatch-dns.md b/doc/netwatch-dns.md index 3214368..3d2c6be 100644 --- a/doc/netwatch-dns.md +++ b/doc/netwatch-dns.md @@ -62,7 +62,7 @@ manually! Importing a certificate automatically is possible, at least if available in the repository (see `certs` sub directory). - /tool/netwatch/add comment="doh, doh-cert=DigiCert Global G2 TLS RSA SHA256 2020 CA1" host=1.1.1.1; + /tool/netwatch/add comment="doh, doh-cert=DigiCert Global Root G2" host=1.1.1.1; /tool/netwatch/add comment="doh, doh-cert=DigiCert TLS Hybrid ECC SHA384 2020 CA1" host=9.9.9.9; /tool/netwatch/add comment="doh, doh-cert=GTS Root R1" host=8.8.8.8; From c4e8d01de19f9c5e1d19c74c010079233c4d4df5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Jun 2024 10:57:16 +0200 Subject: [PATCH 103/893] certs: DigiCert TLS Hybrid ECC SHA384 2020 CA1 -> DigiCert Global Root CA This is used by Cloudflare DNS Quard9 (9.9.9.9). $CertificateAvailable "DigiCert Global Root CA"; /ip/dns/set use-doh-server=https://9.9.9.9/dns-query verify-doh-cert=yes; --- certs/DigiCert-Global-Root-CA.pem | 29 +++ ...igiCert-TLS-Hybrid-ECC-SHA384-2020-CA1.pem | 174 ------------------ doc/netwatch-dns.md | 2 +- 3 files changed, 30 insertions(+), 175 deletions(-) create mode 100644 certs/DigiCert-Global-Root-CA.pem delete mode 100644 certs/DigiCert-TLS-Hybrid-ECC-SHA384-2020-CA1.pem diff --git a/certs/DigiCert-Global-Root-CA.pem b/certs/DigiCert-Global-Root-CA.pem new file mode 100644 index 0000000..b0f0013 --- /dev/null +++ b/certs/DigiCert-Global-Root-CA.pem @@ -0,0 +1,29 @@ +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- diff --git a/certs/DigiCert-TLS-Hybrid-ECC-SHA384-2020-CA1.pem b/certs/DigiCert-TLS-Hybrid-ECC-SHA384-2020-CA1.pem deleted file mode 100644 index 446f56f..0000000 --- a/certs/DigiCert-TLS-Hybrid-ECC-SHA384-2020-CA1.pem +++ /dev/null @@ -1,174 +0,0 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 07:f2:f3:5c:87:a8:77:af:7a:ef:e9:47:99:35:25:bd - Signature Algorithm: sha384WithRSAEncryption - Issuer: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA - Validity - Not Before: Apr 14 00:00:00 2021 GMT - Not After : Apr 13 23:59:59 2031 GMT - Subject: C = US, O = DigiCert Inc, CN = DigiCert TLS Hybrid ECC SHA384 2020 CA1 - Subject Public Key Info: - Public Key Algorithm: id-ecPublicKey - Public-Key: (384 bit) - pub: - 04:c1:1b:c6:9a:5b:98:d9:a4:29:a0:e9:d4:04:b5: - db:eb:a6:b2:6c:55:c0:ff:ed:98:c6:49:2f:06:27: - 51:cb:bf:70:c1:05:7a:c3:b1:9d:87:89:ba:ad:b4: - 13:17:c9:a8:b4:83:c8:b8:90:d1:cc:74:35:36:3c: - 83:72:b0:b5:d0:f7:22:69:c8:f1:80:c4:7b:40:8f: - cf:68:87:26:5c:39:89:f1:4d:91:4d:da:89:8b:e4: - 03:c3:43:e5:bf:2f:73 - ASN1 OID: secp384r1 - NIST CURVE: P-384 - X509v3 extensions: - X509v3 Basic Constraints: critical - CA:TRUE, pathlen:0 - X509v3 Subject Key Identifier: - 0A:BC:08:29:17:8C:A5:39:6D:7A:0E:CE:33:C7:2E:B3:ED:FB:C3:7A - X509v3 Authority Key Identifier: - keyid:03:DE:50:35:56:D1:4C:BB:66:F0:A3:E2:1B:1B:C3:97:B2:3D:D1:55 - - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Extended Key Usage: - TLS Web Server Authentication, TLS Web Client Authentication - Authority Information Access: - OCSP - URI:http://ocsp.digicert.com - CA Issuers - URI:http://cacerts.digicert.com/DigiCertGlobalRootCA.crt - - X509v3 CRL Distribution Points: - - Full Name: - URI:http://crl3.digicert.com/DigiCertGlobalRootCA.crl - - X509v3 Certificate Policies: - Policy: 2.16.840.1.114412.2.1 - Policy: 2.23.140.1.1 - Policy: 2.23.140.1.2.1 - Policy: 2.23.140.1.2.2 - Policy: 2.23.140.1.2.3 - - Signature Algorithm: sha384WithRSAEncryption - 47:59:81:7f:d4:1b:1f:b0:71:f6:98:5d:18:ba:98:47:98:b0: - 7e:76:2b:ea:ff:1a:8b:ac:26:b3:42:8d:31:e6:4a:e8:19:d0: - ef:da:14:e7:d7:14:92:a1:92:f2:a7:2e:2d:af:fb:1d:f6:fb: - 53:b0:8a:3f:fc:d8:16:0a:e9:b0:2e:b6:a5:0b:18:90:35:26: - a2:da:f6:a8:b7:32:fc:95:23:4b:c6:45:b9:c4:cf:e4:7c:ee: - e6:c9:f8:90:bd:72:e3:99:c3:1d:0b:05:7c:6a:97:6d:b2:ab: - 02:36:d8:c2:bc:2c:01:92:3f:04:a3:8b:75:11:c7:b9:29:bc: - 11:d0:86:ba:92:bc:26:f9:65:c8:37:cd:26:f6:86:13:0c:04: - aa:89:e5:78:b1:c1:4e:79:bc:76:a3:0b:51:e4:c5:d0:9e:6a: - fe:1a:2c:56:ae:06:36:27:a3:73:1c:08:7d:93:32:d0:c2:44: - 19:da:8d:f4:0e:7b:1d:28:03:2b:09:8a:76:ca:77:dc:87:7a: - ac:7b:52:26:55:a7:72:0f:9d:d2:88:4f:fe:b1:21:c5:1a:a1: - aa:39:f5:56:db:c2:84:c4:35:1f:70:da:bb:46:f0:86:bf:64: - 00:c4:3e:f7:9f:46:1b:9d:23:05:b9:7d:b3:4f:0f:a9:45:3a: - e3:74:30:98 ------BEGIN CERTIFICATE----- -MIIEFzCCAv+gAwIBAgIQB/LzXIeod6967+lHmTUlvTANBgkqhkiG9w0BAQwFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0yMTA0MTQwMDAwMDBaFw0zMTA0MTMyMzU5NTlaMFYxCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxMDAuBgNVBAMTJ0RpZ2lDZXJ0IFRMUyBI -eWJyaWQgRUNDIFNIQTM4NCAyMDIwIENBMTB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BMEbxppbmNmkKaDp1AS12+umsmxVwP/tmMZJLwYnUcu/cMEFesOxnYeJuq20ExfJ -qLSDyLiQ0cx0NTY8g3KwtdD3ImnI8YDEe0CPz2iHJlw5ifFNkU3aiYvkA8ND5b8v -c6OCAYIwggF+MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFAq8CCkXjKU5 -bXoOzjPHLrPt+8N6MB8GA1UdIwQYMBaAFAPeUDVW0Uy7ZvCj4hsbw5eyPdFVMA4G -A1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwdgYI -KwYBBQUHAQEEajBoMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5j -b20wQAYIKwYBBQUHMAKGNGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdp -Q2VydEdsb2JhbFJvb3RDQS5jcnQwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny -bDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNybDA9BgNVHSAE -NjA0MAsGCWCGSAGG/WwCATAHBgVngQwBATAIBgZngQwBAgEwCAYGZ4EMAQICMAgG -BmeBDAECAzANBgkqhkiG9w0BAQwFAAOCAQEAR1mBf9QbH7Bx9phdGLqYR5iwfnYr -6v8ai6wms0KNMeZK6BnQ79oU59cUkqGS8qcuLa/7Hfb7U7CKP/zYFgrpsC62pQsY -kDUmotr2qLcy/JUjS8ZFucTP5Hzu5sn4kL1y45nDHQsFfGqXbbKrAjbYwrwsAZI/ -BKOLdRHHuSm8EdCGupK8JvllyDfNJvaGEwwEqonleLHBTnm8dqMLUeTF0J5q/hos -Vq4GNiejcxwIfZMy0MJEGdqN9A57HSgDKwmKdsp33Id6rHtSJlWncg+d0ohP/rEh -xRqhqjn1VtvChMQ1H3Dau0bwhr9kAMQ+959GG50jBbl9s08PqUU643QwmA== ------END CERTIFICATE----- -Certificate: - Data: - Version: 3 (0x2) - Serial Number: - 08:3b:e0:56:90:42:46:b1:a1:75:6a:c9:59:91:c7:4a - Signature Algorithm: sha1WithRSAEncryption - Issuer: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA - Validity - Not Before: Nov 10 00:00:00 2006 GMT - Not After : Nov 10 00:00:00 2031 GMT - Subject: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - RSA Public-Key: (2048 bit) - Modulus: - 00:e2:3b:e1:11:72:de:a8:a4:d3:a3:57:aa:50:a2: - 8f:0b:77:90:c9:a2:a5:ee:12:ce:96:5b:01:09:20: - cc:01:93:a7:4e:30:b7:53:f7:43:c4:69:00:57:9d: - e2:8d:22:dd:87:06:40:00:81:09:ce:ce:1b:83:bf: - df:cd:3b:71:46:e2:d6:66:c7:05:b3:76:27:16:8f: - 7b:9e:1e:95:7d:ee:b7:48:a3:08:da:d6:af:7a:0c: - 39:06:65:7f:4a:5d:1f:bc:17:f8:ab:be:ee:28:d7: - 74:7f:7a:78:99:59:85:68:6e:5c:23:32:4b:bf:4e: - c0:e8:5a:6d:e3:70:bf:77:10:bf:fc:01:f6:85:d9: - a8:44:10:58:32:a9:75:18:d5:d1:a2:be:47:e2:27: - 6a:f4:9a:33:f8:49:08:60:8b:d4:5f:b4:3a:84:bf: - a1:aa:4a:4c:7d:3e:cf:4f:5f:6c:76:5e:a0:4b:37: - 91:9e:dc:22:e6:6d:ce:14:1a:8e:6a:cb:fe:cd:b3: - 14:64:17:c7:5b:29:9e:32:bf:f2:ee:fa:d3:0b:42: - d4:ab:b7:41:32:da:0c:d4:ef:f8:81:d5:bb:8d:58: - 3f:b5:1b:e8:49:28:a2:70:da:31:04:dd:f7:b2:16: - f2:4c:0a:4e:07:a8:ed:4a:3d:5e:b5:7f:a3:90:c3: - af:27 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Key Usage: critical - Digital Signature, Certificate Sign, CRL Sign - X509v3 Basic Constraints: critical - CA:TRUE - X509v3 Subject Key Identifier: - 03:DE:50:35:56:D1:4C:BB:66:F0:A3:E2:1B:1B:C3:97:B2:3D:D1:55 - X509v3 Authority Key Identifier: - keyid:03:DE:50:35:56:D1:4C:BB:66:F0:A3:E2:1B:1B:C3:97:B2:3D:D1:55 - - Signature Algorithm: sha1WithRSAEncryption - cb:9c:37:aa:48:13:12:0a:fa:dd:44:9c:4f:52:b0:f4:df:ae: - 04:f5:79:79:08:a3:24:18:fc:4b:2b:84:c0:2d:b9:d5:c7:fe: - f4:c1:1f:58:cb:b8:6d:9c:7a:74:e7:98:29:ab:11:b5:e3:70: - a0:a1:cd:4c:88:99:93:8c:91:70:e2:ab:0f:1c:be:93:a9:ff: - 63:d5:e4:07:60:d3:a3:bf:9d:5b:09:f1:d5:8e:e3:53:f4:8e: - 63:fa:3f:a7:db:b4:66:df:62:66:d6:d1:6e:41:8d:f2:2d:b5: - ea:77:4a:9f:9d:58:e2:2b:59:c0:40:23:ed:2d:28:82:45:3e: - 79:54:92:26:98:e0:80:48:a8:37:ef:f0:d6:79:60:16:de:ac: - e8:0e:cd:6e:ac:44:17:38:2f:49:da:e1:45:3e:2a:b9:36:53: - cf:3a:50:06:f7:2e:e8:c4:57:49:6c:61:21:18:d5:04:ad:78: - 3c:2c:3a:80:6b:a7:eb:af:15:14:e9:d8:89:c1:b9:38:6c:e2: - 91:6c:8a:ff:64:b9:77:25:57:30:c0:1b:24:a3:e1:dc:e9:df: - 47:7c:b5:b4:24:08:05:30:ec:2d:bd:0b:bf:45:bf:50:b9:a9: - f3:eb:98:01:12:ad:c8:88:c6:98:34:5f:8d:0a:3c:c6:e9:d5: - 95:95:6d:de ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- diff --git a/doc/netwatch-dns.md b/doc/netwatch-dns.md index 3d2c6be..9fe486e 100644 --- a/doc/netwatch-dns.md +++ b/doc/netwatch-dns.md @@ -63,7 +63,7 @@ Importing a certificate automatically is possible, at least if available in the repository (see `certs` sub directory). /tool/netwatch/add comment="doh, doh-cert=DigiCert Global Root G2" host=1.1.1.1; - /tool/netwatch/add comment="doh, doh-cert=DigiCert TLS Hybrid ECC SHA384 2020 CA1" host=9.9.9.9; + /tool/netwatch/add comment="doh, doh-cert=DigiCert Global Root CA" host=9.9.9.9; /tool/netwatch/add comment="doh, doh-cert=GTS Root R1" host=8.8.8.8; Sometimes using just one specific (possibly internal) DNS server may be From 1a6812ef797a1683cec9678062cfaca367500ad0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Jun 2024 20:51:46 +0200 Subject: [PATCH 104/893] notify on changes regarding certificates --- global-functions.rsc | 2 +- news-and-changes.rsc | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index ca8ecb1..eb9f638 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -12,7 +12,7 @@ :local ScriptName [ :jobname ]; # expected configuration version -:global ExpectedConfigVersion 129; +:global ExpectedConfigVersion 130; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/news-and-changes.rsc b/news-and-changes.rsc index b20bbaf..cf17e7a 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -54,6 +54,7 @@ 127="Added support for authentication to Ntfy notification module."; 128="Added another list from blocklist.de to default configuration for 'fw-addr-lists'."; 129="Extended 'backup-partition' to support RouterOS copy-over - interactively or before feature update."; + 130="Dropped intermediate certificates, depending on just root certificates now."; }; # Migration steps to be applied on script updates From cdb553d39b21e82e70f427b0a7c4e95dc4f2055f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Jun 2024 12:25:26 +0200 Subject: [PATCH 105/893] global-functions: $CertificateDownload: try fallback to mkcert.org There's a nice API that allows to download certificate by exact common name. Let's use that, as a fallback at least. https://mkcert.org/ --- global-functions.rsc | 41 ++++++++++++++++++++++++++++++----------- news-and-changes.rsc | 1 + 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index eb9f638..26472b8 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -12,7 +12,7 @@ :local ScriptName [ :jobname ]; # expected configuration version -:global ExpectedConfigVersion 130; +:global ExpectedConfigVersion 131; # global variables not to be changed by user :global GlobalFunctionsReady false; @@ -135,6 +135,7 @@ :global ScriptUpdatesBaseUrl; :global ScriptUpdatesUrlSuffix; + :global CertificateAvailable; :global CertificateNameByCN; :global CleanName; :global FetchUserAgentStr; @@ -143,22 +144,40 @@ $LogPrint info $0 ("Downloading and importing certificate with " . \ "CommonName '" . $CommonName . "'."); + :local FileName ([ $CleanName $CommonName ] . ".pem"); :do { - :local FileName ([ $CleanName $CommonName ] . ".pem"); /tool/fetch check-certificate=yes-without-crl http-header-field=({ [ $FetchUserAgentStr $0 ] }) \ ($ScriptUpdatesBaseUrl . "certs/" . $FileName . $ScriptUpdatesUrlSuffix) \ dst-path=$FileName as-value; $WaitForFile $FileName; - /certificate/import file-name=$FileName passphrase="" as-value; - :delay 1s; - /file/remove [ find where name=$FileName ]; - - :foreach Cert in=[ /certificate/find where name~("^" . $FileName . "_[0-9]+\$") ] do={ - $CertificateNameByCN [ /certificate/get $Cert common-name ]; - } } on-error={ - $LogPrint warning $0 ("Failed importing certificate with CommonName '" . $CommonName . "'!"); - :return false; + $LogPrint warning $0 ("Failed downloading certificate with CommonName '" . $CommonName . \ + "' from repository! Trying fallback to mkcert.org..."); + :do { + :if ([ $CertificateAvailable "ISRG Root X1" ] = false) do={ + $LogPrint error $0 ("Downloading required certificate failed."); + :return false; + } + /tool/fetch check-certificate=yes-without-crl http-header-field=({ [ $FetchUserAgentStr $0 ] }) \ + "https://mkcert.org/generate/" http-data=[ :serialize to=json ({ $CommonName }) ] \ + dst-path=$FileName as-value; + $WaitForFile $FileName; + :if ([ /file/get $FileName size ] = 0) do={ + /file/remove $FileName; + :error false; + } + } on-error={ + $LogPrint warning $0 ("Failed downloading certificate with CommonName '" . $CommonName . "'!"); + :return false; + } + } + + /certificate/import file-name=$FileName passphrase="" as-value; + :delay 1s; + /file/remove [ find where name=$FileName ]; + + :foreach Cert in=[ /certificate/find where name~("^" . $FileName . "_[0-9]+\$") ] do={ + $CertificateNameByCN [ /certificate/get $Cert common-name ]; } :return true; } diff --git a/news-and-changes.rsc b/news-and-changes.rsc index cf17e7a..8ddc3d6 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -55,6 +55,7 @@ 128="Added another list from blocklist.de to default configuration for 'fw-addr-lists'."; 129="Extended 'backup-partition' to support RouterOS copy-over - interactively or before feature update."; 130="Dropped intermediate certificates, depending on just root certificates now."; + 131="Enhanced certificate download to fallback to mkcert.org, so all (commonly trusted) root certificates are available now."; }; # Migration steps to be applied on script updates From f3f7d3edc0f6bd895e27019ed5d48e4afafe95fa Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 25 Jun 2024 07:55:58 +0200 Subject: [PATCH 106/893] check-certificates: limit scope for $CertNew... ... into block where certificate is replaced. This should unbreak renewing with a certificate updated in place. --- check-certificates.rsc | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index e9235f1..c9622b7 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -139,7 +139,6 @@ :foreach Cert in=[ /certificate/find where !revoked !ca !scep-url expires-after<$CertRenewTime ] do={ :local CertVal [ /certificate/get $Cert ]; - :local CertNew; :local LastName; :do { @@ -166,7 +165,7 @@ } else={ $LogPrint debug $ScriptName ("Certificate '" . $CertVal->"name" . "' was not updated, but replaced."); - :set CertNew [ /certificate/find where name~("^" . [ $EscapeForRegEx [ $UrlEncode $LastName ] ] . "\\.(p12|pem)_[0-9]+\$") \ + :local CertNew [ /certificate/find where name~("^" . [ $EscapeForRegEx [ $UrlEncode $LastName ] ] . "\\.(p12|pem)_[0-9]+\$") \ (common-name=($CertVal->"common-name") or subject-alt-name~("(^|\\W)(DNS|IP):" . [ $EscapeForRegEx $LastName ] . "(\\W|\$)")) \ fingerprint!=[ :tostr ($CertVal->"fingerprint") ] expires-after>$CertRenewTime ]; :local CertNewVal [ /certificate/get $CertNew ]; @@ -190,13 +189,13 @@ /certificate/remove $Cert; /certificate/set $CertNew name=($CertVal->"name"); - :set CertNewVal; + :set Cert $CertNew; :set CertVal [ /certificate/get $CertNew ]; } $SendNotification2 ({ origin=$ScriptName; silent=true; \ subject=([ $SymbolForNotification "lock-with-ink-pen" ] . "Certificate renewed: " . ($CertVal->"name")); \ - message=("A certificate on " . $Identity . " has been renewed.\n\n" . [ $FormatInfo $CertNew ]) }); + message=("A certificate on " . $Identity . " has been renewed.\n\n" . [ $FormatInfo $Cert ]) }); $LogPrint info $ScriptName ("The certificate '" . ($CertVal->"name") . "' has been renewed."); } on-error={ $LogPrint debug $ScriptName ("Could not renew certificate '" . ($CertVal->"name") . "'."); From ce1b635eb2d96706ef0a8b603737062338f92238 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 2 Jul 2024 21:29:14 +0200 Subject: [PATCH 107/893] global-functions: $GetMacVendor: cert 'GTS Root R4' --- certs/GTS-Root-R4.pem | 20 ++++++++++++++++++++ global-functions.rsc | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 certs/GTS-Root-R4.pem diff --git a/certs/GTS-Root-R4.pem b/certs/GTS-Root-R4.pem new file mode 100644 index 0000000..16a1c36 --- /dev/null +++ b/certs/GTS-Root-R4.pem @@ -0,0 +1,20 @@ +# Issuer: CN=GTS Root R4 O=Google Trust Services LLC +# Subject: CN=GTS Root R4 O=Google Trust Services LLC +# Label: "GTS Root R4" +# Serial: 159662532700760215368942768210 +# MD5 Fingerprint: 43:96:83:77:19:4d:76:b3:9d:65:52:e4:1d:22:a5:e8 +# SHA1 Fingerprint: 77:d3:03:67:b5:e0:0c:15:f6:0c:38:61:df:7c:e1:3b:92:46:4d:47 +# SHA256 Fingerprint: 34:9d:fa:40:58:c5:e2:63:12:3b:39:8a:e7:95:57:3c:4e:13:13:c8:3f:e6:8f:93:55:6c:d5:e8:03:1b:3c:7d +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYD +VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG +A1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw +WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz +IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzuhXyi +QHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvR +HYqjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D +9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/Cr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8 +p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD +-----END CERTIFICATE----- diff --git a/global-functions.rsc b/global-functions.rsc index 26472b8..121c5ec 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -528,7 +528,7 @@ } :do { - :if ([ $CertificateAvailable "GTS Root R1" ] = false) do={ + :if ([ $CertificateAvailable "GTS Root R4" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); :error false; } From eab9b28cd28b1d12d3f0d178db22acdac5ad1758 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 4 Jul 2024 11:56:56 +0200 Subject: [PATCH 108/893] global-functions: $MkDir: enable tmpfs if disabled --- global-functions.rsc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 121c5ec..44b3abe 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -829,7 +829,12 @@ :global LogPrint; :global WaitForFile; - :if ([ :len [ /disk/find where slot=tmpfs type=tmpfs ] ] = 1) do={ + :local TmpFs [ /disk/find where slot=tmpfs type=tmpfs ]; + :if ([ :len $TmpFs ] = 1) do={ + :if ([ /disk/get $TmpFs disabled ] = true) do={ + $LogPrint info $0 ("The tmpfs is disabled, enabling."); + /disk/enable $TmpFs; + } :return true; } From 64bc9f73f7ed24cfb7dec9f24fb101594ae4cb79 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 3 Jul 2024 16:35:39 +0200 Subject: [PATCH 109/893] packages-update: run backups before package download This reduces memory pressure, especially on device with very limited RAM like mAP with its 64 MB. --- packages-update.rsc | 52 ++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/packages-update.rsc b/packages-update.rsc index 0208b1e..97039ec 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -60,32 +60,6 @@ :error true; } - :local NumInstalled [ $VersionToNum ($Update->"installed-version") ]; - :local NumLatest [ $VersionToNum ($Update->"latest-version") ]; - - :local DoDowngrade false; - :if ($NumInstalled > $NumLatest) do={ - :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ - :put "Latest version is older than installed one. Want to downgrade? [y/N]"; - :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ - :set DoDowngrade true; - } else={ - :put "Canceled..."; - } - } else={ - $LogPrint warning $ScriptName ("Not installing downgrade automatically."); - :error false; - } - } - - :foreach Package in=[ /system/package/find where !bundle ] do={ - :local PkgName [ /system/package/get $Package name ]; - :if ([ $DownloadPackage $PkgName ($Update->"latest-version") ] = false) do={ - $LogPrint error $ScriptName ("Download for package " . $PkgName . " failed, update aborted."); - :error false; - } - } - :local RunOrder ({}); :foreach Script in=[ /system/script/find where source~("\n# provides: backup-script\\b") ] do={ :local ScriptVal [ /system/script/get $Script ]; @@ -120,6 +94,32 @@ } } + :local NumInstalled [ $VersionToNum ($Update->"installed-version") ]; + :local NumLatest [ $VersionToNum ($Update->"latest-version") ]; + + :local DoDowngrade false; + :if ($NumInstalled > $NumLatest) do={ + :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ + :put "Latest version is older than installed one. Want to downgrade? [y/N]"; + :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ + :set DoDowngrade true; + } else={ + :put "Canceled..."; + } + } else={ + $LogPrint warning $ScriptName ("Not installing downgrade automatically."); + :error false; + } + } + + :foreach Package in=[ /system/package/find where !bundle ] do={ + :local PkgName [ /system/package/get $Package name ]; + :if ([ $DownloadPackage $PkgName ($Update->"latest-version") ] = false) do={ + $LogPrint error $ScriptName ("Download for package " . $PkgName . " failed, update aborted."); + :error false; + } + } + :if ($DoDowngrade = true) do={ $LogPrint info $ScriptName ("Rebooting for downgrade."); :delay 1s; From 1bc6f9c45c7487c6b1fa1c26a9ceeaeadd86c90c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 5 Jul 2024 15:19:11 +0200 Subject: [PATCH 110/893] backup-partition: rename variable --- backup-partition.rsc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index 3c883f7..572c740 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -58,13 +58,13 @@ :error false; } - :local FallbackTo [ /partitions/get $ActiveRunning fallback-to ]; + :local FallbackToName [ /partitions/get $ActiveRunning fallback-to ]; - :if ([ /partitions/get $ActiveRunning version ] != [ /partitions/get $FallbackTo version]) do={ + :if ([ /partitions/get $ActiveRunning version ] != [ /partitions/get $FallbackToName version]) do={ :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ - :put ("The partitions have different RouterOS versions. Copy over to '" . $FallbackTo . "'? [y/N]"); + :put ("The partitions have different RouterOS versions. Copy over to '" . $FallbackToName . "'? [y/N]"); :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ - :if ([ $CopyTo $ScriptName $FallbackTo ] = false) do={ + :if ([ $CopyTo $ScriptName $FallbackToName ] = false) do={ :set PackagesUpdateBackupFailure true; :error false; } @@ -75,7 +75,7 @@ :local NumLatest [ $VersionToNum ($Update->"latest-version") ]; :if ($BackupPartitionCopyBeforeFeatureUpdate = true && $NumLatest > 0 && \ ($NumInstalled & 0xffff0000) != ($NumLatest & 0xffff0000)) do={ - :if ([ $CopyTo $ScriptName $FallbackTo ] = false) do={ + :if ([ $CopyTo $ScriptName $FallbackToName ] = false) do={ :set PackagesUpdateBackupFailure true; :error false; } @@ -87,12 +87,12 @@ /system/scheduler/add start-time=startup name="running-from-backup-partition" \ on-event=(":log warning (\"Running from partition '\" . " . \ "[ /partitions/get [ find where running ] name ] . \"'!\")"); - /partitions/save-config-to $FallbackTo; + /partitions/save-config-to $FallbackToName; /system/scheduler/remove "running-from-backup-partition"; - $LogPrint info $ScriptName ("Saved configuration to partition '" . $FallbackTo . "'."); + $LogPrint info $ScriptName ("Saved configuration to partition '" . $FallbackToName . "'."); } on-error={ /system/scheduler/remove [ find where name="running-from-backup-partition" ]; - $LogPrint error $ScriptName ("Failed saving configuration to partition '" . $FallbackTo . "'!"); + $LogPrint error $ScriptName ("Failed saving configuration to partition '" . $FallbackToName . "'!"); :set PackagesUpdateBackupFailure true; :error false; } From 235737c2327cf377a1208dc96af53d9c8642b305 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 5 Jul 2024 15:21:52 +0200 Subject: [PATCH 111/893] backup-partition: check the fallback partition actually exists... ... and use its id for actions. --- backup-partition.rsc | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index 572c740..211db0f 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -24,17 +24,18 @@ :global VersionToNum; :local CopyTo do={ - :local ScriptName [ :tostr $1 ]; - :local FallbackTo [ :tostr $2 ]; + :local ScriptName [ :tostr $1 ]; + :local FallbackTo [ :toid $2 ]; + :local FallbackToName [ :tostr $3 ]; :global LogPrint; :do { /partitions/copy-to $FallbackTo; - $LogPrint info $ScriptName ("Copied RouterOS to partition '" . $FallbackTo . "'."); + $LogPrint info $ScriptName ("Copied RouterOS to partition '" . $FallbackToName . "'."); :return true; } on-error={ - $LogPrint error $ScriptName ("Failed copying RouterOS to partition '" . $FallbackTo . "'!"); + $LogPrint error $ScriptName ("Failed copying RouterOS to partition '" . $FallbackToName . "'!"); :return false; } } @@ -59,12 +60,19 @@ } :local FallbackToName [ /partitions/get $ActiveRunning fallback-to ]; + :local FallbackTo [ /partition/find where name=$FallbackToName ]; - :if ([ /partitions/get $ActiveRunning version ] != [ /partitions/get $FallbackToName version]) do={ + :if ([ :len $FallbackTo ] < 1) do={ + $LogPrint error $ScriptName ("There is no partition with name '" . $FallbackToName . "'."); + :set PackagesUpdateBackupFailure true; + :error false; + } + + :if ([ /partitions/get $ActiveRunning version ] != [ /partitions/get $FallbackTo version]) do={ :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ :put ("The partitions have different RouterOS versions. Copy over to '" . $FallbackToName . "'? [y/N]"); :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ - :if ([ $CopyTo $ScriptName $FallbackToName ] = false) do={ + :if ([ $CopyTo $ScriptName $FallbackTo $FallbackToName ] = false) do={ :set PackagesUpdateBackupFailure true; :error false; } @@ -75,7 +83,7 @@ :local NumLatest [ $VersionToNum ($Update->"latest-version") ]; :if ($BackupPartitionCopyBeforeFeatureUpdate = true && $NumLatest > 0 && \ ($NumInstalled & 0xffff0000) != ($NumLatest & 0xffff0000)) do={ - :if ([ $CopyTo $ScriptName $FallbackToName ] = false) do={ + :if ([ $CopyTo $ScriptName $FallbackTo $FallbackToName ] = false) do={ :set PackagesUpdateBackupFailure true; :error false; } @@ -87,7 +95,7 @@ /system/scheduler/add start-time=startup name="running-from-backup-partition" \ on-event=(":log warning (\"Running from partition '\" . " . \ "[ /partitions/get [ find where running ] name ] . \"'!\")"); - /partitions/save-config-to $FallbackToName; + /partitions/save-config-to $FallbackTo; /system/scheduler/remove "running-from-backup-partition"; $LogPrint info $ScriptName ("Saved configuration to partition '" . $FallbackToName . "'."); } on-error={ From 25135b64e549e129914b9b5dfb74ca2011ee3d5d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 5 Jul 2024 15:32:49 +0200 Subject: [PATCH 112/893] backup-partition: check that target is inactive --- backup-partition.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index 211db0f..34cdc8f 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -60,10 +60,10 @@ } :local FallbackToName [ /partitions/get $ActiveRunning fallback-to ]; - :local FallbackTo [ /partition/find where name=$FallbackToName ]; + :local FallbackTo [ /partition/find where name=$FallbackToName !active ]; :if ([ :len $FallbackTo ] < 1) do={ - $LogPrint error $ScriptName ("There is no partition with name '" . $FallbackToName . "'."); + $LogPrint error $ScriptName ("There is no inactive partition named '" . $FallbackToName . "'."); :set PackagesUpdateBackupFailure true; :error false; } From 35d3c058b83388b8e187bb53ff8c1e0d85c299b5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 10 Jul 2024 11:02:53 +0200 Subject: [PATCH 113/893] update list of contributors --- CONTRIBUTIONS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index 13d0508..e9bf7d1 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -47,6 +47,7 @@ Add yourself to the list, * Marek Čábák * Oleksandr Yukhymchuk * Peter Holtkamp +* Peter Ponzel * Reiner Vehrenkamp * Richard Österreicher * Simon Hitzemann From 78dfc568c10332ea63cc26e39ccf165f3d384c9e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 11 Jul 2024 08:45:53 +0200 Subject: [PATCH 114/893] capsman-{download-packages,rolling-upgrade}: run matching script It is possible to run old and new CAPsMAN on one system simultaneously (... since RouterOS 7.13?). Thus it may make sense to have both variants of these scripts installed, and we have to make sure to run the correct one. --- capsman-download-packages.capsman.rsc | 2 +- capsman-download-packages.template.rsc | 2 +- capsman-download-packages.wifi.rsc | 2 +- capsman-rolling-upgrade.capsman.rsc | 2 +- capsman-rolling-upgrade.template.rsc | 2 +- capsman-rolling-upgrade.wifi.rsc | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index f5695f4..84d36f7 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -73,7 +73,7 @@ } :if ($Updated = true) do={ - :local Script ([ /system/script/find where source~"\n# provides: capsman-rolling-upgrade\n" ]->0); + :local Script ([ /system/script/find where source~"\n# provides: capsman-rolling-upgrade.capsman\n" ]->0); :if ([ :len $Script ] > 0) do={ /system/script/run $Script; } else={ diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index 762dbb6..deb15a7 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -83,7 +83,7 @@ } :if ($Updated = true) do={ - :local Script ([ /system/script/find where source~"\n# provides: capsman-rolling-upgrade\n" ]->0); + :local Script ([ /system/script/find where source~"\n# provides: capsman-rolling-upgrade%TEMPL%\n" ]->0); :if ([ :len $Script ] > 0) do={ /system/script/run $Script; } else={ diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 79aa9a7..6147d21 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -75,7 +75,7 @@ } :if ($Updated = true) do={ - :local Script ([ /system/script/find where source~"\n# provides: capsman-rolling-upgrade\n" ]->0); + :local Script ([ /system/script/find where source~"\n# provides: capsman-rolling-upgrade.wifi\n" ]->0); :if ([ :len $Script ] > 0) do={ /system/script/run $Script; } else={ diff --git a/capsman-rolling-upgrade.capsman.rsc b/capsman-rolling-upgrade.capsman.rsc index 2c9ae3d..e9ca5cc 100644 --- a/capsman-rolling-upgrade.capsman.rsc +++ b/capsman-rolling-upgrade.capsman.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# provides: capsman-rolling-upgrade +# provides: capsman-rolling-upgrade.capsman # requires RouterOS, version=7.13 # # upgrade CAPs one after another diff --git a/capsman-rolling-upgrade.template.rsc b/capsman-rolling-upgrade.template.rsc index 2098bc0..a28d7f7 100644 --- a/capsman-rolling-upgrade.template.rsc +++ b/capsman-rolling-upgrade.template.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# provides: capsman-rolling-upgrade +# provides: capsman-rolling-upgrade%TEMPL% # requires RouterOS, version=7.13 # # upgrade CAPs one after another diff --git a/capsman-rolling-upgrade.wifi.rsc b/capsman-rolling-upgrade.wifi.rsc index 36b8c0f..22f8818 100644 --- a/capsman-rolling-upgrade.wifi.rsc +++ b/capsman-rolling-upgrade.wifi.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# provides: capsman-rolling-upgrade +# provides: capsman-rolling-upgrade.wifi # requires RouterOS, version=7.13 # # upgrade CAPs one after another From 3fd1896ad622f8097cc14af8f37114f9fc47f5b7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 11 Jul 2024 08:55:26 +0200 Subject: [PATCH 115/893] capsman-download-packages: support running several scripts... ... as it is possible to have more than just one providing the functionality. --- capsman-download-packages.capsman.rsc | 8 +++++--- capsman-download-packages.template.rsc | 8 +++++--- capsman-download-packages.wifi.rsc | 8 +++++--- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index 84d36f7..4f9ab9d 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -73,9 +73,11 @@ } :if ($Updated = true) do={ - :local Script ([ /system/script/find where source~"\n# provides: capsman-rolling-upgrade.capsman\n" ]->0); - :if ([ :len $Script ] > 0) do={ - /system/script/run $Script; + :local Scripts [ /system/script/find where source~"\n# provides: capsman-rolling-upgrade.capsman\n" ]; + :if ([ :len $Scripts ] > 0) do={ + :foreach Script in=$Scripts do={ + /system/script/run $Script; + } } else={ /caps-man/remote-cap/upgrade [ find where version!=$InstalledVersion ]; } diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index deb15a7..c0e815b 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -83,9 +83,11 @@ } :if ($Updated = true) do={ - :local Script ([ /system/script/find where source~"\n# provides: capsman-rolling-upgrade%TEMPL%\n" ]->0); - :if ([ :len $Script ] > 0) do={ - /system/script/run $Script; + :local Scripts [ /system/script/find where source~"\n# provides: capsman-rolling-upgrade%TEMPL%\n" ]; + :if ([ :len $Scripts ] > 0) do={ + :foreach Script in=$Scripts do={ + /system/script/run $Script; + } } else={ /caps-man/remote-cap/upgrade [ find where version!=$InstalledVersion ]; /interface/wifi/capsman/remote-cap/upgrade [ find where version!=$InstalledVersion ]; diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 6147d21..64ac7cd 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -75,9 +75,11 @@ } :if ($Updated = true) do={ - :local Script ([ /system/script/find where source~"\n# provides: capsman-rolling-upgrade.wifi\n" ]->0); - :if ([ :len $Script ] > 0) do={ - /system/script/run $Script; + :local Scripts [ /system/script/find where source~"\n# provides: capsman-rolling-upgrade.wifi\n" ]; + :if ([ :len $Scripts ] > 0) do={ + :foreach Script in=$Scripts do={ + /system/script/run $Script; + } } else={ /interface/wifi/capsman/remote-cap/upgrade [ find where version!=$InstalledVersion ]; } From f09fa83105ea40876e7103a118b3d6d57098cf0c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 16 Jul 2024 13:49:02 +0200 Subject: [PATCH 116/893] doc/mod/ssh-keys-import: drop hint on older RouterOS --- doc/mod/ssh-keys-import.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/doc/mod/ssh-keys-import.md b/doc/mod/ssh-keys-import.md index db8e322..88524ab 100644 --- a/doc/mod/ssh-keys-import.md +++ b/doc/mod/ssh-keys-import.md @@ -34,12 +34,8 @@ Usage and invocation Call the function `$SSHKeysImport` with key and user as parameter to import that key: - $SSHKeysImport "ssh-rsa AAAAB3Nza...QYZk8= user" admin; - -Starting with RouterOS *7.12beta1* support for keys of type `ed25519` has -been added: - $SSHKeysImport "ssh-ed25519 AAAAC3Nza...ZVugJT user" admin; + $SSHKeysImport "ssh-rsa AAAAB3Nza...QYZk8= user" admin; The third part of the key (`user` in this example) is inherited as `key-owner` in RouterOS. Also the `MD5` fingerprint is recorded, this helps From 0101b56bff0cfad4043c4e86aa7e68325530eca3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 11 Jul 2024 23:10:42 +0200 Subject: [PATCH 117/893] README: use :tocrlf to convert global-config-overlay --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6b3cd05..4fd0e3e 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ RouterOS Scripts [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) @@ -155,7 +155,7 @@ This last step is required when ever you make changes to your configuration. > ℹ️ **Info**: It is recommended to edit the configuration using the command > line interface. If using Winbox on Windows OS, the line endings may be > missing. To fix this run: -> `/system/script/set source=[ $Unix2Dos [ get global-config-overlay source ] ] global-config-overlay;` +> `/system/script/set source=[ :tocrlf [ get global-config-overlay source ] ] global-config-overlay;` Updating scripts ---------------- From 2d42fed621f5bb79a187774afe46c04e06b9c71b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 16 Jul 2024 12:23:02 +0200 Subject: [PATCH 118/893] global-functions: $ScriptInstallUpdate: forcibly convert to LF... ... to make sure we do not have unintended CRLF line breaks. --- global-functions.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 44b3abe..2c7c87c 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # global functions # https://git.eworm.de/cgit/routeros-scripts/about/ @@ -1060,7 +1060,7 @@ :local Result [ /tool/fetch check-certificate=yes-without-crl \ http-header-field=({ [ $FetchUserAgentStr $0 ] }) $Url output=user as-value ]; :if ($Result->"status" = "finished") do={ - :set SourceNew ($Result->"data"); + :set SourceNew [ :tolf ($Result->"data") ]; } } on-error={ :if ($ScriptVal->"source" = "#!rsc by RouterOS\n") do={ From 68f61ae6221afeb279ea3823e42cb8da4656a2a6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 16 Jul 2024 12:27:08 +0200 Subject: [PATCH 119/893] global-functions: $ScriptInstallUpdate: allow CRLF on device --- global-functions.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 2c7c87c..327443a 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1074,7 +1074,8 @@ } :if ([ :len $SourceNew ] > 0) do={ - :if ($SourceNew != $ScriptVal->"source") do={ + :local SourceCRLF [ :tocrlf $SourceNew ]; + :if ($SourceNew != $ScriptVal->"source" && $SourceCRLF != $ScriptVal->"source") do={ :if ([ :pick $SourceNew 0 18 ] = "#!rsc by RouterOS\n") do={ :local Required ([ $ParseKeyValueStore [ $Grep $SourceNew ("\23 requires RouterOS, ") ] ]->"version"); :if ([ $RequiredRouterOS $0 [ $EitherOr $Required "0.0" ] false ] = true) do={ From 7cf0c5b2056bb7522f6174bd76d4b0ea19d4c647 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 16 Jul 2024 12:38:18 +0200 Subject: [PATCH 120/893] capsman-download-packages: support scripts with CRLF line breaks --- capsman-download-packages.capsman.rsc | 2 +- capsman-download-packages.template.rsc | 2 +- capsman-download-packages.wifi.rsc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index 4f9ab9d..1247d9a 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -73,7 +73,7 @@ } :if ($Updated = true) do={ - :local Scripts [ /system/script/find where source~"\n# provides: capsman-rolling-upgrade.capsman\n" ]; + :local Scripts [ /system/script/find where source~"\n# provides: capsman-rolling-upgrade.capsman\r?\n" ]; :if ([ :len $Scripts ] > 0) do={ :foreach Script in=$Scripts do={ /system/script/run $Script; diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index c0e815b..8418841 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -83,7 +83,7 @@ } :if ($Updated = true) do={ - :local Scripts [ /system/script/find where source~"\n# provides: capsman-rolling-upgrade%TEMPL%\n" ]; + :local Scripts [ /system/script/find where source~"\n# provides: capsman-rolling-upgrade%TEMPL%\r?\n" ]; :if ([ :len $Scripts ] > 0) do={ :foreach Script in=$Scripts do={ /system/script/run $Script; diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 64ac7cd..c5a6999 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -75,7 +75,7 @@ } :if ($Updated = true) do={ - :local Scripts [ /system/script/find where source~"\n# provides: capsman-rolling-upgrade.wifi\n" ]; + :local Scripts [ /system/script/find where source~"\n# provides: capsman-rolling-upgrade.wifi\r?\n" ]; :if ([ :len $Scripts ] > 0) do={ :foreach Script in=$Scripts do={ /system/script/run $Script; From ee928605df642ab9f917dd1e65f85f7cb09e8192 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 16 Jul 2024 12:41:17 +0200 Subject: [PATCH 121/893] news-and-changes: support scripts with CRLF line breaks --- news-and-changes.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 8ddc3d6..9ab811d 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -61,7 +61,7 @@ # Migration steps to be applied on script updates :global GlobalConfigMigration { 97=":local Rec [ /ip/dns/static/find where comment~\"^managed by dhcp-to-dns for \" ]; :if ([ :len \$Rec ] > 0) do={ /ip/dns/static/remove \$Rec; /system/script/run dhcp-to-dns; }"; - 100=":global ScriptInstallUpdate; :if ([ :len [ /system/script/find where name=\"ssh-keys-import\" source~\"^#!rsc by RouterOS\\n\" ] ] > 0) do={ /system/script/set name=\"mod/ssh-keys-import\" ssh-keys-import; \$ScriptInstallUpdate; }"; + 100=":global ScriptInstallUpdate; :if ([ :len [ /system/script/find where name=\"ssh-keys-import\" source~\"^#!rsc by RouterOS\\r?\\n\" ] ] > 0) do={ /system/script/set name=\"mod/ssh-keys-import\" ssh-keys-import; \$ScriptInstallUpdate; }"; 104=":global CharacterReplace; :global ScriptInstallUpdate; :foreach Script in={ \"capsman-download-packages\"; \"capsman-rolling-upgrade\"; \"hotspot-to-wpa\"; \"hotspot-to-wpa-cleanup\" } do={ /system/script/set name=(\$Script . \".capsman\") [ find where name=\$Script ]; :foreach Scheduler in=[ /system/scheduler/find where on-event~(\$Script . \"([^-.]|\\\$)\") ] do={ /system/scheduler/set \$Scheduler on-event=[ \$CharacterReplace [ get \$Scheduler on-event ] \$Script (\$Script . \".capsman\") ]; }; }; /ip/hotspot/user/profile/set on-login=\"hotspot-to-wpa.capsman\" [ find where on-login=\"hotspot-to-wpa\" ]; \$ScriptInstallUpdate;"; 111=":local Rec [ /ip/dns/static/find where comment~\"^managed by dhcp-to-dns for \" ]; :if ([ :len \$Rec ] > 0) do={ /ip/dns/static/remove \$Rec; /system/script/run dhcp-to-dns; }"; }; From a26f78329a1e941fcab969611ffbb83af4f2ea01 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 16 Jul 2024 12:42:24 +0200 Subject: [PATCH 122/893] ppp-on-up: support scripts with CRLF line breaks --- ppp-on-up.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index 4ed92c5..6484ecb 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -28,7 +28,7 @@ /ipv6/dhcp-client/release [ find where interface=$IntName !disabled ]; - :foreach Script in=[ /system/script/find where source~("\n# provides: ppp-on-up\n") ] do={ + :foreach Script in=[ /system/script/find where source~("\n# provides: ppp-on-up\r?\n") ] do={ :local ScriptName [ /system/script/get $Script name ]; :do { $LogPrint debug $ScriptName ("Running script: " . $ScriptName); From f2ca62aed0ff062b6e2dec13f8bb20e828bfdeb2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 16 Jul 2024 12:33:47 +0200 Subject: [PATCH 123/893] global-functions: $ScriptInstallUpdate: support storing with CRLF Adding this in `global-config-overlay` make the scripts being stored with CRLF line breaks: :global ScriptUpdatesCRLF true; Handle with care, I do not recommend it. Thus it's just a hidden setting. --- global-functions.rsc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 327443a..b824d62 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1008,6 +1008,7 @@ :global IDonate; :global NoNewsAndChangesNotification; :global ScriptUpdatesBaseUrl; + :global ScriptUpdatesCRLF; :global ScriptUpdatesUrlSuffix; :global CertificateAvailable; @@ -1081,7 +1082,8 @@ :if ([ $RequiredRouterOS $0 [ $EitherOr $Required "0.0" ] false ] = true) do={ :if ([ $ValidateSyntax $SourceNew ] = true) do={ $LogPrint info $0 ("Updating script: " . $ScriptVal->"name"); - /system/script/set owner=($ScriptVal->"name") source=$SourceNew $Script; + /system/script/set owner=($ScriptVal->"name") \ + source=[ $IfThenElse ($ScriptUpdatesCRLF = true) $SourceCRLF $SourceNew ] $Script; :if ($ScriptVal->"name" = "global-config") do={ :set ReloadGlobalConfig true; } From 8074305b9250d98e182f5cb968de2c8bd438f7f3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 11 Jul 2024 23:09:32 +0200 Subject: [PATCH 124/893] global-functions: $Dos2Unix: use :tolf --- global-functions.rsc | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index b824d62..312936b 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -313,11 +313,7 @@ # convert line endings, DOS -> UNIX :set Dos2Unix do={ - :local Input [ :tostr $1 ]; - - :global CharacterReplace; - - :return [ $CharacterReplace $Input ("\r\n") ("\n") ]; + :return [ :tolf [ :tostr $1 ] ]; } # download package from upgrade server From 8f75d542f3aa7cb3c5726412daa0ab41c6880489 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 11 Jul 2024 23:06:57 +0200 Subject: [PATCH 125/893] global-functions: $PrettyPrint: use :tocrlf --- global-functions.rsc | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 312936b..950ccd6 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -909,11 +909,7 @@ # print lines with trailing carriage return :set PrettyPrint do={ - :local Input [ :tostr $1 ]; - - :global Unix2Dos; - - :put [ $Unix2Dos $Input ]; + :put [ :tocrlf [ :tostr $1 ] ]; } # strip protocol from from url string From 2fd0d27447b8ce6620ec3f6d68c9d5ca62bb9f02 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 11 Jul 2024 23:08:42 +0200 Subject: [PATCH 126/893] global-functions: $Unix2Dos: use :tocrlf --- global-functions.rsc | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 950ccd6..54dcb68 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1433,12 +1433,7 @@ # convert line endings, UNIX -> DOS :set Unix2Dos do={ - :local Input [ :tostr $1 ]; - - :global CharacterReplace; - - :return [ $CharacterReplace [ $CharacterReplace $Input \ - ("\n") ("\r\n") ] ("\r\r\n") ("\r\n") ]; + :return [ :tocrlf [ :tostr $1 ] ]; } # url encoding From 2b758b83fd47ca765dd8c5ed15ff3d001d60a6fc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 11 Jul 2024 23:12:50 +0200 Subject: [PATCH 127/893] mod/inspectvar: use :tocrlf --- doc/mod/inspectvar.md | 2 +- mod/inspectvar.rsc | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/doc/mod/inspectvar.md b/doc/mod/inspectvar.md index d4e59b3..4e2f4c1 100644 --- a/doc/mod/inspectvar.md +++ b/doc/mod/inspectvar.md @@ -4,7 +4,7 @@ Inspect variables [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index 5adca0a..73205b2 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # inspect variables # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/inspectvar.md @@ -14,9 +14,8 @@ # inspect variable and print on terminal :set InspectVar do={ :global InspectVarReturn; - :global PrettyPrint; - $PrettyPrint [ $InspectVarReturn $1 ]; + :put [ :tocrlf [ $InspectVarReturn $1 ] ]; } # inspect variable and return formatted string From 075a9bd6c43e08efee73eb6e1ec5b0ea0391fef2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 11 Jul 2024 23:13:50 +0200 Subject: [PATCH 128/893] mod/ipcalc: use :tocrlf --- doc/mod/ipcalc.md | 2 +- mod/ipcalc.rsc | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/doc/mod/ipcalc.md b/doc/mod/ipcalc.md index cb655bc..9f39429 100644 --- a/doc/mod/ipcalc.md +++ b/doc/mod/ipcalc.md @@ -4,7 +4,7 @@ IP address calculation [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/mod/ipcalc.rsc b/mod/ipcalc.rsc index 128ca54..003bdc3 100644 --- a/mod/ipcalc.rsc +++ b/mod/ipcalc.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # ip address calculation # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/ipcalc.md @@ -17,17 +17,16 @@ :global FormatLine; :global IPCalcReturn; - :global PrettyPrint; :local Values [ $IPCalcReturn $1 ]; - $PrettyPrint ( \ + :put [ :tocrlf ( \ [ $FormatLine "Address" ($Values->"address") ] . "\n" . \ [ $FormatLine "Netmask" ($Values->"netmask") ] . "\n" . \ [ $FormatLine "Network" ($Values->"network") ] . "\n" . \ [ $FormatLine "HostMin" ($Values->"hostmin") ] . "\n" . \ [ $FormatLine "HostMax" ($Values->"hostmax") ] . "\n" . \ - [ $FormatLine "Broadcast" ($Values->"broadcast") ]); + [ $FormatLine "Broadcast" ($Values->"broadcast") ]) ]; } # calculate and return netmask, network, min host, max host and broadcast From 6fbafe76ba27e35d1f3067430ba78cedfa85eb19 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 16 Jul 2024 13:45:16 +0200 Subject: [PATCH 129/893] bump RouterOS requirement for all scripts and modules... ... now that global-functions requires RouterOS 7.14 anyway. --- BRANCHES.md | 2 +- CONTRIBUTIONS.md | 2 +- INITIAL-COMMANDS.md | 2 +- accesslist-duplicates.capsman.rsc | 2 +- accesslist-duplicates.local.rsc | 2 +- accesslist-duplicates.template.rsc | 2 +- accesslist-duplicates.wifi.rsc | 2 +- backup-cloud.rsc | 2 +- backup-email.rsc | 2 +- backup-partition.rsc | 2 +- backup-upload.rsc | 2 +- capsman-download-packages.capsman.rsc | 2 +- capsman-download-packages.template.rsc | 2 +- capsman-download-packages.wifi.rsc | 2 +- capsman-rolling-upgrade.capsman.rsc | 2 +- capsman-rolling-upgrade.template.rsc | 2 +- capsman-rolling-upgrade.wifi.rsc | 2 +- certificate-renew-issued.rsc | 2 +- check-certificates.rsc | 2 +- check-health.rsc | 2 +- check-lte-firmware-upgrade.rsc | 2 +- check-routeros-update.rsc | 2 +- collect-wireless-mac.capsman.rsc | 2 +- collect-wireless-mac.local.rsc | 2 +- collect-wireless-mac.template.rsc | 2 +- collect-wireless-mac.wifi.rsc | 2 +- daily-psk.capsman.rsc | 2 +- daily-psk.local.rsc | 2 +- daily-psk.template.rsc | 2 +- daily-psk.wifi.rsc | 2 +- dhcp-lease-comment.capsman.rsc | 2 +- dhcp-lease-comment.local.rsc | 2 +- dhcp-lease-comment.template.rsc | 2 +- dhcp-lease-comment.wifi.rsc | 2 +- dhcp-to-dns.rsc | 2 +- doc/accesslist-duplicates.md | 2 +- doc/backup-cloud.md | 2 +- doc/backup-email.md | 2 +- doc/backup-partition.md | 2 +- doc/backup-upload.md | 2 +- doc/capsman-download-packages.md | 2 +- doc/capsman-rolling-upgrade.md | 2 +- doc/certificate-renew-issued.md | 2 +- doc/check-certificates.md | 2 +- doc/check-health.md | 2 +- doc/check-lte-firmware-upgrade.md | 2 +- doc/check-routeros-update.md | 2 +- doc/collect-wireless-mac.md | 2 +- doc/daily-psk.md | 2 +- doc/dhcp-lease-comment.md | 2 +- doc/dhcp-to-dns.md | 2 +- doc/firmware-upgrade-reboot.md | 2 +- doc/fw-addr-lists.md | 2 +- doc/global-wait.md | 2 +- doc/gps-track.md | 2 +- doc/hotspot-to-wpa.md | 2 +- doc/ip-addr-bridge.md | 2 +- doc/ipsec-to-dns.md | 2 +- doc/ipv6-update.md | 2 +- doc/lease-script.md | 2 +- doc/leds-mode.md | 2 +- doc/log-forward.md | 2 +- doc/mod/bridge-port-to.md | 2 +- doc/mod/bridge-port-vlan.md | 2 +- doc/mod/notification-email.md | 2 +- doc/mod/notification-matrix.md | 2 +- doc/mod/notification-ntfy.md | 2 +- doc/mod/notification-telegram.md | 2 +- doc/mod/scriptrunonce.md | 2 +- doc/mod/ssh-keys-import.md | 2 +- doc/mode-button.md | 2 +- doc/netwatch-dns.md | 2 +- doc/netwatch-notify.md | 2 +- doc/ospf-to-leds.md | 2 +- doc/packages-update.md | 2 +- doc/ppp-on-up.md | 2 +- doc/sms-action.md | 2 +- doc/sms-forward.md | 2 +- doc/super-mario-theme.md | 2 +- doc/telegram-chat.md | 2 +- doc/unattended-lte-firmware-upgrade.md | 2 +- doc/update-gre-address.md | 2 +- doc/update-tunnelbroker.md | 2 +- firmware-upgrade-reboot.rsc | 2 +- fw-addr-lists.rsc | 2 +- global-wait.rsc | 2 +- gps-track.rsc | 2 +- hotspot-to-wpa-cleanup.capsman.rsc | 2 +- hotspot-to-wpa-cleanup.template.rsc | 2 +- hotspot-to-wpa-cleanup.wifi.rsc | 2 +- hotspot-to-wpa.capsman.rsc | 2 +- hotspot-to-wpa.template.rsc | 2 +- hotspot-to-wpa.wifi.rsc | 2 +- ipsec-to-dns.rsc | 2 +- ipv6-update.rsc | 2 +- lease-script.rsc | 2 +- log-forward.rsc | 2 +- mod/bridge-port-to.rsc | 2 +- mod/bridge-port-vlan.rsc | 2 +- mod/notification-email.rsc | 2 +- mod/notification-matrix.rsc | 2 +- mod/notification-ntfy.rsc | 2 +- mod/notification-telegram.rsc | 2 +- mod/scriptrunonce.rsc | 2 +- mod/ssh-keys-import.rsc | 2 +- mode-button.rsc | 2 +- netwatch-dns.rsc | 2 +- netwatch-notify.rsc | 2 +- ospf-to-leds.rsc | 2 +- packages-update.rsc | 2 +- ppp-on-up.rsc | 2 +- sms-action.rsc | 2 +- sms-forward.rsc | 2 +- telegram-chat.rsc | 2 +- update-gre-address.rsc | 2 +- update-tunnelbroker.rsc | 2 +- 116 files changed, 116 insertions(+), 116 deletions(-) diff --git a/BRANCHES.md b/BRANCHES.md index f1062bb..2bacf8e 100644 --- a/BRANCHES.md +++ b/BRANCHES.md @@ -4,7 +4,7 @@ Installing from branches [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index e9bf7d1..0b192fc 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -4,7 +4,7 @@ Past Contributions [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index b3eff35..2be51c5 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -4,7 +4,7 @@ Initial commands [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/accesslist-duplicates.capsman.rsc b/accesslist-duplicates.capsman.rsc index 781ae78..d6e2928 100644 --- a/accesslist-duplicates.capsman.rsc +++ b/accesslist-duplicates.capsman.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # print duplicate antries in wireless access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/accesslist-duplicates.md diff --git a/accesslist-duplicates.local.rsc b/accesslist-duplicates.local.rsc index b79a724..e90842d 100644 --- a/accesslist-duplicates.local.rsc +++ b/accesslist-duplicates.local.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # print duplicate antries in wireless access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/accesslist-duplicates.md diff --git a/accesslist-duplicates.template.rsc b/accesslist-duplicates.template.rsc index b8067c8..d275340 100644 --- a/accesslist-duplicates.template.rsc +++ b/accesslist-duplicates.template.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # print duplicate antries in wireless access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/accesslist-duplicates.md diff --git a/accesslist-duplicates.wifi.rsc b/accesslist-duplicates.wifi.rsc index c05e02c..f4dae4b 100644 --- a/accesslist-duplicates.wifi.rsc +++ b/accesslist-duplicates.wifi.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # print duplicate antries in wireless access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/accesslist-duplicates.md diff --git a/backup-cloud.rsc b/backup-cloud.rsc index 697ee95..f70752e 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: backup-script, order=40 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # upload backup to MikroTik cloud # https://git.eworm.de/cgit/routeros-scripts/about/doc/backup-cloud.md diff --git a/backup-email.rsc b/backup-email.rsc index c32eb27..e507c6e 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: backup-script, order=20 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # create and email backup and config file # https://git.eworm.de/cgit/routeros-scripts/about/doc/backup-email.md diff --git a/backup-partition.rsc b/backup-partition.rsc index 34cdc8f..23dd7ef 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: backup-script, order=70 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # save configuration to fallback partition # https://git.eworm.de/cgit/routeros-scripts/about/doc/backup-partition.md diff --git a/backup-upload.rsc b/backup-upload.rsc index 1dc98d5..8d96eba 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: backup-script, order=50 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # create and upload backup and config file # https://git.eworm.de/cgit/routeros-scripts/about/doc/backup-upload.md diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index 1247d9a..f2ff024 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # download and cleanup packages for CAP installation from CAPsMAN # https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-download-packages.md diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index 8418841..ad9b926 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # download and cleanup packages for CAP installation from CAPsMAN # https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-download-packages.md diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index c5a6999..056136f 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # download and cleanup packages for CAP installation from CAPsMAN # https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-download-packages.md diff --git a/capsman-rolling-upgrade.capsman.rsc b/capsman-rolling-upgrade.capsman.rsc index e9ca5cc..f287ea3 100644 --- a/capsman-rolling-upgrade.capsman.rsc +++ b/capsman-rolling-upgrade.capsman.rsc @@ -5,7 +5,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: capsman-rolling-upgrade.capsman -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # upgrade CAPs one after another # https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-rolling-upgrade.md diff --git a/capsman-rolling-upgrade.template.rsc b/capsman-rolling-upgrade.template.rsc index a28d7f7..3d98747 100644 --- a/capsman-rolling-upgrade.template.rsc +++ b/capsman-rolling-upgrade.template.rsc @@ -5,7 +5,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: capsman-rolling-upgrade%TEMPL% -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # upgrade CAPs one after another # https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-rolling-upgrade.md diff --git a/capsman-rolling-upgrade.wifi.rsc b/capsman-rolling-upgrade.wifi.rsc index 22f8818..369dccc 100644 --- a/capsman-rolling-upgrade.wifi.rsc +++ b/capsman-rolling-upgrade.wifi.rsc @@ -5,7 +5,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: capsman-rolling-upgrade.wifi -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # upgrade CAPs one after another # https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-rolling-upgrade.md diff --git a/certificate-renew-issued.rsc b/certificate-renew-issued.rsc index 7815443..f2c1dfe 100644 --- a/certificate-renew-issued.rsc +++ b/certificate-renew-issued.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # renew locally issued certificates # https://git.eworm.de/cgit/routeros-scripts/about/doc/certificate-renew-issued.md diff --git a/check-certificates.rsc b/check-certificates.rsc index c9622b7..7aaac84 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # check for certificate validity # https://git.eworm.de/cgit/routeros-scripts/about/doc/check-certificates.md diff --git a/check-health.rsc b/check-health.rsc index a769fa8..540336d 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # check for RouterOS health state # https://git.eworm.de/cgit/routeros-scripts/about/doc/check-health.md diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index 5ea094e..2e52c2a 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # check for LTE firmware upgrade, send notification # https://git.eworm.de/cgit/routeros-scripts/about/doc/check-lte-firmware-upgrade.md diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 6dca99a..d45432a 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # check for RouterOS update, send notification and/or install # https://git.eworm.de/cgit/routeros-scripts/about/doc/check-routeros-update.md diff --git a/collect-wireless-mac.capsman.rsc b/collect-wireless-mac.capsman.rsc index 74c0754..9efa9ef 100644 --- a/collect-wireless-mac.capsman.rsc +++ b/collect-wireless-mac.capsman.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=40 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # collect wireless mac adresses in access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/collect-wireless-mac.md diff --git a/collect-wireless-mac.local.rsc b/collect-wireless-mac.local.rsc index 8a60fea..27c9d1c 100644 --- a/collect-wireless-mac.local.rsc +++ b/collect-wireless-mac.local.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=40 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # collect wireless mac adresses in access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/collect-wireless-mac.md diff --git a/collect-wireless-mac.template.rsc b/collect-wireless-mac.template.rsc index c5cf74a..d41c17d 100644 --- a/collect-wireless-mac.template.rsc +++ b/collect-wireless-mac.template.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=40 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # collect wireless mac adresses in access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/collect-wireless-mac.md diff --git a/collect-wireless-mac.wifi.rsc b/collect-wireless-mac.wifi.rsc index 12c3361..0075320 100644 --- a/collect-wireless-mac.wifi.rsc +++ b/collect-wireless-mac.wifi.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=40 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # collect wireless mac adresses in access list # https://git.eworm.de/cgit/routeros-scripts/about/doc/collect-wireless-mac.md diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index cd5b6b0..6dafc08 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # update daily PSK (pre shared key) # https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index fbdb784..4709f3a 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # update daily PSK (pre shared key) # https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 35fa82c..6b7f5fd 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # update daily PSK (pre shared key) # https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index c1f7133..90c6ac5 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # update daily PSK (pre shared key) # https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md diff --git a/dhcp-lease-comment.capsman.rsc b/dhcp-lease-comment.capsman.rsc index b7f3589..c435ec3 100644 --- a/dhcp-lease-comment.capsman.rsc +++ b/dhcp-lease-comment.capsman.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=60 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # update dhcp-server lease comment with infos from access-list # https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-lease-comment.md diff --git a/dhcp-lease-comment.local.rsc b/dhcp-lease-comment.local.rsc index e35bbe7..27e6605 100644 --- a/dhcp-lease-comment.local.rsc +++ b/dhcp-lease-comment.local.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=60 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # update dhcp-server lease comment with infos from access-list # https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-lease-comment.md diff --git a/dhcp-lease-comment.template.rsc b/dhcp-lease-comment.template.rsc index d4323ad..c562ca2 100644 --- a/dhcp-lease-comment.template.rsc +++ b/dhcp-lease-comment.template.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=60 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # update dhcp-server lease comment with infos from access-list # https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-lease-comment.md diff --git a/dhcp-lease-comment.wifi.rsc b/dhcp-lease-comment.wifi.rsc index f67ce6e..ba617d7 100644 --- a/dhcp-lease-comment.wifi.rsc +++ b/dhcp-lease-comment.wifi.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=60 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # update dhcp-server lease comment with infos from access-list # https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-lease-comment.md diff --git a/dhcp-to-dns.rsc b/dhcp-to-dns.rsc index a3d41c9..0ab5e2a 100644 --- a/dhcp-to-dns.rsc +++ b/dhcp-to-dns.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=20 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # check DHCP leases and add/remove/update DNS entries # https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-to-dns.md diff --git a/doc/accesslist-duplicates.md b/doc/accesslist-duplicates.md index a1f9198..a6302f5 100644 --- a/doc/accesslist-duplicates.md +++ b/doc/accesslist-duplicates.md @@ -4,7 +4,7 @@ Find and remove access list duplicates [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/backup-cloud.md b/doc/backup-cloud.md index 1f9e123..d658760 100644 --- a/doc/backup-cloud.md +++ b/doc/backup-cloud.md @@ -4,7 +4,7 @@ Upload backup to Mikrotik cloud [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/backup-email.md b/doc/backup-email.md index 3b1dbb2..aedae4d 100644 --- a/doc/backup-email.md +++ b/doc/backup-email.md @@ -4,7 +4,7 @@ Send backup via e-mail [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/backup-partition.md b/doc/backup-partition.md index 1cef2c9..9f62967 100644 --- a/doc/backup-partition.md +++ b/doc/backup-partition.md @@ -4,7 +4,7 @@ Save configuration to fallback partition [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/backup-upload.md b/doc/backup-upload.md index c44217c..f2858b2 100644 --- a/doc/backup-upload.md +++ b/doc/backup-upload.md @@ -4,7 +4,7 @@ Upload backup to server [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/capsman-download-packages.md b/doc/capsman-download-packages.md index c68900e..d719934 100644 --- a/doc/capsman-download-packages.md +++ b/doc/capsman-download-packages.md @@ -4,7 +4,7 @@ Download packages for CAP upgrade from CAPsMAN [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/capsman-rolling-upgrade.md b/doc/capsman-rolling-upgrade.md index 27d855f..f366d40 100644 --- a/doc/capsman-rolling-upgrade.md +++ b/doc/capsman-rolling-upgrade.md @@ -4,7 +4,7 @@ Run rolling CAP upgrades from CAPsMAN [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/certificate-renew-issued.md b/doc/certificate-renew-issued.md index 91a1914..096e07b 100644 --- a/doc/certificate-renew-issued.md +++ b/doc/certificate-renew-issued.md @@ -4,7 +4,7 @@ Renew locally issued certificates [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/check-certificates.md b/doc/check-certificates.md index 636f719..4188815 100644 --- a/doc/check-certificates.md +++ b/doc/check-certificates.md @@ -4,7 +4,7 @@ Renew certificates and notify on expiration [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/check-health.md b/doc/check-health.md index f94a0bf..578ea43 100644 --- a/doc/check-health.md +++ b/doc/check-health.md @@ -4,7 +4,7 @@ Notify about health state [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/check-lte-firmware-upgrade.md b/doc/check-lte-firmware-upgrade.md index 59a62c7..66b2cf5 100644 --- a/doc/check-lte-firmware-upgrade.md +++ b/doc/check-lte-firmware-upgrade.md @@ -4,7 +4,7 @@ Notify on LTE firmware upgrade [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/check-routeros-update.md b/doc/check-routeros-update.md index f9d485c..2e9b8aa 100644 --- a/doc/check-routeros-update.md +++ b/doc/check-routeros-update.md @@ -4,7 +4,7 @@ Notify on RouterOS update [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/collect-wireless-mac.md b/doc/collect-wireless-mac.md index 57032d8..84c111d 100644 --- a/doc/collect-wireless-mac.md +++ b/doc/collect-wireless-mac.md @@ -4,7 +4,7 @@ Collect MAC addresses in wireless access list [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/daily-psk.md b/doc/daily-psk.md index 3894d52..2a15af5 100644 --- a/doc/daily-psk.md +++ b/doc/daily-psk.md @@ -4,7 +4,7 @@ Use wireless network with daily psk [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/dhcp-lease-comment.md b/doc/dhcp-lease-comment.md index f95b124..6a4c930 100644 --- a/doc/dhcp-lease-comment.md +++ b/doc/dhcp-lease-comment.md @@ -4,7 +4,7 @@ Comment DHCP leases with info from access list [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/dhcp-to-dns.md b/doc/dhcp-to-dns.md index 13d5ef3..572011f 100644 --- a/doc/dhcp-to-dns.md +++ b/doc/dhcp-to-dns.md @@ -4,7 +4,7 @@ Create DNS records for DHCP leases [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/firmware-upgrade-reboot.md b/doc/firmware-upgrade-reboot.md index bac17a7..7ab6ac5 100644 --- a/doc/firmware-upgrade-reboot.md +++ b/doc/firmware-upgrade-reboot.md @@ -4,7 +4,7 @@ Automatically upgrade firmware and reboot [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/fw-addr-lists.md b/doc/fw-addr-lists.md index e9a8ff7..2008c7e 100644 --- a/doc/fw-addr-lists.md +++ b/doc/fw-addr-lists.md @@ -4,7 +4,7 @@ Download, import and update firewall address-lists [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/global-wait.md b/doc/global-wait.md index 4b42717..6787d20 100644 --- a/doc/global-wait.md +++ b/doc/global-wait.md @@ -4,7 +4,7 @@ Wait for global functions and modules [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/gps-track.md b/doc/gps-track.md index 7006fb3..9685899 100644 --- a/doc/gps-track.md +++ b/doc/gps-track.md @@ -4,7 +4,7 @@ Send GPS position to server [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/hotspot-to-wpa.md b/doc/hotspot-to-wpa.md index 275fe4d..07d07dc 100644 --- a/doc/hotspot-to-wpa.md +++ b/doc/hotspot-to-wpa.md @@ -4,7 +4,7 @@ Use WPA network with hotspot credentials [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ip-addr-bridge.md b/doc/ip-addr-bridge.md index 941a8ae..ddbcc0a 100644 --- a/doc/ip-addr-bridge.md +++ b/doc/ip-addr-bridge.md @@ -4,7 +4,7 @@ Manage IP addresses with bridge status [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ipsec-to-dns.md b/doc/ipsec-to-dns.md index 0a91960..a688e80 100644 --- a/doc/ipsec-to-dns.md +++ b/doc/ipsec-to-dns.md @@ -4,7 +4,7 @@ Create DNS records for IPSec peers [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ipv6-update.md b/doc/ipv6-update.md index 20265fe..88600c5 100644 --- a/doc/ipv6-update.md +++ b/doc/ipv6-update.md @@ -4,7 +4,7 @@ Update configuration on IPv6 prefix change [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/lease-script.md b/doc/lease-script.md index 4d2f3bc..1b59ff7 100644 --- a/doc/lease-script.md +++ b/doc/lease-script.md @@ -4,7 +4,7 @@ Run other scripts on DHCP lease [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/leds-mode.md b/doc/leds-mode.md index 90ea418..c01472e 100644 --- a/doc/leds-mode.md +++ b/doc/leds-mode.md @@ -4,7 +4,7 @@ Manage LEDs dark mode [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/log-forward.md b/doc/log-forward.md index 44409dc..55b1540 100644 --- a/doc/log-forward.md +++ b/doc/log-forward.md @@ -4,7 +4,7 @@ Forward log messages via notification [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/bridge-port-to.md b/doc/mod/bridge-port-to.md index 5c8bebc..2ed9dc7 100644 --- a/doc/mod/bridge-port-to.md +++ b/doc/mod/bridge-port-to.md @@ -4,7 +4,7 @@ Manage ports in bridge [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/bridge-port-vlan.md b/doc/mod/bridge-port-vlan.md index d23d5b5..ded2603 100644 --- a/doc/mod/bridge-port-vlan.md +++ b/doc/mod/bridge-port-vlan.md @@ -4,7 +4,7 @@ Manage VLANs on bridge ports [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/notification-email.md b/doc/mod/notification-email.md index 2138e31..0bef455 100644 --- a/doc/mod/notification-email.md +++ b/doc/mod/notification-email.md @@ -4,7 +4,7 @@ Send notifications via e-mail [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/notification-matrix.md b/doc/mod/notification-matrix.md index 18b6607..c96a719 100644 --- a/doc/mod/notification-matrix.md +++ b/doc/mod/notification-matrix.md @@ -4,7 +4,7 @@ Send notifications via Matrix [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/notification-ntfy.md b/doc/mod/notification-ntfy.md index b2330a5..2a43e3c 100644 --- a/doc/mod/notification-ntfy.md +++ b/doc/mod/notification-ntfy.md @@ -4,7 +4,7 @@ Send notifications via Ntfy [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/notification-telegram.md b/doc/mod/notification-telegram.md index 159fda9..f55f936 100644 --- a/doc/mod/notification-telegram.md +++ b/doc/mod/notification-telegram.md @@ -4,7 +4,7 @@ Send notifications via Telegram [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/scriptrunonce.md b/doc/mod/scriptrunonce.md index c5fa891..0127c6d 100644 --- a/doc/mod/scriptrunonce.md +++ b/doc/mod/scriptrunonce.md @@ -4,7 +4,7 @@ Download script and run it once [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/ssh-keys-import.md b/doc/mod/ssh-keys-import.md index 88524ab..dcfd95b 100644 --- a/doc/mod/ssh-keys-import.md +++ b/doc/mod/ssh-keys-import.md @@ -4,7 +4,7 @@ Import ssh keys for public key authentication [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mode-button.md b/doc/mode-button.md index 8734352..7feb19f 100644 --- a/doc/mode-button.md +++ b/doc/mode-button.md @@ -4,7 +4,7 @@ Mode button with multiple presses [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/netwatch-dns.md b/doc/netwatch-dns.md index 9fe486e..ff6c29c 100644 --- a/doc/netwatch-dns.md +++ b/doc/netwatch-dns.md @@ -4,7 +4,7 @@ Manage DNS and DoH servers from netwatch [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/netwatch-notify.md b/doc/netwatch-notify.md index 2db32bb..f504ed7 100644 --- a/doc/netwatch-notify.md +++ b/doc/netwatch-notify.md @@ -4,7 +4,7 @@ Notify on host up and down [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ospf-to-leds.md b/doc/ospf-to-leds.md index 121f77b..23248b5 100644 --- a/doc/ospf-to-leds.md +++ b/doc/ospf-to-leds.md @@ -4,7 +4,7 @@ Visualize OSPF state via LEDs [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/packages-update.md b/doc/packages-update.md index fae3896..8b0d4a3 100644 --- a/doc/packages-update.md +++ b/doc/packages-update.md @@ -4,7 +4,7 @@ Manage system update [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ppp-on-up.md b/doc/ppp-on-up.md index 21847c7..7902f3b 100644 --- a/doc/ppp-on-up.md +++ b/doc/ppp-on-up.md @@ -4,7 +4,7 @@ Run scripts on ppp connection [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/sms-action.md b/doc/sms-action.md index b4678af..5de7f0d 100644 --- a/doc/sms-action.md +++ b/doc/sms-action.md @@ -4,7 +4,7 @@ Act on received SMS [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/sms-forward.md b/doc/sms-forward.md index 597410b..8e7417b 100644 --- a/doc/sms-forward.md +++ b/doc/sms-forward.md @@ -4,7 +4,7 @@ Forward received SMS [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/super-mario-theme.md b/doc/super-mario-theme.md index e4bae2e..2ffb25b 100644 --- a/doc/super-mario-theme.md +++ b/doc/super-mario-theme.md @@ -4,7 +4,7 @@ Play Super Mario theme [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/telegram-chat.md b/doc/telegram-chat.md index eb4acf5..95f8cf9 100644 --- a/doc/telegram-chat.md +++ b/doc/telegram-chat.md @@ -4,7 +4,7 @@ Chat with your router and send commands via Telegram bot [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/unattended-lte-firmware-upgrade.md b/doc/unattended-lte-firmware-upgrade.md index 6680447..e9a888c 100644 --- a/doc/unattended-lte-firmware-upgrade.md +++ b/doc/unattended-lte-firmware-upgrade.md @@ -4,7 +4,7 @@ Install LTE firmware upgrade [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/update-gre-address.md b/doc/update-gre-address.md index 80902b9..7e101c4 100644 --- a/doc/update-gre-address.md +++ b/doc/update-gre-address.md @@ -4,7 +4,7 @@ Update GRE configuration with dynamic addresses [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/update-tunnelbroker.md b/doc/update-tunnelbroker.md index 2539e2f..126d470 100644 --- a/doc/update-tunnelbroker.md +++ b/doc/update-tunnelbroker.md @@ -4,7 +4,7 @@ Update tunnelbroker configuration [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.13-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/firmware-upgrade-reboot.rsc b/firmware-upgrade-reboot.rsc index 169a2e0..74847ac 100644 --- a/firmware-upgrade-reboot.rsc +++ b/firmware-upgrade-reboot.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2022-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # install firmware upgrade, and reboot # https://git.eworm.de/cgit/routeros-scripts/about/doc/firmware-upgrade-reboot.md diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 007282c..4930e86 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2023-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # download, import and update firewall address-lists # https://git.eworm.de/cgit/routeros-scripts/about/doc/fw-addr-lists.md diff --git a/global-wait.rsc b/global-wait.rsc index 239f575..f0631e2 100644 --- a/global-wait.rsc +++ b/global-wait.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # wait for global-functions to finish # https://git.eworm.de/cgit/routeros-scripts/about/doc/global-wait.md diff --git a/gps-track.rsc b/gps-track.rsc index e2a4e16..a2ea9ff 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # track gps data by sending json data to http server # https://git.eworm.de/cgit/routeros-scripts/about/doc/gps-track.md diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index 8f55d71..29bd48d 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=80 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # manage and clean up private WPA passphrase after hotspot login # https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index 7ac996c..06dd9f0 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=80 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # manage and clean up private WPA passphrase after hotspot login # https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index 39c9f25..7c74d10 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=80 -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # manage and clean up private WPA passphrase after hotspot login # https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa.capsman.rsc b/hotspot-to-wpa.capsman.rsc index 113c95d..b85c591 100644 --- a/hotspot-to-wpa.capsman.rsc +++ b/hotspot-to-wpa.capsman.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # add private WPA passphrase after hotspot login # https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa.template.rsc b/hotspot-to-wpa.template.rsc index 10f0c7e..44607cc 100644 --- a/hotspot-to-wpa.template.rsc +++ b/hotspot-to-wpa.template.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # add private WPA passphrase after hotspot login # https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa.wifi.rsc b/hotspot-to-wpa.wifi.rsc index dbf50e0..25933c6 100644 --- a/hotspot-to-wpa.wifi.rsc +++ b/hotspot-to-wpa.wifi.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # add private WPA passphrase after hotspot login # https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md diff --git a/ipsec-to-dns.rsc b/ipsec-to-dns.rsc index 8894eee..bd74a8f 100644 --- a/ipsec-to-dns.rsc +++ b/ipsec-to-dns.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2021-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # and add/remove/update DNS entries from IPSec mode-config # https://git.eworm.de/cgit/routeros-scripts/about/doc/ipsec-to-dns.md diff --git a/ipv6-update.rsc b/ipv6-update.rsc index ec9a03a..0577bdc 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # update firewall and dns settings on IPv6 prefix change # https://git.eworm.de/cgit/routeros-scripts/about/doc/ipv6-update.md diff --git a/lease-script.rsc b/lease-script.rsc index a9d4b68..f484414 100644 --- a/lease-script.rsc +++ b/lease-script.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # run scripts on DHCP lease # https://git.eworm.de/cgit/routeros-scripts/about/doc/lease-script.md diff --git a/log-forward.rsc b/log-forward.rsc index 7abcb4d..5133e73 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # forward log messages via notification # https://git.eworm.de/cgit/routeros-scripts/about/doc/log-forward.md diff --git a/mod/bridge-port-to.rsc b/mod/bridge-port-to.rsc index 000532a..7dae679 100644 --- a/mod/bridge-port-to.rsc +++ b/mod/bridge-port-to.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # reset bridge ports to default bridge # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/bridge-port-to.md diff --git a/mod/bridge-port-vlan.rsc b/mod/bridge-port-vlan.rsc index 760e8a6..c9f55ae 100644 --- a/mod/bridge-port-vlan.rsc +++ b/mod/bridge-port-vlan.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # manage VLANs on bridge ports # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/bridge-port-vlan.md diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index df2e81a..3d62ddf 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # send notifications via e-mail # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/notification-email.md diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 196633a..3adc1df 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -4,7 +4,7 @@ # Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # send notifications via Matrix # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/notification-matrix.md diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index cdc10e7..661f69f 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # send notifications via Ntfy (ntfy.sh) # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/notification-ntfy.md diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 1890483..671bd1c 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # send notifications via Telegram # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/notification-telegram.md diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index c3972a0..3d5dce9 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # download script and run it once # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/scriptrunonce.md diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index 6272a93..8cafa95 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # import ssh keys for public key authentication # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/ssh-keys-import.md diff --git a/mode-button.rsc b/mode-button.rsc index 4994f6b..7908a7f 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # act on multiple mode and reset button presses # https://git.eworm.de/cgit/routeros-scripts/about/doc/mode-button.md diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 09365ba..9635be6 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2022-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # monitor and manage dns/doh with netwatch # https://git.eworm.de/cgit/routeros-scripts/about/doc/netwatch-dns.md diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index 17682f0..b658eae 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # monitor netwatch and send notifications # https://git.eworm.de/cgit/routeros-scripts/about/doc/netwatch-notify.md diff --git a/ospf-to-leds.rsc b/ospf-to-leds.rsc index 0932815..b78faa4 100644 --- a/ospf-to-leds.rsc +++ b/ospf-to-leds.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # visualize ospf instance state via leds # https://git.eworm.de/cgit/routeros-scripts/about/doc/ospf-to-leds.md diff --git a/packages-update.rsc b/packages-update.rsc index 97039ec..b08a48d 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # download packages and reboot for installation # https://git.eworm.de/cgit/routeros-scripts/about/doc/packages-update.md diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index 6484ecb..337b32d 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # run scripts on ppp up # https://git.eworm.de/cgit/routeros-scripts/about/doc/ppp-on-up.md diff --git a/sms-action.rsc b/sms-action.rsc index 70bfb28..c896659 100644 --- a/sms-action.rsc +++ b/sms-action.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # run action on received SMS # https://git.eworm.de/cgit/routeros-scripts/about/doc/sms-action.md diff --git a/sms-forward.rsc b/sms-forward.rsc index 477d11e..0d493b6 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -4,7 +4,7 @@ # Anatoly Bubenkov # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # forward SMS to e-mail # https://git.eworm.de/cgit/routeros-scripts/about/doc/sms-forward.md diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 1c274ec..2bdc04d 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2023-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # use Telegram to chat with your Router and send commands # https://git.eworm.de/cgit/routeros-scripts/about/doc/telegram-chat.md diff --git a/update-gre-address.rsc b/update-gre-address.rsc index 76d0c81..6dd829d 100644 --- a/update-gre-address.rsc +++ b/update-gre-address.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # update gre interface remote address with dynamic address from # ipsec remote peer diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index f9ba202..67a5d30 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -5,7 +5,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: ppp-on-up -# requires RouterOS, version=7.13 +# requires RouterOS, version=7.14 # # update local address of tunnelbroker interface # https://git.eworm.de/cgit/routeros-scripts/about/doc/update-tunnelbroker.md From 8ea780554164ef14e5fddc1ab8692eec455a0d0c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 22 Jul 2024 17:57:22 +0200 Subject: [PATCH 130/893] global-functions: $EitherOr: pass boolean value Note that literal "true" or "false" (even without quotes) is converted to string. So you may have to enclose it in parentheses for a boolean value: > :put [ :typeof [ $EitherOr true false ] ]; str > :put [ :typeof [ $EitherOr (true) (false) ] ]; bool --- global-functions.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 54dcb68..4f37fa5 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -382,6 +382,9 @@ :set EitherOr do={ :global IfThenElse; + :if ([ :typeof $1 ] = "bool") do={ + :return $1; + } :if ([ :typeof $1 ] = "num") do={ :return [ $IfThenElse ($1 != 0) $1 $2 ]; } From 511184a4a7bbabd6b7789defb9cc65c22bb50664 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 22 Jul 2024 21:13:02 +0200 Subject: [PATCH 131/893] global-functions: $EitherOr: revert... ... but leave a comment. --- global-functions.rsc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 4f37fa5..41120fd 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -382,15 +382,13 @@ :set EitherOr do={ :global IfThenElse; - :if ([ :typeof $1 ] = "bool") do={ - :return $1; - } :if ([ :typeof $1 ] = "num") do={ :return [ $IfThenElse ($1 != 0) $1 $2 ]; } :if ([ :typeof $1 ] = "time") do={ :return [ $IfThenElse ($1 > 0s) $1 $2 ]; } + # this works for boolean values, literal ones with parentheses :return [ $IfThenElse ([ :len [ :tostr $1 ] ] > 0) $1 $2 ]; } From 22d93d07081cd23954abcae66aa448794f3dda51 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 23 Apr 2024 10:13:33 +0200 Subject: [PATCH 132/893] README: drop command to remove certificate file... ... as this is done automatically with RouterOS 7.15rc1 and later. Not bumping the required RouterOS version (badge) here... Worst thing that can happen is a stale certificate file left on storage. --- README.d/03-check-certs.avif | Bin 8932 -> 8047 bytes README.md | 3 +-- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/README.d/03-check-certs.avif b/README.d/03-check-certs.avif index 46b7220f1df02c8379e95113aeb13bf91859de0f..4717b3ea9cc9436ab94be0e471263f601fcf47c8 100644 GIT binary patch delta 3868 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 m?X8>I9uN Date: Tue, 23 Apr 2024 10:14:47 +0200 Subject: [PATCH 133/893] INITIAL-COMMANDS: drop command to remove certificate file... ... as this is done automatically with RouterOS 7.15rc1 and later. --- INITIAL-COMMANDS.md | 1 - 1 file changed, 1 deletion(-) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 2be51c5..3f5f75c 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -23,7 +23,6 @@ Run the complete base installation: :if ([ :len [ /certificate/find where fingerprint="69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470" ] ] != 1) do={ :error "Something is wrong with your certificates!"; }; - /file/remove [ find where name="ISRG-Root-X2.pem" ]; :delay 1s; /system/script/set name=("global-config-overlay-" . [ /system/clock/get date ] . "-" . [ /system/clock/get time ]) [ find where name="global-config-overlay" ]; :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ From 209c37664baddffb730dcb5d85ebc09b9bf8f3b0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 13 Mar 2024 09:13:39 +0100 Subject: [PATCH 134/893] netwatch-notify: do not switch type when resolving This requires RouterOS 7.15beta4, but let's bump the required version to next stable release instead. --- doc/netwatch-notify.md | 2 +- netwatch-notify.rsc | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/netwatch-notify.md b/doc/netwatch-notify.md index f504ed7..948cbec 100644 --- a/doc/netwatch-notify.md +++ b/doc/netwatch-notify.md @@ -4,7 +4,7 @@ Notify on host up and down [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index b658eae..a49d0cd 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # monitor netwatch and send notifications # https://git.eworm.de/cgit/routeros-scripts/about/doc/netwatch-notify.md @@ -102,7 +102,8 @@ :if ([ :typeof ($HostInfo->"resolve") ] = "str") do={ :if ([ $IsDNSResolving ] = true) do={ :do { - :local Resolve [ :resolve ($HostInfo->"resolve") ]; + :local Resolve [ :resolve type=[ $IfThenElse ([ :typeof ($HostVal->"host") ] = "ip") \ + "ipv4" "ipv6" ] ($HostInfo->"resolve") ]; :if ($Resolve != $HostVal->"host") do={ :if ([ $ResolveExpected $ScriptName ($HostInfo->"resolve") ($HostVal->"host") ] = false) do={ $LogPrint info $ScriptName ("Name '" . $HostInfo->"resolve" . [ $IfThenElse \ From a017f2422442d71bac2ae7081e089e90a1636d83 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 May 2024 20:35:06 +0200 Subject: [PATCH 135/893] daily-psk: drop workaround for old RouterOS --- daily-psk.capsman.rsc | 3 +-- daily-psk.local.rsc | 3 +-- daily-psk.template.rsc | 5 ++--- daily-psk.wifi.rsc | 5 ++--- doc/daily-psk.md | 2 +- 5 files changed, 7 insertions(+), 11 deletions(-) diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index 6dafc08..0562e39 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # update daily PSK (pre shared key) # https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md @@ -23,7 +23,6 @@ :global FormatLine; :global LogPrint; - :global RequiredRouterOS; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index 4709f3a..0bef0e9 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # update daily PSK (pre shared key) # https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md @@ -23,7 +23,6 @@ :global FormatLine; :global LogPrint; - :global RequiredRouterOS; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 6b7f5fd..9d71958 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # update daily PSK (pre shared key) # https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md @@ -24,7 +24,6 @@ :global FormatLine; :global LogPrint; - :global RequiredRouterOS; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; @@ -86,7 +85,7 @@ /interface/wireless/access-list/set $AccList private-pre-shared-key=$NewPsk; :if ([ :len [ /caps-man/actual-interface-configuration/find where configuration.ssid=$Ssid !disabled ] ] > 0) do={ - :if ([ $RequiredRouterOS $ScriptName "7.15beta8" false ] = false || [ :len [ /interface/wifi/find where configuration.ssid=$Ssid !disabled ] ] > 0) do={ + :if ([ :len [ /interface/wifi/find where configuration.ssid=$Ssid !disabled ] ] > 0) do={ :if ([ :len [ /interface/wireless/find where name=$IntName !disabled ] ] = 1) do={ :if ($Seen->$Ssid = 1) do={ $LogPrint debug $ScriptName ("Already sent a mail for SSID " . $Ssid . ", skipping."); diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index 90c6ac5..83a896c 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # update daily PSK (pre shared key) # https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md @@ -23,7 +23,6 @@ :global FormatLine; :global LogPrint; - :global RequiredRouterOS; :global ScriptLock; :global SendNotification2; :global SymbolForNotification; @@ -72,7 +71,7 @@ $LogPrint info $ScriptName ("Updating daily PSK for '" . $Ssid . "' to '" . $NewPsk . "' (was '" . $OldPsk . "')"); /interface/wifi/access-list/set $AccList passphrase=$NewPsk; - :if ([ $RequiredRouterOS $ScriptName "7.15beta8" false ] = false || [ :len [ /interface/wifi/find where configuration.ssid=$Ssid !disabled ] ] > 0) do={ + :if ([ :len [ /interface/wifi/find where configuration.ssid=$Ssid !disabled ] ] > 0) do={ :if ($Seen->$Ssid = 1) do={ $LogPrint debug $ScriptName ("Already sent a mail for SSID " . $Ssid . ", skipping."); } else={ diff --git a/doc/daily-psk.md b/doc/daily-psk.md index 2a15af5..4a3de64 100644 --- a/doc/daily-psk.md +++ b/doc/daily-psk.md @@ -4,7 +4,7 @@ Use wireless network with daily psk [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) From 32474c751f9fb69e096dc7f3b9e8c1f2c1fe6f90 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 May 2024 20:37:42 +0200 Subject: [PATCH 136/893] telegram-chat: drop extra conversion The JSON parser was actually fixed in RouterOS 7.15beta4, but let's bump the required version to next stable release instead. --- doc/telegram-chat.md | 2 +- telegram-chat.rsc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/telegram-chat.md b/doc/telegram-chat.md index 95f8cf9..1e6f70f 100644 --- a/doc/telegram-chat.md +++ b/doc/telegram-chat.md @@ -4,7 +4,7 @@ Chat with your router and send commands via Telegram bot [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 2bdc04d..f2750f5 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2023-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # use Telegram to chat with your Router and send commands # https://git.eworm.de/cgit/routeros-scripts/about/doc/telegram-chat.md @@ -97,7 +97,7 @@ :local Trusted false; :local Chat ($Message->"chat"); :local From ($Message->"from"); - :local Command [ :tostr ($Message->"text") ]; + :local Command ($Message->"text"); :foreach IdsTrusted in=($TelegramChatId, $TelegramChatIdsTrusted) do={ :if ($From->"id" = $IdsTrusted || $From->"username" = $IdsTrusted) do={ From c28574b8f4484463e326e895fcac110d805efa01 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 19 Aug 2024 10:35:18 +0200 Subject: [PATCH 137/893] README: make the QR code a link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 53dcffb..ab6bd8c 100644 --- a/README.md +++ b/README.md @@ -364,7 +364,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Upstream -------- -![upstream](README.d/upstream.png) +[![upstream](README.d/upstream.png)](https://rsc.eworm.de/) URL: [GitHub.com](https://github.com/eworm-de/routeros-scripts#routeros-scripts) From 342d459436414ea94b9081474122c60b50f61569 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 19 Aug 2024 14:54:17 +0200 Subject: [PATCH 138/893] README: match the certificate file name from Let's Encrypt website... ... so import from manually downloaded and transferred file works out of the box as well. --- README.d/01-download-certs.avif | Bin 4596 -> 4890 bytes README.md | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.d/01-download-certs.avif b/README.d/01-download-certs.avif index 4a074eb59dce96fbf79c0b50dfdf028f7eff9d4f..d41ca0595fa2f6b2ca1eaf3a94e34244d46e017a 100644 GIT binary patch delta 3543 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 delta 3247 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 Date: Mon, 19 Aug 2024 14:55:04 +0200 Subject: [PATCH 139/893] INITIAL-COMMANDS: match the certificate file name from Let's Encrypt website... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ... and our README. 😜 --- INITIAL-COMMANDS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 3f5f75c..84a88fe 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -17,9 +17,9 @@ Initial commands Run the complete base installation: { - /tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/ISRG-Root-X2.pem" dst-path="ISRG-Root-X2.pem" as-value; + /tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/ISRG-Root-X2.pem" dst-path="isrg-root-x2.pem" as-value; :delay 1s; - /certificate/import file-name=ISRG-Root-X2.pem passphrase=""; + /certificate/import file-name=isrg-root-x2.pem passphrase=""; :if ([ :len [ /certificate/find where fingerprint="69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470" ] ] != 1) do={ :error "Something is wrong with your certificates!"; }; From d360cc05becf4363aef07db652e39dd1315a2875 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 17 Aug 2024 21:53:10 +0200 Subject: [PATCH 140/893] netwatch-dns: disable DoH if time not sync... ... as it is possible that time is off, DNS via DoH fails (cert invalid), and finally syncing time fails due to failing DNS. --- netwatch-dns.rsc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 9635be6..e205081 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -16,6 +16,8 @@ :global CertificateAvailable; :global EitherOr; + :global IsDNSResolving; + :global IsTimeSync; :global LogPrint; :global ParseKeyValueStore; :global ScriptLock; @@ -67,6 +69,12 @@ :local DohCurrent [ /ip/dns/get use-doh-server ]; :local DohServers ({}); + :if ([ :len $DohCurrent ] > 0 && [ $IsDNSResolving ] = false && [ $IsTimeSync ] = false) do={ + $LogPrint info $ScriptName ("Time is not sync, disabling DoH: " . $DohCurrent); + /ip/dns/set use-doh-server=""; + :set DohCurrent ""; + } + :foreach Host in=[ /tool/netwatch/find where comment~"\\bdoh\\b" status="up" ] do={ :local HostVal [ /tool/netwatch/get $Host ]; :local HostInfo [ $ParseKeyValueStore ($HostVal->"comment") ]; From f17502d3d0e54173f6c843685b4e26a3c7cac89b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sun, 18 Aug 2024 22:10:37 +0200 Subject: [PATCH 141/893] check-routeros-update: support switching to stable channel... ... with a feature update in testing channel. --- check-routeros-update.rsc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index d45432a..3584a94 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -125,6 +125,15 @@ } :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ + :if (($Update->"channel") = "testing" && ($NumInstalled & 0xffff0000) < ($NumLatest & 0xffff0000)) do={ + :put ("This is a feature update in testing channel. Switch to channel 'stable'? [y/N]"); + :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ + /system/package/update/set channel=stable; + $LogPrint info $ScriptName ("Switched to channel 'stable', please re-run!"); + :error true; + } + } + :put ("Do you want to install RouterOS version " . $Update->"latest-version" . "? [y/N]"); :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ $DoUpdate; From 3e9a7ea75a29111f4601cedf966471cbf4d9c894 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 27 Aug 2024 09:38:13 +0200 Subject: [PATCH 142/893] certs: add 'DigiCert Global Root G3'... ... for quad9.net which can be used for DoH: $CertificateAvailable "DigiCert Global Root G3"; /ip/dns/set use-doh-server=https://9.9.9.9/dns-query verify-doh-cert=yes; --- certs/DigiCert-Global-Root-G3.pem | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 certs/DigiCert-Global-Root-G3.pem diff --git a/certs/DigiCert-Global-Root-G3.pem b/certs/DigiCert-Global-Root-G3.pem new file mode 100644 index 0000000..12324dc --- /dev/null +++ b/certs/DigiCert-Global-Root-G3.pem @@ -0,0 +1,22 @@ +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- From 90632f223adce7139b831fc2e6a0668431e5f26c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 27 Aug 2024 10:59:51 +0200 Subject: [PATCH 143/893] doc/netwatch-dns: 'DigiCert Global Root G3' for Quad9 --- doc/netwatch-dns.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/netwatch-dns.md b/doc/netwatch-dns.md index ff6c29c..54dd6c6 100644 --- a/doc/netwatch-dns.md +++ b/doc/netwatch-dns.md @@ -63,7 +63,7 @@ Importing a certificate automatically is possible, at least if available in the repository (see `certs` sub directory). /tool/netwatch/add comment="doh, doh-cert=DigiCert Global Root G2" host=1.1.1.1; - /tool/netwatch/add comment="doh, doh-cert=DigiCert Global Root CA" host=9.9.9.9; + /tool/netwatch/add comment="doh, doh-cert=DigiCert Global Root G3" host=9.9.9.9; /tool/netwatch/add comment="doh, doh-cert=GTS Root R1" host=8.8.8.8; Sometimes using just one specific (possibly internal) DNS server may be From 48fd281c1d048bbce9dbe0f0e6940eb8f417a9f8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 27 Aug 2024 16:43:35 +0200 Subject: [PATCH 144/893] certs: drop 'DigiCert Global Root CA' --- certs/DigiCert-Global-Root-CA.pem | 29 ----------------------------- 1 file changed, 29 deletions(-) delete mode 100644 certs/DigiCert-Global-Root-CA.pem diff --git a/certs/DigiCert-Global-Root-CA.pem b/certs/DigiCert-Global-Root-CA.pem deleted file mode 100644 index b0f0013..0000000 --- a/certs/DigiCert-Global-Root-CA.pem +++ /dev/null @@ -1,29 +0,0 @@ -# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root CA" -# Serial: 10944719598952040374951832963794454346 -# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e -# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 -# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- From 917be4b42574cd66254a4559330e83bc5c2ed233 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 28 Aug 2024 17:54:13 +0200 Subject: [PATCH 145/893] fw-addr-lists: spamhaus.org requires 'GTS Root R4' now Fixes: https://github.com/eworm-de/routeros-scripts/issues/78 --- global-config.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global-config.rsc b/global-config.rsc index cdc1d5c..2d10a9e 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -106,9 +106,9 @@ { url="https://lists.blocklist.de/lists/strongips.txt"; cert="Certum Trusted Network CA" }; # { url="https://www.spamhaus.org/drop/drop.txt"; -# cert="Baltimore CyberTrust Root" }; +# cert="GTS Root R4" }; # { url="https://www.spamhaus.org/drop/edrop.txt"; -# cert="Baltimore CyberTrust Root" }; +# cert="GTS Root R4" }; }; # "mikrotik"={ # { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/mikrotik"; From f4c97559b337413fb91bec4927a3de2ac7e81d09 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 28 Aug 2024 17:56:48 +0200 Subject: [PATCH 146/893] fw-addr-lists: drop edrop.txt, which does no longer exist --- global-config.rsc | 2 -- 1 file changed, 2 deletions(-) diff --git a/global-config.rsc b/global-config.rsc index 2d10a9e..03e5bb4 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -106,8 +106,6 @@ { url="https://lists.blocklist.de/lists/strongips.txt"; cert="Certum Trusted Network CA" }; # { url="https://www.spamhaus.org/drop/drop.txt"; -# cert="GTS Root R4" }; -# { url="https://www.spamhaus.org/drop/edrop.txt"; # cert="GTS Root R4" }; }; # "mikrotik"={ From 21fa46fdf6720cf3ec57980e29b4da9cf2e0f46d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 28 Aug 2024 17:59:44 +0200 Subject: [PATCH 147/893] certs: drop 'Baltimore CyberTrust Root' --- certs/Baltimore-CyberTrust-Root.pem | 28 ---------------------------- 1 file changed, 28 deletions(-) delete mode 100644 certs/Baltimore-CyberTrust-Root.pem diff --git a/certs/Baltimore-CyberTrust-Root.pem b/certs/Baltimore-CyberTrust-Root.pem deleted file mode 100644 index de8121a..0000000 --- a/certs/Baltimore-CyberTrust-Root.pem +++ /dev/null @@ -1,28 +0,0 @@ -# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust -# Label: "Baltimore CyberTrust Root" -# Serial: 33554617 -# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 -# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 -# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- From 9737bfa46ad5b08f39ba0442061d08e974cb14c5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 2 Sep 2024 22:54:41 +0200 Subject: [PATCH 148/893] =?UTF-8?q?certs:=20add=20poor=20man's=20check=20?= =?UTF-8?q?=F0=9F=98=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- certs/Makefile | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 certs/Makefile diff --git a/certs/Makefile b/certs/Makefile new file mode 100644 index 0000000..2e6ac9d --- /dev/null +++ b/certs/Makefile @@ -0,0 +1,31 @@ +# Makefile to check certificates + +DOMAINS = \ + 1.1.1.1/DigiCert-Global-Root-G2 \ + 8.8.8.8/GTS-Root-R1 \ + 9.9.9.9/DigiCert-Global-Root-G3 \ + api.macvendors.com/GTS-Root-R4 \ + api.mullvad.net/ISRG-Root-X1 \ + api.telegram.org/Go-Daddy-Root-Certificate-Authority-G2 \ + cloudflare-dns.com/DigiCert-Global-Root-G2 \ + dns.google/GTS-Root-R1 \ + dns.quad9.net/DigiCert-Global-Root-G3 \ + feodotracker.abuse.ch/GlobalSign \ + git.eworm.de/ISRG-Root-X2 \ + ipv4.showipv6.de/ISRG-Root-X1 \ + ipv4.tunnelbroker.net/Starfield-Root-Certificate-Authority-G2 \ + ipv6.showipv6.de/ISRG-Root-X1 \ + lists.blocklist.de/Certum-Trusted-Network-CA \ + mkcert.org/ISRG-Root-X1 \ + ntfy.sh/ISRG-Root-X1 \ + sslbl.abuse.ch/GlobalSign \ + upgrade.mikrotik.com/ISRG-Root-X1 \ + www.dshield.org/ISRG-Root-X1 \ + www.spamhaus.org/GTS-Root-R4 + +.PHONY: $(DOMAINS) + +all: $(DOMAINS) + +$(DOMAINS): + curl --output /dev/null --silent --connect-timeout 5 --cacert $(notdir $@).pem https://$(dir $@) From 09dcd51feb0d17e7c0715aa10786df169936760a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 4 Sep 2024 12:02:20 +0200 Subject: [PATCH 149/893] netwatch-dns: give warning on CRL use --- netwatch-dns.rsc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index e205081..09d471d 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -19,6 +19,7 @@ :global IsDNSResolving; :global IsTimeSync; :global LogPrint; + :global LogPrintOnce; :global ParseKeyValueStore; :global ScriptLock; @@ -126,6 +127,9 @@ :if ($Data != false) do={ :if ([ :typeof [ :find $Data "doh-check-OK" ] ] = "num") do={ /ip/dns/set use-doh-server=($DohServer->"doh-url") verify-doh-cert=yes; + :if ([ /certificate/settings/get crl-use ] = true) do={ + $LogPrintOnce warning $ScriptName ("Configured to use CRL, that can cause severe issue!"); + } /ip/dns/cache/flush; $LogPrint info $ScriptName ("Setting DoH server: " . ($DohServer->"doh-url")); :error true; From d23d05f2ea3b3d0e5c11d0780ef87566641296c7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 5 Sep 2024 22:10:11 +0200 Subject: [PATCH 150/893] fw-addr-lists: handle JSON format from spamhaus.org Closes: https://github.com/eworm-de/routeros-scripts/issues/79 --- fw-addr-lists.rsc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 4930e86..4675e3a 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -88,7 +88,12 @@ :while ([ :len $Data ] != 0) do={ :local Line [ :pick $Data 0 [ :find $Data "\n" ] ]; - :local Address ([ :pick $Line 0 [ $FindDelim $Line ] ] . ($List->"cidr")); + :local Address; + :if ([ :pick $Line 0 1 ] = "{") do={ + :set Address [ :tostr ([ :deserialize from=json $Line ]->"cidr") ]; + } else={ + :set Address ([ :pick $Line 0 [ $FindDelim $Line ] ] . ($List->"cidr")); + } :do { :if ($Address ~ "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}(/[0-9]{1,2})?\$") do={ :set ($IPv4Addresses->$Address) $TimeOut; From fe52bd4a0a496f896439887c0943e38e8f39ce2c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 5 Sep 2024 22:58:19 +0200 Subject: [PATCH 151/893] fw-addr-lists: use lists in JSON format for spamhaus.org --- global-config.rsc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/global-config.rsc b/global-config.rsc index 03e5bb4..2ed67f3 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -105,7 +105,9 @@ cert="ISRG Root X1" }; { url="https://lists.blocklist.de/lists/strongips.txt"; cert="Certum Trusted Network CA" }; -# { url="https://www.spamhaus.org/drop/drop.txt"; +# { url="https://www.spamhaus.org/drop/drop_v4.json"; +# cert="GTS Root R4" }; +# { url="https://www.spamhaus.org/drop/drop_v6.json"; # cert="GTS Root R4" }; }; # "mikrotik"={ From 41b19b045ad98c528ce9d8d84ab086fe7c54f265 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 13 Sep 2024 10:16:17 +0200 Subject: [PATCH 152/893] global-functions: $VersionToNum: support "zero"... ... to have a clean way to generate bitmasks. [admin@mikrotik] > :put [ $VersionToNum 0.255zero0 ] 16711680 [admin@mikrotik] > :put 0x00ff0000 16711680 Once implemented everywhere the internal calculation could be changed easily. --- global-functions.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 41120fd..9ee5312 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1485,7 +1485,7 @@ :global CharacterReplace; :set Input [ $CharacterReplace $Input "." "," ]; - :foreach I in={ "alpha"; "beta"; "rc" } do={ + :foreach I in={ "zero"; "alpha"; "beta"; "rc" } do={ :set Input [ $CharacterReplace $Input $I ("," . $I . ",") ]; } @@ -1496,6 +1496,7 @@ :set Return ($Return + 0xff00); :set Multi ($Multi / 0x100); } else={ + :if ($Value = "zero") do={ } :if ($Value = "alpha") do={ :set Return ($Return + 0x3f00); } :if ($Value = "beta") do={ :set Return ($Return + 0x5f00); } :if ($Value = "rc") do={ :set Return ($Return + 0x7f00); } From 734a80ba82cfb76c34484415a5e810a1d29bdbfe Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 13 Sep 2024 10:29:06 +0200 Subject: [PATCH 153/893] backup-partition: use $VersionToNum to calculate bitmask --- backup-partition.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index 23dd7ef..51df454 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -81,8 +81,9 @@ :local Update [ /system/package/update/get ]; :local NumInstalled [ $VersionToNum ($Update->"installed-version") ]; :local NumLatest [ $VersionToNum ($Update->"latest-version") ]; + :local BitMask [ $VersionToNum "255.255zero0" ]; :if ($BackupPartitionCopyBeforeFeatureUpdate = true && $NumLatest > 0 && \ - ($NumInstalled & 0xffff0000) != ($NumLatest & 0xffff0000)) do={ + ($NumInstalled & $BitMask) != ($NumLatest & $BitMask)) do={ :if ([ $CopyTo $ScriptName $FallbackTo $FallbackToName ] = false) do={ :set PackagesUpdateBackupFailure true; :error false; From c708832b69ece50eca184b0946eebd5b3c579475 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 13 Sep 2024 10:32:40 +0200 Subject: [PATCH 154/893] check-routeros-update: use $VersionToNum to calculate bitmask --- check-routeros-update.rsc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 3584a94..84849ea 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -62,6 +62,9 @@ :local NumInstalled [ $VersionToNum ($Update->"installed-version") ]; :local NumLatest [ $VersionToNum ($Update->"latest-version") ]; + :local BitMask [ $VersionToNum "255.255zero0" ]; + :local NumInstalledFeature ($NumInstalled & $BitMask); + :local NumLatestFeature ($NumLatest & $BitMask); :local Link ("https://mikrotik.com/download/changelogs/" . $Update->"channel" . "-release-tree"); :if ($NumLatest < 117505792) do={ @@ -80,7 +83,7 @@ $DoUpdate; } - :if ($SafeUpdatePatch = true && ($NumInstalled & 0xffff0000) = ($NumLatest & 0xffff0000)) do={ + :if ($SafeUpdatePatch = true && $NumInstalledFeature = $NumLatestFeature) do={ $LogPrint info $ScriptName ("Version " . $Update->"latest-version" . " is a patch release, updating..."); $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "sparkles" ] . "RouterOS update: " . $Update->"latest-version"); \ @@ -125,7 +128,7 @@ } :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ - :if (($Update->"channel") = "testing" && ($NumInstalled & 0xffff0000) < ($NumLatest & 0xffff0000)) do={ + :if (($Update->"channel") = "testing" && $NumInstalledFeature < $NumLatestFeature) do={ :put ("This is a feature update in testing channel. Switch to channel 'stable'? [y/N]"); :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ /system/package/update/set channel=stable; From 60aa553219b289e9d3e4ef7f0bb7db471f45af69 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 25 Sep 2024 11:01:40 +0200 Subject: [PATCH 155/893] hotspot-to-wpa-cleanup: only match access-list with mac-address --- hotspot-to-wpa-cleanup.capsman.rsc | 2 +- hotspot-to-wpa-cleanup.template.rsc | 2 +- hotspot-to-wpa-cleanup.wifi.rsc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index 29bd48d..45ea72b 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -50,7 +50,7 @@ } :foreach Client in=[ /caps-man/access-list/find where comment~"^hotspot-to-wpa:" \ - !(comment~[ /system/clock/get date ]) ] do={ + !(comment~[ /system/clock/get date ]) mac-address ] do={ :local ClientVal [ /caps-man/access-list/get $Client ]; :if ([ :len [ /ip/dhcp-server/lease/find where !dynamic comment~"^hotspot-to-wpa:" \ mac-address=($ClientVal->"mac-address") ] ] = 0) do={ diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index 06dd9f0..081f3d0 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -54,7 +54,7 @@ :foreach Client in=[ /caps-man/access-list/find where comment~"^hotspot-to-wpa:" \ :foreach Client in=[ /interface/wifi/access-list/find where comment~"^hotspot-to-wpa:" \ - !(comment~[ /system/clock/get date ]) ] do={ + !(comment~[ /system/clock/get date ]) mac-address ] do={ :local ClientVal [ /caps-man/access-list/get $Client ]; :local ClientVal [ /interface/wifi/access-list/get $Client ]; :if ([ :len [ /ip/dhcp-server/lease/find where !dynamic comment~"^hotspot-to-wpa:" \ diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index 7c74d10..23f773f 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -50,7 +50,7 @@ } :foreach Client in=[ /interface/wifi/access-list/find where comment~"^hotspot-to-wpa:" \ - !(comment~[ /system/clock/get date ]) ] do={ + !(comment~[ /system/clock/get date ]) mac-address ] do={ :local ClientVal [ /interface/wifi/access-list/get $Client ]; :if ([ :len [ /ip/dhcp-server/lease/find where !dynamic comment~"^hotspot-to-wpa:" \ mac-address=($ClientVal->"mac-address") ] ] = 0) do={ From c2c72818de2cf35ea5b50eed3a505f86ed6be294 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 26 Sep 2024 15:24:05 +0200 Subject: [PATCH 156/893] global-functions: $CertificateDownload: add another check... ... that the certificate is really available. Turns out that mkcert.org ships certificates where OU or whatever matches - that's not what we want. --- global-functions.rsc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 9ee5312..e5471dd 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -176,6 +176,12 @@ :delay 1s; /file/remove [ find where name=$FileName ]; + :if ([ :len [ /certificate/find where common-name=$CommonName ] ] = 0) do={ + /certificate/remove [ find where name~("^" . $FileName . "_[0-9]+\$") ]; + $LogPrint warning $0 ("Certificate with CommonName '" . $CommonName . "' still unavailable!"); + :return false; + } + :foreach Cert in=[ /certificate/find where name~("^" . $FileName . "_[0-9]+\$") ] do={ $CertificateNameByCN [ /certificate/get $Cert common-name ]; } From 1776b8f50b173b49ca7ce3ab917de4493ae36ff6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 27 Sep 2024 17:13:32 +0200 Subject: [PATCH 157/893] backup-partition: give warning on lock in device-mode RouterOS 7.17beta2 introduced some extra security measures, including some to prevent downgrade attacks for the installation. Thus switching partitions (which can hold quite old installations) is denied by device-mode now by default. Warn about that... https://help.mikrotik.com/docs/display/ROS/Device-mode --- backup-partition.rsc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/backup-partition.rsc b/backup-partition.rsc index 51df454..56738ba 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -19,6 +19,7 @@ :global PackagesUpdateBackupFailure; :global LogPrint; + :global RequiredRouterOS; :global ScriptFromTerminal; :global ScriptLock; :global VersionToNum; @@ -59,6 +60,12 @@ :error false; } + :if ([ $RequiredRouterOS $ScriptName "7.17beta2" false ] = true && \ + ([ /system/device-mode/get ]->"partitions") != true) do={ + $LogPrint warning $ScriptName \ + ("The device mode has locked switching partitions! You will need physical access!"); + } + :local FallbackToName [ /partitions/get $ActiveRunning fallback-to ]; :local FallbackTo [ /partition/find where name=$FallbackToName !active ]; From f2576cf55892618c65fca6a1bff03b35a94acee8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 30 Sep 2024 16:10:55 +0200 Subject: [PATCH 158/893] packages-update: give warning on lock in device-mode RouterOS 7.17beta2 introduced some extra security measures, including some to prevent downgrade attacks for the installation. Detect early and exit with message and error. https://help.mikrotik.com/docs/display/ROS/Device-mode --- packages-update.rsc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages-update.rsc b/packages-update.rsc index b08a48d..b4fab46 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -18,6 +18,7 @@ :global Grep; :global LogPrint; :global ParseKeyValueStore; + :global RequiredRouterOS; :global ScriptFromTerminal; :global ScriptLock; :global VersionToNum; @@ -99,6 +100,13 @@ :local DoDowngrade false; :if ($NumInstalled > $NumLatest) do={ + :if ([ $RequiredRouterOS $ScriptName "7.17beta2" false ] = true && \ + ([ /system/device-mode/get ]->"downgrade") != true) do={ + $LogPrint error $ScriptName \ + ("The device mode has locked downgrades! You will need physical access!"); + :error false; + } + :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ :put "Latest version is older than installed one. Want to downgrade? [y/N]"; :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ From f75e701be3ceb89615bd29a2bce1404f1bf4117c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 30 Sep 2024 21:51:31 +0200 Subject: [PATCH 159/893] log-forward: get last message from log... ... not only from matched massages. --- log-forward.rsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/log-forward.rsc b/log-forward.rsc index 5133e73..e0d8f35 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -94,9 +94,10 @@ [ $IfThenElse ($Duplicates = true) (" Multi-repeated messages have been skipped.") ] . \ [ $IfThenElse ($LogForwardRateLimit > 30) ("\nRate limit in action, delaying forwarding.") ] . \ "\n" . $Messages) }); - - :set LogForwardLast ($MessageVal->".id"); } else={ :set LogForwardRateLimit [ $MAX 0 ($LogForwardRateLimit - 1) ]; } + + :local LogAll [ /log/find ]; + :set LogForwardLast ($LogAll->([ :len $LogAll ] - 1) ); } on-error={ } From 5135e836b82d36e49dd34ebde7ad2aedda6f8af2 Mon Sep 17 00:00:00 2001 From: Ignacio Serrano Date: Tue, 1 Oct 2024 20:32:37 +0200 Subject: [PATCH 160/893] mod/notification-ntfy: fix ntfy overrides --- mod/notification-ntfy.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 661f69f..b2bb280 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -87,7 +87,7 @@ :return false; } - :local Url ("https://" . $NtfyServer . "/" . [ $UrlEncode $NtfyTopic ]); + :local Url ("https://" . $Server . "/" . [ $UrlEncode $Topic ]); :local Headers ({ [ $FetchUserAgentStr ($Notification->"origin") ]; \ ("Priority: " . [ $IfThenElse ($Notification->"silent") "low" "default" ]); \ ("Title: " . "[" . $IdentityExtra . $Identity . "] " . ($Notification->"subject")) }); @@ -97,7 +97,7 @@ } :do { - :if ($NtfyServer = "ntfy.sh") do={ + :if ($Server = "ntfy.sh") do={ :if ([ $CertificateAvailable "ISRG Root X1" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); :error false; From 98e62e3eaca9d5d09b70e7ddad44c7fbe21dfbf2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 1 Oct 2024 21:42:20 +0200 Subject: [PATCH 161/893] update list of contributors --- CONTRIBUTIONS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index 0b192fc..dd21fa5 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -20,6 +20,7 @@ for details! * [Anatoly Bubenkov](mailto:bubenkoff@gmail.com) (@bubenkoff) * [Ben Harris](mailto:mail@bharr.is) (@bharrisau) * [Daniel Ziegenberg](mailto:daniel@ziegenberg.at) (@ziegenberg) +* [Ignacio Serrano](mailto:ignic@ignic.com) (@ignic) * [Michael Gisbers](mailto:michael@gisbers.de) (@mgisbers) * @netravnen * [netztrip](mailto:dave-tvg@netztrip.de) (@netztrip) From c955c94098190847856c62e4e9b437200b19884c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 2 Oct 2024 14:02:29 +0200 Subject: [PATCH 162/893] update list of contributors --- CONTRIBUTIONS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index dd21fa5..ed1d6fa 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -38,6 +38,7 @@ Add yourself to the list, * Daniel Ziegenberg (@ziegenberg) * Devin Dean (@dd2594gh) * Evaldo Gardenal +* Florian Estraviz * Giorgio Bikos * Harold Schoemaker * Hugo BV From 85a7a16c1526acfc86ec313e8527fb616f142a57 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 9 Oct 2024 14:30:29 +0200 Subject: [PATCH 163/893] backup-partition: log the warning just once --- backup-partition.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index 56738ba..8b4be9b 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -19,6 +19,7 @@ :global PackagesUpdateBackupFailure; :global LogPrint; + :global LogPrintOnce; :global RequiredRouterOS; :global ScriptFromTerminal; :global ScriptLock; @@ -62,7 +63,7 @@ :if ([ $RequiredRouterOS $ScriptName "7.17beta2" false ] = true && \ ([ /system/device-mode/get ]->"partitions") != true) do={ - $LogPrint warning $ScriptName \ + $LogPrintOnce warning $ScriptName \ ("The device mode has locked switching partitions! You will need physical access!"); } From 82e3e7a9fce024be5b93aa6adc41d6d799c05271 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 10 Oct 2024 22:20:31 +0200 Subject: [PATCH 164/893] doc/netwatch-notify: always give a host... ... as that is a required property. Any ip address is fine, it is changed anyway. --- doc/netwatch-notify.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/netwatch-notify.md b/doc/netwatch-notify.md index 948cbec..411a4d9 100644 --- a/doc/netwatch-notify.md +++ b/doc/netwatch-notify.md @@ -88,7 +88,7 @@ threshould by one. The host address can be updated dynamically. Give extra parameter `resolve` with a resolvable name: - /tool/netwatch/add comment="notify, name=example.com, resolve=example.com"; + /tool/netwatch/add comment="notify, name=example.com, resolve=example.com" host=0.0; This supports multiple A or AAAA records for a name just fine, even a CNAME to those. An update happens only if no more record with the configured host @@ -125,7 +125,7 @@ included verbatim into the notification. It is possible to add a link in notification, that is added below the formatted notification text. - /tool/netwatch/add comment="notify, name=example.com, resolve=example.com, link=https://example.com/"; + /tool/netwatch/add comment="notify, name=example.com, resolve=example.com, link=https://example.com/" host=0.0; Tips & Tricks ------------- From f7f50a9d45980e94041c9f48f017778b8a1d279c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 10 Oct 2024 22:24:56 +0200 Subject: [PATCH 165/893] doc/netwatch-notify: give an extra example for resolving AAAA records --- doc/netwatch-notify.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/doc/netwatch-notify.md b/doc/netwatch-notify.md index 411a4d9..9fa0e26 100644 --- a/doc/netwatch-notify.md +++ b/doc/netwatch-notify.md @@ -90,10 +90,15 @@ with a resolvable name: /tool/netwatch/add comment="notify, name=example.com, resolve=example.com" host=0.0; -This supports multiple A or AAAA records for a name just fine, even a CNAME +This supports multiple A records for a name just fine, even a CNAME to those. An update happens only if no more record with the configured host address is found. +The address family is preserved, so if you want AAAA records (for IPv6) +use this: + + /tool/netwatch/add comment="notify, name=example.com, resolve=example.com" host=::; + ### No notification on host down Also suppressing the notification on host down is possible with parameter From 71c58c6afb27fc66356f9d5d3d41c5af7ab2f9d7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 10 Oct 2024 22:32:46 +0200 Subject: [PATCH 166/893] doc/netwatch-notify: fix typo(s) --- doc/netwatch-notify.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/netwatch-notify.md b/doc/netwatch-notify.md index 9fa0e26..81adfe9 100644 --- a/doc/netwatch-notify.md +++ b/doc/netwatch-notify.md @@ -66,9 +66,9 @@ notification is sent. Getting the escaping right may be troublesome. Please consider adding a script in `/system/script`, then running that from hook. -### Count threshould +### Count threshold -The count threshould (default is 5 checks) is configurable as well: +The count threshold (default is 5 checks) is configurable as well: /tool/netwatch/add comment="notify, name=example.com, count=10" host=104.18.144.11; @@ -81,7 +81,7 @@ suppress notification if the parent host is down: /tool/netwatch/add comment="notify, name=example.com, parent=gateway" host=93.184.216.34; Note that every configured parent in a chain increases the check count -threshould by one. +threshold by one. ### Update from DNS From 435f70999c0fc28aaf804c00552d0d54dcf10806 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 22 Oct 2024 19:32:19 +0200 Subject: [PATCH 167/893] backup-partition: drop warning on lock in device-mode ... as switching partitions is possible again in RouterOS 7.17beta4. --- backup-partition.rsc | 8 -------- 1 file changed, 8 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index 8b4be9b..51df454 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -19,8 +19,6 @@ :global PackagesUpdateBackupFailure; :global LogPrint; - :global LogPrintOnce; - :global RequiredRouterOS; :global ScriptFromTerminal; :global ScriptLock; :global VersionToNum; @@ -61,12 +59,6 @@ :error false; } - :if ([ $RequiredRouterOS $ScriptName "7.17beta2" false ] = true && \ - ([ /system/device-mode/get ]->"partitions") != true) do={ - $LogPrintOnce warning $ScriptName \ - ("The device mode has locked switching partitions! You will need physical access!"); - } - :local FallbackToName [ /partitions/get $ActiveRunning fallback-to ]; :local FallbackTo [ /partition/find where name=$FallbackToName !active ]; From 07c95763775cb5fdef056ef6ba7ff3ac1399dbaf Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 22 Oct 2024 19:38:20 +0200 Subject: [PATCH 168/893] packages-update: check for explicit state... ... as all device-mode properties are given since RouterOS 7.14beta4. Let's assume we do not have to care about RouterOS 7.14beta2 any more... As older versions will not match the check we can now merge right away. --- packages-update.rsc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages-update.rsc b/packages-update.rsc index b4fab46..c2f0ba6 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -18,7 +18,6 @@ :global Grep; :global LogPrint; :global ParseKeyValueStore; - :global RequiredRouterOS; :global ScriptFromTerminal; :global ScriptLock; :global VersionToNum; @@ -100,8 +99,7 @@ :local DoDowngrade false; :if ($NumInstalled > $NumLatest) do={ - :if ([ $RequiredRouterOS $ScriptName "7.17beta2" false ] = true && \ - ([ /system/device-mode/get ]->"downgrade") != true) do={ + :if (([ /system/device-mode/get ]->"downgrade") = false) do={ $LogPrint error $ScriptName \ ("The device mode has locked downgrades! You will need physical access!"); :error false; From 7229c756af86df3a670ca79138e6e35342951461 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 22 Oct 2024 23:19:16 +0200 Subject: [PATCH 169/893] fw-addr-lists: spamhaus.org requires 'ISRG Root X1' now --- certs/Makefile | 2 +- global-config.rsc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/certs/Makefile b/certs/Makefile index 2e6ac9d..09e7a20 100644 --- a/certs/Makefile +++ b/certs/Makefile @@ -21,7 +21,7 @@ DOMAINS = \ sslbl.abuse.ch/GlobalSign \ upgrade.mikrotik.com/ISRG-Root-X1 \ www.dshield.org/ISRG-Root-X1 \ - www.spamhaus.org/GTS-Root-R4 + www.spamhaus.org/ISRG-Root-X1 .PHONY: $(DOMAINS) diff --git a/global-config.rsc b/global-config.rsc index 2ed67f3..c4e04b5 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -106,9 +106,9 @@ { url="https://lists.blocklist.de/lists/strongips.txt"; cert="Certum Trusted Network CA" }; # { url="https://www.spamhaus.org/drop/drop_v4.json"; -# cert="GTS Root R4" }; +# cert="ISRG Root X1" }; # { url="https://www.spamhaus.org/drop/drop_v6.json"; -# cert="GTS Root R4" }; +# cert="ISRG Root X1" }; }; # "mikrotik"={ # { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/mikrotik"; From d022c876514107bd345a17a0c01896947a83b45f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 22 Oct 2024 21:38:38 +0200 Subject: [PATCH 170/893] ipv6-update: ignore if address was acquired https://github.com/eworm-de/routeros-scripts/issues/85 --- ipv6-update.rsc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ipv6-update.rsc b/ipv6-update.rsc index 0577bdc..47bf3de 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -18,12 +18,18 @@ :global ParseKeyValueStore; :global ScriptLock; + :local NaAddress $"na-address"; :local PdPrefix $"pd-prefix"; :if ([ $ScriptLock $ScriptName ] = false) do={ :error false; } + :if ([ :typeof $NaAddress ] = "str") do={ + $LogPrint info $ScriptName ("An address (" . $NaAddress . ") was acquired, not a prefix. Ignoring."); + :error false; + } + :if ([ :typeof $PdPrefix ] = "nothing") do={ $LogPrint error $ScriptName ("This script is supposed to run from ipv6 dhcp-client."); :error false; From e803f8b3c0956e8b9f3992433d0a3caf9cb4c899 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 22 Oct 2024 22:35:14 +0200 Subject: [PATCH 171/893] ipv6-update: create a dynamic address-list entry only This should make sure that the script runs once after reboot, even if the prefix does not change. An existing static entry needs to be removed to make this work! https://github.com/eworm-de/routeros-scripts/issues/85 --- doc/ipv6-update.md | 12 ++++++++---- ipv6-update.rsc | 4 ++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/doc/ipv6-update.md b/doc/ipv6-update.md index 88600c5..42f0fe4 100644 --- a/doc/ipv6-update.md +++ b/doc/ipv6-update.md @@ -45,13 +45,17 @@ Installing [ppp-on-up](ppp-on-up.md) may solve this. Configuration ------------- -An address list entry is updated with current prefix and can be used in -firewall rules, comment has to be "`ipv6-pool-`" and actual pool name: +As an address-list entry is mandatory a dynamic one is created automatically. +It is updated with current prefix and can be used in firewall rules. + +Alternatively a static address-list entry can be used, where comment has to +be "`ipv6-pool-`" and actual pool name. Use what ever list is desired, and +create it with: /ipv6/firewall/address-list/add address=2003:cf:2f0f:de00::/56 comment=ipv6-pool-isp list=extern; -As this entry is mandatory it is created automatically if it does not exist, -with the comment also set for list. +If the dynamic entry exists already you need to remove it before creating +the static one.. Address list entries for specific interfaces can be updated as well. The interface needs to get its address from pool `isp` and the address list entry diff --git a/ipv6-update.rsc b/ipv6-update.rsc index 47bf3de..ccc0eb9 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -37,8 +37,8 @@ :local Pool [ /ipv6/pool/get [ find where prefix=$PdPrefix ] name ]; :if ([ :len [ /ipv6/firewall/address-list/find where comment=("ipv6-pool-" . $Pool) ] ] = 0) do={ - /ipv6/firewall/address-list/add list=("ipv6-pool-" . $Pool) address=:: comment=("ipv6-pool-" . $Pool); - $LogPrint warning $ScriptName ("Added ipv6 address list entry for ipv6-pool-" . $Pool); + /ipv6/firewall/address-list/add list=("ipv6-pool-" . $Pool) address=:: comment=("ipv6-pool-" . $Pool) dynamic=yes; + $LogPrint warning $ScriptName ("Added dynamic ipv6 address list entry for ipv6-pool-" . $Pool); } :local AddrList [ /ipv6/firewall/address-list/find where comment=("ipv6-pool-" . $Pool) ]; :local OldPrefix [ /ipv6/firewall/address-list/get ($AddrList->0) address ]; From 3169270dbda239b860ee7b2989d2bfdf7b5b78c7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 28 Oct 2024 22:31:58 +0100 Subject: [PATCH 172/893] doc/mod/notification-matrix: better document certificate import --- doc/mod/notification-matrix.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/mod/notification-matrix.md b/doc/mod/notification-matrix.md index c96a719..dd46404 100644 --- a/doc/mod/notification-matrix.md +++ b/doc/mod/notification-matrix.md @@ -46,6 +46,13 @@ The Matrix server is connected via encrypted https, and certificate verification is applied. So make sure you have the certificate chain for your server in device's certificate store. +The example below is for `matrix.org`, which uses a trust chain from *Google +Trust Services*. Run this to import the required certificate: + + $CertificateAvailable "GTS Root R4"; + +Replace the CA certificate name with what ever is needed for your server. + ### From other device If you have setup your Matrix *notification account* before just reuse that. From a6584170c31dc9773840adbc1c7b9721544c764e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 28 Oct 2024 22:33:46 +0100 Subject: [PATCH 173/893] certs: check cert for matrix.org --- certs/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/certs/Makefile b/certs/Makefile index 09e7a20..9ce8dd4 100644 --- a/certs/Makefile +++ b/certs/Makefile @@ -16,6 +16,7 @@ DOMAINS = \ ipv4.tunnelbroker.net/Starfield-Root-Certificate-Authority-G2 \ ipv6.showipv6.de/ISRG-Root-X1 \ lists.blocklist.de/Certum-Trusted-Network-CA \ + matrix.org/GTS-Root-R4 \ mkcert.org/ISRG-Root-X1 \ ntfy.sh/ISRG-Root-X1 \ sslbl.abuse.ch/GlobalSign \ From 3506f710710332186caecfcd64d9a6d8f57f3180 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 30 Oct 2024 21:52:50 +0100 Subject: [PATCH 174/893] global-functions: $CertificateAvailable: fail without CommonName --- global-functions.rsc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index e5471dd..47a69c4 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -107,6 +107,11 @@ "is configured to download certificate CRLs to system!"); } + :if ([ :len $CommonName ] = 0) do={ + $LogPrint warning $0 ("No CommonName given!"); + :return false; + } + :if ([ :len [ /certificate/find where common-name=$CommonName ] ] = 0) do={ $LogPrint info $0 ("Certificate with CommonName '" . $CommonName . "' not available."); :if ([ $CertificateDownload $CommonName ] = false) do={ From 3c0852d6b829d8babc3a57002991e35f7bd31d0a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 30 Oct 2024 17:46:03 +0100 Subject: [PATCH 175/893] introduce CERTIFICATES, guide to find root certificate --- CERTIFICATES.d/01-dialog-A.avif | Bin 0 -> 29972 bytes CERTIFICATES.d/02-dialog-B.avif | Bin 0 -> 28821 bytes CERTIFICATES.d/03-window.avif | Bin 0 -> 48111 bytes CERTIFICATES.d/04-certificate.avif | Bin 0 -> 22386 bytes CERTIFICATES.md | 74 +++++++++++++++++++++++++++++ 5 files changed, 74 insertions(+) create mode 100644 CERTIFICATES.d/01-dialog-A.avif create mode 100644 CERTIFICATES.d/02-dialog-B.avif create mode 100644 CERTIFICATES.d/03-window.avif create mode 100644 CERTIFICATES.d/04-certificate.avif create mode 100644 CERTIFICATES.md diff --git a/CERTIFICATES.d/01-dialog-A.avif b/CERTIFICATES.d/01-dialog-A.avif new file mode 100644 index 0000000000000000000000000000000000000000..2fc3c9bdd9e2e846b90814f7d1cb6fc130c498f4 GIT binary patch literal 29972 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 X(5VeJS+20d`+(Mw9f)=(A|Jb;MOUpz literal 0 HcmV?d00001 diff --git a/CERTIFICATES.d/02-dialog-B.avif b/CERTIFICATES.d/02-dialog-B.avif new file mode 100644 index 0000000000000000000000000000000000000000..5e408abedc1a94d8d0988382312d3f34715aef9e GIT binary patch literal 28821 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 literal 0 HcmV?d00001 diff --git a/CERTIFICATES.d/03-window.avif b/CERTIFICATES.d/03-window.avif new file mode 100644 index 0000000000000000000000000000000000000000..96039a3bbab865a20c017636205ab56dc3c0f099 GIT binary patch literal 48111 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 BgM9!1 literal 0 HcmV?d00001 diff --git a/CERTIFICATES.d/04-certificate.avif b/CERTIFICATES.d/04-certificate.avif new file mode 100644 index 0000000000000000000000000000000000000000..e6663146d6f4ec8f70a068751ed96f7f9b90ad75 GIT binary patch literal 22386 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

RouterOS-Scripts Logo Color Changer

+

Logo Color Changer

You want the logo for your own notifications? But you joined the Telegram Group and want @@ -36,5 +34,4 @@ for other browsers may differ.)

Set a profile photo for your Telegram bot.

- - + diff --git a/contrib/notification.html b/contrib/notification.html index b7d6764..472ce48 100644 --- a/contrib/notification.html +++ b/contrib/notification.html @@ -1,14 +1,12 @@ - - - - -RouterOS-Scripts Notification Generator + + +RouterOS Scripts :: Notification Generator + - - + -

RouterOS-Scripts Notification Generator

+

Notification Generator

@@ -31,5 +29,4 @@

Then right-click, click "Take Screenshot" and finally select the notification and download it.

- - + diff --git a/doc/mod/notification-telegram.md b/doc/mod/notification-telegram.md index 804104f..7d5092d 100644 --- a/doc/mod/notification-telegram.md +++ b/doc/mod/notification-telegram.md @@ -107,7 +107,7 @@ chat with [BotFather ↗️](https://t.me/BotFather) and set it there. ![set profile photo](notification-telegram.d/setuserpic.avif) Have a look at my -[RouterOS-Scripts Logo Color Changer](https://git.eworm.de/cgit/routeros-scripts/plain/contrib/logo-color.html) +[Logo Color Changer](https://git.eworm.de/cgit/routeros-scripts/plain/contrib/logo-color.html) to create a colored version of this scripts' logo. See also From 8faf4ab7cf9ad6313b1fe7903b9325c17827cfdc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Oct 2025 15:35:14 +0100 Subject: [PATCH 793/893] contrib/{logo-color,notification}: add navigation structure --- contrib/logo-color.html | 6 ++++++ contrib/notification.html | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/contrib/logo-color.html b/contrib/logo-color.html index eb00492..8ee1ba9 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -8,6 +8,8 @@

Logo Color Changer

+

⬅️ Go back to main README

+

You want the logo for your own notifications? But you joined the Telegram Group and want something that differentiates? Color it!

@@ -34,4 +36,8 @@ for other browsers may differ.)

Set a profile photo for your Telegram bot.

+
+ +

⬅️ Go back to main README
+⬆️ Go back to top

diff --git a/contrib/notification.html b/contrib/notification.html index 472ce48..3bc86fc 100644 --- a/contrib/notification.html +++ b/contrib/notification.html @@ -8,6 +8,8 @@

Notification Generator

+

⬅️ Go back to main README

+
@@ -29,4 +31,8 @@

Then right-click, click "Take Screenshot" and finally select the notification and download it.

+
+ +

⬅️ Go back to main README
+⬆️ Go back to top

From eb89f8359b4e8c387144330a435841430e85feab Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Oct 2025 16:06:42 +0100 Subject: [PATCH 794/893] contrib/notification: update date format --- contrib/notification.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/notification.html b/contrib/notification.html index 3bc86fc..c86450c 100644 --- a/contrib/notification.html +++ b/contrib/notification.html @@ -16,7 +16,7 @@

[MikroTik] ℹ️ Subject

Message
-

⏰ This message was queued since oct/18/2022 18:30:48 and may be obsolete.

+

⏰ This message was queued since 2025-10-29 16:06:18 and may be obsolete.

✂️ The message was too long and has been truncated, cut off 13%!

@@ -25,7 +25,7 @@

Subject:

Message:

Show link:

-

Queued since

+

Queued since

Cut-off with percent

Then right-click, click "Take Screenshot" and finally select the From 8d68f24095c8aeb0b14720d048a8493c996cf4e6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Oct 2025 16:11:23 +0100 Subject: [PATCH 795/893] contrib/notification: format the values italic --- contrib/notification.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/notification.html b/contrib/notification.html index c86450c..a4d0486 100644 --- a/contrib/notification.html +++ b/contrib/notification.html @@ -16,8 +16,8 @@

[MikroTik] ℹ️ Subject

Message
-

⏰ This message was queued since 2025-10-29 16:06:18 and may be obsolete.

-

✂️ The message was too long and has been truncated, cut off 13%!

+

⏰ This message was queued since 2025-10-29 16:06:18 and may be obsolete.

+

✂️ The message was too long and has been truncated, cut off 13%!

From 5986894749a5de9c589f2269ab9ecac174f304f7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 16:25:01 +0100 Subject: [PATCH 796/893] doc/mod/notification-telegram: use relative reference in link This may break, depending on site. --- doc/mod/notification-telegram.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/mod/notification-telegram.md b/doc/mod/notification-telegram.md index 7d5092d..bdf1331 100644 --- a/doc/mod/notification-telegram.md +++ b/doc/mod/notification-telegram.md @@ -106,8 +106,7 @@ chat with [BotFather ↗️](https://t.me/BotFather) and set it there. ![set profile photo](notification-telegram.d/setuserpic.avif) -Have a look at my -[Logo Color Changer](https://git.eworm.de/cgit/routeros-scripts/plain/contrib/logo-color.html) +Have a look at my [Logo Color Changer](../../contrib/logo-color.html) to create a colored version of this scripts' logo. See also From 036c6ef68266d599747dfe59eab5f96c5fa4a388 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 16:27:59 +0100 Subject: [PATCH 797/893] contrib/logo-color: use relative reference in link ... without extra path elements. This may break, depending on site. --- contrib/logo-color.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/logo-color.html b/contrib/logo-color.html index 8ee1ba9..9962e99 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -33,7 +33,7 @@ logo and download it.

for other browsers may differ.)

See how to -Set +Set a profile photo for your Telegram bot.


From 148d40e18d5bd7f2309b06428c2ca85a0f5cb793 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 16:26:05 +0100 Subject: [PATCH 798/893] contrib: introduce Makefile... ... and update references in links. --- contrib/Makefile | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 contrib/Makefile diff --git a/contrib/Makefile b/contrib/Makefile new file mode 100644 index 0000000..aae3178 --- /dev/null +++ b/contrib/Makefile @@ -0,0 +1,10 @@ +# Makefile + +HTML := $(wildcard *.html) + +.PHONY: all docs + +all: docs + +docs: $(HTML) + sed -i '/href=/s|\.md|\.html|' $(HTML) From 607a608502c4f38a51c4679d6162c15a52332bab Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 23:40:27 +0100 Subject: [PATCH 799/893] doc/mod/notification-telegram: hint on possibly broken link --- doc/mod/notification-telegram.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/mod/notification-telegram.md b/doc/mod/notification-telegram.md index bdf1331..f464ff0 100644 --- a/doc/mod/notification-telegram.md +++ b/doc/mod/notification-telegram.md @@ -109,6 +109,10 @@ chat with [BotFather ↗️](https://t.me/BotFather) and set it there. Have a look at my [Logo Color Changer](../../contrib/logo-color.html) to create a colored version of this scripts' logo. +> 💡️ **Hint**: The above link may be broken on code hosting sites. +> Use [Logo Color Changer](https://rsc.eworm.de/main/contrib/logo-color.html) +> instead. + See also -------- From 1ce3160933ee70a3cc6264139247f6b668ae0b3b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 23:59:08 +0100 Subject: [PATCH 800/893] contrib/html: hide the hint on broken link --- contrib/html.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contrib/html.sh b/contrib/html.sh index b1d2511..09064ba 100755 --- a/contrib/html.sh +++ b/contrib/html.sh @@ -13,6 +13,7 @@ sed \ markdown -f toc,idanchor "${1}" | sed \ -e 's/href="\([-_\./[:alnum:]]*\)\.md\(#[-[:alnum:]]*\)\?"/href="\1.html\2"/g' \ -e '/| id="\L\1">|' \ - -e '/' From cbb0aba1b1ea8b40cec99643de2cfb6f6a933bc9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 23:51:05 +0100 Subject: [PATCH 801/893] contrib/logo-color: hint on possibly broken site --- contrib/logo-color.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contrib/logo-color.html b/contrib/logo-color.html index 9962e99..f05f4bb 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -10,6 +10,11 @@

⬅️ Go back to main README

+

💡️ Hint: This site or links +on it may be broken on code hosting sites. Use +Logo Color Changer +instead.

+

You want the logo for your own notifications? But you joined the Telegram Group and want something that differentiates? Color it!

From b16c2f5b90170a81c30f5b98666264b020e3ac7f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 23:52:58 +0100 Subject: [PATCH 802/893] contrib/notification: hint on possibly broken site --- contrib/notification.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contrib/notification.html b/contrib/notification.html index a4d0486..3ff8754 100644 --- a/contrib/notification.html +++ b/contrib/notification.html @@ -10,6 +10,11 @@

⬅️ Go back to main README

+

💡️ Hint: This site or links +on it may be broken on code hosting sites. Use +Notification Generator +instead.

+
From 165d7c60d4d156484cc106b4271ade78ab97a026 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 22:08:11 +0100 Subject: [PATCH 803/893] contrib/html: add a head with eworm, QR code and caption --- contrib/html.sh | 2 ++ contrib/html.sh.d/head.html | 9 +++++++++ general/eworm-meadow.avif | Bin 0 -> 3922 bytes general/style.css | 12 ++++++++++++ 4 files changed, 23 insertions(+) create mode 100644 general/eworm-meadow.avif diff --git a/contrib/html.sh b/contrib/html.sh index 09064ba..0b89724 100755 --- a/contrib/html.sh +++ b/contrib/html.sh @@ -8,6 +8,8 @@ sed \ -e "s|__TITLE__|$(head -n1 "${1}")|" \ -e "s|__STYLE__|$(realpath --relative-to="${RELTO}" general/style.css)|" \ -e "s|__LOGO__|$(realpath --relative-to="${RELTO}" logo.png)|" \ + -e "s|__EWORM__|$(realpath --relative-to="${RELTO}" general/eworm-meadow.avif)|" \ + -e "s|__QR_CODE__|$(realpath --relative-to="${RELTO}" general/qr-code.png)|" \ < "${0}.d/head.html" markdown -f toc,idanchor "${1}" | sed \ diff --git a/contrib/html.sh.d/head.html b/contrib/html.sh.d/head.html index 0ce3ff7..da54157 100644 --- a/contrib/html.sh.d/head.html +++ b/contrib/html.sh.d/head.html @@ -4,3 +4,12 @@ + + + + + +
eworm on meadowQR code: rsc.eworm.deRouterOS Scripts
+ a collection of scripts for MikroTik RouterOS
+
+ diff --git a/general/eworm-meadow.avif b/general/eworm-meadow.avif new file mode 100644 index 0000000000000000000000000000000000000000..f592d59b86c9d178954a09bfb30dd7b6268a3a0b GIT binary patch literal 3922 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 Ol=-JRBU@RH*#86W_XlVI literal 0 HcmV?d00001 diff --git a/general/style.css b/general/style.css index ad25c7c..018ccc4 100644 --- a/general/style.css +++ b/general/style.css @@ -68,6 +68,18 @@ pre code { span.link { color: #863600; } +td.head { + line-height: 1.2; + padding: 0 2em; +} +td.head .top { + font-size: 250%; + font-weight: bold; +} +td.head .bottom { + font-size: 125%; + color: #555; +} @media only screen and (orientation: landscape) { body { margin-left: 10vw; From 7b45bb5b46a9cc63d3f32f45610ba010c485b304 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 23:56:16 +0100 Subject: [PATCH 804/893] contrib/Makefile: hide the hint on broken site --- contrib/Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/contrib/Makefile b/contrib/Makefile index aae3178..cdb9f4c 100644 --- a/contrib/Makefile +++ b/contrib/Makefile @@ -7,4 +7,7 @@ HTML := $(wildcard *.html) all: docs docs: $(HTML) - sed -i '/href=/s|\.md|\.html|' $(HTML) + sed -i \ + -e '/href=/s|\.md|\.html|' \ + -e '/blockquote/s|/\*! display \*/|display: none;|' \ + $(HTML) From 75692abf4794b6950cb42288dbf2e104a2e797fe Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 23:26:37 +0100 Subject: [PATCH 805/893] contrib/logo-color: add a head with eworm, QR code and caption --- contrib/logo-color.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/contrib/logo-color.html b/contrib/logo-color.html index f05f4bb..3aca324 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -6,6 +6,14 @@ + + + + +
eworm on meadowQR code: rsc.eworm.deRouterOS Scripts
+ a collection of scripts for MikroTik RouterOS
+
+

Logo Color Changer

⬅️ Go back to main README

From b4e6cc5b590ede01c67726cce5bef12e6aca9420 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 23:27:09 +0100 Subject: [PATCH 806/893] contrib/notification: add a head with eworm, QR code and caption --- contrib/notification.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/contrib/notification.html b/contrib/notification.html index 3ff8754..902d328 100644 --- a/contrib/notification.html +++ b/contrib/notification.html @@ -6,6 +6,14 @@ + + + + +
eworm on meadowQR code: rsc.eworm.deRouterOS Scripts
+ a collection of scripts for MikroTik RouterOS
+
+

Notification Generator

⬅️ Go back to main README

From d1fa3facfdbf09ff09fc572b79dd8099e069415a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 6 Nov 2025 17:32:37 +0100 Subject: [PATCH 807/893] Makefile: clean up and add phony targets --- Makefile | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index b799535..f841ca2 100644 --- a/Makefile +++ b/Makefile @@ -2,18 +2,28 @@ # template scripts -> final scripts # markdown files -> html files -CAPSMAN = $(wildcard *.capsman.rsc) -LOCAL = $(wildcard *.local.rsc) -WIFI = $(wildcard *.wifi.rsc) +ALL_RSC := $(wildcard *.rsc */*.rsc) +GEN_RSC := $(wildcard *.capsman.rsc *.local.rsc *.wifi.rsc) -MARKDOWN = $(wildcard *.md doc/*.md doc/mod/*.md) -HTML = $(MARKDOWN:.md=.html) +MARKDOWN := $(wildcard *.md doc/*.md doc/mod/*.md) +HTML := $(MARKDOWN:.md=.html) -all: $(CAPSMAN) $(LOCAL) $(WIFI) $(HTML) checksums.json +.PHONY: all checksums docs rsc clean + +all: checksums docs rsc + +checksums: checksums.json + +checksums.json: contrib/checksums.sh $(ALL_RSC) + contrib/checksums.sh > $@ + +docs: $(HTML) %.html: %.md general/style.css contrib/html.sh contrib/html.sh.d/head.html contrib/html.sh $< > $@ +rsc: $(GEN_RSC) + %.capsman.rsc: %.template.rsc Makefile sed -e '/\/interface\/wifi\//d' -e '/\/interface\/wireless\//d' -e 's|%TEMPL%|.capsman|' \ -e '/^# NOT \/caps-man\/ #$$/,/^# NOT \/caps-man\/ #$$/d' \ @@ -32,8 +42,5 @@ all: $(CAPSMAN) $(LOCAL) $(WIFI) $(HTML) checksums.json -e '/^# !!/,/^# !!/c # !! Do not edit this file, it is generated from template!' \ < $< > $@ -checksums.json: contrib/checksums.sh *.rsc */*.rsc - contrib/checksums.sh > $@ - clean: rm -f $(HTML) checksums.json From edd51ca71905851f4a202ac3129391a8c0615047 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Nov 2025 17:22:30 +0100 Subject: [PATCH 808/893] contrib/html: add a footer with date and version info --- Makefile | 6 +++++- contrib/html.sh | 5 ++++- contrib/html.sh.d/foot.html | 4 ++++ general/style.css | 4 ++++ 4 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 contrib/html.sh.d/foot.html diff --git a/Makefile b/Makefile index f841ca2..ecb25bc 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,10 @@ GEN_RSC := $(wildcard *.capsman.rsc *.local.rsc *.wifi.rsc) MARKDOWN := $(wildcard *.md doc/*.md doc/mod/*.md) HTML := $(MARKDOWN:.md=.html) +DATE ?= $(shell date --rfc-email) +VERSION ?= $(shell git symbolic-ref --short HEAD 2>/dev/null)/$(shell git rev-list --count HEAD 2>/dev/null)/$(shell git rev-parse --short=8 HEAD 2>/dev/null) +export DATE VERSION + .PHONY: all checksums docs rsc clean all: checksums docs rsc @@ -19,7 +23,7 @@ checksums.json: contrib/checksums.sh $(ALL_RSC) docs: $(HTML) -%.html: %.md general/style.css contrib/html.sh contrib/html.sh.d/head.html +%.html: %.md general/style.css contrib/html.sh contrib/html.sh.d/head.html contrib/html.sh.d/foot.html contrib/html.sh $< > $@ rsc: $(GEN_RSC) diff --git a/contrib/html.sh b/contrib/html.sh index 0b89724..2fe9ef7 100755 --- a/contrib/html.sh +++ b/contrib/html.sh @@ -18,4 +18,7 @@ markdown -f toc,idanchor "${1}" | sed \ -e '/' +sed \ + -e "s|__DATE__|${DATE:-$(date --rfc-email)}|" \ + -e "s|__VERSION__|${VERSION:-unknown}|" \ + < "${0}.d/foot.html" diff --git a/contrib/html.sh.d/foot.html b/contrib/html.sh.d/foot.html new file mode 100644 index 0000000..106c2bd --- /dev/null +++ b/contrib/html.sh.d/foot.html @@ -0,0 +1,4 @@ + +

RouterOS Scripts documentation generated on __DATE__ for __VERSION__

+ + diff --git a/general/style.css b/general/style.css index 018ccc4..73b0921 100644 --- a/general/style.css +++ b/general/style.css @@ -43,6 +43,10 @@ img.logo { float: left; border-radius: 50%; } +p.foot { + color: #777; + text-align: center; +} p.heading { margin: 0px; font-weight: bold; From 82587ec589b7c9f6a1639d05f002ad18c8540192 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 11:21:51 +0100 Subject: [PATCH 809/893] contrib/html: add copyright notice in footer --- contrib/html.sh.d/foot.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contrib/html.sh.d/foot.html b/contrib/html.sh.d/foot.html index 106c2bd..d304152 100644 --- a/contrib/html.sh.d/foot.html +++ b/contrib/html.sh.d/foot.html @@ -1,4 +1,5 @@ -

RouterOS Scripts documentation generated on __DATE__ for __VERSION__

+

RouterOS Scripts documentation generated on __DATE__ for __VERSION__
+Copyright © 2013-2025 Christian Hesse <mail@eworm.de>

From f3afee3e4b29068847d1713fe6c1689620ce4d8d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Nov 2025 23:03:58 +0100 Subject: [PATCH 810/893] fw-addr-lists.d/{allow,block}: use short url rsc.eworm.de --- fw-addr-lists.d/allow | 2 +- fw-addr-lists.d/block | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fw-addr-lists.d/allow b/fw-addr-lists.d/allow index 8b59ed7..f0239cd 100644 --- a/fw-addr-lists.d/allow +++ b/fw-addr-lists.d/allow @@ -1,3 +1,3 @@ # an ip address list for use with fw-addr-lists script -# https://git.eworm.de/cgit/routeros-scripts/about/doc/fw-addr-lists.md +# https://rsc.eworm.de/doc/fw-addr-lists.md git.eworm.de diff --git a/fw-addr-lists.d/block b/fw-addr-lists.d/block index 5e9fef2..86a6c62 100644 --- a/fw-addr-lists.d/block +++ b/fw-addr-lists.d/block @@ -1,5 +1,5 @@ # an ip address list for use with fw-addr-lists script -# https://git.eworm.de/cgit/routeros-scripts/about/doc/fw-addr-lists.md +# https://rsc.eworm.de/doc/fw-addr-lists.md # example.net 93.184.216.34 From d12be8f1ac000af5126c223f22b96b56916fc682 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Nov 2025 23:05:56 +0100 Subject: [PATCH 811/893] fw-addr-lists.d/allow: use rsc.eworm.de in the list --- fw-addr-lists.d/allow | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fw-addr-lists.d/allow b/fw-addr-lists.d/allow index f0239cd..8c4ca3c 100644 --- a/fw-addr-lists.d/allow +++ b/fw-addr-lists.d/allow @@ -1,3 +1,3 @@ # an ip address list for use with fw-addr-lists script # https://rsc.eworm.de/doc/fw-addr-lists.md -git.eworm.de +rsc.eworm.de From 4935c81bd9fe73dba6f55d2acdc8ad23c19d8875 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Nov 2025 18:18:36 +0100 Subject: [PATCH 812/893] contrib/template-capsman: split off from Makefile --- Makefile | 7 ++----- contrib/template-capsman.sh | 11 +++++++++++ 2 files changed, 13 insertions(+), 5 deletions(-) create mode 100755 contrib/template-capsman.sh diff --git a/Makefile b/Makefile index ecb25bc..14aab08 100644 --- a/Makefile +++ b/Makefile @@ -28,11 +28,8 @@ docs: $(HTML) rsc: $(GEN_RSC) -%.capsman.rsc: %.template.rsc Makefile - sed -e '/\/interface\/wifi\//d' -e '/\/interface\/wireless\//d' -e 's|%TEMPL%|.capsman|' \ - -e '/^# NOT \/caps-man\/ #$$/,/^# NOT \/caps-man\/ #$$/d' \ - -e '/^# !!/,/^# !!/c # !! Do not edit this file, it is generated from template!' \ - < $< > $@ +%.capsman.rsc: %.template.rsc contrib/template-capsman.sh + contrib/template-capsman.sh $< > $@ %.local.rsc: %.template.rsc Makefile sed -e '/\/caps-man\//d' -e '/\/interface\/wifi\//d' -e 's|%TEMPL%|.local|' \ diff --git a/contrib/template-capsman.sh b/contrib/template-capsman.sh new file mode 100755 index 0000000..5771b53 --- /dev/null +++ b/contrib/template-capsman.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +set -e + +sed \ + -e '/\/interface\/wifi\//d' \ + -e '/\/interface\/wireless\//d' \ + -e 's|%TEMPL%|.capsman|' \ + -e '/^# NOT \/caps-man\/ #$/,/^# NOT \/caps-man\/ #$/d' \ + -e '/^# !!/,/^# !!/c # !! Do not edit this file, it is generated from template!' \ + < "${1}" From c6451c87f1cfb3f707822fb481f09b869f4ba84f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 22:53:31 +0100 Subject: [PATCH 813/893] general/style: make the blockquote darker --- general/style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/general/style.css b/general/style.css index 73b0921..ea9b111 100644 --- a/general/style.css +++ b/general/style.css @@ -18,7 +18,7 @@ a:hover { blockquote { border-left: 4px solid #ccc; padding: 0 10px; - color: #777; + color: #555; } code { margin: 0 2px; From 05f08381190c560aca16895197910be08a53db23 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Nov 2025 00:23:02 +0100 Subject: [PATCH 814/893] README: install from rsc.eworm.de --- README.d/01-download-certs.avif | Bin 4890 -> 1869 bytes README.d/04-import-scripts.avif | Bin 3782 -> 3932 bytes README.d/07-edit-global-config-overlay.avif | Bin 5103 -> 5161 bytes README.md | 4 ++-- global-config-overlay.rsc | 2 +- 5 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.d/01-download-certs.avif b/README.d/01-download-certs.avif index d41ca0595fa2f6b2ca1eaf3a94e34244d46e017a..0532ec3addc1b174c13c5edd6acc1294dbf36666 100644 GIT binary patch delta 1661 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 diff --git a/README.d/04-import-scripts.avif b/README.d/04-import-scripts.avif index 53439e4e5f832c7cd7e8a424f1b70e471ac8e31a..a5cfa7bf46733ae385e5cb9c8cc55364724c0b2d 100644 GIT binary patch delta 3727 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 diff --git a/README.d/07-edit-global-config-overlay.avif b/README.d/07-edit-global-config-overlay.avif index f87fda88e60281d3b0c4a2cb301025832c2bf8de..5b9c0a6952a9a5a411ebb70e607a26d3f19bf942 100644 GIT binary patch delta 4703 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 delta 4645 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 b-ISb_DgD!KOtbL*N&uA}Yt=~bR1)#28+8JP diff --git a/README.md b/README.md index 59c695e..f33c2a2 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ If you intend to download the scripts from a different location (for example from github.com) install the corresponding certificate chain. - /tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/ISRG-Root-X2.pem" dst-path="isrg-root-x2.pem"; + /tool/fetch "https://rsc.eworm.de/main/certs/ISRG-Root-X2.pem" dst-path="isrg-root-x2.pem"; ![screenshot: download certs](README.d/01-download-certs.avif) @@ -125,7 +125,7 @@ date and time is set correctly! Now let's download the main scripts and add them in configuration on the fly. - :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ /system/script/add name=$Script owner=$Script source=([ /tool/fetch check-certificate=yes-without-crl ("https://git.eworm.de/cgit/routeros-scripts/plain/" . $Script . ".rsc") output=user as-value]->"data"); }; + :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ /system/script/add name=$Script owner=$Script source=([ /tool/fetch check-certificate=yes-without-crl ("https://rsc.eworm.de/main/" . $Script . ".rsc") output=user as-value]->"data"); }; ![screenshot: import scripts](README.d/04-import-scripts.avif) diff --git a/global-config-overlay.rsc b/global-config-overlay.rsc index 9afaceb..88bb4d9 100644 --- a/global-config-overlay.rsc +++ b/global-config-overlay.rsc @@ -6,7 +6,7 @@ # https://rsc.eworm.de/#editing-configuration # Copy relevant configuration from global-config, paste and modify it here. -# https://rsc.eworm.de/global-config.rsc +# https://rsc.eworm.de/main/global-config.rsc # End of global-config-overlay From 54612e333fe72a7fb329f11cf543e87cec80479e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Nov 2025 18:21:39 +0100 Subject: [PATCH 815/893] contrib/template-local: split off from Makefile --- Makefile | 7 ++----- contrib/template-local.sh | 11 +++++++++++ 2 files changed, 13 insertions(+), 5 deletions(-) create mode 100755 contrib/template-local.sh diff --git a/Makefile b/Makefile index 14aab08..b90002d 100644 --- a/Makefile +++ b/Makefile @@ -31,11 +31,8 @@ rsc: $(GEN_RSC) %.capsman.rsc: %.template.rsc contrib/template-capsman.sh contrib/template-capsman.sh $< > $@ -%.local.rsc: %.template.rsc Makefile - sed -e '/\/caps-man\//d' -e '/\/interface\/wifi\//d' -e 's|%TEMPL%|.local|' \ - -e '/^# NOT \/interface\/wireless\/ #$$/,/^# NOT \/interface\/wireless\/ #$$/d' \ - -e '/^# !!/,/^# !!/c # !! Do not edit this file, it is generated from template!' \ - < $< > $@ +%.local.rsc: %.template.rsc contrib/template-local.sh + contrib/template-local.sh $< > $@ %.wifi.rsc: %.template.rsc Makefile sed -e '/\/caps-man\//d' -e '/\/interface\/wireless\//d' -e 's|%TEMPL%|.wifi|' \ diff --git a/contrib/template-local.sh b/contrib/template-local.sh new file mode 100755 index 0000000..bc5b327 --- /dev/null +++ b/contrib/template-local.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +set -e + +sed \ + -e '/\/caps-man\//d' \ + -e '/\/interface\/wifi\//d' \ + -e 's|%TEMPL%|.local|' \ + -e '/^# NOT \/interface\/wireless\/ #$/,/^# NOT \/interface\/wireless\/ #$/d' \ + -e '/^# !!/,/^# !!/c # !! Do not edit this file, it is generated from template!' \ + < "${1}" From 0b7528db99cbb6aa943ddc83498ced13bb0dc013 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 17:07:01 +0100 Subject: [PATCH 816/893] contrib/logo-color: place screenshots below each other... ... not side by side. --- contrib/logo-color.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contrib/logo-color.html b/contrib/logo-color.html index 3aca324..2c4cef6 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -37,9 +37,9 @@ something that differentiates? Color it!

Then right-click, click "Take Screenshot" and finally select the logo and download it.

-

Screenshot Browser 01 -Screenshot Browser 02 -Screenshot Browser 03

+

Screenshot Browser 01

+

Screenshot Browser 02

+

Screenshot Browser 03

(This example is with Firefox. The workflow From af5f01a9738ec449d4cb28b1f5718c456f1c9a10 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Nov 2025 00:23:37 +0100 Subject: [PATCH 817/893] INITIAL-COMMANDS: install from rsc.eworm.de --- INITIAL-COMMANDS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 6e70b66..787c11e 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -17,7 +17,7 @@ Initial commands Run the complete base installation: { - :local BaseUrl "https://git.eworm.de/cgit/routeros-scripts/plain/"; + :local BaseUrl "https://rsc.eworm.de/main/"; :local CertCommonName "ISRG Root X2"; :local CertFileName "ISRG-Root-X2.pem"; :local CertFingerprint "69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470"; From aeca778284ede7b0c1cc3e64c13f93d502a06b9c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Nov 2025 18:22:35 +0100 Subject: [PATCH 818/893] contrib/template-wifi: split off from Makefile --- Makefile | 7 ++----- contrib/template-wifi.sh | 11 +++++++++++ 2 files changed, 13 insertions(+), 5 deletions(-) create mode 100755 contrib/template-wifi.sh diff --git a/Makefile b/Makefile index b90002d..fa4cdcb 100644 --- a/Makefile +++ b/Makefile @@ -34,11 +34,8 @@ rsc: $(GEN_RSC) %.local.rsc: %.template.rsc contrib/template-local.sh contrib/template-local.sh $< > $@ -%.wifi.rsc: %.template.rsc Makefile - sed -e '/\/caps-man\//d' -e '/\/interface\/wireless\//d' -e 's|%TEMPL%|.wifi|' \ - -e '/^# NOT \/interface\/wifi\/ #$$/,/^# NOT \/interface\/wifi\/ #$$/d' \ - -e '/^# !!/,/^# !!/c # !! Do not edit this file, it is generated from template!' \ - < $< > $@ +%.wifi.rsc: %.template.rsc contrib/template-wifi.sh + contrib/template-wifi.sh $< > $@ clean: rm -f $(HTML) checksums.json diff --git a/contrib/template-wifi.sh b/contrib/template-wifi.sh new file mode 100755 index 0000000..5e297d9 --- /dev/null +++ b/contrib/template-wifi.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +set -e + +sed \ + -e '/\/caps-man\//d' \ + -e '/\/interface\/wireless\//d' \ + -e 's|%TEMPL%|.wifi|' \ + -e '/^# NOT \/interface\/wifi\/ #$/,/^# NOT \/interface\/wifi\/ #$/d' \ + -e '/^# !!/,/^# !!/c # !! Do not edit this file, it is generated from template!' \ + < "${1}" From ce37544baeb55390e65eceee1c6571e4cea26b41 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 13 Nov 2025 12:18:38 +0100 Subject: [PATCH 819/893] contrib/logo-color: drop width & height properties for images --- contrib/logo-color.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contrib/logo-color.html b/contrib/logo-color.html index 2c4cef6..5516964 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -37,9 +37,9 @@ something that differentiates? Color it!

Then right-click, click "Take Screenshot" and finally select the logo and download it.

-

Screenshot Browser 01

-

Screenshot Browser 02

-

Screenshot Browser 03

+

Screenshot Browser 01

+

Screenshot Browser 02

+

Screenshot Browser 03

(This example is with Firefox. The workflow From fa9c4be576d2de88bf5c95b713abb8b1e03f6480 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Nov 2025 00:25:18 +0100 Subject: [PATCH 820/893] doc/mod/scriptrunonce: get script from rsc.eworm.de --- doc/mod/scriptrunonce.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/mod/scriptrunonce.md b/doc/mod/scriptrunonce.md index 955d12e..1fbb697 100644 --- a/doc/mod/scriptrunonce.md +++ b/doc/mod/scriptrunonce.md @@ -48,7 +48,7 @@ Usage and invocation The function `$ScriptRunOnce` expects an URL (or name if `ScriptRunOnceBaseUrl` is given) pointing to a script as parameter. - $ScriptRunOnce https://git.eworm.de/cgit/routeros-scripts/plain/doc/mod/scriptrunonce.d/hello-world.rsc; + $ScriptRunOnce https://rsc.eworm.de/main/doc/mod/scriptrunonce.d/hello-world.rsc; ![ScriptRunOnce](scriptrunonce.d/scriptrunonce.avif) From 93eb218589cbaa0c567b0acbeb463d75543ed826 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 13 Nov 2025 15:30:30 +0100 Subject: [PATCH 821/893] global-functions: $FetchUserAgentStr: add commit info in user agent string --- global-functions.rsc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 48aaf7f..dccb8b6 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -539,10 +539,16 @@ :set FetchUserAgentStr do={ :local Caller [ :tostr $1 ]; + :global CommitId; + :global CommitInfo; + + :global IfThenElse; + :local Resource [ /system/resource/get ]; - :return ("User-Agent: Mikrotik/" . $Resource->"version" . " " . \ - $Resource->"architecture-name" . " " . $Caller . "/Fetch (https://rsc.eworm.de/)"); + :return ("User-Agent: Mikrotik/" . $Resource->"version" . " " . $Resource->"architecture-name" . \ + " " . $Caller . "/Fetch (https://rsc.eworm.de/" . [ $IfThenElse ($CommitId != "unknown") \ + ("; " . $CommitInfo . "/" . [ :pick $CommitId 0 8 ]) ] . ")"); } # check for existence of file, optionally with type From b285f2c5d291513f11e8a8f6fd26b316c2cfc8ae Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 13 Nov 2025 19:48:02 +0100 Subject: [PATCH 822/893] global-functions: add and fix global scheduler automatically... ... and also adjust README and INITIAL-COMMANDS. --- INITIAL-COMMANDS.md | 3 --- README.d/05-run-and-schedule-scripts.avif | Bin 1946 -> 0 bytes README.d/05-run-scripts.avif | Bin 0 -> 1801 bytes README.md | 6 +++--- global-functions.rsc | 9 +++++++++ 5 files changed, 12 insertions(+), 6 deletions(-) delete mode 100644 README.d/05-run-and-schedule-scripts.avif create mode 100644 README.d/05-run-scripts.avif diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 787c11e..374f716 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -45,9 +45,6 @@ Run the complete base installation: }; :put "Loading configuration and functions..."; /system/script { run global-config; run global-functions; }; - :put "Scheduling to load configuration and functions..."; - /system/scheduler/remove [ find where name="global-scripts" ]; - /system/scheduler/add name="global-scripts" start-time=startup on-event="/system/script { run global-config; run global-functions; }"; :if ([ :len [ /certificate/find where fingerprint=$CertFingerprint ] ] > 0) do={ :put "Renaming certificate by its common-name..."; :global CertificateNameByCN; diff --git a/README.d/05-run-and-schedule-scripts.avif b/README.d/05-run-and-schedule-scripts.avif deleted file mode 100644 index 37e1173f13037180a42ff7451fdd8bac7728211f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1946 zcmXv|2{_by7ao$eCd(wt7ly$|Vk}v&XplV_jHon&(ccX7Czq5k;o7$l*H)IS4IzY# zE&DbZMAqzkK1tM9zTrOi{GQ+Yp7XxvIp;ti5D9{hKZx@M2oPo*u?Ijvc>p+qg+5B3 zDeZW;`rwW{W+3mmki7p%ArKI7_W3tIViJJ=cMKE+d_0al7AA@TB(n2SWdMP&Fy9eE zSVSNY_F!g?1OU(D-N%jyvv6f)%10H>R|$nClgP&_-2u=WWa?%B=uBoZ47d-v9yLNB zClE|fWqw`|cmNzLoSd9YK85o|p(zqa3Piw}O!D@0COu$IKK;+?a{%apJ2sCGV`E_r zVPjqu;o*Yw;fHW@X-IqPjOn5E^Od(xnRl^Gh7=&M-=B?nuB=++KIK!*zj-nuZ`T(R zb?!7L)>2A*Bhmb_+KJlDU!)ArQ;6sdjl?MLjWVMlQ?a)qYD*%M@XzRZeHo!~sMR$? zJ^Dw5vuDC5lUYDoRuXx)rccKJmTg1(08KAPUSEG~yCNY%aVTl#`0jsWOEkPW%rJB) zqo#89{MixivjrR-$t3F53?h=Fibus;smz;&)c?Yxb|cV1+)hIat2lL6I(K>%%3skG zrTy|0sp9ovJo{?wT#?gs$553HT`9d7lOoI;F-_CT8zD(J*SNi(?7AqE&`+nzgu-4o z&PFh@GxA%Dv=x(tC+(?JFGk-u`$2OToZitfTWzar@^!{sVMs-kbWN-bUYSfUYzKLe z+;dTZv=H2Ko7(J3hJRL&+3V5y;y-z|2k!DHwxP7?RC4qNS^7T5NB=hy)pd`IHv|vI zf|FwFPe5+b3bLCTdieYTUi{UoZZxjd0Poj&;i%3EK19;2(Kie5|V8;|{^X8EPZmvedw-&?VkI`Ct*t{9KR_iOI$ zxBqBqc$sr5I8!S?Mr3NaY!1ifg6 z<%Xvf4MUyc&tH8edBz{^V@kA~r2GuDQKIQqb9ou+oY_n(nX~EDeAQ7gqkAH3YT1qL zohG=IK{+smMFwDO*Fq+w@5sAq`pp)Fw%+=4OvfhVtnB_0NFZM2CL*3~^R`$D#U|=O z8?8*{!B0`8DTKc!deUBVQ6OQPt%~$>nko| zpRYyyPc&ygdzG#vVPQANS1SZ<`Q?@$r8h-(TTzbOK}H;{n$vv80LxMSyZvyEpd?YVo!o2R{>Ex$%ym{+5B)H+JwG5EV;37#Iqu#1! zvdN9auvJfG`{v}9!@kT9keUB(S=AevjkkqK!$PDkz%gxdpkX~5^;h201&r4F_Btv~ z+YERyu*ep>)&sv<7h!=PZi*BX8b}?-#fXbEE4@uO|KJqt4$t06_zfEz2-ihyHEfqE z#~6erZ?>y^V{IF3ety=KG#MO?H}jUbLi9of?Nap;yBvpmoEXBX5FH1Y^_y$o;gnv7 zCCSe@(`mt17>*#klDGvQ5!2l)4f47Po466v!I5)sssh2fp$br%@k zYT^M~2tlx@E2gs-kEiz$7aQVqvrz|xh28Nhp(L_up&cWIL%(f7whMdd_n@u|^^bgA zM&boC>sdzHA+?yazT{)xr<1(7bA8}qP&uj^$%0A{ksq{gM{bak&9-{{^f?7_&VFc^>x)WdiIJ}K(QIFzv*=i78)ovVJ&{| zaziB_X8q}Gyc~~ltAl$01F`kyBbYoy$Qs!Vy3d|ZA JV`^E{{(m}8biDuo diff --git a/README.d/05-run-scripts.avif b/README.d/05-run-scripts.avif new file mode 100644 index 0000000000000000000000000000000000000000..e3b8b8b424f0502cc08fc7932742e97aa50ce7f5 GIT binary patch literal 1801 zcmXw02{hZ;7Y-t$mWq9-oz9?^A~Cha+Of2jv8$yLOZ#gQ(jX17WYDHn6=K?A>{^tm zMxs=Vt+m%yTQStw1{I2GX!$eYf9AgP?)TmAyXW0|&I5r!%3)D4I3xiG199URu|SwU z7C?qMS?ODGr8R756!O^PhRXF24F3NV1i}HqQUCG(@H7sH!k!d7+^h&-B7%=ATM&qc zdyX@RM*;-m=Ww|O0EC|mJ#pl?MJVraGq(pxIInLLfr&VobpycRaa{cpfD4Y`q9hQB z3q5WGf%w$93C6up96$t46afJNE(#+F`Zm8RA1fe<;0O#pJQzddzAOTQkhzi!fWsn> zJ#KIp1M~1EgSlHBVndKo;vhlDg|m3G33Y>2q08Oi>EtqX@8$CN;ytqxuaWA|m4u!p zLes+#NA#u4W$Epyxa`weqjc-B=lv7myTFQ>JS$~7x5 zd-Q3#-~IHVi7)bUi%6%`@PVBxdm-VOO2-AtiVP}gmzh>4Z}dXLR*pC=hIpACIeBe& zNLqtdtR~&}_%SYk-_t^AY4ZFd79**~jw+iQcMr=$|81=eEhNmL>BJ*!{Ow9S)-+t!cOQKXHpJ=_+Ap?|4~|gB=t%^<6P@S+yH6eg)?;&{3dp_1%}qG zd_OkrCF&R1n2~xl?VJp`rbU|Yj zh(5KVdcR&K^%3Su$yu#bPMoF+H3L{jT7vZs1|eg4MLVB|&Bv9psvXFWeGKu7{p7L~ zw`eBH^G@}5_&0m@578XhBFl7f0|_Na=Aq8*9msJY0GA_XU4NRcp@}H zZ_{{{?>!Vm=tbNL`gy1!`FE7Vw!%qu+S8zc?-6Sc0E#|n}7aC^jb_Ynr2^YZC#v`IPKr}Ptk^| z?Yxu}wc_V1oZ$=#FJEbOhMoaFduTAu7MwigV=pS2=6CQnm z&Q41!ipn+kKrzde@u0s8>ZQ&qJ~g&8C=kAH5~u#n+N*GaBhJxYT54hGJ@qA;2K?#V zAgmn`cPF`=y0=!=Z1hw4yWL2J`^OAsMeuBq-Z}Q>tEe-J033c^dfJ0RnTi{EPAo;CE4Y9d#-+yJTKDD z3(eZ?Y=}`xXB{crznIg{-s~U+R~s>yr~bE(s9el^J=P|tRqC<5H+Gv>=qTN~Za@&z z1Ibxw*R{{{y&YRd`m(fMr@cdxfJzzJ+tPf-n8Q5T_4%6;V+38k7hA~>Ovh*_>HeVl zmk0cf2z%vgR*n?s{B*bk&|VgQCeX*cyAp5FAe-)qyg{r>XDBAgl4ew?3Xnlw$n?#9 zduy}YZbNO3|G5<0i0i$!Wld$mNS91&=ktwJ#ugqel)k6~FNK+)2Z!htn~84=)4Cc_ z_jPgcEM}~5AHJ7A>edW>Tk5uU?q@e*@Jnzp!!ZTJt^%7(Z(Rp#JGY$$1nD(KYiHNel9?bC=0rgh23|m9G+V(`24{D{rZw@ zwrEUHvf`2GV$rbJ5MgI0N`d<6aVYzVB)p5{2(?{ks1X0Gbhlad>)Mo;7|X6dE9KN* zffQ=PMCG<+_6MSG&Xk_G;p=rP2yfEdh~_(Wwk6H55Z< f0rP^B=6p`ZLaprrjEG=8GH{uaQqby)Bxw8#n%yM% literal 0 HcmV?d00001 diff --git a/README.md b/README.md index f33c2a2..e3165a3 100644 --- a/README.md +++ b/README.md @@ -129,12 +129,12 @@ Now let's download the main scripts and add them in configuration on the fly. ![screenshot: import scripts](README.d/04-import-scripts.avif) -And finally load configuration and functions and add the scheduler. +And finally run configuration and functions. This will also add the +scheduler for loading at system startup automatically. /system/script { run global-config; run global-functions; }; - /system/scheduler/add name="global-scripts" start-time=startup on-event="/system/script { run global-config; run global-functions; }"; -![screenshot: run and schedule scripts](README.d/05-run-and-schedule-scripts.avif) +![screenshot: run scripts](README.d/05-run-scripts.avif) > 💡️ **Hint**: You see complaints regarding syntax errors? Most likely the > RouterOS on your device is too old. Check for updates! diff --git a/global-functions.rsc b/global-functions.rsc index dccb8b6..db9eac6 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1900,6 +1900,15 @@ } } +# add (and fix) global scripts scheduler +:local OnEvent "/system/script { run global-config; run global-functions; }"; +:if ([ :len [ /system/scheduler/find where name="global-scripts" ] ] = 0) do={ + /system/scheduler/add name="global-scripts" start-time=startup; +} +:if ([ /system/scheduler/get "global-scripts" on-event ] != $OnEvent) do={ + /system/scheduler/set "global-scripts" on-event=$OnEvent; +} + # Log success :local Resource [ /system/resource/get ]; $LogPrintOnce info $ScriptName ("Loaded on " . $Resource->"board-name" . \ From 638258000beb96722056f5a52b9b7fad2ba59180 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 13 Nov 2025 19:34:10 +0100 Subject: [PATCH 823/893] contrib/commitinfo: support updating the commit info --- Makefile | 6 +++++- contrib/commitinfo.sh | 6 ++++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100755 contrib/commitinfo.sh diff --git a/Makefile b/Makefile index fa4cdcb..2e3ba0d 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ DATE ?= $(shell date --rfc-email) VERSION ?= $(shell git symbolic-ref --short HEAD 2>/dev/null)/$(shell git rev-list --count HEAD 2>/dev/null)/$(shell git rev-parse --short=8 HEAD 2>/dev/null) export DATE VERSION -.PHONY: all checksums docs rsc clean +.PHONY: all checksums commitinfo docs rsc clean all: checksums docs rsc @@ -21,6 +21,10 @@ checksums: checksums.json checksums.json: contrib/checksums.sh $(ALL_RSC) contrib/checksums.sh > $@ +commitinfo: global-functions.rsc + contrib/commitinfo.sh $< > $<~ + mv $<~ $< + docs: $(HTML) %.html: %.md general/style.css contrib/html.sh contrib/html.sh.d/head.html contrib/html.sh.d/foot.html diff --git a/contrib/commitinfo.sh b/contrib/commitinfo.sh new file mode 100755 index 0000000..21faf9f --- /dev/null +++ b/contrib/commitinfo.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +sed \ + -e "/^:global CommitId/c :global CommitId \"${COMMITID:-unknown}\";" \ + -e "/^:global CommitInfo/c :global CommitInfo \"${COMMITINFO:-unknown}\";" \ + < "${1}" From 903a3f44a0b14cee3fb150aeea5c8f807b8626a2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 17 Nov 2025 09:31:36 +0100 Subject: [PATCH 824/893] contrib/html: support click on code block to copy to clipboard --- contrib/html.sh | 2 ++ contrib/html.sh.d/head.html | 1 + general/clipboard.js | 4 ++++ 3 files changed, 7 insertions(+) create mode 100644 general/clipboard.js diff --git a/contrib/html.sh b/contrib/html.sh index 2fe9ef7..39589da 100755 --- a/contrib/html.sh +++ b/contrib/html.sh @@ -10,12 +10,14 @@ sed \ -e "s|__LOGO__|$(realpath --relative-to="${RELTO}" logo.png)|" \ -e "s|__EWORM__|$(realpath --relative-to="${RELTO}" general/eworm-meadow.avif)|" \ -e "s|__QR_CODE__|$(realpath --relative-to="${RELTO}" general/qr-code.png)|" \ + -e "s|__CLIPBOARD__|$(realpath --relative-to="${RELTO}" general/clipboard.js)|" \ < "${0}.d/head.html" markdown -f toc,idanchor "${1}" | sed \ -e 's/href="\([-_\./[:alnum:]]*\)\.md\(#[-[:alnum:]]*\)\?"/href="\1.html\2"/g' \ -e '/| id="\L\1">|' \ -e '//s|pre|pre onclick="CopyToClipboard(this)"|g' \ -e '/The above link may be broken on code hosting sites/s|blockquote|blockquote style="display: none;"|' sed \ diff --git a/contrib/html.sh.d/head.html b/contrib/html.sh.d/head.html index da54157..861a87b 100644 --- a/contrib/html.sh.d/head.html +++ b/contrib/html.sh.d/head.html @@ -3,6 +3,7 @@ RouterOS Scripts :: __TITLE__ + diff --git a/general/clipboard.js b/general/clipboard.js new file mode 100644 index 0000000..fceff85 --- /dev/null +++ b/general/clipboard.js @@ -0,0 +1,4 @@ +/* copy code to clipboard */ +function CopyToClipboard(element) { + navigator.clipboard.writeText(element.firstElementChild.innerHTML); +} From a61fbfb75ce42f5341ceb0bcbb521793c6f7f514 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 17 Nov 2025 09:53:30 +0100 Subject: [PATCH 825/893] =?UTF-8?q?general/style:=20add=20a=20"?= =?UTF-8?q?=F0=9F=93=8B=20Copy!"=20hint=20to=20code=20blocks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- general/style.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/general/style.css b/general/style.css index ea9b111..191c0f6 100644 --- a/general/style.css +++ b/general/style.css @@ -69,6 +69,12 @@ pre code { padding: 0; border: 0; } +pre::before { + content: "📋 Copy!"; + float: right; + border: 1px solid #ccc; + border-radius: 3px; +} span.link { color: #863600; } From 4f778cb1c608e384bf75de267bdf9b7ea1facf00 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 19 Nov 2025 16:38:27 +0100 Subject: [PATCH 826/893] general/clipboard: add a visual feedback --- general/clipboard.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/general/clipboard.js b/general/clipboard.js index fceff85..30c3134 100644 --- a/general/clipboard.js +++ b/general/clipboard.js @@ -1,4 +1,8 @@ /* copy code to clipboard */ function CopyToClipboard(element) { + element.style.filter = 'invert(1)'; navigator.clipboard.writeText(element.firstElementChild.innerHTML); + setTimeout(function() { + element.style.filter = 'invert(0)'; + }, 100); } From ed9dee3c5f4c45da17d67fb685436d563c929ff0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 17 Nov 2025 11:03:02 +0100 Subject: [PATCH 827/893] contrib/html: simplify handling of relative paths --- contrib/html.sh | 7 ++----- contrib/html.sh.d/head.html | 10 +++++----- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/contrib/html.sh b/contrib/html.sh index 39589da..098ba46 100755 --- a/contrib/html.sh +++ b/contrib/html.sh @@ -6,11 +6,8 @@ RELTO="$(dirname "${1}")" sed \ -e "s|__TITLE__|$(head -n1 "${1}")|" \ - -e "s|__STYLE__|$(realpath --relative-to="${RELTO}" general/style.css)|" \ - -e "s|__LOGO__|$(realpath --relative-to="${RELTO}" logo.png)|" \ - -e "s|__EWORM__|$(realpath --relative-to="${RELTO}" general/eworm-meadow.avif)|" \ - -e "s|__QR_CODE__|$(realpath --relative-to="${RELTO}" general/qr-code.png)|" \ - -e "s|__CLIPBOARD__|$(realpath --relative-to="${RELTO}" general/clipboard.js)|" \ + -e "s|__GENERAL__|$(realpath --relative-to="${RELTO}" general/)|" \ + -e "s|__ROOT__|$(realpath --relative-to="${RELTO}" ./)|" \ < "${0}.d/head.html" markdown -f toc,idanchor "${1}" | sed \ diff --git a/contrib/html.sh.d/head.html b/contrib/html.sh.d/head.html index 861a87b..656a63c 100644 --- a/contrib/html.sh.d/head.html +++ b/contrib/html.sh.d/head.html @@ -1,14 +1,14 @@ RouterOS Scripts :: __TITLE__ - - - + + +
- - + +
eworm on meadowQR code: rsc.eworm.deeworm on meadowQR code: rsc.eworm.de RouterOS Scripts
a collection of scripts for MikroTik RouterOS
From e10455fb18ee82480fc5e115a658c356f1e806ae Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 17 Nov 2025 13:17:17 +0100 Subject: [PATCH 828/893] contrib/static-html: split off from Makefile --- contrib/Makefile | 7 ++----- contrib/logo-color.html | 2 +- contrib/notification.html | 2 +- contrib/static-html.sh | 8 ++++++++ 4 files changed, 12 insertions(+), 7 deletions(-) create mode 100755 contrib/static-html.sh diff --git a/contrib/Makefile b/contrib/Makefile index cdb9f4c..f704378 100644 --- a/contrib/Makefile +++ b/contrib/Makefile @@ -6,8 +6,5 @@ HTML := $(wildcard *.html) all: docs -docs: $(HTML) - sed -i \ - -e '/href=/s|\.md|\.html|' \ - -e '/blockquote/s|/\*! display \*/|display: none;|' \ - $(HTML) +docs: static-html.sh $(HTML) + ./static-html.sh $(HTML) diff --git a/contrib/logo-color.html b/contrib/logo-color.html index 5516964..a45ea93 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -18,7 +18,7 @@

⬅️ Go back to main README

-

💡️ Hint: This site or links +

💡️ Hint: This site or links on it may be broken on code hosting sites. Use Logo Color Changer instead.

diff --git a/contrib/notification.html b/contrib/notification.html index 902d328..a618f22 100644 --- a/contrib/notification.html +++ b/contrib/notification.html @@ -18,7 +18,7 @@

⬅️ Go back to main README

-

💡️ Hint: This site or links +

💡️ Hint: This site or links on it may be broken on code hosting sites. Use Notification Generator instead.

diff --git a/contrib/static-html.sh b/contrib/static-html.sh new file mode 100755 index 0000000..2c6f595 --- /dev/null +++ b/contrib/static-html.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +set -e + +sed -i \ + -e '/href=/s|\.md|\.html|' \ + -e '/blockquote/s|/\* display \*/|display: none;|' \ + "${@}" From a64e9bed80fbe7c2da5be5034732ca1b87ca06fa Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 18 Nov 2025 18:53:29 +0100 Subject: [PATCH 829/893] contrib/static-html: find static html files by comment --- contrib/Makefile | 2 +- contrib/logo-color.html | 1 + contrib/notification.html | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/contrib/Makefile b/contrib/Makefile index f704378..9417af3 100644 --- a/contrib/Makefile +++ b/contrib/Makefile @@ -1,6 +1,6 @@ # Makefile -HTML := $(wildcard *.html) +HTML := $(shell grep -xl '' *.html) .PHONY: all docs diff --git a/contrib/logo-color.html b/contrib/logo-color.html index a45ea93..1d67b4e 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -1,4 +1,5 @@ + RouterOS Scripts :: Logo Color Changer diff --git a/contrib/notification.html b/contrib/notification.html index a618f22..248565d 100644 --- a/contrib/notification.html +++ b/contrib/notification.html @@ -1,4 +1,5 @@ + RouterOS Scripts :: Notification Generator From e0b12a9050eeb1c231ace3b5b5186b34514e563d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 18 Nov 2025 19:01:39 +0100 Subject: [PATCH 830/893] contrib/static-html: add badges --- contrib/Makefile | 5 ++++- contrib/badges.md | 6 ++++++ contrib/logo-color.html | 2 ++ contrib/notification.html | 2 ++ contrib/static-html.sh | 2 ++ 5 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 contrib/badges.md diff --git a/contrib/Makefile b/contrib/Makefile index 9417af3..ef0e41d 100644 --- a/contrib/Makefile +++ b/contrib/Makefile @@ -6,5 +6,8 @@ HTML := $(shell grep -xl '' *.html) all: docs -docs: static-html.sh $(HTML) +badges.html: badges.md + markdown $< > $@ + +docs: static-html.sh $(HTML) badges.html ./static-html.sh $(HTML) diff --git a/contrib/badges.md b/contrib/badges.md new file mode 100644 index 0000000..24bd205 --- /dev/null +++ b/contrib/badges.md @@ -0,0 +1,6 @@ +[![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) +[![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) +[![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) +[![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/contrib/logo-color.html b/contrib/logo-color.html index 1d67b4e..84365a6 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -17,6 +17,8 @@

Logo Color Changer

+ +

⬅️ Go back to main README

💡️ Hint: This site or links diff --git a/contrib/notification.html b/contrib/notification.html index 248565d..a0580bd 100644 --- a/contrib/notification.html +++ b/contrib/notification.html @@ -17,6 +17,8 @@

Notification Generator

+ +

⬅️ Go back to main README

💡️ Hint: This site or links diff --git a/contrib/static-html.sh b/contrib/static-html.sh index 2c6f595..7acf104 100755 --- a/contrib/static-html.sh +++ b/contrib/static-html.sh @@ -5,4 +5,6 @@ set -e sed -i \ -e '/href=/s|\.md|\.html|' \ -e '/blockquote/s|/\* display \*/|display: none;|' \ + -e '//r badges.html' \ + -e '//d' \ "${@}" From 70675a9feea715d9e3618f80011d948f222ac35a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 18 Nov 2025 19:18:43 +0100 Subject: [PATCH 831/893] contrib/Makefile: add target clean --- contrib/Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/contrib/Makefile b/contrib/Makefile index ef0e41d..e755a1d 100644 --- a/contrib/Makefile +++ b/contrib/Makefile @@ -2,7 +2,7 @@ HTML := $(shell grep -xl '' *.html) -.PHONY: all docs +.PHONY: all docs clean all: docs @@ -11,3 +11,7 @@ badges.html: badges.md docs: static-html.sh $(HTML) badges.html ./static-html.sh $(HTML) + +clean: + rm -f badges.html + git checkout HEAD -- $(HTML) From b97a434a9c0c59d9d2b0cc8e3856f243f52de8eb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 19 Nov 2025 08:21:36 +0100 Subject: [PATCH 832/893] Makefile: also clean contrib --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 2e3ba0d..5db0a30 100644 --- a/Makefile +++ b/Makefile @@ -43,3 +43,4 @@ rsc: $(GEN_RSC) clean: rm -f $(HTML) checksums.json + make -C contrib/ clean From 725eb834f439d3c7051a819caaa4eebcdedce06d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 10:58:37 +0100 Subject: [PATCH 833/893] README: link the long way in detail --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e3165a3..8ae5b42 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,8 @@ Initial setup If you know how things work just copy and paste the [initial commands](INITIAL-COMMANDS.md). Remember to edit and rerun `global-config-overlay`! -First time users should take the long way below. +First time users should take [the long way in detail](#the-long-way-in-detail) +below. ### Live presentation From 30743c0e87e385b5310d304bcc0ba46f02f05a11 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 11:03:33 +0100 Subject: [PATCH 834/893] README: mention broken installation for initial commands --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8ae5b42..bdb06e1 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,8 @@ Initial setup ### Get me ready! If you know how things work just copy and paste the -[initial commands](INITIAL-COMMANDS.md). Remember to edit and rerun +[initial commands](INITIAL-COMMANDS.md). These also support fixing an +existing but broken installation. Remember to edit and rerun `global-config-overlay`! First time users should take [the long way in detail](#the-long-way-in-detail) below. From 2feaaf36b2725dbdd3dcbfb43538c23a175267da Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 11:05:27 +0100 Subject: [PATCH 835/893] README: highlight the long way for first time users with hint --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bdb06e1..39404a9 100644 --- a/README.md +++ b/README.md @@ -58,8 +58,9 @@ If you know how things work just copy and paste the [initial commands](INITIAL-COMMANDS.md). These also support fixing an existing but broken installation. Remember to edit and rerun `global-config-overlay`! -First time users should take [the long way in detail](#the-long-way-in-detail) -below. + +> 💡️ **Hint**: First time users should take +> [the long way in detail](#the-long-way-in-detail) below. ### Live presentation From fa64e8906bfa1f3f9bfdfcbc235fabef7076cf3b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 11:53:27 +0100 Subject: [PATCH 836/893] contrib/logo-color: add the copyright notice in footer --- contrib/logo-color.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contrib/logo-color.html b/contrib/logo-color.html index 84365a6..e5bfb71 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -56,4 +56,7 @@ a profile photo for your Telegram bot.

⬅️ Go back to main README
⬆️ Go back to top

+ +

Copyright © 2013-2025 Christian Hesse <mail@eworm.de>

+ From 8a904dadf4cebe4a018b6c52140faba222ed5b80 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 11:53:55 +0100 Subject: [PATCH 837/893] contrib/notification: add the copyright notice in footer --- contrib/notification.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contrib/notification.html b/contrib/notification.html index a0580bd..7a6ada7 100644 --- a/contrib/notification.html +++ b/contrib/notification.html @@ -51,4 +51,7 @@ notification and download it.

⬅️ Go back to main README
⬆️ Go back to top

+ +

Copyright © 2013-2025 Christian Hesse <mail@eworm.de>

+ From b65f3512d058a8349bf7ce4e6458271e4a9b1029 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 14:01:39 +0100 Subject: [PATCH 838/893] README: add scheduler with start-time=startup --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 39404a9..0aedfcf 100644 --- a/README.md +++ b/README.md @@ -225,7 +225,7 @@ cleanup add a scheduler entry. $ScriptInstallUpdate dhcp-to-dns,lease-script; /ip/dhcp-server/set lease-script=lease-script [ find ]; - /system/scheduler/add name="dhcp-to-dns" interval=5m on-event="/system/script/run dhcp-to-dns;"; + /system/scheduler/add name="dhcp-to-dns" interval=5m start-time=startup on-event="/system/script/run dhcp-to-dns;"; ![screenshot: setup lease script](README.d/12-setup-lease-script.avif) From 295fa3144a43542cb980794ce359a50de5c5b667 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 13:34:05 +0100 Subject: [PATCH 839/893] README: update screenshots, with terminal window Started xterm with: xterm -xrm 'XTerm.vt100.allowTitleOps: false' -T 'Terminal: rsc.eworm.de' --- README.d/01-download-certs.avif | Bin 1869 -> 2761 bytes README.d/02-import-certs.avif | Bin 3605 -> 2021 bytes README.d/03-check-certs.avif | Bin 8047 -> 5079 bytes README.d/04-import-scripts.avif | Bin 3932 -> 4805 bytes README.d/05-run-scripts.avif | Bin 1801 -> 2388 bytes README.d/06-schedule-update.avif | Bin 2200 -> 3129 bytes README.d/07-edit-global-config-overlay.avif | Bin 5161 -> 6174 bytes README.d/08-apply-configuration.avif | Bin 2437 -> 1842 bytes README.d/09-update-scripts.avif | Bin 1928 -> 2641 bytes README.d/10-install-scripts.avif | Bin 2423 -> 3017 bytes README.d/11-schedule-script.avif | Bin 4113 -> 2991 bytes README.d/12-setup-lease-script.avif | Bin 7642 -> 4230 bytes README.d/13-install-custom-script.avif | Bin 4589 -> 2879 bytes README.d/14-remove-script.avif | Bin 1093 -> 1854 bytes 14 files changed, 0 insertions(+), 0 deletions(-) diff --git a/README.d/01-download-certs.avif b/README.d/01-download-certs.avif index 0532ec3addc1b174c13c5edd6acc1294dbf36666..f2afeb545aa1e191f3e9382963bcdc172c40603e 100644 GIT binary patch delta 2533 zcmVVx^@fxj@{ETUPP`QrCg6)u3-=t(%-Q8j7*2ZI~%36X)iBbR8z$VDIPK*vbO z^x?IMK^v@alj9!mVu}?c6+Mc+Vu{}rAvhsDZ_k0ftIrid8S)SsjSUakEpzlRW^>C@@dZbY%E6<>9@0h15HL znGDstbi^J)dO*6pX#N^c3kg$&*X0ic(;O;0AA@yxlJC2kC1cu9exj6Jx$IIAfBqPH zy9jg~WdVYY^( zZF#P@*_44;awdAaA%kjY`(CEwDcq#|Q1!$7+t-MF$wc2gf;Xm1W0Pq zWHxCm@CatL|J^qYB*)sAlY71Zf0`p7D2`x*+FA@JzGnLC6n}$Krp8|Qo&hM_=%GKlivx1U#(%)O_w-3s|=fQhCqFs!Q+VG>null`-lFp9CaW~N!)0MXW*oQIyF zAXddw{VTJM6{>8?<=$LJcJuWxL+AB`!jKR2KzT%Js(e~Apyq>ze_7ZYYHZ#38w+{u z=(OsqgYx|#6FS)lJ%RzQ*v7=!AJ*X)uMGC*{jUNA+(uvUR}rtV30~i)0#D*B@}A`y zkyFRiR9Aw>tgDrML{qXVBh$h^>qbZO?|-8AexTWl6bXhxICnPG7)wtIBh8Q8D)&4s z+qeX-^~cG)U3fK(fB(qDi~o7NqlN<;ydaKn6`2MviU&lR4H|N-a^E)}z9URUYV$?D z&Gdkw5S@~R8IVLei)f0~)zq-jy?Yq@PGgaa>^-M;Z#bD7SWfK-HuO|Bx|H)RFjDun zE*%=Mx&euC`!)55Q>l71M(U9}5Q;0q58$|qI(`B5x{iQmJ&XD1OD(`BYJ`Pkir7ACNLLc%DE5Sj zIA>pYl7D3=f1Y?ZAvc8%J0o7Je&q)lhG^vLzD>sDs@~TiEv;YRBc=)^>OOJzb-a~4 zf{#hlH-V)H-8Y@odk6gZeGcm}-mdQp$4C}eQSXf^(8w!=PMD->6K$EK%Xf&u1Bl}} zM?0#n$bTxXNl3ww8|I8SC8o9r45n>ej?)jBAFq`Ce^~)ABBinoQA`+U;z_e;2Rg}B z%DB%m0^YYD|BCM8U%7NB#fsX(bm<*u)To`U|E*;S=*prm#gbX63O*i8(O|?c0{e$3+HF6^ZY3Vj3&|P; zGCDJqe+~)Em}x1{9I*+?UF472%#9yiJ3#%^8Z1f|M`1g1bKyhn_>jxQHM3T;TRkR2 zE5$Oge>@u$N>b4$)U&Y~3=k1WmR8b2lTk6o8jBEK?^{?Avf7xlHqIgRV>#=|`YfC4ct&MV2_fPKV z@f3NlHW>=5L1V6+681X%=*5XG7I|vN8j-Lx%SVF>s;%m#Y~As}Wi5o6yQqES`fz-7 z8b4m;(LzUj88bmL^ziZRDW)^5iMHOz#&-=63k;%)B<>TL^OZL2r<{YKT#i2XOmpeS ze-%^PNW#=|ETtX1;x;5#Z3*;s=)OGvoHW_?G$}8bQIeAa@oFv)n;p}Paf+P;>Kqr& ze}&CodX0aDy&{F&12w}`ou^}ERltLR9I<4FvS4!&(~0*8cMk;n875S7gWev!#_H}s zDHw~U2EwpeVyDD}evGnxC%7?RrN-NCf4Q`clDtGe;3bW)&m4E}hdy9VAfM@fyn3hR za{&VHYP1WPWIkVHi^NsCs)~(Tyg9v`Uc8Z$=HsTbezkM7A?4qGSY^7uT!atAQzE9q22VjzTF}61mL;7uRY&ii?;1_8xbKkU;3^rvDk`BD*Z2e^c;N zr=%QUEi!Q=GM3Y9WlGV?UHY}HA zr%Og9%T|I4Z_ahT{DaeK(lu!%vs}Q+r04g1#OtG}@fTSQm`a;=ST(7p z|F5!Nc?PM8>AfBQ@f8_{vM-*!iku1ZNIe-^LT3sA=QsxHZ<=+G%%MFOe<@E;cQ0*I zPa$Q)o$Y<}&r~MLQq;lwW@ePn^_H?{uQ5nM8K({xNPTTHUG$O7{CG>_toau)1TWwgsqTu!!g!+>MI-3b zQX)|l&DiY)nI{3nXc>YtPsBA9ru?;i|3kUR(?oHwOuAmeYXjSlC2O|5n delta 1634 zcmV-o2A%oI70nKicLD}Fk$Fc2Bme*abdkkKe+EKrWMOm?015^;C9*zj5;Cm}Ok@Jx zG(%$E-oB3{ms2LSbf~M6sV*<)?B*mwLa~`9G)l?cI0g+d7toos4PElbk$IKDrbJi> zv2}})(TtO((ZKM3Xr_`G_rrv4B@sRbh`cNyhJ^(fqJE+1r8EFS9*<=mAH8-vtI>!F zf6z~{=0y9M5`ZB{d9__1JFtm#l+;Rcy>_Wx4T7Qw{sze+zNp%UKkCGmDBO+7-JzGl zDBeva8~9b7*D5R<+uZa{MxOD^Qauqq%<8fID5gGvNs|*)WNe4gzB3fsfJ7v?jfGZ0 z3@8qr+cgt=9Opi9>6m&I6id1hV0zNRf8&*KNBC)fuW)YC^l{6odv;`cq{cwFG^rO^ zq=}p{6pofc@qLUjh-js)y`$4@b$|w0=j04oiWw7pBw)FKr7?hUeZo9jI%ZA#a7fuo zDSJjy`L2>oj%CmTXQ_A#$SjNTFc_Z+>0aXp*YAc*gj@xb*>uT2^X!x%NdOL_f9S)d z6pP8cWy)yw6#V$%=b)LMb`yCop)824(&laxo_QsGRR-FnG~Knwf@iHlgBjvgsl3Ob z>uFkV)pGiFj|5uR;Ne@wbB3}*SKSKK5RULO*|#zylLHdm#9++*x~>+n-Yvuyb% z`2qo$Rgf#u4}+kaBFoNm9gsYbuKDC)EX95x@rm>EE83j}`(a4~y{%n=dTS6Gw-$dL zt;r|vvzyv&ym;$$5S^HsRZacq;YY(18i4gVwZ%pBb&!+btze|KjedG?9;KpoBg^ zAY^eb-EApaKE%5ye>ID-rZQcpL-KDOP@c!HU)5nsZ)8AfcAxd4#s4rc;h)*T>1YCv z&UwX^jc5G|>SU~xf4hb8X^A(IL&-CX0u)i4o87D1skw=ZFP73qO@m-dllF9u?$yAt zM`D5?9s<*J^!&{pp@^O0Ut(>0H|!B}@x`Zd^7Z_Dj6h6vzbL|$UPKB=c=?I`BG8GE zs3n0XoPV$cl+nEV*-N)N$pD^rymdMbhTB+u{NBGPu>bXbf6l9jj-9Ru+-r1`Cd-fr ze6mScKPxkB&3JjZ!*k`)muJ0|T+KRqFpNIFdsj=sbv}1wi=!X}0FelAzx&j8D+`IJ@ z`nn7UGGr(d3ru-An%VeqPZ+-j9@j&3sgEf4-;utkV_PPhD^&)(@Srlyg6115_Gai^ z`w{JYOyBbpZr^N|u!yl~?Wm-G0X9FQ>vX}9OVy?A`SrSZDn*}000000000XkuV%P000004sdC7Z2$lO000310016o zY;R)#0000)000310RR910RR926951P(f|MeC~0YKW&i*H0004zoE?$u90e!<005?w z4FO1h2HI_8VRRAz3I;eO@_JSYGQ|x{WCGZ3EA=XQAkXW?=cr#3Gpv5aU7Q+))Ebcx zmfJq((i1Xy-imuA?;knG@>{2IVg*WVkR3oHxJDNq%NQBpShIjHTO?P29GXp=!Hjkg z?ER2k4e=3@irys}?y{a()~!1x$R*GIaF2F>{V!CWUXNHh-u^}J?CgQ%DYk$d;V1gd zpvMgvo0%a;+x*`L1QxyV9Qm}HU(v~5pk|=r!1-#46>cz16Nls_TGEEXGaeOm> z3RsO;lBA3ceKJS&De2K~t6A4fU`({OJ$IDkmpp}|@X42w+Nn}Z>YQqzfcFjri$|>l zv3;!Y^ejT7EKzhz^v!i>Tzitj8CPgWq0V!s8uJ77d`?B+uIT_pvb&FdL$rCM$ws>i zUN8(gh&(=cAjJx?xVFIQ;_jlc{SYmGJ-aO!Frwe;X*g5W&{t&RK!+mhU)GK&nYku} zhj}@i{U1_)PV4Dpu1lFPCfoF8l`;TN&fl8&;6xCxQh(Fo0u%N%kAnR4nXeGWlr_L; zFMhm_l6JW%p%M+g?tU}yUv< zh?Z+>@d-7i=U``kEM9X&qHkeyP4ssScFyqR z@E4pBmdQnGX>|CmawU@p6hVAuL1jzjeL8kjLCR*=Mm?29z<+S9=iyDR%!pxgFO2`u zv``#yw5WMu9=8sjh>}6kR*K}L9yvF4OO_eM*Z17I#j1(Vd0M7@d~D!Y*>_5lX{HfVGH_bE_qB8Du2|a-U;~1JzE?G z)m@9FIdWZyH$S#Wb{wS(&QPh@HYLfuWEM1qpC{vAlZR%lp7vDSJ(S8maKu}j`?!n< zyUY}Q7QH4mbPR&<(@Ii*rAX0?3?DNTfF+>8Cm2p!I2j3QsiR{~vS^9or<_wB`%P`r zOR#qVzLlxG*>(=o38yq@x-Faf{$6CER5?eJ$$+%8jz$6wa4VU1YF72KYY;AU!?ThA zW9}rH+e2PUx#Ew7iWrgro*M9VoE<)uB=9VJEpmHIsG2A!fg^r@!A}ziTMVs%Dd4so zCg2OU?_X2)+SdN-=AB?&412if3_kU2dqhJZI$(=sat1Z`u#E-!?`N3tAAE|o+Mwg+ z6!{s>yJ<O{7f75JPW@r|&_cnniE6u{15bDy66sS6~VA21=5AP%R@Z`$<3Mp0|ue z0o=yawX`Z6TiYyuXta8O&@kA#_RkSuBMV+cIRL4{mjC%z5zLidy3@b)+k;63!SqEy_}r4z%-BoL9TR2VQ4sy}h3H|Oss>2sCVXod z!e7iN6*(B$*7C4XCKtAQz*13lH~WQ4R!AAUPCuMhCM$RUS`Zqh+PN4k%-J=?yh*cn zCb?qRH|eB*jtQ&B_6;hVGJhMLAO)?q+79%O3ybZ2d@27{g4n8)TM5=w!e~lJL#0^S z@5uy=W><2{xw7QHBGRU@s>t{`I!uk!=`Wa+F-*$-_f7Hz`X+!rX8dtkn>)4FwmKYj>yC3S+xLZ^fa+=#)_o`PFhIgGl&qB!#Dy?wZx>vYBM*Az<(3A zhJA|>W*K?EwSpnO?*8j`u}ulcIz~|MOGWA6L}>5FQ%fn(+5>r-*N6A0Y>Agjyp~36 zrdMlaD0AD)>Bu*Q#}&NC$$)LIci&hG<;dviS00`R?w5zB0B=xTaU0!4gDp=qpb}U( zS&Ko~pWDIVx5?QT8>VTXZ2M4VzI>px_}gKJ5Z0fqdMEPA)toM#YVJr|lKD!1NAfPr EV9tqwM*si- literal 3605 zcmbVJc|4SD7k*}8j3xV$otYSln#C3=*_Dbiwn}4cgK02gXtSj(DO*WeY%!LU?1_jW zsmW4yg-A+fN}2=L0F8f3;Z`Lfct^*S_E+i00Bpkn^7o7*CtuZ$b*45uY`Ak6t)FxP79>14Y2<2 z44AfLP<(jc70OdWyni1~^ z)j^=Y`^1AB`iFNSzyLIXwQqHB^)(=7XJu;zUbHqS0IZGx=70b{KZ2i60D(XtkphCk zQX;}aLc;4MBt@l^YGrCiWmc}OEuM@tQ!8 zNTjfku$+j998OJ94fj9W>O(+W0MLejV$}htI0PmRS#1MUz&ZIKYxY|TPbdt|$Bz&| z3JQS*)ndGtfE|Q+G=iLX=QC=Yq$S^6Vchl)s5`s?c?i5@u!C#3kzpN zM8?LQi9dTTAu%mIBlFVbtSi}h`2~fyii(*fmG`QuYijH28(JT=wX-@pA9wZk^}l#I zFgP?kF*)^SdgkryyE*Qs&x>EaE-kNoU!_m!^PSmM+r|d-}DtiJ221<4}4jayt+ZU3ryZCh- zeA@gV`&*lshkx2w`$RygF=l?LA;M~t^xRlH_Ch3+p6gLwSf*8&k-dH zp|+-%Y=lYEM*A-RTKp6Ge)<}On80QIK^N|*1%c+n`O656A2Tqp90 zCA(_M@yL= zRi|`pK4u@ljW#;OT?{ye1{K+5$t=Ur3$Gh+Dpyo13>RX5evFtbUT&dYZWH}_ z$ijm~-u+BJWCzQ19|8~rTJjPxz&}P6fl)P7k?3D5N(yhX7pK6#l#;uie53M`v+nZdnz0IbO_1TlZWixpQOtKG^r}gpgw*)yl4C^Q=?kN ztv9ebz`fkK-7QTfqaEK!HF7!eQk$-xOtL`(qu0;oL|KO|z4AMAw8|yh6}FockZJs) z0@a$D!f(|w7@OKBby+{WGGN$EGwx>9v1{w#QCh~)KxLGy$;l62sGXiUoDV=5 zs$T&G2Z1;4t_rO(zG`B|c4stSwc03<(9-$aF5>l zyfftv%PWhz0sAO$#q3Bui=i|Ny^!RS<}&3WQIFLgv*^;r*=rE4BxC+G3{7*^r6UwbW;GR&?BPQJz z({<1A&y|b%2JYzXq^eH}=-djkuazWVfWVksWM{`uf)Xy0djM0`oB73uX}3f(XZD_u z)y)r>)Y|aC#;eB@hf|M;afIc-QZLjm3=~N}adw)pok=q1%6DwcdvIHEqnI4^R8w`= z3n?iFOW=RS>D3_#KoDuT;gg}hnAmd)Zct#i7j%qZ?m0f*bOC*NzeaUvaZd8Go{DZE zyJA=LoOQpZ@nyN0FZ!bR zm}y2td(r@sHw@Lwz{f$lJ&J=IwpQn{&S#U-D~nW;GohKWbW?%-CiMPl|};;<8U2 z4}DxXy8S2J1Tc;J`Zij6AWfzOm&>xh*x;GR-)DZ({+heZ@}gv(QpdF$YRk8)ux5|4 zw|pM_nOM2f9vrD<<}N#9v;9Xo8*#HI3@H}#KHuix0JVqcmaje#|LOjDVur`-tE^FG zEF>Y*C8cbp{wdx!Q%xgJjHa_GNFx&-w-GR~-`a4?tfBjbo{npGf>6RCR@8;-s_I@( z68x3zC`@wzQ{nf957VDbQ|=C_EJ}Yn!^f$Vr*1aTbV=W;jjnze;wvUnP^|m@tYF*%Y;eTv^u5}` zSqp7P$z!{^7d3%T>=pmg+SI3Awd%nN!3Y$z%a6a8%e1QKPSSCSsACR$pplF9cWz+a zi?@)QOHO+0loeVi-d^^c39CiLp8ip*-Nw{SO6)SP(=9Bpiz!gu-M%kMuYfF&^LCCa zb)*q9TbyyrG+qsz@cnW_;DxXi%p~`3!N=l)*kE~o4>QF z8s>knJZ(1HY!CJ!9~#fD_LuhdRjY6rbv@YnR#uSiKJwj&dmUJCWC}A*gnbS#5p2+& J?(Y4v{4c*$$>0D0 diff --git a/README.d/03-check-certs.avif b/README.d/03-check-certs.avif index 4717b3ea9cc9436ab94be0e471263f601fcf47c8..1f03ad2c01bc115ffec79e9fd3b60259cfcb4e13 100644 GIT binary patch delta 4948 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 SVi<(%h1X<{``P91&U}FF%!w`l literal 8047 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 TzM_&$pcb*RT)gFS!jJy}s&{h% diff --git a/README.d/04-import-scripts.avif b/README.d/04-import-scripts.avif index a5cfa7bf46733ae385e5cb9c8cc55364724c0b2d..27380eba1666633b70e4c4fd2746d27ad2f9205b 100644 GIT binary patch delta 4593 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 bgQ?9x$twZ`r0uOWEkTfn#C1|g{lA+$UIXsd delta 3713 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 delta 1566 zcmV+(2I2YC5{V9wcLD|Wk$Fc2Bme*aG?B$fe+B++WMOm?015^;C2~C2Br@p>OvnV> zgQg@`=cj$4_&lOk)2?Oce#zx_y_IB2YfF*m7V_GBm=2SGCTq+1CWD7r3N?w3G`qRa zu)%bFx?dv^V4n2#4lMttDXL6V%qdfd@7}!wb4*=P6A7ATUTBNoh;mvCJLRX-o)*)W#6vVyTkj~SYLiERO} zl#>Eqy*iTt}i*>nTF#G(Ro6j`m+%z~X#*cJyWI_SqT+J{S}RTEW+ zc3JB$*`GRg>wFHZ)=w9PkI z&Ul7^rxSYl*zCkRzwo|Qkg4G{e-Ljk@Hy!N*AM`9%072sM$ox~n_@}w9ni_NIgxE{ z#fOLtK?oW@wj+SZv$@aKWO8D6f9;2o=71fkV%TCFBNZ~R2;H4XZe-b#Soyv(w8ZOp zt!+Nr8P=<45Yd@x%$!Y?F%MUJNv1KWnCz2yl*yO?55eNvetTWXz%*rqP2xZ7Pb{}# z9moaZCu{3@p=**zp+Z8TnSb0|%;uo(B1HQi5LvhaWL7Te%->JD3c%($Dv2tD!K3ua zi#mKH`a)Kp*!B|kEam0Dx-X?!cspIZPPq&$Z+wP>r;qsSroJ{er_uLwvQz4iv#4X= zpf4-z@VImvW_*_cKOV7Kie^ed z3H|#%s^pQv)xjDnqg3+v)rA5J|Bgbo&I)YF2ASx@E=ZhNg?grY_2uohEcAO55EV8^ zM3Pw5v(f>Wx1I14f7Ny_1F!LejXTwnViwI{x3&BQyFN%DXF*DbPMwZ56KTYzeH&g_ zJ;Rbgs)wvMtMf*E_=B99#g&jJSAar;O@JetTeEcRS0gmBYPiNWV7Aa>Ko z7r@4??uxSUa%&5YdKvPy((?5hMi-0^4xEKb2CX$r8hHh}zi_k2Vxe|)o%g7K^SuEs4ey->!- z<>fpIk2Fn(VX{vAMK#^$^ubPYxS1R~y<$^8clttG)|^F|ld*~_9JE|`Z2SK?I#{C? zYt8Ybnlo$`f3_)CaGYfjr3Cng?92(LHJYvpt&PsGXyqB04|!mN9{&&Ipwbc0cJ%ag z9gpvqW$dIBHOG5O5Jcm-s1oxZh`t&5>)KWkx<}2EgbCYThmX0~s`5aX-gsG=+Ak6_ z!tFr@0)pYwDbXbCK$0_`HNo`$F}d}4+F%wGyzvu}e}iH}zexU5her%Z96-W_dEr7D zy##Wio**iZNxGXUoYZ`3XN?kIE$zVjzLEz%u??D%s1ULPy8h_xe@Y%s_`{xh9|WBU zjCKY5y;(gX_t;j)=<$Nw1ISgy@2#CRu%B)sf7v|^uGE6c6=~uM**ybIISatV2(oWu QFMw%G2#188z*%8-C@)+FVE_OC diff --git a/README.d/06-schedule-update.avif b/README.d/06-schedule-update.avif index 7c96f3aa6f71be5f821c1eb1b78ef947e447a330..158e13f53d0d52ead604cd8a4e2bcf62baa190f3 100644 GIT binary patch delta 2927 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 Z1liSMOG(k=UcPsBwJVuijv$~is6Ydpm978) delta 1992 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 W`PLjlrK=j-)L(Alaq5asm(4Jzn09sm diff --git a/README.d/08-apply-configuration.avif b/README.d/08-apply-configuration.avif index b66af1a7ad18f9ee6b4958b1de8c5db463d58382..ab22cae3e05eab8ee3b2b878a726890b1fbb2ee9 100644 GIT binary patch delta 1686 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 YsSidUC(c4dfoaqY>zTcCgQ7Ek0U)B8WdHyG diff --git a/README.d/09-update-scripts.avif b/README.d/09-update-scripts.avif index a31d60b3a0066d1ee68abbf79fd48aa6d77ffdd0..e713ac2c48e8902e88b1309c660128a9d47032f5 100644 GIT binary patch delta 2412 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 delta 1694 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 V659%C*l99!+jD6bz1FIc{x6~x&wc;^ diff --git a/README.d/12-setup-lease-script.avif b/README.d/12-setup-lease-script.avif index fb4024e2a730947774c6f165c7c5e3b191a4804c..2a8bcb24b00b57757e0ce3e70169bb29a9fef0a3 100644 GIT binary patch delta 4093 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 literal 7642 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 literal 4589 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 wpuiKfKv>d+invLs_GT&7Qn~jxb9$CF3 zK?*8GOY9^=JXP6>Af>lRY451YmajoQCe6)~d85QW$%M*M#o&Q%8P z{e>ZLjrHCXxqTKt4MNG+t~1{=iso=sp?uhAYz%+#bKl>W zeTF6cKehOCGS>Kde318_qFtI`fl*)hpM0u_({H&z1}3?0U&Vi~q+}5-i%AUSCt#sC zVktI_j7B!BD*vy|{nYqv82T~+Nfh@M>1RG}m*Q%JcK^H}w!Ap^_^D}&4F>?2NsKba zCS#So#AKQTcOPxzs*-Q*ZV!J*hx^ULAvnaY5MYF+)jOFoaT6pZX0=b+s+H~x-GeY_ zjUFEeU73AnK9vlF-Wnp)t^Kd*jTbUMDYDJIouBD3|5*3mOdSuGUCw2Fmn2cQ?Lec) zNMs?eR;7R*%*#ycWba4uHg*_|gN#?-V0v9&b!ak{hCM!z3f)!NY5aehzZ1uI8~HE_ zh@^hiT@}Ru(d;@^>dh$BiY>-K@b?P-Z=2@_3cGMQ9Y7rnLXCERzL)FD7mUFQ5J`F> zE}c|X6^WrS`N?(&&e5$GCPcZX5W9Ou-=FOvFhMfA=fu@4V?6~qeBgvIa2Z}Z=j^Z9 ztcP8cejB`zXQfvVUotKADt2ld z(X&l0;H^x&p#V|Q^TkBo@J$2%6{!~!sUhYcLvql~0!eEwR!e`5hX_u!`eQ1^d6Za6 zC)n}5dZ40uuaYFma;{gCA@BD+Y~4>=>Bi!&n+@5(R_9^cKuf>8o{r1t3%~tr&bFV$ z#9ZAfN=uqK6U2pIXdK+yP0gSDFv7%LdVj?WU3OEY6D7fmtWfB2uOb+^OlB<>?u=F%#9$zGnK5K?hpqGt{hOd$g3GRsh3wE_!>5(q@_z` zFTqwU%$ciZa}5uqxc|RoW6xA|5K|1NIR)7=4$p-47l6ed`5#h-9{ z(Op&CZ3=(B>|=sr*7uZBy)XT)P~h5{NfbvZV|3n?%JK2RVWUyjD#8{Svi&Le#fQ@; zoqwrD+BA|f+Y{^4??PN5co*4tBy-0qR?Brth7bFiubk)oNfNykJ1O24>-xEYmgc5W znFuKb&s^71I{L00b9Fqnzp&j<7wNal0$8-0BOHIQ=0HJ7-(`uoP~q*Xgm@zNMr*j5 z3>k~dOAFlm^EJL-U7*x~^OGMhrscPTXV`+1NHr zQaHk{SHEMjwEyrf1RQZO0Rt#&D&Fvcw;2Wdx|4gA4{UF4P|(A4Oe1@@6P+ z%x`}c6e4%4NSML@^&yHzqE@5lEdAUTP5aZG$KZ*kaOG4pwxLdfvUrX{Jn@!#%I&rh z_*YGgNDB7=$MP8Q^(kg5WL@EXY=fC@J!acBqQTw^ccn?@rWce7?XSgRU$j2;@k~jMlt~d0ATB55_C*>4JAtQB@!Sagn^rv}AoacK9taaW#7QZTTx+s{pQz1X00KW^ nZlUBO(mpI+l|vk;6sd5TzLR%_#3eJE?OJR!%^dx_XT;yP{Z1B+ delta 875 zcmV-x1C;!}4#fzNBMtIxWprTx00000001bFFdPSLX<}h^X=ag3C+=V7)H2&v#IDrm&W^4-C z^@yS?d>UOYEW~3is0zSkEO@i0q)InyO9lE}&Bb39*pz%w;~_J_Wgk|qzS*ss(6T%_x!Y65<6 z$DeXCk%bx zV(w6^hp@E$1>S7_Z0 zGh>gQJ!@nmV}=D5s>9L)j#DZplE=^6ifr$<1`bu~@KvZl7( z*Sf|W#lS{3Ld=orC;S8>Yl?oqbVO4>aL8*Ko)}V3rE5QHgIq{XnPnxrKPT_gdLLBG z^u&Rw;6mYRXnv&j?5H(p3nDnGQ21wBqb*8k$~=1d-agHmY}*H1e|+(#Z4Uh0$l2+; zWk@d{5Ci;7jq^uAJ`%$O{r%|)wW5D1DYr|g-N`V84?G{e)EAsBpzBHO28tg%k6EW% z!){#i3HFMt%3&U-@{V6wC?y>)t6(ZBDh+5S_`^;flJ`18!E$R7BP< z|?{58(UPgpd0flm^O{C5|GfRK?W Bp%efB From e6faf346c20b63ba1c0a137055e335e2e1761679 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 14:58:39 +0100 Subject: [PATCH 840/893] doc/accesslist-duplicates: update screenshot, with terminal window --- doc/accesslist-duplicates.d/01-example.avif | Bin 5208 -> 3634 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/accesslist-duplicates.d/01-example.avif b/doc/accesslist-duplicates.d/01-example.avif index 11b3fc5f21ace72fe8f36ff62b9439e90cd39a90..d290a77133ff12670c3ea5976b4c613bbc443831 100644 GIT binary patch delta 3436 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 OPfh7{|WCGnZLt@_EzNFZoAL8!h0nhP* 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 From 6718b9078042fc8bd5a5b910f187966b96dd3c6f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 15:08:33 +0100 Subject: [PATCH 841/893] doc/mod/notification-telegram: update screenshot, with terminal window --- .../{newbot.avif => 01-newbot.avif} | Bin .../notification-telegram.d/02-getchatid.avif | Bin 0 -> 2841 bytes .../{setuserpic.avif => 03-setuserpic.avif} | Bin doc/mod/notification-telegram.d/getchatid.avif | Bin 3896 -> 0 bytes doc/mod/notification-telegram.md | 6 +++--- 5 files changed, 3 insertions(+), 3 deletions(-) rename doc/mod/notification-telegram.d/{newbot.avif => 01-newbot.avif} (100%) create mode 100644 doc/mod/notification-telegram.d/02-getchatid.avif rename doc/mod/notification-telegram.d/{setuserpic.avif => 03-setuserpic.avif} (100%) delete mode 100644 doc/mod/notification-telegram.d/getchatid.avif diff --git a/doc/mod/notification-telegram.d/newbot.avif b/doc/mod/notification-telegram.d/01-newbot.avif similarity index 100% rename from doc/mod/notification-telegram.d/newbot.avif rename to doc/mod/notification-telegram.d/01-newbot.avif diff --git a/doc/mod/notification-telegram.d/02-getchatid.avif b/doc/mod/notification-telegram.d/02-getchatid.avif new file mode 100644 index 0000000000000000000000000000000000000000..0112449cffcf63e4f89bc46ad215560ff5a74cf2 GIT binary patch literal 2841 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 Y9icV9{#F+HI+QLMdDl}aIO9I}f1!IY&;S4c literal 0 HcmV?d00001 diff --git a/doc/mod/notification-telegram.d/setuserpic.avif b/doc/mod/notification-telegram.d/03-setuserpic.avif similarity index 100% rename from doc/mod/notification-telegram.d/setuserpic.avif rename to doc/mod/notification-telegram.d/03-setuserpic.avif diff --git a/doc/mod/notification-telegram.d/getchatid.avif b/doc/mod/notification-telegram.d/getchatid.avif deleted file mode 100644 index 779296915de91a9b21e2f05685e34a1539d9c73e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3896 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 Date: Thu, 20 Nov 2025 15:11:43 +0100 Subject: [PATCH 842/893] doc/mod/ipcalc: update screenshots, with terminal window --- doc/mod/ipcalc.d/01-ipcalc.avif | Bin 0 -> 2515 bytes doc/mod/ipcalc.d/02-ipcalcreturn.avif | Bin 0 -> 2205 bytes doc/mod/ipcalc.d/ipcalc.avif | Bin 1729 -> 0 bytes doc/mod/ipcalc.d/ipcalcreturn.avif | Bin 1247 -> 0 bytes doc/mod/ipcalc.md | 4 ++-- 5 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 doc/mod/ipcalc.d/01-ipcalc.avif create mode 100644 doc/mod/ipcalc.d/02-ipcalcreturn.avif delete mode 100644 doc/mod/ipcalc.d/ipcalc.avif delete mode 100644 doc/mod/ipcalc.d/ipcalcreturn.avif diff --git a/doc/mod/ipcalc.d/01-ipcalc.avif b/doc/mod/ipcalc.d/01-ipcalc.avif new file mode 100644 index 0000000000000000000000000000000000000000..aaad6167a0528cf308337f0dee87c076c1ae50b8 GIT binary patch literal 2515 zcmXv|2Rsz)A3rlf_Q-KLWcxd0&$G!mBQBdW?#?>n71_=>XCH}ELQ0CfMMlGl>_}EA zvwLx8Wn_i-^#8oS=kxr&>-jvt9{>Ol@r#JYctxW80Mt6iAe5hC5X#HX3aSXDT9hE) z2(R;uT41D4VA%gD0DwUuBL3t5;Ux?zBIu8xp>_}|Fa&X~i~s-{>N)QK8g2l9se{U; zP^jQPL;oa#RN+fYwa=ATBt+3LBrxR9EHnxehN1e`Q5ZxB6?stM7~k`U005m7wLPX@ z4h$*^^~YgiVxl6eSEQn0lE}FO;6{W5h6N)6qo_Z#0T>gh7C#CTaA0k5>d2;3A{?)$QAk%t{TMmOix8!LoZY(IO+1p5-SV+{(4_J#O~|Q^y7KIf`a< zm&dr3qG$0jS2wR{^lrOUhk7$u1my|qi?x{Wg9ZgI&%+xM6iy#jd<6gK=d9Wvsgf_gA$q{L^2;=wZ za=>h6#Vk;CLkfpRZB`{#fys}TE+~g4HE6r>N9xwYu{uQx^TS>GMKLC6PEW_V3r&|s{Lg-}*3v5Ui z#Ax2CZuZ$E-x_0kA31CJendwsXqIa8ju}Vov>gXVG5~Q;M2^E*I~@ zO77B|9iJUuRn*$XkuHCFy|>x!%5H6q5HkeXpmhQcVVk$~g6`BxOVtE%ygI!{a%AwG zo|-e`u4r>D;N$41e5oX`D1JRRaPOtM3OP01djCh_WrA433Yt*KRcvN@CBI942(O20 z949{(etw!=4r`As%z2KhJu$#=4Lr;3w@#!rK~6LhO`?@m6LMI`RY`zv{$1gakHsff zzX(^iT|7ILvPtX`zJ^_94O!T_a!Gt$8}W!$Z4x>Mlvqe>t-k1} z7d0+c*at|3&%IYG_2TJ}xOQx@IXZ+6iQtK5+p74rjZ)+&tCRX9-<0|^z+1mUroYSM z)OJDc?MR!y|2LSiYi5MRxR7`Dp$Jo(Of@oG9LM*L+yR^gy(_lLhpm!*H-XZmSWPEc z6^S^3Eja|dm;9(&Ka|Dcg$u)8IkM+a?*7nWd8xo^NqXDeIA@3X29KuOd35hZ2UfN) zw@g#rr*XO)-L3RO#La4t-b#YNYR>HLMoBJ7t*fP+R5L1D{gNBeoVOBK zTJyT673ps>VT|w4T5s-WA7+LP>+(B!b9l%DCxO>DUFEdK#uoMq(_td!cNUA02yPolse5K*Q#%C}Y z3vt04FKGQp|1HmLvO>_ktCNvH=ee+qHD1!0X%I@&^Uu3?rumSY_e3}hAHP=ixvST} z4TR)sOMh-!WMi7nZ0mCT0so!T#m-0T7mjEAjs`YUeyc;aLE8Du#3p+%!~1~K;gjrs z`@ZlU*rCOKttq=j=i00f%kOPs4vMdt&)pnBX4QT8Ln;D4SV7$NSAQj4PS92PUu#)! z7f?L!z)@M7^;_a-+Yu;(lX2R)ARpq+AtKd3AKnWZyn*`J;9pT zDDZ21Jytqa7;R;RI(eLiH~h?}O}yuxNECeLoXD0QYb+{f_~@bD64|WKSU1D9j{;hU|97gTwelFrh&eXhICEw~ZeHawT*rVV88Zmq`Qcr_w|&Epyo1#2sF z?QsBiwBCoQEcZz(GB}&F?kA61qD*(%_mL_t7JmpOs(HV>;cQluI1b^8Vv``ep#Kcudg+g2RFWww1Y z-yXQDm@;SWEMR^N-50J~%BoqcEbR&(7Qf5gViGrjGtn9?1mpFu1cUz0ug4VwTghJ{ z_PM-jJx*!q78y6~{l`wNEWS2XpOBSHxh!o2$a{8GM>k|fwHxp{6@#FUda-eemYBEi z;&f~&n!FrlTn1t0ly7^JkhdqD%_MD05J75LSd>zcjO)}Wc@|su54VEKy>$yv1Pf0VmTA>8cY|lCuNAyil2y!Yfn$2-q-Hz-dwRI zrsSAuF};1hMoD4F{P8LI^RVENRI z+|InLLpaZxJn7vGGTnH7v+o*Rt4?sM-2fk1ptzCl>DKi~wS#R<9tPBQKQ+DTtsMx7@8 zaCh`YpLn$3cX7aY|DS?DSis)*KmH${#R9(We+w`z^8y%8`;+Px2n43RlMDj0gFsBN zG%f-F9)Fkqbzro@k?y3K)`RxHDueXIc>dkx3ShmlG+h_K+I!NF1MtB*o-~3$5D{9k zp#5`LAQ1SgFf%jL@C@2t1{unCqJY@#Ju%)M_LxB0WL6L(jwV3?tULO|qXq3SdN5r$ zJ?*L&?ha_*3m_Io#mf~BOD@R%IjiSDH|8O}D;C7p|D%1W2*rM_Evx{Mb!4rZIzYK(kiW~YTX zv=i`&+rS?mt@V`K=?MClNK31R#E_#lrlErw+_D*MA*+m=^(ch;XM<0Sen9fm$_Une z`j!;4jyV6BkNsMk_dmEz8YM`itJjvn94SN1`F!aHq)ipq*Q~if=SX{u+?gjOAsh!R zJZDAn+bki!bjg)Pbeb2P+}A2@3U3g@1XEZ_uB1-&!`b_HE=2q^p|C37F^5QpNOtJ6 z1Ut`N+oX$Sl`2WWq9)caW^o)%;i=vYQpe5gs|KacPFm`Qo4-v(3XKH6eIP==G3BlK z+a~HT^X*UNB9>40U#+n7G=F60)|7kq&aH*+7**hf{#2ujKXzw+tI+3aRCVR3vBQ1- z0D&%28dkGqc}9b0ybT8$7m)`O){c}<>xAAmn?#+O37Qy6;HLjh zsg;OwcJ^Y**LD=1>49kk1~zupfBX_9E+Ji<7ZmY+VYb#GRXH*Et1tfZvB<6|(-qXN z$<9+30nOwp{bSOEwsvZh&-VPDVWi*K*`EoNJQ#U_IzXapqi#yQjpd^%nl`xXj2CeR z)UXk{o0HG0Ta&#e2dWqcomUSpzcUC0w~Rj#8_LM+=V1B{+!=lKwNxR4pUtE7Mlm&-~ z8_Xoa?g$4|e6(7p6YTF8A6)Vrx@!eYg!o#PcYhO0fGR8y!-8yM-kf=W5QxxY%C)|xRY>}Qfhyt{LOrNL{9TgjCgjwDPP; za3x&Vjp1NrcJ$|>vA75lEpwcmzRRHfTa4pT=!L87bXVZ%#$43of^QE3$01AEGt2!% z_!1{(YPrbLXNSD$&OQReJw|p(*6f16d#tx~>^%`XAmHHiENfN6*6_3y5PqafoqCSd zze91)6s18-z0p*-RSIhwSltTX$HV-2Mffb34x%=C%)C-U^Yjm2R}AKuxpSMPua%xS+bz3e>a60^5?%aMj+f#ApMu zMqHP`CCy4rR|>__Wx77jNWM=KvYPpfbvSNdF6XBH!@+RH-vw*rLdXs2wVYxcR1Rqg zA?CCM6k4nrBOtaDD1rFE6s1NCiMz@KFaB2appo{ZBAuA zhR_?!3Upb`3k-V_S=Ma^(Fn6XRyn`4SDvLzGBdI>nZ)qNLkC^eV3dZ$Mdj$JhT;Uc zTvbnqn(ZM*MW-g6v#SPG3~_l^9gC~-d$cXr;EuJ?Dt?iDA^Q{XI{ymKx=IEH!mB6P z$p&f^iO9N1IH+y8`%0~gZ3N;L7Ng9MydBmo_;z%iTA$Wr@Jfb69=66xbnKw)BDEo9fuZ|= zBK}dRjyNt9ufd#5XD8kRE^1v`{Dbe!1odctF|+a>)aC6p8&xZWCH*4LYRX8W3e zVe}!+8dvgFK=ZeAp8>2wSrGX>ZMN3Xg9l7*dbDk}VH97=tFBS>sV<*9Y=NMTR-WOn z6;nmKr>NX*E20}(?4aTUA^}~T-mO3UMnbiCDL>vhXZY#qX5?Ye3iY+TZgN#!?*8OE z*Q3no9L2rV=F-6;8LQ3y9?AP!8GD85B_*wO?FE_+1l(3sx2V^%my+ylE&_8Cjqfv( zj@Oo75ZWAviXS8$i-6Wjrvtc@lxN~(zF;sZ4qsZ+i96e}30xfu%DQtxDvC2U?CEMq MeH(b0sT?@*Ux_{N6#xJL literal 0 HcmV?d00001 diff --git a/doc/mod/ipcalc.d/ipcalc.avif b/doc/mod/ipcalc.d/ipcalc.avif deleted file mode 100644 index fe726e8c323ea28cda327d70c16ad80fbfcdac4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1729 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 k<~uq}Z88kVkt#Vo>;1CtQ!d"broadcast"); -![IPCalcReturn](ipcalc.d/ipcalcreturn.avif) +![IPCalcReturn](ipcalc.d/02-ipcalcreturn.avif) --- [⬅️ Go back to main README](../../README.md) From 77dc0565a9a93004f28647b3315eba5ae92625ce Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 15:17:54 +0100 Subject: [PATCH 843/893] doc/mod/inspectvar: update screenshot, with terminal window --- doc/mod/inspectvar.d/01-inspectvar.avif | Bin 0 -> 4232 bytes doc/mod/inspectvar.d/inspectvar.avif | Bin 2838 -> 0 bytes doc/mod/inspectvar.md | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 doc/mod/inspectvar.d/01-inspectvar.avif delete mode 100644 doc/mod/inspectvar.d/inspectvar.avif diff --git a/doc/mod/inspectvar.d/01-inspectvar.avif b/doc/mod/inspectvar.d/01-inspectvar.avif new file mode 100644 index 0000000000000000000000000000000000000000..1be1358008388ec650c82e8974859237a0a5846f GIT binary patch literal 4232 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 literal 0 HcmV?d00001 diff --git a/doc/mod/inspectvar.d/inspectvar.avif b/doc/mod/inspectvar.d/inspectvar.avif deleted file mode 100644 index f1da1d4d1bd2685dd596c851d4100623463bd455..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2838 zcmXv|2{_d47yXTW%QC2>v6SphWLNe*6J&+D8~SV8$hj7L?YZ|kqAe(+gh?(RA~$8 z>hE~!QA-@|;_3T;3IHgCv;Tkm6g?46|E*z1A^eelJrK1EAUwUDPbXaf08!s*2S679 zfccQh#SsXvzqkK77pQ|P&1smLaSV`=)$#W9{(JHf0_BUM>c$9^vo{ra5Pm4v(;xuQ zicsS`RKkfuJVE?bn3$NT$mSRzs}m)BssP;1-k!c*&Yn-Go6i6YkyPm%0)=!u^{7St z7#)ZPO$PuhbVwIRe=xwpqU?5EIh%2Db>Og8N202z5%U-a;LsPMExJvXSJ@%GX9D+ud8gu^aXs>`Rv?+ z`OZ|ldsVhiiQym9^WtLQA5}9p3mOS6?tySv5_d9SlX4C0f<8gmeg03Tb8^c2`2`gY zeW7|5g8;;kV|2OekJoMO<~uR_2c$Z~VGe~Qz=pugz7+ZqsMmDw@3(!DJTY%}t9JHa zLscqd>0~qos#lV9;|>Wa_WR1Zr|p&dgzxS}-|JB~G=Fa9q%Wso{f>j z3>0+V=;J~2gqpY9K0tsDFk4|#=NCjaBQ)<`nfZ+W(_pYjA4H3vn*ZmOHVZxoyt?E% z7c(?9KGm(Vf-AO5&v(~Sj3z0WS64vd_qe(zoktja;%XQV1B#yy=UlnsV z?pG}-ue~)aIesja+la^-{mV`i43Erbe9jhq|5>=3{U`t39`nZaN5_*> z0KgXGz)j0lt>pf%fyQ(QW}r2&s!SOlzqgHOHp?xJkOmdJXL{ zL=!)v>wR9w$9bQA;okJsp6V=FhwYN+ZwX~Z7yJLE;OqD8qccCdzBuIZ-?nni@1zY2 z!daX{bZS|0FbxS6w4@;Q(Glxxg^S@kALfu^II&|1#YG3cuzw%DH+h0gJ3f<%$nRG8 znkkb^$aCG|>sk1%R7X+QMOKJb@zz-Bca#-ux=9w`cj(i?@}>_^+E zaLQ)Dwv(hPnUzlJEVPESc?NO}N3xZC=~ducF7ihU6lh14Y0u*2Czif6sxHou9xm*A zO7;?O&joz5S^g|fE@0pBfs;3K>lOz#FC_=O>F&HkPO-B{#1J%{MuBri}uSTo8$kW*{t<16d6n*l;j{>E46@3Q;D1y zqy5glk@jx$(Ax6|{f1}Oel;5kT;|gI(5T4E*oYS9$5-E|g5BqMSemg0s0}keXQp>^ z7p!&6RUbPlkd}rS>L$|y zeR{{0^^~e-gb2fywS33{n)Vs4)TGA#lEp+p>*o>51`DIjBju%g3P~jPC^Fpo(hbcd zhl-A8zWUb7UEkmVQxUiN$V2E_j|bn?_vX9M*$*$`UAYX)L+Up|e(*z^3@(+pB%UqH z`5qr7b#y(ye=e~w2?Y_&EQP&>B~IwF3ba{mXu711e;5mPpEkl-!+T9EzjJS)@+L>h zhxZe+QnO)t#yEEZvrPsMYmEuEl{gXSnTq@DLc0pX{&pTtCa2Ex8AVply2kEDD<&pQKijPBdHS<@T(06-8Q>QAq=&2JqUIkBV_`>p=}^Pt!C3~i z;pi9f{xn4btK3=R_9c2*T|LLa>B;OFX3F%~-d{sr@+oTAT#*1$Hq-Uhd`nNrhG^+n zBT+S_SxHRJ(>;W@_ag*mKdH(piMUEjf19-zC7Adjpy*cI05kVYlnT4KuNoR+rYlJU@djbj=^Si?9GFg0(tKC|A{A`ctRTie49?)nJ){HS8`J#GU$jBB zp-U_r_Oo~3JMfLvVD^7>Hune4EoXiNJB-LAH6|VKN~l)Pzf5NpuPZ8Suj1sle#@b2 z94n7gkfh*wclSg^=G{tx(XajydBOuNxl7E3Uv5}WrkY&LHsV38RK9F@<&Mr#)9W}J zx|Lx?NS1mo&wc|L_-4XOYNp?;{y>WbhBCAv@-x})g39je=z0Fxqce>$8!bIw)?dKl zH#lS#e!G2t7rWd3(L{9-T$IIn^hvH`bo%v%4-Ghm>4e^jV+n^$o-c&cHgo1$DFjI{ zkqR|SrCc#we7AGGO|-w^L}PpJ;5oLMPnwt3^FdIBCYf{^aB>}9!czq2=9d!dZxD??;rS}wi#l&bWbwB%g67))sI(EnVMg&a zY#f|cg&V9EPcfW|E2WWHZ)?m@4I%} zVz?UaWWUTirpdQp3IWNmW@5LrZ`aNTh{tF_yCvq`pw)&~8CTxPw|ZgSE_I25rLiRF zgbJ=()=FN_c8K4HppnVN_T#+n#rU&*XdU|=zng$JIX8xDZIz^*tt0K4V04>dV&K{#>STeecd#q09BP>GV(aJeYIKPeQB;<{ Wpi-Ml?@^$dcvS}^Lq&v)tok3qyD;GZ diff --git a/doc/mod/inspectvar.md b/doc/mod/inspectvar.md index 7daba15..e5c5629 100644 --- a/doc/mod/inspectvar.md +++ b/doc/mod/inspectvar.md @@ -33,7 +33,7 @@ Call the function `$InspectVar` with a variable as parameter: $InspectVar $ModeButton; -![InspectVar](inspectvar.d/inspectvar.avif) +![InspectVar](inspectvar.d/01-inspectvar.avif) --- [⬅️ Go back to main README](../../README.md) From 2f4e83990a4133607a80ae64cbc1b6deaf975a2a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 15:20:44 +0100 Subject: [PATCH 844/893] doc/mod/scriptrunonce: update screenshot, with terminal window --- doc/mod/scriptrunonce.d/01-scriptrunonce.avif | Bin 0 -> 3072 bytes doc/mod/scriptrunonce.d/scriptrunonce.avif | Bin 2356 -> 0 bytes doc/mod/scriptrunonce.md | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 doc/mod/scriptrunonce.d/01-scriptrunonce.avif delete mode 100644 doc/mod/scriptrunonce.d/scriptrunonce.avif diff --git a/doc/mod/scriptrunonce.d/01-scriptrunonce.avif b/doc/mod/scriptrunonce.d/01-scriptrunonce.avif new file mode 100644 index 0000000000000000000000000000000000000000..461c3981d0e2703ada931454c5c99030b35f50de GIT binary patch literal 3072 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 literal 0 HcmV?d00001 diff --git a/doc/mod/scriptrunonce.d/scriptrunonce.avif b/doc/mod/scriptrunonce.d/scriptrunonce.avif deleted file mode 100644 index 27ccd41fa5541090b5c12e9f50c653e14f6f0e47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2356 zcmXv|2|Uw{8(-#_l4~mW5#?%*5JGb2%6%(iuHTFeGs+RuYZ3`_i~`+vL1ul z2=u{v9%&4d@%KiB{J#W&FaQGkUwwoq!0W#?oEQKb_*Xl|$f5uWjX3HIL7-y{KgytE zf*=rt5g-`=2>N^buOi53e3*`g88e zuoNTNGlClfL;!yo2n51F4o{r2L7eyz1A-#ZsE{B8DuS{3B#1SZL7f3Gfu2Vi!x)b- zA7hGVW_)!v(AyKs3p&oOaqiV+l(+??R^P_BsTlw>#_cIymEbt z71-@Zoc#ymR1)q_A60I`qe;?AMmp?3$&q#<0c;fca`CB~LZ?%2yyHmSp=iRtY{)0! zzT*X6D`9f$*SD4*IkN04E}UZQQEUiLJ_?#uXcPFu_u3@Fwc3Kra#7|h*2q|9}OJalfNELedTbgmGst3eUn3^@E zIxCitVYr{L_D*F5WUCHXwVoga6o@RuvivNv)Fy8F)DBb*ch2e%6 zV=dRH!YZrvw@z5Ske<{wThC-kOY0@C9d9=gAcxF`G)9ArI(!Cv5+brXxjnQ|+&N6D`{AA~;F_FhlG}j}{ zR;PVDD8xYQcQ`bs-*2;y$o_@Zu5dV0V{awKIfdhOokk78AwEFzh+_g~WFhzpCIW~?|-FT+O0O9S~Q zLiI*nqB*PGTALEvU2Wjahk@W3p_P*=@@?yH+ZS~9WZC5?J?$a(*N1gX7h&a3-x4LC zwH>0{*!XxVxaMR&Z8z>Hk6xp>oO3-dF*cziuoJN9CEb2}sP@;E-$PBU@K(#u3i7lE zgK0&rPnqe=cQz|0?cDt;d?5Fs-8+2!3Q#UoIMGDvW()LyII-z>xykvZf+!da%elr_5y<3`jw2( z56eWv5LCimK4?~iD5yPP=UZQ@ns!144#)UO{@6_4K0DWmPqf z;aH1%oWzeRuDlaGC8kLZIk4MAZIjyRaW6qsS@QK34^16kC(cA1_e()eKr&(Y&qn_+ zAv?oa*=#DoSxU;&(Xm8`jCWY%31q(9GoBYBKJqF`Mlm8Pjyd=TbJDXgWAyibfe+|m-OLCXr}+Ad}@|?)x>Gp zSMi637MY^l*b9;+uhX(=apo^|@XVd#BjW`=x9nP)bp22Jb1bcDR5y&K2*c;ft4@5W z=_tcYx(qgJJQ8>vu{Y8csln2pKpzrL+wK-EDDk)j-ZG^hywI>i|BbQ6`RG1vZ zeMRaDaUZHy4`#+m&Yn?z^*M6Qq|WtP^KO@FJ6r!) zkq42`82eK?pS~DpzPHUq5Zl_(c_Z7EmlK?eBXj2OrJTMKc!l2UGyi??^6gqIdCk66 zGyVY_h;HgtiHu98bvy+~i^D&VyUCUdb*@u!U};Y91aDa$DBADNj9j!Lncuu8oAZfP znAvIS^EIPcb-UGc=n&YwH|U>F3%THTR3n@KdQ^g|Rq+k-YG-xqgsSnOhN-qyp0?SG z!wh0N4+=VG$!@*n2-yat^AWt%W$R0i=3IV`XCbL9v3b^HufbYgfiK)++F6Or!B3iR KdXs}{75@h@^+E~& diff --git a/doc/mod/scriptrunonce.md b/doc/mod/scriptrunonce.md index 1fbb697..db861bb 100644 --- a/doc/mod/scriptrunonce.md +++ b/doc/mod/scriptrunonce.md @@ -50,7 +50,7 @@ The function `$ScriptRunOnce` expects an URL (or name if $ScriptRunOnce https://rsc.eworm.de/main/doc/mod/scriptrunonce.d/hello-world.rsc; -![ScriptRunOnce](scriptrunonce.d/scriptrunonce.avif) +![ScriptRunOnce](scriptrunonce.d/01-scriptrunonce.avif) Giving multiple scripts is possible, separated by comma. From e49f68c1f23a0f154ab578e8d3db7860ba1d0b30 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 15:25:01 +0100 Subject: [PATCH 845/893] doc/mod/notification-matrix: update screenshots, with terminal window --- .../01-authenticate.avif | Bin 3870 -> 2672 bytes .../notification-matrix.d/02-join-room.avif | Bin 3745 -> 2604 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/mod/notification-matrix.d/01-authenticate.avif b/doc/mod/notification-matrix.d/01-authenticate.avif index b897943b1fc7d8c7c0ac6a9f225733d24dff9e37..d5b80256da1b77fd66351b3c19654a9427d70135 100644 GIT binary patch delta 2522 zcmV<02_^QP9`F>9A`SrSZDn*}000000000XkuV%P000004sdC7Z2$lO000310016o zY;R)#0000)000310RR910RR926951ST>t<8C~0YKW&i*H0004zoE?$u90e!<0035# z4FO1h31w|$VRRAz3I;eOvU;o%GSCuCWCGZ3EA=XQAkXW?=cr#3Gpv5b%Xdf$v0xN= zx{nP@p8!1}o)lZi$Z#oD#pwsMPJxhz{sBqI!*~b05sAoy*ofK&JF`@)GLFldBv`So zQI$7%G89AEf}$~w2G#{;gByWVE~P;dg)_Z>5b4=a`$?qT|?>gQmUIWoi31ftQj#w z+7}%A%iBR&Fi^KV?PWJ9y=lNiyfxB9^`zbTaQ*%S3^^3Rt*q&m6@WeWPpBcyDuB-1 z!MB4@Il(a(^-_x^!Pfq#m~;~$w9iO?l#uTKDALSOn$X0VZd>CzS^H+8$L&=%T1cto zUbRr+*wZe`S;Lq8FCy76((|c4Dmi=ZMC*|_oRB79*p8b0R3@#Q6qxo=6jh=DPHGhd zN%;%pu}NLkp4wT~_g6#zk#yMQWAg;rT+m$uo~_Mkj9-{?;q$N`(Buc;A6TV-8TQ-0 zW#pJRH=YDD+A|-rIRl2R*)u#l(pxvCn4GaHd+aK;d)rZ~nPN`fLOInq>~?O5K~Fkv zEcmCKh(1?gBr;mfTB-zER0NWIhwp>ZbIrr-)Y(vz!RnuU0NAB>et+jqeRQ9j9I(_o zh-oE)_jkZgtm~#5OWZLh{Vwl+EL<^Ey8Xop49EOU{2=^xslOQKwY^E9v-S#V0)O@$ zTJXLphr626y8aPhV$2!j)?B*b6*E(ekF;-Km=Bh};Ea1#BR3^94Epyx=}WX}{;=Fm zC$8hK&1?cm*ZO3~_9Im|;k1;@eE1BI(ol z8kr-E8WdWueQv6$;gt^y2C4>z3)*$JX~I)*hg@$g(s{3n4B^oSa;DIm9d8~?Z>>Fq z9cVns)gR8mVE5U9(?*Ru4s`g&tNRY5~UDw&*jU4SoKmZc)hN_9eUsCV*+Bm0B6` zh2$;~R5!qa1EvCDR}cNr!H6&zaz!hD@KaN&@@(1$PfV<7*5TA3qwRV*zctJ*(dWLI zD5vC6NV{y@OLAe(7jFeJM1j!i@zz8II7u}dVnTzr#<;Yx2Gi1iSH~CMWUc${Q;GR_ zR%+t{824#u=@S2ccD7vQf@$x}8iclAZ^ctf8cke3C;Di?PTI(zxdk3j6uUR@0tT58 z2w{ifDy4qSD7xcm(CEslhAVk0ceX&UhT5mk-76V`;aXs| z3abNS;at4MlnT>-jceRG1lL);;z=K-nc%+|RyS((*w2iXfh|Y|fOJbQlg?IGobqEm z%=4kzaLE=f|D7uKKU=BLHi`*t$=`~B(Eglwp=S8#I(F4@KZ3`lIYQzM8tX(#Bm3MOd6dk5f^o*P4Odsb->BEBSvUWS;HRC)o4lU+{sQ z&^SZ(&C8vq%LCei5^YvQ| z-5oeOnBjX=$u~SxW25(56~9Hd=Znpbu;H5bt-e%xTa$s&LkyU9lgFP(-3Yhq}(lx zDtQ2ED*S-Bkchef%f_h3__W58skw=IY2VpaS5P%%_&9*wMs|B%5Z180h$cOL z&w+15+&}S@RMC61xS>T1!X0!@g*xU3<(FJ%iwJ~#4`(mw&!KF^cLlsN3AiZc-+t8m zF{%N=C$S(n?Nih9`XOn36ZNUDWji70hUa=;ov3FmkD@gZ1+~ecw>0k?4O&*eL;x%1?S|DVl=A k8d0_j@^cat>R5mlI~Ha{vyTR7UpikYnBGl(YzzrTa1N}~U;qFB literal 3870 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 U730Uad4+?KN3=Qa{QeI9Kj5%V`v3p{ diff --git a/doc/mod/notification-matrix.d/02-join-room.avif b/doc/mod/notification-matrix.d/02-join-room.avif index ad99ffde8e4a5885c1c44d361beeb4927fd694d3..20c4e799a41fb361dc107f77dcae49ca26214ca8 100644 GIT binary patch delta 2454 zcmV;H32FAB9jp|PA`SrSZDn*}000000000XkuV%P000004sdC7Z2$lO000310016o zY;R)#0000)000310RR910RR926951S82|tPC~0YKW&i*H0004zoE?$u90e!<0035# z4FO1h2_bD{VRRAz3I;eOvU;o%GK>;TWCGZ3EA=XQAkXW?=cr#3Gpv5b%Xdf$v0xN= zx{nP@p8!1}o)lZi$Z#oD#pwsMPJxhz{sBqI!*~b05sAoy*ofK&JF`@)GLFldBv`So zQI$7%G89AEf}$~w2G#{;gByWVE~P;dg)_Z>5b4=a`$?q9LVuKOd&HWzDqHB9gCe%K!H}Y|Llb#ZrO#-W%@Y4alptY&RtTBCB)>i=pi z-aA#k2Jx6hIT4$H*LiNgQrf}19d|aM?8Q&b8 zb#Dw4ZV{N~n5J!6U0Nl2xbWQY&?iRH%>J0{Up2^E5y~|B0;}4~(n9cM3cPrZ=?#K_?OyzJDxw44JV?x>L7Yr#;RO2jb>IPqyZ`?Ut! zAk7DEL=T3Rekhk|eAp6nOd0!s0kJM&Ca0j1+Xy#N#V#h1^@<_pku<`WN5Gtqw$!d} z)dG@5X7(VetHL2*2pvop9hZ2A1u$L)|J0rkLc{+Yd`MD4ZS_F-m!Q<-J;eli2c43lGhI zdD?|bhqEmQYW6J<7XH&Zanf1jQg)bTzYiAglpYZ#^b;t%!)N%9!@U%K>pbINXU!Z0 z++P%a$8?foyFIctVkRJ>VCfSuATllOUs1d5O>;3Y|Gw{y z8sB^gEh}PNN+S%zr-I3U7n;h;a_R4T4;eeQW-oH_UKh%oF8ne94TOdwKEo(acRH54 zNeR`{tz-o<$d2PCU4~AeQW>3A4&!KJDH@Ous8ixn82lB7ZnT3{>#Qg)SFdc9json< zBA_;lF3Gv-DM_~W3_&q>V&=kjNH=CaFwyjo;W02^Hdr?zmR z0TboWvwp`bwQbp{mes}O{-{f{CiJ6^cphMN6aC~iV3i;b==^vX4GV@z<+#PXtFr8{ zix2rgyNlD+7_CLEfmMRywa>U*Hx@TEre9Rzjx2Rz1x{|FJ{epP4GsL zGFnNHaHjUw3h)do93W|&vN?Ax|Bc4$?RSH%j>dobtB( z3QsE5VbY60QPORRlk2Q;Nz{uiBDE$GXOcoA-uyNIU}G?PM|S8&AdnRdX_c{&l0flG zmC4MDlh2jOVZT%>Pzat?s$qtmx_4>o5W-1xKvA> z8udD^Wh!uhZ;z1r$3BJ+_De##>~Ie0a0ZbW;8r!%S~GB-&|ObT>#^@f{_R~|eVW@= zCuMhbPd3#RTqq-M8Kw_O z5QKu;N_MTMlR$X^(+wy^HH=;+@1ie% zZ`6*w3>H)^R!pU?_*MnaCvHvuH7a4l*sg}}N>8rV*vDFS0jO20Sd=(zD7kTgcWGn{ zz=iSH@`KLPnD@WglaBb@)Tp}&_Ei{IF+X%g zW>3noDQNEmmmCRrH{TjveB=T#L!tGimM9tE5#;SAXg#-ei3bmvATnlQ3IIj(_p)D# Uq-Y@J-%`9eS6JN$d7K_Pho`QO2><{9 literal 3745 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 K&!ZvF6aNEFUlig1 From 699be25b64a8b67a99786387c8b0407f7e939590 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 17:05:46 +0100 Subject: [PATCH 846/893] general/clipboard: use textContent... ... and avoid having html entity encoded characters in clipboard. --- general/clipboard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/general/clipboard.js b/general/clipboard.js index 30c3134..cbcfa4a 100644 --- a/general/clipboard.js +++ b/general/clipboard.js @@ -1,7 +1,7 @@ /* copy code to clipboard */ function CopyToClipboard(element) { element.style.filter = 'invert(1)'; - navigator.clipboard.writeText(element.firstElementChild.innerHTML); + navigator.clipboard.writeText(element.firstElementChild.textContent); setTimeout(function() { element.style.filter = 'invert(0)'; }, 100); From 94514a7c75badd034c052d566f15a530243b6b9f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 25 Nov 2025 10:35:34 +0100 Subject: [PATCH 847/893] doc/check-routeros-update: update the forum link --- doc/check-routeros-update.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/check-routeros-update.md b/doc/check-routeros-update.md index a45e075..09458c1 100644 --- a/doc/check-routeros-update.md +++ b/doc/check-routeros-update.md @@ -31,7 +31,7 @@ automatically is supported. > of view. At the same time it can be source of serve breakage. So test > versions in lab and read > [changelog ↗️](https://mikrotik.com/download/changelogs/) and -> [forum ↗️](https://forum.mikrotik.com/viewforum.php?f=21) before deploying +> [forum ↗️](https://forum.mikrotik.com/c/announcements/5) before deploying > to your production environment! Automatic updates should be handled > with care! From ea9e843ae95b7a4cc64bb504a135d7a420bf9c5c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 22:07:00 +0100 Subject: [PATCH 848/893] contrib/html: add a class for code... ... and make sure the notification generator does not suffer strange styles. --- contrib/html.sh | 2 +- general/style.css | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/contrib/html.sh b/contrib/html.sh index 098ba46..03eba23 100755 --- a/contrib/html.sh +++ b/contrib/html.sh @@ -14,7 +14,7 @@ markdown -f toc,idanchor "${1}" | sed \ -e 's/href="\([-_\./[:alnum:]]*\)\.md\(#[-[:alnum:]]*\)\?"/href="\1.html\2"/g' \ -e '/| id="\L\1">|' \ -e '//s|pre|pre onclick="CopyToClipboard(this)"|g' \ + -e '/^
/s|pre|pre class="code" onclick="CopyToClipboard(this)"|g' \
 	-e '/The above link may be broken on code hosting sites/s|blockquote|blockquote style="display: none;"|'
 
 sed \
diff --git a/general/style.css b/general/style.css
index 191c0f6..6f75803 100644
--- a/general/style.css
+++ b/general/style.css
@@ -58,6 +58,8 @@ p.hint {
 pre {
   font-family: fira-mono, monospace;
   white-space: pre-wrap;
+}
+pre.code {
   background-color: #f8f8f8;
   border: 1px solid #ccc;
   overflow: auto;
@@ -69,7 +71,7 @@ pre code {
   padding: 0;
   border: 0;
 }
-pre::before {
+pre.code::before {
   content: "📋 Copy!";
   float: right;
   border: 1px solid #ccc;

From ca487376d6ef71302a1c15446ae178e12ac7beee Mon Sep 17 00:00:00 2001
From: Christian Hesse 
Date: Thu, 20 Nov 2025 22:16:40 +0100
Subject: [PATCH 849/893] contrib/notification: use rsc.eworm.de for default
 link

---
 contrib/notification.html | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/contrib/notification.html b/contrib/notification.html
index 7a6ada7..baa659c 100644
--- a/contrib/notification.html
+++ b/contrib/notification.html
@@ -31,7 +31,7 @@ instead.

[MikroTik] ℹ️ Subject

Message
- +

⏰ This message was queued since 2025-10-29 16:06:18 and may be obsolete.

✂️ The message was too long and has been truncated, cut off 13%!

@@ -40,7 +40,7 @@ instead.

Hostname:

Subject:

Message:

-

Show link:

+

Show link:

Queued since

Cut-off with percent

From d4979146f99a9171d71d50c0940e2995d7b83fa3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 22:19:53 +0100 Subject: [PATCH 850/893] contrib/notification: disable the border-radius for logo --- general/style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/general/style.css b/general/style.css index 6f75803..c6b279b 100644 --- a/general/style.css +++ b/general/style.css @@ -41,7 +41,7 @@ div.content { } img.logo { float: left; - border-radius: 50%; + /* border-radius: 50%; */ } p.foot { color: #777; From 544e8094de540fb9953fa5f0d2eb4f0d89ba7eb5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Nov 2025 22:35:39 +0100 Subject: [PATCH 851/893] contrib/notification: increase font size for heading --- general/style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/general/style.css b/general/style.css index c6b279b..25569bb 100644 --- a/general/style.css +++ b/general/style.css @@ -48,6 +48,7 @@ p.foot { text-align: center; } p.heading { + font-size: 120%; margin: 0px; font-weight: bold; text-decoration: underline; From 1f6c43d5ce336b611d741549acba1413551548d0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 24 Nov 2025 12:19:09 +0100 Subject: [PATCH 852/893] check-certificates: show lock-with-ink-pen symbol in notification... ... also for warning, but of course keep the warning sign. --- check-certificates.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 3300bee..93641ee 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -231,7 +231,7 @@ :local State [ $IfThenElse (($CertVal->"expired") = true) "expired" "is about to expire" ]; $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "warning-sign" ] . "Certificate warning: " . ($CertVal->"name")); \ + subject=([ $SymbolForNotification "lock-with-ink-pen,warning-sign" ] . "Certificate warning: " . ($CertVal->"name")); \ message=("A certificate on " . $Identity . " " . $State . ".\n\n" . [ $FormatInfo $Cert ]) }); $LogPrint info $ScriptName ("The certificate '" . ($CertVal->"name") . "' " . $State . \ ", it is invalid after " . ($CertVal->"invalid-after") . "."); From 1ac0147fce7c0f7a31e4b2b1d802e8daf4d6f1b0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 24 Nov 2025 13:17:27 +0100 Subject: [PATCH 853/893] sms-forward: mark every message with an envelope --- sms-forward.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sms-forward.rsc b/sms-forward.rsc index feb640e..161ae6b 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -68,8 +68,8 @@ $LogPrint warning $ScriptName ("Failed to remove message: " . $Err); } } else={ - :set Messages ($Messages . "\n\nOn " . $SmsVal->"timestamp" . \ - " type " . $SmsVal->"type" . ":\n" . $SmsVal->"message"); + :set Messages ($Messages . "\n\n" . [ $SymbolForNotification "incoming-envelope" ] . \ + "On " . $SmsVal->"timestamp" . " type " . $SmsVal->"type" . ":\n" . $SmsVal->"message"); :foreach Hook in=$SmsForwardHooks do={ :if ($Phone~($Hook->"allowed-number") && ($SmsVal->"message")~($Hook->"match")) do={ :if ([ $ValidateSyntax ($Hook->"command") ] = true) do={ From 678fc3307e9858f7ada84f6bbf0264d9b6758cb2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 25 Nov 2025 09:50:27 +0100 Subject: [PATCH 854/893] general/style: clear floating on hr --- general/style.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/general/style.css b/general/style.css index 25569bb..3d08f1d 100644 --- a/general/style.css +++ b/general/style.css @@ -39,6 +39,9 @@ div.notification { div.content { padding-left: 60px; } +hr { + clear: both; +} img.logo { float: left; /* border-radius: 50%; */ From bc174d7f1ffab55832d558ca78583a58dcb92ea2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 25 Nov 2025 09:56:40 +0100 Subject: [PATCH 855/893] general/style: add a margin to notification when floating --- general/style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/general/style.css b/general/style.css index 3d08f1d..c3e8690 100644 --- a/general/style.css +++ b/general/style.css @@ -103,5 +103,6 @@ td.head .bottom { } div.notification { float: right; + margin: 10px; } } From 84c49c0f7e5710a50bcf047269cc021c8c4abf04 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 21 Nov 2025 23:41:23 +0100 Subject: [PATCH 856/893] README: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit README.d/notification-news-and-changes.avif ----- >8 ----- [rsc] 📌️ News and configuration changes The configuration version on thyone increased to 138, current configuration may need modification. Please review and update global-config-overlay, then re-run global-config. Changes: 📌️ Added support to send notifications via Gotify (gotify.net). 📌️ RouterOS 7.19 is suffering an issue with certificate store. Fixing trust state for all certificates... ----- >8 ----- --- README.d/notification-news-and-changes.avif | Bin 14861 -> 8680 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/README.d/notification-news-and-changes.avif b/README.d/notification-news-and-changes.avif index d91b8a085b061f256a8b69d900cae6894157034d..d2e8aa7fd896c631b4d0ffeb9e9878c66eb28f00 100644 GIT binary patch delta 8523 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 Q)r+`k(1qTlNY7eqmV!Z From 9ef3ba5479fca6a59bf1e825ca5c74c1d3e408bc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 21 Nov 2025 23:36:36 +0100 Subject: [PATCH 857/893] doc/backup-cloud: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/backup-cloud.d/notification.avif ----- >8 ----- [rsc] 💾️☁️ Cloud backup Uploaded backup for rsc to cloud. Hostname: rsc Hardware: Board: hAP ax^2 Arch: arm64 Model: C52iG-5HaxD2HaxD Serial: HEG08Q4FT32 License: level 4 RouterOS: Channel: stable Installed: 7.20.4 RouterOS-Scripts: Commit: main/3287/699be25b Version: 138 Name: cloud-20251124-092255 Size: 180kiB Download key: lteX51vlEnrV4OSXfUngu8d ----- >8 ----- --- doc/backup-cloud.d/notification.avif | Bin 11629 -> 13346 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/backup-cloud.d/notification.avif b/doc/backup-cloud.d/notification.avif index e533908f8d90b0340e59488c269e70775649b218..5918a6236f526ea921ec5b43fd534b10c826a257 100644 GIT binary patch delta 13225 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 delta 11517 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 Date: Fri, 21 Nov 2025 23:37:01 +0100 Subject: [PATCH 858/893] doc/backup-upload: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/backup-upload.d/notification.avif ----- >8 ----- [rsc] 💾️⬆️ Backup & Config upload Backup and config export upload for rsc. Hostname: rsc Hardware: Board: hAP ax^2 Arch: arm64 Model: C52iG-5HaxD2HaxD Serial: HEG08Q4FT32 License: level 4 RouterOS: Channel: stable Installed: 7.20.4 RouterOS-Scripts: Commit: main/3287/699be25b Version: 138 Backup file: name: rsc-eworm-de.backup size: 372kiB Export file: name: rsc-eworm-de.rsc size: 377kiB Config file: name: rsc-eworm-de.conf size: 3.26kiB ----- >8 ----- --- doc/backup-upload.d/notification.avif | Bin 11776 -> 15905 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/backup-upload.d/notification.avif b/doc/backup-upload.d/notification.avif index 83cfb18aabeb4cf7725154fd08a50663458d7863..3bcc1f4d7d51213235a240b7e1bf674ba4d6db73 100644 GIT binary patch delta 15806 zcmV;vJwd{NT%mlBBMs|qWprTx00000001G8FdUInC~SQy}x+u@Qgm>&ty}-0z!2k*ev?UAd8T%3;j9F} z*09LEL9hFhH<+Rx6-(s|x_H!4=+M_hlKSjs&M7LJh5;}0yDsDN(`WDl40*paxPJl5 zzp$fb%%wmYT4S%X>gSqi{)QH&|Nrkt`|heD!6C$YV?&OQilv67L0~Z)$`ENCv8NK7 zkE*v>NcYh~GWWelqG7eDT1|f>M~o_y@Y>4NQaoQ+%ZjTQ&8|6OQ*NoI*GI zsieJJ7c0@ojAM200&&Q$?Gg_6Lw`@9Q)}K}UNe^R)z_q^AR(W=@R`o;hA`tnHJj|H zX09nO)dNHni9&8A=<%+x5%-iG#-F^ix+3|l60j_(e+StVHP>62Wiua+1JYodms)E47J2rP`~<5_h%WY1+>}ZId?FTu0!liTqkV8h`VdRqA%a zs|xym=b{}>q79FP#n4Fqg|kLVxS^4q4t1kw@8l7js2t`ua7yz*~HXV5vqqw)q3fRjSim zEc(7642$Q*L=m|9!4E2_4sM~Z1eph<$Cm%|X?p3U%UgX!J>(7-iteam@-m^1#?sc5 zCv7A#EPkzur0+g7JnZcFjqWzPgOw=+f@xXeDW{pm&jKa6080C*4S(FdF(H&L4dOpQ z;h#gbNTU-(n)iz45giO$WATgHK~69qsCgvFrK)(fS|`qRnVzWWSuuKKYl{T$xQ0rA zRjMr$nBpy03DVp$tYzd>KV5-l?52?jv_ll~CNVMgBG4(!u=JDQzUtNnRwo-pV@dkw z61!ruXj#er{_LpUW`7!R=7!+o=L;lW!0&J*jY7UBglQ!WLKsx37jd^f*?Pu){l-US z;K$o_*5ERh)s~T#-nW%Dh-DR@HZ0pe2J_rd+e{2ceNg)#6?x*}5V93G2FTuHVn+j5 z!RMH1L^W+@Lr^**<1t)8y>^%5k(DC5lvYd}$oM@Yjn#v)dVfHHr^b86bb`vasgV@f zyuo(6igq9|1TgDlCc@8gPmXVa+jI#62NFO8;<_CgfQHoPF5*rf*&}Kdr@b00EhKdu zZNRppT@IX4q}ipAb>%uA0bQR3^;LyM_|pp?<=FSW#MlNy!WIN9ECjO>1H%2hM)G?&2$M-1NrP1MyU)sU5i)8k`Ls?K5i!n>k`ea} zzf5j8PevXx{+u+Rcq02u@7GYp1=xgdDqeiWz@L7Px_=qH#ifa5Mm`dg|5(#wR&h18 zx(BiE)IIf)Rqkvg2S2Azv^r-tuhqKo%ESU1GRV^H0~JrGccvq<)eW1w_&(>w0X}{o zP)chhs(Gtb;bbH;iJceUb|FilElTOWz`$>(gZ512$v=I; z080Y>X)O9TW3eE~#$O^*Dk^ZB;CGPfD5X5%gVbQ&%Xsc-qjM2%k_L6B)KqX z8-G?i!Fr+g1u$~Ya_fV>I1trBbi}@imH-YfAq8ro8Nw=bKv`?MXnF7p(cIJMa|X?h zS>@JE>wO$#@%h>?1pZ#MNkKv4JT*JyR)WyON(9Z8X~W})z1n5d0|ij+;PwsW5QypH z=XZ~&H<^Z04wO836KL{ZN-K_m{zoA+r+@6mFNt)xj;m$j+id9Eo`-s~Tq_ zXVTbJ>KQFSM_-M?sAy#LF0yG!0w7UzqRL)~e}l@)9kMkjap*v$pM;)njD%&wwZW`K zx_ndNl12gaOqjvv6n&&Zd01NBda^0}A1=}@@MU^yoR>cd)TO4wAZFr=j`?#~KY!8L zQAtHY5-?%}l7s!wJfK*&2#}23S)?#?Ho0zDEAxzMn=TrsuA`&i9*CkZpxOP4i*rBO zc}Mz*m}urp7C9uv))WFjh$vxG{t9dZ5!l~v16gDRE%qLRbljgZvHxj%E^_zXN!s-Yb5F8L>7X8mzDnS;)=Yr-@7=`qm z_T>&@H7i1XU7RH#MAR%R_I+$?2K8$Qs82p{$ajNTOFe0EQacc(H_l;vXxxVTle^*y ztgdqVF**JXYf#=0QkMa)Jby4)^*#u{NX>kwMVZhHQF|1wraq-Bb3FJHU(UJW<^1#u z8$KMbaNWGu@VHbaVD^~EE&YYo_d0}*(MYZk!ML}0EV@J#ZW#Pk`$FK;QB@JruQq90 zA8WINc9>pz@z;*mCMDc#Op^E(6FzQfXW5};TSGp@h*VKmijY&y7Es3u-dv9BJeo9;mi_~f z0t!ZWUHY_6FL*Jt@Cpay4~SI{1`eD_;%vXYRVc)Y2mx{A zysgM(`NVGKjux21Fn@}mw7PjVvTyjVzesL*$fta(%BE*ryv$Zhaa)ylF!nKkHh*)Z z_t}cy^wr|hjO_nCBXjp^L8eKJia&n$CH{#-N&dM7BGOb6bLxP>glRwitV+aj-{uGK zZb1?)%V&rn?JJ?HwlehoVGI;5sFX)8I*6hH^(nMhDJJ#XjDLn4x`R2-(fClDzsZlz zaE1G&;D%-rK3~EV-A9+q%q;$-KRzSpiU`8*-Olz;#wfrB>YKk#Ll6KOV9B# zJR1uIPL)JYL>45~4%Gj%(#21IZM4~ZF4%ABAa7(!W=ioSrC`nfj65pI2pmbFIteH} z8tg}H)~e;%v2^og_pgmCkqq^lhD`Qq>&+VIRL|BE$A8@rYb%t05K}R;+SQ;Ln!JmW zvYktVjN#Ns`|p_hOCH}kpwKMeEj|T z0Y9D2A`1+}{hZYDbA;$&)*eqkj9|U~h1&HGv|Q(=%PL6Zo;IzxvpO%`#zhZ;=ppg}=R91apE^$0co4 zd8qMZ^i{?{Y5S}_!0dt(p~q3$%#cMjZ5_yyPyRe+sir->%6D7vUaa>OTPK-u^%mt2;h3OP~H;rS75^^-&)*{G;m#UT9Apk!5fJu+)(QB!jD}Emr<%IKHp8z7i$sI zMSmL@deVgKyqyvXhVHLsvaGFkNm8KJGbDC%+)}Rx{6`R_**U-4Sm(NpA`cs>+ z-#Uh$ZhKYWyry0O*m`jhN9*7`P(PIKj%=y&1^|Dj$b$t%y|)30*l$BkOOcFT@V@hihpK9 zq{v&%n#hn=iyL}H+&?#j_{BV1;+-2+Ke;JQLgNN$?06s>BpMGPC8?WZ%>>NGG#mko zTO2@9dBICD2qWN}AEYBl>QVVlAwEWZWK^linYOqOe6VFZp&7qrg7@Q0C8SQNOUwYm zKXp3f1J1_(8tztR!)$$V`gYGXn18T+*|CXGF!&dPe50Cx^~zp=;ZT}N{d+IW>g}RM-II6Nutfs-ve8NZ>3?Ij<*J?t zr^Ss4`LCP_nP$H0;yuucncxzUsc2|kFLtw7fg6PTUj_{7ZH@0~$(G1Hk-$n7s5V}^QfTz{AtP{6I~?J>#A z4Ul}C4&VLASOrM4sf6niH**UAf-W5Eyx9yVVfb>JIL7J7)7hES(1c7Tvo%BWo7o!- zl;kahq*90Tk(P^BC~4w1dmXx_Mo4y*`aXagI|bB;XN>ckMwY%*1ArKOsk!V_&1^l} zYokbIqWsBqT{}%PRh11gA6mSc`<{3qpw4k&fU!~1k!OPSK^MA^KYw9n1JOe_UVJNfS zc3hSSUW1XvbvLNfyDkk{;nvS2IUjxT$i-%x+mRLW2R4RC84!YBsGw*NCdcX>LUaZK zu4)2;Gv$>^=B-jHr-=#P8w!7;scqGDJDwO^#-h-mM@{rCn)zF@V6idOG= zP0AQjJOtg<;eUOG-dB2Xm_vzk9Ap)6O&w0m#z)QX|W30PUNU?+0CN`)MbLZVQYlJ_zr+@So;RjcXUI{smMS0RP5Ew!K z2Nc3&=fTOndkzhgbJQ#P#3zm=P7$X^2{3aW*d)>?hwHnM(BqyA$BJ z10jZQF5MV;&Qgv#urIwJ1yB}iXlgnbo@V80yX--k-a6qM5iO*5v#%HHMtjSGl+ppr z^>}?P@_&NS{At*%O>7a_dx4WRjciCz@^PLj6lMN+KiUXnQprEqfQK|880L`9Qf?#r zo8k7;lhhJUButsWB)pXjL(hGuo);#*2L(z9EjVA!88*IuEgh6Pe-=D{-bnA;O-SS+ z5x+Zcxy3A(G9Dd9zv2E7j8dFm<1l2B3>YhUm9^+3zq{% zn>H!}d+HJlXQLQH*b>~M%ALKjB-uzFkXweWu`+c}oCr4P9&TNaQ{;1?dD|~ECP~2# zyno!oRliXfXjs9W%H-VD7x;B|IY=!7KsE{ID%-tTQR-2Q=Y73rdP*TyH}GEOzkfBr zhGTG7Z1}h#CjMKtO>PMn9oWzZIfs4M9^nLUQ~MRTO_U;*R(FGK^4IL`d4x?eiDdTh zfvOIF`9uE>CHNl-XY3O@Veht#X=$H&5`Q9e@oJQm<9q(3UXII9dD9fwO(m%%!SHmR zi2eVBB>*k~)or7R1Mn~(20d{J61GE+CN^H|tN{R2WU?{Eb%*$nUJI`Afa_;`g+35E zNK4R-RFI$=dspcF6nh$sLBHW*bm7Ble*3mVYcbLzW3lqJI=8B(@hq3^qCf~-cYmcu zy0lsqNJv@egDs;b488k}>0SJ=J^2zmsjz`G(>lgO|N$?Qgg4$`Kk5$1k$E!#7E} z(pa9`zJGH`^#6{k6mfJd0d{ypL|tks?E~o+8n7{@6ta_ZF&7`~t>@J``+PL|#ZfU^VPJdG*#h@X+QsdE!-y8$7k(t>~Ai!X-y%EC42Js(ocP(p> z&@2m3CljdWXecM|$-vg)*vAe?(LU37m0(s6ilgJ`NWmQ$ANbbRmm|qAp9SSZ?jt2s zWEEjhUZU6JVI_)kbeDPM5HF|~K1P|0{$)G?fyZGQK7#ytMWGZ6Rew(Pn@qzj6H}~D z(6;!#Y;l|y(=@Z{%+1~?8bed%%+b~qVD;RX))sSpvCu`mu+bDGkG-#^!3T_eR~NqP zFsp?k-|rrUK!Q+$i$VF8lYRP_5x48Q#n+CP_YzFEmUwL#$SF|NUHkL+SC0Bh{}f`?b2LQ z+!YZxcD*<<-}c@;mgYw&f>SMTv(Gk%6s+&;5g3Oce}9h56^kakqKc5wg7iAf82Viy z24>EP{m!swl$F(J&P(GteuaNjsedI(U$UkP_~JVN99Qb>sB3x(0+^AI`eDh<@AKqx zJ1_q<2lmr!b^|Sl#S-$yD7;I+k#qNJ3MWO;spT z;_woi(SH>P!PGfpq6s2=stB{82};zk4W-uBgtaEFSHSYHK^5opJ2CrS!C09tyq5r39PJjH>MZrIuMQ>od$TNik&2!kDF z`-}s95!C3rDljo5oLTOZvX{T?lAt=!k1QIX(w#Y!r`9zJJZ9eMY*55KyVUb*Qz>6^ zji=IB+enlhFV9@vel+(py71v<8X|Ip-=Xgb09G8!01@feHY*I|(YR!$tg$ouGEp9B z-hc9AIliX|RMbVhRec7i`HrYbLobm41@YP$_ZFZgV!4}4LcFwv6v_u5N;M)W{T@r{A_%BRXqQxU$s~f3aR3#VR>3ovig$bR8rRql;yyjd#UKzL)j{<_`p<(8F1c}oFE0?w0$MtFw&ifx4$4Sx@1 zT?Q7E&9dD9M2-XBA0z(!i*(kG4LG`rTWgj_z!_I3+MZ^j;A;U69P7k97`TgQEE9%O&wrDM_i`C*ZGBUBFBONE^NEI2FJHY$x@Q_;O+DV~ zjQ(HWJwHZ*(Wp2jP`3FPIu^k6z%6z-{#cydB?IjyD#6CkNa|g>1L)u6OTo+MuXYXv zq}b)**J6mkKjJ94_8*BJI+OS=_mEf`m{+_-WEo7}$GR8CLW1D^jNXt{&422kr$B~m zaK`-!^{ln>X~ZYKUwY#UIn^TyE}QKDni!9gVW$?mE~Qa?7tbFRj^=9fb0abrKN4A^ z44lMEHzs6#c65Mn(9xFl!c)9f^%NOsrT6*)mR8G*sDs?Yd*=)hX1Wix<?!r8UmwtN(mkXT`Wq#&#%y9iv?MhZsGO4EL0YQdd;fWl`a?K5rfm^?fez?EM*lS$iu9O{TES`2>3O zSYUBt@|Kh!aw#DGy#jcKbc$dOqoYs+-(X!5i4rFuZc)^w3i>PKqQ9uixSf62iJ+$J zox@jA;UndAyYwB|VSh_S`p<3ov3bt56Ae;ItHlrb?PsPAJ=^isYcF#fr!H`B8?(*c zpN5Pw_nGo$#>T0F1epPfAtSK{kEDu+A`+KKRiL<`X2Sxx$?TV4xQkGX(D$}!P9K@t zlB~g-aSDjc(A@1J-$e8J>MT8(KH-}(`U$JEKx3E7-h7Tx{C|}w)qu4fS|^Veu?82! zwy$-8pA?|O5$dLwm_T<*y5s(e4c{0V9ALID7@y_J#fB^S#s=Uu6i7Qefas+2RC$}q zO!W(n=Zz;`_H@jEe2dDpf+XFVJw8(z5VLYG@NH&=BxDWph^pQI5AriMmZ3|*cf6qiF^6d zxPbt=HGF+Szn_*v6E*fTye;}mw1TRw%Y6DS(yazk6@PCH7kAXRg&ODx{f92*%(9w4qnPX%oCD_=x^+ zHZs+fUw?4YkBQ?$!VgqG=UmG>`iKz2hOt{U4J$`b|0Uk1@wer3o-dZrFaX(Io1->Y zt(o7E4M$WR${qC-b1$^b(l%30gwYe4SJJ*Gsid zGnL#Hj`|hGqdhyOyn%T`pQb$^zkgmq4;eoDBb=0t6mx?Oc}p;tqlT^DS3i=Q;xax< zUw_y`hwtVB=*kb8V`jIVz>hK{54#EEW%o^~k>dAs{RS%;7h7||UV`p|z@8_9kknpu zVNX;U>Pz5Ed1`L`Tq+~bkRZ!*4l!D2zISsk&lYdIiPJEj5;7@AxWhI1l2g>@J`KH! zunVJG20aW5d+p#xCnPjN@TJHG`p~nWpnv>%`Sxox3Q^fB`KwD$C>&B&^y7o}Dk*8$ zRmROlLx};(n%Bkn8Z<-B`idTnXA;AHG><${k=wZ)uvUxrEwJHYeC3Iaagt@XMt>?) zMwGYdu*CJ=xi1u%(l(lz(s4{DbBUGA6tu-T<~$fN@WO!;y-Zp2-N$*V5Pzfh za%O{ojgq3zSQwsoR1N`#0$P#$%)ps)ZNdyzrbZ*5Zs|FJ^NouJ-8v=f+TN6mrkD4H z;U@rztPn3fWzuPQFsGZq?EWxov+en^v8z2>HoR5}YOn?6bv|B_Bs~5o)i{v;Vd693 zf?mCWN4wYE+h=;=Lez#U*RUqlJ%3$&vOcLP0m_zK{sJ^+wvj7?5C7GLd@x+bkb%5q zn-B`^QZPwID&3VQK?v6%L8gdT<&{>fc|N&W0TZShkE2b~A8Jwq{oG~4AZN#l<3DQk zO#7X-_CbzjVoq_XdY=th3|pz5-`&SkJYl#T`n)`63kVNb#_mHSB(ckGAb-vEiojfz zZv&3&YT3lV^binT014F;>upSgl+Qa%i&GDRT?VIM&~a zXLd(*+-vUAb|zB<9MU}W!UGhB(6ryn1MoMIS%u$u-cK_Ig6)DJx}7aH6Fx&3^X)sxLF77Iqg+1FCrEs2e83clEdTYkkK4oYE2JJo4NfSI z{7mPVOV4Rlb*a0uOWArmO9oFd$manrm75%iT}Gmk%aIU~-{;=T@q$1G2IaC9JZ7U` z4>Mq!mlluWw#Lj2i+|&^k}6#^m;>#Wz$Dy|ez-agns*2%RAs)&y)6a4e==wpIOR3T z(E&T4YAR}jzt^u_rbblM-M#giPaOGYWEYRi;z%OM6#9@~PCJ>>y@Me7ov0~&P?LMo z$2`5gU*Z3jG?i-q`I_KwC0I9VlDj<4AW((mlFdZx-*MY9L4O&(bbEqYL~Lm1VN(Jv zJINUiHp%FPbdE$&Q~!7k?~wvIrsBln&B46HjIer`&u_Bv<}}$R$P_Ku|WNr-lQZ{Dm4vTc6#ZkEV##KRzOUKL966c z=$@&u5qnjvnkq2-?DrhmRq0`ul&llC36=Ln!UL=}TYnqQ`iX5<4M9`~>-vWyR=dmM z!zi((QWEf=aZ-xV_d_pzoBR2Y7T-~h+%)<#0J%3myU2Hvg$J9tSi)snNJPbAeC6!8knWNUhlZW5EF zr$meTRDa5SGD}^_4vDt!eyb;}IIUZQp(vY=5U9k;JWZjEumsikb%>c`#4#}DE#s{< zE#U5Awu=s19i?uV2`xC_Vn+%?kesF!w_j@#3e3DXQBp-QZ0X^&GSIN@>JK{OKex@q z+uuiKu9eovI#45Fs&_0%i&1YA0(rC7hYVu8-+$9!oVRI#0~5oOkB+2j05o~`1NWVD z&gFlG-TW(qA;IH^Ebk4YZsiL4h_f8KSFgec_B#jAX55A(bYMPx9ObTD0{IagRg!Gm zmNy_0>6gFjp_GF^X77MLI;V9(l|FRMhUI9c`pqb9fnB#;-D4g*^%08jR$kP|Oi))i zg?|{Xvl#}KtiqvLuca0uQFGOxI0r$<4c9U?+z#TySJ$$P;juV-fO%WXQpZlN9ddEO z(RWrD*w0M47pZB=&$2<4r!%G_W{;qy$UYezo0B3l&2@f_L9^lAX2C>i)Y453w{6MS zMm*I)h6eG0vrW7D?g)Bg$O9X5s3t%naesxK*a4>pPa^omL}aG09T?DFeXNrig?;v^ zhMK%Y-@j(sTqKGD#t(F(10}#~Y$igV^5Z0CEx8*{$3&MNUpM7n#wd-!<0HN2%$Vm@ zR0R@$NQ5LZjoR}!-6q;`+YE!u2=K$C@Uw2pLH)?n`0>2JrySeUV!+sgF$7>(4u7vG zcIkQ`FYwlQb%p2-E*xp2*lVm^Fp6OzWi2*Y z?6GKGJKhXOOKG;3@g3weD3HdK6$s}@jJV|rJ?w0rWR>*65=22rE}#Y(DR_AWwU z%1)lmGej@5Kk?WB-noFoNT9JhDStRPL7BXVG#^SH_U!Enq78JQ>xp7hIt2)Usk6+g6x_kijLABFSS9W`pl!?Y~5=JjLkR2sf-`WhB2M!uqTDt+HJ zSpr`6T2flaYD>ou^%ZWoc?bb;W%Z4#M-OM=%YvJ)*M76Wj52|9J%n-#gj35c(Z$j` zH1S9&l5AUK)az!fihm<{tw5wdhtq;0p%)bogt@z%i;8PCl>Q({6FzQDJJTDkY1Q;S z2t=-$Vr)McGHKE2NY@1@HNPsJ5>t+uTf^_H!ZW}CGPn=w;Z1LkTg!l^EeP61^ybyM zZa*xz#EbZ?@Y7p$xal>Re&cnjn8=+VMxWVg$pgJ)j7v!K0e_*_aW~;Gi6l}rj60Yt zBHVLAPl1S?dXRV=l|9r`gf`EXgI&Nh8G-D5^@D7-88G3AOtf#f=9`exNtPkcLsZJp|sf8U$fF+47y74ep{PRVXWNj6o>A+f@z5s)=3dpoN62zj; zOpq{Qcp&~^qknhX2F*>Afp+hfRl}+!jUz`l92ls1r8n{O$2ir%lWt0sDLl12Q*~fA zw+lwAt?MuUZ|6in8WVoNGGYni_GicW{=>8sWEX@!_@bRP8w;0&%Ze{)i{~5pu9jCL z51$?PZvf>%nh3T$4WkeLZD-dfV^qe+R*F+o#=tMNeSb}#ZE+eHA+`NASi)PN;`L(K zEy^j_UBMTc-E{KI3n#EpKB%+7KExYVCO8976+jEC&~eP8a*DsL9@?8;(2_yNBH%46 zt`kZSXdx-5xTxz7sfcfCQt^P$@MOxZW)@Zq6jN3?Y&e)ipJY8(ybtC)J(?P9Qu16P z8+BR{=YLkVb;~$#*=*R^q373it#2eERk(Uek>;~y3qy~7RM9Heb~N#BuNkW4+e?XF z!SLzxN7LC4eR+S@FwKQy3H+6DYC$aADbawml5e;mNc7(7(sCa>nUxMmK^kdSv}-F4 zQZKmA9sxoXZWT!4su##@VL=PZftmldK+PTA{(rb`0~~Z@JWcbf-NzEu6U02Nq3FTW zka04X+B10<90lW#N+xb+$fBTX0M`fTo~&M$YdlBgVWPF&IN~~p!j&91RUgNkH;Jsx z?NUb8VuG=%@B$!>&de(7AdL;I0He>WLG?9E+^v??LKqA5n|VU@A!VJ*2XAe4LN7g;;!}f-6FPMt2vlvdUrgrc{~n%V2tN zPQFPO_Tx#gu%Xow*8@!iG8+K5E3bRTP0XIQe8e`(_i;q;5BMai&Ktf=vxqlST zaOhE~Pz__ zQx9$a;_vQbn5zMxpi0H{e|5~JviY5M@ku`*wupg$7k&#jYamo|W?8H9LM=IkOCh=g zq%j6woS>u1wsIyFwH1_wY^w7=lP_38|XR7JqzPhdcP8 z9l~9_77=$PilMCeW;~QLRNn~AIC|3cF9aoPqwhz+B&{@^9mXnK@r)t!j{h2)US_Ka z`4@jLnveCVO^1axbH$Me>b7#QmONe`vIl;>&mA-KWli@DKuM=#4Y`3yV+7Mvbw zwPT9)24Ef6Fib>x^`p<_41a^Ha%1xO|Hy;nGlwY1?%7v?|KeOxr+vx-k3%=@?;LlI zHC-whW3DvFavmueDwv(iB`eJiW+75aC%blo%qnoBp>5iPspnL~aV#5kreoX!2l%>T zrJ;utM0+e5Iwl}(pDBedb6x;l64S&7()QtNifCsoyQEK+6aKJd@qgE2?Zb+6`lONn z7}def6CG`;;*ZW&REgy(T_K`3neLVeVKUQd8cuq`ew7%?sV@+hjQ#qgj>01a zfuBrXLdQ(SMPULC34aMX3}^CmamzS^#;tSA(8P!(Jo&anyDZ7pB9QaV-1n}VASbfB zck@7gS4yigRZ&%#A6BB}rGdZ7T2*MjrcJ#S9X#IT`@K2v=P6>&0xkxnLS=TX;e-2n z9Hip&u+X&TOduQ`!sKc>k-T}VWGP6v#J(1O9EYlC+&3S%H-E9okSZ`$TdfFhZt;ZY zjck)Nm4Dkzvyc52W$vIs3B}TM?8x)R16MthSUwx&&uHinLzfYg0*oes;?AJgL1C8& z^WWj@z{VCv)7N2mFe#d2ez1lCOz@2Azy{zZ(70=m2>~N2%u4*VWk7k)b*uIEHjSQh z^nn{FlCuj3czzb1N;#5~xzW9_f&RJq?;p+$Sa#zdnGKsQAnZM)H-BP0U*}f0O-ru0e;kDRLWA2i}+aojvg*pYmQ;*Dje*(Pe$4vlcrS1BXZ1D;J zJD@$F_n(G+V=0Jd~ zK;Y&t%X&LP&LfrpW z>VI`$Ug`oqI%v6BVhyyifjUt+;t^8EQ)yx!@btu;-; z%4mYAFC$wtc1}{61eko@`Q4n$z_Mc{Y`4kH8*MDs9?l%7N#9HMJs~V5kF6gOy z6KZ%%hVlhnOBhoVG(%b{izL56mUe1vw_82Vr+*K_^d7xcHRkF!3Klv(=Vnd7AT@Kz z6*3o>WdVe%>6ci@5_c1+U0rNzH7PPc<}~yJ^mw4xmlR+-`N(o!Y755Dd!7WD znu{gwT<;~ChJ!&ts$@YeDJ5^<54sktCSmd~VnSKil1(KWjIS9>uxW7kpT6gfgS}Q- zb&mL6x|7}8Nk&g|b=y_EztgvCUHgduUsI%=l_;@+0qEGpc-_+}H<_~Yc7NHdVd*Mrdx~&$p>U7zzC4aMCi7=GhzDK)%oM2@bpGF$%R8rcoByo8g-^9X*Z)IAT zOKtk@FfFXdaMdPcA!Hvq0dXXjsn5SA@AInDK8D zLvL3@O{C(W{QS~0XsdFg1GQu@L0K%<<_{fcrgoo0nq&h8=h)H-9XnQt`WKpR|MS{g z`kZM_)2TBy18$Eq_3?G{TnfG!91583QS)J||IW`zdgCEFujYSq+8W)}O&>s9=egjg zr_Wy z!g|aAVP6AXnb|OHi$P~7+j~QD!2jW!FV=6N3T1!7j&)sWAfgPiqh4M!%KVP-X}6Js zEb7fY=)0^uB7B4EtPq>I<2@6DlILG#N9E9;gqL_+FTfXRsMbB}+#+D$&&DB;S~;{2 zal4mig?|9JZc#u}GiyK=w{#gC{k-C105FB2%Fpa3Ve(*xV9v&3nOTH9IBcbLw!n#_ zxg))0e*q#<%^n>G0|U!k%gg=B5g`+z&VDIYqGKCCF43S<=}rCOmye_heD8EwyBQJm zieUUVf{&9(3*`cSN7Ce>a{M6R{iL~O#9oQlnt#2zXm%1caiuu==g?a7W2dP)aaP5H zqfA!s55%N|{2UNoLb~srITrZ-)GkD9y%+^l!>*={Dh_r?zCIVIcn%OF;!>YfDpJ%> zMYLwf^9%3*saq0~DnKPt({20mjD!K(kp-}G9u}J+Y0AaiLe6&(&kynq2lTEpt2PX? zBY!R@dl=32_$2qxmvN$NdIIbnp~2T@X1AEF>5@w(>JSk0d{J5fEztx$`pJpCO9&8( z+6Bv5b3jcgfmvkjgfeWvvdZ?iYWd@ihE@v=2OaHo)_%|sh#H1!hHlR885tE6&wsVFg7Yyk^Ej^}USyl&_aybEe%@YrZG5H+`f<)0-4lhw6N}S3FF5Ro@1sb!EdOTg&E94{J{I*EejHLb2`{UE z!PmTA$kqWQ0>)3AKV5-A?+hYN$a)k#N8p2>A}R4GYe}0$%Tdf9X^ENA?)ZdiQ$4x% z^>JV`Q|!`3W9@^aJbPAXV|1HS(0?c0GtIG(`zd#zi7rryzi#ZGKm@c4q|?QXOZoC* zDhsA1%~xl(>r2aUKr?8)D3L#gwU1PA0hda!j^a{>V4MPMf;pznkOnx{EHVRek|kJ0ZE*zK%oAB*=Fp zG+yA_(MBuKUqWNKD8@=XI)A}OyoEt1imU`5y@N494m5+*DHesyN`hgxwyZZZb(J#;ySKigs_&hV%%cuXf5oX9X4f2IbfCQ)&RI8-3;|&j?GIc4&Q2ALOD@JQ IumPF1*iF}qXaE2J delta 11666 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

y>~BhrpmAV_~8K?;QJ4Jg#al~fTm zIMaFCVo|hci50_ei0$qw78LxJ*sdG71DO|QwTm|Bb;~%@wqTCexgB}Hq+@gEtiy@` zjR_WsuaL>KZr6s`)Mi;cBT_n*P35+v(v#*s-dmUhX@)^V22+x}as+^8&t6st5%BEQ zMXv0$sB$9d-QRzFWvlP|-MISW3}bQ3=RZrKZa8wnH2U+K0~mi`@#7`!ZJ3cjP>qu_biX3ZV}YaltfG%7Z%{gGM)XV=5o3jNG$>;ZodoH}q4CfCL+jC`%r5U%;L zt;dsf^mV8(eTuEI4FzV12{rx#Cin3IHT!2r&O3u=XgD8p5gwb?Q@`4qTDoX5aq3f`t|L-A3V9kL*9G;Niao9SiDU6uy3G0(6@?*asGwDCe)8&S!MU|D4V+YIP z0{s!OoODJTu4p^AlMCbVy<9H!`5N%zBkQ=yx|HQVD0uW8TEzi<1l3v5v5VbdssNOr c1A>QXZ}%nZXP$&}4L)eRUkp-e#9hepNspeM<^TWy From ac6aefd34c2070217ecd296745e8d9b93f7182a0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 21 Nov 2025 23:37:35 +0100 Subject: [PATCH 859/893] doc/check-certificates: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/check-certificates.d/notification-01-warn.avif ----- >8 ----- [rsc] 🔏️⚠️ Certificate warning: rsc.eworm.de A certificate on rsc is about to expire. Name: rsc.eworm.de CommonName: rsc.eworm.de SubjectAltNames: DNS:rsc.eworm.de Private key: available Fingerprint: f21bd7e64eef82b963938fecd07ab0210194129d7829ba08c2d212d063f3b07c Issuer chain: E7 -> ISRG Root X2 Validity: from: 2025-09-09 13:30:10 to: 2025-12-07 13:30:09 Expires in: 1w 3d 11:37:06 ----- >8 ----- doc/check-certificates.d/notification-02-renew.avif ----- >8 ----- [rsc] 🔏️ Certificate renewed: rsc.eworm.de A certificate on rsc has been renewed. Name: rsc.eworm.de CommonName: rsc.eworm.de SubjectAltNames: DNS:rsc.eworm.de Private key: available Fingerprint: f21bd7e64eef82b963938fecd07ab0210194129d7829ba08c2d212d063f3b07c Issuer chain: E7 -> ISRG Root X2 Validity: from: 2025-11-07 13:30:09 to: 2026-02-05 13:30:08 Expires in: 11w 3d 02:25:23 ----- >8 ----- --- .../notification-01-warn.avif | Bin 0 -> 8798 bytes .../notification-02-renew.avif | Bin 0 -> 8792 bytes doc/check-certificates.d/notification.avif | Bin 25274 -> 0 bytes doc/check-certificates.md | 5 +++-- 4 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 doc/check-certificates.d/notification-01-warn.avif create mode 100644 doc/check-certificates.d/notification-02-renew.avif delete mode 100644 doc/check-certificates.d/notification.avif diff --git a/doc/check-certificates.d/notification-01-warn.avif b/doc/check-certificates.d/notification-01-warn.avif new file mode 100644 index 0000000000000000000000000000000000000000..e32e54b365c4d55cc65399b368ad1681dabc3eb0 GIT binary patch literal 8798 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 I*plx51DQ0%FaQ7m literal 0 HcmV?d00001 diff --git a/doc/check-certificates.d/notification-02-renew.avif b/doc/check-certificates.d/notification-02-renew.avif new file mode 100644 index 0000000000000000000000000000000000000000..9ff1400a467198c11b9924a83193cc02dfff5be6 GIT binary patch literal 8792 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 G;{O3h1ev4& literal 0 HcmV?d00001 diff --git a/doc/check-certificates.d/notification.avif b/doc/check-certificates.d/notification.avif deleted file mode 100644 index 7c250da192f5f0045edba36cc55e0e7246cd75b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25274 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 LpG`Ottk=MR`F=Nx diff --git a/doc/check-certificates.md b/doc/check-certificates.md index a9426db..b8fece0 100644 --- a/doc/check-certificates.md +++ b/doc/check-certificates.md @@ -19,9 +19,10 @@ Description This script tries to download and renew certificates, then notifies about certificates that are still about to expire. -### Sample notification +### Sample notifications -![check-certificates notification](check-certificates.d/notification.avif) +![check-certificates notification warning](check-certificates.d/notification-01-warn.avif) +![check-certificates notification renew](check-certificates.d/notification-02-renew.avif) Requirements and installation ----------------------------- From 5dbd419d1a4a938a730a62970a026a85fe47a110 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 21 Nov 2025 23:38:05 +0100 Subject: [PATCH 860/893] doc/check-health: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/check-health.d/notification-01-cpu-utilization-high.avif ----- >8 ----- [rsc] 🧮️📈️ Health warning: CPU utilization The average CPU utilization on rsc is at 79%! ----- >8 ----- doc/check-health.d/notification-02-cpu-utilization-ok.avif ----- >8 ----- [rsc] 🧮️📉️ Health recovery: CPU utilization The average CPU utilization on rsc decreased to 64%. ----- >8 ----- doc/check-health.d/notification-03-ram-utilization-high.avif ----- >8 ----- [rsc] 🗃️📈️ Health warning: RAM utilization The RAM utilization on rsc is at 88%! total: 64.0MiB used: 56.7MiB free: 7.25MiB ----- >8 ----- doc/check-health.d/notification-04-ram-utilization-ok.avif ----- >8 ----- [rsc] 🗃️📉️ Health recovery: RAM utilization The RAM utilization on rsc decreased to 75%. ----- >8 ----- doc/check-health.d/notification-05-voltage.avif ----- >8 ----- [rsc] ⚡️📉️ Health warning: voltage The voltage on rsc jumped more than 10%. old value: 23.8V new value: 16.2V ----- >8 ----- doc/check-health.d/notification-06-temperature-high.avif ----- >8 ----- [rsc] 🔥️ Health warning: cpu-temperature The cpu-temperature on rsc is above threshold: 74°C ----- >8 ----- doc/check-health.d/notification-07-temperature-ok.avif ----- >8 ----- [rsc] ✅️ Health recovery: cpu-temperature The cpu-temperature on rsc dropped below threshold: 64°C ----- >8 ----- doc/check-health.d/notification-08-state-fail.avif ----- >8 ----- [rsc] ❌️ Health warning: psu2-state The device 'psu2-state' on rsc failed! ----- >8 ----- doc/check-health.d/notification-09-state-ok.avif ----- >8 ----- [rsc] ✅️ Health recovery: psu2-state The device 'psu2-state' on rsc recovered! ----- >8 ----- --- .../notification-01-cpu-utilization-high.avif | Bin 6481 -> 3680 bytes .../notification-02-cpu-utilization-ok.avif | Bin 6797 -> 3988 bytes .../notification-03-ram-utilization-high.avif | Bin 7527 -> 4253 bytes .../notification-04-ram-utilization-ok.avif | Bin 6637 -> 3703 bytes .../notification-05-voltage.avif | Bin 3829 -> 3883 bytes .../notification-06-temperature-high.avif | Bin 3519 -> 3659 bytes .../notification-07-temperature-ok.avif | Bin 3727 -> 3839 bytes .../notification-08-state-fail.avif | Bin 3474 -> 3142 bytes .../notification-09-state-ok.avif | Bin 3531 -> 3266 bytes 9 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/check-health.d/notification-01-cpu-utilization-high.avif b/doc/check-health.d/notification-01-cpu-utilization-high.avif index 326e7feddb23d52c83f43050e15bb75f29b6c6c5..7fbce3ceb0041bf5606cba307c143ebd46ee4386 100644 GIT binary patch delta 3534 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 ILtHYMQ1-#8O#lD@ literal 6481 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 A>;M1& diff --git a/doc/check-health.d/notification-02-cpu-utilization-ok.avif b/doc/check-health.d/notification-02-cpu-utilization-ok.avif index 811ccd700714ce29abe0bea3076ad0fe87c6f45f..f8e91a3a21a8f528be3a27ce56e2c8f2f172f4e2 100644 GIT binary patch delta 3845 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 HO8Ng~2uSB}2Y>&( zpYFZSeeS2b&a=*X-@Vped%gS2002N|yqGOaK6r27zUvP^UkW{K-%ti1mHR{SFH+UcN`p4$glDApb`Okyh}5+T8nn zAqCXU`mY9v{#MW3t^OQ&f2bYQ#mxl~RiQ3c&WK0^b$78wM1&#T_tZr=o(t3mdcOij zLqkIZEDJBbMVlcwN2z+0Ua_|3wiT{T0 z>p)0<^$AB{q`%>}7zlzev_H??^xYDG_gGOy5pmF;K>^@y4tNBhp`f6mAfut8qN1at zVPFwqV_{-qkrNQ&5>Zpo(oj=SQPDARv(hneF;Y>niLi6=@(BtG(z1$4iSkQw3kdSx zHvyreqhn!Wkzr$#@zYb$^Z&Q)t^>eF0~kOEu?zqbJ_w8ty88mqBIZN}{jtBK+zSOm zkWo<4&@nI(1$B7$Hw8w5fRT|Qh)V~(MC1VoJ~9D4pDYTYmIW$FKnT9 z?jD|A-afv5uR_DZUq?hnB__R1ewUJ(mY$biP*_x4Qu?8~rnauW;d5hCSNE5m-oE~? z17qV8KPIQ9XJ(gIR@c@yHn+BSejgp5oSvOuTwdMly4U%4`%Bq>(uI%Eg#>|sA*lDd zKuF&A!to)<^n54;vRbGXu7nKyA!tN$3At6B=!^o|hs2g{qZlMig3HXm@1^}w_FoeQ z`yVO$hp>O@ngy`HAjHQ5;{(#bi8`w6*uJ0y>PzwYH6PtXD@an*4;tbz)lm5N8XQ@A zFRb4&cL3kzcngC-9&}-H_oh@x>_z2|fblTxh35j&S8X!5lnLju9duW5LrlV7g3z~Z z`8}GorSgd%AE=CQ3H}+`*v90VbLZYMPYK}Ev!LXCr8+SZCOIebW$a<(X8jyP*LAF*uI{q_6^C8|? zzYN1{$=n1FnUjW6n~IRg4WpM4Yv%jV>$e=bw}A>bVI-KzxebRsUtpqpWyW%FBQ3mv z`uU$%uBz0<;f30}R`#_71(%P2m>1HiABEvmwRKJQsYZ$V=6i|{EkR&u8O=@o+_BXL z+9t=Aq%IzvsfNnJDT@IV|GviSTm4(mh3DK;tkNq+< zFHyIlYK9zREr(KNJG&gJkR2AakGFks+I7qE?ICS_2$P;SgIwXcdtxy|t{KMmHbrl4 zvH=9t$H*xClt5rhodh!>!wjQ@siznV@Z$-vx{Uk&cE-nC-kM~RJ2yE{9?NZdmRHJ6 zTHMdaKqI!hz?|3dvSatN$T9eEr7*ht?6+}-=R4DIO_2)vb0-MRv~&(qH1dEdZP+vY z7~@%IeLW6~PDuUe-1SeLqK3m-f{66l{;!#iXy{ZSw+bdS)HRg6y!vLM@c{SrE9>^w ze$;GPHD@d%$udS#uHg+Dzsy&c)=KLNur>TSpJ#dy6T_I8;C@u{-XL)YJ|At{Nd;I3 zBUY)k)@O67xNo}IhY{N|iRWw0=CAS&=8#s#?Ho z%({6meFG!Sj~&mAb~5QT%Az}9$_B2R)ot>=9>x@eVWNbN$vN{&P6gn5CPvNiCU$9F zRTV}Swz^Nrn5g^NA@xTS_KakV_t{4{^&ODlt$7EOqu+ddB7hU4w5pDtMq!h(LMbu$ zqP2;Crg!-5wTUxRGJWbQ7V032P}!Vz2;%qaHKH z@BChChekTQjPK$>HBsq1CTp3|_7+T*QghLu#+q{_Dc8kfA+IQ4SVf4D*C0wreTf7@ zRUsx7nEhU#G`%tT$xI$0nPXwdrfYxyY7R=hZ4O2?Wj6P8nB&~*^s3}x4ZpJ?y-HIp zk{M^J{vN!6=_kbX^~-&23(2JlfR-;$?BIv)h~#m5q()C^|8^(#lBsKS+qL;f8FI~o zfY%kpcfhk+wj8YO7ZZvBALSN3fN%NrD!aQO8jFD+;UzU8EDyIJcK~YO9RP1?R{(Ts z6E8P{>f}pl591a6c-l*y2hxbrBR^{~p;bAX_c2Pi@cLct-+Z_w0wvK+l4>VRyslZb zUU`ptan zZ*60t^CZ`^P#W_@P1b|~CkgjB2fbM~FvG0rbNPjrO-YRrOyw@tqGYI4EYf8f))S$b zGKG>q-DK!RH!G%&$}rf#JijO!L-B23axJBvO9y>VPv?dwi)-vRnlk5E`s?Xpu&lgH zq;UKkcMTA?Dtr*MnWv6-R39*$@P5Ym5&U2S8sjNl`da1+|oO;4?p@x0n&X^q{#L+kYc@ zA*g5HOYZ<#&f#nL;;PcW5(Oe4=wBQC8_|;a|Be3}mm~E4!=mYYf#t@IFDy|eQEvKX zD=%Cy=x&Apz(5yeE~apxqt6-R52aFjjx^_#2hEttH%xyxCoRsHU81X;p>lVHS1%Vi ze?-1qNye$UQRHxUi{Vw5d`U}ZB$>U~)Ip$J7tzuvXyo}!{pu4TKa_A=w_|$zDL+an zva;F8)r)U504=PDsRmhD-%y2J>E~l1!+QIrUZHv#kytxpUNHr%UCDU0>;cLkiM9^| z&+fi(3pxJ|RTdX3ur!#JBgC&(eZC#XXGVu?*Q${AJp;1uu=25c&^DM7lj{nW;wStB z;_D)Et6Je*{-elsB?1#lnXhv_=0s*vCx;%42SIfMi@4f7Xfvz5`PNeua{yA=9(tU` zb~zPmGYU&G?~n?!Gd7EQj3#XSp^(sVuusy%k4VVf`SB!0o=jBpQ&w5n+xJc_<(Cn+ z1l}n=aqPirjFp2-x{pj<)gUo3RGqZEUxSOU37w|)_{xwgvfhZp}t?e1JhdJZmI&sXHonh97^PQ2$`}qSA z2AmWv%0$BCnjmb)W8<@R^9sMpA^Ug11}K_?Yl z-H>bRYm&n2(sZW5?JdpSs2o{tpE}2SXu68Gf?H_!J~XIa9{x1t6V#_k@tamMKRsX` z=pATqzvX_oQb@8=%SmMBe3D5lY9>=vqhfmDg#W%Tq zs^4-M^h$RFC#aKdXgD0i3wehODU2AL81r6N6#~ZZtAYfI9vz%<KFDXj@JoHIQ_rlwftEG&%Pv z+P(-h>~h$|IHpa5&IVEwjp-f{9;`LG+U!1qa$QQD^i%uv_bIrpknYwp{eax9 zPzcgI{ZkaJ8=UNxYgp~)fw%b_1s5Vqw2-DSO3$g}u0WnAaV2DIMPpw|*!{-5KA2M^ zWlXnfcBc)ul^x&)Ebg>|vesDNYWO4+1gmQYF8EcQ5G3xirM@+Z+lbFB7bS^W&p%4y zkdKa)f6++vsECeCsIPQU*eT7QuSJHCf@*m08%=w$7NLFEL{OIuI^#UdOi_M%HW9uapx%1if(`FaAQbK>r0rv;0GyqXB%k*}lGc8gre!Z{-GO z@A1c+P|HhrPpa5@(*&(wmfeIx!36E#eCIjQ6`o(<0@@G!)54{N>59x})W}KRGY(kI z{>VO)hP6`_k8HzCc7H>yic(r%oVV-&XY$*O)Vg@^!`??%(&Uk%c2(Yuk@Wp7 zzq%6CSZX{jl|k$4#I(4blrEWdi%65grk!kI6`DnuQo9TFgt!BN4b>a+EiXgITZ=Yg zpQl32a#PylNBdh%*OJ;a4BL8wgi=1e{j6rj{5s9U9DOvwY%ux2uD6`eQi)jc^@+%P z;^THHl>Ms=!L4^GkHV{?D<9FXh-jipEzY5=B|j2PuS&e03#i|uV3Lw#H3gwtQ7MEE z=CR%RQiU(kLmQu;Y;qS;!{FnKIIU$*&`!cxXd*!;_UIC>#5bmT7cWcIk5X2!i-@mc zi-v^{ipxlapG}2~<}8=T4Oh=t*X{&Tn+;9yf4Lj6bZFj{vDl0K#gq?YiC0AVyzXUm z?b#9^^H`GJ5?x1Tj(W(o%y@QZu4(F0jQBwj?98ZuuPYZ zQ@Ks(;73LJI{ToxDb~ngiY4;h3}yWU9YBu$f__qwt^Cc42jT3UyFR@NY%c$7v!M-ktP) zpwK#8Sxfx7Qz3v0d4-u0BbN=7C)4 zxi!JZgd;1R=l6B<$@YVh_ns75j4H*bpW-z5s6SQLp!>(Ck3_caN=4EP3cxX>*R3~4 z^IQ!oEh6H)IQ5RT8+l)MyOQX@LcI==TpY$Nrdr6M9L;v`a;otQra9CTS>W=4sKr@* zd>WQ2Mg9X+o|?N{(Td^1ZsrCeu*s$xN-SoXO_4MRE@r2ifK8;!h}(^Yt-= z_I${(H0r$1X1`|ZE*a>YW)V$FEcd~-`baw(N~s^*5Oqd5Y_2s)sV=>wPT%S{1o=Ui9FiTY@Cy0Q**Jf}`26>@lP(FB?YAKK3g5O(%&K%*2OUGBdvibDtchOH!C2 zpFq8v#p7La{Tc+_UxCZ@d$H_E@rIr9 z{D=YJ-uSor(I;Tny(`%JsoJ}PcKWI%ldZr>Zhj4mqO}M6v%331EQhU!{hq~2+UXnt z>EOej(=Q#rTWT~%e<1_34V&VY*dRqt0&djhCAxVJ6p=E_m>twp9nkiP*%QA_v=XHx z{H8JbTYILjIw2ej8A9%g1`hDel(l|~M@&;6iiI(z z$p#P6E->7n1>k6FmYU}lDA3MxC}VYOwb*e%GEp*Lz8+X4ju~Qi+5)_8#IkrIBZEjb zsHGxuH1hq9DjNgyok2Bteq8zlr<^0Q4&eD5qaGhusW_fnJ>)*uYmZR{W+!O5@J^6k z<#BW0SVDCO!zY_a=R2Y2jRHcfhicUoi^2+#@jA`k*qGJPFejMe8*a91D;cmtl@}j0 zB-d-{OI?}4ZMa)ynr5df8=#2J!Xn!LllKVe7>=zj*zL!}<=*-H+tA{?Jqv zC#Hr^3~V1#0%NhCXpspK@EAfIV7K%N->#O!y3ap7f8FiuGadj5un$A^6`>_E{VDot zC6Yo@I*U`p^>kM<3ti^SPB08^Rc2$tFOOP z&u&L=Cpcqey?$yWViwU6+&Oc670$GmGw#q+4xYr#xjf-*8MwNr%x_>S$}J|{dZEM{ zU<=RE`&M7At3sKja1bKDu1np^k83e##%@>;WgJ=CH&QTh?G_$)9si_0>?rj6m@aDb zLD<4(=LpLJfTlbs)-fNg%-^+xPqm|HN8{H6cVT2>CU{UWyIQxEUUysyRWO^)W6*g! zQDDIorfBNfl_TQJF7&kM8k2>8;g`;n9sXsWM6E$Qs*>Z!Q$;5My3?*?+r-$|&go`0 zbEQu`RfMWxwVo=Uv6J*euJn!lC}q5rcMOsnOo~TIq_y|=I@*|0Q=XDUr=y37xELSfbmQ^)F zLGRos4pt|hg(kWc+Eh)d7~*E@JG$NlHAJ_^*6+0y2|Q%Bhf*@Dlp6{k&J`K7K?wmG?UQOZ+ z9evNYr?Z{L$jI9eNt(< zxZjv(`Ckle@M@$`gxkJ1>DC6v8=GeMTJF|uaJ9f?k_wsQ5`>BczcmE7;y0k9ybz1M z9DAeI2mItyg>o%y+qJ9Gt1aMc8Oeh)2#ihW{p5zcgn8EVJ{+?)O*X%3XAa;#7x}&R zpaizW)9AJ}^5JQ6aF@BLvJtZ6$T(>v4+=*gm#_aD5bM$vnyhtXqLWKQ zioRa{tRNLTw>|%_uN*?{1z1~-I5%3BDcN;r*d@%PV4TnoGi`n!ldT86h7ZkNL?NZ< tGB)|@xRs<@zd+$JBMqU?UP&TVU{NO!=cVvc?xa|Qq7(~g?$Z?F{Rh`zPnrM# diff --git a/doc/check-health.d/notification-03-ram-utilization-high.avif b/doc/check-health.d/notification-03-ram-utilization-high.avif index 59155c563e96f10d48e4116d034cc5cb7840d51d..9015b4a318625c71b066b4aac1e806dd23089739 100644 GIT binary patch delta 4112 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 diff --git a/doc/check-health.d/notification-04-ram-utilization-ok.avif b/doc/check-health.d/notification-04-ram-utilization-ok.avif index d995b9a198bf3de91e117781f89535c6f048f343..8f949ecf50cfe77f8ec077962d31c4715f70705f 100644 GIT binary patch delta 3558 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 BDh~hv delta 3629 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 diff --git a/doc/check-health.d/notification-07-temperature-ok.avif b/doc/check-health.d/notification-07-temperature-ok.avif index 4afed02da806b192859d23f3731281d50ca209a8..8f509e8d8f702695e30baa9f7af40eb33100b789 100644 GIT binary patch delta 3638 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 IzJQm)Fn6N^SpWb4 delta 3526 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 A-T(jq diff --git a/doc/check-health.d/notification-08-state-fail.avif b/doc/check-health.d/notification-08-state-fail.avif index ad049ac8b2c29635a4344a33be929dead82c1ae8..8ba7bb972b7eb6388630d2b711071cdfa0debdb0 100644 GIT binary patch delta 2936 zcmV-;3y1WQ8^#!rBMs|qWprTx00000001G8FdUInCB{#$} zskEz#P?g)AvHY997&OX$JGuaWdzV19`I&Bd4G6Pnq4cKonq?jCYALl2v-UkgfF&Z| zz)ND?Hf@oTn9DM1&0tN`)v0@!!M~4gPC5DTot3A zyYIm{%&~$&{4y)ZymUh7jxG4}V_0FlICL)rfpd$BGf~4G0lx0WLP*4aU6IWsc|%wt zLc{ar9gTojQ`I$uIj3uVLB|Yw8c5sxCIwYhpBx_KM5hb!9U85V-<8Io+c}lr_lN}T zbs^)>(TCEz^b$=h6*>@`q*a(*Y9tkcwCyeYR=>R`@K(DO&R+$g0{iN;!r;$?pD^_( z9mcEFn9j!@010ejru-L-^e zM9_My5Tc?t=T>Ut%g{dbxyt`lER#`SpLS1Zw}Svopj0YKsC__yAwJ_*XlnkaI)P&v`);3Z0wd7Rzdma z<`cdGI!KM;E7!Jv^7&e$SH_85z6v3}r&doEnvWt}OfOJYN)OWziw@zx5B8gFx1CJ+7#O&<*WS5_zAi;(CT-PwwJE4jJ{(7K9L|jt z!90A^AKns;`Xkra-RmlhM=u~kx8(UVpUY?pgTo~U+EjvPJBs|PwI#BI}=nefsY1ckekX?D2~f7M=9TT z0ba{ER_URY>MZeD{!OC~Pq!zhm%EXALRv-)F392>dPPrhLL*e!ck!8ZyC#A9*^Bqr zk0^MWD1@<}loqY*bFh=n3nT8G)eWlt z_82SMephD zuH^hS`v{Vn#xcN}lsAbg(iWBv*47dwMqtN(Ov4Php+9tN1?%LT@?l9D$10FEjE`4> zNuYf#)gY5a0dL*uw`jT6+|)y~OCRx;Xcy`lv3QHmm?5Neg1_|l!q<0BSuODfD zU1$0dNMey90rwwmc=D+dYF~W&B7o-RKw-lqafG!-M)6ckylb8?P>N=^&M-T@zf5d) zyWP{)btUU^?tPjtcVw*;#BEB~S0VqE-bChMlTq<5?A$7>LciN)N1g}YU&AT|v|8H* zR#9#kZbv#uqQ0!wC{x{SA)k-eed6SQoYe`jqw;IZ< zGjFFjq1-2jf*}5=T|#Y~Y1;UTSt95m=_)`n`#bNFjS}}6;(!B3^Ir^-QusWd!e5H0 zv253OjQZTTzm{W-CPPGq%afD^=hmrf!q8IK7@`TKXd7OgZM0g=lh?Ah;*h7^{YlU$ zqvCUrR-Q1o2-|8jqmRXE=zj-)q-X*E_yE*Fu8Lrk?>(-mkKU?t&;;>_-9pVWTZixe>PrfS2QT=t!>Oi1k0le93jF3eEUa{Yg?T|JMrQ0m zJoc3Bm|64=2Z?NY`~=dUy|wzjS~_aHgo_j1C+e8be|m13dR~z=+s^6v;ksp4GP{N@!lSNiuvo;sg9i7yW2^&higgFYr=|&XcJzs!&SBsZ zoP3Ky0-r=!VSoSjl?^y_+4s?ap&BowJ}wMXp!@5Lamh>(;{FeR;`7G^y?u~n52n%u zeexXGN_T4Zu~frqrwu{8$*hQ7m39nY$S;36Sn$7Yb?==fnVlbI=6kKNzDca{VMXy( zt{(Os$Wn~sm*||H+3ND>4+?IpG}^g1S=@n2_C-@ z&o4S)JtVte}u6X#xe@Iv!1v?`M;PY!GcrEk=Wx(P}NUVXJ_-A zge&46gep69RpiS!P1287NK2JGRe|Vm)Q>t@@y0orG+_RVTRJF-M%_fp-x5e?w9#-P z5foQC;w4@Gj#3jA>#Sgcn&BAMx1Rbsxi;` z$R4z&=tbS>t637v!YYSD5b-kslIwhd5YAMt-a@Kh3n=ZXvpbizw#3IemcxU(9fQJ~ zhaAo-5TkE>{lj{lc*khO4LU46{Az+v!_*96;QF$@9O`|lfV%%3xw+{~vxq?^)vOpq zkfkC|5W3P?(|mpN737DQL5K}=H!cn|PCHZ!O3GCMIB?qmw*&{sWS9A@ZdHcTrkJ70 iI{sXQ+I<&VG*dH^(09KeO;0vsHP<$^ssw*{i?T2kq_8^x delta 3272 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 L8cPa&?^OSQ-HJ!q From 3926d1207098633cdd2a30d597c8fe2af350825b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 21 Nov 2025 23:38:53 +0100 Subject: [PATCH 861/893] doc/check-lte-firmware-upgrade: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/check-lte-firmware-upgrade.d/notification.avif ----- >8 ----- [rsc] ✨️ LTE firmware upgrade A new firmware version 16121.1034.00.01.01.10 is available for LTE interface lte on rsc. Model: FG621-EA Revision: 16121.1034.00.01.01.09 Firmware version: Installed: 16121.1034.00.01.01.09 Available: 16121.1034.00.01.01.10 ----- >8 ----- --- .../notification.avif | Bin 5077 -> 5723 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/check-lte-firmware-upgrade.d/notification.avif b/doc/check-lte-firmware-upgrade.d/notification.avif index c440da59460bd6de4e5958bc992c5e4d1fa45cb2..2c2f692d5e473b0945a80d115f03b438ad73aa38 100644 GIT binary patch delta 5542 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⊯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 From d60ee59e77b8d01d0fa3fda218b5f28dbb3aed1c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 21 Nov 2025 23:39:12 +0100 Subject: [PATCH 862/893] doc/check-perpetual-license: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/check-perpetual-license.d/notification-01-warn.avif ----- >8 ----- [rsc] ⚠️ License about to expire! Your license failed to renew and is about to expire on 2025-09-13 12:12:23 on rsc... ----- >8 ----- doc/check-perpetual-license.d/notification-02-renew.avif ----- >8 ----- [rsc] ✅️ License renewed Your license was successfully renewed on rsc. It is now valid until 2025-10-25 08:42:46. ----- >8 ----- --- .../notification-01-warn.avif | Bin 0 -> 4044 bytes .../notification-02-renew.avif | Bin 0 -> 3944 bytes doc/check-perpetual-license.d/notification.avif | Bin 4004 -> 0 bytes doc/check-perpetual-license.md | 5 +++-- 4 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 doc/check-perpetual-license.d/notification-01-warn.avif create mode 100644 doc/check-perpetual-license.d/notification-02-renew.avif delete mode 100644 doc/check-perpetual-license.d/notification.avif diff --git a/doc/check-perpetual-license.d/notification-01-warn.avif b/doc/check-perpetual-license.d/notification-01-warn.avif new file mode 100644 index 0000000000000000000000000000000000000000..fb6b56ab49bada738b2ee356b6a70d890c330d54 GIT binary patch literal 4044 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 literal 0 HcmV?d00001 diff --git a/doc/check-perpetual-license.d/notification.avif b/doc/check-perpetual-license.d/notification.avif deleted file mode 100644 index 70ca603d4488773dd8a476ced8c89506407b95ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4004 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 diff --git a/doc/check-perpetual-license.md b/doc/check-perpetual-license.md index 0335fb5..a32c4c3 100644 --- a/doc/check-perpetual-license.md +++ b/doc/check-perpetual-license.md @@ -20,9 +20,10 @@ On *Cloud Hosted Router* (*CHR*) the licensing is perpetual: Buy once, use forever - but it needs regular renewal. This script checks licensing state and sends a notification to warn before expiration. -### Sample notification +### Sample notifications -![check-perpetual-license notification](check-perpetual-license.d/notification.avif) +![check-perpetual-license notification warn](check-perpetual-license.d/notification-01-warn.avif) +![check-perpetual-license notification renew](check-perpetual-license.d/notification-02-renew.avif) Requirements and installation ----------------------------- From 094215aec72a796b345cf4af57ef7e0c6ed15d18 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 21 Nov 2025 23:39:33 +0100 Subject: [PATCH 863/893] doc/check-routeros-update: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/check-routeros-update.d/notification-01-found.avif ----- >8 ----- [rsc] ✨️ RouterOS update: 7.20.4 A new RouterOS version 7.20.4 is available for rsc. Hostname: rsc Hardware: Board: hAP ax^2 Arch: arm64 Model: C52iG-5HaxD2HaxD Serial: HEG08Q4FT32 License: level 4 RouterOS: Channel: stable Installed: 7.20.2 Available: 7.20.4 RouterOS-Scripts: Commit: main/3287/699be25b Version: 138 🔗️ https://mikrotik.com/download/changelogs/stable-release-tree ----- >8 ----- doc/check-routeros-update.d/notification-02-neighbor.avif ----- >8 ----- [rsc] ✨️ RouterOS update: 7.20.4 Seen a neighbor (MikroTik) running version 7.20.4 from stable, updating on rsc... 🔗️ https://mikrotik.com/download/changelogs/stable-release-tree ----- >8 ----- --- .../notification-01-found.avif | Bin 0 -> 14735 bytes .../notification-02-neighbor.avif | Bin 0 -> 5737 bytes doc/check-routeros-update.d/notification.avif | Bin 6392 -> 0 bytes doc/check-routeros-update.md | 5 +++-- 4 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 doc/check-routeros-update.d/notification-01-found.avif create mode 100644 doc/check-routeros-update.d/notification-02-neighbor.avif delete mode 100644 doc/check-routeros-update.d/notification.avif diff --git a/doc/check-routeros-update.d/notification-01-found.avif b/doc/check-routeros-update.d/notification-01-found.avif new file mode 100644 index 0000000000000000000000000000000000000000..54dd2df66c89607c0006f0668dee71f9583fac55 GIT binary patch literal 14735 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 LPN7#I8tVUluxYg` literal 0 HcmV?d00001 diff --git a/doc/check-routeros-update.d/notification.avif b/doc/check-routeros-update.d/notification.avif deleted file mode 100644 index 50317cf7722e30986a49869f3e72f8983928e74e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6392 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 to your production environment! Automatic updates should be handled > with care! -### Sample notification +### Sample notifications -![check-routeros-update notification](check-routeros-update.d/notification.avif) +![check-routeros-update notification found](check-routeros-update.d/notification-01-found.avif) +![check-routeros-update notification neighbor](check-routeros-update.d/notification-02-neighbor.avif) Requirements and installation ----------------------------- From f77cc07338104160d07b3f5a4c7dce17f65bb31c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 21 Nov 2025 23:39:52 +0100 Subject: [PATCH 864/893] doc/collect-wireless-mac: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/collect-wireless-mac.d/notification.avif ----- >8 ----- [rsc] 📱️ 02:00:C0:FF:EE:00 connected to Guest-Wifi A device with unknown MAC address connected to Guest-Wifi on rsc. Controller: rsc Interface: wifi1-guest SSID: Guest-Wifi MAC: 02:00:C0:FF:EE:00 Vendor: locally administered Hostname: Wifi-Client Address: 192.168.1.244 DNS name: 02-00-C0-FF-EE-00.dhcp-guest.rsc.eworm.de Wifi-Client.dhcp-guest.rsc.eworm.de Date: 2025-11-23 15:30:27 ----- >8 ----- --- doc/collect-wireless-mac.d/notification.avif | Bin 13378 -> 8301 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/collect-wireless-mac.d/notification.avif b/doc/collect-wireless-mac.d/notification.avif index a2833f095d53748fcf3e92cdd44e5469f83f177d..4b21b2f516d84a8c66ebb6f6fc85b76a7a9679bf 100644 GIT binary patch delta 8137 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 delta 13255 zcmV;&GdRrcK*DH{BMtIxWprTx00000001bFFdPSLX<}h^X=ag3CW#=C@5D?I5GMHu&kO77mVL;taN^cVJ=g`$*Ov;{-_?prw zd(wEXs!3##ieZeb-YMlfLTAlm^93{VR9k2*)XIr2Ov$VG-RW6`o2)9@jtvnU3hMZw zNg{MGuu(o^zEWP)u2yp+Mu-?Vn-ZKsXT>Dae-eF%3~q*%I^|;p;bBr_>JoxS@y5;M zJu6B<@8Z~ru%tt9#e;Q?&}kTh9TdqU3&9W@W2o=gf-z|ATY!(+t_~3F(E=tM*>e|3_8*g>u|e+aCm&FAvAaKT55M)r@zmzvN|3K3S>Kpdk< zR$`Sm@q4!VPfeYKmehlnBj_cMwtirdzV*<>R>tqf;`0@X-{`krQkV~ko!s$GHBLWQ z%$w$8ZMP-KvfPcx;{nUxF=~UtjQZs@n1p`ziSY5bPO~6+B!akFFwS7uIpI&Se+2nB z703pNDZ+*=n+wd|8B(nYZFov6j(}H9umda5B!_B=QqW zKi-Fkwr>W_&X*PkthzTEBR=_4^xe6~@+rJCK-k42BF~6A($^${H$rNrw*%I;Niq%p zpB;YYO0*J6Tnwa^lqK0ke>Rev%oPu4h82vNc6hA&v*7Dxo2%$T%D%mMo0EF;-+9rB z;U(Gf%4ij1yG@nT(MB_RuJly6#7Eoyafk-jFGF~<}{k9r$UxFxJKb#J5H=An~h4hds zT9d`>!r=)`)0AyCN{I;NGE==SjYOU_4GtHCId!*PgSZ-08~A7HSVF5kvRBiwIWtU& zZao~WB{^z{W$$YOeOMCCayyzQ{)^wLkJn%?#G(V<`5k<(f9~74$rBYP*ERHk5yzq# zxI3LgY-{4xuvLoYfq89>zpV1Gd-o{z=t)9SgP+zIp_1~t2M0>_1)q4Wcxi%1d(HJ% zMLTeda!7)$bA8~dL)o(w<7f}QFV91tIMEC1;0K}mKdvq%XVzuLBT)IBV}1A32^Cqo z(a-5oHed9bf9i#)NWxE7CNTG4(G?-@i#lO9{~sAQ&BE%h4++^e!P~RD*|dks#nUFfBIMv@00Gb zGkq2{1W!33Cgg^%Cau=_va0!)a9%`mGgYBWh*k~;e|Jyqvd*f~gHj7G(=F#o-B^oAJ}!mQ{5tJsonXW3eTqT7|)gN9Sl;IIi3wnEMqUQ-;CJPLdf>|o+T z`Qq)aaPRyhln+tB(Xbo_d!XGSNmX(szMk+N6nt|3%g5V!`*3?E>P~e5x0e8hos#9Z z)cFyTe~6=Gnjj0m$TM-Wh}bWawhGpX|D+)`pwESvA{~̜Rl8uEE)3+jliC*DMP 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 Date: Fri, 21 Nov 2025 23:40:08 +0100 Subject: [PATCH 865/893] doc/daily-psk: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/daily-psk.d/notification.avif ----- >8 ----- [rsc] 📅️ daily PSK Guest-Wifi This is the daily PSK on rsc: SSID: Guest-Wifi PSK: 53cr3t5tr1ng Date: 2025-11-24 A client device specific rule must not exist! 🔗️ https://www.eworm.de/cgi-bin/cqrlogo-wifi.cgi?scale=8&ssid=Guest-Wifi&pass=53cr3t5tr1ng ----- >8 ----- --- doc/daily-psk.d/notification.avif | Bin 7040 -> 6966 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/daily-psk.d/notification.avif b/doc/daily-psk.d/notification.avif index dd0b1b62520d0c3b7d5aa383506730fd0a9e0e7f..79cfc3e2978889f740021b04421cb8e8c2ab0388 100644 GIT binary patch delta 6795 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 delta 6876 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 W<~l?3K*WXv?KVSdlqL0h-?y-TW@BLh From b6e72f9a9f03818739271a5e59a172d2735d6318 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 21 Nov 2025 23:40:31 +0100 Subject: [PATCH 866/893] doc/log-forward: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/log-forward.d/notification-01-info.avif ----- >8 ----- [rsc] 📝️ Log Forwarding The log on rsc contains these 2 messages after 00:01:19 uptime. ℹ️ 2025-11-20 16:40:25 system;info router rebooted by ssh:eworm@10.10.0.37 ℹ️ 2025-11-20 16:40:27 script;info global-functions: Loaded on hAP ax^2 with RouterOS 7.20.4 (stable). ----- >8 ----- doc/log-forward.d/notification-02-warn.avif ----- >8 ----- [rsc] 📝️⚠️ Log Forwarding The log on rsc contains these 3 messages after 01:23:19 uptime. 🟠️ 2025-11-20 17:35:48 dhcp;warning dhcp offering lease 192.168.2.254 for 02:00:BA:DC:AB:1E without success 🔴️ 2025-11-20 17:35:57 dhcp;error pool6 refused acquire: bad preferred prefix! (1) ℹ️ 2025-11-20 17:36:25 system;info;account user eworm logged in from 10.10.0.37 via ssh ----- >8 ----- --- doc/log-forward.d/notification-01-info.avif | Bin 0 -> 6833 bytes doc/log-forward.d/notification-02-warn.avif | Bin 0 -> 8622 bytes doc/log-forward.d/notification.avif | Bin 6178 -> 0 bytes doc/log-forward.md | 5 +++-- 4 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 doc/log-forward.d/notification-01-info.avif create mode 100644 doc/log-forward.d/notification-02-warn.avif delete mode 100644 doc/log-forward.d/notification.avif diff --git a/doc/log-forward.d/notification-01-info.avif b/doc/log-forward.d/notification-01-info.avif new file mode 100644 index 0000000000000000000000000000000000000000..6d25467bb4c146e5e90d1cd237c3f2b2484ca381 GIT binary patch literal 6833 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 literal 0 HcmV?d00001 diff --git a/doc/log-forward.d/notification-02-warn.avif b/doc/log-forward.d/notification-02-warn.avif new file mode 100644 index 0000000000000000000000000000000000000000..ff61c0c0441d1cc43df00afa6678030f6ee08a1c GIT binary patch literal 8622 zcmXwdWl$VU)9vE!5L^?S#UZ$Ba0nJ$7T92mySuvwcekLy-Q5=_xNDFAH_v

#6C} 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 qJbFNJ literal 0 HcmV?d00001 diff --git a/doc/log-forward.d/notification.avif b/doc/log-forward.d/notification.avif deleted file mode 100644 index a0f9ab339175ae768e1e791bd701a2a91dd5bc57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6178 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 Date: Fri, 21 Nov 2025 23:40:48 +0100 Subject: [PATCH 867/893] doc/netwatch-notify: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/netwatch-notify.d/notification-01-down.avif ----- >8 ----- [rsc] ❌️ Netwatch Notify: ipv6.eworm.de down The host 'ipv6.eworm.de' (2a01:4f8:222:1e83::80, ipv6.eworm.de) is down since 2025-11-18 11:33:18. ----- >8 ----- doc/netwatch-notify.d/notification-02-up.avif ----- >8 ----- [rsc] ✅️ Netwatch Notify: ipv6.eworm.de up The host 'ipv6.eworm.de' (2a01:4f8:222:1e83::80, ipv6.eworm.de) is up since 2025-11-18 11:43:15. It was down for 10 checks since 2025-11-18 11:33:18. ----- >8 ----- --- .../notification-01-down.avif | Bin 4193 -> 5126 bytes doc/netwatch-notify.d/notification-02-up.avif | Bin 4744 -> 6057 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/netwatch-notify.d/notification-01-down.avif b/doc/netwatch-notify.d/notification-01-down.avif index 894fb23ff4c3fa227e797d8ec03801bb59a61bd2..2257a0d3de2d384348884cb48fd8bf753c892e6a 100644 GIT binary patch delta 4936 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 Cp2T$k diff --git a/doc/netwatch-notify.d/notification-02-up.avif b/doc/netwatch-notify.d/notification-02-up.avif index 9021a93b9c174db32c78586d4dc3bf0f40ef6a4f..4147cb7779a06063d8c6526fa8a6de515f0deae9 100644 GIT binary patch delta 5874 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 mWWTLZ4y+F_y9zPRMy@pg From 9db7f4494cfbc77697a9a9a21519236cabddb9dc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 21 Nov 2025 23:41:08 +0100 Subject: [PATCH 868/893] doc/sms-forward: update notifications MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/sms-forward.d/notification.avif ----- >8 ----- [rsc] 📨️ SMS Forwarding from 7277 Received this message by rsc from 7277: 📨️ On 2025-08-20 01:01:15+02:00 type class-0: Welcome to our network! ----- >8 ----- --- doc/sms-forward.d/notification.avif | Bin 4619 -> 4966 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/sms-forward.d/notification.avif b/doc/sms-forward.d/notification.avif index 01eb7ba6713a1bff1b0e55e5c730050724a21477..14764a3cb5cae91932b2e9326f7d7e5d7ce20630 100644 GIT binary patch delta 4774 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 AMgRZ+ delta 4426 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 QO1BPWb4(1-z}@Qr;6avvkpKVy From daeb173dbcee7384a6dfa9fc45a1c1da1df3ba1a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 25 Nov 2025 18:44:52 +0100 Subject: [PATCH 869/893] doc/check-routeros-update: add screenshot from terminal --- doc/check-routeros-update.d/terminal.avif | Bin 0 -> 2163 bytes doc/check-routeros-update.md | 2 ++ 2 files changed, 2 insertions(+) create mode 100644 doc/check-routeros-update.d/terminal.avif diff --git a/doc/check-routeros-update.d/terminal.avif b/doc/check-routeros-update.d/terminal.avif new file mode 100644 index 0000000000000000000000000000000000000000..af950593e0d63d10e532d01a32b54a6fd1a4d1b7 GIT binary patch literal 2163 zcmXv|2|N>gA0MIIjLG9%(;Phsxz7^0=bTZ5nQPi?W|muQ6tDI0qDdnmMM%j*2cFz9 zDfdwbLp0||a=g>~d4B)T|M$KApa1U%006*2#ArN{gbo65>IkvuAT2B!83Z%eGUr&! z*gzukDC5+rkN^zf{}cegqfx|v`M)TFM-#EX1sA6)pfNbqk+K8;xH#vi1Gpprfa87~ zu8Ky7{T})|k>Q9yZjODVkR(kl3mgXbdsZkKPr!40do&(}Egj41OqnwdF`tz_8e2hZ+jrZQETu>ZbvoHXXaS41?+)71oBJM zxC5EA&@k>Gsq(UVo{Zs>SGnKdrH0r5d5tRPu`o*pflJ`Ba(Js5-(l((kDrauwM<@R zvo~hFCVJ8<%T3eWmQgo*)!&`#8?{|_+G#Pc{!o-xW&1w(9_{Lct@jjYS_>L=Xw-P% z5`?fXH?y4gHI?dts9evFb+3T_60cRoOR_55B=><2iaxrYAK7hLFh!CjqY+AF)HTm8 z#mP^^1B!#DuR>((xv_>&<5lw0`Xr!>X}RANFnHfb&YJDpmA>`Im)_bL8Ji4B0aJ#W zFtw#mlq{F9pLN-6ia^FMEwr>I$#~tlEG3GYg}6~Y+I8c4UeTLiVK|TH>iRn|MhoDY zf=Jocsh?N2tc=;N{fqDcUDsVhX|QF(c0$$);ve^Up8%nYamR<`(GG_&rfi0)-bBmv zGPXk7Ox$W4ITfDnS-K(hv^)CKNquwvmtqTiefr-A;{`}FHR2yuf*Jj}Fh8m^=~5h( zahAI!MgRFzm9Q=9jp6ujKYxkM5$|?N8|{I4nA9kd0t9CMMSE^8+nUv!@(NRNbBf(K z>^_-)YX2MAOv@3a>V;_JJJ0G33))&+n{T)^@fI<4c&C5Iq6kBJE}~@JW`9Dg(X15Z z=;@k;-^uhQJE%d)Ah1;?f(5(nTjhaWE%Lo$wE}g$WLHiX*BYF>Wn1-W=2Z%;&VZQj z_bRMVH+uYG%sGCYD8$&DND?)*&KKn+ob5@gk;5wUuqr-V2 zL*#putWeRp*hlFd3!eT@E6({|@`?q6W&#ja*<{F@UAun9e0|FjxY-i2nm3PD?abj( zOVbppSN~kuI&J)MKZ?KRFiz1H|#_Ck0CtrQws(&FAAx3;8rE07hxBjh=~!Bp@Z z>Pl4{xaoXq9dN!oYCyuZN`i%p9Es0y>kn5iy^%YR$^id8}&L!-($5eAW7LYd*O_h zxdT>3X*0;Q{=J?5=TX*(>xl0+9ZF9ad3lBr$a_3|+Buca@R^g&`p8aPF6`}sL&t_t zy;bJkSAWc>gl+F!A3AvQ>%*l2KI0ZI<$i{bF_)utOfGCpr^aFBhvHyd~BdIp}d}Po;tHqvEYsr<~;RS{BKFNw`h zg-rg2B0#yB1em$TkF9o?GW$aKq&abu_TTDzzVD%2bthFjfW#Lfhw;k8n(g~s1F@&6 z{VSBNz1PBtmo+H#G5b|DyO+1G312@juj^AXr7szqSTm*m>Y=@XXHOvh5WX6beVx^& z7fV<&pnHXw{iQSE(peQiLh4Mc35MJdRWJRX`{S;3E=q8J`{xEJ=o6(sWOi~p_? z_7hoc%i5-hI^J31(h8Ws!?X`7bT;-%YAM3^hYPjR*povFjZwTEBAcYs+m);A?k1x? zsV5ADD1Fs`cJ6*T4SyuS_+d+NCWJVh|B? zn@8YIrB|DM*#^SpCL<5hb5Oecp-a1elO&4)(3>ieu}t|0f`0J+ptWL0zVG80^s$5l znY6;!1p@2QXFn?{n~@n4V&5ok0<-E5Yx`xO=>e)L>Kf*qY*~qmNrA$98kC0EBf*!bd7k>^&>n_xV1~c7jWc&@jSt<{>rywN1;&XSNkfZZ+pZ|IFNS SCOnxfr6sQzgDUsdo&N`(d)jLN literal 0 HcmV?d00001 diff --git a/doc/check-routeros-update.md b/doc/check-routeros-update.md index 516dc62..029182d 100644 --- a/doc/check-routeros-update.md +++ b/doc/check-routeros-update.md @@ -88,6 +88,8 @@ Be notified when run from scheduler or run it manually: If an update is found you can install it right away. +![Terminal](check-routeros-update.d/terminal.avif) + Installing script [packages-update](packages-update.md) gives extra options. Tips & Tricks From 1f11f72d1827748e62c5cac885c5e9c5afdeede6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 27 Nov 2025 08:48:35 +0100 Subject: [PATCH 870/893] global-functions: $SymbolByUnicodeName: add special with magic --- global-functions.rsc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index db9eac6..412bd0b 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1672,6 +1672,7 @@ :set SymbolByUnicodeName do={ :local Name [ :tostr $1 ]; + :global EitherOr; :global LogPrintOnce; :global SymbolsExtra; @@ -1713,12 +1714,18 @@ "white-heavy-check-mark"="\E2\9C\85" }, $SymbolsExtra); + :local Magic [ :pick [ /system/clock/get date ] 4 10 ]; + :local Special { + "large-orange-circle-04-01"="\F0\9F\8D\8A"; + "large-orange-circle-10-31"="\F0\9F\8E\83"; + "large-red-circle-04-01"="\F0\9F\8D\92" }; + :if ([ :len ($Symbols->$Name) ] = 0) do={ $LogPrintOnce warning $0 ("No symbol available for name '" . $Name . "'!"); :return ""; } - :return (($Symbols->$Name) . "\EF\B8\8F"); + :return ([ $EitherOr ($Special->($Name . $Magic)) ($Symbols->$Name) ] . "\EF\B8\8F"); } # return symbol for notification From 7caaa6232198ae3c0376b2364c39d9d4372c396b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 27 Nov 2025 11:21:55 +0100 Subject: [PATCH 871/893] check-perpetual-license: add scroll symbol in notification MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit doc/check-perpetual-license.d/notification-01-warn.avif ----- >8 ----- [rsc] 📜⚠️ License about to expire! Your license failed to renew and is about to expire on 2025-09-13 12:12:23 on rsc... ----- >8 ----- doc/check-perpetual-license.d/notification-02-renew.avif ----- >8 ----- [rsc] 📜✅️ License renewed Your license was successfully renewed on rsc. It is now valid until 2025-10-25 08:42:46. ----- >8 ----- --- check-perpetual-license.rsc | 6 +++--- .../notification-01-warn.avif | Bin 4044 -> 4105 bytes .../notification-02-renew.avif | Bin 3944 -> 4021 bytes global-functions.rsc | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/check-perpetual-license.rsc b/check-perpetual-license.rsc index c2f0dff..a88498d 100644 --- a/check-perpetual-license.rsc +++ b/check-perpetual-license.rsc @@ -42,7 +42,7 @@ $LogPrint warning $ScriptName ("Your license expired on " . ($License->"deadline-at") . "!"); :if ($SentCertificateNotification != "expired") do={ $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "warning-sign" ] . "License expired!"); \ + subject=([ $SymbolForNotification "scroll,warning-sign" ] . "License expired!"); \ message=("Your license expired on " . ($License->"deadline-at") . \ ", can no longer update RouterOS on " . $Identity . "...") }); :set SentCertificateNotification "expired"; @@ -55,7 +55,7 @@ $LogPrint warning $ScriptName ("Your license will expire on " . ($License->"deadline-at") . "!"); :if ($SentCertificateNotification != "warning") do={ $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "warning-sign" ] . "License about to expire!"); \ + subject=([ $SymbolForNotification "scroll,warning-sign" ] . "License about to expire!"); \ message=("Your license failed to renew and is about to expire on " . \ ($License->"deadline-at") . " on " . $Identity . "...") }); :set SentCertificateNotification "warning"; @@ -68,7 +68,7 @@ [ :totime ($License->"deadline-at") ] - 4w > [ :timestamp ]) do={ $LogPrint info $ScriptName ("Your license was successfully renewed."); $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "white-heavy-check-mark" ] . "License renewed"); \ + subject=([ $SymbolForNotification "scroll,white-heavy-check-mark" ] . "License renewed"); \ message=("Your license was successfully renewed on " . $Identity . \ ". It is now valid until " . ($License->"deadline-at") . ".") }); :set SentCertificateNotification; diff --git a/doc/check-perpetual-license.d/notification-01-warn.avif b/doc/check-perpetual-license.d/notification-01-warn.avif index fb6b56ab49bada738b2ee356b6a70d890c330d54..aa36e45f11191afea75960cb8fd5a79db50f0ea0 100644 GIT binary patch delta 3314 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 delta 3253 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 nLE2_%r=8MZVXRk|+aD9q<$ziPKfzR9)l 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 SW482}fv&9G?Dwa-2i1_lC09cL delta 3155 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 tE|%W~ueTlFXA8G#69oY?%Up`8*lK*kM!uRM Date: Mon, 1 Dec 2025 11:25:00 +0100 Subject: [PATCH 872/893] README: add missing space --- README.d/04-import-scripts.avif | Bin 4805 -> 4813 bytes README.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/README.d/04-import-scripts.avif b/README.d/04-import-scripts.avif index 27380eba1666633b70e4c4fd2746d27ad2f9205b..c09949ab604d054e2d3d2cef93faf466e3bb0216 100644 GIT binary patch delta 243 zcmVGHHeuB5)!`^u`ICf{patH(YybZv9onpVOe!uY`)F9ct#T zI*j5LkXT4D;4*(S?>Qer+I*$-;Qu}QGK-}fDL$}Iu^5#pqV?ic@Qaan=Fwrj1<6lw zBfWX9Prwvgnf4fn!ceb30Co}{`KmnG=7Vn?G(PB=GD|`TdXOnkIhMJzLF8{`FEaN8 tW^tkXA3eE2DXf0gKL#FcmcAJd6f~mZDe6|5&#MYI3==ttP(P%vmXK95Pv|Kv}*>`Dse{r z!Yyprgb<4s5F#FL-stO0*p;FNSZs6sZ}4+&9BeBhs^#Kkj~iDlEQlfb?nevOz2bZn z_Ol-&ML*v|s0@&CDm+x-K7`6tmOhe)dwPNXz{pIqhUt#!?2)XUoF2Ea|CnzG!Vp=! zRcl}V9Vf|59;W=ir$_?_1Rf%$J}Q&oAtZd6s9hLFlM<+%(Cnlhb~helwtnj|F@`iv lL-(7Q=O=+C8zh6N%|OX30tBS(tu-w{kcY%|Qb_&3n>?&VYhVBX diff --git a/README.md b/README.md index 0aedfcf..d562ada 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,7 @@ date and time is set correctly! Now let's download the main scripts and add them in configuration on the fly. - :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ /system/script/add name=$Script owner=$Script source=([ /tool/fetch check-certificate=yes-without-crl ("https://rsc.eworm.de/main/" . $Script . ".rsc") output=user as-value]->"data"); }; + :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ /system/script/add name=$Script owner=$Script source=([ /tool/fetch check-certificate=yes-without-crl ("https://rsc.eworm.de/main/" . $Script . ".rsc") output=user as-value ]->"data"); }; ![screenshot: import scripts](README.d/04-import-scripts.avif) From c0678f0501dfccc56b692a64439b4bd1982149a1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 1 Dec 2025 11:25:28 +0100 Subject: [PATCH 873/893] INITIAL-COMMANDS: add missing space --- INITIAL-COMMANDS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 374f716..e580bc5 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -41,7 +41,7 @@ Run the complete base installation: :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ :put "Installing $Script..."; /system/script/remove [ find where name=$Script ]; - /system/script/add name=$Script owner=$Script source=([ /tool/fetch check-certificate=yes-without-crl ($BaseUrl . $Script . ".rsc") output=user as-value]->"data"); + /system/script/add name=$Script owner=$Script source=([ /tool/fetch check-certificate=yes-without-crl ($BaseUrl . $Script . ".rsc") output=user as-value ]->"data"); }; :put "Loading configuration and functions..."; /system/script { run global-config; run global-functions; }; From 240decf4195993dbbb05dd39cdabf0e2659a18ed Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 3 Dec 2025 15:43:58 +0100 Subject: [PATCH 874/893] check-perpetual-license: cross-mark on already expired license --- check-perpetual-license.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check-perpetual-license.rsc b/check-perpetual-license.rsc index a88498d..ff775c3 100644 --- a/check-perpetual-license.rsc +++ b/check-perpetual-license.rsc @@ -42,7 +42,7 @@ $LogPrint warning $ScriptName ("Your license expired on " . ($License->"deadline-at") . "!"); :if ($SentCertificateNotification != "expired") do={ $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "scroll,warning-sign" ] . "License expired!"); \ + subject=([ $SymbolForNotification "scroll,cross-mark" ] . "License expired!"); \ message=("Your license expired on " . ($License->"deadline-at") . \ ", can no longer update RouterOS on " . $Identity . "...") }); :set SentCertificateNotification "expired"; From 830693df79df83c6114e3c8c5878a471d1cf43eb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 3 Dec 2025 17:39:52 +0100 Subject: [PATCH 875/893] global-functions: $SymbolByUnicodeName: extend special --- global-functions.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/global-functions.rsc b/global-functions.rsc index 75eccb9..4bd7128 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1717,6 +1717,7 @@ :local Magic [ :pick [ /system/clock/get date ] 4 10 ]; :local Special { + "information-04-01"="\F0\9F\9A\BB"; "large-orange-circle-04-01"="\F0\9F\8D\8A"; "large-orange-circle-10-31"="\F0\9F\8E\83"; "large-red-circle-04-01"="\F0\9F\8D\92" }; From 28b00e23a17b91243628b95d50b76bd4867a4fd8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 5 Dec 2025 12:02:29 +0100 Subject: [PATCH 876/893] check-routeros-update: $DoUpdate: drop message... ... as it's either not shown anyway (when rebooting already), `packages-update` gives reasonable output, or it is simply wrong (when `packages-update` failed). --- check-routeros-update.rsc | 3 --- 1 file changed, 3 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 8b80dde..e5b2e18 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -39,14 +39,11 @@ :local DoUpdate do={ :local ScriptName [ :tostr $1 ]; - :global LogPrint; - :if ([ :len [ /system/script/find where name="packages-update" ] ] > 0) do={ /system/script/run packages-update; } else={ /system/package/update/install without-paging; } - $LogPrint info $ScriptName ("Waiting for system to reboot."); } :if ([ $ScriptLock $ScriptName ] = false) do={ From 6e37bab48113fb696eca77a339911d6948b2d411 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 8 Dec 2025 09:31:12 +0100 Subject: [PATCH 877/893] netwatch-dns: add active check to keep DoH server --- netwatch-dns.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index eee5f85..a379504 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -94,8 +94,8 @@ :set ($HostInfo->"doh-url") ("https://" . [ $EitherOr $HostName ($HostVal->"host") ] . "/dns-query"); } - :if ($DohCurrent = $HostInfo->"doh-url") do={ - $LogPrint debug $ScriptName ("Current DoH server is still up: " . $DohCurrent); + :if ($DohCurrent = $HostInfo->"doh-url" && [ $IsDNSResolving ] = true) do={ + $LogPrint debug $ScriptName ("Current DoH server is still up and resolving: " . $DohCurrent); :set ExitOK true; :error true; } From 96896c37e5bf2dc80941e572c4a93c26ddcaf935 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 8 Dec 2025 09:36:03 +0100 Subject: [PATCH 878/893] netwatch-dns: update wording to reflect the extra check --- netwatch-dns.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index a379504..6006405 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -105,7 +105,7 @@ } :if ([ :len $DohCurrent ] > 0) do={ - $LogPrint info $ScriptName ("Current DoH server is down, disabling: " . $DohCurrent); + $LogPrint info $ScriptName ("Current DoH server is down or not resolving, disabling: " . $DohCurrent); /ip/dns/set use-doh-server=""; /ip/dns/cache/flush; } From c697c321e6381c60873b49f3cc332351ee758e06 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 9 Dec 2025 21:48:16 +0100 Subject: [PATCH 879/893] netwatch-dns: drop early check... ... as the later check should handle that just fine. --- netwatch-dns.rsc | 7 ------- 1 file changed, 7 deletions(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 6006405..43669fa 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -73,13 +73,6 @@ :local DohCurrent [ /ip/dns/get use-doh-server ]; :local DohServers ({}); - - :if ([ :len $DohCurrent ] > 0 && [ $IsDNSResolving ] = false && [ $IsTimeSync ] = false) do={ - $LogPrint info $ScriptName ("Time is not sync, disabling DoH: " . $DohCurrent); - /ip/dns/set use-doh-server=""; - :set DohCurrent ""; - } - :foreach Host in=[ /tool/netwatch/find where comment~"\\bdoh\\b" status="up" ] do={ :local HostVal [ /tool/netwatch/get $Host ]; :local HostInfo [ $ParseKeyValueStore ($HostVal->"comment") ]; From 222404535b55c61937a8def152d412ac0a611507 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 10 Dec 2025 16:29:20 +0100 Subject: [PATCH 880/893] netwatch-dns: drop declaration of unused function --- netwatch-dns.rsc | 1 - 1 file changed, 1 deletion(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 43669fa..ab4beb1 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -19,7 +19,6 @@ :global CertificateAvailable; :global EitherOr; :global IsDNSResolving; - :global IsTimeSync; :global LogPrint; :global LogPrintOnce; :global ParseKeyValueStore; From 0745f09a8a80adf08094bae5d58ed092547b423d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 22 Dec 2025 09:14:26 +0100 Subject: [PATCH 881/893] global-functions: $FetchHuge: handle missing file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This should not happen, as download was supposed to be successful - it does. 🤪 --- global-functions.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 4bd7128..eb02ac4 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -518,7 +518,11 @@ $RmDir $DirName; :return false; } - $WaitForFile $FileName; + + :if ([ $WaitForFile $FileName 5s ] = false) do={ + $LogPrint debug $0 ("The file downloaded from " . $Url . " did not show up."); + :return false; + } :local FileSize [ /file/get $FileName size ]; :local Return ""; From ee9618014c7e86623ae333460c31e486ce6dbf97 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 12 Dec 2025 18:03:00 +0100 Subject: [PATCH 882/893] introduce contrib/telegram... ... with all the content for Miss Rose. https://t.me/MissRose_bot --- contrib/telegram.md | 274 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 274 insertions(+) create mode 100644 contrib/telegram.md diff --git a/contrib/telegram.md b/contrib/telegram.md new file mode 100644 index 0000000..f652505 --- /dev/null +++ b/contrib/telegram.md @@ -0,0 +1,274 @@ +Telegram +======== + +[![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) +[![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) +[![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) +[![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) + +[⬅️ Go back to main README](../README.md) + +We have [Miss Rose Bot ↗️](https://t.me/MissRose_bot) in our +[RouterOS-Scripts ↗️](https://t.me/routeros_scripts) Telegram group, +always kind and ready to help moderate. + +Notes +----- + +### README + + /save readme Please read the [main README](https://rsc.eworm.de/) to understand how things work and to get the base installation right. + +### Available scripts + +#### accesslist-duplicates + + /save accesslist-duplicates Find and remove access list duplicates with [accesslist-duplicates](https://rsc.eworm.de/doc/accesslist-duplicates.md). + +#### backup-cloud + + /save backup-cloud Upload backup to Mikrotik cloud with [backup-cloud](https://rsc.eworm.de/doc/backup-cloud.md). + +#### backup-email + + /save backup-email Send backup via e-mail with [backup-email](https://rsc.eworm.de/doc/backup-email.md). + +#### backup-partition + + /save backup-partition Save configuration to fallback partition with [backup-partition](https://rsc.eworm.de/doc/backup-partition.md). + +#### backup-upload + + /save backup-upload Upload backup to server with [backup-upload](https://rsc.eworm.de/doc/backup-upload.md). + +#### capsman-download-packages + + /save capsman-download-packages Download packages for CAP upgrade from CAPsMAN with [capsman-download-packages](https://rsc.eworm.de/doc/capsman-download-packages.md). + +#### capsman-rolling-upgrade + + /save capsman-rolling-upgrade Run rolling CAP upgrades from CAPsMAN with [capsman-rolling-upgrade](https://rsc.eworm.de/doc/capsman-rolling-upgrade.md). + +#### certificate-renew-issued + + /save certificate-renew-issued Renew locally issued certificates with [certificate-renew-issued](https://rsc.eworm.de/doc/certificate-renew-issued.md). + +#### check-certificates + + /save check-certificates Renew certificates and notify on expiration with [check-certificates](https://rsc.eworm.de/doc/check-certificates.md). + +#### check-health + + /save check-health Notify about health state with [check-health](https://rsc.eworm.de/doc/check-health.md). + +#### check-lte-firmware-upgrade + + /save check-lte-firmware-upgrade Notify on LTE firmware upgrade with [check-lte-firmware-upgrade](https://rsc.eworm.de/doc/check-lte-firmware-upgrade.md). + +#### check-perpetual-license + + /save check-perpetual-license Check perpetual license on CHR with [check-perpetual-license](https://rsc.eworm.de/doc/check-perpetual-license.md). + +#### check-routeros-update + + /save check-routeros-update Notify on RouterOS update with [check-routeros-update](https://rsc.eworm.de/doc/check-routeros-update.md). + +#### collect-wireless-mac + + /save collect-wireless-mac Collect MAC addresses in wireless access list with [collect-wireless-mac](https://rsc.eworm.de/doc/collect-wireless-mac.md). + +#### daily-psk + + /save daily-psk Use wireless network with [daily-psk](https://rsc.eworm.de/doc/daily-psk.md). + +#### dhcp-lease-comment + + /save dhcp-lease-comment Comment DHCP leases with [dhcp-lease-comment](https://rsc.eworm.de/doc/dhcp-lease-comment.md). + +#### dhcp-to-dns + + /save dhcp-to-dns Create DNS records for DHCP leases with [dhcp-to-dns](https://rsc.eworm.de/doc/dhcp-to-dns.md). + +#### firmware-upgrade-reboot + + /save firmware-upgrade-reboot Automatically upgrade firmware and reboot with [firmware-upgrade-reboot](https://rsc.eworm.de/doc/firmware-upgrade-reboot.md). + +#### fw-addr-lists + + /save fw-addr-lists Download, import and update firewall address-lists with [fw-addr-lists](https://rsc.eworm.de/doc/fw-addr-lists.md). + +#### global-wait + + /save global-wait Wait for global functions und modules with [global-wait](https://rsc.eworm.de/doc/global-wait.md). + +#### gps-track + + /save gps-track Send GPS position to server with [gps-track](https://rsc.eworm.de/doc/gps-track.md). + +#### hotspot-to-wpa + + /save hotspot-to-wpa Use WPA network with [hotspot-to-wpa](https://rsc.eworm.de/doc/hotspot-to-wpa.md). + +#### ipsec-to-dns + + /save ipsec-to-dns Create DNS records for IPSec peers with [ipsec-to-dns](https://rsc.eworm.de/doc/ipsec-to-dns.md). + +#### ipv6-update + + /save ipv6-update Update configuration on IPv6 prefix change with [ipv6-update](https://rsc.eworm.de/doc/ipv6-update.md). + +#### ip-addr-bridge + + /save ip-addr-bridge Manage IP addresses with [ip-addr-bridge](https://rsc.eworm.de/doc/ip-addr-bridge.md). + +#### lease-script + + /save lease-script Run other scripts on DHCP lease with [lease-script](https://rsc.eworm.de/doc/lease-script.md). + +#### leds-mode + + /save leds-mode Manage LEDs dark mode with [leds-mode](https://rsc.eworm.de/doc/leds-mode.md). + +#### log-forward + + /save log-forward Forward log messages via notification with [log-forward](https://rsc.eworm.de/doc/log-forward.md). + +#### mode-button + + /save mode-button Mode button with [mode-button](https://rsc.eworm.de/doc/mode-button.md). + +#### netwatch-dns + + /save netwatch-dns Manage DNS and DoH servers from netwatch with [netwatch-dns](https://rsc.eworm.de/doc/netwatch-dns.md). + +#### netwatch-notify + + /save netwatch-notify Notify on host up and down with [netwatch-notify](https://rsc.eworm.de/doc/netwatch-notify.md). + +#### ospf-to-leds + + /save ospf-to-leds Visualize OSPF state via LEDs with [ospf-to-leds](https://rsc.eworm.de/doc/ospf-to-leds.md). + +#### packages-update + + /save packages-update Manage system update with [packages-update](https://rsc.eworm.de/doc/packages-update.md). + +#### ppp-on-up + + /save ppp-on-up Run scripts on ppp connection with [ppp-on-up](https://rsc.eworm.de/doc/ppp-on-up.md). + +#### sms-action + + /save sms-action Act on received SMS with [sms-action](https://rsc.eworm.de/doc/sms-action.md). + +#### sms-forward + + /save sms-forward Forward received SMS with [sms-forward](https://rsc.eworm.de/doc/sms-forward.md). + +#### super-mario-theme + + /save super-mario-theme Play Super Mario theme with [super-mario-theme](https://rsc.eworm.de/doc/super-mario-theme.md). + +#### telegram-chat + + /save telegram-chat Chat with [telegram-chat](https://rsc.eworm.de/doc/telegram-chat.md). + +#### unattended-lte-firmware-upgrade + + /save unattended-lte-firmware-upgrade Install LTE firmware upgrade with [unattended-lte-firmware-upgrade](https://rsc.eworm.de/doc/unattended-lte-firmware-upgrade.md). + +#### update-gre-address + + /save update-gre-address Update GRE configuration with [update-gre-address](https://rsc.eworm.de/doc/update-gre-address.md). + +#### update-tunnelbroker + + /save update-tunnelbroker Update tunnelbroker configuration with [update-tunnelbroker](https://rsc.eworm.de/doc/update-tunnelbroker.md). + +### Available modules + +#### mod/bridge-port-to + + /save mod/bridge-port-to Manage ports in bridge with [mod/bridge-port-to](https://rsc.eworm.de/doc/mod/bridge-port-to.md). + +#### mod/bridge-port-vlan + + /save mod/bridge-port-vlan Manage VLANs on bridge ports with [mod/bridge-port-vlan](https://rsc.eworm.de/doc/mod/bridge-port-vlan.md). + +#### mod/inspectvar + + /save mod/inspectvar Inspect variables with [mod/inspectvar](https://rsc.eworm.de/doc/mod/inspectvar.md). + +#### mod/ipcalc + + /save mod/ipcalc IP address calculation with [mod/ipcalc](https://rsc.eworm.de/doc/mod/ipcalc.md). + +#### mod/notification-email + + /save mod/notification-email Send notifications via e-mail with [mod/notification-email](https://rsc.eworm.de/doc/mod/notification-email.md). + +#### mod/notification-gotify + + /save mod/notification-gotify Send notifications via Gotify with [mod/notification-gotify](https://rsc.eworm.de/doc/mod/notification-gotify.md). + +#### mod/notification-matrix + + /save mod/notification-matrix Send notifications via Matrix with [mod/notification-matrix](https://rsc.eworm.de/doc/mod/notification-matrix.md). + +#### mod/notification-ntfy + + /save mod/notification-ntfy Send notifications via Ntfy with [mod/notification-ntfy](https://rsc.eworm.de/doc/mod/notification-ntfy.md). + +#### mod/notification-telegram + + /save mod/notification-telegram Send notifications via Telegram with [mod/notification-telegram](https://rsc.eworm.de/doc/mod/notification-telegram.md). + +#### mod/scriptrunonce + + /save mod/scriptrunonce Download script and run it once with [mod/scriptrunonce](https://rsc.eworm.de/doc/mod/scriptrunonce.md). + +#### mod/ssh-keys-import + + /save mod/ssh-keys-import Import ssh keys for public key authentication with [mod/ssh-keys-import](https://rsc.eworm.de/doc/mod/ssh-keys-import.md). + +### Other + +#### Installing from branches + + /save branches Living on the edge or testing new features? Learn how to [switch specific scripts or the complete installation to different branches](https://rsc.eworm.de/BRANCHES.md). + +#### Certificate name from browser + + /save certificate-name-from-browser Running or accessing a custom service and looking for the CA certificate? Get the [certificate name from browser](https://rsc.eworm.de/CERTIFICATES.md). + +#### Debug output and logs + + /save debug Enable [debug output and logs](https://rsc.eworm.de/DEBUG.md) for more information on what happens. + +#### Donate + + /save donate This project is developed in private spare time and usage is free of charge for you. If you like the scripts and think this is of value for you or your business [please consider a donation](https://rsc.eworm.de/#donate). Thanks! + +#### Fix existing installation + + /save fix-installation [Fix existing installation] Your installation broke and you do not know back and forth? See how to [fix an existing installation](https://rsc.eworm.de/INITIAL-COMMANDS.md#fix-existing-installation). + +#### Next! + + /save next Another satisfied user. 😊 Next, please! + +#### Off-topic + + /save off-topic Please note this group is not about MikroTik RouterOS in general, but [RouterOS Scripts](https://rsc.eworm.de/). Your request is not about scripting at all, so please discuss somewhere else. See the [MikroTik RouterOS users (english)](https://t.me/RouterOS_users_english) group or official Mikrotik forums (https://forum.mikrotik.com/). + +Greeting +-------- + + /setwelcome Hello {mention} and welcome to {chatname}! + Please note this group is not about RouterOS in general, but [RouterOS Scripts](https://rsc.eworm.de/). Also pay attention to [rules](https://t.me/routeros_scripts/4), thanks! + +--- +[⬅️ Go back to main README](../README.md) +[⬆️ Go back to top](#top) From aa0b5a9ca248cf14d8f596f62a1c672ca7fe7c45 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 29 Dec 2025 19:21:29 +0100 Subject: [PATCH 883/893] README: add a brief description --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index d562ada..746390b 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,8 @@ RouterOS Scripts [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) +**a collection of scripts for MikroTik RouterOS** + ![RouterOS Scripts Logo](logo.svg) [RouterOS ↗️](https://mikrotik.com/software) is the operating system developed From 623f96d94a90327d06eed9612c4387cf404e85b1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 1 Jan 2026 13:47:40 +0100 Subject: [PATCH 884/893] update copyright for 2026 --- accesslist-duplicates.capsman.rsc | 2 +- accesslist-duplicates.local.rsc | 2 +- accesslist-duplicates.template.rsc | 2 +- accesslist-duplicates.wifi.rsc | 2 +- backup-cloud.rsc | 2 +- backup-email.rsc | 2 +- backup-partition.rsc | 2 +- backup-upload.rsc | 2 +- capsman-download-packages.capsman.rsc | 2 +- capsman-download-packages.template.rsc | 2 +- capsman-download-packages.wifi.rsc | 2 +- capsman-rolling-upgrade.capsman.rsc | 2 +- capsman-rolling-upgrade.template.rsc | 2 +- capsman-rolling-upgrade.wifi.rsc | 2 +- certificate-renew-issued.rsc | 2 +- check-certificates.rsc | 2 +- check-health.d/state.rsc | 2 +- check-health.d/temperature.rsc | 2 +- check-health.d/voltage.rsc | 2 +- check-health.rsc | 2 +- check-lte-firmware-upgrade.rsc | 2 +- check-perpetual-license.rsc | 2 +- check-routeros-update.rsc | 2 +- collect-wireless-mac.capsman.rsc | 2 +- collect-wireless-mac.local.rsc | 2 +- collect-wireless-mac.template.rsc | 2 +- collect-wireless-mac.wifi.rsc | 2 +- contrib/html.sh.d/foot.html | 2 +- contrib/logo-color.html | 2 +- contrib/notification.html | 2 +- daily-psk.capsman.rsc | 2 +- daily-psk.local.rsc | 2 +- daily-psk.template.rsc | 2 +- daily-psk.wifi.rsc | 2 +- dhcp-lease-comment.capsman.rsc | 2 +- dhcp-lease-comment.local.rsc | 2 +- dhcp-lease-comment.template.rsc | 2 +- dhcp-lease-comment.wifi.rsc | 2 +- dhcp-to-dns.rsc | 2 +- firmware-upgrade-reboot.rsc | 2 +- fw-addr-lists.rsc | 2 +- global-config-overlay.rsc | 2 +- global-config.rsc | 2 +- global-functions.rsc | 2 +- global-wait.rsc | 2 +- gps-track.rsc | 2 +- hotspot-to-wpa-cleanup.capsman.rsc | 2 +- hotspot-to-wpa-cleanup.template.rsc | 2 +- hotspot-to-wpa-cleanup.wifi.rsc | 2 +- hotspot-to-wpa.capsman.rsc | 2 +- hotspot-to-wpa.template.rsc | 2 +- hotspot-to-wpa.wifi.rsc | 2 +- ip-addr-bridge.rsc | 2 +- ipsec-to-dns.rsc | 2 +- ipv6-update.rsc | 2 +- lease-script.rsc | 2 +- leds-day-mode.rsc | 2 +- leds-night-mode.rsc | 2 +- leds-toggle-mode.rsc | 2 +- log-forward.rsc | 2 +- mod/bridge-port-to.rsc | 2 +- mod/bridge-port-vlan.rsc | 2 +- mod/inspectvar.rsc | 2 +- mod/ipcalc.rsc | 2 +- mod/notification-email.rsc | 2 +- mod/notification-gotify.rsc | 2 +- mod/notification-matrix.rsc | 2 +- mod/notification-ntfy.rsc | 2 +- mod/notification-telegram.rsc | 2 +- mod/scriptrunonce.rsc | 2 +- mod/ssh-keys-import.rsc | 2 +- mode-button.rsc | 2 +- netwatch-dns.rsc | 2 +- netwatch-notify.rsc | 2 +- news-and-changes.rsc | 2 +- ospf-to-leds.rsc | 2 +- packages-update.rsc | 2 +- ppp-on-up.rsc | 2 +- sms-action.rsc | 2 +- sms-forward.rsc | 2 +- super-mario-theme.rsc | 2 +- telegram-chat.rsc | 2 +- unattended-lte-firmware-upgrade.rsc | 2 +- update-gre-address.rsc | 2 +- update-tunnelbroker.rsc | 2 +- 85 files changed, 85 insertions(+), 85 deletions(-) diff --git a/accesslist-duplicates.capsman.rsc b/accesslist-duplicates.capsman.rsc index 1da0366..0d7a438 100644 --- a/accesslist-duplicates.capsman.rsc +++ b/accesslist-duplicates.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: accesslist-duplicates.capsman -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/accesslist-duplicates.local.rsc b/accesslist-duplicates.local.rsc index 03a9724..080ce72 100644 --- a/accesslist-duplicates.local.rsc +++ b/accesslist-duplicates.local.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: accesslist-duplicates.local -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/accesslist-duplicates.template.rsc b/accesslist-duplicates.template.rsc index bf23147..15e96a9 100644 --- a/accesslist-duplicates.template.rsc +++ b/accesslist-duplicates.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: accesslist-duplicates%TEMPL% -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/accesslist-duplicates.wifi.rsc b/accesslist-duplicates.wifi.rsc index 528a73c..7696f6c 100644 --- a/accesslist-duplicates.wifi.rsc +++ b/accesslist-duplicates.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: accesslist-duplicates.wifi -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/backup-cloud.rsc b/backup-cloud.rsc index e41db27..4d8830b 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: backup-cloud -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: backup-script, order=40 diff --git a/backup-email.rsc b/backup-email.rsc index 8015bea..317242b 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: backup-email -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: backup-script, order=20 diff --git a/backup-partition.rsc b/backup-partition.rsc index ae7ad03..5f8a635 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: backup-partition -# Copyright (c) 2022-2025 Christian Hesse +# Copyright (c) 2022-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: backup-script, order=70 diff --git a/backup-upload.rsc b/backup-upload.rsc index e6b9f92..f27032c 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: backup-upload -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: backup-script, order=50 diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index 2ea1667..ff91e7c 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: capsman-download-packages.capsman -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # Michael Gisbers # https://rsc.eworm.de/COPYING.md # diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index f95212a..7f0a4b4 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: capsman-download-packages%TEMPL% -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # Michael Gisbers # https://rsc.eworm.de/COPYING.md # diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 03fd9e7..d65a4ae 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: capsman-download-packages.wifi -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # Michael Gisbers # https://rsc.eworm.de/COPYING.md # diff --git a/capsman-rolling-upgrade.capsman.rsc b/capsman-rolling-upgrade.capsman.rsc index 0d4114a..81ce015 100644 --- a/capsman-rolling-upgrade.capsman.rsc +++ b/capsman-rolling-upgrade.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: capsman-rolling-upgrade.capsman -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # Michael Gisbers # https://rsc.eworm.de/COPYING.md # diff --git a/capsman-rolling-upgrade.template.rsc b/capsman-rolling-upgrade.template.rsc index 690d73d..9789d2f 100644 --- a/capsman-rolling-upgrade.template.rsc +++ b/capsman-rolling-upgrade.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: capsman-rolling-upgrade%TEMPL% -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # Michael Gisbers # https://rsc.eworm.de/COPYING.md # diff --git a/capsman-rolling-upgrade.wifi.rsc b/capsman-rolling-upgrade.wifi.rsc index 8e32ab2..bc0d4d3 100644 --- a/capsman-rolling-upgrade.wifi.rsc +++ b/capsman-rolling-upgrade.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: capsman-rolling-upgrade.wifi -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # Michael Gisbers # https://rsc.eworm.de/COPYING.md # diff --git a/certificate-renew-issued.rsc b/certificate-renew-issued.rsc index 14917e4..807f060 100644 --- a/certificate-renew-issued.rsc +++ b/certificate-renew-issued.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: certificate-renew-issued -# Copyright (c) 2019-2025 Christian Hesse +# Copyright (c) 2019-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/check-certificates.rsc b/check-certificates.rsc index 93641ee..db1e2d4 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: check-certificates -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/check-health.d/state.rsc b/check-health.d/state.rsc index 5e4cbb8..ab32e41 100644 --- a/check-health.d/state.rsc +++ b/check-health.d/state.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: check-health.d/state -# Copyright (c) 2019-2025 Christian Hesse +# Copyright (c) 2019-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/check-health.d/temperature.rsc b/check-health.d/temperature.rsc index 9f3f1a5..6ce3e95 100644 --- a/check-health.d/temperature.rsc +++ b/check-health.d/temperature.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: check-health.d/temperature -# Copyright (c) 2019-2025 Christian Hesse +# Copyright (c) 2019-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/check-health.d/voltage.rsc b/check-health.d/voltage.rsc index 5891fb4..59dd23c 100644 --- a/check-health.d/voltage.rsc +++ b/check-health.d/voltage.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: check-health.d/voltage -# Copyright (c) 2019-2025 Christian Hesse +# Copyright (c) 2019-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/check-health.rsc b/check-health.rsc index 760636d..4cb5baa 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: check-health -# Copyright (c) 2019-2025 Christian Hesse +# Copyright (c) 2019-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index 9f4b656..ced827e 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: check-lte-firmware-upgrade -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/check-perpetual-license.rsc b/check-perpetual-license.rsc index ff775c3..0e66bcc 100644 --- a/check-perpetual-license.rsc +++ b/check-perpetual-license.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: check-perpetual-license -# Copyright (c) 2025 Christian Hesse +# Copyright (c) 2025-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index e5b2e18..4a6925d 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: check-routeros-update -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/collect-wireless-mac.capsman.rsc b/collect-wireless-mac.capsman.rsc index 06b8d84..2572acc 100644 --- a/collect-wireless-mac.capsman.rsc +++ b/collect-wireless-mac.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: collect-wireless-mac.capsman -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=40 diff --git a/collect-wireless-mac.local.rsc b/collect-wireless-mac.local.rsc index 6716582..ae9a339 100644 --- a/collect-wireless-mac.local.rsc +++ b/collect-wireless-mac.local.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: collect-wireless-mac.local -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=40 diff --git a/collect-wireless-mac.template.rsc b/collect-wireless-mac.template.rsc index 53e6b0a..54b113e 100644 --- a/collect-wireless-mac.template.rsc +++ b/collect-wireless-mac.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: collect-wireless-mac%TEMPL% -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=40 diff --git a/collect-wireless-mac.wifi.rsc b/collect-wireless-mac.wifi.rsc index 43ac851..20bbb10 100644 --- a/collect-wireless-mac.wifi.rsc +++ b/collect-wireless-mac.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: collect-wireless-mac.wifi -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=40 diff --git a/contrib/html.sh.d/foot.html b/contrib/html.sh.d/foot.html index d304152..9e28e11 100644 --- a/contrib/html.sh.d/foot.html +++ b/contrib/html.sh.d/foot.html @@ -1,5 +1,5 @@

RouterOS Scripts documentation generated on __DATE__ for __VERSION__
-Copyright © 2013-2025 Christian Hesse <mail@eworm.de>

+Copyright © 2013-2026 Christian Hesse <mail@eworm.de>

diff --git a/contrib/logo-color.html b/contrib/logo-color.html index e5bfb71..3e9c05f 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -57,6 +57,6 @@ a profile photo
for your Telegram bot.

⬅️ Go back to main README
⬆️ Go back to top

-

Copyright © 2013-2025 Christian Hesse <mail@eworm.de>

+

Copyright © 2013-2026 Christian Hesse <mail@eworm.de>

diff --git a/contrib/notification.html b/contrib/notification.html index baa659c..239bc52 100644 --- a/contrib/notification.html +++ b/contrib/notification.html @@ -52,6 +52,6 @@ notification and download it.

⬅️ Go back to main README
⬆️ Go back to top

-

Copyright © 2013-2025 Christian Hesse <mail@eworm.de>

+

Copyright © 2013-2026 Christian Hesse <mail@eworm.de>

diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index 3ecd6b6..30781d3 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: daily-psk.capsman -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # Michael Gisbers # https://rsc.eworm.de/COPYING.md # diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index d496350..730c52f 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: daily-psk.local -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # Michael Gisbers # https://rsc.eworm.de/COPYING.md # diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 5a1df2f..51bc475 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: daily-psk%TEMPL% -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # Michael Gisbers # https://rsc.eworm.de/COPYING.md # diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index c441e58..91f323d 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: daily-psk.wifi -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # Michael Gisbers # https://rsc.eworm.de/COPYING.md # diff --git a/dhcp-lease-comment.capsman.rsc b/dhcp-lease-comment.capsman.rsc index 3615bb9..54dcc79 100644 --- a/dhcp-lease-comment.capsman.rsc +++ b/dhcp-lease-comment.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: dhcp-lease-comment.capsman -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=60 diff --git a/dhcp-lease-comment.local.rsc b/dhcp-lease-comment.local.rsc index 9da5333..8a54ef6 100644 --- a/dhcp-lease-comment.local.rsc +++ b/dhcp-lease-comment.local.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: dhcp-lease-comment.local -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=60 diff --git a/dhcp-lease-comment.template.rsc b/dhcp-lease-comment.template.rsc index 62cace1..3bc3072 100644 --- a/dhcp-lease-comment.template.rsc +++ b/dhcp-lease-comment.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: dhcp-lease-comment%TEMPL% -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=60 diff --git a/dhcp-lease-comment.wifi.rsc b/dhcp-lease-comment.wifi.rsc index 667708c..f9f1f04 100644 --- a/dhcp-lease-comment.wifi.rsc +++ b/dhcp-lease-comment.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: dhcp-lease-comment.wifi -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=60 diff --git a/dhcp-to-dns.rsc b/dhcp-to-dns.rsc index a9c91e1..7a823d2 100644 --- a/dhcp-to-dns.rsc +++ b/dhcp-to-dns.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: dhcp-to-dns -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=20 diff --git a/firmware-upgrade-reboot.rsc b/firmware-upgrade-reboot.rsc index e3ca55b..bd3aa17 100644 --- a/firmware-upgrade-reboot.rsc +++ b/firmware-upgrade-reboot.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: firmware-upgrade-reboot -# Copyright (c) 2022-2025 Christian Hesse +# Copyright (c) 2022-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index e5a71aa..a9c75d6 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: fw-addr-lists -# Copyright (c) 2023-2025 Christian Hesse +# Copyright (c) 2023-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.16 diff --git a/global-config-overlay.rsc b/global-config-overlay.rsc index 88bb4d9..5bfc303 100644 --- a/global-config-overlay.rsc +++ b/global-config-overlay.rsc @@ -1,5 +1,5 @@ # Overlay for global configuration by RouterOS Scripts -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # global configuration, custom overlay diff --git a/global-config.rsc b/global-config.rsc index 86d528a..3125041 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: global-config -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # global configuration diff --git a/global-functions.rsc b/global-functions.rsc index eb02ac4..ff663c7 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: global-functions -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # Michael Gisbers # https://rsc.eworm.de/COPYING.md # diff --git a/global-wait.rsc b/global-wait.rsc index 23b5629..746974e 100644 --- a/global-wait.rsc +++ b/global-wait.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: global-wait -# Copyright (c) 2020-2025 Christian Hesse +# Copyright (c) 2020-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/gps-track.rsc b/gps-track.rsc index 6a090bf..fb403e6 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: gps-track -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index e4ac967..585c792 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa-cleanup.capsman -# Copyright (c) 2021-2025 Christian Hesse +# Copyright (c) 2021-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=80 diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index d51e1d0..0aac42f 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa-cleanup%TEMPL% -# Copyright (c) 2021-2025 Christian Hesse +# Copyright (c) 2021-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=80 diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index 8bb2631..6803a44 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa-cleanup.wifi -# Copyright (c) 2021-2025 Christian Hesse +# Copyright (c) 2021-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=80 diff --git a/hotspot-to-wpa.capsman.rsc b/hotspot-to-wpa.capsman.rsc index 8977cee..cbe0a79 100644 --- a/hotspot-to-wpa.capsman.rsc +++ b/hotspot-to-wpa.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa.capsman -# Copyright (c) 2019-2025 Christian Hesse +# Copyright (c) 2019-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/hotspot-to-wpa.template.rsc b/hotspot-to-wpa.template.rsc index c5d977d..4169d6d 100644 --- a/hotspot-to-wpa.template.rsc +++ b/hotspot-to-wpa.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa%TEMPL% -# Copyright (c) 2019-2025 Christian Hesse +# Copyright (c) 2019-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/hotspot-to-wpa.wifi.rsc b/hotspot-to-wpa.wifi.rsc index 6a97e46..d90be35 100644 --- a/hotspot-to-wpa.wifi.rsc +++ b/hotspot-to-wpa.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa.wifi -# Copyright (c) 2019-2025 Christian Hesse +# Copyright (c) 2019-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/ip-addr-bridge.rsc b/ip-addr-bridge.rsc index 68ff4a4..0f2bf8a 100644 --- a/ip-addr-bridge.rsc +++ b/ip-addr-bridge.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: ip-addr-bridge -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # enable or disable ip addresses based on bridge port state diff --git a/ipsec-to-dns.rsc b/ipsec-to-dns.rsc index 1b5ed13..90a8215 100644 --- a/ipsec-to-dns.rsc +++ b/ipsec-to-dns.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: ipsec-to-dns -# Copyright (c) 2021-2025 Christian Hesse +# Copyright (c) 2021-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/ipv6-update.rsc b/ipv6-update.rsc index 580a426..0cbb2dc 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: ipv6-update -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/lease-script.rsc b/lease-script.rsc index ab44956..7f9eaa9 100644 --- a/lease-script.rsc +++ b/lease-script.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: lease-script -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/leds-day-mode.rsc b/leds-day-mode.rsc index 7344fde..d2341bf 100644 --- a/leds-day-mode.rsc +++ b/leds-day-mode.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: leds-day-mode -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # enable LEDs diff --git a/leds-night-mode.rsc b/leds-night-mode.rsc index 8bd028e..87094fa 100644 --- a/leds-night-mode.rsc +++ b/leds-night-mode.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: leds-night-mode -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # disable LEDs diff --git a/leds-toggle-mode.rsc b/leds-toggle-mode.rsc index b55e351..b611851 100644 --- a/leds-toggle-mode.rsc +++ b/leds-toggle-mode.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: leds-toggle-mode -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # toggle LEDs mode diff --git a/log-forward.rsc b/log-forward.rsc index 3d7d054..96edc11 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: log-forward -# Copyright (c) 2020-2025 Christian Hesse +# Copyright (c) 2020-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/mod/bridge-port-to.rsc b/mod/bridge-port-to.rsc index 93eedce..7046ff8 100644 --- a/mod/bridge-port-to.rsc +++ b/mod/bridge-port-to.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/bridge-port-to -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/mod/bridge-port-vlan.rsc b/mod/bridge-port-vlan.rsc index 6deee99..65c11fc 100644 --- a/mod/bridge-port-vlan.rsc +++ b/mod/bridge-port-vlan.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/bridge-port-vlan -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index fc1b366..d0473a9 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/inspectvar -# Copyright (c) 2020-2025 Christian Hesse +# Copyright (c) 2020-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/mod/ipcalc.rsc b/mod/ipcalc.rsc index d65d472..93ea8a3 100644 --- a/mod/ipcalc.rsc +++ b/mod/ipcalc.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/ipcalc -# Copyright (c) 2020-2025 Christian Hesse +# Copyright (c) 2020-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index 668daba..5f45e66 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/notification-email -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/mod/notification-gotify.rsc b/mod/notification-gotify.rsc index d8eafbe..464b427 100644 --- a/mod/notification-gotify.rsc +++ b/mod/notification-gotify.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/notification-gotify -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # Leonardo David Monteiro # https://rsc.eworm.de/COPYING.md # diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index e9b42a0..5203e0f 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/notification-matrix -# Copyright (c) 2013-2025 Michael Gisbers +# Copyright (c) 2013-2026 Michael Gisbers # Christian Hesse # https://rsc.eworm.de/COPYING.md # diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index dd10812..03a2d42 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/notification-ntfy -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index b1996a3..959924f 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/notification-telegram -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index 1d6aaf1..0242b16 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/scriptrunonece -# Copyright (c) 2020-2025 Christian Hesse +# Copyright (c) 2020-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index 8bea64e..fb0cc0f 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/ssh-keys-import -# Copyright (c) 2020-2025 Christian Hesse +# Copyright (c) 2020-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.16 diff --git a/mode-button.rsc b/mode-button.rsc index d82f899..b7a7b85 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mode-button -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index ab4beb1..c55f09e 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: netwatch-dns -# Copyright (c) 2022-2025 Christian Hesse +# Copyright (c) 2022-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.16 diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index 1fcc203..d4a9123 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: netwatch-notify -# Copyright (c) 2020-2025 Christian Hesse +# Copyright (c) 2020-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/news-and-changes.rsc b/news-and-changes.rsc index dbfb1b9..53f3e7b 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -1,5 +1,5 @@ # News, changes and migration by RouterOS Scripts -# Copyright (c) 2019-2025 Christian Hesse +# Copyright (c) 2019-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md :global IDonate; diff --git a/ospf-to-leds.rsc b/ospf-to-leds.rsc index 26f8aa3..10d3530 100644 --- a/ospf-to-leds.rsc +++ b/ospf-to-leds.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: ospf-to-leds -# Copyright (c) 2020-2025 Christian Hesse +# Copyright (c) 2020-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/packages-update.rsc b/packages-update.rsc index 379e818..b0bf547 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: packages-update -# Copyright (c) 2019-2025 Christian Hesse +# Copyright (c) 2019-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index f16d73f..bb09c85 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: ppp-on-up -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/sms-action.rsc b/sms-action.rsc index 47e1922..35f4cfa 100644 --- a/sms-action.rsc +++ b/sms-action.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: sms-action -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/sms-forward.rsc b/sms-forward.rsc index 161ae6b..e3d2d2e 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: sms-forward -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # Anatoly Bubenkov # https://rsc.eworm.de/COPYING.md # diff --git a/super-mario-theme.rsc b/super-mario-theme.rsc index 726c526..318f1d9 100644 --- a/super-mario-theme.rsc +++ b/super-mario-theme.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: super-mario-theme -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # play Super Mario theme diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 54872fb..1c949e8 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: telegram-chat -# Copyright (c) 2023-2025 Christian Hesse +# Copyright (c) 2023-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/unattended-lte-firmware-upgrade.rsc b/unattended-lte-firmware-upgrade.rsc index 237c2d8..6f1ac02 100644 --- a/unattended-lte-firmware-upgrade.rsc +++ b/unattended-lte-firmware-upgrade.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: unattended-lte-firmware-upgrade -# Copyright (c) 2018-2025 Christian Hesse +# Copyright (c) 2018-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/update-gre-address.rsc b/update-gre-address.rsc index dd7d63e..cde6aa0 100644 --- a/update-gre-address.rsc +++ b/update-gre-address.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: update-gre-address -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index 5372f4c..ee7f6f9 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: update-tunnelbroker -# Copyright (c) 2013-2025 Christian Hesse +# Copyright (c) 2013-2026 Christian Hesse # Michael Gisbers # https://rsc.eworm.de/COPYING.md # From 4af18ced9e6d035c36cab2d34d4caa486a45c092 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 5 Jan 2026 10:07:27 +0100 Subject: [PATCH 885/893] global-config: fix regex to load overlay snippets --- global-config.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-config.rsc b/global-config.rsc index 3125041..a36dbaa 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -276,7 +276,7 @@ # # load custom settings from overlay and snippets :foreach Script in=([ /system/script/find where name="global-config-overlay" ], \ - [ /system/script/find where name~"^global-config-overlay.d/" ]) do={ + [ /system/script/find where name~"^global-config-overlay\\.d/." ]) do={ :onerror Err { /system/script/run $Script; } do={ From 8528ca376cb8faf182af9e6e7ec7f7531f6fc9c4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 5 Jan 2026 10:08:09 +0100 Subject: [PATCH 886/893] global-config: support loading custom config snippets This may be interesting for custom scripts which can drop their own default global configuration. --- global-config.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/global-config.rsc b/global-config.rsc index a36dbaa..2525412 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -275,7 +275,8 @@ # /_()_\ Things *will* break! # # load custom settings from overlay and snippets -:foreach Script in=([ /system/script/find where name="global-config-overlay" ], \ +:foreach Script in=([ /system/script/find where name~"^global-config\\.d/." ], \ + [ /system/script/find where name="global-config-overlay" ], \ [ /system/script/find where name~"^global-config-overlay\\.d/." ]) do={ :onerror Err { /system/script/run $Script; From 8fa17d4b3b2ede5694f3f9e053d82e2491a9a77b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 5 Jan 2026 11:08:58 +0100 Subject: [PATCH 887/893] check-health: fix regex to load plugins --- check-health.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check-health.rsc b/check-health.rsc index 4cb5baa..90d8c84 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -74,7 +74,7 @@ :set CheckHealthRAMUtilizationNotified false; } - :local Plugins [ /system/script/find where name~"^check-health.d/." ]; + :local Plugins [ /system/script/find where name~"^check-health\\.d/." ]; :if ([ :len $Plugins ] = 0) do={ $LogPrint debug $ScriptName ("No plugins installed."); :set ExitOK true; From 8878449b0be665f0c0df1b4ad48d20e2bb53efe9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 5 Jan 2026 11:37:58 +0100 Subject: [PATCH 888/893] global-functions: support modules (or snippets) in global-functions.d/ --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index ff663c7..05c232a 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1900,7 +1900,7 @@ } # load modules -:foreach Script in=[ /system/script/find where name ~ "^mod/." ] do={ +:foreach Script in=[ /system/script/find where name ~ "^(global-functions\\.d|mod)/." ] do={ :local ScriptVal [ /system/script/get $Script ]; :if ([ $ValidateSyntax ($ScriptVal->"source") ] = true) do={ :onerror Err { From 7dc230cceb6166632cd1513dd294b5f6b6bb0226 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 Jan 2026 00:48:49 +0100 Subject: [PATCH 889/893] contrib/telegram: add Oxford Comma in greeting --- contrib/telegram.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/telegram.md b/contrib/telegram.md index f652505..355a9cd 100644 --- a/contrib/telegram.md +++ b/contrib/telegram.md @@ -266,7 +266,7 @@ Notes Greeting -------- - /setwelcome Hello {mention} and welcome to {chatname}! + /setwelcome Hello {mention}, and welcome to {chatname}! Please note this group is not about RouterOS in general, but [RouterOS Scripts](https://rsc.eworm.de/). Also pay attention to [rules](https://t.me/routeros_scripts/4), thanks! --- From 6990084d98f6063002fbfc7a500b8edead6a8309 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 Jan 2026 13:41:59 +0100 Subject: [PATCH 890/893] global-functions: $CharacterMultiply: use local variables for parameters --- global-functions.rsc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 05c232a..d99e216 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -240,9 +240,12 @@ # multiply given character(s) :set CharacterMultiply do={ + :local Str [ :tostr $1 ]; + :local Num [ :tonum $2 ]; + :local Return ""; - :for I from=1 to=$2 do={ - :set Return ($Return . $1); + :for I from=1 to=$Num do={ + :set Return ($Return . $Str); } :return $Return; } From 0ceedab5db11314ed0e275f2129d602ba20e81d0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 Jan 2026 13:43:11 +0100 Subject: [PATCH 891/893] global-functions: $CharacterMultiply: return early on length zero... ... as :for loop counts backwards and would return two character otherwise. --- global-functions.rsc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index d99e216..3b5db90 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -243,6 +243,10 @@ :local Str [ :tostr $1 ]; :local Num [ :tonum $2 ]; + :if ($Num = 0) do={ + :return ""; + } + :local Return ""; :for I from=1 to=$Num do={ :set Return ($Return . $Str); From 33061fea21ab6c7e081948a3a71763b27f16233e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 Jan 2026 13:54:35 +0100 Subject: [PATCH 892/893] mod/inspectvar: indent by two characters --- mod/inspectvar.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index d0473a9..63f35ba 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -36,7 +36,7 @@ :global CharacterMultiply; - :return ([ $CharacterMultiply " " $Level ] . "-" . $Prefix . "-> " . $Value); + :return ([ $CharacterMultiply " " ($Level * 2) ] . "-" . $Prefix . "-> " . $Value); } :local TypeOf [ :typeof $Input ]; From 0d71cd5b3bcb2ebf0a6d43ca74c04f0166ef5b24 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 Jan 2026 13:56:35 +0100 Subject: [PATCH 893/893] doc/mod/inspectvar: update screenshot... ... with fix from $CharacterMultiply and doubled indention. --- doc/mod/inspectvar.d/01-inspectvar.avif | Bin 4232 -> 4243 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/mod/inspectvar.d/01-inspectvar.avif b/doc/mod/inspectvar.d/01-inspectvar.avif index 1be1358008388ec650c82e8974859237a0a5846f..e4e9bd5ab16c330adfc3d4775f65d3c6199a6288 100644 GIT binary patch delta 3799 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 Ns2toksDS!{ISW0#U5Eex delta 3787 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

~Yh_~P@|>z=u7`j{mT7_W>n)j6m8kZ+2GJP- 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 V(D}T0{ai`;EVN36d*R2n;;^5yT!{bx literal 0 HcmV?d00001 diff --git a/CERTIFICATES.md b/CERTIFICATES.md new file mode 100644 index 0000000..dfd8639 --- /dev/null +++ b/CERTIFICATES.md @@ -0,0 +1,74 @@ +Certificate name from browser +============================= + +[![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) +[![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) +[![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) +[![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) + +[⬅️ Go back to main README](README.md) + +All well known desktop, mobile and server operating systems come with a +certificate store that is populated with a set of well known and trusted +certificates, acting as *trust anchors*. + +However RouterOS does not, still sometimes a specific certificate is +required to properly verify a chain of trust. One example is downloading +the scripts from this repository with `fetch` command, thus the very +first step of [installation](README.md#the-long-way-in-detail) is importing +the certificate. + +The scripts can install additional certificates when required. This happens +from this repository if available, or from [mkcert.org](https://mkcert.org) +as a fallback. + +Get the certificate's CommonName +-------------------------------- + +But how to determine what certificate may be required? Often easiest way +is to use a desktop browser to get that information. This demonstration uses +[Mozilla Firefox](https://www.mozilla.org/firefox/). + +Let's assume we want to make sure the certificate for +[git.eworm.de](https://git.eworm.de/) is available. Open that page in the +browser, then click the *lock* icon in addressbar, followed by "*Connection +secure*". + +![screenshot: dialog A](CERTIFICATES.d/01-dialog-A.avif) + +The dialog will change, click "*More information*". + +![screenshot: dialog B](CERTIFICATES.d/02-dialog-B.avif) + +A new window opens, click the button "*View Certificate*". (That window +can be closed now.) + +![screenshot: window](CERTIFICATES.d/03-window.avif) + +A new tab opens, showing information on the server certificate and its +chain of trust. The leftmost certificate is what we are interested in. + +![screenshot: certificate](CERTIFICATES.d/04-certificate.avif) + +Now we know that "`ISRG Root X2`" is required, some scripts need just +that information. + +Import a certificate by CommonName +---------------------------------- + +Running the function `$CertificateAvailable` with that name as parameter +makes sure the certificate is available in the device's store: + + $CertificateAvailable "ISRG Root X2"; + +If the certificate is actually available already nothing happens, and there +is no output. Otherwise the certificate is downloaded and imported. + +If importing a certificate with that exact name fails a warning is given +and nothing is actually imported. + +--- +[⬅️ Go back to main README](README.md) +[⬆️ Go back to top](#top) From af942d90d3eae961cc5616118800ec1727e14004 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 31 Oct 2024 14:31:20 +0100 Subject: [PATCH 176/893] doc/mod/notification-matrix: link to 'certificate name from browser' --- CERTIFICATES.md | 5 +++++ doc/mod/notification-matrix.md | 3 +++ 2 files changed, 8 insertions(+) diff --git a/CERTIFICATES.md b/CERTIFICATES.md index dfd8639..92a124b 100644 --- a/CERTIFICATES.md +++ b/CERTIFICATES.md @@ -69,6 +69,11 @@ is no output. Otherwise the certificate is downloaded and imported. If importing a certificate with that exact name fails a warning is given and nothing is actually imported. +See also +-------- + +* [Send notifications via Matrix](doc/mod/notification-matrix.md) + --- [⬅️ Go back to main README](README.md) [⬆️ Go back to top](#top) diff --git a/doc/mod/notification-matrix.md b/doc/mod/notification-matrix.md index dd46404..fbc9b91 100644 --- a/doc/mod/notification-matrix.md +++ b/doc/mod/notification-matrix.md @@ -52,6 +52,8 @@ Trust Services*. Run this to import the required certificate: $CertificateAvailable "GTS Root R4"; Replace the CA certificate name with what ever is needed for your server. +You may want to find the +[certificate name from browser](../../CERTIFICATES.md). ### From other device @@ -127,6 +129,7 @@ function available: See also -------- +* [Certificate name from browser](../../CERTIFICATES.md) * [Send notifications via e-mail](notification-email.md) * [Send notifications via Ntfy](notification-ntfy.md) * [Send notifications via Telegram](notification-telegram.md) From c5740c2328c4d468766686717fd14b9860e0494c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 31 Oct 2024 14:43:39 +0100 Subject: [PATCH 177/893] doc/mod/notification-ntfy: link to 'certificate name from browser' --- CERTIFICATES.md | 1 + doc/mod/notification-ntfy.md | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/CERTIFICATES.md b/CERTIFICATES.md index 92a124b..819c32c 100644 --- a/CERTIFICATES.md +++ b/CERTIFICATES.md @@ -73,6 +73,7 @@ See also -------- * [Send notifications via Matrix](doc/mod/notification-matrix.md) +* [Send notifications via Ntfy](doc/mod/notification-ntfy.md) --- [⬅️ Go back to main README](README.md) diff --git a/doc/mod/notification-ntfy.md b/doc/mod/notification-ntfy.md index 2a43e3c..5393d44 100644 --- a/doc/mod/notification-ntfy.md +++ b/doc/mod/notification-ntfy.md @@ -52,6 +52,10 @@ basic authentication. Configure `NtfyServerUser` and `NtfyServerPass` for this. Even authentication via access token is possible, adding it as password with a blank username. +For a custom service installing an additional certificate may be required. +You may want to install that certificate manually, after finding the +[certificate name from browser](../../CERTIFICATES.md). + Usage and invocation -------------------- @@ -82,6 +86,7 @@ function available: See also -------- +* [Certificate name from browser](../../CERTIFICATES.md) * [Send notifications via e-mail](notification-email.md) * [Send notifications via Matrix](notification-matrix.md) * [Send notifications via Telegram](notification-telegram.md) From d213369e73da042014ca68af17831c5bc3eb4310 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 31 Oct 2024 14:34:17 +0100 Subject: [PATCH 178/893] doc/fw-addr-lists: link to 'certificate name from browser' --- CERTIFICATES.md | 1 + doc/fw-addr-lists.md | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/CERTIFICATES.md b/CERTIFICATES.md index 819c32c..2543299 100644 --- a/CERTIFICATES.md +++ b/CERTIFICATES.md @@ -72,6 +72,7 @@ and nothing is actually imported. See also -------- +* [Download, import and update firewall address-lists](doc/fw-addr-lists.md) * [Send notifications via Matrix](doc/mod/notification-matrix.md) * [Send notifications via Ntfy](doc/mod/notification-ntfy.md) diff --git a/doc/fw-addr-lists.md b/doc/fw-addr-lists.md index 2008c7e..3d9e771 100644 --- a/doc/fw-addr-lists.md +++ b/doc/fw-addr-lists.md @@ -62,9 +62,8 @@ The configuration goes to `global-config-overlay`, these are the parameters: > your local `global-config-overlay` and modify it to your specific needs. Naming a certificate for a list makes the script verify the server -certificate, so you should add that if possible. Some certificates are -available in my repository and downloaded automatically. Import it manually -(menu `/certificate/`) if missing. +certificate, so you should add that if possible. You may want to find the +[certificate name from browser](../CERTIFICATES.md). Create firewall rules to process the packets that are related to addresses from address-lists. @@ -127,6 +126,11 @@ Drop packets in firewall's raw section: > ⚠️ **Warning**: Just again... The order of firewall rules is important. Make > sure they actually take effect as expected! +See also +-------- + +* [Certificate name from browser](../CERTIFICATES.md) + --- [⬅️ Go back to main README](../README.md) [⬆️ Go back to top](#top) From 31dfdf7e6243527d77af6b4ae93e753cd45c8cbb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 31 Oct 2024 15:17:31 +0100 Subject: [PATCH 179/893] doc/netwatch-dns: link to 'certificate name from browser' --- CERTIFICATES.md | 1 + doc/netwatch-dns.md | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CERTIFICATES.md b/CERTIFICATES.md index 2543299..589d480 100644 --- a/CERTIFICATES.md +++ b/CERTIFICATES.md @@ -73,6 +73,7 @@ See also -------- * [Download, import and update firewall address-lists](doc/fw-addr-lists.md) +* [Manage DNS and DoH servers from netwatch](doc/netwatch-dns.md) * [Send notifications via Matrix](doc/mod/notification-matrix.md) * [Send notifications via Ntfy](doc/mod/notification-ntfy.md) diff --git a/doc/netwatch-dns.md b/doc/netwatch-dns.md index 54dd6c6..cdfbd97 100644 --- a/doc/netwatch-dns.md +++ b/doc/netwatch-dns.md @@ -59,8 +59,8 @@ resolves to the same address. Be aware that you have to keep the ip address in sync with real world manually! -Importing a certificate automatically is possible, at least if available in -the repository (see `certs` sub directory). +Importing a certificate automatically is possible. You may want to find the +[certificate name from browser](../CERTIFICATES.md). /tool/netwatch/add comment="doh, doh-cert=DigiCert Global Root G2" host=1.1.1.1; /tool/netwatch/add comment="doh, doh-cert=DigiCert Global Root G3" host=9.9.9.9; @@ -87,6 +87,7 @@ Also this allows to update host address, see option `resolve`. See also -------- +* [Certificate name from browser](../CERTIFICATES.md) * [Notify on host up and down](netwatch-notify.md) --- From 084c246ef0cab329fe981732089277fa8398800b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 5 Nov 2024 17:49:28 +0100 Subject: [PATCH 180/893] fw-addr-lists: simplify looping lines With `:deserialize` the **record** separator is always a new line. The property `delimiter=` is a **field** reparator, so you can parse a lines into an array. We do not want (or need) that, so use new line as field separator. This will result in an array with just one element, and we use that. Also convert the data to line feed explicitly, just to be sure. --- fw-addr-lists.rsc | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 4675e3a..a9513d8 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -65,7 +65,7 @@ :for I from=1 to=5 do={ :if ($Data = false) do={ - :set Data [ $FetchHuge $ScriptName ($List->"url") $CheckCertificate ]; + :set Data [ :tolf [ $FetchHuge $ScriptName ($List->"url") $CheckCertificate ] ]; :if ($Data = false) do={ :if ($I < 5) do={ $LogPrint debug $ScriptName ("Failed downloading for list '" . $FwListName . \ @@ -86,8 +86,8 @@ "B for list '" . $FwListName . "' from: " . $List->"url"); } - :while ([ :len $Data ] != 0) do={ - :local Line [ :pick $Data 0 [ :find $Data "\n" ] ]; + :foreach Line in=[ :deserialize $Data delimiter="\n" from=dsv options=dsv.plain ] do={ + :set Line ($Line->0); :local Address; :if ([ :pick $Line 0 1 ] = "{") do={ :set Address [ :tostr ([ :deserialize from=json $Line ]->"cidr") ]; @@ -109,7 +109,6 @@ :error true; } } on-error={ } - :set Data [ :pick $Data ([ :len $Line ] + 1) [ :len $Data ] ]; } } From 9c945b1a3283bb352707c69630c579cf82484dcb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 6 Nov 2024 10:03:19 +0100 Subject: [PATCH 181/893] mod/ssh-keys-import: $SSHKeysImportFile: simplify looping lines --- mod/ssh-keys-import.rsc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index 8cafa95..00f443a 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -88,12 +88,11 @@ $LogPrint warning $0 ("File '" . $FileName . "' does not exist."); :return false; } - :local Keys ([ /file/get $FileName contents ] . "\n"); + :local Keys [ :tolf [ /file/get $FileName contents ] ]; - :do { + :foreach Line in=[ :deserialize $Keys delimiter="\n" from=dsv options=dsv.plain ] do={ + :set Line ($Line->0); :local Continue false; - :local Line [ :pick $Keys 0 [ :find $Keys "\n" ] ]; - :set Keys [ :pick $Keys ([ :find $Keys "\n" ] + 1) [ :len $Keys ] ]; :local KeyVal [ :toarray [ $CharacterReplace $Line " " "," ] ]; :if ($KeyVal->0 = "ssh-ed25519" || $KeyVal->0 = "ssh-rsa") do={ :do { @@ -110,5 +109,5 @@ :if ($Continue = false && [ :len ($KeyVal->0) ] > 0) do={ $LogPrint warning $0 ("SSH key of type '" . $KeyVal->0 . "' is not supported."); } - } while=([ :len $Keys ] > 0); + } } From 0837391c38987462c3a1787143d631b92e0a0551 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Nov 2024 08:30:07 +0100 Subject: [PATCH 182/893] mod/ssh-keys-import: $SSHKeysImportFile: let `:deserialize` split the fields --- mod/ssh-keys-import.rsc | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index 00f443a..f67c0fc 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -72,7 +72,6 @@ :local FileName [ :tostr $1 ]; :local User [ :tostr $2 ]; - :global CharacterReplace; :global EitherOr; :global LogPrint; :global ParseKeyValueStore; @@ -90,20 +89,18 @@ } :local Keys [ :tolf [ /file/get $FileName contents ] ]; - :foreach Line in=[ :deserialize $Keys delimiter="\n" from=dsv options=dsv.plain ] do={ - :set Line ($Line->0); + :foreach KeyVal in=[ :deserialize $Keys delimiter=" " from=dsv options=dsv.plain ] do={ :local Continue false; - :local KeyVal [ :toarray [ $CharacterReplace $Line " " "," ] ]; :if ($KeyVal->0 = "ssh-ed25519" || $KeyVal->0 = "ssh-rsa") do={ :do { - $SSHKeysImport $Line $User; + $SSHKeysImport ($KeyVal->0 . " " . $KeyVal->1 . " " . $KeyVal->2) $User; } on-error={ $LogPrint warning $0 ("Failed importing key for user '" . $User . "'."); } :set Continue true; } :if ($Continue = false && $KeyVal->0 = "#") do={ - :set User [ $EitherOr ([ $ParseKeyValueStore [ :pick $Line 2 [ :len $Line ] ] ]->"user") $User ]; + :set User [ $EitherOr ([ $ParseKeyValueStore ($KeyVal->1) ]->"user") $User ]; :set Continue true; } :if ($Continue = false && [ :len ($KeyVal->0) ] > 0) do={ From 1f526b356121749991fee69cee5a6c728855c8f2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 8 Nov 2024 08:50:12 +0100 Subject: [PATCH 183/893] mod/ssh-keys-import: $SSHKeysImport: split with `:deserialize` --- mod/ssh-keys-import.rsc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index f67c0fc..d6b3b3f 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -16,7 +16,6 @@ :local Key [ :tostr $1 ]; :local User [ :tostr $2 ]; - :global CharacterReplace; :global GetRandom20CharAlNum; :global LogPrint; :global MkDir; @@ -32,7 +31,7 @@ :return false; } - :local KeyVal [ :toarray [ $CharacterReplace $Key " " "," ] ]; + :local KeyVal ([ :deserialize $Key delimiter=" " from=dsv options=dsv.plain ]->0); :if (!($KeyVal->0 = "ssh-ed25519" || $KeyVal->0 = "ssh-rsa")) do={ $LogPrint warning $0 ("SSH key of type '" . $KeyVal->0 . "' is not supported."); :return false; From 6c8fa8e639318b72c2102dfff884aa039d09a0f0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 12 Nov 2024 17:40:05 +0100 Subject: [PATCH 184/893] check-routeros-update: replace hard-coded version --- check-routeros-update.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 84849ea..c7a5702 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -67,7 +67,7 @@ :local NumLatestFeature ($NumLatest & $BitMask); :local Link ("https://mikrotik.com/download/changelogs/" . $Update->"channel" . "-release-tree"); - :if ($NumLatest < 117505792) do={ + :if ($NumLatest < [ $VersionToNum "7.0" ]) do={ $LogPrint info $ScriptName ("The version '" . ($Update->"latest-version") . "' is not a valid version."); :error false; } From d97f63fa5a9e4649338e2a70e83516fbd6a61abc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 12 Nov 2024 17:41:54 +0100 Subject: [PATCH 185/893] check-routeros-update: add specific message for empty version string --- check-routeros-update.rsc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index c7a5702..7ff9ccb 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -60,6 +60,11 @@ :error true; } + :if ([ :len ($Update->"latest-version") ] = 0) do={ + $LogPrint info $ScriptName ("Received an empty version string from server."); + :error false; + } + :local NumInstalled [ $VersionToNum ($Update->"installed-version") ]; :local NumLatest [ $VersionToNum ($Update->"latest-version") ]; :local BitMask [ $VersionToNum "255.255zero0" ]; From 04172f0438411dd803705f372c7e85bd879d4d6b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 12 Nov 2024 17:42:54 +0100 Subject: [PATCH 186/893] check-routeros-update: make invalid version string a warning --- check-routeros-update.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 7ff9ccb..d489351 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -73,7 +73,7 @@ :local Link ("https://mikrotik.com/download/changelogs/" . $Update->"channel" . "-release-tree"); :if ($NumLatest < [ $VersionToNum "7.0" ]) do={ - $LogPrint info $ScriptName ("The version '" . ($Update->"latest-version") . "' is not a valid version."); + $LogPrint warning $ScriptName ("The version '" . ($Update->"latest-version") . "' is not a valid version."); :error false; } From a545d0d39e21b4fdf0b68153f7b4b175e2ea2bdf Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 12 Nov 2024 17:46:02 +0100 Subject: [PATCH 187/893] check-routeros-update: always exit early if up to date... ... and just make the output and log dependent on terminal. --- check-routeros-update.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index d489351..0624808 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -55,8 +55,10 @@ /system/package/update/check-for-updates without-paging as-value; :local Update [ /system/package/update/get ]; - :if ([ $ScriptFromTerminal $ScriptName ] = true && ($Update->"installed-version") = ($Update->"latest-version")) do={ - $LogPrint info $ScriptName ("System is already up to date."); + :if (($Update->"installed-version") = ($Update->"latest-version")) do={ + :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ + $LogPrint info $ScriptName ("System is already up to date."); + } :error true; } From f1533b8962bc67d17e9f6b5666ae51ee4d1e1ff4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 12 Nov 2024 17:53:30 +0100 Subject: [PATCH 188/893] hotspot-to-wpa-cleanup: use the timeout in message... ... not the actual value. --- hotspot-to-wpa-cleanup.capsman.rsc | 2 +- hotspot-to-wpa-cleanup.template.rsc | 2 +- hotspot-to-wpa-cleanup.wifi.rsc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index 45ea72b..e305170 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -65,7 +65,7 @@ server=$Server last-seen>$Timeout comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ - " was not seen for " . ($LeaseVal->"last-seen") . ", removing."); + " was not seen for " . $Timeout . ", removing."); /caps-man/access-list/remove [ find where comment~"^hotspot-to-wpa:" \ mac-address=($LeaseVal->"mac-address") ]; /ip/dhcp-server/lease/remove $Lease; diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index 081f3d0..70bee42 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -71,7 +71,7 @@ server=$Server last-seen>$Timeout comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ - " was not seen for " . ($LeaseVal->"last-seen") . ", removing."); + " was not seen for " . $Timeout . ", removing."); /caps-man/access-list/remove [ find where comment~"^hotspot-to-wpa:" \ /interface/wifi/access-list/remove [ find where comment~"^hotspot-to-wpa:" \ mac-address=($LeaseVal->"mac-address") ]; diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index 23f773f..c814705 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -65,7 +65,7 @@ server=$Server last-seen>$Timeout comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ - " was not seen for " . ($LeaseVal->"last-seen") . ", removing."); + " was not seen for " . $Timeout . ", removing."); /interface/wifi/access-list/remove [ find where comment~"^hotspot-to-wpa:" \ mac-address=($LeaseVal->"mac-address") ]; /ip/dhcp-server/lease/remove $Lease; From ae655646ba21cdf4638e6001a49c9d3cf849bc08 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 12 Nov 2024 18:02:26 +0100 Subject: [PATCH 189/893] hotspot-to-wpa-cleanup: clean up daily only --- hotspot-to-wpa-cleanup.capsman.rsc | 3 ++- hotspot-to-wpa-cleanup.template.rsc | 3 ++- hotspot-to-wpa-cleanup.wifi.rsc | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index e305170..674a480 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -62,7 +62,8 @@ :foreach Server,Timeout in=$DHCPServers do={ :foreach Lease in=[ /ip/dhcp-server/lease/find where !dynamic status="waiting" \ - server=$Server last-seen>$Timeout comment~"^hotspot-to-wpa:" ] do={ + server=$Server last-seen>($Timeout + [ /system/clock/get time ]) \ + comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ " was not seen for " . $Timeout . ", removing."); diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index 70bee42..88c307b 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -68,7 +68,8 @@ :foreach Server,Timeout in=$DHCPServers do={ :foreach Lease in=[ /ip/dhcp-server/lease/find where !dynamic status="waiting" \ - server=$Server last-seen>$Timeout comment~"^hotspot-to-wpa:" ] do={ + server=$Server last-seen>($Timeout + [ /system/clock/get time ]) \ + comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ " was not seen for " . $Timeout . ", removing."); diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index c814705..b73f1a9 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -62,7 +62,8 @@ :foreach Server,Timeout in=$DHCPServers do={ :foreach Lease in=[ /ip/dhcp-server/lease/find where !dynamic status="waiting" \ - server=$Server last-seen>$Timeout comment~"^hotspot-to-wpa:" ] do={ + server=$Server last-seen>($Timeout + [ /system/clock/get time ]) \ + comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ " was not seen for " . $Timeout . ", removing."); From e5c3aeb5cd314119dd7b062e43d65fdff7371051 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 13 Nov 2024 08:57:05 +0100 Subject: [PATCH 190/893] hotspot-to-wpa-cleanup: prepare real timeout value in variable... ... to make sure it is not re-calculated for every single lease. --- hotspot-to-wpa-cleanup.capsman.rsc | 4 ++-- hotspot-to-wpa-cleanup.template.rsc | 4 ++-- hotspot-to-wpa-cleanup.wifi.rsc | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index 674a480..d429904 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -61,9 +61,9 @@ } :foreach Server,Timeout in=$DHCPServers do={ + :local TimeoutExtra ($Timeout + [ /system/clock/get time ]); :foreach Lease in=[ /ip/dhcp-server/lease/find where !dynamic status="waiting" \ - server=$Server last-seen>($Timeout + [ /system/clock/get time ]) \ - comment~"^hotspot-to-wpa:" ] do={ + server=$Server last-seen>$TimeoutExtra comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ " was not seen for " . $Timeout . ", removing."); diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index 88c307b..726bc74 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -67,9 +67,9 @@ } :foreach Server,Timeout in=$DHCPServers do={ + :local TimeoutExtra ($Timeout + [ /system/clock/get time ]); :foreach Lease in=[ /ip/dhcp-server/lease/find where !dynamic status="waiting" \ - server=$Server last-seen>($Timeout + [ /system/clock/get time ]) \ - comment~"^hotspot-to-wpa:" ] do={ + server=$Server last-seen>$TimeoutExtra comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ " was not seen for " . $Timeout . ", removing."); diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index b73f1a9..32ae565 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -61,9 +61,9 @@ } :foreach Server,Timeout in=$DHCPServers do={ + :local TimeoutExtra ($Timeout + [ /system/clock/get time ]); :foreach Lease in=[ /ip/dhcp-server/lease/find where !dynamic status="waiting" \ - server=$Server last-seen>($Timeout + [ /system/clock/get time ]) \ - comment~"^hotspot-to-wpa:" ] do={ + server=$Server last-seen>$TimeoutExtra comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ " was not seen for " . $Timeout . ", removing."); From a224fbc42457550fcb7f6daa81c2cb14b7075799 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 13 Nov 2024 08:59:30 +0100 Subject: [PATCH 191/893] hotspot-to-wpa-cleanup: revert display of timeout value... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ... as the timeout is a time value, and showing "4w00:00:00" (with lots of zeros) is not any better. 😜 This reverts commit f1533b8962bc67d17e9f6b5666ae51ee4d1e1ff4. --- hotspot-to-wpa-cleanup.capsman.rsc | 2 +- hotspot-to-wpa-cleanup.template.rsc | 2 +- hotspot-to-wpa-cleanup.wifi.rsc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index d429904..e935850 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -66,7 +66,7 @@ server=$Server last-seen>$TimeoutExtra comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ - " was not seen for " . $Timeout . ", removing."); + " was not seen for " . ($LeaseVal->"last-seen") . ", removing."); /caps-man/access-list/remove [ find where comment~"^hotspot-to-wpa:" \ mac-address=($LeaseVal->"mac-address") ]; /ip/dhcp-server/lease/remove $Lease; diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index 726bc74..fa99b5d 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -72,7 +72,7 @@ server=$Server last-seen>$TimeoutExtra comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ - " was not seen for " . $Timeout . ", removing."); + " was not seen for " . ($LeaseVal->"last-seen") . ", removing."); /caps-man/access-list/remove [ find where comment~"^hotspot-to-wpa:" \ /interface/wifi/access-list/remove [ find where comment~"^hotspot-to-wpa:" \ mac-address=($LeaseVal->"mac-address") ]; diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index 32ae565..d3f859e 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -66,7 +66,7 @@ server=$Server last-seen>$TimeoutExtra comment~"^hotspot-to-wpa:" ] do={ :local LeaseVal [ /ip/dhcp-server/lease/get $Lease ]; $LogPrint info $ScriptName ("Client with mac address " . ($LeaseVal->"mac-address") . \ - " was not seen for " . $Timeout . ", removing."); + " was not seen for " . ($LeaseVal->"last-seen") . ", removing."); /interface/wifi/access-list/remove [ find where comment~"^hotspot-to-wpa:" \ mac-address=($LeaseVal->"mac-address") ]; /ip/dhcp-server/lease/remove $Lease; From 5b09469cc6c707b473b74687951b2d1e6468928a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 14 Nov 2024 21:03:07 +0100 Subject: [PATCH 192/893] packages-update: drop check for device-mode downgrade... ... as things have been revised and this specific setting was removed. --- packages-update.rsc | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages-update.rsc b/packages-update.rsc index c2f0ba6..b08a48d 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -99,12 +99,6 @@ :local DoDowngrade false; :if ($NumInstalled > $NumLatest) do={ - :if (([ /system/device-mode/get ]->"downgrade") = false) do={ - $LogPrint error $ScriptName \ - ("The device mode has locked downgrades! You will need physical access!"); - :error false; - } - :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ :put "Latest version is older than installed one. Want to downgrade? [y/N]"; :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ From 1beda3aa7c08cbe0e06aff164fabfa86e8b6353d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 15 Nov 2024 23:01:22 +0100 Subject: [PATCH 193/893] mode-button: fix the caller parameter to $LogPrint This is inside a function, so use just $0 here. --- mode-button.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mode-button.rsc b/mode-button.rsc index 7908a7f..84eb8ea 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -52,7 +52,7 @@ :if ([ :len $Code ] > 0) do={ :if ([ $ValidateSyntax $Code ] = true) do={ - $LogPrint info $ScriptName ("Acting on " . $Count . " mode-button presses: " . $Code); + $LogPrint info $0 ("Acting on " . $Count . " mode-button presses: " . $Code); :for I from=1 to=$Count do={ $LEDInvert; @@ -66,10 +66,10 @@ [ :parse $Code ]; } else={ - $LogPrint warning $ScriptName ("The code for " . $Count . " mode-button presses failed syntax validation!"); + $LogPrint warning $0 ("The code for " . $Count . " mode-button presses failed syntax validation!"); } } else={ - $LogPrint info $ScriptName ("No action defined for " . $Count . " mode-button presses."); + $LogPrint info $0 ("No action defined for " . $Count . " mode-button presses."); } } /system/scheduler/add name="_ModeButtonScheduler" \ From 53b6f7720ec33146581ceb878447d35d462c8697 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 15 Nov 2024 23:02:43 +0100 Subject: [PATCH 194/893] mode-button: catch runtime errors in executed code --- mode-button.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mode-button.rsc b/mode-button.rsc index 84eb8ea..ac1fb4f 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -64,7 +64,11 @@ :delay 200ms; } - [ :parse $Code ]; + :do { + [ :parse $Code ]; + } on-error={ + $LogPrint warning $0 ("The code for " . $Count . " mode-button presses failed with runtime error!"); + } } else={ $LogPrint warning $0 ("The code for " . $Count . " mode-button presses failed syntax validation!"); } From 08ad4e519410c91d61e172f4ea97046dffc2db31 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 15 Nov 2024 23:07:26 +0100 Subject: [PATCH 195/893] mode-button: do not act on disabled LED --- mode-button.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mode-button.rsc b/mode-button.rsc index ac1fb4f..3bd922b 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -36,7 +36,8 @@ :global IfThenElse; - :local LED [ /system/leds/find where leds=$ModeButtonLED type~"^(on|off)\$" interface=[] ]; + :local LED [ /system/leds/find where leds=$ModeButtonLED \ + !disabled type~"^(on|off)\$" interface=[] ]; :if ([ :len $LED ] = 0) do={ :return false; } From 4d8dce97691ad090091574a790449a7bd564023c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 22 Nov 2024 14:06:22 +0100 Subject: [PATCH 196/893] fw-addr-lists: spamhaus.org returned to 'GTS Root R4' --- certs/Makefile | 2 +- global-config.rsc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/certs/Makefile b/certs/Makefile index 9ce8dd4..870cb54 100644 --- a/certs/Makefile +++ b/certs/Makefile @@ -22,7 +22,7 @@ DOMAINS = \ sslbl.abuse.ch/GlobalSign \ upgrade.mikrotik.com/ISRG-Root-X1 \ www.dshield.org/ISRG-Root-X1 \ - www.spamhaus.org/ISRG-Root-X1 + www.spamhaus.org/GTS-Root-R4 .PHONY: $(DOMAINS) diff --git a/global-config.rsc b/global-config.rsc index c4e04b5..2ed67f3 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -106,9 +106,9 @@ { url="https://lists.blocklist.de/lists/strongips.txt"; cert="Certum Trusted Network CA" }; # { url="https://www.spamhaus.org/drop/drop_v4.json"; -# cert="ISRG Root X1" }; +# cert="GTS Root R4" }; # { url="https://www.spamhaus.org/drop/drop_v6.json"; -# cert="ISRG Root X1" }; +# cert="GTS Root R4" }; }; # "mikrotik"={ # { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/mikrotik"; From 794525b706827682c3525eeeb0797567c757b7de Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 27 Nov 2024 09:54:19 +0100 Subject: [PATCH 197/893] fw-addr-lists: require RouterOS 7.16 Actually the requirement bumped with the change in commit: * 084c246ef0cab329fe981732089277fa8398800b fw-addr-lists: simplify looping lines --- doc/fw-addr-lists.md | 2 +- fw-addr-lists.rsc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/fw-addr-lists.md b/doc/fw-addr-lists.md index 3d9e771..f581fd2 100644 --- a/doc/fw-addr-lists.md +++ b/doc/fw-addr-lists.md @@ -4,7 +4,7 @@ Download, import and update firewall address-lists [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.16-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index a9513d8..34b2fcc 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2023-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.16 # # download, import and update firewall address-lists # https://git.eworm.de/cgit/routeros-scripts/about/doc/fw-addr-lists.md From e851cd5ad0ccb38667ec88a52fdc123cc5a16aee Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 27 Nov 2024 09:57:11 +0100 Subject: [PATCH 198/893] mod/ssh-keys-import: require RouterOS 7.16 Actually the requirement bumped with the change in commits: * 9c945b1a3283bb352707c69630c579cf82484dcb mod/ssh-keys-import: $SSHKeysImportFile: simplify looping lines * 1f526b356121749991fee69cee5a6c728855c8f2 mod/ssh-keys-import: $SSHKeysImport: split with `:deserialize` --- doc/mod/ssh-keys-import.md | 2 +- mod/ssh-keys-import.rsc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/mod/ssh-keys-import.md b/doc/mod/ssh-keys-import.md index dcfd95b..344f4bc 100644 --- a/doc/mod/ssh-keys-import.md +++ b/doc/mod/ssh-keys-import.md @@ -4,7 +4,7 @@ Import ssh keys for public key authentication [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.16-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index d6b3b3f..c7b2788 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.16 # # import ssh keys for public key authentication # https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/ssh-keys-import.md From 6548f83ef4f60efadc3574876680801ee09ef638 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 Aug 2024 21:30:46 +0200 Subject: [PATCH 199/893] dhcp-to-dns: explicitly expect type=A... ... which is provided since 7.16beta7 (but require next stable release 7.16 as that is available meanwhile). I had this on my wishlist for a long time, and opened an issue in March 2023 about it (SUP-111312). Back then I changed the code to support both, see commit 779b3b8872b23b784c331d7a454c86439046f5d3. --- dhcp-to-dns.rsc | 8 ++++---- doc/dhcp-to-dns.md | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dhcp-to-dns.rsc b/dhcp-to-dns.rsc index 0ab5e2a..9bf506f 100644 --- a/dhcp-to-dns.rsc +++ b/dhcp-to-dns.rsc @@ -4,7 +4,7 @@ # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=20 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.16 # # check DHCP leases and add/remove/update DNS entries # https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-to-dns.md @@ -40,7 +40,7 @@ } :local PlaceBefore ([ /ip/dns/static/find where (name=$CommentString or (comment=$CommentString and name=-)) type=NXDOMAIN disabled ]->0); - :foreach DnsRecord in=[ /ip/dns/static/find where comment~("^" . $CommentPrefix . "\\b") (!type or type=A) ] do={ + :foreach DnsRecord in=[ /ip/dns/static/find where comment~("^" . $CommentPrefix . "\\b") type=A ] do={ :local DnsRecordVal [ /ip/dns/static/get $DnsRecord ]; :local DnsRecordInfo [ $ParseKeyValueStore ($DnsRecordVal->"comment") ]; :local MacInServer ($DnsRecordInfo->"macaddress" . " in " . $DnsRecordInfo->"server"); @@ -83,7 +83,7 @@ :local FullCN ($HostName . "." . $NetDomain); :local MacInServer ($LeaseVal->"active-mac-address" . " in " . $LeaseVal->"server"); - :local DnsRecord [ /ip/dns/static/find where comment=$Comment (!type or type=A) ]; + :local DnsRecord [ /ip/dns/static/find where comment=$Comment type=A ]; :if ([ :len $DnsRecord ] > 0) do={ :local DnsRecordVal [ /ip/dns/static/get $DnsRecord ]; @@ -116,7 +116,7 @@ } } - :if ([ :len [ /ip/dns/static/find where name=$FullA (!type or type=A) ] ] > 1) do={ + :if ([ :len [ /ip/dns/static/find where name=$FullA type=A ] ] > 1) do={ $LogPrintOnce warning $ScriptName ("The name '" . $FullA . "' appeared in more than one A record!"); } } else={ diff --git a/doc/dhcp-to-dns.md b/doc/dhcp-to-dns.md index 572011f..4211d85 100644 --- a/doc/dhcp-to-dns.md +++ b/doc/dhcp-to-dns.md @@ -4,7 +4,7 @@ Create DNS records for DHCP leases [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.16-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) From 09e8b1d21953ad8ba5185b3cb02bbd4b35269963 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 28 Aug 2024 08:53:20 +0200 Subject: [PATCH 200/893] netwatch-dns: explicitly expect type=A... ... which is provided since 7.16beta7 (but require next stable release 7.16 as that is available meanwhile). --- doc/netwatch-dns.md | 2 +- netwatch-dns.rsc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/netwatch-dns.md b/doc/netwatch-dns.md index cdfbd97..6d2c865 100644 --- a/doc/netwatch-dns.md +++ b/doc/netwatch-dns.md @@ -4,7 +4,7 @@ Manage DNS and DoH servers from netwatch [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.16-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 09d471d..6fbfc89 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2022-2024 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.16 # # monitor and manage dns/doh with netwatch # https://git.eworm.de/cgit/routeros-scripts/about/doc/netwatch-dns.md @@ -80,7 +80,7 @@ :local HostVal [ /tool/netwatch/get $Host ]; :local HostInfo [ $ParseKeyValueStore ($HostVal->"comment") ]; :local HostName [ /ip/dns/static/find where name address=($HostVal->"host") \ - (!type or type="A" or type="AAAA") !disabled !dynamic ]; + (type="A" or type="AAAA") !disabled !dynamic ]; :if ([ :len $HostName ] > 0) do={ :set HostName [ /ip/dns/static/get ($HostName->0) name ]; } From 0d69f8952c25f3bfecd9e33c1520e74eebe42314 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:06:56 +0100 Subject: [PATCH 201/893] global-functions: introduce $ExitError... ... as a simple macro to print error message on unintentional error. --- global-functions.rsc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 6fec6dd..26ccc2a 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -32,6 +32,7 @@ :global DownloadPackage; :global EitherOr; :global EscapeForRegEx; +:global ExitError; :global FetchHuge; :global FetchUserAgentStr; :global FormatLine; @@ -425,6 +426,18 @@ :return $Return; } +# simple macro to print error message on unintentional error +:set ExitError do={ + :local ExitOK [ :tostr $1 ]; + :local ScriptName [ :tostr $2 ]; + + :global LogPrint; + + :if ($ExitOK = "false") do={ + $LogPrint error $ScriptName ("Script exited with error."); + } +} + # fetch huge data to file, read in chunks :set FetchHuge do={ :local ScriptName [ :tostr $1 ]; From ed6739b8bcb93f8e1025401e22db4244c70ac8c6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sun, 8 Dec 2024 22:02:52 +0100 Subject: [PATCH 202/893] global-functions: $ExitError: give script name in message --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 26ccc2a..8941994 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -434,7 +434,7 @@ :global LogPrint; :if ($ExitOK = "false") do={ - $LogPrint error $ScriptName ("Script exited with error."); + $LogPrint error $ScriptName ("Script '" . $ScriptName . "' exited with error."); } } From 36b81fab9474aa0ddc6acdb88f51ef211a1c5563 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:19:54 +0100 Subject: [PATCH 203/893] backup-cloud: use $ExitError to indicate unintentional error --- backup-cloud.rsc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index f70752e..4cc7a58 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -12,6 +12,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -34,6 +35,7 @@ :if ([ $ScriptLock $ScriptName ] = false) do={ :set PackagesUpdateBackupFailure true; + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -44,6 +46,7 @@ :if ([ $MkDir ("tmpfs/backup-cloud") ] = false) do={ $LogPrint error $ScriptName ("Failed creating directory!"); + :set ExitOK true; :error false; } @@ -87,4 +90,6 @@ :set PackagesUpdateBackupFailure true; } /file/remove "tmpfs/backup-cloud"; -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 52b5490babc9005fbbb8e0cb1e2ae323a2bd2f70 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:22:11 +0100 Subject: [PATCH 204/893] backup-email: use $ExitError to indicate unintentional error --- backup-email.rsc | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/backup-email.rsc b/backup-email.rsc index e507c6e..e1d44ea 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -12,6 +12,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -39,17 +40,20 @@ :if ([ :typeof $SendEMail2 ] = "nothing") do={ $LogPrint error $ScriptName ("The module for sending notifications via e-mail is not installed."); + :set ExitOK true; :error false; } :if ($BackupSendBinary != true && \ $BackupSendExport != true) do={ $LogPrint error $ScriptName ("Configured to send neither backup nor config export."); + :set ExitOK true; :error false; } :if ([ $ScriptLock $ScriptName ] = false) do={ :set PackagesUpdateBackupFailure true; + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -69,6 +73,7 @@ :if ([ $MkDir $DirName ] = false) do={ $LogPrint error $ScriptName ("Failed creating directory!"); + :set ExitOK true; :error false; } @@ -116,9 +121,12 @@ :if ($I >= 120) do={ $LogPrint warning $ScriptName ("Files are still available, sending e-mail failed."); :set PackagesUpdateBackupFailure true; + :set ExitOK true; :error false; } :delay 1s; :set I ($I + 1); } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 2c4053cff55a7d0a90f364f7aded280422dc1d65 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:26:34 +0100 Subject: [PATCH 205/893] accesslist-duplicates: use $ExitError to indicate unintentional error --- accesslist-duplicates.capsman.rsc | 5 ++++- accesslist-duplicates.local.rsc | 5 ++++- accesslist-duplicates.template.rsc | 5 ++++- accesslist-duplicates.wifi.rsc | 5 ++++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/accesslist-duplicates.capsman.rsc b/accesslist-duplicates.capsman.rsc index d6e2928..ce0ce11 100644 --- a/accesslist-duplicates.capsman.rsc +++ b/accesslist-duplicates.capsman.rsc @@ -13,6 +13,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -31,4 +32,6 @@ } :set ($Seen->$Mac) 1; } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/accesslist-duplicates.local.rsc b/accesslist-duplicates.local.rsc index e90842d..aa78fe8 100644 --- a/accesslist-duplicates.local.rsc +++ b/accesslist-duplicates.local.rsc @@ -13,6 +13,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -31,4 +32,6 @@ } :set ($Seen->$Mac) 1; } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/accesslist-duplicates.template.rsc b/accesslist-duplicates.template.rsc index d275340..d0c282d 100644 --- a/accesslist-duplicates.template.rsc +++ b/accesslist-duplicates.template.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -40,4 +41,6 @@ } :set ($Seen->$Mac) 1; } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/accesslist-duplicates.wifi.rsc b/accesslist-duplicates.wifi.rsc index f4dae4b..b1444e3 100644 --- a/accesslist-duplicates.wifi.rsc +++ b/accesslist-duplicates.wifi.rsc @@ -13,6 +13,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -31,4 +32,6 @@ } :set ($Seen->$Mac) 1; } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 95030b9b74db03cf67c4702c82bb1d1224c9690e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:28:30 +0100 Subject: [PATCH 206/893] backup-partition: use $ExitError to indicate unintentional error --- backup-partition.rsc | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index 51df454..f1e1c17 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -12,6 +12,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -42,12 +43,14 @@ :if ([ $ScriptLock $ScriptName ] = false) do={ :set PackagesUpdateBackupFailure true; + :set ExitOK true; :error false; } :if ([ :len [ /partitions/find ] ] < 2) do={ $LogPrint error $ScriptName ("Device does not have a fallback partition."); :set PackagesUpdateBackupFailure true; + :set ExitOK true; :error false; } @@ -56,6 +59,7 @@ :if ([ :len $ActiveRunning ] < 1) do={ $LogPrint error $ScriptName ("Device is not running from active partition."); :set PackagesUpdateBackupFailure true; + :set ExitOK true; :error false; } @@ -65,6 +69,7 @@ :if ([ :len $FallbackTo ] < 1) do={ $LogPrint error $ScriptName ("There is no inactive partition named '" . $FallbackToName . "'."); :set PackagesUpdateBackupFailure true; + :set ExitOK true; :error false; } @@ -74,6 +79,7 @@ :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ :if ([ $CopyTo $ScriptName $FallbackTo $FallbackToName ] = false) do={ :set PackagesUpdateBackupFailure true; + :set ExitOK true; :error false; } } @@ -86,6 +92,7 @@ ($NumInstalled & $BitMask) != ($NumLatest & $BitMask)) do={ :if ([ $CopyTo $ScriptName $FallbackTo $FallbackToName ] = false) do={ :set PackagesUpdateBackupFailure true; + :set ExitOK true; :error false; } } @@ -103,6 +110,9 @@ /system/scheduler/remove [ find where name="running-from-backup-partition" ]; $LogPrint error $ScriptName ("Failed saving configuration to partition '" . $FallbackToName . "'!"); :set PackagesUpdateBackupFailure true; + :set ExitOK true; :error false; } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 268743ef6be5c400ec9fcb044e4961c5d8d9b531 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:29:02 +0100 Subject: [PATCH 207/893] backup-upload: use $ExitError to indicate unintentional error --- backup-upload.rsc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/backup-upload.rsc b/backup-upload.rsc index 8d96eba..12698e9 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -12,6 +12,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -43,11 +44,13 @@ :if ($BackupSendBinary != true && \ $BackupSendExport != true) do={ $LogPrint error $ScriptName ("Configured to send neither backup nor config export."); + :set ExitOK true; :error false; } :if ([ $ScriptLock $ScriptName ] = false) do={ :set PackagesUpdateBackupFailure true; + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -67,6 +70,7 @@ :if ([ $MkDir $DirName ] = false) do={ $LogPrint error $ScriptName ("Failed creating directory!"); + :set ExitOK true; :error false; } @@ -158,4 +162,6 @@ :set PackagesUpdateBackupFailure true; } /file/remove $DirName; -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From c909bef613884bf67d239a1e6c0bed4e3d7a112e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:51 +0100 Subject: [PATCH 208/893] capsman-download-packages: use $ExitError to indicate unintentional error --- capsman-download-packages.capsman.rsc | 8 +++++++- capsman-download-packages.template.rsc | 8 +++++++- capsman-download-packages.wifi.rsc | 8 +++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index f2ff024..1802884 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -25,6 +26,7 @@ :global WaitFullyConnected; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -35,6 +37,7 @@ :if ([ :len $PackagePath ] = 0) do={ $LogPrint warning $ScriptName ("The CAPsMAN package path is not defined, can not download packages."); + :set ExitOK true; :error false; } @@ -42,6 +45,7 @@ :if ([ $MkDir $PackagePath ] = false) do={ $LogPrint warning $ScriptName ("Creating directory at CAPsMAN package path (" . \ $PackagePath . ") failed!"); + :set ExitOK true; :error false; } $LogPrint info $ScriptName ("Created directory at CAPsMAN package path (" . $PackagePath . \ @@ -82,4 +86,6 @@ /caps-man/remote-cap/upgrade [ find where version!=$InstalledVersion ]; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index ad9b926..72edaa9 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -15,6 +15,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -26,6 +27,7 @@ :global WaitFullyConnected; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -37,6 +39,7 @@ :if ([ :len $PackagePath ] = 0) do={ $LogPrint warning $ScriptName ("The CAPsMAN package path is not defined, can not download packages."); + :set ExitOK true; :error false; } @@ -44,6 +47,7 @@ :if ([ $MkDir $PackagePath ] = false) do={ $LogPrint warning $ScriptName ("Creating directory at CAPsMAN package path (" . \ $PackagePath . ") failed!"); + :set ExitOK true; :error false; } $LogPrint info $ScriptName ("Created directory at CAPsMAN package path (" . $PackagePath . \ @@ -93,4 +97,6 @@ /interface/wifi/capsman/remote-cap/upgrade [ find where version!=$InstalledVersion ]; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 056136f..74a5d9d 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -25,6 +26,7 @@ :global WaitFullyConnected; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -35,6 +37,7 @@ :if ([ :len $PackagePath ] = 0) do={ $LogPrint warning $ScriptName ("The CAPsMAN package path is not defined, can not download packages."); + :set ExitOK true; :error false; } @@ -42,6 +45,7 @@ :if ([ $MkDir $PackagePath ] = false) do={ $LogPrint warning $ScriptName ("Creating directory at CAPsMAN package path (" . \ $PackagePath . ") failed!"); + :set ExitOK true; :error false; } $LogPrint info $ScriptName ("Created directory at CAPsMAN package path (" . $PackagePath . \ @@ -84,4 +88,6 @@ /interface/wifi/capsman/remote-cap/upgrade [ find where version!=$InstalledVersion ]; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 172d43288e2117f2a687df6168d2d461e780a8c3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:51 +0100 Subject: [PATCH 209/893] capsman-rolling-upgrade: use $ExitError to indicate unintentional error --- capsman-rolling-upgrade.capsman.rsc | 6 +++++- capsman-rolling-upgrade.template.rsc | 6 +++++- capsman-rolling-upgrade.wifi.rsc | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/capsman-rolling-upgrade.capsman.rsc b/capsman-rolling-upgrade.capsman.rsc index f287ea3..d0f9fb8 100644 --- a/capsman-rolling-upgrade.capsman.rsc +++ b/capsman-rolling-upgrade.capsman.rsc @@ -15,6 +15,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -22,6 +23,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -43,4 +45,6 @@ :delay ($Delay . "s"); } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/capsman-rolling-upgrade.template.rsc b/capsman-rolling-upgrade.template.rsc index 3d98747..1bd5f2a 100644 --- a/capsman-rolling-upgrade.template.rsc +++ b/capsman-rolling-upgrade.template.rsc @@ -16,6 +16,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -23,6 +24,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -51,4 +53,6 @@ :delay ($Delay . "s"); } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/capsman-rolling-upgrade.wifi.rsc b/capsman-rolling-upgrade.wifi.rsc index 369dccc..c9e6622 100644 --- a/capsman-rolling-upgrade.wifi.rsc +++ b/capsman-rolling-upgrade.wifi.rsc @@ -15,6 +15,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -22,6 +23,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -44,4 +46,6 @@ :delay ($Delay . "s"); } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From dc7642c1fd3c3029e3993d9ff73b7743ec8e0ea8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:51 +0100 Subject: [PATCH 210/893] certificate-renew-issued: use $ExitError to indicate unintentional error --- certificate-renew-issued.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/certificate-renew-issued.rsc b/certificate-renew-issued.rsc index f2c1dfe..ce61f7d 100644 --- a/certificate-renew-issued.rsc +++ b/certificate-renew-issued.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -21,6 +22,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -45,4 +47,6 @@ $LogPrint info $ScriptName ("Issued a new certificate for '" . $CertVal->"common-name" . "'."); } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 00487f93d48e5e7547281808225d108eeeae586f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:51 +0100 Subject: [PATCH 211/893] check-certificates: use $ExitError to indicate unintentional error --- check-certificates.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 7aaac84..52cfc5e 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -133,6 +134,7 @@ } :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -218,4 +220,6 @@ ", it is invalid after " . ($CertVal->"invalid-after") . "."); } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 451df78dd8371288413fd45064141b6063e36187 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:51 +0100 Subject: [PATCH 212/893] check-health: use $ExitError to indicate unintentional error --- check-health.rsc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/check-health.rsc b/check-health.rsc index 540336d..495b450 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -40,6 +41,7 @@ } :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -78,6 +80,7 @@ :if ([ :len [ /system/health/find ] ] = 0) do={ $LogPrint debug $ScriptName ("Your device does not provide any health values."); + :set ExitOK true; :error true; } @@ -175,4 +178,6 @@ } :set ($CheckHealthLast->$Name) $Value; } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 91c8d306558c056792ff8132caa77fdf0bda059a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:51 +0100 Subject: [PATCH 213/893] check-lte-firmware-upgrade: use $ExitError to indicate unintentional error --- check-lte-firmware-upgrade.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index 2e52c2a..898d6f1 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -19,6 +20,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -100,4 +102,6 @@ :foreach Interface in=[ /interface/lte/find ] do={ $CheckInterface $ScriptName $Interface; } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 9d17beef03ace2d75c9e2f9f98fa297707c9e0e3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:51 +0100 Subject: [PATCH 214/893] check-routeros-update: use $ExitError to indicate unintentional error --- check-routeros-update.rsc | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 0624808..510acd9 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -34,20 +35,24 @@ :global WaitFullyConnected; :local DoUpdate do={ + :global LogPrint; + :if ([ :len [ /system/script/find where name="packages-update" ] ] > 0) do={ /system/script/run packages-update; } else={ /system/package/update/install without-paging; } - :error "Waiting for system to reboot."; + $LogPrint info $0 ("Waiting for system to reboot."); } :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } $WaitFullyConnected; :if ([ :len [ /system/scheduler/find where name="_RebootForUpdate" ] ] > 0) do={ + :set ExitOK true; :error "A reboot for update is already scheduled."; } @@ -59,11 +64,13 @@ :if ([ $ScriptFromTerminal $ScriptName ] = true) do={ $LogPrint info $ScriptName ("System is already up to date."); } + :set ExitOK true; :error true; } :if ([ :len ($Update->"latest-version") ] = 0) do={ $LogPrint info $ScriptName ("Received an empty version string from server."); + :set ExitOK true; :error false; } @@ -76,6 +83,7 @@ :if ($NumLatest < [ $VersionToNum "7.0" ]) do={ $LogPrint warning $ScriptName ("The version '" . ($Update->"latest-version") . "' is not a valid version."); + :set ExitOK true; :error false; } @@ -88,6 +96,8 @@ message=("Installing ALL versions automatically, including " . $Update->"latest-version" . \ "... Updating on " . $Identity . "..."); link=$Link; silent=true }); $DoUpdate; + :set ExitOK true; + :error true; } :if ($SafeUpdatePatch = true && $NumInstalledFeature = $NumLatestFeature) do={ @@ -97,6 +107,8 @@ message=("Version " . $Update->"latest-version" . " is a patch update for " . $Update->"channel" . \ ", updating on " . $Identity . "..."); link=$Link; silent=true }); $DoUpdate; + :set ExitOK true; + :error true; } :if ($SafeUpdateNeighbor = true) do={ @@ -111,6 +123,8 @@ message=("Seen a neighbor (" . $Neighbor . ") running version " . $Update->"latest-version" . \ " from " . $Update->"channel" . ", updating on " . $Identity . "..."); link=$Link; silent=true }); $DoUpdate; + :set ExitOK true; + :error true; } } @@ -131,6 +145,8 @@ message=("Version " . $Update->"latest-version" . " is considered safe for " . $Update->"channel" . \ ", updating on " . $Identity . "..."); link=$Link; silent=true }); $DoUpdate; + :set ExitOK true; + :error true; } } @@ -140,6 +156,7 @@ :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ /system/package/update/set channel=stable; $LogPrint info $ScriptName ("Switched to channel 'stable', please re-run!"); + :set ExitOK true; :error true; } } @@ -147,6 +164,8 @@ :put ("Do you want to install RouterOS version " . $Update->"latest-version" . "? [y/N]"); :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ $DoUpdate; + :set ExitOK true; + :error true; } else={ :put "Canceled..."; } @@ -155,6 +174,7 @@ :if ($SentRouterosUpdateNotification = $Update->"latest-version") do={ $LogPrint info $ScriptName ("Already sent the RouterOS update notification for version " . \ $Update->"latest-version" . "."); + :set ExitOK true; :error true; } @@ -170,6 +190,7 @@ :if ($SentRouterosUpdateNotification = $Update->"latest-version") do={ $LogPrint info $ScriptName ("Already sent the RouterOS downgrade notification for version " . \ $Update->"latest-version" . "."); + :set ExitOK true; :error true; } @@ -182,4 +203,6 @@ " is available for downgrade."); :set SentRouterosUpdateNotification ($Update->"latest-version"); } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From bf322781d17629c3254520766ae540fb3ae846be Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:51 +0100 Subject: [PATCH 215/893] collect-wireless-mac: use $ExitError to indicate unintentional error --- collect-wireless-mac.capsman.rsc | 6 +++++- collect-wireless-mac.local.rsc | 6 +++++- collect-wireless-mac.template.rsc | 6 +++++- collect-wireless-mac.wifi.rsc | 6 +++++- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/collect-wireless-mac.capsman.rsc b/collect-wireless-mac.capsman.rsc index 9efa9ef..77fd6e3 100644 --- a/collect-wireless-mac.capsman.rsc +++ b/collect-wireless-mac.capsman.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -29,6 +30,7 @@ :global SymbolForNotification; :if ([ $ScriptLock $ScriptName 10 ] = false) do={ + :set ExitOK true; :error false; } @@ -93,4 +95,6 @@ $LogPrint debug $ScriptName ("No mac address available... Ignoring."); } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/collect-wireless-mac.local.rsc b/collect-wireless-mac.local.rsc index 27c9d1c..dc7be19 100644 --- a/collect-wireless-mac.local.rsc +++ b/collect-wireless-mac.local.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -29,6 +30,7 @@ :global SymbolForNotification; :if ([ $ScriptLock $ScriptName 10 ] = false) do={ + :set ExitOK true; :error false; } @@ -94,4 +96,6 @@ $LogPrint debug $ScriptName ("No mac address available... Ignoring."); } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/collect-wireless-mac.template.rsc b/collect-wireless-mac.template.rsc index d41c17d..34b1695 100644 --- a/collect-wireless-mac.template.rsc +++ b/collect-wireless-mac.template.rsc @@ -15,6 +15,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -30,6 +31,7 @@ :global SymbolForNotification; :if ([ $ScriptLock $ScriptName 10 ] = false) do={ + :set ExitOK true; :error false; } @@ -111,4 +113,6 @@ $LogPrint debug $ScriptName ("No mac address available... Ignoring."); } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/collect-wireless-mac.wifi.rsc b/collect-wireless-mac.wifi.rsc index 0075320..23c93b0 100644 --- a/collect-wireless-mac.wifi.rsc +++ b/collect-wireless-mac.wifi.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -29,6 +30,7 @@ :global SymbolForNotification; :if ([ $ScriptLock $ScriptName 10 ] = false) do={ + :set ExitOK true; :error false; } @@ -93,4 +95,6 @@ $LogPrint debug $ScriptName ("No mac address available... Ignoring."); } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From f9a6916827b3954637f52ac726d937e04a471e3e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:51 +0100 Subject: [PATCH 216/893] daily-psk.capsman: use $ExitError to indicate unintentional error --- daily-psk.capsman.rsc | 6 +++++- daily-psk.local.rsc | 6 +++++- daily-psk.template.rsc | 6 +++++- daily-psk.wifi.rsc | 6 +++++- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index 0562e39..263f6e5 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -31,6 +32,7 @@ :global WaitFullyConnected; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -89,4 +91,6 @@ } } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index 0bef0e9..f0757e1 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -31,6 +32,7 @@ :global WaitFullyConnected; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -88,4 +90,6 @@ } } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 9d71958..7e36b5a 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -15,6 +15,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -32,6 +33,7 @@ :global WaitFullyConnected; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -104,4 +106,6 @@ } } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index 83a896c..293f0e4 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -31,6 +32,7 @@ :global WaitFullyConnected; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -89,4 +91,6 @@ } } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 87cde2cc2fe8604457f9fd4826abac1409d88a0d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 217/893] dhcp-lease-comment: use $ExitError to indicate unintentional error --- dhcp-lease-comment.capsman.rsc | 6 +++++- dhcp-lease-comment.local.rsc | 6 +++++- dhcp-lease-comment.template.rsc | 6 +++++- dhcp-lease-comment.wifi.rsc | 6 +++++- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/dhcp-lease-comment.capsman.rsc b/dhcp-lease-comment.capsman.rsc index c435ec3..5ac0009 100644 --- a/dhcp-lease-comment.capsman.rsc +++ b/dhcp-lease-comment.capsman.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -21,6 +22,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -36,4 +38,6 @@ /ip/dhcp-server/lease/set comment=$NewComment $Lease; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/dhcp-lease-comment.local.rsc b/dhcp-lease-comment.local.rsc index 27e6605..1b74d93 100644 --- a/dhcp-lease-comment.local.rsc +++ b/dhcp-lease-comment.local.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -21,6 +22,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -36,4 +38,6 @@ /ip/dhcp-server/lease/set comment=$NewComment $Lease; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/dhcp-lease-comment.template.rsc b/dhcp-lease-comment.template.rsc index c562ca2..8f1ad47 100644 --- a/dhcp-lease-comment.template.rsc +++ b/dhcp-lease-comment.template.rsc @@ -15,6 +15,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -22,6 +23,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -41,4 +43,6 @@ /ip/dhcp-server/lease/set comment=$NewComment $Lease; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/dhcp-lease-comment.wifi.rsc b/dhcp-lease-comment.wifi.rsc index ba617d7..d3741c5 100644 --- a/dhcp-lease-comment.wifi.rsc +++ b/dhcp-lease-comment.wifi.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -21,6 +22,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -36,4 +38,6 @@ /ip/dhcp-server/lease/set comment=$NewComment $Lease; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From c8d423c7d59a9051914d5dd676bcd997d7e9854b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 218/893] dhcp-to-dns: use $ExitError to indicate unintentional error --- dhcp-to-dns.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/dhcp-to-dns.rsc b/dhcp-to-dns.rsc index 9bf506f..ad55c4d 100644 --- a/dhcp-to-dns.rsc +++ b/dhcp-to-dns.rsc @@ -12,6 +12,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -27,6 +28,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName 10 ] = false) do={ + :set ExitOK true; :error false; } @@ -123,4 +125,6 @@ $LogPrint debug $ScriptName ("No address available... Ignoring."); } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 590030d391d523bc555c192c5f84f9cdb6504abd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 219/893] firmware-upgrade-reboot: use $ExitError to indicate unintentional error --- firmware-upgrade-reboot.rsc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/firmware-upgrade-reboot.rsc b/firmware-upgrade-reboot.rsc index 74847ac..9655903 100644 --- a/firmware-upgrade-reboot.rsc +++ b/firmware-upgrade-reboot.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -19,6 +20,7 @@ :global VersionToNum; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -26,10 +28,12 @@ :if ($RouterBoard->"current-firmware" = $RouterBoard->"upgrade-firmware") do={ $LogPrint info $ScriptName ("Current and upgrade firmware match with version " . \ $RouterBoard->"current-firmware" . "."); + :set ExitOK true; :error true; } :if ([ $VersionToNum ($RouterBoard->"current-firmware") ] > [ $VersionToNum ($RouterBoard->"upgrade-firmware") ]) do={ $LogPrint info $ScriptName ("Different firmware version is available, but it is a downgrade. Ignoring."); + :set ExitOK true; :error true; } @@ -51,4 +55,6 @@ $LogPrint info $ScriptName ("Firmware upgrade successful, rebooting."); /system/reboot; -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 923a6385bf8fcb770a70650318d96f0571d7297e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 220/893] fw-addr-lists: use $ExitError to indicate unintentional error --- fw-addr-lists.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 34b2fcc..6682f4a 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -36,6 +37,7 @@ } :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -184,4 +186,6 @@ " - renewed: " . [ $HumanReadableNum $CntRenew 1000 ] . \ " - removed: " . [ $HumanReadableNum $CntRemove 1000 ]); } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 90cfa83d95baf440544a331fd60f9903afa1fead Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 221/893] gps-track: use $ExitError to indicate unintentional error --- gps-track.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/gps-track.rsc b/gps-track.rsc index a2ea9ff..c0ecac4 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -23,6 +24,7 @@ :global WaitFullyConnected; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } $WaitFullyConnected; @@ -45,4 +47,6 @@ } else={ $LogPrint debug $ScriptName ("GPS data not valid."); } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From f7b96aa3e93f98b7a8dd076e34b7c302fe436f50 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 222/893] hotspot-to-wpa-cleanup: use $ExitError to indicate unintentional error --- hotspot-to-wpa-cleanup.capsman.rsc | 6 +++++- hotspot-to-wpa-cleanup.template.rsc | 6 +++++- hotspot-to-wpa-cleanup.wifi.rsc | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index e935850..8a38213 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -23,6 +24,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName 10 ] = false) do={ + :set ExitOK true; :error false; } @@ -72,4 +74,6 @@ /ip/dhcp-server/lease/remove $Lease; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index fa99b5d..e8d2dfb 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -15,6 +15,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -24,6 +25,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName 10 ] = false) do={ + :set ExitOK true; :error false; } @@ -79,4 +81,6 @@ /ip/dhcp-server/lease/remove $Lease; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index d3f859e..e2ef1fd 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -23,6 +24,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName 10 ] = false) do={ + :set ExitOK true; :error false; } @@ -72,4 +74,6 @@ /ip/dhcp-server/lease/remove $Lease; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From ff00c27f990b851b9d14f708aecae6087fedc011 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 09:55:12 +0100 Subject: [PATCH 223/893] global-functions: $ExitError: give matching message for functions --- global-functions.rsc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 8941994..6c74c2f 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -428,13 +428,15 @@ # simple macro to print error message on unintentional error :set ExitError do={ - :local ExitOK [ :tostr $1 ]; - :local ScriptName [ :tostr $2 ]; + :local ExitOK [ :tostr $1 ]; + :local Name [ :tostr $2 ]; + :global IfThenElse; :global LogPrint; :if ($ExitOK = "false") do={ - $LogPrint error $ScriptName ("Script '" . $ScriptName . "' exited with error."); + $LogPrint error $Name ([ $IfThenElse ([ :pick $Name 0 1 ] = "\$") \ + "Function" "Script" ] . " '" . $Name . "' exited with error."); } } From 8e12453058ae848a6d61c104ab6aa22902205d98 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 224/893] hotspot-to-wpa: use $ExitError to indicate unintentional error --- hotspot-to-wpa.capsman.rsc | 8 +++++++- hotspot-to-wpa.template.rsc | 8 +++++++- hotspot-to-wpa.wifi.rsc | 8 +++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/hotspot-to-wpa.capsman.rsc b/hotspot-to-wpa.capsman.rsc index b85c591..e57d327 100644 --- a/hotspot-to-wpa.capsman.rsc +++ b/hotspot-to-wpa.capsman.rsc @@ -13,6 +13,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -25,11 +26,13 @@ :local UserName $username; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } :if ([ :typeof $MacAddress ] = "nothing" || [ :typeof $UserName ] = "nothing") do={ $LogPrint error $ScriptName ("This script is supposed to run from hotspot on login."); + :set ExitOK true; :error false; } @@ -57,6 +60,7 @@ :if ($Template->"action" = "reject") do={ $LogPrint info $ScriptName ("Ignoring login for hotspot '" . $Hotspot . "'."); + :set ExitOK true; :error true; } @@ -95,4 +99,6 @@ :delay 2s; /caps-man/access-list/set $Entry action=accept; -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/hotspot-to-wpa.template.rsc b/hotspot-to-wpa.template.rsc index 44607cc..efe37d0 100644 --- a/hotspot-to-wpa.template.rsc +++ b/hotspot-to-wpa.template.rsc @@ -14,6 +14,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -26,11 +27,13 @@ :local UserName $username; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } :if ([ :typeof $MacAddress ] = "nothing" || [ :typeof $UserName ] = "nothing") do={ $LogPrint error $ScriptName ("This script is supposed to run from hotspot on login."); + :set ExitOK true; :error false; } @@ -64,6 +67,7 @@ :if ($Template->"action" = "reject") do={ $LogPrint info $ScriptName ("Ignoring login for hotspot '" . $Hotspot . "'."); + :set ExitOK true; :error true; } @@ -115,4 +119,6 @@ :delay 2s; /caps-man/access-list/set $Entry action=accept; /interface/wifi/access-list/set $Entry action=accept; -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/hotspot-to-wpa.wifi.rsc b/hotspot-to-wpa.wifi.rsc index 25933c6..6242d04 100644 --- a/hotspot-to-wpa.wifi.rsc +++ b/hotspot-to-wpa.wifi.rsc @@ -13,6 +13,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -25,11 +26,13 @@ :local UserName $username; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } :if ([ :typeof $MacAddress ] = "nothing" || [ :typeof $UserName ] = "nothing") do={ $LogPrint error $ScriptName ("This script is supposed to run from hotspot on login."); + :set ExitOK true; :error false; } @@ -57,6 +60,7 @@ :if ($Template->"action" = "reject") do={ $LogPrint info $ScriptName ("Ignoring login for hotspot '" . $Hotspot . "'."); + :set ExitOK true; :error true; } @@ -92,4 +96,6 @@ :delay 2s; /interface/wifi/access-list/set $Entry action=accept; -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 8c5bd8f5e2a5943e720e6086c1aec74ddb81eaf1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 09:02:04 +0100 Subject: [PATCH 225/893] global-functions: $ScriptInstallUpdate: use $ExitError to indicate unintentional error --- global-functions.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 6c74c2f..743c50e 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1018,7 +1018,7 @@ } # install new scripts, update existing scripts -:set ScriptInstallUpdate do={ +:set ScriptInstallUpdate do={ :do { :local Scripts [ :toarray $1 ]; :local NewComment [ :tostr $2 ]; @@ -1237,7 +1237,9 @@ :set GlobalConfigChanges; :set GlobalConfigMigration; } -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # lock script against multiple invocation :set ScriptLock do={ From a6fd6bd80cf827a417549c5d433630efcbf1b8b6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 226/893] ipsec-to-dns: use $ExitError to indicate unintentional error --- ipsec-to-dns.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ipsec-to-dns.rsc b/ipsec-to-dns.rsc index bd74a8f..47676ca 100644 --- a/ipsec-to-dns.rsc +++ b/ipsec-to-dns.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -26,6 +27,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -76,4 +78,6 @@ /ip/dns/static/add name=$Fqdn address=($PeerVal->"dynamic-address") ttl=$Ttl comment=$Comment place-before=$PlaceBefore; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 5b9031ccca75e7e1ba8479af1ae180ae8422ac74 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 11:06:38 +0100 Subject: [PATCH 227/893] global-functions: $SendNotification: use $ExitError to indicate unintentional error --- global-functions.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 743c50e..625f8cd 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1374,11 +1374,13 @@ } # send notification via NotificationFunctions - expects at least two string arguments -:set SendNotification do={ +:set SendNotification do={ :do { :global SendNotification2; $SendNotification2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # send notification via NotificationFunctions - expects one array argument :set SendNotification2 do={ From 82de8bd935c5a2ccdaf3bfb9db732bdec0ce7d96 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 228/893] ipv6-update: use $ExitError to indicate unintentional error --- ipv6-update.rsc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ipv6-update.rsc b/ipv6-update.rsc index ccc0eb9..ea1d444 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -22,16 +23,19 @@ :local PdPrefix $"pd-prefix"; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } :if ([ :typeof $NaAddress ] = "str") do={ $LogPrint info $ScriptName ("An address (" . $NaAddress . ") was acquired, not a prefix. Ignoring."); + :set ExitOK true; :error false; } :if ([ :typeof $PdPrefix ] = "nothing") do={ $LogPrint error $ScriptName ("This script is supposed to run from ipv6 dhcp-client."); + :set ExitOK true; :error false; } @@ -90,4 +94,6 @@ } } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 1fe90a6e9aeaba7350f13f52cc9a196a0bc8ca1c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 09:03:41 +0100 Subject: [PATCH 229/893] mode-button: $ModeButtonScheduler: use $ExitError to indicate unintentional error --- mode-button.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mode-button.rsc b/mode-button.rsc index 2d428ed..90fe80e 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -25,7 +25,7 @@ :if ([ :len $Scheduler ] = 0) do={ $LogPrint info $ScriptName ("Creating scheduler _ModeButtonScheduler, counting presses..."); - :global ModeButtonScheduler do={ + :global ModeButtonScheduler do={ :do { :local FuncName $0; :global ModeButton; @@ -81,7 +81,9 @@ } else={ $LogPrint info $FuncName ("No action defined for " . $Count . " mode-button presses."); } - } + } on-error={ + :global ExitError; $ExitError false $0; + } } /system/scheduler/add name="_ModeButtonScheduler" \ on-event=":global ModeButtonScheduler; \$ModeButtonScheduler;" interval=3s; } else={ From 177a1e798a09115ecc9241f5f39065a2583bcfac Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 230/893] lease-script: use $ExitError to indicate unintentional error --- lease-script.rsc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lease-script.rsc b/lease-script.rsc index f484414..995c7e4 100644 --- a/lease-script.rsc +++ b/lease-script.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -25,6 +26,7 @@ [ :typeof $leaseServerName ] = "nothing" || \ [ :typeof $leaseBound ] = "nothing") do={ $LogPrint error $ScriptName ("This script is supposed to run from ip dhcp-server."); + :set ExitOK true; :error false; } @@ -32,11 +34,13 @@ "de" "" ] . "assigned lease " . $leaseActIP . " to " . $leaseActMAC); :if ([ $ScriptLock $ScriptName 10 ] = false) do={ + :set ExitOK true; :error false; } :if ([ :len [ /system/script/job/find where script=$ScriptName ] ] > 1) do={ $LogPrint debug $ScriptName ("More invocations are waiting, exiting early."); + :set ExitOK true; :error true; } @@ -56,4 +60,6 @@ $LogPrint warning $ScriptName ("Running script '" . $Script . "' failed!"); } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 5db686a15ccd21ed3a190cd4c9eea0bcc6e56abd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 09:09:05 +0100 Subject: [PATCH 231/893] mod/bridge-port-to: $BridgePortTo: use $ExitError to indicate unintentional error --- mod/bridge-port-to.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/bridge-port-to.rsc b/mod/bridge-port-to.rsc index 7dae679..9e7b911 100644 --- a/mod/bridge-port-to.rsc +++ b/mod/bridge-port-to.rsc @@ -10,7 +10,7 @@ :global BridgePortTo; -:set BridgePortTo do={ +:set BridgePortTo do={ :do { :local BridgePortTo [ :tostr $1 ]; :global IfThenElse; @@ -65,4 +65,6 @@ $LogPrint info $0 ("Re-enabling interfaces..."); /interface/ethernet/enable $InterfaceReEnable; } -} +} on-error={ + :global ExitError; $ExitError false $0; +} } From da7a031081bcbb4c563bb8b56f7ee150c32b54c0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 232/893] log-forward: use $ExitError to indicate unintentional error --- log-forward.rsc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/log-forward.rsc b/log-forward.rsc index e0d8f35..8e660fc 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -33,6 +34,7 @@ :global SymbolForNotification; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -43,6 +45,7 @@ :if ($LogForwardRateLimit > 30) do={ :set LogForwardRateLimit ($LogForwardRateLimit - 1); $LogPrint info $ScriptName ("Rate limit in action, not forwarding logs, if any!"); + :set ExitOK true; :error false; } @@ -100,4 +103,6 @@ :local LogAll [ /log/find ]; :set LogForwardLast ($LogAll->([ :len $LogAll ] - 1) ); -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 495232b299bafadc4d21551f094c3c42fa090f57 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 09:09:48 +0100 Subject: [PATCH 233/893] mod/bridge-port-vlan: $BridgePortVlan: use $ExitError to indicate unintentional error --- mod/bridge-port-vlan.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/bridge-port-vlan.rsc b/mod/bridge-port-vlan.rsc index c9f55ae..18fa2db 100644 --- a/mod/bridge-port-vlan.rsc +++ b/mod/bridge-port-vlan.rsc @@ -10,7 +10,7 @@ :global BridgePortVlan; -:global BridgePortVlan do={ +:global BridgePortVlan do={ :do { :local ConfigTo [ :tostr $1 ]; :global IfThenElse; @@ -74,4 +74,6 @@ $LogPrint info $0 ("Re-enabling interfaces..."); /interface/ethernet/enable $InterfaceReEnable; } -} +} on-error={ + :global ExitError; $ExitError false $0; +} } From b7ce6aee71733a1e84b911a21c8868b8d2279c10 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 234/893] mode-button: use $ExitError to indicate unintentional error --- mode-button.rsc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mode-button.rsc b/mode-button.rsc index 3bd922b..24de453 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -83,4 +84,6 @@ $LogPrint debug $ScriptName ("Updating scheduler _ModeButtonScheduler..."); /system/scheduler/set $Scheduler start-time=[ /system/clock/get time ]; } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 05cb87f475ffc3f9fdc1fa6988925e79a3dacd38 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 09:10:08 +0100 Subject: [PATCH 235/893] mod/inspectvar: $InspectVar: use $ExitError to indicate unintentional error --- mod/inspectvar.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index 73205b2..0209214 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -12,11 +12,13 @@ :global InspectVarReturn; # inspect variable and print on terminal -:set InspectVar do={ +:set InspectVar do={ :do { :global InspectVarReturn; :put [ :tocrlf [ $InspectVarReturn $1 ] ]; -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # inspect variable and return formatted string :set InspectVarReturn do={ From d89a3694850a76e487b139eebf24572344a5502e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:08:36 +0100 Subject: [PATCH 236/893] netwatch-dns: use $ExitError to indicate unintentional error --- netwatch-dns.rsc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 6fbfc89..a704c84 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -24,12 +25,14 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } :local SettleTime (5m30s - [ /system/resource/get uptime ]); :if ($SettleTime > 0s) do={ $LogPrint info $ScriptName ("System just booted, giving netwatch " . $SettleTime . " to settle."); + :set ExitOK true; :error true; } @@ -92,6 +95,7 @@ :if ($DohCurrent = $HostInfo->"doh-url") do={ $LogPrint debug $ScriptName ("Current DoH server is still up: " . $DohCurrent); + :set ExitOK true; :error true; } @@ -132,6 +136,7 @@ } /ip/dns/cache/flush; $LogPrint info $ScriptName ("Setting DoH server: " . ($DohServer->"doh-url")); + :set ExitOK true; :error true; } else={ $LogPrint warning $ScriptName ("Received unexpected response from DoH server: " . \ @@ -139,4 +144,6 @@ } } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 34172e4c78cc5a6d0fe99df279e42a8794f84c94 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 09:10:27 +0100 Subject: [PATCH 237/893] mod/ipcalc: $IPCalc: use $ExitError to indicate unintentional error --- mod/ipcalc.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/ipcalc.rsc b/mod/ipcalc.rsc index 003bdc3..021cd30 100644 --- a/mod/ipcalc.rsc +++ b/mod/ipcalc.rsc @@ -12,7 +12,7 @@ :global IPCalcReturn; # print netmask, network, min host, max host and broadcast -:set IPCalc do={ +:set IPCalc do={ :do { :local Input [ :tostr $1 ]; :global FormatLine; @@ -27,7 +27,9 @@ [ $FormatLine "HostMin" ($Values->"hostmin") ] . "\n" . \ [ $FormatLine "HostMax" ($Values->"hostmax") ] . "\n" . \ [ $FormatLine "Broadcast" ($Values->"broadcast") ]) ]; -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # calculate and return netmask, network, min host, max host and broadcast :set IPCalcReturn do={ From bdc15eaefb51b40b3d414f0e94bfa22233b0f2a4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 238/893] netwatch-notify: use $ExitError to indicate unintentional error --- netwatch-notify.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index a49d0cd..f1e87bd 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -75,6 +76,7 @@ } :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -218,4 +220,6 @@ "since"=($Metric->"since") }; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 5450618723dabf9d42857047ea906c9fc87886dd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 08:51:50 +0100 Subject: [PATCH 239/893] mod/notification-email: $FlushEmailQueue: use $ExitError to indicate unintentional error --- mod/notification-email.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index 3d62ddf..ff4188c 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -34,7 +34,7 @@ } # flush e-mail queue -:set FlushEmailQueue do={ +:set FlushEmailQueue do={ :do { :global EmailQueue; :global EitherOr; @@ -113,7 +113,9 @@ } else={ /system/scheduler/set interval=1m comment="Waiting for retry..." $Scheduler; } -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # generate filter for log-forward :set LogForwardFilterLogForwarding do={ From eeb76c227cbc04c410e7062daef4cda9cb3d5bf3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 240/893] ospf-to-leds: use $ExitError to indicate unintentional error --- ospf-to-leds.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ospf-to-leds.rsc b/ospf-to-leds.rsc index b78faa4..d96e763 100644 --- a/ospf-to-leds.rsc +++ b/ospf-to-leds.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -19,6 +20,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -42,4 +44,6 @@ /system/leds/set type=off [ find where leds=$LED ]; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 1927dc505a88ef5ecb86d1d925cf44a5225b4b7c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 11:09:44 +0100 Subject: [PATCH 241/893] mod/notification-email: $SendEMail: use $ExitError to indicate unintentional error --- mod/notification-email.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index ff4188c..e51779b 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -226,11 +226,13 @@ } # send notification via e-mail - expects at least two string arguments -:set SendEMail do={ +:set SendEMail do={ :do { :global SendEMail2; $SendEMail2 ({ origin=$0; subject=$1; message=$2; link=$3 }); -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # send notification via e-mail - expects one array argument :set SendEMail2 do={ From 81f59f9894cfd9b29a2366e8a13e124b358dadde Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 242/893] packages-update: use $ExitError to indicate unintentional error --- packages-update.rsc | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/packages-update.rsc b/packages-update.rsc index b08a48d..924a5d9 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -45,6 +46,7 @@ } :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -52,11 +54,13 @@ :if ([ :typeof ($Update->"latest-version") ] = "nothing") do={ $LogPrint warning $ScriptName ("Latest version is not known."); + :set ExitOK true; :error false; } :if ($Update->"installed-version" = $Update->"latest-version") do={ $LogPrint info $ScriptName ("Version " . $Update->"latest-version" . " is already installed."); + :set ExitOK true; :error true; } @@ -85,10 +89,12 @@ $LogPrint info $ScriptName ("User requested to continue anyway."); } else={ $LogPrint info $ScriptName ("Canceled update..."); + :set ExitOK true; :error false; } } else={ $LogPrint warning $ScriptName ("Canceled non-interactive update."); + :set ExitOK true; :error false; } } @@ -108,6 +114,7 @@ } } else={ $LogPrint warning $ScriptName ("Not installing downgrade automatically."); + :set ExitOK true; :error false; } } @@ -116,6 +123,7 @@ :local PkgName [ /system/package/get $Package name ]; :if ([ $DownloadPackage $PkgName ($Update->"latest-version") ] = false) do={ $LogPrint error $ScriptName ("Download for package " . $PkgName . " failed, update aborted."); + :set ExitOK true; :error false; } } @@ -130,11 +138,13 @@ :put "Do you want to (s)chedule reboot or (r)eboot now? [s/R]"; :if (([ /terminal/inkey timeout=60 ] % 32) = 19) do={ $Schedule $ScriptName; + :set ExitOK true; :error true; } } else={ :if ($PackagesUpdateDeferReboot = true) do={ $Schedule $ScriptName; + :set ExitOK true; :error true; } } @@ -142,4 +152,6 @@ $LogPrint info $ScriptName ("Rebooting for update."); :delay 1s; /system/reboot; -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 1994b23e462c02ee71d5cb9db21d0e6075010c3c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 08:56:35 +0100 Subject: [PATCH 243/893] mod/notification-matrix: $FlushMatrixQueue: use $ExitError to indicate unintentional error --- mod/notification-matrix.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 3adc1df..751967c 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -18,7 +18,7 @@ :global SetupMatrixJoinRoom; # flush Matrix queue -:set FlushMatrixQueue do={ +:set FlushMatrixQueue do={ :do { :global MatrixQueue; :global IsFullyConnected; @@ -57,7 +57,9 @@ /system/scheduler/remove [ find where name="_FlushMatrixQueue" ]; :set MatrixQueue; } -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # send notification via Matrix - expects one array argument :set ($NotificationFunctions->"matrix") do={ From be0548007184bae80dd40b4a6390ababeeb39617 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 244/893] ppp-on-up: use $ExitError to indicate unintentional error --- ppp-on-up.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index 337b32d..13b42c7 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -20,6 +21,7 @@ :if ([ :typeof $Interface ] = "nothing") do={ $LogPrint error $ScriptName ("This script is supposed to run from ppp on-up script hook."); + :set ExitOK true; :error false; } @@ -37,4 +39,6 @@ $LogPrint warning $ScriptName ("Running script '" . $ScriptName . "' failed!"); } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From de9dee83bea855a893594e0d58ca609872f75072 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 11:10:03 +0100 Subject: [PATCH 245/893] mod/notification-matrix: $SendMatrix: use $ExitError to indicate unintentional error --- mod/notification-matrix.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 751967c..14f369d 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -166,11 +166,13 @@ } # send notification via Matrix - expects at least two string arguments -:set SendMatrix do={ +:set SendMatrix do={ :do { :global SendMatrix2; $SendMatrix2 ({ origin=$0; subject=$1; message=$2; link=$3 }); -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # send notification via Matrix - expects one array argument :set SendMatrix2 do={ From ede351f47e8311fe00bada723e69ab90dc1332d0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 246/893] sms-action: use $ExitError to indicate unintentional error --- sms-action.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/sms-action.rsc b/sms-action.rsc index c896659..fd3096c 100644 --- a/sms-action.rsc +++ b/sms-action.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -23,6 +24,7 @@ :if ([ :typeof $Action ] = "nothing") do={ $LogPrint error $ScriptName ("This script is supposed to run from SMS hook with action=..."); + :set ExitOK true; :error false; } @@ -34,4 +36,6 @@ } else={ $LogPrint warning $ScriptName ("The code for action '" . $Action . "' failed syntax validation!"); } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From aac723e2a1eede3649c5f3b4bbe67af0e951063a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 08:57:01 +0100 Subject: [PATCH 247/893] mod/notification-ntfy: $FlushNtfyQueue: use $ExitError to indicate unintentional error --- mod/notification-ntfy.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index b2bb280..5fdeedf 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -15,7 +15,7 @@ :global SendNtfy2; # flush ntfy queue -:set FlushNtfyQueue do={ +:set FlushNtfyQueue do={ :do { :global NtfyQueue; :global NtfyMessageIDs; @@ -52,7 +52,9 @@ /system/scheduler/remove [ find where name="_FlushNtfyQueue" ]; :set NtfyQueue; } -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # send notification via ntfy - expects one array argument :set ($NotificationFunctions->"ntfy") do={ From a78fe98fd0746dd88429413d9c81123866d880bd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 248/893] sms-forward: use $ExitError to indicate unintentional error --- sms-forward.rsc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sms-forward.rsc b/sms-forward.rsc index 0d493b6..8334d5f 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -12,6 +12,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -28,11 +29,13 @@ :global WaitFullyConnected; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } :if ([ /tool/sms/get receive-enabled ] = false) do={ $LogPrintOnce warning $ScriptName ("Receiving of SMS is not enabled."); + :set ExitOK true; :error false; } @@ -42,6 +45,7 @@ :if ([ /interface/lte/get ($Settings->"port") running ] != true) do={ $LogPrint info $ScriptName ("The LTE interface is not in running state, skipping."); + :set ExitOK true; :error true; } @@ -92,4 +96,6 @@ } } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From e76ae11b029169e971f7313b17d5c43589fa8170 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 11:10:24 +0100 Subject: [PATCH 249/893] mod/notification-ntfy: $SendNtfy: use $ExitError to indicate unintentional error --- mod/notification-ntfy.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 5fdeedf..7e0234b 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -134,11 +134,13 @@ } # send notification via ntfy - expects at least two string arguments -:set SendNtfy do={ +:set SendNtfy do={ :do { :global SendNtfy2; $SendNtfy2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # send notification via ntfy - expects one array argument :set SendNtfy2 do={ From adbefca0e48bda15d90cc53c52c3982230f8864c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 250/893] telegram-chat: use $ExitError to indicate unintentional error --- telegram-chat.rsc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index f2750f5..8589aab 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -11,6 +11,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -43,6 +44,7 @@ :global WaitFullyConnected; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -57,6 +59,7 @@ :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={ $LogPrint warning $ScriptName ("Downloading required certificate failed."); + :set ExitOK true; :error false; } @@ -82,6 +85,7 @@ :if ($Data = false) do={ $LogPrint warning $ScriptName ("Failed getting updates."); + :set ExitOK true; :error false; } @@ -130,6 +134,7 @@ :local File ("tmpfs/telegram-chat/" . [ $GetRandom20CharAlNum 6 ]); :if ([ $MkDir "tmpfs/telegram-chat" ] = false) do={ $LogPrint error $ScriptName ("Failed creating directory!"); + :set ExitOK true; :error false; } $LogPrint info $ScriptName ("Running command from update " . $UpdateID . ": " . $Command); @@ -176,4 +181,6 @@ } :set TelegramChatOffset ([ :pick $TelegramChatOffset 1 3 ], \ [ $IfThenElse ($UpdateID >= $TelegramChatOffset->2) ($UpdateID + 1) ($TelegramChatOffset->2) ]); -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From e89867be1533cd561bf61b65f3019946e2ceeee1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 08:57:20 +0100 Subject: [PATCH 251/893] mod/notification-telegram: $FlushTelegramQueue: use $ExitError to indicate unintentional error --- mod/notification-telegram.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 671bd1c..993782d 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -15,7 +15,7 @@ :global SendTelegram2; # flush telegram queue -:set FlushTelegramQueue do={ +:set FlushTelegramQueue do={ :do { :global TelegramQueue; :global TelegramMessageIDs; @@ -56,7 +56,9 @@ /system/scheduler/remove [ find where name="_FlushTelegramQueue" ]; :set TelegramQueue; } -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # send notification via telegram - expects one array argument :set ($NotificationFunctions->"telegram") do={ From d4ea0e18a710c5a68c7dabaa5c1c5a40568c965b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 252/893] update-gre-address: use $ExitError to indicate unintentional error --- update-gre-address.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/update-gre-address.rsc b/update-gre-address.rsc index 6dd829d..87762d6 100644 --- a/update-gre-address.rsc +++ b/update-gre-address.rsc @@ -12,6 +12,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -20,6 +21,7 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } @@ -39,4 +41,6 @@ } } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 4968b79fc1142c9bfdbfe93c8f917cfdd7f51790 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 11:10:43 +0100 Subject: [PATCH 253/893] mod/notification-telegram: $SendTelegram: use $ExitError to indicate unintentional error --- mod/notification-telegram.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 993782d..7d75b8b 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -182,11 +182,13 @@ } # send notification via telegram - expects at least two string arguments -:set SendTelegram do={ +:set SendTelegram do={ :do { :global SendTelegram2; $SendTelegram2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # send notification via telegram - expects one array argument :set SendTelegram2 do={ From ee030740cba5bd0c8b0c9c3e77551dd460abe48b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 6 Dec 2024 10:31:52 +0100 Subject: [PATCH 254/893] update-tunnelbroker: use $ExitError to indicate unintentional error --- update-tunnelbroker.rsc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index 67a5d30..dd43c64 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -13,6 +13,7 @@ :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:local ExitOK false; :do { :local ScriptName [ :jobname ]; @@ -22,11 +23,13 @@ :global ScriptLock; :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; :error false; } :if ([ $CertificateAvailable "Starfield Root Certificate Authority - G2" ] = false) do={ $LogPrint error $ScriptName ("Downloading required certificate failed."); + :set ExitOK true; :error false; } @@ -50,6 +53,7 @@ :if (!($Data ~ "^(good|nochg) ")) do={ $LogPrint error $ScriptName ("Failed sending the local address to tunnelbroker or unexpected response!"); + :set ExitOK true; :error false; } @@ -64,4 +68,6 @@ /interface/6to4/set $Interface local-address=$PublicAddress; } } -} on-error={ } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} From 48bcf8ee6e92445b01f792f1c52af012ba05b7b4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 09:45:30 +0100 Subject: [PATCH 255/893] =?UTF-8?q?global-functions:=20$FetchHuge:=20passi?= =?UTF-8?q?ng=20boolean=20to=20function=20is=20still=20broken...=20?= =?UTF-8?q?=F0=9F=A4=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- global-functions.rsc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 47a69c4..6fec6dd 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -427,9 +427,9 @@ # fetch huge data to file, read in chunks :set FetchHuge do={ - :local ScriptName [ :tostr $1 ]; - :local Url [ :tostr $2 ]; - :local CheckCert [ :tobool $3 ]; + :local ScriptName [ :tostr $1 ]; + :local Url [ :tostr $2 ]; + :local CheckCert [ :tostr $3 ]; :global CleanName; :global FetchUserAgentStr; @@ -439,7 +439,7 @@ :global MkDir; :global WaitForFile; - :set CheckCert [ $IfThenElse ($CheckCert = false) "no" "yes-without-crl" ]; + :set CheckCert [ $IfThenElse ($CheckCert = "false") "no" "yes-without-crl" ]; :local DirName ("tmpfs/" . [ $CleanName $ScriptName ]); :if ([ $MkDir $DirName ] = false) do={ From 73e0ac75f10019794a2692371ca08a46bea69eb9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 09:10:44 +0100 Subject: [PATCH 256/893] mod/scriptrunonce: $ScriptRunOnce: use $ExitError to indicate unintentional error --- mod/scriptrunonce.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index 3d5dce9..c8dcf26 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -11,7 +11,7 @@ :global ScriptRunOnce; # fetch and run script(s) once -:set ScriptRunOnce do={ +:set ScriptRunOnce do={ :do { :local Scripts [ :toarray $1 ]; :global ScriptRunOnceBaseUrl; @@ -49,4 +49,6 @@ } } } -} +} on-error={ + :global ExitError; $ExitError false $0; +} } From 1788c0599865ee9cb7e5015e260d7e4a49abf581 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 09:11:39 +0100 Subject: [PATCH 257/893] mod/ssh-keys-import: $SSHKeysImport: use $ExitError to indicate unintentional error --- mod/ssh-keys-import.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index c7b2788..b2f1d20 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -12,7 +12,7 @@ :global SSHKeysImportFile; # import single key passed as string -:set SSHKeysImport do={ +:set SSHKeysImport do={ :do { :local Key [ :tostr $1 ]; :local User [ :tostr $2 ]; @@ -64,7 +64,9 @@ /file/remove "tmpfs/ssh-keys-import"; :return false; } -} +} on-error={ + :global ExitError; $ExitError false $0; +} } # import keys from a file :set SSHKeysImportFile do={ From f8a55860afaf8817e52cb89add227fa9a84435f0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sun, 8 Dec 2024 22:19:01 +0100 Subject: [PATCH 258/893] check-routeros-update: pass script name to local function --- check-routeros-update.rsc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 510acd9..a2e39b6 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -35,6 +35,8 @@ :global WaitFullyConnected; :local DoUpdate do={ + :local ScriptName [ :tostr $1 ]; + :global LogPrint; :if ([ :len [ /system/script/find where name="packages-update" ] ] > 0) do={ @@ -42,7 +44,7 @@ } else={ /system/package/update/install without-paging; } - $LogPrint info $0 ("Waiting for system to reboot."); + $LogPrint info $ScriptName ("Waiting for system to reboot."); } :if ([ $ScriptLock $ScriptName ] = false) do={ @@ -95,7 +97,7 @@ subject=([ $SymbolForNotification "sparkles" ] . "RouterOS update: " . $Update->"latest-version"); \ message=("Installing ALL versions automatically, including " . $Update->"latest-version" . \ "... Updating on " . $Identity . "..."); link=$Link; silent=true }); - $DoUpdate; + $DoUpdate $ScriptName; :set ExitOK true; :error true; } @@ -106,7 +108,7 @@ subject=([ $SymbolForNotification "sparkles" ] . "RouterOS update: " . $Update->"latest-version"); \ message=("Version " . $Update->"latest-version" . " is a patch update for " . $Update->"channel" . \ ", updating on " . $Identity . "..."); link=$Link; silent=true }); - $DoUpdate; + $DoUpdate $ScriptName; :set ExitOK true; :error true; } @@ -122,7 +124,7 @@ subject=([ $SymbolForNotification "sparkles" ] . "RouterOS update: " . $Update->"latest-version"); \ message=("Seen a neighbor (" . $Neighbor . ") running version " . $Update->"latest-version" . \ " from " . $Update->"channel" . ", updating on " . $Identity . "..."); link=$Link; silent=true }); - $DoUpdate; + $DoUpdate $ScriptName; :set ExitOK true; :error true; } @@ -144,7 +146,7 @@ subject=([ $SymbolForNotification "sparkles" ] . "RouterOS update: " . $Update->"latest-version"); \ message=("Version " . $Update->"latest-version" . " is considered safe for " . $Update->"channel" . \ ", updating on " . $Identity . "..."); link=$Link; silent=true }); - $DoUpdate; + $DoUpdate $ScriptName; :set ExitOK true; :error true; } @@ -163,7 +165,7 @@ :put ("Do you want to install RouterOS version " . $Update->"latest-version" . "? [y/N]"); :if (([ /terminal/inkey timeout=60 ] % 32) = 25) do={ - $DoUpdate; + $DoUpdate $ScriptName; :set ExitOK true; :error true; } else={ From 210ef26b93364f4b69cde9ff34139d51572357ee Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 9 Dec 2024 09:11:56 +0100 Subject: [PATCH 259/893] mod/ssh-keys-import: $SSHKeysImportFile: use $ExitError to indicate unintentional error --- mod/ssh-keys-import.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index b2f1d20..583e827 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -69,7 +69,7 @@ } } # import keys from a file -:set SSHKeysImportFile do={ +:set SSHKeysImportFile do={ :do { :local FileName [ :tostr $1 ]; :local User [ :tostr $2 ]; @@ -108,4 +108,6 @@ $LogPrint warning $0 ("SSH key of type '" . $KeyVal->0 . "' is not supported."); } } -} +} on-error={ + :global ExitError; $ExitError false $0; +} } From e51191035b21c529efb4387dfe59976c3112f561 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sun, 8 Dec 2024 22:22:18 +0100 Subject: [PATCH 260/893] mode-button: $ModeButtonScheduler: explicitly name the variable --- mode-button.rsc | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/mode-button.rsc b/mode-button.rsc index 24de453..2d428ed 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -26,6 +26,8 @@ :if ([ :len $Scheduler ] = 0) do={ $LogPrint info $ScriptName ("Creating scheduler _ModeButtonScheduler, counting presses..."); :global ModeButtonScheduler do={ + :local FuncName $0; + :global ModeButton; :global LogPrint; @@ -54,7 +56,7 @@ :if ([ :len $Code ] > 0) do={ :if ([ $ValidateSyntax $Code ] = true) do={ - $LogPrint info $0 ("Acting on " . $Count . " mode-button presses: " . $Code); + $LogPrint info $FuncName ("Acting on " . $Count . " mode-button presses: " . $Code); :for I from=1 to=$Count do={ $LEDInvert; @@ -69,13 +71,15 @@ :do { [ :parse $Code ]; } on-error={ - $LogPrint warning $0 ("The code for " . $Count . " mode-button presses failed with runtime error!"); + $LogPrint warning $FuncName \ + ("The code for " . $Count . " mode-button presses failed with runtime error!"); } } else={ - $LogPrint warning $0 ("The code for " . $Count . " mode-button presses failed syntax validation!"); + $LogPrint warning $FuncName \ + ("The code for " . $Count . " mode-button presses failed syntax validation!"); } } else={ - $LogPrint info $0 ("No action defined for " . $Count . " mode-button presses."); + $LogPrint info $FuncName ("No action defined for " . $Count . " mode-button presses."); } } /system/scheduler/add name="_ModeButtonScheduler" \ From bceabebf9c6c30e2b1057448d74a5de006ef5d1e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 Dec 2024 17:05:12 +0100 Subject: [PATCH 261/893] mod/notification-email: drop useless safeguard Guess it was useful back in the day. Now the function exits early if the queue is empty... So this can never be zero. --- mod/notification-email.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index e51779b..dd90923 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -71,7 +71,7 @@ $LogPrint warning $0 ("Flushing E-Mail messages from scheduler, but queue is empty."); } - /system/scheduler/set interval=([ $EitherOr $QueueLen 1 ] . "m") comment="Sending..." $Scheduler; + /system/scheduler/set interval=($QueueLen . "m") comment="Sending..." $Scheduler; :foreach Id,Message in=$EmailQueue do={ :if ([ :typeof $Message ] = "array" ) do={ From 42bcc63d29c85a7fcdb175b3ea725654d2db7039 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 Dec 2024 17:12:24 +0100 Subject: [PATCH 262/893] mod/notification-email: increase retry interval on failure --- mod/notification-email.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index dd90923..b109bf4 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -46,8 +46,9 @@ :local AllDone true; :local QueueLen [ :len $EmailQueue ]; :local Scheduler [ /system/scheduler/find where name="_FlushEmailQueue" ]; + :local SchedVal [ /system/scheduler/get $Scheduler ]; - :if ([ :len $Scheduler ] > 0 && [ /system/scheduler/get $Scheduler interval ] < 1m) do={ + :if ([ :len $Scheduler ] > 0 && ($SchedVal->"interval") < 1m) do={ /system/scheduler/set interval=1m comment="Doing initial checks..." $Scheduler; } @@ -111,7 +112,8 @@ /system/scheduler/remove $Scheduler; :set EmailQueue; } else={ - /system/scheduler/set interval=1m comment="Waiting for retry..." $Scheduler; + /system/scheduler/set interval=(($SchedVal->"run-count") . "m") \ + comment="Waiting for retry..." $Scheduler; } } on-error={ :global ExitError; $ExitError false $0; From c311e58d998fabc7568acd77f0a8bd42468f50b0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 Dec 2024 20:23:26 +0100 Subject: [PATCH 263/893] leds-toggle-mode: toggle in one call... ... and drop the condition. --- leds-toggle-mode.rsc | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/leds-toggle-mode.rsc b/leds-toggle-mode.rsc index 136c9d1..07e12ae 100644 --- a/leds-toggle-mode.rsc +++ b/leds-toggle-mode.rsc @@ -6,8 +6,4 @@ # toggle LEDs mode # https://git.eworm.de/cgit/routeros-scripts/about/doc/leds-mode.md -:if ([ /system/leds/settings/get all-leds-off ] = "never") do={ - /system/leds/settings/set all-leds-off=immediate; -} else={ - /system/leds/settings/set all-leds-off=never; -} +/system/leds/settings/set all-leds-off=(({ "never"="immediate"; "immediate"="never" })->[ get all-leds-off ]); From d70efe910ae3a9bef3ee6b62c0fd6d591bab89e3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 Dec 2024 20:32:50 +0100 Subject: [PATCH 264/893] mode-button: support led toggle without extra script --- global-config.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-config.rsc b/global-config.rsc index 2ed67f3..5292853 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -186,7 +186,7 @@ # Run different commands with multiple mode-button presses. :global ModeButton { - 1="/system/script/run leds-toggle-mode;"; + 1="/system/leds/settings/set all-leds-off=(({ \"never\"=\"immediate\"; \"immediate\"=\"never\" })->[ get all-leds-off ]);"; 2=":global Identity; :global SendNotification; :global SymbolForNotification; \$SendNotification ([ \$SymbolForNotification \"earth\" ] . \"Hello...\") (\"Hello world, \" . \$Identity . \" calling!\");"; 3="/system/shutdown;"; 4="/system/reboot;"; From 8231c3e833ee83a118f4d8395c097e6a9f312c2f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 Dec 2024 10:40:06 +0100 Subject: [PATCH 265/893] global-functions: $WaitForFile: delay until "complete"... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Well, turns out that waiting for existence of a file is not sufficient. Chances are that a file is available just partly, so wait until the size no longer changes... Let's hope that works as expected. 🤞 --- global-functions.rsc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 625f8cd..e5e5d50 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1577,6 +1577,16 @@ :delay $Delay; :set I ($I + 1); } + + :local File [ /file/find where name=$FileName ]; + :local SizeA 0; + :local SizeB 1; + :while ($SizeA < $SizeB) do={ + :set SizeA $SizeB; + :delay $Delay; + :set SizeB [ /file/get $File size ]; + } + :return true; } From 009a6bd76204083f4b1971b285d90e916c0fbc29 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 Dec 2024 10:55:23 +0100 Subject: [PATCH 266/893] mod/notification-email: $FlushEmailQueue: return on success --- mod/notification-email.rsc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index b109bf4..1d9a0a1 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -111,10 +111,11 @@ :if ($AllDone = true && $QueueLen = [ :len $EmailQueue ]) do={ /system/scheduler/remove $Scheduler; :set EmailQueue; - } else={ - /system/scheduler/set interval=(($SchedVal->"run-count") . "m") \ - comment="Waiting for retry..." $Scheduler; + :return true; } + + /system/scheduler/set interval=(($SchedVal->"run-count") . "m") \ + comment="Waiting for retry..." $Scheduler; } on-error={ :global ExitError; $ExitError false $0; } } From 53106731528adc607ee40336b79c516fac594a17 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 Dec 2024 10:59:37 +0100 Subject: [PATCH 267/893] mod/notification-email: $FlushEmailQueue: return on purge --- mod/notification-email.rsc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index 1d9a0a1..60c1e9b 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -114,6 +114,12 @@ :return true; } + :if ([ :len [ /system/scheduler/find where name="_FlushEmailQueue" ] ] = 0 && \ + [ :typeof $EmailQueue ] = "nothing") do={ + $LogPrint info $0 ("Queue was purged? Exiting."); + :return false; + } + /system/scheduler/set interval=(($SchedVal->"run-count") . "m") \ comment="Waiting for retry..." $Scheduler; } on-error={ From 1e2ca3d21441ac7881b7c556c8d73c70bb92edc6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 Dec 2024 11:28:12 +0100 Subject: [PATCH 268/893] mod/notification-email: $FlushEmailQueue: create scheduler if missing... ... as it is required to be modified several times below. --- mod/notification-email.rsc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index 60c1e9b..c474750 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -46,9 +46,15 @@ :local AllDone true; :local QueueLen [ :len $EmailQueue ]; :local Scheduler [ /system/scheduler/find where name="_FlushEmailQueue" ]; - :local SchedVal [ /system/scheduler/get $Scheduler ]; - :if ([ :len $Scheduler ] > 0 && ($SchedVal->"interval") < 1m) do={ + :if ([ :len $Scheduler ] < 0) do={ + /system/scheduler/add name="_FlushEmailQueue" interval=1m start-time=startup \ + comment="Doing initial checks..." on-event=(":global FlushEmailQueue; \$FlushEmailQueue;"); + :set Scheduler [ /system/scheduler/find where name="_FlushEmailQueue" ]; + } + + :local SchedVal [ /system/scheduler/get $Scheduler ]; + :if (($SchedVal->"interval") < 1m) do={ /system/scheduler/set interval=1m comment="Doing initial checks..." $Scheduler; } From 8c8c75ca66d59d9368fe3f4fe7f1124a425f41b3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 Dec 2024 11:51:17 +0100 Subject: [PATCH 269/893] mod/notification-email: $FlushEmailQueue: move the check up... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ... as this needs to be done before creating a scheduler. 😜 Also remove the scheduler and return. --- mod/notification-email.rsc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index c474750..bbce6d0 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -47,6 +47,12 @@ :local QueueLen [ :len $EmailQueue ]; :local Scheduler [ /system/scheduler/find where name="_FlushEmailQueue" ]; + :if ([ :len $Scheduler ] > 0 && $QueueLen = 0) do={ + $LogPrint warning $0 ("Flushing E-Mail messages from scheduler, but queue is empty."); + /system/scheduler/remove $Scheduler; + :return false; + } + :if ([ :len $Scheduler ] < 0) do={ /system/scheduler/add name="_FlushEmailQueue" interval=1m start-time=startup \ comment="Doing initial checks..." on-event=(":global FlushEmailQueue; \$FlushEmailQueue;"); @@ -74,10 +80,6 @@ :return false; } - :if ([ :len $Scheduler ] > 0 && $QueueLen = 0) do={ - $LogPrint warning $0 ("Flushing E-Mail messages from scheduler, but queue is empty."); - } - /system/scheduler/set interval=($QueueLen . "m") comment="Sending..." $Scheduler; :foreach Id,Message in=$EmailQueue do={ From b66332eb464884d69eef56aa5ecb7ae74d1914cc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 Dec 2024 11:58:41 +0100 Subject: [PATCH 270/893] mod/notification-email: $FlushEmailQueue: just return on empty queue --- mod/notification-email.rsc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index bbce6d0..a3291d9 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -53,6 +53,10 @@ :return false; } + :if ($QueueLen = 0) do={ + :return true; + } + :if ([ :len $Scheduler ] < 0) do={ /system/scheduler/add name="_FlushEmailQueue" interval=1m start-time=startup \ comment="Doing initial checks..." on-event=(":global FlushEmailQueue; \$FlushEmailQueue;"); From a7878d664f51ed77a574a5d360c9c53863d0d488 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 Dec 2024 12:11:15 +0100 Subject: [PATCH 271/893] fw-addr-lists: do not fail on invalid json data --- fw-addr-lists.rsc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 6682f4a..a195c89 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -92,7 +92,9 @@ :set Line ($Line->0); :local Address; :if ([ :pick $Line 0 1 ] = "{") do={ - :set Address [ :tostr ([ :deserialize from=json $Line ]->"cidr") ]; + :do { + :set Address [ :tostr ([ :deserialize from=json $Line ]->"cidr") ]; + } on-error={ } } else={ :set Address ([ :pick $Line 0 [ $FindDelim $Line ] ] . ($List->"cidr")); } From d1b9b1b410933e0510845c245f742a7df172dc61 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 13 Dec 2024 17:40:49 +0100 Subject: [PATCH 272/893] mod/notification-ntfy: support authentication with bearer token Closes: https://github.com/eworm-de/routeros-scripts/issues/86 --- doc/mod/notification-ntfy.md | 2 ++ global-config.rsc | 1 + mod/notification-ntfy.rsc | 6 ++++++ 3 files changed, 9 insertions(+) diff --git a/doc/mod/notification-ntfy.md b/doc/mod/notification-ntfy.md index 5393d44..04dee35 100644 --- a/doc/mod/notification-ntfy.md +++ b/doc/mod/notification-ntfy.md @@ -52,6 +52,8 @@ basic authentication. Configure `NtfyServerUser` and `NtfyServerPass` for this. Even authentication via access token is possible, adding it as password with a blank username. +Also available is `NtfyServerToken` to add a bearer token for authentication. + For a custom service installing an additional certificate may be required. You may want to install that certificate manually, after finding the [certificate name from browser](../../CERTIFICATES.md). diff --git a/global-config.rsc b/global-config.rsc index 5292853..0c8f738 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -58,6 +58,7 @@ :global NtfyServer "ntfy.sh"; :global NtfyServerUser []; :global NtfyServerPass []; +:global NtfyServerToken []; :global NtfyTopic ""; # It is possible to override e-mail, Telegram, Matrix and Ntfy setting diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 7e0234b..7e4eaf0 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -67,6 +67,8 @@ :global NtfyServerOverride; :global NtfyServerPass; :global NtfyServerPassOverride; + :global NtfyServerToken; + :global NtfyServerTokenOverride; :global NtfyServerUser; :global NtfyServerUserOverride; :global NtfyTopic; @@ -83,6 +85,7 @@ :local Server [ $EitherOr ($NtfyServerOverride->($Notification->"origin")) $NtfyServer ]; :local User [ $EitherOr ($NtfyServerUserOverride->($Notification->"origin")) $NtfyServerUser ]; :local Pass [ $EitherOr ($NtfyServerPassOverride->($Notification->"origin")) $NtfyServerPass ]; + :local Token [ $EitherOr ($NtfyServerTokenOverride->($Notification->"origin")) $NtfyServerToken ]; :local Topic [ $EitherOr ($NtfyTopicOverride->($Notification->"origin")) $NtfyTopic ]; :if ([ :len $Topic ] = 0) do={ @@ -93,6 +96,9 @@ :local Headers ({ [ $FetchUserAgentStr ($Notification->"origin") ]; \ ("Priority: " . [ $IfThenElse ($Notification->"silent") "low" "default" ]); \ ("Title: " . "[" . $IdentityExtra . $Identity . "] " . ($Notification->"subject")) }); + :if ([ :len $Token ] > 0) do={ + :set Headers ($Headers, ("Authorization: Bearer " . $Token)); + } :local Text (($Notification->"message") . "\n"); :if ([ :len ($Notification->"link") ] > 0) do={ :set Text ($Text . "\n" . [ $SymbolForNotification "link" ] . ($Notification->"link")); From 6bee4675509e874d2f2ed8ee960f251b5667a451 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 13 Dec 2024 17:48:49 +0100 Subject: [PATCH 273/893] mod/notification-ntfy: add basic authentication in headers This makes it a bit easier and straight forward as we pass the headers anyway. --- mod/notification-ntfy.rsc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 7e4eaf0..f8351fd 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -39,7 +39,7 @@ :do { /tool/fetch check-certificate=yes-without-crl output=none http-method=post \ http-header-field=($Message->"headers") http-data=($Message->"text") \ - ($Message->"url") user=($Message->"user") password=($Message->"pass") as-value; + ($Message->"url") as-value; :set ($NtfyQueue->$Id); } on-error={ $LogPrint debug $0 ("Sending queued Ntfy message failed."); @@ -96,6 +96,9 @@ :local Headers ({ [ $FetchUserAgentStr ($Notification->"origin") ]; \ ("Priority: " . [ $IfThenElse ($Notification->"silent") "low" "default" ]); \ ("Title: " . "[" . $IdentityExtra . $Identity . "] " . ($Notification->"subject")) }); + :if ([ :len $User ] > 0 || [ :len $Pass ] > 0) do={ + :set Headers ($Headers, ("Authorization: Basic " . [ :convert to=base64 ($User . ":" . $Pass) ])); + } :if ([ :len $Token ] > 0) do={ :set Headers ($Headers, ("Authorization: Bearer " . $Token)); } @@ -112,7 +115,7 @@ } } /tool/fetch check-certificate=yes-without-crl output=none http-method=post \ - http-header-field=$Headers http-data=$Text $Url user=$User password=$Pass as-value; + http-header-field=$Headers http-data=$Text $Url as-value; } on-error={ $LogPrint info $0 ("Failed sending ntfy notification! Queuing..."); @@ -123,7 +126,7 @@ "This message was queued since " . [ /system/clock/get date ] . " " . \ [ /system/clock/get time ] . " and may be obsolete."); :set ($NtfyQueue->[ :len $NtfyQueue ]) \ - { url=$Url; user=$User; pass=$Pass; headers=$Headers; text=$Text }; + { url=$Url; headers=$Headers; text=$Text }; :if ([ :len [ /system/scheduler/find where name="_FlushNtfyQueue" ] ] = 0) do={ /system/scheduler/add name="_FlushNtfyQueue" interval=1m start-time=startup \ on-event=(":global FlushNtfyQueue; \$FlushNtfyQueue;"); From ba39c29648282159082dfa999ec40c7fc84b0e3c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 25 Dec 2024 21:47:23 +0100 Subject: [PATCH 274/893] global-functions: $ParseKeyValueStore: split key and value... ... into separate variables. --- global-functions.rsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index e5e5d50..b212d3a 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -925,8 +925,9 @@ :local Result ({}); :foreach KeyValue in=[ :toarray $Source ] do={ :if ([ :find $KeyValue "=" ]) do={ - :set ($Result->[ :pick $KeyValue 0 [ :find $KeyValue "=" ] ]) \ - [ :pick $KeyValue ([ :find $KeyValue "=" ] + 1) [ :len $KeyValue ] ]; + :local Key [ :pick $KeyValue 0 [ :find $KeyValue "=" ] ]; + :local Value [ :pick $KeyValue ([ :find $KeyValue "=" ] + 1) [ :len $KeyValue ] ]; + :set ($Result->$Key) $Value; } else={ :set ($Result->$KeyValue) true; } From 8212bd6c95935f02335d7d774bd3115a2c071fb1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 25 Dec 2024 21:56:45 +0100 Subject: [PATCH 275/893] global-functions: $ParseKeyValueStore: properly return boolean values --- global-functions.rsc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index b212d3a..766e8a2 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -927,6 +927,8 @@ :if ([ :find $KeyValue "=" ]) do={ :local Key [ :pick $KeyValue 0 [ :find $KeyValue "=" ] ]; :local Value [ :pick $KeyValue ([ :find $KeyValue "=" ] + 1) [ :len $KeyValue ] ]; + :if ($Value="true") do={ :set Value true; } + :if ($Value="false") do={ :set Value false; } :set ($Result->$Key) $Value; } else={ :set ($Result->$KeyValue) true; From ef3ce7cc6c43b28e6a80345d9861775767ba86f4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 25 Dec 2024 22:22:30 +0100 Subject: [PATCH 276/893] global-functions: $ParseKeyValueStore: support JSON as input This used to require a key=value store, separated with commas. An example for `netwatch-notify` is: /tool/netwatch/add comment="notify, name=example.com" host=93.184.215.14; Now JSON is supported as well, so you could use: /tool/netwatch/add comment="{\"notify\":true,\"name\":\"example.com\"}" host=93.184.215.14; Looks more clumsy here, but may be of help in more complex setups... --- global-functions.rsc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 766e8a2..85818b4 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -919,6 +919,13 @@ # parse key value store :set ParseKeyValueStore do={ :local Source $1; + + :if ([ :pick $Source 0 1 ] = "{") do={ + :do { + :return [ :deserialize from=json $Source ]; + } on-error={ } + } + :if ([ :typeof $Source ] != "array") do={ :set Source [ :tostr $1 ]; } From 3ada3055fff08e655864f4e8e07f060b73077394 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 30 Dec 2024 19:51:42 +0100 Subject: [PATCH 277/893] fw-addr-lists: spamhaus.org returned to 'ISRG Root X1' This reverts commit 4d8dce97691ad090091574a790449a7bd564023c. --- certs/Makefile | 2 +- global-config.rsc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/certs/Makefile b/certs/Makefile index 870cb54..9ce8dd4 100644 --- a/certs/Makefile +++ b/certs/Makefile @@ -22,7 +22,7 @@ DOMAINS = \ sslbl.abuse.ch/GlobalSign \ upgrade.mikrotik.com/ISRG-Root-X1 \ www.dshield.org/ISRG-Root-X1 \ - www.spamhaus.org/GTS-Root-R4 + www.spamhaus.org/ISRG-Root-X1 .PHONY: $(DOMAINS) diff --git a/global-config.rsc b/global-config.rsc index 0c8f738..cd41a9c 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -107,9 +107,9 @@ { url="https://lists.blocklist.de/lists/strongips.txt"; cert="Certum Trusted Network CA" }; # { url="https://www.spamhaus.org/drop/drop_v4.json"; -# cert="GTS Root R4" }; +# cert="ISRG Root X1" }; # { url="https://www.spamhaus.org/drop/drop_v6.json"; -# cert="GTS Root R4" }; +# cert="ISRG Root X1" }; }; # "mikrotik"={ # { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/mikrotik"; From 191cc1b952b469c474b0181ebdee0ccfd47ae75b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 30 Dec 2024 20:09:46 +0100 Subject: [PATCH 278/893] global-functions: $FetchHuge: another workaround for complete file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Turns out the workaround in $WaitForFile (commit 8231c3e833ee83a118f4d8395c097e6a9f312c2f) is not sufficient. It helps sometimes, but not always. Possibly depends on CPU speed and bandwidth of internet connection... Who knows!? 🤪 But! Reading the file goes beyond the known file size. That's suspicious and indicates this exact issue. So add a delay, and keep reading until sizes are equal. --- global-functions.rsc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 85818b4..a59eca1 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -479,9 +479,13 @@ :local FileSize [ /file/get $FileName size ]; :local Return ""; :local VarSize 0; - :while ($VarSize < $FileSize) do={ + :while ($VarSize != $FileSize) do={ :set Return ($Return . ([ /file/read offset=$VarSize chunk-size=32768 file=$FileName as-value ]->"data")); + :set FileSize [ /file/get $FileName size ]; :set VarSize [ :len $Return ]; + :if ($VarSize > $FileSize) do={ + :delay 100ms; + } } /file/remove $DirName; :return $Return; From b98b2457140701261b299af0a2d742bf6aa2b9bc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 30 Dec 2024 20:22:51 +0100 Subject: [PATCH 279/893] global-functions: $WaitForFile: drop the first workaround This reverts commit 8231c3e833ee83a118f4d8395c097e6a9f312c2f. Truned out this workaround was not sufficient, see the follow-up in commit 191cc1b952b469c474b0181ebdee0ccfd47ae75b for details. But possibly the second one does it on its own? Reverting this for a test run. --- global-functions.rsc | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index a59eca1..d5df5e7 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1591,16 +1591,6 @@ :delay $Delay; :set I ($I + 1); } - - :local File [ /file/find where name=$FileName ]; - :local SizeA 0; - :local SizeB 1; - :while ($SizeA < $SizeB) do={ - :set SizeA $SizeB; - :delay $Delay; - :set SizeB [ /file/get $File size ]; - } - :return true; } From 9e3729c27990a7ecbdc73694319b924ee00ba867 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 2 Jan 2025 00:04:06 +0100 Subject: [PATCH 280/893] update copyright for 2025 --- accesslist-duplicates.capsman.rsc | 2 +- accesslist-duplicates.local.rsc | 2 +- accesslist-duplicates.template.rsc | 2 +- accesslist-duplicates.wifi.rsc | 2 +- backup-cloud.rsc | 2 +- backup-email.rsc | 2 +- backup-partition.rsc | 2 +- backup-upload.rsc | 2 +- capsman-download-packages.capsman.rsc | 2 +- capsman-download-packages.template.rsc | 2 +- capsman-download-packages.wifi.rsc | 2 +- capsman-rolling-upgrade.capsman.rsc | 2 +- capsman-rolling-upgrade.template.rsc | 2 +- capsman-rolling-upgrade.wifi.rsc | 2 +- certificate-renew-issued.rsc | 2 +- check-certificates.rsc | 2 +- check-health.rsc | 2 +- check-lte-firmware-upgrade.rsc | 2 +- check-routeros-update.rsc | 2 +- collect-wireless-mac.capsman.rsc | 2 +- collect-wireless-mac.local.rsc | 2 +- collect-wireless-mac.template.rsc | 2 +- collect-wireless-mac.wifi.rsc | 2 +- daily-psk.capsman.rsc | 2 +- daily-psk.local.rsc | 2 +- daily-psk.template.rsc | 2 +- daily-psk.wifi.rsc | 2 +- dhcp-lease-comment.capsman.rsc | 2 +- dhcp-lease-comment.local.rsc | 2 +- dhcp-lease-comment.template.rsc | 2 +- dhcp-lease-comment.wifi.rsc | 2 +- dhcp-to-dns.rsc | 2 +- firmware-upgrade-reboot.rsc | 2 +- fw-addr-lists.rsc | 2 +- global-config-overlay.rsc | 2 +- global-config.rsc | 2 +- global-functions.rsc | 2 +- global-wait.rsc | 2 +- gps-track.rsc | 2 +- hotspot-to-wpa-cleanup.capsman.rsc | 2 +- hotspot-to-wpa-cleanup.template.rsc | 2 +- hotspot-to-wpa-cleanup.wifi.rsc | 2 +- hotspot-to-wpa.capsman.rsc | 2 +- hotspot-to-wpa.template.rsc | 2 +- hotspot-to-wpa.wifi.rsc | 2 +- ip-addr-bridge.rsc | 2 +- ipsec-to-dns.rsc | 2 +- ipv6-update.rsc | 2 +- lease-script.rsc | 2 +- leds-day-mode.rsc | 2 +- leds-night-mode.rsc | 2 +- leds-toggle-mode.rsc | 2 +- log-forward.rsc | 2 +- mod/bridge-port-to.rsc | 2 +- mod/bridge-port-vlan.rsc | 2 +- mod/inspectvar.rsc | 2 +- mod/ipcalc.rsc | 2 +- mod/notification-email.rsc | 2 +- mod/notification-matrix.rsc | 2 +- mod/notification-ntfy.rsc | 2 +- mod/notification-telegram.rsc | 2 +- mod/scriptrunonce.rsc | 2 +- mod/ssh-keys-import.rsc | 2 +- mode-button.rsc | 2 +- netwatch-dns.rsc | 2 +- netwatch-notify.rsc | 2 +- news-and-changes.rsc | 2 +- ospf-to-leds.rsc | 2 +- packages-update.rsc | 2 +- ppp-on-up.rsc | 2 +- sms-action.rsc | 2 +- sms-forward.rsc | 2 +- super-mario-theme.rsc | 2 +- telegram-chat.rsc | 2 +- unattended-lte-firmware-upgrade.rsc | 2 +- update-gre-address.rsc | 2 +- update-tunnelbroker.rsc | 2 +- 77 files changed, 77 insertions(+), 77 deletions(-) diff --git a/accesslist-duplicates.capsman.rsc b/accesslist-duplicates.capsman.rsc index ce0ce11..b611917 100644 --- a/accesslist-duplicates.capsman.rsc +++ b/accesslist-duplicates.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: accesslist-duplicates.capsman -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/accesslist-duplicates.local.rsc b/accesslist-duplicates.local.rsc index aa78fe8..ef0cf32 100644 --- a/accesslist-duplicates.local.rsc +++ b/accesslist-duplicates.local.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: accesslist-duplicates.local -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/accesslist-duplicates.template.rsc b/accesslist-duplicates.template.rsc index d0c282d..ab5b671 100644 --- a/accesslist-duplicates.template.rsc +++ b/accesslist-duplicates.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: accesslist-duplicates%TEMPL% -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/accesslist-duplicates.wifi.rsc b/accesslist-duplicates.wifi.rsc index b1444e3..0205598 100644 --- a/accesslist-duplicates.wifi.rsc +++ b/accesslist-duplicates.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: accesslist-duplicates.wifi -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/backup-cloud.rsc b/backup-cloud.rsc index 4cc7a58..37ca92f 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: backup-cloud -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: backup-script, order=40 diff --git a/backup-email.rsc b/backup-email.rsc index e1d44ea..489927b 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: backup-email -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: backup-script, order=20 diff --git a/backup-partition.rsc b/backup-partition.rsc index f1e1c17..b2b75ac 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: backup-partition -# Copyright (c) 2022-2024 Christian Hesse +# Copyright (c) 2022-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: backup-script, order=70 diff --git a/backup-upload.rsc b/backup-upload.rsc index 12698e9..e050140 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: backup-upload -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: backup-script, order=50 diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index 1802884..4609498 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: capsman-download-packages.capsman -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index 72edaa9..642a068 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: capsman-download-packages%TEMPL% -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 74a5d9d..1ea9b79 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: capsman-download-packages.wifi -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/capsman-rolling-upgrade.capsman.rsc b/capsman-rolling-upgrade.capsman.rsc index d0f9fb8..7a5ed81 100644 --- a/capsman-rolling-upgrade.capsman.rsc +++ b/capsman-rolling-upgrade.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: capsman-rolling-upgrade.capsman -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/capsman-rolling-upgrade.template.rsc b/capsman-rolling-upgrade.template.rsc index 1bd5f2a..fd7e31f 100644 --- a/capsman-rolling-upgrade.template.rsc +++ b/capsman-rolling-upgrade.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: capsman-rolling-upgrade%TEMPL% -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/capsman-rolling-upgrade.wifi.rsc b/capsman-rolling-upgrade.wifi.rsc index c9e6622..3fb99b8 100644 --- a/capsman-rolling-upgrade.wifi.rsc +++ b/capsman-rolling-upgrade.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: capsman-rolling-upgrade.wifi -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/certificate-renew-issued.rsc b/certificate-renew-issued.rsc index ce61f7d..32c3267 100644 --- a/certificate-renew-issued.rsc +++ b/certificate-renew-issued.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: certificate-renew-issued -# Copyright (c) 2019-2024 Christian Hesse +# Copyright (c) 2019-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/check-certificates.rsc b/check-certificates.rsc index 52cfc5e..226364b 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: check-certificates -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/check-health.rsc b/check-health.rsc index 495b450..d3586db 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: check-health -# Copyright (c) 2019-2024 Christian Hesse +# Copyright (c) 2019-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index 898d6f1..cd9f979 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: check-lte-firmware-upgrade -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index a2e39b6..c3d2625 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: check-routeros-update -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/collect-wireless-mac.capsman.rsc b/collect-wireless-mac.capsman.rsc index 77fd6e3..05e4b89 100644 --- a/collect-wireless-mac.capsman.rsc +++ b/collect-wireless-mac.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: collect-wireless-mac.capsman -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=40 diff --git a/collect-wireless-mac.local.rsc b/collect-wireless-mac.local.rsc index dc7be19..67c1a98 100644 --- a/collect-wireless-mac.local.rsc +++ b/collect-wireless-mac.local.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: collect-wireless-mac.local -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=40 diff --git a/collect-wireless-mac.template.rsc b/collect-wireless-mac.template.rsc index 34b1695..84a9667 100644 --- a/collect-wireless-mac.template.rsc +++ b/collect-wireless-mac.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: collect-wireless-mac%TEMPL% -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=40 diff --git a/collect-wireless-mac.wifi.rsc b/collect-wireless-mac.wifi.rsc index 23c93b0..fa4953b 100644 --- a/collect-wireless-mac.wifi.rsc +++ b/collect-wireless-mac.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: collect-wireless-mac.wifi -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=40 diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index 263f6e5..f41da29 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: daily-psk.capsman -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index f0757e1..2920cb5 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: daily-psk.local -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 7e36b5a..05c376e 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: daily-psk%TEMPL% -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index 293f0e4..4182ab8 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: daily-psk.wifi -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/dhcp-lease-comment.capsman.rsc b/dhcp-lease-comment.capsman.rsc index 5ac0009..947181b 100644 --- a/dhcp-lease-comment.capsman.rsc +++ b/dhcp-lease-comment.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: dhcp-lease-comment.capsman -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=60 diff --git a/dhcp-lease-comment.local.rsc b/dhcp-lease-comment.local.rsc index 1b74d93..27306dd 100644 --- a/dhcp-lease-comment.local.rsc +++ b/dhcp-lease-comment.local.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: dhcp-lease-comment.local -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=60 diff --git a/dhcp-lease-comment.template.rsc b/dhcp-lease-comment.template.rsc index 8f1ad47..8552b26 100644 --- a/dhcp-lease-comment.template.rsc +++ b/dhcp-lease-comment.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: dhcp-lease-comment%TEMPL% -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=60 diff --git a/dhcp-lease-comment.wifi.rsc b/dhcp-lease-comment.wifi.rsc index d3741c5..bf67bd0 100644 --- a/dhcp-lease-comment.wifi.rsc +++ b/dhcp-lease-comment.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: dhcp-lease-comment.wifi -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=60 diff --git a/dhcp-to-dns.rsc b/dhcp-to-dns.rsc index ad55c4d..1eb832a 100644 --- a/dhcp-to-dns.rsc +++ b/dhcp-to-dns.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: dhcp-to-dns -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=20 diff --git a/firmware-upgrade-reboot.rsc b/firmware-upgrade-reboot.rsc index 9655903..f9e557c 100644 --- a/firmware-upgrade-reboot.rsc +++ b/firmware-upgrade-reboot.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: firmware-upgrade-reboot -# Copyright (c) 2022-2024 Christian Hesse +# Copyright (c) 2022-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index a195c89..e98a610 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: fw-addr-lists -# Copyright (c) 2023-2024 Christian Hesse +# Copyright (c) 2023-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.16 diff --git a/global-config-overlay.rsc b/global-config-overlay.rsc index 9ffd90c..227ae5a 100644 --- a/global-config-overlay.rsc +++ b/global-config-overlay.rsc @@ -1,5 +1,5 @@ # Overlay for global configuration by RouterOS Scripts -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # global configuration, custom overlay diff --git a/global-config.rsc b/global-config.rsc index cd41a9c..1f4e9ca 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: global-config -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # global configuration diff --git a/global-functions.rsc b/global-functions.rsc index d5df5e7..a2dd279 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: global-functions -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/global-wait.rsc b/global-wait.rsc index f0631e2..529dbd7 100644 --- a/global-wait.rsc +++ b/global-wait.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: global-wait -# Copyright (c) 2020-2024 Christian Hesse +# Copyright (c) 2020-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/gps-track.rsc b/gps-track.rsc index c0ecac4..1bd976a 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: gps-track -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index 8a38213..1d27faf 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa-cleanup.capsman -# Copyright (c) 2021-2024 Christian Hesse +# Copyright (c) 2021-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=80 diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index e8d2dfb..f92dbe5 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa-cleanup%TEMPL% -# Copyright (c) 2021-2024 Christian Hesse +# Copyright (c) 2021-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=80 diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index e2ef1fd..cd21593 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa-cleanup.wifi -# Copyright (c) 2021-2024 Christian Hesse +# Copyright (c) 2021-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # provides: lease-script, order=80 diff --git a/hotspot-to-wpa.capsman.rsc b/hotspot-to-wpa.capsman.rsc index e57d327..d962ba7 100644 --- a/hotspot-to-wpa.capsman.rsc +++ b/hotspot-to-wpa.capsman.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa.capsman -# Copyright (c) 2019-2024 Christian Hesse +# Copyright (c) 2019-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/hotspot-to-wpa.template.rsc b/hotspot-to-wpa.template.rsc index efe37d0..3438be7 100644 --- a/hotspot-to-wpa.template.rsc +++ b/hotspot-to-wpa.template.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa%TEMPL% -# Copyright (c) 2019-2024 Christian Hesse +# Copyright (c) 2019-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/hotspot-to-wpa.wifi.rsc b/hotspot-to-wpa.wifi.rsc index 6242d04..a2bb3ca 100644 --- a/hotspot-to-wpa.wifi.rsc +++ b/hotspot-to-wpa.wifi.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa.wifi -# Copyright (c) 2019-2024 Christian Hesse +# Copyright (c) 2019-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/ip-addr-bridge.rsc b/ip-addr-bridge.rsc index 758cd46..00b45a3 100644 --- a/ip-addr-bridge.rsc +++ b/ip-addr-bridge.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: ip-addr-bridge -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # enable or disable ip addresses based on bridge port state diff --git a/ipsec-to-dns.rsc b/ipsec-to-dns.rsc index 47676ca..39b21d5 100644 --- a/ipsec-to-dns.rsc +++ b/ipsec-to-dns.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: ipsec-to-dns -# Copyright (c) 2021-2024 Christian Hesse +# Copyright (c) 2021-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/ipv6-update.rsc b/ipv6-update.rsc index ea1d444..a2fb831 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: ipv6-update -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/lease-script.rsc b/lease-script.rsc index 995c7e4..3d0fc72 100644 --- a/lease-script.rsc +++ b/lease-script.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: lease-script -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/leds-day-mode.rsc b/leds-day-mode.rsc index b7c6b5b..e0f08d6 100644 --- a/leds-day-mode.rsc +++ b/leds-day-mode.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: leds-day-mode -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # enable LEDs diff --git a/leds-night-mode.rsc b/leds-night-mode.rsc index fb7c7a2..1f50dfd 100644 --- a/leds-night-mode.rsc +++ b/leds-night-mode.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: leds-night-mode -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # disable LEDs diff --git a/leds-toggle-mode.rsc b/leds-toggle-mode.rsc index 07e12ae..55d5b82 100644 --- a/leds-toggle-mode.rsc +++ b/leds-toggle-mode.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: leds-toggle-mode -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # toggle LEDs mode diff --git a/log-forward.rsc b/log-forward.rsc index 8e660fc..8c2ebc0 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: log-forward -# Copyright (c) 2020-2024 Christian Hesse +# Copyright (c) 2020-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/mod/bridge-port-to.rsc b/mod/bridge-port-to.rsc index 9e7b911..ec6f612 100644 --- a/mod/bridge-port-to.rsc +++ b/mod/bridge-port-to.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/bridge-port-to -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/mod/bridge-port-vlan.rsc b/mod/bridge-port-vlan.rsc index 18fa2db..6221646 100644 --- a/mod/bridge-port-vlan.rsc +++ b/mod/bridge-port-vlan.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/bridge-port-vlan -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index 0209214..01724bb 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/inspectvar -# Copyright (c) 2020-2024 Christian Hesse +# Copyright (c) 2020-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/mod/ipcalc.rsc b/mod/ipcalc.rsc index 021cd30..69dec8b 100644 --- a/mod/ipcalc.rsc +++ b/mod/ipcalc.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/ipcalc -# Copyright (c) 2020-2024 Christian Hesse +# Copyright (c) 2020-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index a3291d9..6d700f5 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/notification-email -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 14f369d..aad8b42 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/notification-matrix -# Copyright (c) 2013-2024 Michael Gisbers +# Copyright (c) 2013-2025 Michael Gisbers # Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index f8351fd..53ba9b4 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/notification-ntfy -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 7d75b8b..f9700cf 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/notification-telegram -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index c8dcf26..7e01e72 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/scriptrunonece -# Copyright (c) 2020-2024 Christian Hesse +# Copyright (c) 2020-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index 583e827..ad3a81e 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mod/ssh-keys-import -# Copyright (c) 2020-2024 Christian Hesse +# Copyright (c) 2020-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.16 diff --git a/mode-button.rsc b/mode-button.rsc index 90fe80e..f8bd7b8 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: mode-button -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index a704c84..81f9d95 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: netwatch-dns -# Copyright (c) 2022-2024 Christian Hesse +# Copyright (c) 2022-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.16 diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index f1e87bd..e79977e 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: netwatch-notify -# Copyright (c) 2020-2024 Christian Hesse +# Copyright (c) 2020-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.15 diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 9ab811d..545a0c9 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -1,5 +1,5 @@ # News, changes and migration by RouterOS Scripts -# Copyright (c) 2019-2024 Christian Hesse +# Copyright (c) 2019-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md :global IDonate; diff --git a/ospf-to-leds.rsc b/ospf-to-leds.rsc index d96e763..3400e7f 100644 --- a/ospf-to-leds.rsc +++ b/ospf-to-leds.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: ospf-to-leds -# Copyright (c) 2020-2024 Christian Hesse +# Copyright (c) 2020-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/packages-update.rsc b/packages-update.rsc index 924a5d9..a79946d 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: packages-update -# Copyright (c) 2019-2024 Christian Hesse +# Copyright (c) 2019-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index 13b42c7..a776ce2 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: ppp-on-up -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/sms-action.rsc b/sms-action.rsc index fd3096c..f22a0bb 100644 --- a/sms-action.rsc +++ b/sms-action.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: sms-action -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/sms-forward.rsc b/sms-forward.rsc index 8334d5f..efebb75 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: sms-forward -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # Anatoly Bubenkov # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # diff --git a/super-mario-theme.rsc b/super-mario-theme.rsc index 63308b0..fc868c8 100644 --- a/super-mario-theme.rsc +++ b/super-mario-theme.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: super-mario-theme -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # play Super Mario theme diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 8589aab..eebb617 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: telegram-chat -# Copyright (c) 2023-2024 Christian Hesse +# Copyright (c) 2023-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.15 diff --git a/unattended-lte-firmware-upgrade.rsc b/unattended-lte-firmware-upgrade.rsc index 7ce4028..f1bc552 100644 --- a/unattended-lte-firmware-upgrade.rsc +++ b/unattended-lte-firmware-upgrade.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: unattended-lte-firmware-upgrade -# Copyright (c) 2018-2024 Christian Hesse +# Copyright (c) 2018-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # schedule unattended lte firmware upgrade diff --git a/update-gre-address.rsc b/update-gre-address.rsc index 87762d6..4ac311a 100644 --- a/update-gre-address.rsc +++ b/update-gre-address.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: update-gre-address -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # # requires RouterOS, version=7.14 diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index dd43c64..589544c 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -1,6 +1,6 @@ #!rsc by RouterOS # RouterOS script: update-tunnelbroker -# Copyright (c) 2013-2024 Christian Hesse +# Copyright (c) 2013-2025 Christian Hesse # Michael Gisbers # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # From db508ddcd1a4bb78af95e5d96a4f626173d29557 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 6 Jan 2025 09:30:05 +0100 Subject: [PATCH 281/893] backup-cloud: refuse when running from backup partition --- backup-cloud.rsc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index 37ca92f..f32a04d 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -38,6 +38,14 @@ :set ExitOK true; :error false; } + + :if ([ :len [ /system/scheduler/find where name="running-from-backup-partition" ] ] > 0) do={ + $LogPrint warning $ScriptName ("Running from backup partition, refusing to act."); + :set PackagesUpdateBackupFailure true; + :set ExitOK true; + :error false; + } + $WaitFullyConnected; :if ([ $ScriptFromTerminal $ScriptName ] = false && $BackupRandomDelay > 0) do={ From 303c39390068ebf0ab5cba3bbb967d6079fbdeb2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 6 Jan 2025 09:30:20 +0100 Subject: [PATCH 282/893] backup-email: refuse when running from backup partition --- backup-email.rsc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/backup-email.rsc b/backup-email.rsc index 489927b..731fb95 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -56,6 +56,14 @@ :set ExitOK true; :error false; } + + :if ([ :len [ /system/scheduler/find where name="running-from-backup-partition" ] ] > 0) do={ + $LogPrint warning $ScriptName ("Running from backup partition, refusing to act."); + :set PackagesUpdateBackupFailure true; + :set ExitOK true; + :error false; + } + $WaitFullyConnected; :if ([ $ScriptFromTerminal $ScriptName ] = false && $BackupRandomDelay > 0) do={ From 6c990079a6c6f92c748f98a5128e7438e05caefb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 6 Jan 2025 09:26:44 +0100 Subject: [PATCH 283/893] backup-partition: refuse when running from backup partition --- backup-partition.rsc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/backup-partition.rsc b/backup-partition.rsc index b2b75ac..2298225 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -47,6 +47,13 @@ :error false; } + :if ([ :len [ /system/scheduler/find where name="running-from-backup-partition" ] ] > 0) do={ + $LogPrint warning $ScriptName ("Running from backup partition, refusing to act."); + :set PackagesUpdateBackupFailure true; + :set ExitOK true; + :error false; + } + :if ([ :len [ /partitions/find ] ] < 2) do={ $LogPrint error $ScriptName ("Device does not have a fallback partition."); :set PackagesUpdateBackupFailure true; From d9693f4d5f783935cd2e47479889cc035b294934 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 6 Jan 2025 09:30:38 +0100 Subject: [PATCH 284/893] backup-upload: refuse when running from backup partition --- backup-upload.rsc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/backup-upload.rsc b/backup-upload.rsc index e050140..e035415 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -53,6 +53,14 @@ :set ExitOK true; :error false; } + + :if ([ :len [ /system/scheduler/find where name="running-from-backup-partition" ] ] > 0) do={ + $LogPrint warning $ScriptName ("Running from backup partition, refusing to act."); + :set PackagesUpdateBackupFailure true; + :set ExitOK true; + :error false; + } + $WaitFullyConnected; :if ([ $ScriptFromTerminal $ScriptName ] = false && $BackupRandomDelay > 0) do={ From 665516b33de8d4d58d18274e05a0180cf6978af0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 6 Jan 2025 09:30:59 +0100 Subject: [PATCH 285/893] check-routeros-update: refuse when running from backup partition --- check-routeros-update.rsc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index c3d2625..19abebf 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -51,6 +51,13 @@ :set ExitOK true; :error false; } + + :if ([ :len [ /system/scheduler/find where name="running-from-backup-partition" ] ] > 0) do={ + $LogPrint warning $ScriptName ("Running from backup partition, refusing to act."); + :set ExitOK true; + :error false; + } + $WaitFullyConnected; :if ([ :len [ /system/scheduler/find where name="_RebootForUpdate" ] ] > 0) do={ From ce2d090e998d51b92376f3470b829f598f3ce5bd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 6 Jan 2025 09:31:13 +0100 Subject: [PATCH 286/893] packages-update: refuse when running from backup partition --- packages-update.rsc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages-update.rsc b/packages-update.rsc index a79946d..7644219 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -50,6 +50,12 @@ :error false; } + :if ([ :len [ /system/scheduler/find where name="running-from-backup-partition" ] ] > 0) do={ + $LogPrint warning $ScriptName ("Running from backup partition, refusing to act."); + :set ExitOK true; + :error false; + } + :local Update [ /system/package/update/get ]; :if ([ :typeof ($Update->"latest-version") ] = "nothing") do={ From 98791f48fdb684f946fb94e8735b1073942cd731 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 9 Jan 2025 13:20:45 +0100 Subject: [PATCH 287/893] ppp-on-up: release only bound ipv6 dhcp clients --- ppp-on-up.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index a776ce2..ba9d0aa 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -28,7 +28,7 @@ :local IntName [ /interface/get $Interface name ]; $LogPrint info $ScriptName ("PPP interface " . $IntName . " is up."); - /ipv6/dhcp-client/release [ find where interface=$IntName !disabled ]; + /ipv6/dhcp-client/release [ find where interface=$IntName !disabled bound ]; :foreach Script in=[ /system/script/find where source~("\n# provides: ppp-on-up\r?\n") ] do={ :local ScriptName [ /system/script/get $Script name ]; From e8b1e19b284af74032e1edcbb08665752dbe508a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 22 Nov 2024 14:06:22 +0100 Subject: [PATCH 288/893] fw-addr-lists: spamhaus.org returned to 'GTS Root R4' --- certs/Makefile | 2 +- global-config.rsc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/certs/Makefile b/certs/Makefile index 9ce8dd4..870cb54 100644 --- a/certs/Makefile +++ b/certs/Makefile @@ -22,7 +22,7 @@ DOMAINS = \ sslbl.abuse.ch/GlobalSign \ upgrade.mikrotik.com/ISRG-Root-X1 \ www.dshield.org/ISRG-Root-X1 \ - www.spamhaus.org/ISRG-Root-X1 + www.spamhaus.org/GTS-Root-R4 .PHONY: $(DOMAINS) diff --git a/global-config.rsc b/global-config.rsc index 1f4e9ca..c63283d 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -107,9 +107,9 @@ { url="https://lists.blocklist.de/lists/strongips.txt"; cert="Certum Trusted Network CA" }; # { url="https://www.spamhaus.org/drop/drop_v4.json"; -# cert="ISRG Root X1" }; +# cert="GTS Root R4" }; # { url="https://www.spamhaus.org/drop/drop_v6.json"; -# cert="ISRG Root X1" }; +# cert="GTS Root R4" }; }; # "mikrotik"={ # { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/mikrotik"; From ccf17a438cd10f77f0f0c0cd83f6f6729b6479c7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 23 Jan 2025 23:07:38 +0100 Subject: [PATCH 289/893] global-config: download scripts from rsc.eworm.de MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently AI bots are crawling website all around the world. For a website hosting git content this adds a lot of extra load and traffic: The site has lots of sections, repositories have a lot of files, branches, tags, commit ids, etc... Multiply that and you have a nearly unlimited number of unique urls. The bots try to get each and every of these. To speed up the learing process on their side a swarm of hundreds, thousands or more ip addresses is active at the same time, ultimately DDOS'ing the websites, making it inaccessible. 😳🤬 Well, there is one single file all of these AI bots are not interested in: robots.txt 🤬🤬 On top some use random user agent strings, making filtering impossible. 🤬🤬🤬 For a short term sulution I deploy the repository content as static files, hopefully making these accessible at least. We will see. --- global-config.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/global-config.rsc b/global-config.rsc index c63283d..3e17320 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -217,14 +217,16 @@ :global GpsTrackUrl "https://example.com/index.php"; # This is the base url to fetch scripts from. -:global ScriptUpdatesBaseUrl "https://git.eworm.de/cgit/routeros-scripts/plain/"; +:global ScriptUpdatesBaseUrl "https://rsc.eworm.de/main/"; # alternative urls - main: stable code - next: currently in development +#:global ScriptUpdatesBaseUrl "https://rsc.eworm.de/next/"; +#:global ScriptUpdatesBaseUrl "https://git.eworm.de/cgit/routeros-scripts/plain/"; #:global ScriptUpdatesBaseUrl "https://raw.githubusercontent.com/eworm-de/routeros-scripts/main/"; #:global ScriptUpdatesBaseUrl "https://raw.githubusercontent.com/eworm-de/routeros-scripts/next/"; #:global ScriptUpdatesBaseUrl "https://gitlab.com/eworm-de/routeros-scripts/raw/main/"; #:global ScriptUpdatesBaseUrl "https://gitlab.com/eworm-de/routeros-scripts/raw/next/"; :global ScriptUpdatesUrlSuffix ""; -# use next branch with default url (git.eworm.de) +# use next branch with my git url (git.eworm.de) #:global ScriptUpdatesUrlSuffix "?h=next"; # Use this for defaults with $ScriptRunOnce From d4acc5aa59e30c5e430b553fb2142c7e7e004822 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 11:03:50 +0100 Subject: [PATCH 290/893] BRANCHES: adopt new default url --- BRANCHES.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BRANCHES.md b/BRANCHES.md index 2bacf8e..5d94077 100644 --- a/BRANCHES.md +++ b/BRANCHES.md @@ -22,13 +22,13 @@ for testing. To install a single script from `next` branch: - $ScriptInstallUpdate script-name "url-suffix=?h=next"; + $ScriptInstallUpdate script-name "base-url=https://rsc.eworm.de/next/"; ## Switch existing script Alternatively switch an existing script to update from `next` branch: - /system/script/set comment="url-suffix=?h=next" script-name; + /system/script/set comment="base-url=https://rsc.eworm.de/next/" script-name; $ScriptInstallUpdate; ## Switch installation @@ -36,7 +36,7 @@ Alternatively switch an existing script to update from `next` branch: Last but not least - to switch the complete installation to the `next` branch edit `global-config-overlay` and add: - :global ScriptUpdatesUrlSuffix "?h=next"; + :global ScriptUpdatesBaseUrl "https://rsc.eworm.de/next/"; ... then reload the configuration and update: From a446f31262118d59d6ec938a022b2f7d99fb5a70 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 23 Jan 2025 23:56:18 +0100 Subject: [PATCH 291/893] fw-addr-lists: use my static mirror --- global-config.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-config.rsc b/global-config.rsc index 3e17320..c8b2c2e 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -92,11 +92,11 @@ # This defines the settings for firewall address-lists (fw-addr-lists). :global FwAddrLists { # "allow"={ -# { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/allow"; +# { url="https://rsc.eworm.de/main/fw-addr-lists.d/allow"; # cert="ISRG Root X2"; timeout=1w }; # }; "block"={ -# { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/block"; +# { url="https://rsc.eworm.de/main/fw-addr-lists.d/block"; # cert="ISRG Root X2" }; { url="https://feodotracker.abuse.ch/downloads/ipblocklist_recommended.txt"; cert="GlobalSign" }; @@ -112,7 +112,7 @@ # cert="GTS Root R4" }; }; # "mikrotik"={ -# { url="https://git.eworm.de/cgit/routeros-scripts/plain/fw-addr-lists.d/mikrotik"; +# { url="https://rsc.eworm.de/main/fw-addr-lists.d/mikrotik"; # cert="ISRG Root X2"; timeout=1w }; # }; }; From 500054535c44f7682bf82712dc37e299299b09dd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:30:01 +0100 Subject: [PATCH 292/893] unattended-lte-firmware-upgrade: require RouterOS --- unattended-lte-firmware-upgrade.rsc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/unattended-lte-firmware-upgrade.rsc b/unattended-lte-firmware-upgrade.rsc index f1bc552..ea18edf 100644 --- a/unattended-lte-firmware-upgrade.rsc +++ b/unattended-lte-firmware-upgrade.rsc @@ -3,6 +3,8 @@ # Copyright (c) 2018-2025 Christian Hesse # https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md # +# requires RouterOS, version=7.14 +# # schedule unattended lte firmware upgrade # https://git.eworm.de/cgit/routeros-scripts/about/doc/unattended-lte-firmware-upgrade.md From 1dda59034e366c6cb6e2b78fa820ece1407f93e5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 293/893] accesslist-duplicates: use short url rsc.eworm.de --- accesslist-duplicates.capsman.rsc | 4 ++-- accesslist-duplicates.local.rsc | 4 ++-- accesslist-duplicates.template.rsc | 4 ++-- accesslist-duplicates.wifi.rsc | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/accesslist-duplicates.capsman.rsc b/accesslist-duplicates.capsman.rsc index b611917..0c4eaaf 100644 --- a/accesslist-duplicates.capsman.rsc +++ b/accesslist-duplicates.capsman.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: accesslist-duplicates.capsman # Copyright (c) 2018-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # print duplicate antries in wireless access list -# https://git.eworm.de/cgit/routeros-scripts/about/doc/accesslist-duplicates.md +# https://rsc.eworm.de/doc/accesslist-duplicates.md # # !! Do not edit this file, it is generated from template! diff --git a/accesslist-duplicates.local.rsc b/accesslist-duplicates.local.rsc index ef0cf32..353fe1f 100644 --- a/accesslist-duplicates.local.rsc +++ b/accesslist-duplicates.local.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: accesslist-duplicates.local # Copyright (c) 2018-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # print duplicate antries in wireless access list -# https://git.eworm.de/cgit/routeros-scripts/about/doc/accesslist-duplicates.md +# https://rsc.eworm.de/doc/accesslist-duplicates.md # # !! Do not edit this file, it is generated from template! diff --git a/accesslist-duplicates.template.rsc b/accesslist-duplicates.template.rsc index ab5b671..4219014 100644 --- a/accesslist-duplicates.template.rsc +++ b/accesslist-duplicates.template.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: accesslist-duplicates%TEMPL% # Copyright (c) 2018-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # print duplicate antries in wireless access list -# https://git.eworm.de/cgit/routeros-scripts/about/doc/accesslist-duplicates.md +# https://rsc.eworm.de/doc/accesslist-duplicates.md # # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. diff --git a/accesslist-duplicates.wifi.rsc b/accesslist-duplicates.wifi.rsc index 0205598..3ee53d8 100644 --- a/accesslist-duplicates.wifi.rsc +++ b/accesslist-duplicates.wifi.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: accesslist-duplicates.wifi # Copyright (c) 2018-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # print duplicate antries in wireless access list -# https://git.eworm.de/cgit/routeros-scripts/about/doc/accesslist-duplicates.md +# https://rsc.eworm.de/doc/accesslist-duplicates.md # # !! Do not edit this file, it is generated from template! From 5281b4ba02a721af189ad70244c95cb175c6af06 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 294/893] backup-cloud: use short url rsc.eworm.de --- backup-cloud.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index f32a04d..efae055 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: backup-cloud # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: backup-script, order=40 # requires RouterOS, version=7.14 # # upload backup to MikroTik cloud -# https://git.eworm.de/cgit/routeros-scripts/about/doc/backup-cloud.md +# https://rsc.eworm.de/doc/backup-cloud.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 08ff07d037d88e7aba7356ba0f744a4e92d597ea Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 295/893] backup-email: use short url rsc.eworm.de --- backup-email.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backup-email.rsc b/backup-email.rsc index 731fb95..f6ebad0 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: backup-email # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: backup-script, order=20 # requires RouterOS, version=7.14 # # create and email backup and config file -# https://git.eworm.de/cgit/routeros-scripts/about/doc/backup-email.md +# https://rsc.eworm.de/doc/backup-email.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From c70b6a8eb304641df205c1d18f12670d183a9385 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 296/893] backup-partition: use short url rsc.eworm.de --- backup-partition.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index 2298225..b8bf7b1 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: backup-partition # Copyright (c) 2022-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: backup-script, order=70 # requires RouterOS, version=7.14 # # save configuration to fallback partition -# https://git.eworm.de/cgit/routeros-scripts/about/doc/backup-partition.md +# https://rsc.eworm.de/doc/backup-partition.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 38b5fbab9cdc9fd755c04a2f7debd2d62ae05aab Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 297/893] backup-upload: use short url rsc.eworm.de --- backup-upload.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backup-upload.rsc b/backup-upload.rsc index e035415..011c502 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: backup-upload # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: backup-script, order=50 # requires RouterOS, version=7.14 # # create and upload backup and config file -# https://git.eworm.de/cgit/routeros-scripts/about/doc/backup-upload.md +# https://rsc.eworm.de/doc/backup-upload.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From b938847030e90c8c3b8decb55e6625aa2e537798 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 298/893] capsman-download-packages: use short url rsc.eworm.de --- capsman-download-packages.capsman.rsc | 4 ++-- capsman-download-packages.template.rsc | 4 ++-- capsman-download-packages.wifi.rsc | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index 4609498..fa76ff5 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -2,12 +2,12 @@ # RouterOS script: capsman-download-packages.capsman # Copyright (c) 2018-2025 Christian Hesse # Michael Gisbers -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # download and cleanup packages for CAP installation from CAPsMAN -# https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-download-packages.md +# https://rsc.eworm.de/doc/capsman-download-packages.md # # !! Do not edit this file, it is generated from template! diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index 642a068..912e279 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -2,12 +2,12 @@ # RouterOS script: capsman-download-packages%TEMPL% # Copyright (c) 2018-2025 Christian Hesse # Michael Gisbers -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # download and cleanup packages for CAP installation from CAPsMAN -# https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-download-packages.md +# https://rsc.eworm.de/doc/capsman-download-packages.md # # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 1ea9b79..3a5e7d1 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -2,12 +2,12 @@ # RouterOS script: capsman-download-packages.wifi # Copyright (c) 2018-2025 Christian Hesse # Michael Gisbers -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # download and cleanup packages for CAP installation from CAPsMAN -# https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-download-packages.md +# https://rsc.eworm.de/doc/capsman-download-packages.md # # !! Do not edit this file, it is generated from template! From 26dbf5805a83a2670e678ec93d02796f7c3233cd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 299/893] capsman-rolling-upgrade: use short url rsc.eworm.de --- capsman-rolling-upgrade.capsman.rsc | 4 ++-- capsman-rolling-upgrade.template.rsc | 4 ++-- capsman-rolling-upgrade.wifi.rsc | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/capsman-rolling-upgrade.capsman.rsc b/capsman-rolling-upgrade.capsman.rsc index 7a5ed81..abe066e 100644 --- a/capsman-rolling-upgrade.capsman.rsc +++ b/capsman-rolling-upgrade.capsman.rsc @@ -2,13 +2,13 @@ # RouterOS script: capsman-rolling-upgrade.capsman # Copyright (c) 2018-2025 Christian Hesse # Michael Gisbers -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: capsman-rolling-upgrade.capsman # requires RouterOS, version=7.14 # # upgrade CAPs one after another -# https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-rolling-upgrade.md +# https://rsc.eworm.de/doc/capsman-rolling-upgrade.md # # !! Do not edit this file, it is generated from template! diff --git a/capsman-rolling-upgrade.template.rsc b/capsman-rolling-upgrade.template.rsc index fd7e31f..c1c7ff1 100644 --- a/capsman-rolling-upgrade.template.rsc +++ b/capsman-rolling-upgrade.template.rsc @@ -2,13 +2,13 @@ # RouterOS script: capsman-rolling-upgrade%TEMPL% # Copyright (c) 2018-2025 Christian Hesse # Michael Gisbers -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: capsman-rolling-upgrade%TEMPL% # requires RouterOS, version=7.14 # # upgrade CAPs one after another -# https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-rolling-upgrade.md +# https://rsc.eworm.de/doc/capsman-rolling-upgrade.md # # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. diff --git a/capsman-rolling-upgrade.wifi.rsc b/capsman-rolling-upgrade.wifi.rsc index 3fb99b8..44c99db 100644 --- a/capsman-rolling-upgrade.wifi.rsc +++ b/capsman-rolling-upgrade.wifi.rsc @@ -2,13 +2,13 @@ # RouterOS script: capsman-rolling-upgrade.wifi # Copyright (c) 2018-2025 Christian Hesse # Michael Gisbers -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: capsman-rolling-upgrade.wifi # requires RouterOS, version=7.14 # # upgrade CAPs one after another -# https://git.eworm.de/cgit/routeros-scripts/about/doc/capsman-rolling-upgrade.md +# https://rsc.eworm.de/doc/capsman-rolling-upgrade.md # # !! Do not edit this file, it is generated from template! From 1b7458ac955dc32ea12f19a779c985f27e0c6a28 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 300/893] certificate-renew-issued: use short url rsc.eworm.de --- certificate-renew-issued.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/certificate-renew-issued.rsc b/certificate-renew-issued.rsc index 32c3267..5a4043d 100644 --- a/certificate-renew-issued.rsc +++ b/certificate-renew-issued.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: certificate-renew-issued # Copyright (c) 2019-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # renew locally issued certificates -# https://git.eworm.de/cgit/routeros-scripts/about/doc/certificate-renew-issued.md +# https://rsc.eworm.de/doc/certificate-renew-issued.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 1239ac31044270036a8204cd7856776d8faee06e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 301/893] check-certificates: use short url rsc.eworm.de --- check-certificates.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 226364b..02e3e52 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: check-certificates # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # check for certificate validity -# https://git.eworm.de/cgit/routeros-scripts/about/doc/check-certificates.md +# https://rsc.eworm.de/doc/check-certificates.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 231be730aea0bad7a914c387a719d7c46ecbb468 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 302/893] check-health: use short url rsc.eworm.de --- check-health.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/check-health.rsc b/check-health.rsc index d3586db..31bd6c2 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: check-health # Copyright (c) 2019-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # check for RouterOS health state -# https://git.eworm.de/cgit/routeros-scripts/about/doc/check-health.md +# https://rsc.eworm.de/doc/check-health.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 7484663b92062ae6c120227de22d387df93123ad Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 303/893] check-lte-firmware-upgrade: use short url rsc.eworm.de --- check-lte-firmware-upgrade.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index cd9f979..562b8fe 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: check-lte-firmware-upgrade # Copyright (c) 2018-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # check for LTE firmware upgrade, send notification -# https://git.eworm.de/cgit/routeros-scripts/about/doc/check-lte-firmware-upgrade.md +# https://rsc.eworm.de/doc/check-lte-firmware-upgrade.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 36c87c91ea9b4bc5ef1153733d38e52ad0e3e291 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 304/893] check-routeros-update: use short url rsc.eworm.de --- check-routeros-update.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 19abebf..9486d6c 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: check-routeros-update # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # check for RouterOS update, send notification and/or install -# https://git.eworm.de/cgit/routeros-scripts/about/doc/check-routeros-update.md +# https://rsc.eworm.de/doc/check-routeros-update.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From f8058eaf71c54fb722fb65c5e87c9f448927a36e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 305/893] collect-wireless-mac: use short url rsc.eworm.de --- collect-wireless-mac.capsman.rsc | 4 ++-- collect-wireless-mac.local.rsc | 4 ++-- collect-wireless-mac.template.rsc | 4 ++-- collect-wireless-mac.wifi.rsc | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/collect-wireless-mac.capsman.rsc b/collect-wireless-mac.capsman.rsc index 05e4b89..f718e0b 100644 --- a/collect-wireless-mac.capsman.rsc +++ b/collect-wireless-mac.capsman.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: collect-wireless-mac.capsman # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=40 # requires RouterOS, version=7.14 # # collect wireless mac adresses in access list -# https://git.eworm.de/cgit/routeros-scripts/about/doc/collect-wireless-mac.md +# https://rsc.eworm.de/doc/collect-wireless-mac.md # # !! Do not edit this file, it is generated from template! diff --git a/collect-wireless-mac.local.rsc b/collect-wireless-mac.local.rsc index 67c1a98..0017875 100644 --- a/collect-wireless-mac.local.rsc +++ b/collect-wireless-mac.local.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: collect-wireless-mac.local # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=40 # requires RouterOS, version=7.14 # # collect wireless mac adresses in access list -# https://git.eworm.de/cgit/routeros-scripts/about/doc/collect-wireless-mac.md +# https://rsc.eworm.de/doc/collect-wireless-mac.md # # !! Do not edit this file, it is generated from template! diff --git a/collect-wireless-mac.template.rsc b/collect-wireless-mac.template.rsc index 84a9667..527e985 100644 --- a/collect-wireless-mac.template.rsc +++ b/collect-wireless-mac.template.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: collect-wireless-mac%TEMPL% # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=40 # requires RouterOS, version=7.14 # # collect wireless mac adresses in access list -# https://git.eworm.de/cgit/routeros-scripts/about/doc/collect-wireless-mac.md +# https://rsc.eworm.de/doc/collect-wireless-mac.md # # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. diff --git a/collect-wireless-mac.wifi.rsc b/collect-wireless-mac.wifi.rsc index fa4953b..5f9de7d 100644 --- a/collect-wireless-mac.wifi.rsc +++ b/collect-wireless-mac.wifi.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: collect-wireless-mac.wifi # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=40 # requires RouterOS, version=7.14 # # collect wireless mac adresses in access list -# https://git.eworm.de/cgit/routeros-scripts/about/doc/collect-wireless-mac.md +# https://rsc.eworm.de/doc/collect-wireless-mac.md # # !! Do not edit this file, it is generated from template! From 96fa76f07dfe86d31f32c90e969cb824d727280a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 306/893] daily-psk.template: use short url rsc.eworm.de --- daily-psk.capsman.rsc | 4 ++-- daily-psk.local.rsc | 4 ++-- daily-psk.template.rsc | 4 ++-- daily-psk.wifi.rsc | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index f41da29..5672931 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -2,12 +2,12 @@ # RouterOS script: daily-psk.capsman # Copyright (c) 2013-2025 Christian Hesse # Michael Gisbers -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 # # update daily PSK (pre shared key) -# https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md +# https://rsc.eworm.de/doc/daily-psk.md # # !! Do not edit this file, it is generated from template! diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index 2920cb5..9dea469 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -2,12 +2,12 @@ # RouterOS script: daily-psk.local # Copyright (c) 2013-2025 Christian Hesse # Michael Gisbers -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 # # update daily PSK (pre shared key) -# https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md +# https://rsc.eworm.de/doc/daily-psk.md # # !! Do not edit this file, it is generated from template! diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 05c376e..8202eeb 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -2,12 +2,12 @@ # RouterOS script: daily-psk%TEMPL% # Copyright (c) 2013-2025 Christian Hesse # Michael Gisbers -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 # # update daily PSK (pre shared key) -# https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md +# https://rsc.eworm.de/doc/daily-psk.md # # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index 4182ab8..3de3c5b 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -2,12 +2,12 @@ # RouterOS script: daily-psk.wifi # Copyright (c) 2013-2025 Christian Hesse # Michael Gisbers -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 # # update daily PSK (pre shared key) -# https://git.eworm.de/cgit/routeros-scripts/about/doc/daily-psk.md +# https://rsc.eworm.de/doc/daily-psk.md # # !! Do not edit this file, it is generated from template! From 61dee2177634b6e464aab4b644eb686f914cb365 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 307/893] dhcp-lease-comment: use short url rsc.eworm.de --- dhcp-lease-comment.capsman.rsc | 4 ++-- dhcp-lease-comment.local.rsc | 4 ++-- dhcp-lease-comment.template.rsc | 4 ++-- dhcp-lease-comment.wifi.rsc | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/dhcp-lease-comment.capsman.rsc b/dhcp-lease-comment.capsman.rsc index 947181b..3803963 100644 --- a/dhcp-lease-comment.capsman.rsc +++ b/dhcp-lease-comment.capsman.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: dhcp-lease-comment.capsman # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=60 # requires RouterOS, version=7.14 # # update dhcp-server lease comment with infos from access-list -# https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-lease-comment.md +# https://rsc.eworm.de/doc/dhcp-lease-comment.md # # !! Do not edit this file, it is generated from template! diff --git a/dhcp-lease-comment.local.rsc b/dhcp-lease-comment.local.rsc index 27306dd..d5f1461 100644 --- a/dhcp-lease-comment.local.rsc +++ b/dhcp-lease-comment.local.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: dhcp-lease-comment.local # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=60 # requires RouterOS, version=7.14 # # update dhcp-server lease comment with infos from access-list -# https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-lease-comment.md +# https://rsc.eworm.de/doc/dhcp-lease-comment.md # # !! Do not edit this file, it is generated from template! diff --git a/dhcp-lease-comment.template.rsc b/dhcp-lease-comment.template.rsc index 8552b26..2bddc26 100644 --- a/dhcp-lease-comment.template.rsc +++ b/dhcp-lease-comment.template.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: dhcp-lease-comment%TEMPL% # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=60 # requires RouterOS, version=7.14 # # update dhcp-server lease comment with infos from access-list -# https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-lease-comment.md +# https://rsc.eworm.de/doc/dhcp-lease-comment.md # # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. diff --git a/dhcp-lease-comment.wifi.rsc b/dhcp-lease-comment.wifi.rsc index bf67bd0..515b438 100644 --- a/dhcp-lease-comment.wifi.rsc +++ b/dhcp-lease-comment.wifi.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: dhcp-lease-comment.wifi # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=60 # requires RouterOS, version=7.14 # # update dhcp-server lease comment with infos from access-list -# https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-lease-comment.md +# https://rsc.eworm.de/doc/dhcp-lease-comment.md # # !! Do not edit this file, it is generated from template! From 632d294a988188eb9ea182316d28411b8c281ed2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 308/893] dhcp-to-dns: use short url rsc.eworm.de --- dhcp-to-dns.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dhcp-to-dns.rsc b/dhcp-to-dns.rsc index 1eb832a..9b94098 100644 --- a/dhcp-to-dns.rsc +++ b/dhcp-to-dns.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: dhcp-to-dns # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=20 # requires RouterOS, version=7.16 # # check DHCP leases and add/remove/update DNS entries -# https://git.eworm.de/cgit/routeros-scripts/about/doc/dhcp-to-dns.md +# https://rsc.eworm.de/doc/dhcp-to-dns.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 7b760d9fa408b12ef00328266c77707f835f0600 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 309/893] firmware-upgrade-reboot: use short url rsc.eworm.de --- firmware-upgrade-reboot.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/firmware-upgrade-reboot.rsc b/firmware-upgrade-reboot.rsc index f9e557c..e3d62de 100644 --- a/firmware-upgrade-reboot.rsc +++ b/firmware-upgrade-reboot.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: firmware-upgrade-reboot # Copyright (c) 2022-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # install firmware upgrade, and reboot -# https://git.eworm.de/cgit/routeros-scripts/about/doc/firmware-upgrade-reboot.md +# https://rsc.eworm.de/doc/firmware-upgrade-reboot.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 39c5aeda13e107f1dd91fc632cab536befeca6eb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 310/893] fw-addr-lists: use short url rsc.eworm.de --- fw-addr-lists.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index e98a610..d41dc04 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: fw-addr-lists # Copyright (c) 2023-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.16 # # download, import and update firewall address-lists -# https://git.eworm.de/cgit/routeros-scripts/about/doc/fw-addr-lists.md +# https://rsc.eworm.de/doc/fw-addr-lists.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From ac62b8f24fc72aefbb9994abac3baa07bd3cfa93 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 311/893] global-config-overlay: use short url rsc.eworm.de --- global-config-overlay.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-config-overlay.rsc b/global-config-overlay.rsc index 227ae5a..9afaceb 100644 --- a/global-config-overlay.rsc +++ b/global-config-overlay.rsc @@ -1,12 +1,12 @@ # Overlay for global configuration by RouterOS Scripts # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # global configuration, custom overlay -# https://git.eworm.de/cgit/routeros-scripts/about/#editing-configuration +# https://rsc.eworm.de/#editing-configuration # Copy relevant configuration from global-config, paste and modify it here. -# https://git.eworm.de/cgit/routeros-scripts/about/global-config.rsc +# https://rsc.eworm.de/global-config.rsc # End of global-config-overlay From b7923485bdac90458321989eda261517afc4986e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 312/893] global-config: use short url rsc.eworm.de --- global-config.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-config.rsc b/global-config.rsc index c8b2c2e..df26ef9 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -1,10 +1,10 @@ #!rsc by RouterOS # RouterOS script: global-config # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # global configuration -# https://git.eworm.de/cgit/routeros-scripts/about/ +# https://rsc.eworm.de/ # Set this to 'true' to disable news and change notifications. :global NoNewsAndChangesNotification false; @@ -238,7 +238,7 @@ # This project is developed in private spare time and usage is free of charge # for you. If you like the scripts and think this is of value for you or your # business please consider a donation: -# https://git.eworm.de/cgit/routeros-scripts/about/#donate +# https://rsc.eworm.de/#donate # Enable this to silence donation hint. :global IDonate false; From 7be415d0ed8238564608c47b251f21f25e6f1d43 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 313/893] global-functions: use short url rsc.eworm.de --- global-functions.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index a2dd279..d5ac31c 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -2,12 +2,12 @@ # RouterOS script: global-functions # Copyright (c) 2013-2025 Christian Hesse # Michael Gisbers -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # global functions -# https://git.eworm.de/cgit/routeros-scripts/about/ +# https://rsc.eworm.de/ :local ScriptName [ :jobname ]; From 0431b02324877ae8585eb31effd789747f2aaf96 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 314/893] global-wait: use short url rsc.eworm.de --- global-wait.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global-wait.rsc b/global-wait.rsc index 529dbd7..bc98462 100644 --- a/global-wait.rsc +++ b/global-wait.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: global-wait # Copyright (c) 2020-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # wait for global-functions to finish -# https://git.eworm.de/cgit/routeros-scripts/about/doc/global-wait.md +# https://rsc.eworm.de/doc/global-wait.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 72db13c0ab7bc2ba71400bb74976391d7a78e925 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 315/893] gps-track: use short url rsc.eworm.de --- gps-track.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gps-track.rsc b/gps-track.rsc index 1bd976a..08873de 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: gps-track # Copyright (c) 2018-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # track gps data by sending json data to http server -# https://git.eworm.de/cgit/routeros-scripts/about/doc/gps-track.md +# https://rsc.eworm.de/doc/gps-track.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 996602bfe9f0363edae13c51604c23f46546ac49 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 316/893] hotspot-to-wpa-cleanup: use short url rsc.eworm.de --- hotspot-to-wpa-cleanup.capsman.rsc | 4 ++-- hotspot-to-wpa-cleanup.template.rsc | 4 ++-- hotspot-to-wpa-cleanup.wifi.rsc | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index 1d27faf..fde36f9 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa-cleanup.capsman # Copyright (c) 2021-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=80 # requires RouterOS, version=7.14 # # manage and clean up private WPA passphrase after hotspot login -# https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md +# https://rsc.eworm.de/doc/hotspot-to-wpa.md # # !! Do not edit this file, it is generated from template! diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index f92dbe5..3ddcbe0 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa-cleanup%TEMPL% # Copyright (c) 2021-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=80 # requires RouterOS, version=7.14 # # manage and clean up private WPA passphrase after hotspot login -# https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md +# https://rsc.eworm.de/doc/hotspot-to-wpa.md # # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index cd21593..034530b 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa-cleanup.wifi # Copyright (c) 2021-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=80 # requires RouterOS, version=7.14 # # manage and clean up private WPA passphrase after hotspot login -# https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md +# https://rsc.eworm.de/doc/hotspot-to-wpa.md # # !! Do not edit this file, it is generated from template! From 9474102c62b4e9d36f908e40e14031da5a6fc116 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 317/893] hotspot-to-wpa: use short url rsc.eworm.de --- hotspot-to-wpa.capsman.rsc | 4 ++-- hotspot-to-wpa.template.rsc | 4 ++-- hotspot-to-wpa.wifi.rsc | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/hotspot-to-wpa.capsman.rsc b/hotspot-to-wpa.capsman.rsc index d962ba7..1c77de9 100644 --- a/hotspot-to-wpa.capsman.rsc +++ b/hotspot-to-wpa.capsman.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa.capsman # Copyright (c) 2019-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # add private WPA passphrase after hotspot login -# https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md +# https://rsc.eworm.de/doc/hotspot-to-wpa.md # # !! Do not edit this file, it is generated from template! diff --git a/hotspot-to-wpa.template.rsc b/hotspot-to-wpa.template.rsc index 3438be7..d8cd261 100644 --- a/hotspot-to-wpa.template.rsc +++ b/hotspot-to-wpa.template.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa%TEMPL% # Copyright (c) 2019-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # add private WPA passphrase after hotspot login -# https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md +# https://rsc.eworm.de/doc/hotspot-to-wpa.md # # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. diff --git a/hotspot-to-wpa.wifi.rsc b/hotspot-to-wpa.wifi.rsc index a2bb3ca..345087d 100644 --- a/hotspot-to-wpa.wifi.rsc +++ b/hotspot-to-wpa.wifi.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: hotspot-to-wpa.wifi # Copyright (c) 2019-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # add private WPA passphrase after hotspot login -# https://git.eworm.de/cgit/routeros-scripts/about/doc/hotspot-to-wpa.md +# https://rsc.eworm.de/doc/hotspot-to-wpa.md # # !! Do not edit this file, it is generated from template! From 453d80a121f7e92602466490b77b7d47ba3ef251 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 318/893] ip-addr-bridge: use short url rsc.eworm.de --- ip-addr-bridge.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ip-addr-bridge.rsc b/ip-addr-bridge.rsc index 00b45a3..68ff4a4 100644 --- a/ip-addr-bridge.rsc +++ b/ip-addr-bridge.rsc @@ -1,10 +1,10 @@ #!rsc by RouterOS # RouterOS script: ip-addr-bridge # Copyright (c) 2018-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # enable or disable ip addresses based on bridge port state -# https://git.eworm.de/cgit/routeros-scripts/about/doc/ip-addr-bridge.md +# https://rsc.eworm.de/doc/ip-addr-bridge.md :foreach Bridge in=[ /interface/bridge/find ] do={ :local BrName [ /interface/bridge/get $Bridge name ]; From 02cc581aff6c6a4191620450e5607c74aeaca203 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 319/893] ipsec-to-dns: use short url rsc.eworm.de --- ipsec-to-dns.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ipsec-to-dns.rsc b/ipsec-to-dns.rsc index 39b21d5..1af5809 100644 --- a/ipsec-to-dns.rsc +++ b/ipsec-to-dns.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: ipsec-to-dns # Copyright (c) 2021-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # and add/remove/update DNS entries from IPSec mode-config -# https://git.eworm.de/cgit/routeros-scripts/about/doc/ipsec-to-dns.md +# https://rsc.eworm.de/doc/ipsec-to-dns.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 71316f7377987124858d74a9f5f741a133047dec Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 320/893] ipv6-update: use short url rsc.eworm.de --- ipv6-update.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ipv6-update.rsc b/ipv6-update.rsc index a2fb831..7eb625b 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: ipv6-update # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # update firewall and dns settings on IPv6 prefix change -# https://git.eworm.de/cgit/routeros-scripts/about/doc/ipv6-update.md +# https://rsc.eworm.de/doc/ipv6-update.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 5ead61cb6269ab5f2e6c145a4736765d938f6305 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 321/893] lease-script: use short url rsc.eworm.de --- lease-script.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lease-script.rsc b/lease-script.rsc index 3d0fc72..b6ceac9 100644 --- a/lease-script.rsc +++ b/lease-script.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: lease-script # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # run scripts on DHCP lease -# https://git.eworm.de/cgit/routeros-scripts/about/doc/lease-script.md +# https://rsc.eworm.de/doc/lease-script.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 5e60d2e1b7d1973a18737042e94d3e0ba262db14 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 322/893] leds-day-mode: use short url rsc.eworm.de --- leds-day-mode.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/leds-day-mode.rsc b/leds-day-mode.rsc index e0f08d6..7344fde 100644 --- a/leds-day-mode.rsc +++ b/leds-day-mode.rsc @@ -1,9 +1,9 @@ #!rsc by RouterOS # RouterOS script: leds-day-mode # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # enable LEDs -# https://git.eworm.de/cgit/routeros-scripts/about/doc/leds-mode.md +# https://rsc.eworm.de/doc/leds-mode.md /system/leds/settings/set all-leds-off=never; From bf11489d11058562a1a10b883dbdb1d06f8c1a8e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 323/893] leds-night-mode: use short url rsc.eworm.de --- leds-night-mode.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/leds-night-mode.rsc b/leds-night-mode.rsc index 1f50dfd..8bd028e 100644 --- a/leds-night-mode.rsc +++ b/leds-night-mode.rsc @@ -1,9 +1,9 @@ #!rsc by RouterOS # RouterOS script: leds-night-mode # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # disable LEDs -# https://git.eworm.de/cgit/routeros-scripts/about/doc/leds-mode.md +# https://rsc.eworm.de/doc/leds-mode.md /system/leds/settings/set all-leds-off=immediate; From b75a35417a4dc0793515275bdee8443248f5762c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 324/893] leds-toggle-mode: use short url rsc.eworm.de --- leds-toggle-mode.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/leds-toggle-mode.rsc b/leds-toggle-mode.rsc index 55d5b82..b55e351 100644 --- a/leds-toggle-mode.rsc +++ b/leds-toggle-mode.rsc @@ -1,9 +1,9 @@ #!rsc by RouterOS # RouterOS script: leds-toggle-mode # Copyright (c) 2018-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # toggle LEDs mode -# https://git.eworm.de/cgit/routeros-scripts/about/doc/leds-mode.md +# https://rsc.eworm.de/doc/leds-mode.md /system/leds/settings/set all-leds-off=(({ "never"="immediate"; "immediate"="never" })->[ get all-leds-off ]); From b8841a71356c6e25870913183d10ef9a8732a42d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 325/893] log-forward: use short url rsc.eworm.de --- log-forward.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/log-forward.rsc b/log-forward.rsc index 8c2ebc0..379fa54 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: log-forward # Copyright (c) 2020-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # forward log messages via notification -# https://git.eworm.de/cgit/routeros-scripts/about/doc/log-forward.md +# https://rsc.eworm.de/doc/log-forward.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 6920842d1584a7c8b3a7208c1230a373d2932a8d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 326/893] mod/bridge-port-to: use short url rsc.eworm.de --- mod/bridge-port-to.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/bridge-port-to.rsc b/mod/bridge-port-to.rsc index ec6f612..f00e10b 100644 --- a/mod/bridge-port-to.rsc +++ b/mod/bridge-port-to.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: mod/bridge-port-to # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # reset bridge ports to default bridge -# https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/bridge-port-to.md +# https://rsc.eworm.de/doc/mod/bridge-port-to.md :global BridgePortTo; From d5a50d824f0343a70e1945127b42dde719d761d2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 327/893] mod/bridge-port-vlan: use short url rsc.eworm.de --- mod/bridge-port-vlan.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/bridge-port-vlan.rsc b/mod/bridge-port-vlan.rsc index 6221646..62e71e3 100644 --- a/mod/bridge-port-vlan.rsc +++ b/mod/bridge-port-vlan.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: mod/bridge-port-vlan # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # manage VLANs on bridge ports -# https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/bridge-port-vlan.md +# https://rsc.eworm.de/doc/mod/bridge-port-vlan.md :global BridgePortVlan; From 18fcecd21126b72c9ba1aef4375450bb8751feb3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 328/893] mode-button: use short url rsc.eworm.de --- mode-button.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mode-button.rsc b/mode-button.rsc index f8bd7b8..9339f1c 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: mode-button # Copyright (c) 2018-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # act on multiple mode and reset button presses -# https://git.eworm.de/cgit/routeros-scripts/about/doc/mode-button.md +# https://rsc.eworm.de/doc/mode-button.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 078d5368fbfa195d1e6584b3789cfb3078babad7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 329/893] mod/inspectvar: use short url rsc.eworm.de --- mod/inspectvar.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index 01724bb..0f05da7 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: mod/inspectvar # Copyright (c) 2020-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # inspect variables -# https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/inspectvar.md +# https://rsc.eworm.de/doc/mod/inspectvar.md :global InspectVar; :global InspectVarReturn; From 828f68be3c85a43e28884546f74dab3aca403eb9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 330/893] mod/ipcalc: use short url rsc.eworm.de --- mod/ipcalc.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/ipcalc.rsc b/mod/ipcalc.rsc index 69dec8b..fbed74b 100644 --- a/mod/ipcalc.rsc +++ b/mod/ipcalc.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: mod/ipcalc # Copyright (c) 2020-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # ip address calculation -# https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/ipcalc.md +# https://rsc.eworm.de/doc/mod/ipcalc.md :global IPCalc; :global IPCalcReturn; From 631f63836b6b758c4ff3816ffdd5c76d95d31961 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 331/893] mod/notification-email: use short url rsc.eworm.de --- mod/notification-email.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index 6d700f5..ca23550 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: mod/notification-email # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # send notifications via e-mail -# https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/notification-email.md +# https://rsc.eworm.de/doc/mod/notification-email.md :global EMailGenerateFrom; :global FlushEmailQueue; From 6567a94a4f4e263308a0b01663448179e6554821 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 332/893] mod/notification-matrix: use short url rsc.eworm.de --- mod/notification-matrix.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index aad8b42..aee231d 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -2,12 +2,12 @@ # RouterOS script: mod/notification-matrix # Copyright (c) 2013-2025 Michael Gisbers # Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # send notifications via Matrix -# https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/notification-matrix.md +# https://rsc.eworm.de/doc/mod/notification-matrix.md :global FlushMatrixQueue; :global NotificationFunctions; From 6e7f311269a1694dbc243eb60a363f1db4d89cd8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 333/893] mod/notification-ntfy: use short url rsc.eworm.de --- mod/notification-ntfy.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 53ba9b4..df252bb 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: mod/notification-ntfy # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # send notifications via Ntfy (ntfy.sh) -# https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/notification-ntfy.md +# https://rsc.eworm.de/doc/mod/notification-ntfy.md :global FlushNtfyQueue; :global NotificationFunctions; From 27144a428a03241a7e67859bfa6acfc37e62f6dc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 334/893] mod/notification-telegram: use short url rsc.eworm.de --- mod/notification-telegram.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index f9700cf..a20367c 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: mod/notification-telegram # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # send notifications via Telegram -# https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/notification-telegram.md +# https://rsc.eworm.de/doc/mod/notification-telegram.md :global FlushTelegramQueue; :global NotificationFunctions; From 66ab2a85114165ca2b5f4f5a6e221eed4c560b45 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 335/893] mod/scriptrunonce: use short url rsc.eworm.de --- mod/scriptrunonce.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index 7e01e72..cae2b05 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: mod/scriptrunonece # Copyright (c) 2020-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # download script and run it once -# https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/scriptrunonce.md +# https://rsc.eworm.de/doc/mod/scriptrunonce.md :global ScriptRunOnce; From ed184445783921343498f4f3589df858b2754cbd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 336/893] mod/ssh-keys-import: use short url rsc.eworm.de --- mod/ssh-keys-import.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index ad3a81e..35aa7ec 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: mod/ssh-keys-import # Copyright (c) 2020-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.16 # # import ssh keys for public key authentication -# https://git.eworm.de/cgit/routeros-scripts/about/doc/mod/ssh-keys-import.md +# https://rsc.eworm.de/doc/mod/ssh-keys-import.md :global SSHKeysImport; :global SSHKeysImportFile; From 299b34883ff508291dfa4acf04118695223c0cd3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 337/893] netwatch-dns: use short url rsc.eworm.de --- netwatch-dns.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 81f9d95..e05c3ac 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: netwatch-dns # Copyright (c) 2022-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.16 # # monitor and manage dns/doh with netwatch -# https://git.eworm.de/cgit/routeros-scripts/about/doc/netwatch-dns.md +# https://rsc.eworm.de/doc/netwatch-dns.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 563aeb8f71da109060961a16541f56c7dc019e2b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 338/893] netwatch-notify: use short url rsc.eworm.de --- netwatch-notify.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index e79977e..8b05c5e 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: netwatch-notify # Copyright (c) 2020-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 # # monitor netwatch and send notifications -# https://git.eworm.de/cgit/routeros-scripts/about/doc/netwatch-notify.md +# https://rsc.eworm.de/doc/netwatch-notify.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 719079c5c1298a4800ac482247ee9ac5a9502740 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 339/893] news-and-changes: use short url rsc.eworm.de --- news-and-changes.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 545a0c9..7508b43 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -1,6 +1,6 @@ # News, changes and migration by RouterOS Scripts # Copyright (c) 2019-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md :global IDonate; From 3b0ea3a2388c69914fa76204c6e940b60f6aee83 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 340/893] ospf-to-leds: use short url rsc.eworm.de --- ospf-to-leds.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ospf-to-leds.rsc b/ospf-to-leds.rsc index 3400e7f..9d822c1 100644 --- a/ospf-to-leds.rsc +++ b/ospf-to-leds.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: ospf-to-leds # Copyright (c) 2020-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # visualize ospf instance state via leds -# https://git.eworm.de/cgit/routeros-scripts/about/doc/ospf-to-leds.md +# https://rsc.eworm.de/doc/ospf-to-leds.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 90a148a9d86f069048974399feca29a7911e833d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 341/893] packages-update: use short url rsc.eworm.de --- packages-update.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages-update.rsc b/packages-update.rsc index 7644219..9971e47 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: packages-update # Copyright (c) 2019-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # download packages and reboot for installation -# https://git.eworm.de/cgit/routeros-scripts/about/doc/packages-update.md +# https://rsc.eworm.de/doc/packages-update.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 867e504c94faf9d87b8caa6e4d77cd5426af9f73 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 342/893] ppp-on-up: use short url rsc.eworm.de --- ppp-on-up.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index ba9d0aa..85e9689 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: ppp-on-up # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # run scripts on ppp up -# https://git.eworm.de/cgit/routeros-scripts/about/doc/ppp-on-up.md +# https://rsc.eworm.de/doc/ppp-on-up.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 1f5aea9fca6ecd5706cb29c8226109281333510d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 343/893] sms-action: use short url rsc.eworm.de --- sms-action.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sms-action.rsc b/sms-action.rsc index f22a0bb..34d2127 100644 --- a/sms-action.rsc +++ b/sms-action.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: sms-action # Copyright (c) 2018-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # run action on received SMS -# https://git.eworm.de/cgit/routeros-scripts/about/doc/sms-action.md +# https://rsc.eworm.de/doc/sms-action.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 7addf2e53a73e230aeac962c9b86a1f1f7e2ddd4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 344/893] sms-forward: use short url rsc.eworm.de --- sms-forward.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sms-forward.rsc b/sms-forward.rsc index efebb75..654fd56 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -2,12 +2,12 @@ # RouterOS script: sms-forward # Copyright (c) 2013-2025 Christian Hesse # Anatoly Bubenkov -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # forward SMS to e-mail -# https://git.eworm.de/cgit/routeros-scripts/about/doc/sms-forward.md +# https://rsc.eworm.de/doc/sms-forward.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From dd2854e983685ae39465c4375bbdb7b4d27956e8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 345/893] super-mario-theme: use short url rsc.eworm.de --- super-mario-theme.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/super-mario-theme.rsc b/super-mario-theme.rsc index fc868c8..726c526 100644 --- a/super-mario-theme.rsc +++ b/super-mario-theme.rsc @@ -1,10 +1,10 @@ #!rsc by RouterOS # RouterOS script: super-mario-theme # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # play Super Mario theme -# https://git.eworm.de/cgit/routeros-scripts/about/doc/super-mario-theme.md +# https://rsc.eworm.de/doc/super-mario-theme.md :local Beeps { { 660; 100 }; 150; { 660; 100 }; 300; { 660; 100 }; 300; From e3ca37ad9a6f49ae5990e0fb4630d40e77153439 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:12 +0100 Subject: [PATCH 346/893] telegram-chat: use short url rsc.eworm.de --- telegram-chat.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index eebb617..dcdbefa 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: telegram-chat # Copyright (c) 2023-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 # # use Telegram to chat with your Router and send commands -# https://git.eworm.de/cgit/routeros-scripts/about/doc/telegram-chat.md +# https://rsc.eworm.de/doc/telegram-chat.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 32ac10e6efcd8967b998aef066220a75d4819e0c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 347/893] unattended-lte-firmware-upgrade: use short url rsc.eworm.de --- unattended-lte-firmware-upgrade.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unattended-lte-firmware-upgrade.rsc b/unattended-lte-firmware-upgrade.rsc index ea18edf..c7df92f 100644 --- a/unattended-lte-firmware-upgrade.rsc +++ b/unattended-lte-firmware-upgrade.rsc @@ -1,12 +1,12 @@ #!rsc by RouterOS # RouterOS script: unattended-lte-firmware-upgrade # Copyright (c) 2018-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # schedule unattended lte firmware upgrade -# https://git.eworm.de/cgit/routeros-scripts/about/doc/unattended-lte-firmware-upgrade.md +# https://rsc.eworm.de/doc/unattended-lte-firmware-upgrade.md :foreach Interface in=[ /interface/lte/find where running ] do={ :local Firmware; From 49aef0606bb36ee1b0d2ed93e7ce6b63d38338da Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 348/893] update-gre-address: use short url rsc.eworm.de --- update-gre-address.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/update-gre-address.rsc b/update-gre-address.rsc index 4ac311a..6b169a0 100644 --- a/update-gre-address.rsc +++ b/update-gre-address.rsc @@ -1,13 +1,13 @@ #!rsc by RouterOS # RouterOS script: update-gre-address # Copyright (c) 2013-2025 Christian Hesse -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 # # update gre interface remote address with dynamic address from # ipsec remote peer -# https://git.eworm.de/cgit/routeros-scripts/about/doc/update-gre-address.md +# https://rsc.eworm.de/doc/update-gre-address.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From c04ee5aadf4880bcea019f1cdcc1bfca918cce2c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Jan 2025 20:46:11 +0100 Subject: [PATCH 349/893] update-tunnelbroker: use short url rsc.eworm.de --- update-tunnelbroker.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index 589544c..c47a45f 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -2,13 +2,13 @@ # RouterOS script: update-tunnelbroker # Copyright (c) 2013-2025 Christian Hesse # Michael Gisbers -# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md +# https://rsc.eworm.de/COPYING.md # # provides: ppp-on-up # requires RouterOS, version=7.14 # # update local address of tunnelbroker interface -# https://git.eworm.de/cgit/routeros-scripts/about/doc/update-tunnelbroker.md +# https://rsc.eworm.de/doc/update-tunnelbroker.md :global GlobalFunctionsReady; :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } From 106a9bddefd7577b4baf7ae1d78e1bbde09b281e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 09:18:48 +0100 Subject: [PATCH 350/893] README: give hint on device mode --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 98209bd..8594f58 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,12 @@ Specific scripts may require even newer RouterOS version. > ℹ️ **Info**: The `main` branch is now RouterOS v7 only. If you are still > running RouterOS v6 switch to `routeros-v6` branch! +Starting with RouterOS 7.17 the +[device-mode](https://help.mikrotik.com/docs/spaces/ROS/pages/93749258/Device-mode) +has been extended to give more fine-grained control over what features are +available. You need to enable `scheduler` and `fetch` at least, specific +scripts may require additional features. + ### Hardware RouterOS packages increase in size with each release. This becomes a From b177e298d7b447c41854d840eed6f687b6cec8b6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 09:45:25 +0100 Subject: [PATCH 351/893] global-functions: $ScriptInstallUpdate: support checking for device-mode features --- global-functions.rsc | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index d5ac31c..7d65f45 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -5,6 +5,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, fetch, scheduler # # global functions # https://rsc.eworm.de/ @@ -1071,6 +1072,7 @@ :local ExpectedConfigVersionBefore $ExpectedConfigVersion; :local ReloadGlobalFunctions false; :local ReloadGlobalConfig false; + :local DeviceMode [ /system/device-mode/get ]; :foreach Script in=[ /system/script/find where source~"^#!rsc by RouterOS\r?\n" ] do={ :local ScriptVal [ /system/script/get $Script ]; @@ -1113,19 +1115,31 @@ :if ([ :pick $SourceNew 0 18 ] = "#!rsc by RouterOS\n") do={ :local Required ([ $ParseKeyValueStore [ $Grep $SourceNew ("\23 requires RouterOS, ") ] ]->"version"); :if ([ $RequiredRouterOS $0 [ $EitherOr $Required "0.0" ] false ] = true) do={ - :if ([ $ValidateSyntax $SourceNew ] = true) do={ - $LogPrint info $0 ("Updating script: " . $ScriptVal->"name"); - /system/script/set owner=($ScriptVal->"name") \ - source=[ $IfThenElse ($ScriptUpdatesCRLF = true) $SourceCRLF $SourceNew ] $Script; - :if ($ScriptVal->"name" = "global-config") do={ - :set ReloadGlobalConfig true; + :local RequiredDM [ $ParseKeyValueStore [ $Grep $SourceNew ("\23 requires device-mode, ") ] ]; + :local MissingDM ({}); + :foreach Feature,Value in=$RequiredDM do={ + :if ([ :typeof ($DeviceMode->$Feature) ] = "bool" && ($DeviceMode->$Feature) = false) do={ + :set MissingDM ($MissingDM, $Feature); } - :if ($ScriptVal->"name" = "global-functions" || $ScriptVal->"name" ~ ("^mod/.")) do={ - :set ReloadGlobalFunctions true; + } + :if ([ :len $MissingDM ] = 0) do={ + :if ([ $ValidateSyntax $SourceNew ] = true) do={ + $LogPrint info $0 ("Updating script: " . $ScriptVal->"name"); + /system/script/set owner=($ScriptVal->"name") \ + source=[ $IfThenElse ($ScriptUpdatesCRLF = true) $SourceCRLF $SourceNew ] $Script; + :if ($ScriptVal->"name" = "global-config") do={ + :set ReloadGlobalConfig true; + } + :if ($ScriptVal->"name" = "global-functions" || $ScriptVal->"name" ~ ("^mod/.")) do={ + :set ReloadGlobalFunctions true; + } + } else={ + $LogPrint warning $0 ("Syntax validation for script '" . $ScriptVal->"name" . \ + "' failed! Ignoring!"); } } else={ - $LogPrint warning $0 ("Syntax validation for script '" . $ScriptVal->"name" . \ - "' failed! Ignoring!"); + $LogPrintOnce warning $0 ("The script '" . $ScriptVal->"name" . "' requires disabled " . \ + "device-mode features (" . [ :tostr $MissingDM ] . "). Ignoring!"); } } else={ $LogPrintOnce warning $0 ("The script '" . $ScriptVal->"name" . "' requires RouterOS " . \ From aebc4e37da1a8e9ed1b343a83c7d60ac50fab9d5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:26:22 +0100 Subject: [PATCH 352/893] backup-partition: add dependencies on device-mode --- backup-partition.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/backup-partition.rsc b/backup-partition.rsc index b8bf7b1..bfa7765 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -5,6 +5,7 @@ # # provides: backup-script, order=70 # requires RouterOS, version=7.14 +# requires device-mode, scheduler # # save configuration to fallback partition # https://rsc.eworm.de/doc/backup-partition.md From d81a786e8288fea463c7188f1939c59713add31a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:20:26 +0100 Subject: [PATCH 353/893] backup-upload: add dependencies on device-mode --- backup-upload.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/backup-upload.rsc b/backup-upload.rsc index 011c502..dc5120f 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -5,6 +5,7 @@ # # provides: backup-script, order=50 # requires RouterOS, version=7.14 +# requires device-mode, fetch # # create and upload backup and config file # https://rsc.eworm.de/doc/backup-upload.md From 95b675f67ec9d7c5a9df01a54c1754834b02beee Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:21:12 +0100 Subject: [PATCH 354/893] check-certificates: add dependencies on device-mode --- check-certificates.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/check-certificates.rsc b/check-certificates.rsc index 02e3e52..4271e00 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, fetch # # check for certificate validity # https://rsc.eworm.de/doc/check-certificates.md From 43f6c0b975bb4db73131f78014ca3d59123bd4a6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:21:26 +0100 Subject: [PATCH 355/893] check-routeros-update: add dependencies on device-mode --- check-routeros-update.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 9486d6c..5c9b392 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, fetch, scheduler # # check for RouterOS update, send notification and/or install # https://rsc.eworm.de/doc/check-routeros-update.md From bc0227c49b99372ff46516e55175cf6ae1da31d3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:21:40 +0100 Subject: [PATCH 356/893] gps-track: add dependencies on device-mode --- gps-track.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/gps-track.rsc b/gps-track.rsc index 08873de..5e35f8d 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, fetch # # track gps data by sending json data to http server # https://rsc.eworm.de/doc/gps-track.md From e29ef31eb85e9b9001536ed1bb63a0b479cf4cad Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:35:31 +0100 Subject: [PATCH 357/893] hotspot-to-wpa: add dependencies on device-mode --- hotspot-to-wpa.capsman.rsc | 1 + hotspot-to-wpa.template.rsc | 1 + hotspot-to-wpa.wifi.rsc | 1 + 3 files changed, 3 insertions(+) diff --git a/hotspot-to-wpa.capsman.rsc b/hotspot-to-wpa.capsman.rsc index 1c77de9..de9f9d9 100644 --- a/hotspot-to-wpa.capsman.rsc +++ b/hotspot-to-wpa.capsman.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, hotspot # # add private WPA passphrase after hotspot login # https://rsc.eworm.de/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa.template.rsc b/hotspot-to-wpa.template.rsc index d8cd261..003b12e 100644 --- a/hotspot-to-wpa.template.rsc +++ b/hotspot-to-wpa.template.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, hotspot # # add private WPA passphrase after hotspot login # https://rsc.eworm.de/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa.wifi.rsc b/hotspot-to-wpa.wifi.rsc index 345087d..0d6a7b9 100644 --- a/hotspot-to-wpa.wifi.rsc +++ b/hotspot-to-wpa.wifi.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, hotspot # # add private WPA passphrase after hotspot login # https://rsc.eworm.de/doc/hotspot-to-wpa.md From 1ad4d05be8a69490902308baa515b8c87095bb2d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:35:23 +0100 Subject: [PATCH 358/893] hotspot-to-wpa-cleanup: add dependencies on device-mode --- hotspot-to-wpa-cleanup.capsman.rsc | 1 + hotspot-to-wpa-cleanup.template.rsc | 1 + hotspot-to-wpa-cleanup.wifi.rsc | 1 + 3 files changed, 3 insertions(+) diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index fde36f9..c21ec3e 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -5,6 +5,7 @@ # # provides: lease-script, order=80 # requires RouterOS, version=7.14 +# requires device-mode, hotspot # # manage and clean up private WPA passphrase after hotspot login # https://rsc.eworm.de/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index 3ddcbe0..1bd877e 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -5,6 +5,7 @@ # # provides: lease-script, order=80 # requires RouterOS, version=7.14 +# requires device-mode, hotspot # # manage and clean up private WPA passphrase after hotspot login # https://rsc.eworm.de/doc/hotspot-to-wpa.md diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index 034530b..8e36204 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -5,6 +5,7 @@ # # provides: lease-script, order=80 # requires RouterOS, version=7.14 +# requires device-mode, hotspot # # manage and clean up private WPA passphrase after hotspot login # https://rsc.eworm.de/doc/hotspot-to-wpa.md From 5f1cbe6de5466ccaaf1b5eb29f7087f04cf342c3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:25:15 +0100 Subject: [PATCH 359/893] ipsec-to-dns: add dependencies on device-mode --- ipsec-to-dns.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/ipsec-to-dns.rsc b/ipsec-to-dns.rsc index 1af5809..91f6b45 100644 --- a/ipsec-to-dns.rsc +++ b/ipsec-to-dns.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, ipsec # # and add/remove/update DNS entries from IPSec mode-config # https://rsc.eworm.de/doc/ipsec-to-dns.md From 56e74268b079fba7bda8803c0d88eeb67d0f4397 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:31:30 +0100 Subject: [PATCH 360/893] mode-button: add dependencies on device-mode --- mode-button.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/mode-button.rsc b/mode-button.rsc index 9339f1c..4cf5e75 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, scheduler # # act on multiple mode and reset button presses # https://rsc.eworm.de/doc/mode-button.md From 370e81321fe485a94560b4debe2ce7044c99e86f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:15:49 +0100 Subject: [PATCH 361/893] mod/notification-email: add dependencies on device-mode --- mod/notification-email.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index ca23550..404e74d 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, email, scheduler # # send notifications via e-mail # https://rsc.eworm.de/doc/mod/notification-email.md From 9a12934202c1bf8f46b326b37e7b06d84609c4ce Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:21:57 +0100 Subject: [PATCH 362/893] mod/notification-matrix: add dependencies on device-mode --- mod/notification-matrix.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index aee231d..9b2b641 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -5,6 +5,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, fetch, scheduler # # send notifications via Matrix # https://rsc.eworm.de/doc/mod/notification-matrix.md From 9f2f54b4790659189c60e72918cc200625c22d25 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:22:08 +0100 Subject: [PATCH 363/893] mod/notification-ntfy: add dependencies on device-mode --- mod/notification-ntfy.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index df252bb..212fde2 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, fetch, scheduler # # send notifications via Ntfy (ntfy.sh) # https://rsc.eworm.de/doc/mod/notification-ntfy.md From 378a8978dfb86f1f690732cc0e513330282bcd98 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:22:22 +0100 Subject: [PATCH 364/893] mod/notification-telegram: add dependencies on device-mode --- mod/notification-telegram.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index a20367c..c3ef2dd 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, fetch, scheduler # # send notifications via Telegram # https://rsc.eworm.de/doc/mod/notification-telegram.md From 59c9d0ce4bf97407a5f35d8556ecc9f4f03ca752 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:22:43 +0100 Subject: [PATCH 365/893] mod/scriptrunonce: add dependencies on device-mode --- mod/scriptrunonce.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index cae2b05..e5368c4 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, fetch # # download script and run it once # https://rsc.eworm.de/doc/mod/scriptrunonce.md From 3ef458860153ab858eec70e0899efa91a84236d4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:22:55 +0100 Subject: [PATCH 366/893] netwatch-dns: add dependencies on device-mode --- netwatch-dns.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index e05c3ac..467d636 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.16 +# requires device-mode, fetch # # monitor and manage dns/doh with netwatch # https://rsc.eworm.de/doc/netwatch-dns.md From 8dc1e1ea6bdb815de28823dfa43d1cfeda67379f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:32:17 +0100 Subject: [PATCH 367/893] packages-update: add dependencies on device-mode --- packages-update.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/packages-update.rsc b/packages-update.rsc index 9971e47..ff47b2a 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, scheduler # # download packages and reboot for installation # https://rsc.eworm.de/doc/packages-update.md From ef48b8d39ebacf2bd1c560c6dea33399a9a47b47 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:23:58 +0100 Subject: [PATCH 368/893] telegram-chat: add dependencies on device-mode --- telegram-chat.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index dcdbefa..8f29d8c 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 +# requires device-mode, fetch # # use Telegram to chat with your Router and send commands # https://rsc.eworm.de/doc/telegram-chat.md From 9421566352041654e1f2ded815739b040eec1df4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:28:40 +0100 Subject: [PATCH 369/893] unattended-lte-firmware-upgrade: add dependencies on device-mode --- unattended-lte-firmware-upgrade.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/unattended-lte-firmware-upgrade.rsc b/unattended-lte-firmware-upgrade.rsc index c7df92f..74495d1 100644 --- a/unattended-lte-firmware-upgrade.rsc +++ b/unattended-lte-firmware-upgrade.rsc @@ -4,6 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.14 +# requires device-mode, scheduler # # schedule unattended lte firmware upgrade # https://rsc.eworm.de/doc/unattended-lte-firmware-upgrade.md From d921af9a6bda54da74f6b7520db1a8e5697c8c3e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 10:23:06 +0100 Subject: [PATCH 370/893] update-tunnelbroker: add dependencies on device-mode --- update-tunnelbroker.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index c47a45f..a58589b 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -6,6 +6,7 @@ # # provides: ppp-on-up # requires RouterOS, version=7.14 +# requires device-mode, fetch # # update local address of tunnelbroker interface # https://rsc.eworm.de/doc/update-tunnelbroker.md From 8b19e74736693483faf533fd22fce458ae4fac9e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 21:58:47 +0100 Subject: [PATCH 371/893] global-functions: $ScriptInstallUpdate: resolve nested conditions... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ... and check one after another in a do-block. This uses `:error` as poor man's continue. 🤪 --- global-functions.rsc | 97 ++++++++++++++++++++++++-------------------- 1 file changed, 52 insertions(+), 45 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 7d65f45..befe8f0 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1109,52 +1109,59 @@ } } - :if ([ :len $SourceNew ] > 0) do={ - :local SourceCRLF [ :tocrlf $SourceNew ]; - :if ($SourceNew != $ScriptVal->"source" && $SourceCRLF != $ScriptVal->"source") do={ - :if ([ :pick $SourceNew 0 18 ] = "#!rsc by RouterOS\n") do={ - :local Required ([ $ParseKeyValueStore [ $Grep $SourceNew ("\23 requires RouterOS, ") ] ]->"version"); - :if ([ $RequiredRouterOS $0 [ $EitherOr $Required "0.0" ] false ] = true) do={ - :local RequiredDM [ $ParseKeyValueStore [ $Grep $SourceNew ("\23 requires device-mode, ") ] ]; - :local MissingDM ({}); - :foreach Feature,Value in=$RequiredDM do={ - :if ([ :typeof ($DeviceMode->$Feature) ] = "bool" && ($DeviceMode->$Feature) = false) do={ - :set MissingDM ($MissingDM, $Feature); - } - } - :if ([ :len $MissingDM ] = 0) do={ - :if ([ $ValidateSyntax $SourceNew ] = true) do={ - $LogPrint info $0 ("Updating script: " . $ScriptVal->"name"); - /system/script/set owner=($ScriptVal->"name") \ - source=[ $IfThenElse ($ScriptUpdatesCRLF = true) $SourceCRLF $SourceNew ] $Script; - :if ($ScriptVal->"name" = "global-config") do={ - :set ReloadGlobalConfig true; - } - :if ($ScriptVal->"name" = "global-functions" || $ScriptVal->"name" ~ ("^mod/.")) do={ - :set ReloadGlobalFunctions true; - } - } else={ - $LogPrint warning $0 ("Syntax validation for script '" . $ScriptVal->"name" . \ - "' failed! Ignoring!"); - } - } else={ - $LogPrintOnce warning $0 ("The script '" . $ScriptVal->"name" . "' requires disabled " . \ - "device-mode features (" . [ :tostr $MissingDM ] . "). Ignoring!"); - } - } else={ - $LogPrintOnce warning $0 ("The script '" . $ScriptVal->"name" . "' requires RouterOS " . \ - $Required . ", which is not met by your installation. Ignoring!"); - } - } else={ - $LogPrint warning $0 ("Looks like new script '" . $ScriptVal->"name" . \ - "' is not valid (missing shebang). Ignoring!"); - } - } else={ - $LogPrint debug $0 ("Script '" . $ScriptVal->"name" . "' did not change."); + :do { + :if ([ :len $SourceNew ] = 0) do={ + $LogPrint debug $0 ("No update for script '" . $ScriptVal->"name" . "'."); + :error false; } - } else={ - $LogPrint debug $0 ("No update for script '" . $ScriptVal->"name" . "'."); - } + + :local SourceCRLF [ :tocrlf $SourceNew ]; + :if ($SourceNew = $ScriptVal->"source" || $SourceCRLF = $ScriptVal->"source") do={ + $LogPrint debug $0 ("Script '" . $ScriptVal->"name" . "' did not change."); + :error false; + } + + :if ([ :pick $SourceNew 0 18 ] != "#!rsc by RouterOS\n") do={ + $LogPrint warning $0 ("Looks like new script '" . $ScriptVal->"name" . \ + "' is not valid (missing shebang). Ignoring!"); + :error false; + } + + :local RequiredROS ([ $ParseKeyValueStore [ $Grep $SourceNew ("\23 requires RouterOS, ") ] ]->"version"); + :if ([ $RequiredRouterOS $0 [ $EitherOr $RequiredROS "0.0" ] false ] = false) do={ + $LogPrintOnce warning $0 ("The script '" . $ScriptVal->"name" . "' requires RouterOS " . \ + $RequiredROS . ", which is not met by your installation. Ignoring!"); + :error false; + } + + :local RequiredDM [ $ParseKeyValueStore [ $Grep $SourceNew ("\23 requires device-mode, ") ] ]; + :local MissingDM ({}); + :foreach Feature,Value in=$RequiredDM do={ + :if ([ :typeof ($DeviceMode->$Feature) ] = "bool" && ($DeviceMode->$Feature) = false) do={ + :set MissingDM ($MissingDM, $Feature); + } + } + :if ([ :len $MissingDM ] > 0) do={ + $LogPrintOnce warning $0 ("The script '" . $ScriptVal->"name" . "' requires disabled " . \ + "device-mode features (" . [ :tostr $MissingDM ] . "). Ignoring!"); + :error false; + } + + :if ([ $ValidateSyntax $SourceNew ] = false) do={ + $LogPrint warning $0 ("Syntax validation for script '" . $ScriptVal->"name" . "' failed! Ignoring!"); + :error false; + } + + $LogPrint info $0 ("Updating script: " . $ScriptVal->"name"); + /system/script/set owner=($ScriptVal->"name") \ + source=[ $IfThenElse ($ScriptUpdatesCRLF = true) $SourceCRLF $SourceNew ] $Script; + :if ($ScriptVal->"name" = "global-config") do={ + :set ReloadGlobalConfig true; + } + :if ($ScriptVal->"name" = "global-functions" || $ScriptVal->"name" ~ ("^mod/.")) do={ + :set ReloadGlobalFunctions true; + } + } on-error={ } } :if ($ReloadGlobalFunctions = true) do={ From 414c83ef814af82d53f5b4de3a8d6b5a004704c1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Jan 2025 22:07:06 +0100 Subject: [PATCH 372/893] global-functions: $ScriptInstallUpdate: resolve more nested conditions Just like the previous one. --- global-functions.rsc | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index befe8f0..a2ec833 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1221,18 +1221,24 @@ :if ([ :len $GlobalConfigMigration ] > 0) do={ :for I from=($ExpectedConfigVersionBefore + 1) to=$ExpectedConfigVersion do={ :local Migration ($GlobalConfigMigration->[ :tostr $I ]); - :if ([ :typeof $Migration ] = "str") do={ - :if ([ $ValidateSyntax $Migration ] = true) do={ - $LogPrint info $0 ("Applying migration for change " . $I . ": " . $Migration); - :do { - [ :parse $Migration ]; - } on-error={ - $LogPrint warning $0 ("Migration code for change " . $I . " failed to run!"); - } - } else={ - $LogPrint warning $0 ("Migration code for change " . $I . " failed syntax validation!"); + :do { + :if ([ :typeof $Migration ] != "str") do={ + $LogPrint debug $0 ("Migration code for change " . $I . " is not available."); + :error false; } - } + + :if ([ $ValidateSyntax $Migration ] = false) do={ + $LogPrint warning $0 ("Migration code for change " . $I . " failed syntax validation!"); + :error false; + } + + $LogPrint info $0 ("Applying migration for change " . $I . ": " . $Migration); + :do { + [ :parse $Migration ]; + } on-error={ + $LogPrint warning $0 ("Migration code for change " . $I . " failed to run!"); + } + } on-error={ } } } From aa294b4c67d038eae1b4e785dfd934176a1fb704 Mon Sep 17 00:00:00 2001 From: Miquel Bonastre Date: Thu, 30 Jan 2025 20:27:14 +0100 Subject: [PATCH 373/893] certs: fix curl false positives... ... when default capath contains system certs If curl has a default capath (debian 12 capath=/etc/ssl/certs) it will add those certs and return ok to any valid https url, defeating the intended use of the cacert option in the Makefile that validates sites and certs. To avoid that, adding option "--capath /dev/null" overrides the default value, if any. Closes: https://github.com/eworm-de/routeros-scripts/pull/88 --- certs/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/certs/Makefile b/certs/Makefile index 870cb54..b5f6a92 100644 --- a/certs/Makefile +++ b/certs/Makefile @@ -29,4 +29,4 @@ DOMAINS = \ all: $(DOMAINS) $(DOMAINS): - curl --output /dev/null --silent --connect-timeout 5 --cacert $(notdir $@).pem https://$(dir $@) + curl --output /dev/null --silent --connect-timeout 5 --capath /dev/null --cacert $(notdir $@).pem https://$(dir $@) From fcb5347e3398dd8c77c44904a4bf0cefc57f3174 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 30 Jan 2025 22:16:49 +0100 Subject: [PATCH 374/893] certs: split checks for dual, ipv4 & ipv6... ... and check both if available. --- certs/Makefile | 48 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/certs/Makefile b/certs/Makefile index b5f6a92..87b4feb 100644 --- a/certs/Makefile +++ b/certs/Makefile @@ -1,32 +1,52 @@ # Makefile to check certificates -DOMAINS = \ - 1.1.1.1/DigiCert-Global-Root-G2 \ - 8.8.8.8/GTS-Root-R1 \ - 9.9.9.9/DigiCert-Global-Root-G3 \ +CURL = curl \ + --capath /dev/null \ + --connect-timeout 5 \ + --output /dev/null \ + --silent + +DOMAINS_DUAL = \ api.macvendors.com/GTS-Root-R4 \ - api.mullvad.net/ISRG-Root-X1 \ api.telegram.org/Go-Daddy-Root-Certificate-Authority-G2 \ cloudflare-dns.com/DigiCert-Global-Root-G2 \ dns.google/GTS-Root-R1 \ dns.quad9.net/DigiCert-Global-Root-G3 \ - feodotracker.abuse.ch/GlobalSign \ git.eworm.de/ISRG-Root-X2 \ - ipv4.showipv6.de/ISRG-Root-X1 \ - ipv4.tunnelbroker.net/Starfield-Root-Certificate-Authority-G2 \ - ipv6.showipv6.de/ISRG-Root-X1 \ lists.blocklist.de/Certum-Trusted-Network-CA \ matrix.org/GTS-Root-R4 \ + raw.githubusercontent.com/DigiCert-Global-Root-G2 \ + rsc.eworm.de/ISRG-Root-X2 \ + upgrade.mikrotik.com/ISRG-Root-X1 +DOMAINS_IPV4 = \ + 1.1.1.1/DigiCert-Global-Root-G2 \ + 8.8.8.8/GTS-Root-R1 \ + 9.9.9.9/DigiCert-Global-Root-G3 \ + api.mullvad.net/ISRG-Root-X1 \ + feodotracker.abuse.ch/GlobalSign \ + ipv4.showipv6.de/ISRG-Root-X1 \ + ipv4.tunnelbroker.net/Starfield-Root-Certificate-Authority-G2 \ mkcert.org/ISRG-Root-X1 \ ntfy.sh/ISRG-Root-X1 \ sslbl.abuse.ch/GlobalSign \ - upgrade.mikrotik.com/ISRG-Root-X1 \ www.dshield.org/ISRG-Root-X1 \ www.spamhaus.org/GTS-Root-R4 +DOMAINS_IPV6 = \ + [2606\:4700\:4700\:\:1111]/DigiCert-Global-Root-G2 \ + [2001\:4860\:4860\:\:8888]/GTS-Root-R1 \ + [2620\:fe\:\:9]/DigiCert-Global-Root-G3 \ + ipv6.showipv6.de/ISRG-Root-X1 -.PHONY: $(DOMAINS) +.PHONY: $(DOMAINS_DUAL) $(DOMAINS_IPV4) $(DOMAINS_IPV6) -all: $(DOMAINS) +all: $(DOMAINS_DUAL) $(DOMAINS_IPV4) $(DOMAINS_IPV6) -$(DOMAINS): - curl --output /dev/null --silent --connect-timeout 5 --capath /dev/null --cacert $(notdir $@).pem https://$(dir $@) +$(DOMAINS_DUAL): + $(CURL) -4 --cacert $(notdir $@).pem https://$(dir $@) + $(CURL) -6 --cacert $(notdir $@).pem https://$(dir $@) + +$(DOMAINS_IPV4): + $(CURL) -4 --cacert $(notdir $@).pem https://$(dir $@) + +$(DOMAINS_IPV6): + $(CURL) -6 --cacert $(notdir $@).pem https://$(dir $@) From 87fb70534f8d86509505185f787118c64b3924ba Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 30 Jan 2025 22:25:55 +0100 Subject: [PATCH 375/893] certs: support checking ipv4 or ipv6 only Just run for IPv4 only: make NOIPV6=1 ... or for IPv6 only: make NOIPV4=1 --- certs/Makefile | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/certs/Makefile b/certs/Makefile index 87b4feb..5dfb0d1 100644 --- a/certs/Makefile +++ b/certs/Makefile @@ -42,11 +42,19 @@ DOMAINS_IPV6 = \ all: $(DOMAINS_DUAL) $(DOMAINS_IPV4) $(DOMAINS_IPV6) $(DOMAINS_DUAL): +ifndef NOIPV4 $(CURL) -4 --cacert $(notdir $@).pem https://$(dir $@) +endif +ifndef NOIPV6 $(CURL) -6 --cacert $(notdir $@).pem https://$(dir $@) +endif $(DOMAINS_IPV4): +ifndef NOIPV4 $(CURL) -4 --cacert $(notdir $@).pem https://$(dir $@) +endif $(DOMAINS_IPV6): +ifndef NOIPV6 $(CURL) -6 --cacert $(notdir $@).pem https://$(dir $@) +endif From 0eb91b6bfa8e22f24f0be8052ae2b93c0114ae59 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 30 Jan 2025 22:30:57 +0100 Subject: [PATCH 376/893] update list of contributors --- CONTRIBUTIONS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index ed1d6fa..ef1bd8b 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -22,6 +22,7 @@ for details! * [Daniel Ziegenberg](mailto:daniel@ziegenberg.at) (@ziegenberg) * [Ignacio Serrano](mailto:ignic@ignic.com) (@ignic) * [Michael Gisbers](mailto:michael@gisbers.de) (@mgisbers) +* [Miquel Bonastre](mailto:mbonastre@yahoo.com) (@mbonastre) * @netravnen * [netztrip](mailto:dave-tvg@netztrip.de) (@netztrip) * [Stefan Müller](mailto:stefan.mueller.83@gmail.com) (@PackElend) From 44d0c852f11cce04139a25613822f103e39e06b1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 31 Jan 2025 11:39:51 +0100 Subject: [PATCH 377/893] check-certificates: try with "star." for renewal with wildcards --- check-certificates.rsc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/check-certificates.rsc b/check-certificates.rsc index 4271e00..a61cf81 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -158,6 +158,10 @@ :if ($ImportSuccess = false) do={ :set LastName [ :pick $SAN ([ :find $SAN ":" ] + 1) [ :len $SAN ] ]; :set ImportSuccess [ $CheckCertificatesDownloadImport $ScriptName $LastName ]; + :if ($ImportSuccess = false && [ :pick $LastName 0 ] = "*") do={ + :set LastName ("star." . [ :pick $LastName 2 [ :len $LastName ] ]); + :set ImportSuccess [ $CheckCertificatesDownloadImport $ScriptName $LastName ]; + } } } :if ($ImportSuccess = false) do={ :error false; } From 75e5ddec527ac505540306ca5b26b7c40cdb1b5d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 31 Jan 2025 13:09:22 +0100 Subject: [PATCH 378/893] check-certificates: do not rename the wrong certificate --- check-certificates.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index a61cf81..2900a83 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -68,8 +68,10 @@ $LogPrint warning $ScriptName ("Decryption failed for certificate file '" . $CertFileName . "'."); } - :foreach CertInChain in=[ /certificate/find where name~("^" . [ $EscapeForRegEx $CertFileName ] . "_[0-9]+\$") \ - common-name!=$Name !(subject-alt-name~("(^|\\W)(DNS|IP):" . [ $EscapeForRegEx $Name ] . "(\\W|\$)")) !(common-name=[]) ] do={ + :foreach CertInChain in=[ /certificate/find where common-name!=$Name !private-key \ + name~("^" . [ $EscapeForRegEx $CertFileName ] . "_[0-9]+\$") \ + !(subject-alt-name~("(^|\\W)(DNS|IP):" . [ $EscapeForRegEx $Name ] . "(\\W|\$)")) \ + !(common-name=[]) ] do={ $CertificateNameByCN [ /certificate/get $CertInChain common-name ]; } From eabe3f6e951010ff9c112d82ee27bc39e3786960 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 31 Jan 2025 21:33:57 +0100 Subject: [PATCH 379/893] check-certificates: pass real and modified name into function --- check-certificates.rsc | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 2900a83..b986179 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -34,7 +34,8 @@ :local CheckCertificatesDownloadImport do={ :local ScriptName [ :tostr $1 ]; - :local Name [ :tostr $2 ]; + :local CertName [ :tostr $2 ]; + :local FetchName [ :tostr $3 ]; :global CertRenewUrl; :global CertRenewPass; @@ -49,7 +50,7 @@ :local Return false; :foreach Type in={ ".pem"; ".p12" } do={ - :local CertFileName ([ $UrlEncode $Name ] . $Type); + :local CertFileName ([ $UrlEncode $FetchName ] . $Type); :do { /tool/fetch check-certificate=yes-without-crl http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) \ ($CertRenewUrl . $CertFileName) dst-path=$CertFileName as-value; @@ -68,9 +69,9 @@ $LogPrint warning $ScriptName ("Decryption failed for certificate file '" . $CertFileName . "'."); } - :foreach CertInChain in=[ /certificate/find where common-name!=$Name !private-key \ + :foreach CertInChain in=[ /certificate/find where common-name!=$CertName !private-key \ name~("^" . [ $EscapeForRegEx $CertFileName ] . "_[0-9]+\$") \ - !(subject-alt-name~("(^|\\W)(DNS|IP):" . [ $EscapeForRegEx $Name ] . "(\\W|\$)")) \ + !(subject-alt-name~("(^|\\W)(DNS|IP):" . [ $EscapeForRegEx $CertName ] . "(\\W|\$)")) \ !(common-name=[]) ] do={ $CertificateNameByCN [ /certificate/get $CertInChain common-name ]; } @@ -145,6 +146,7 @@ :foreach Cert in=[ /certificate/find where !revoked !ca !scep-url expires-after<$CertRenewTime ] do={ :local CertVal [ /certificate/get $Cert ]; :local LastName; + :local FetchName; :do { :if ([ :len $CertRenewUrl ] = 0) do={ @@ -155,14 +157,16 @@ :local ImportSuccess false; :set LastName ($CertVal->"common-name"); - :set ImportSuccess [ $CheckCertificatesDownloadImport $ScriptName $LastName ]; + :set FetchName $LastName; + :set ImportSuccess [ $CheckCertificatesDownloadImport $ScriptName $LastName $FetchName ]; :foreach SAN in=($CertVal->"subject-alt-name") do={ :if ($ImportSuccess = false) do={ :set LastName [ :pick $SAN ([ :find $SAN ":" ] + 1) [ :len $SAN ] ]; - :set ImportSuccess [ $CheckCertificatesDownloadImport $ScriptName $LastName ]; + :set FetchName $LastName; + :set ImportSuccess [ $CheckCertificatesDownloadImport $ScriptName $LastName $FetchName ]; :if ($ImportSuccess = false && [ :pick $LastName 0 ] = "*") do={ - :set LastName ("star." . [ :pick $LastName 2 [ :len $LastName ] ]); - :set ImportSuccess [ $CheckCertificatesDownloadImport $ScriptName $LastName ]; + :set FetchName ("star." . [ :pick $LastName 2 [ :len $LastName ] ]); + :set ImportSuccess [ $CheckCertificatesDownloadImport $ScriptName $LastName $FetchName ]; } } } @@ -174,7 +178,7 @@ } else={ $LogPrint debug $ScriptName ("Certificate '" . $CertVal->"name" . "' was not updated, but replaced."); - :local CertNew [ /certificate/find where name~("^" . [ $EscapeForRegEx [ $UrlEncode $LastName ] ] . "\\.(p12|pem)_[0-9]+\$") \ + :local CertNew [ /certificate/find where name~("^" . [ $EscapeForRegEx [ $UrlEncode $FetchName ] ] . "\\.(p12|pem)_[0-9]+\$") \ (common-name=($CertVal->"common-name") or subject-alt-name~("(^|\\W)(DNS|IP):" . [ $EscapeForRegEx $LastName ] . "(\\W|\$)")) \ fingerprint!=[ :tostr ($CertVal->"fingerprint") ] expires-after>$CertRenewTime ]; :local CertNewVal [ /certificate/get $CertNew ]; From 3ad7ccd3d6c443bf64156ffcd980a418584c35d1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 3 Feb 2025 10:05:35 +0100 Subject: [PATCH 380/893] check-certificates: check to characters for star-dot --- check-certificates.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index b986179..34e7537 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -164,7 +164,7 @@ :set LastName [ :pick $SAN ([ :find $SAN ":" ] + 1) [ :len $SAN ] ]; :set FetchName $LastName; :set ImportSuccess [ $CheckCertificatesDownloadImport $ScriptName $LastName $FetchName ]; - :if ($ImportSuccess = false && [ :pick $LastName 0 ] = "*") do={ + :if ($ImportSuccess = false && [ :pick $LastName 0 2 ] = "*.") do={ :set FetchName ("star." . [ :pick $LastName 2 [ :len $LastName ] ]); :set ImportSuccess [ $CheckCertificatesDownloadImport $ScriptName $LastName $FetchName ]; } From 61f3c26199b4c22ae312a09f6c82f8e9cc403dd0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 3 Feb 2025 14:35:47 +0100 Subject: [PATCH 381/893] doc/check-health: highligh note on bad initial state --- doc/check-health.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/check-health.md b/doc/check-health.md index 578ea43..a945371 100644 --- a/doc/check-health.md +++ b/doc/check-health.md @@ -26,14 +26,16 @@ health related events: * power supply failed or recovered * temperature is above or below threshold -Note that bad initial state will not trigger an event. - Monitoring CPU and RAM utilization (available processing and memory resources) works on all devices. Other than that only sensors available in hardware can be checked. See what your hardware supports: /system/health/print; +> ⚠️ **Warning**: Note that bad initial state will not trigger an event! For +> example rebooting a device that is already too hot will not trigger an +> alert on high temperature. + ### Sample notifications #### CPU utilization From 3024b246b58fa106592c7f6f949e421e15edcdb3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 4 Feb 2025 12:02:31 +0100 Subject: [PATCH 382/893] check-health: remove extra line break --- check-health.rsc | 1 - 1 file changed, 1 deletion(-) diff --git a/check-health.rsc b/check-health.rsc index 31bd6c2..76de4cb 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -91,7 +91,6 @@ :set CheckHealthTemperatureNotified ({}); } - :foreach Voltage in=[ /system/health/find where type="V" ] do={ :local Name [ /system/health/get $Voltage name ]; :local Value [ /system/health/get $Voltage value ]; From bfe5f20920a90fc54b7b25a238a1763fa6f2d5e7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 4 Feb 2025 15:08:37 +0100 Subject: [PATCH 383/893] check-health: remove trailing whitespaces --- check-health.rsc | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/check-health.rsc b/check-health.rsc index 76de4cb..34c508c 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -107,16 +107,16 @@ message=("The " . $Name . " on " . $Identity . " jumped more than " . $CheckHealthVoltagePercent . "%.\n\n" . \ [ $FormatLine "old value" ($CheckHealthLast->$Name . " V") 12 ] . "\n" . \ [ $FormatLine "new value" ($Value . " V") 12 ]) }); - } else={ - :if ($NumCurr <= $CheckHealthVoltageLow && $NumLast > $CheckHealthVoltageLow) do={ - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "high-voltage-sign,chart-decreasing" ] . "Health warning: Low " . $Name); \ - message=("The " . $Name . " on " . $Identity . " dropped to " . $Value . " V below hard limit.") }); - } - :if ($NumCurr > $CheckHealthVoltageLow && $NumLast <= $CheckHealthVoltageLow) do={ - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "high-voltage-sign,chart-increasing" ] . "Health recovery: Low " . $Name); \ - message=("The " . $Name . " on " . $Identity . " recovered to " . $Value . " V above hard limit.") }); + } else={ + :if ($NumCurr <= $CheckHealthVoltageLow && $NumLast > $CheckHealthVoltageLow) do={ + $SendNotification2 ({ origin=$ScriptName; \ + subject=([ $SymbolForNotification "high-voltage-sign,chart-decreasing" ] . "Health warning: Low " . $Name); \ + message=("The " . $Name . " on " . $Identity . " dropped to " . $Value . " V below hard limit.") }); + } + :if ($NumCurr > $CheckHealthVoltageLow && $NumLast <= $CheckHealthVoltageLow) do={ + $SendNotification2 ({ origin=$ScriptName; \ + subject=([ $SymbolForNotification "high-voltage-sign,chart-increasing" ] . "Health recovery: Low " . $Name); \ + message=("The " . $Name . " on " . $Identity . " recovered to " . $Value . " V above hard limit.") }); } } } From 6501c98c822af958588512c374474f16bac61493 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 5 Feb 2025 09:36:15 +0100 Subject: [PATCH 384/893] certs: dns.google switched to 'GTS Root R4' Note that 8.8.8.8 is still at 'GTS Root R1'... --- certs/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/certs/Makefile b/certs/Makefile index 5dfb0d1..ba25303 100644 --- a/certs/Makefile +++ b/certs/Makefile @@ -10,7 +10,7 @@ DOMAINS_DUAL = \ api.macvendors.com/GTS-Root-R4 \ api.telegram.org/Go-Daddy-Root-Certificate-Authority-G2 \ cloudflare-dns.com/DigiCert-Global-Root-G2 \ - dns.google/GTS-Root-R1 \ + dns.google/GTS-Root-R4 \ dns.quad9.net/DigiCert-Global-Root-G3 \ git.eworm.de/ISRG-Root-X2 \ lists.blocklist.de/Certum-Trusted-Network-CA \ From 27c92b4382f961ad427313f6a0bfc01716e805d1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 5 Feb 2025 09:51:42 +0100 Subject: [PATCH 385/893] doc/netwatch-dns: switch exmample to cloudflare-dns.com --- doc/netwatch-dns.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/netwatch-dns.md b/doc/netwatch-dns.md index 6d2c865..aa4e91f 100644 --- a/doc/netwatch-dns.md +++ b/doc/netwatch-dns.md @@ -53,8 +53,8 @@ Note that using a name in DoH url may introduce a chicken-and-egg issue! Adding a static DNS record has the same result for the url, but always resolves to the same address. - /ip/dns/static/add name="dns.nextdns.io" address=199.247.16.158; - /tool/netwatch/add comment="doh" host=199.247.16.158; + /ip/dns/static/add name="cloudflare-dns.com" address=1.1.1.1; + /tool/netwatch/add comment="doh" host=1.1.1.1; Be aware that you have to keep the ip address in sync with real world manually! From 84ba3a463a46876f3e728326034d404d02aefb67 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 5 Feb 2025 09:55:41 +0100 Subject: [PATCH 386/893] doc/netwatch-dns: warn on different certificate... ... based on indicated server name. Currently this is true for 8.8.8.8 (GTS Root R1) and dns.google (GTS Root R4). --- doc/netwatch-dns.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/netwatch-dns.md b/doc/netwatch-dns.md index aa4e91f..0d94918 100644 --- a/doc/netwatch-dns.md +++ b/doc/netwatch-dns.md @@ -66,6 +66,10 @@ Importing a certificate automatically is possible. You may want to find the /tool/netwatch/add comment="doh, doh-cert=DigiCert Global Root G3" host=9.9.9.9; /tool/netwatch/add comment="doh, doh-cert=GTS Root R1" host=8.8.8.8; +> ⚠️ **Warning**: Combining these techniques can cause some confusion and +> troubles! Chances are that a service uses different certificates based +> on indicated server name. + Sometimes using just one specific (possibly internal) DNS server may be desired, with fallback in case it fails. This is possible as well: From 23d38927bcd553229d1cd80bff0d3506ab40f6fa Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 4 Feb 2025 12:27:35 +0100 Subject: [PATCH 387/893] check-health: split off plugins... ... from 'check-health', so the script works on all devices to monitor CPU and RAM. The supported plugins for sensors in hardware are installed automatically. --- check-health.d/state.rsc | 48 ++++++++ check-health.d/temperature.rsc | 74 ++++++++++++ check-health.d/voltage.rsc | 63 ++++++++++ check-health.rsc | 108 +++--------------- ...l.avif => notification-08-state-fail.avif} | Bin ...-ok.avif => notification-09-state-ok.avif} | Bin doc/check-health.md | 42 +++++-- global-functions.rsc | 2 +- news-and-changes.rsc | 2 + 9 files changed, 239 insertions(+), 100 deletions(-) create mode 100644 check-health.d/state.rsc create mode 100644 check-health.d/temperature.rsc create mode 100644 check-health.d/voltage.rsc rename doc/check-health.d/{notification-08-psu-fail.avif => notification-08-state-fail.avif} (100%) rename doc/check-health.d/{notification-09-psu-ok.avif => notification-09-state-ok.avif} (100%) diff --git a/check-health.d/state.rsc b/check-health.d/state.rsc new file mode 100644 index 0000000..bcc1fbc --- /dev/null +++ b/check-health.d/state.rsc @@ -0,0 +1,48 @@ +#!rsc by RouterOS +# RouterOS script: check-health.d/state +# Copyright (c) 2019-2025 Christian Hesse +# https://rsc.eworm.de/COPYING.md +# +# requires RouterOS, version=7.14 +# +# check for RouterOS health state - state plugin +# https://rsc.eworm.de/doc/check-health.md + +:global CheckHealthPlugins; + +:set ($CheckHealthPlugins->[ :jobname ]) do={ + :local FuncName [ :tostr $0 ]; + + :global CheckHealthLast; + :global Identity; + + :global LogPrint; + :global SendNotification2; + :global SymbolForNotification; + + :if ([ :len [ /system/health/find where type="" name~"-state\$"] ] = 0) do={ + $LogPrint debug $FuncName ("Your device does not provide any state health values."); + :return false; + } + + :foreach State in=[ /system/health/find where type="" name~"-state\$" ] do={ + :local Name [ /system/health/get $State name ]; + :local Value [ /system/health/get $State value ]; + + :if ([ :typeof ($CheckHealthLast->$Name) ] != "nothing") do={ + :if ($CheckHealthLast->$Name = "ok" && \ + $Value != "ok") do={ + $SendNotification2 ({ origin=$FuncName; \ + subject=([ $SymbolForNotification "cross-mark" ] . "Health warning: " . $Name); \ + message=("The device '" . $Name . "' on " . $Identity . " failed!") }); + } + :if ($CheckHealthLast->$Name != "ok" && \ + $Value = "ok") do={ + $SendNotification2 ({ origin=$FuncName; \ + subject=([ $SymbolForNotification "white-heavy-check-mark" ] . "Health recovery: " . $Name); \ + message=("The device '" . $Name . "' on " . $Identity . " recovered!") }); + } + } + :set ($CheckHealthLast->$Name) $Value; + } +} diff --git a/check-health.d/temperature.rsc b/check-health.d/temperature.rsc new file mode 100644 index 0000000..9b84782 --- /dev/null +++ b/check-health.d/temperature.rsc @@ -0,0 +1,74 @@ +#!rsc by RouterOS +# RouterOS script: check-health.d/temperature +# Copyright (c) 2019-2025 Christian Hesse +# https://rsc.eworm.de/COPYING.md +# +# requires RouterOS, version=7.14 +# +# check for RouterOS health state - temperature plugin +# https://rsc.eworm.de/doc/check-health.md + +:global CheckHealthPlugins; + +:set ($CheckHealthPlugins->[ :jobname ]) do={ + :local FuncName [ :tostr $0 ]; + + :global CheckHealthLast; + :global CheckHealthTemperature; + :global CheckHealthTemperatureDeviation; + :global CheckHealthTemperatureNotified; + :global Identity; + + :global LogPrint; + :global SendNotification2; + :global SymbolForNotification; + + :if ([ :len [ /system/health/find where type="C" ] ] = 0) do={ + $LogPrint debug $FuncName ("Your device does not provide any voltage health values."); + :return false; + } + + :local TempToNum do={ + :global CharacterReplace; + :local T [ :toarray [ $CharacterReplace $1 "." "," ] ]; + :return ($T->0 * 10 + $T->1); + } + + :if ([ :typeof $CheckHealthTemperatureNotified ] != "array") do={ + :set CheckHealthTemperatureNotified ({}); + } + + :foreach Temperature in=[ /system/health/find where type="C" ] do={ + :local Name [ /system/health/get $Temperature name ]; + :local Value [ /system/health/get $Temperature value ]; + + :if ([ :typeof ($CheckHealthLast->$Name) ] != "nothing") do={ + :if ([ :typeof ($CheckHealthTemperature->$Name) ] != "num" ) do={ + $LogPrint info $FuncName ("No threshold given for " . $Name . ", assuming 50C."); + :set ($CheckHealthTemperature->$Name) 50; + } + :local Validate [ /system/health/get [ find where name=$Name ] value ]; + :while ($Value != $Validate) do={ + :set Value $Validate; + :set Validate [ /system/health/get [ find where name=$Name ] value ]; + } + :if ($Value > $CheckHealthTemperature->$Name && \ + $CheckHealthTemperatureNotified->$Name != true) do={ + $SendNotification2 ({ origin=$FuncName; \ + subject=([ $SymbolForNotification "fire" ] . "Health warning: " . $Name); \ + message=("The " . $Name . " on " . $Identity . " is above threshold: " . \ + $Value . "\C2\B0" . "C") }); + :set ($CheckHealthTemperatureNotified->$Name) true; + } + :if ($Value <= ($CheckHealthTemperature->$Name - $CheckHealthTemperatureDeviation) && \ + $CheckHealthTemperatureNotified->$Name = true) do={ + $SendNotification2 ({ origin=$FuncName; \ + subject=([ $SymbolForNotification "white-heavy-check-mark" ] . "Health recovery: " . $Name); \ + message=("The " . $Name . " on " . $Identity . " dropped below threshold: " . \ + $Value . "\C2\B0" . "C") }); + :set ($CheckHealthTemperatureNotified->$Name) false; + } + } + :set ($CheckHealthLast->$Name) $Value; + } +} diff --git a/check-health.d/voltage.rsc b/check-health.d/voltage.rsc new file mode 100644 index 0000000..6394795 --- /dev/null +++ b/check-health.d/voltage.rsc @@ -0,0 +1,63 @@ +#!rsc by RouterOS +# RouterOS script: check-health.d/voltage +# Copyright (c) 2019-2025 Christian Hesse +# https://rsc.eworm.de/COPYING.md +# +# requires RouterOS, version=7.14 +# +# check for RouterOS health state - voltage plugin +# https://rsc.eworm.de/doc/check-health.md + +:global CheckHealthPlugins; + +:set ($CheckHealthPlugins->[ :jobname ]) do={ + :local FuncName [ :tostr $0 ]; + + :global CheckHealthLast; + :global CheckHealthVoltageLow; + :global CheckHealthVoltagePercent; + :global Identity; + + :global FormatLine; + :global IfThenElse; + :global LogPrint; + :global SendNotification2; + :global SymbolForNotification; + + :if ([ :len [ /system/health/find where type="V" ] ] = 0) do={ + $LogPrint debug $FuncName ("Your device does not provide any voltage health values."); + :return false; + } + + :foreach Voltage in=[ /system/health/find where type="V" ] do={ + :local Name [ /system/health/get $Voltage name ]; + :local Value [ /system/health/get $Voltage value ]; + + :if ([ :typeof ($CheckHealthLast->$Name) ] != "nothing") do={ + :local NumCurr [ $TempToNum $Value ]; + :local NumLast [ $TempToNum ($CheckHealthLast->$Name) ]; + + :if ($NumLast * (100 + $CheckHealthVoltagePercent) < $NumCurr * 100 || \ + $NumLast * 100 > $NumCurr * (100 + $CheckHealthVoltagePercent)) do={ + $SendNotification2 ({ origin=$FuncName; \ + subject=([ $SymbolForNotification ("high-voltage-sign,chart-" . [ $IfThenElse ($NumLast < \ + $NumCurr) "in" "de" ] . "creasing") ] . "Health warning: " . $Name); \ + message=("The " . $Name . " on " . $Identity . " jumped more than " . $CheckHealthVoltagePercent . "%.\n\n" . \ + [ $FormatLine "old value" ($CheckHealthLast->$Name . " V") 12 ] . "\n" . \ + [ $FormatLine "new value" ($Value . " V") 12 ]) }); + } else={ + :if ($NumCurr <= $CheckHealthVoltageLow && $NumLast > $CheckHealthVoltageLow) do={ + $SendNotification2 ({ origin=$FuncName; \ + subject=([ $SymbolForNotification "high-voltage-sign,chart-decreasing" ] . "Health warning: Low " . $Name); \ + message=("The " . $Name . " on " . $Identity . " dropped to " . $Value . " V below hard limit.") }); + } + :if ($NumCurr > $CheckHealthVoltageLow && $NumLast <= $CheckHealthVoltageLow) do={ + $SendNotification2 ({ origin=$FuncName; \ + subject=([ $SymbolForNotification "high-voltage-sign,chart-increasing" ] . "Health recovery: Low " . $Name); \ + message=("The " . $Name . " on " . $Identity . " recovered to " . $Value . " V above hard limit.") }); + } + } + } + :set ($CheckHealthLast->$Name) $Value; + } +} diff --git a/check-health.rsc b/check-health.rsc index 34c508c..827f597 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -19,11 +19,6 @@ :global CheckHealthCPUUtilizationNotified; :global CheckHealthLast; :global CheckHealthRAMUtilizationNotified; - :global CheckHealthTemperature; - :global CheckHealthTemperatureDeviation; - :global CheckHealthTemperatureNotified; - :global CheckHealthVoltageLow; - :global CheckHealthVoltagePercent; :global Identity; :global FormatLine; @@ -33,6 +28,7 @@ :global ScriptLock; :global SendNotification2; :global SymbolForNotification; + :global ValidateSyntax; :local TempToNum do={ :global CharacterReplace; @@ -78,105 +74,37 @@ :set CheckHealthRAMUtilizationNotified false; } - :if ([ :len [ /system/health/find ] ] = 0) do={ - $LogPrint debug $ScriptName ("Your device does not provide any health values."); + :local Plugins [ /system/script/find where name~"^check-health.d/." ]; + :if ([ :len $Plugins ] = 0) do={ + $LogPrint debug $ScriptName ("No plugins installed."); :set ExitOK true; :error true; } + :global CheckHealthPlugins ({}); :if ([ :typeof $CheckHealthLast ] != "array") do={ :set CheckHealthLast ({}); } - :if ([ :typeof $CheckHealthTemperatureNotified ] != "array") do={ - :set CheckHealthTemperatureNotified ({}); - } - :foreach Voltage in=[ /system/health/find where type="V" ] do={ - :local Name [ /system/health/get $Voltage name ]; - :local Value [ /system/health/get $Voltage value ]; - - :if ([ :typeof ($CheckHealthLast->$Name) ] != "nothing") do={ - :local NumCurr [ $TempToNum $Value ]; - :local NumLast [ $TempToNum ($CheckHealthLast->$Name) ]; - - :if ($NumLast * (100 + $CheckHealthVoltagePercent) < $NumCurr * 100 || \ - $NumLast * 100 > $NumCurr * (100 + $CheckHealthVoltagePercent)) do={ - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification ("high-voltage-sign,chart-" . [ $IfThenElse ($NumLast < \ - $NumCurr) "in" "de" ] . "creasing") ] . "Health warning: " . $Name); \ - message=("The " . $Name . " on " . $Identity . " jumped more than " . $CheckHealthVoltagePercent . "%.\n\n" . \ - [ $FormatLine "old value" ($CheckHealthLast->$Name . " V") 12 ] . "\n" . \ - [ $FormatLine "new value" ($Value . " V") 12 ]) }); - } else={ - :if ($NumCurr <= $CheckHealthVoltageLow && $NumLast > $CheckHealthVoltageLow) do={ - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "high-voltage-sign,chart-decreasing" ] . "Health warning: Low " . $Name); \ - message=("The " . $Name . " on " . $Identity . " dropped to " . $Value . " V below hard limit.") }); - } - :if ($NumCurr > $CheckHealthVoltageLow && $NumLast <= $CheckHealthVoltageLow) do={ - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "high-voltage-sign,chart-increasing" ] . "Health recovery: Low " . $Name); \ - message=("The " . $Name . " on " . $Identity . " recovered to " . $Value . " V above hard limit.") }); - } + :foreach Plugin in=$Plugins do={ + :local PluginVal [ /system/script/get $Plugin ]; + :if ([ $ValidateSyntax ($PluginVal->"source") ] = true) do={ + :do { + /system/script/run $Plugin; + } on-error={ + $LogPrint error $ScriptName ("Plugin '" . $ScriptVal->"name" . "' failed to run."); } + } else={ + $LogPrint error $ScriptName ("Plugin '" . $ScriptVal->"name" . "' failed syntax validation, skipping."); } - :set ($CheckHealthLast->$Name) $Value; } - :foreach PSU in=[ /system/health/find where name~"^psu.*-state\$" ] do={ - :local Name [ /system/health/get $PSU name ]; - :local Value [ /system/health/get $PSU value ]; - - :if ([ :typeof ($CheckHealthLast->$Name) ] != "nothing") do={ - :if ($CheckHealthLast->$Name = "ok" && \ - $Value != "ok") do={ - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "cross-mark" ] . "Health warning: " . $Name); \ - message=("The power supply unit '" . $Name . "' on " . $Identity . " failed!") }); - } - :if ($CheckHealthLast->$Name != "ok" && \ - $Value = "ok") do={ - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "white-heavy-check-mark" ] . "Health recovery: " . $Name); \ - message=("The power supply unit '" . $Name . "' on " . $Identity . " recovered!") }); - } - } - :set ($CheckHealthLast->$Name) $Value; + :foreach PluginName,Discard in=$CheckHealthPlugins do={ + ($CheckHealthPlugins->$PluginName) \ + ("\$CheckHealthPlugins->\"" . $PluginName . "\""); } - :foreach Temperature in=[ /system/health/find where type="C" ] do={ - :local Name [ /system/health/get $Temperature name ]; - :local Value [ /system/health/get $Temperature value ]; - - :if ([ :typeof ($CheckHealthLast->$Name) ] != "nothing") do={ - :if ([ :typeof ($CheckHealthTemperature->$Name) ] != "num" ) do={ - $LogPrint info $ScriptName ("No threshold given for " . $Name . ", assuming 50C."); - :set ($CheckHealthTemperature->$Name) 50; - } - :local Validate [ /system/health/get [ find where name=$Name ] value ]; - :while ($Value != $Validate) do={ - :set Value $Validate; - :set Validate [ /system/health/get [ find where name=$Name ] value ]; - } - :if ($Value > $CheckHealthTemperature->$Name && \ - $CheckHealthTemperatureNotified->$Name != true) do={ - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "fire" ] . "Health warning: " . $Name); \ - message=("The " . $Name . " on " . $Identity . " is above threshold: " . \ - $Value . "\C2\B0" . "C") }); - :set ($CheckHealthTemperatureNotified->$Name) true; - } - :if ($Value <= ($CheckHealthTemperature->$Name - $CheckHealthTemperatureDeviation) && \ - $CheckHealthTemperatureNotified->$Name = true) do={ - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "white-heavy-check-mark" ] . "Health recovery: " . $Name); \ - message=("The " . $Name . " on " . $Identity . " dropped below threshold: " . \ - $Value . "\C2\B0" . "C") }); - :set ($CheckHealthTemperatureNotified->$Name) false; - } - } - :set ($CheckHealthLast->$Name) $Value; - } + :set CheckHealthPlugins; } on-error={ :global ExitError; $ExitError $ExitOK [ :jobname ]; } diff --git a/doc/check-health.d/notification-08-psu-fail.avif b/doc/check-health.d/notification-08-state-fail.avif similarity index 100% rename from doc/check-health.d/notification-08-psu-fail.avif rename to doc/check-health.d/notification-08-state-fail.avif diff --git a/doc/check-health.d/notification-09-psu-ok.avif b/doc/check-health.d/notification-09-state-ok.avif similarity index 100% rename from doc/check-health.d/notification-09-psu-ok.avif rename to doc/check-health.d/notification-09-state-ok.avif diff --git a/doc/check-health.md b/doc/check-health.md index a945371..51e71bc 100644 --- a/doc/check-health.md +++ b/doc/check-health.md @@ -17,21 +17,21 @@ Description ----------- This script is run from scheduler periodically, sending notification on -health related events: +health related events. Monitoring CPU and RAM utilization (available +processing and memory resources) works on all devices: * high CPU utilization * high RAM utilization (low available RAM) + +With additional plugins functionality can be extended, depending on +sensors available in hardware: + * voltage jumps up or down more than configured threshold * voltage drops below hard lower limit +* fan failed or recovered * power supply failed or recovered * temperature is above or below threshold -Monitoring CPU and RAM utilization (available processing and memory -resources) works on all devices. Other than that only sensors available -in hardware can be checked. See what your hardware supports: - - /system/health/print; - > ⚠️ **Warning**: Note that bad initial state will not trigger an event! For > example rebooting a device that is already too hot will not trigger an > alert on high temperature. @@ -59,8 +59,8 @@ in hardware can be checked. See what your hardware supports: #### PSU state -![check-health notification psu fail](check-health.d/notification-08-psu-fail.avif) -![check-health notification psu ok](check-health.d/notification-09-psu-ok.avif) +![check-health notification state fail](check-health.d/notification-08-state-fail.avif) +![check-health notification state ok](check-health.d/notification-09-state-ok.avif) Requirements and installation ----------------------------- @@ -74,6 +74,30 @@ Just install the script and create a scheduler: > precision of cpu utilization, escpecially on devices with limited > resources. Thus an unusual interval is used here. +### Plugins + +Additional plugins are available for sensors available in hardware. First +check what your hardware supports: + + /system/health/print; + +Then install the plugin for *fan* and *power supply unit* *state*: + + $ScriptInstallUpdate check-health,check-health.d/state; + +... or *temperature*: + + $ScriptInstallUpdate check-health,check-health.d/temperature; + +... or *voltage*: + + $ScriptInstallUpdate check-health,check-health.d/voltage; + +You can also combine the commands and install all or a subset of plugins +in one go: + + $ScriptInstallUpdate check-health,check-health.d/state,check-health.d/temperature,check-health.d/voltage; + Configuration ------------- diff --git a/global-functions.rsc b/global-functions.rsc index a2ec833..8eb6712 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -13,7 +13,7 @@ :local ScriptName [ :jobname ]; # expected configuration version -:global ExpectedConfigVersion 131; +:global ExpectedConfigVersion 132; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 7508b43..c7e566f 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -56,6 +56,7 @@ 129="Extended 'backup-partition' to support RouterOS copy-over - interactively or before feature update."; 130="Dropped intermediate certificates, depending on just root certificates now."; 131="Enhanced certificate download to fallback to mkcert.org, so all (commonly trusted) root certificates are available now."; + 132="Split off plugins from 'check-health', so the script works on all devices to monitor CPU and RAM. The supported plugins for sensors in hardware are installed automatically."; }; # Migration steps to be applied on script updates @@ -64,4 +65,5 @@ 100=":global ScriptInstallUpdate; :if ([ :len [ /system/script/find where name=\"ssh-keys-import\" source~\"^#!rsc by RouterOS\\r?\\n\" ] ] > 0) do={ /system/script/set name=\"mod/ssh-keys-import\" ssh-keys-import; \$ScriptInstallUpdate; }"; 104=":global CharacterReplace; :global ScriptInstallUpdate; :foreach Script in={ \"capsman-download-packages\"; \"capsman-rolling-upgrade\"; \"hotspot-to-wpa\"; \"hotspot-to-wpa-cleanup\" } do={ /system/script/set name=(\$Script . \".capsman\") [ find where name=\$Script ]; :foreach Scheduler in=[ /system/scheduler/find where on-event~(\$Script . \"([^-.]|\\\$)\") ] do={ /system/scheduler/set \$Scheduler on-event=[ \$CharacterReplace [ get \$Scheduler on-event ] \$Script (\$Script . \".capsman\") ]; }; }; /ip/hotspot/user/profile/set on-login=\"hotspot-to-wpa.capsman\" [ find where on-login=\"hotspot-to-wpa\" ]; \$ScriptInstallUpdate;"; 111=":local Rec [ /ip/dns/static/find where comment~\"^managed by dhcp-to-dns for \" ]; :if ([ :len \$Rec ] > 0) do={ /ip/dns/static/remove \$Rec; /system/script/run dhcp-to-dns; }"; + 132=":if ([ :len [ /system/script/find where name=\"check-health\" ] ] > 0) do={ :local Code \":local Install \\\"check-health\\\"; :if ([ :len [ /system/health/find where type=\\\"\\\" name~\\\"-state\\\\\\\$\\\" ] ] > 0) do={ :set Install (\\\$Install . \\\",check-health.d/state\\\"); }; :if ([ :len [ /system/health/find where type=\\\"C\\\" ] ] > 0) do={ :set Install (\\\$Install . \\\",check-health.d/temperature\\\"); }; :if ([ :len [ /system/health/find where type=\\\"V\\\" ] ] > 0) do={ :set Install (\\\$Install . \\\",check-health.d/voltage\\\"); }; :global ScriptInstallUpdate; \\\$ScriptInstallUpdate \\\$Install;\"; :global ValidateSyntax; :if ([ \$ValidateSyntax \$Code ] = true) do={ :do { [ :parse \$Code ]; } on-error={ }; }; }"; }; From 7b660d095293e24bd3fedf2a00815eedec84ccf5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 6 Feb 2025 21:24:20 +0100 Subject: [PATCH 388/893] packages-update: move configuration variables up --- packages-update.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages-update.rsc b/packages-update.rsc index ff47b2a..ba6d4f7 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -16,6 +16,9 @@ :do { :local ScriptName [ :jobname ]; + :global PackagesUpdateDeferReboot; + :global PackagesUpdateBackupFailure; + :global DownloadPackage; :global Grep; :global LogPrint; @@ -24,9 +27,6 @@ :global ScriptLock; :global VersionToNum; - :global PackagesUpdateDeferReboot; - :global PackagesUpdateBackupFailure; - :local Schedule do={ :local ScriptName [ :tostr $1 ]; From dafd95d44a18088771e6e0fd9b2ef115ddbcbc18 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 6 Feb 2025 21:26:39 +0100 Subject: [PATCH 389/893] packages-update: disable random delay for backup --- packages-update.rsc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages-update.rsc b/packages-update.rsc index ba6d4f7..788edd4 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -16,6 +16,7 @@ :do { :local ScriptName [ :jobname ]; + :global BackupRandomDelay; :global PackagesUpdateDeferReboot; :global PackagesUpdateBackupFailure; @@ -79,7 +80,9 @@ :set ($RunOrder->($Store->"order" . "-" . $ScriptVal->"name")) ($ScriptVal->"name"); } + :local BackupRandomDelayBefore $BackupRandomDelay; :foreach Order,Script in=$RunOrder do={ + :set BackupRandomDelay 0; :set PackagesUpdateBackupFailure false; :do { $LogPrint info $ScriptName ("Running backup script " . $Script . " before update."); @@ -87,6 +90,7 @@ } on-error={ :set PackagesUpdateBackupFailure true; } + :set BackupRandomDelay $BackupRandomDelayBefore; :if ($PackagesUpdateBackupFailure = true) do={ $LogPrint warning $ScriptName ("Running backup script " . $Script . " before update failed!"); From dbdc3e4718f5b0ec614baa9a9a942b52cbb19ad4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Feb 2025 17:12:30 +0100 Subject: [PATCH 390/893] packages-update: ignore available packages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This was introduced with RouterOS 7.18beta2 to list and install available packages. We do not want to install all of them. 😝 --- packages-update.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages-update.rsc b/packages-update.rsc index 788edd4..afec2f5 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -130,7 +130,7 @@ } } - :foreach Package in=[ /system/package/find where !bundle ] do={ + :foreach Package in=[ /system/package/find where !bundle !available ] do={ :local PkgName [ /system/package/get $Package name ]; :if ([ $DownloadPackage $PkgName ($Update->"latest-version") ] = false) do={ $LogPrint error $ScriptName ("Download for package " . $PkgName . " failed, update aborted."); From 0fb5fd03230c2054a94d80ca72fc941e21b7f3ff Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Feb 2025 17:36:59 +0100 Subject: [PATCH 391/893] global-functions: $MkDir: create directory directly... ... instead of file inside directory. This requires RouterOS 7.15, so bumping requirement. --- README.md | 2 +- global-functions.rsc | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 8594f58..a76d50f 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ RouterOS Scripts [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/global-functions.rsc b/global-functions.rsc index 8eb6712..48f1676 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, fetch, scheduler # # global functions @@ -895,10 +895,8 @@ } :do { - :local File ($Path . "/file"); - /file/add name=$File; - $WaitForFile $File; - /file/remove $File; + /file/add type="directory" name=$Path; + $WaitForFile $Path; } on-error={ $LogPrint warning $0 ("Making directory '" . $Path . "' failed!"); :return false; From 4542c2b19e4b74ee37c02671c05f4025946d8bf7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 21 Jan 2025 18:16:57 +0100 Subject: [PATCH 392/893] global-functions: introduce $RmFile --- global-functions.rsc | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 48f1676..e41d352 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -63,6 +63,7 @@ :global ProtocolStrip; :global RandomDelay; :global RequiredRouterOS; +:global RmFile; :global ScriptFromTerminal; :global ScriptInstallUpdate; :global ScriptLock; @@ -1004,6 +1005,26 @@ :return true; } +# remove file +:set RmFile do={ + :local FileName [ :tostr $1 ]; + + :global LogPrint; + + :local File [ /file/find where name=$FileName type=file ]; + :if ([ :len $File ] = 0) do={ + :return true; + } + + :do { + /file/remove $File; + } on-error={ + $LogPrint error $0 ("Removing file '" . $FileName . "' (" . $File . ") failed."); + :return false; + } + :return true; +} + # check if script is run from terminal :set ScriptFromTerminal do={ :local Script [ :tostr $1 ]; From 727495d9c4f7ff00a9d0c5dc1fd06e22ba3abe39 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 21 Jan 2025 18:21:28 +0100 Subject: [PATCH 393/893] global-functions: introduce $RmDir --- global-functions.rsc | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index e41d352..b7a3b6a 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -63,6 +63,7 @@ :global ProtocolStrip; :global RandomDelay; :global RequiredRouterOS; +:global RmDir; :global RmFile; :global ScriptFromTerminal; :global ScriptInstallUpdate; @@ -1005,6 +1006,26 @@ :return true; } +# remove directory +:set RmDir do={ + :local DirName [ :tostr $1 ]; + + :global LogPrint; + + :local Dir [ /file/find where name=$DirName type=directory ]; + :if ([ :len $Dir ] = 0) do={ + :return true; + } + + :do { + /file/remove $Dir; + } on-error={ + $LogPrint error $0 ("Removing directory '" . $DirName . "' (" . $Dir . ") failed."); + :return false; + } + :return true; +} + # remove file :set RmFile do={ :local FileName [ :tostr $1 ]; From 7233dea5bb9e73a93599baf17077b80758934665 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 21 Jan 2025 19:24:38 +0100 Subject: [PATCH 394/893] global-functions: $RmFile: add debug output --- global-functions.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index b7a3b6a..50202f0 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1032,8 +1032,11 @@ :global LogPrint; + $LogPrint debug $0 ("Removing file: ". $FileName); + :local File [ /file/find where name=$FileName type=file ]; :if ([ :len $File ] = 0) do={ + $LogPrint debug $0 ("... which does not exist."); :return true; } From 49d9fb1ffddfb973bed00aac3a36bf4dd8d6687a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 21 Jan 2025 19:24:05 +0100 Subject: [PATCH 395/893] global-functions: $RmDir: add debug output --- global-functions.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 50202f0..2799f39 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1012,8 +1012,11 @@ :global LogPrint; + $LogPrint debug $0 ("Removing directory: ". $DirName); + :local Dir [ /file/find where name=$DirName type=directory ]; :if ([ :len $Dir ] = 0) do={ + $LogPrint debug $0 ("... which does not exist."); :return true; } From 4bfb591fa035a12e80edf8f2550f6237cd343cd9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Feb 2025 17:39:48 +0100 Subject: [PATCH 396/893] bump required RouterOS version for all scripts --- BRANCHES.md | 2 +- CERTIFICATES.md | 2 +- CONTRIBUTIONS.md | 2 +- INITIAL-COMMANDS.md | 2 +- accesslist-duplicates.capsman.rsc | 2 +- accesslist-duplicates.local.rsc | 2 +- accesslist-duplicates.template.rsc | 2 +- accesslist-duplicates.wifi.rsc | 2 +- backup-cloud.rsc | 2 +- backup-email.rsc | 2 +- backup-partition.rsc | 2 +- backup-upload.rsc | 2 +- capsman-download-packages.capsman.rsc | 2 +- capsman-download-packages.template.rsc | 2 +- capsman-download-packages.wifi.rsc | 2 +- capsman-rolling-upgrade.capsman.rsc | 2 +- capsman-rolling-upgrade.template.rsc | 2 +- capsman-rolling-upgrade.wifi.rsc | 2 +- certificate-renew-issued.rsc | 2 +- check-certificates.rsc | 2 +- check-health.d/state.rsc | 2 +- check-health.d/temperature.rsc | 2 +- check-health.d/voltage.rsc | 2 +- check-health.rsc | 2 +- check-lte-firmware-upgrade.rsc | 2 +- check-routeros-update.rsc | 2 +- collect-wireless-mac.capsman.rsc | 2 +- collect-wireless-mac.local.rsc | 2 +- collect-wireless-mac.template.rsc | 2 +- collect-wireless-mac.wifi.rsc | 2 +- dhcp-lease-comment.capsman.rsc | 2 +- dhcp-lease-comment.local.rsc | 2 +- dhcp-lease-comment.template.rsc | 2 +- dhcp-lease-comment.wifi.rsc | 2 +- doc/accesslist-duplicates.md | 2 +- doc/backup-cloud.md | 2 +- doc/backup-email.md | 2 +- doc/backup-partition.md | 2 +- doc/backup-upload.md | 2 +- doc/capsman-download-packages.md | 2 +- doc/capsman-rolling-upgrade.md | 2 +- doc/certificate-renew-issued.md | 2 +- doc/check-certificates.md | 2 +- doc/check-health.md | 2 +- doc/check-lte-firmware-upgrade.md | 2 +- doc/check-routeros-update.md | 2 +- doc/collect-wireless-mac.md | 2 +- doc/dhcp-lease-comment.md | 2 +- doc/firmware-upgrade-reboot.md | 2 +- doc/global-wait.md | 2 +- doc/gps-track.md | 2 +- doc/hotspot-to-wpa.md | 2 +- doc/ip-addr-bridge.md | 2 +- doc/ipsec-to-dns.md | 2 +- doc/ipv6-update.md | 2 +- doc/lease-script.md | 2 +- doc/leds-mode.md | 2 +- doc/log-forward.md | 2 +- doc/mod/bridge-port-to.md | 2 +- doc/mod/bridge-port-vlan.md | 2 +- doc/mod/inspectvar.md | 2 +- doc/mod/ipcalc.md | 2 +- doc/mod/notification-email.md | 2 +- doc/mod/notification-matrix.md | 2 +- doc/mod/notification-ntfy.md | 2 +- doc/mod/notification-telegram.md | 2 +- doc/mod/scriptrunonce.md | 2 +- doc/mode-button.md | 2 +- doc/ospf-to-leds.md | 2 +- doc/packages-update.md | 2 +- doc/ppp-on-up.md | 2 +- doc/sms-action.md | 2 +- doc/sms-forward.md | 2 +- doc/super-mario-theme.md | 2 +- doc/unattended-lte-firmware-upgrade.md | 2 +- doc/update-gre-address.md | 2 +- doc/update-tunnelbroker.md | 2 +- firmware-upgrade-reboot.rsc | 2 +- global-wait.rsc | 2 +- gps-track.rsc | 2 +- hotspot-to-wpa-cleanup.capsman.rsc | 2 +- hotspot-to-wpa-cleanup.template.rsc | 2 +- hotspot-to-wpa-cleanup.wifi.rsc | 2 +- hotspot-to-wpa.capsman.rsc | 2 +- hotspot-to-wpa.template.rsc | 2 +- hotspot-to-wpa.wifi.rsc | 2 +- ipsec-to-dns.rsc | 2 +- ipv6-update.rsc | 2 +- lease-script.rsc | 2 +- log-forward.rsc | 2 +- mod/bridge-port-to.rsc | 2 +- mod/bridge-port-vlan.rsc | 2 +- mod/inspectvar.rsc | 2 +- mod/ipcalc.rsc | 2 +- mod/notification-email.rsc | 2 +- mod/notification-matrix.rsc | 2 +- mod/notification-ntfy.rsc | 2 +- mod/notification-telegram.rsc | 2 +- mod/scriptrunonce.rsc | 2 +- mode-button.rsc | 2 +- ospf-to-leds.rsc | 2 +- packages-update.rsc | 2 +- ppp-on-up.rsc | 2 +- sms-action.rsc | 2 +- sms-forward.rsc | 2 +- unattended-lte-firmware-upgrade.rsc | 2 +- update-gre-address.rsc | 2 +- update-tunnelbroker.rsc | 2 +- 108 files changed, 108 insertions(+), 108 deletions(-) diff --git a/BRANCHES.md b/BRANCHES.md index 5d94077..8a0bdad 100644 --- a/BRANCHES.md +++ b/BRANCHES.md @@ -4,7 +4,7 @@ Installing from branches [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/CERTIFICATES.md b/CERTIFICATES.md index 589d480..5432d78 100644 --- a/CERTIFICATES.md +++ b/CERTIFICATES.md @@ -4,7 +4,7 @@ Certificate name from browser [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index ef1bd8b..0b35c40 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -4,7 +4,7 @@ Past Contributions [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 84a88fe..424ef32 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -4,7 +4,7 @@ Initial commands [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/accesslist-duplicates.capsman.rsc b/accesslist-duplicates.capsman.rsc index 0c4eaaf..27546c8 100644 --- a/accesslist-duplicates.capsman.rsc +++ b/accesslist-duplicates.capsman.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # print duplicate antries in wireless access list # https://rsc.eworm.de/doc/accesslist-duplicates.md diff --git a/accesslist-duplicates.local.rsc b/accesslist-duplicates.local.rsc index 353fe1f..589815d 100644 --- a/accesslist-duplicates.local.rsc +++ b/accesslist-duplicates.local.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # print duplicate antries in wireless access list # https://rsc.eworm.de/doc/accesslist-duplicates.md diff --git a/accesslist-duplicates.template.rsc b/accesslist-duplicates.template.rsc index 4219014..ccbca3d 100644 --- a/accesslist-duplicates.template.rsc +++ b/accesslist-duplicates.template.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # print duplicate antries in wireless access list # https://rsc.eworm.de/doc/accesslist-duplicates.md diff --git a/accesslist-duplicates.wifi.rsc b/accesslist-duplicates.wifi.rsc index 3ee53d8..527ebb4 100644 --- a/accesslist-duplicates.wifi.rsc +++ b/accesslist-duplicates.wifi.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # print duplicate antries in wireless access list # https://rsc.eworm.de/doc/accesslist-duplicates.md diff --git a/backup-cloud.rsc b/backup-cloud.rsc index efae055..9d76080 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: backup-script, order=40 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # upload backup to MikroTik cloud # https://rsc.eworm.de/doc/backup-cloud.md diff --git a/backup-email.rsc b/backup-email.rsc index f6ebad0..d097301 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: backup-script, order=20 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # create and email backup and config file # https://rsc.eworm.de/doc/backup-email.md diff --git a/backup-partition.rsc b/backup-partition.rsc index bfa7765..1f0cf2e 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: backup-script, order=70 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, scheduler # # save configuration to fallback partition diff --git a/backup-upload.rsc b/backup-upload.rsc index dc5120f..533cc55 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: backup-script, order=50 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, fetch # # create and upload backup and config file diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index fa76ff5..2726af7 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # download and cleanup packages for CAP installation from CAPsMAN # https://rsc.eworm.de/doc/capsman-download-packages.md diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index 912e279..0a42bb2 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # download and cleanup packages for CAP installation from CAPsMAN # https://rsc.eworm.de/doc/capsman-download-packages.md diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 3a5e7d1..037409a 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # download and cleanup packages for CAP installation from CAPsMAN # https://rsc.eworm.de/doc/capsman-download-packages.md diff --git a/capsman-rolling-upgrade.capsman.rsc b/capsman-rolling-upgrade.capsman.rsc index abe066e..791b3db 100644 --- a/capsman-rolling-upgrade.capsman.rsc +++ b/capsman-rolling-upgrade.capsman.rsc @@ -5,7 +5,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: capsman-rolling-upgrade.capsman -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # upgrade CAPs one after another # https://rsc.eworm.de/doc/capsman-rolling-upgrade.md diff --git a/capsman-rolling-upgrade.template.rsc b/capsman-rolling-upgrade.template.rsc index c1c7ff1..0b1cc2b 100644 --- a/capsman-rolling-upgrade.template.rsc +++ b/capsman-rolling-upgrade.template.rsc @@ -5,7 +5,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: capsman-rolling-upgrade%TEMPL% -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # upgrade CAPs one after another # https://rsc.eworm.de/doc/capsman-rolling-upgrade.md diff --git a/capsman-rolling-upgrade.wifi.rsc b/capsman-rolling-upgrade.wifi.rsc index 44c99db..4afdee2 100644 --- a/capsman-rolling-upgrade.wifi.rsc +++ b/capsman-rolling-upgrade.wifi.rsc @@ -5,7 +5,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: capsman-rolling-upgrade.wifi -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # upgrade CAPs one after another # https://rsc.eworm.de/doc/capsman-rolling-upgrade.md diff --git a/certificate-renew-issued.rsc b/certificate-renew-issued.rsc index 5a4043d..91a48de 100644 --- a/certificate-renew-issued.rsc +++ b/certificate-renew-issued.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # renew locally issued certificates # https://rsc.eworm.de/doc/certificate-renew-issued.md diff --git a/check-certificates.rsc b/check-certificates.rsc index 34e7537..25807cb 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, fetch # # check for certificate validity diff --git a/check-health.d/state.rsc b/check-health.d/state.rsc index bcc1fbc..2991935 100644 --- a/check-health.d/state.rsc +++ b/check-health.d/state.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # check for RouterOS health state - state plugin # https://rsc.eworm.de/doc/check-health.md diff --git a/check-health.d/temperature.rsc b/check-health.d/temperature.rsc index 9b84782..a2f632d 100644 --- a/check-health.d/temperature.rsc +++ b/check-health.d/temperature.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # check for RouterOS health state - temperature plugin # https://rsc.eworm.de/doc/check-health.md diff --git a/check-health.d/voltage.rsc b/check-health.d/voltage.rsc index 6394795..9071c88 100644 --- a/check-health.d/voltage.rsc +++ b/check-health.d/voltage.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # check for RouterOS health state - voltage plugin # https://rsc.eworm.de/doc/check-health.md diff --git a/check-health.rsc b/check-health.rsc index 827f597..f02a249 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # check for RouterOS health state # https://rsc.eworm.de/doc/check-health.md diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index 562b8fe..c5b6cb5 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # check for LTE firmware upgrade, send notification # https://rsc.eworm.de/doc/check-lte-firmware-upgrade.md diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 5c9b392..361be34 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, fetch, scheduler # # check for RouterOS update, send notification and/or install diff --git a/collect-wireless-mac.capsman.rsc b/collect-wireless-mac.capsman.rsc index f718e0b..17e09e3 100644 --- a/collect-wireless-mac.capsman.rsc +++ b/collect-wireless-mac.capsman.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=40 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # collect wireless mac adresses in access list # https://rsc.eworm.de/doc/collect-wireless-mac.md diff --git a/collect-wireless-mac.local.rsc b/collect-wireless-mac.local.rsc index 0017875..4a38bfa 100644 --- a/collect-wireless-mac.local.rsc +++ b/collect-wireless-mac.local.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=40 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # collect wireless mac adresses in access list # https://rsc.eworm.de/doc/collect-wireless-mac.md diff --git a/collect-wireless-mac.template.rsc b/collect-wireless-mac.template.rsc index 527e985..da901be 100644 --- a/collect-wireless-mac.template.rsc +++ b/collect-wireless-mac.template.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=40 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # collect wireless mac adresses in access list # https://rsc.eworm.de/doc/collect-wireless-mac.md diff --git a/collect-wireless-mac.wifi.rsc b/collect-wireless-mac.wifi.rsc index 5f9de7d..cb217ce 100644 --- a/collect-wireless-mac.wifi.rsc +++ b/collect-wireless-mac.wifi.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=40 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # collect wireless mac adresses in access list # https://rsc.eworm.de/doc/collect-wireless-mac.md diff --git a/dhcp-lease-comment.capsman.rsc b/dhcp-lease-comment.capsman.rsc index 3803963..36b31c8 100644 --- a/dhcp-lease-comment.capsman.rsc +++ b/dhcp-lease-comment.capsman.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=60 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # update dhcp-server lease comment with infos from access-list # https://rsc.eworm.de/doc/dhcp-lease-comment.md diff --git a/dhcp-lease-comment.local.rsc b/dhcp-lease-comment.local.rsc index d5f1461..35dc6f6 100644 --- a/dhcp-lease-comment.local.rsc +++ b/dhcp-lease-comment.local.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=60 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # update dhcp-server lease comment with infos from access-list # https://rsc.eworm.de/doc/dhcp-lease-comment.md diff --git a/dhcp-lease-comment.template.rsc b/dhcp-lease-comment.template.rsc index 2bddc26..47a8554 100644 --- a/dhcp-lease-comment.template.rsc +++ b/dhcp-lease-comment.template.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=60 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # update dhcp-server lease comment with infos from access-list # https://rsc.eworm.de/doc/dhcp-lease-comment.md diff --git a/dhcp-lease-comment.wifi.rsc b/dhcp-lease-comment.wifi.rsc index 515b438..e0f9785 100644 --- a/dhcp-lease-comment.wifi.rsc +++ b/dhcp-lease-comment.wifi.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=60 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # update dhcp-server lease comment with infos from access-list # https://rsc.eworm.de/doc/dhcp-lease-comment.md diff --git a/doc/accesslist-duplicates.md b/doc/accesslist-duplicates.md index a6302f5..e4d0c7f 100644 --- a/doc/accesslist-duplicates.md +++ b/doc/accesslist-duplicates.md @@ -4,7 +4,7 @@ Find and remove access list duplicates [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/backup-cloud.md b/doc/backup-cloud.md index d658760..7286960 100644 --- a/doc/backup-cloud.md +++ b/doc/backup-cloud.md @@ -4,7 +4,7 @@ Upload backup to Mikrotik cloud [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/backup-email.md b/doc/backup-email.md index aedae4d..7b8bcfe 100644 --- a/doc/backup-email.md +++ b/doc/backup-email.md @@ -4,7 +4,7 @@ Send backup via e-mail [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/backup-partition.md b/doc/backup-partition.md index 9f62967..9d615a5 100644 --- a/doc/backup-partition.md +++ b/doc/backup-partition.md @@ -4,7 +4,7 @@ Save configuration to fallback partition [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/backup-upload.md b/doc/backup-upload.md index f2858b2..6a5b0e4 100644 --- a/doc/backup-upload.md +++ b/doc/backup-upload.md @@ -4,7 +4,7 @@ Upload backup to server [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/capsman-download-packages.md b/doc/capsman-download-packages.md index d719934..5722227 100644 --- a/doc/capsman-download-packages.md +++ b/doc/capsman-download-packages.md @@ -4,7 +4,7 @@ Download packages for CAP upgrade from CAPsMAN [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/capsman-rolling-upgrade.md b/doc/capsman-rolling-upgrade.md index f366d40..d277db6 100644 --- a/doc/capsman-rolling-upgrade.md +++ b/doc/capsman-rolling-upgrade.md @@ -4,7 +4,7 @@ Run rolling CAP upgrades from CAPsMAN [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/certificate-renew-issued.md b/doc/certificate-renew-issued.md index 096e07b..c4615b5 100644 --- a/doc/certificate-renew-issued.md +++ b/doc/certificate-renew-issued.md @@ -4,7 +4,7 @@ Renew locally issued certificates [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/check-certificates.md b/doc/check-certificates.md index 4188815..4c144ba 100644 --- a/doc/check-certificates.md +++ b/doc/check-certificates.md @@ -4,7 +4,7 @@ Renew certificates and notify on expiration [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/check-health.md b/doc/check-health.md index 51e71bc..7cf0c33 100644 --- a/doc/check-health.md +++ b/doc/check-health.md @@ -4,7 +4,7 @@ Notify about health state [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/check-lte-firmware-upgrade.md b/doc/check-lte-firmware-upgrade.md index 66b2cf5..3693b71 100644 --- a/doc/check-lte-firmware-upgrade.md +++ b/doc/check-lte-firmware-upgrade.md @@ -4,7 +4,7 @@ Notify on LTE firmware upgrade [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/check-routeros-update.md b/doc/check-routeros-update.md index 2e9b8aa..926b4aa 100644 --- a/doc/check-routeros-update.md +++ b/doc/check-routeros-update.md @@ -4,7 +4,7 @@ Notify on RouterOS update [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/collect-wireless-mac.md b/doc/collect-wireless-mac.md index 84c111d..0197522 100644 --- a/doc/collect-wireless-mac.md +++ b/doc/collect-wireless-mac.md @@ -4,7 +4,7 @@ Collect MAC addresses in wireless access list [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/dhcp-lease-comment.md b/doc/dhcp-lease-comment.md index 6a4c930..b02f199 100644 --- a/doc/dhcp-lease-comment.md +++ b/doc/dhcp-lease-comment.md @@ -4,7 +4,7 @@ Comment DHCP leases with info from access list [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/firmware-upgrade-reboot.md b/doc/firmware-upgrade-reboot.md index 7ab6ac5..54f1da0 100644 --- a/doc/firmware-upgrade-reboot.md +++ b/doc/firmware-upgrade-reboot.md @@ -4,7 +4,7 @@ Automatically upgrade firmware and reboot [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/global-wait.md b/doc/global-wait.md index 6787d20..799cae7 100644 --- a/doc/global-wait.md +++ b/doc/global-wait.md @@ -4,7 +4,7 @@ Wait for global functions and modules [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/gps-track.md b/doc/gps-track.md index 9685899..5e4878f 100644 --- a/doc/gps-track.md +++ b/doc/gps-track.md @@ -4,7 +4,7 @@ Send GPS position to server [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/hotspot-to-wpa.md b/doc/hotspot-to-wpa.md index 07d07dc..a2e9748 100644 --- a/doc/hotspot-to-wpa.md +++ b/doc/hotspot-to-wpa.md @@ -4,7 +4,7 @@ Use WPA network with hotspot credentials [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ip-addr-bridge.md b/doc/ip-addr-bridge.md index ddbcc0a..f9f98e3 100644 --- a/doc/ip-addr-bridge.md +++ b/doc/ip-addr-bridge.md @@ -4,7 +4,7 @@ Manage IP addresses with bridge status [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ipsec-to-dns.md b/doc/ipsec-to-dns.md index a688e80..123656c 100644 --- a/doc/ipsec-to-dns.md +++ b/doc/ipsec-to-dns.md @@ -4,7 +4,7 @@ Create DNS records for IPSec peers [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ipv6-update.md b/doc/ipv6-update.md index 42f0fe4..1f009b1 100644 --- a/doc/ipv6-update.md +++ b/doc/ipv6-update.md @@ -4,7 +4,7 @@ Update configuration on IPv6 prefix change [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/lease-script.md b/doc/lease-script.md index 1b59ff7..f83c383 100644 --- a/doc/lease-script.md +++ b/doc/lease-script.md @@ -4,7 +4,7 @@ Run other scripts on DHCP lease [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/leds-mode.md b/doc/leds-mode.md index c01472e..a194396 100644 --- a/doc/leds-mode.md +++ b/doc/leds-mode.md @@ -4,7 +4,7 @@ Manage LEDs dark mode [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/log-forward.md b/doc/log-forward.md index 55b1540..25be00a 100644 --- a/doc/log-forward.md +++ b/doc/log-forward.md @@ -4,7 +4,7 @@ Forward log messages via notification [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/bridge-port-to.md b/doc/mod/bridge-port-to.md index 2ed9dc7..629c526 100644 --- a/doc/mod/bridge-port-to.md +++ b/doc/mod/bridge-port-to.md @@ -4,7 +4,7 @@ Manage ports in bridge [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/bridge-port-vlan.md b/doc/mod/bridge-port-vlan.md index ded2603..cf29199 100644 --- a/doc/mod/bridge-port-vlan.md +++ b/doc/mod/bridge-port-vlan.md @@ -4,7 +4,7 @@ Manage VLANs on bridge ports [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/inspectvar.md b/doc/mod/inspectvar.md index 4e2f4c1..7daba15 100644 --- a/doc/mod/inspectvar.md +++ b/doc/mod/inspectvar.md @@ -4,7 +4,7 @@ Inspect variables [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/ipcalc.md b/doc/mod/ipcalc.md index 9f39429..c07853e 100644 --- a/doc/mod/ipcalc.md +++ b/doc/mod/ipcalc.md @@ -4,7 +4,7 @@ IP address calculation [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/notification-email.md b/doc/mod/notification-email.md index 0bef455..34d1c09 100644 --- a/doc/mod/notification-email.md +++ b/doc/mod/notification-email.md @@ -4,7 +4,7 @@ Send notifications via e-mail [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/notification-matrix.md b/doc/mod/notification-matrix.md index fbc9b91..89c1b01 100644 --- a/doc/mod/notification-matrix.md +++ b/doc/mod/notification-matrix.md @@ -4,7 +4,7 @@ Send notifications via Matrix [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/notification-ntfy.md b/doc/mod/notification-ntfy.md index 04dee35..51756ac 100644 --- a/doc/mod/notification-ntfy.md +++ b/doc/mod/notification-ntfy.md @@ -4,7 +4,7 @@ Send notifications via Ntfy [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/notification-telegram.md b/doc/mod/notification-telegram.md index f55f936..b85d09c 100644 --- a/doc/mod/notification-telegram.md +++ b/doc/mod/notification-telegram.md @@ -4,7 +4,7 @@ Send notifications via Telegram [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mod/scriptrunonce.md b/doc/mod/scriptrunonce.md index 0127c6d..955d12e 100644 --- a/doc/mod/scriptrunonce.md +++ b/doc/mod/scriptrunonce.md @@ -4,7 +4,7 @@ Download script and run it once [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/mode-button.md b/doc/mode-button.md index 7feb19f..be15bc9 100644 --- a/doc/mode-button.md +++ b/doc/mode-button.md @@ -4,7 +4,7 @@ Mode button with multiple presses [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ospf-to-leds.md b/doc/ospf-to-leds.md index 23248b5..3694d35 100644 --- a/doc/ospf-to-leds.md +++ b/doc/ospf-to-leds.md @@ -4,7 +4,7 @@ Visualize OSPF state via LEDs [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/packages-update.md b/doc/packages-update.md index 8b0d4a3..75225fe 100644 --- a/doc/packages-update.md +++ b/doc/packages-update.md @@ -4,7 +4,7 @@ Manage system update [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/ppp-on-up.md b/doc/ppp-on-up.md index 7902f3b..305afc1 100644 --- a/doc/ppp-on-up.md +++ b/doc/ppp-on-up.md @@ -4,7 +4,7 @@ Run scripts on ppp connection [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/sms-action.md b/doc/sms-action.md index 5de7f0d..b696c85 100644 --- a/doc/sms-action.md +++ b/doc/sms-action.md @@ -4,7 +4,7 @@ Act on received SMS [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/sms-forward.md b/doc/sms-forward.md index 8e7417b..ccb6482 100644 --- a/doc/sms-forward.md +++ b/doc/sms-forward.md @@ -4,7 +4,7 @@ Forward received SMS [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/super-mario-theme.md b/doc/super-mario-theme.md index 2ffb25b..c72f220 100644 --- a/doc/super-mario-theme.md +++ b/doc/super-mario-theme.md @@ -4,7 +4,7 @@ Play Super Mario theme [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/unattended-lte-firmware-upgrade.md b/doc/unattended-lte-firmware-upgrade.md index e9a888c..cb96aa1 100644 --- a/doc/unattended-lte-firmware-upgrade.md +++ b/doc/unattended-lte-firmware-upgrade.md @@ -4,7 +4,7 @@ Install LTE firmware upgrade [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/update-gre-address.md b/doc/update-gre-address.md index 7e101c4..de9f622 100644 --- a/doc/update-gre-address.md +++ b/doc/update-gre-address.md @@ -4,7 +4,7 @@ Update GRE configuration with dynamic addresses [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/doc/update-tunnelbroker.md b/doc/update-tunnelbroker.md index 126d470..ee0fe98 100644 --- a/doc/update-tunnelbroker.md +++ b/doc/update-tunnelbroker.md @@ -4,7 +4,7 @@ Update tunnelbroker configuration [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.14-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) diff --git a/firmware-upgrade-reboot.rsc b/firmware-upgrade-reboot.rsc index e3d62de..86a9a8c 100644 --- a/firmware-upgrade-reboot.rsc +++ b/firmware-upgrade-reboot.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2022-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # install firmware upgrade, and reboot # https://rsc.eworm.de/doc/firmware-upgrade-reboot.md diff --git a/global-wait.rsc b/global-wait.rsc index bc98462..ca3fc0c 100644 --- a/global-wait.rsc +++ b/global-wait.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # wait for global-functions to finish # https://rsc.eworm.de/doc/global-wait.md diff --git a/gps-track.rsc b/gps-track.rsc index 5e35f8d..dea56d2 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, fetch # # track gps data by sending json data to http server diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index c21ec3e..033d0e7 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=80 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, hotspot # # manage and clean up private WPA passphrase after hotspot login diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index 1bd877e..0f8c490 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=80 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, hotspot # # manage and clean up private WPA passphrase after hotspot login diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index 8e36204..dfec697 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -4,7 +4,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: lease-script, order=80 -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, hotspot # # manage and clean up private WPA passphrase after hotspot login diff --git a/hotspot-to-wpa.capsman.rsc b/hotspot-to-wpa.capsman.rsc index de9f9d9..3f51475 100644 --- a/hotspot-to-wpa.capsman.rsc +++ b/hotspot-to-wpa.capsman.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, hotspot # # add private WPA passphrase after hotspot login diff --git a/hotspot-to-wpa.template.rsc b/hotspot-to-wpa.template.rsc index 003b12e..068241d 100644 --- a/hotspot-to-wpa.template.rsc +++ b/hotspot-to-wpa.template.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, hotspot # # add private WPA passphrase after hotspot login diff --git a/hotspot-to-wpa.wifi.rsc b/hotspot-to-wpa.wifi.rsc index 0d6a7b9..cc5e2fc 100644 --- a/hotspot-to-wpa.wifi.rsc +++ b/hotspot-to-wpa.wifi.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, hotspot # # add private WPA passphrase after hotspot login diff --git a/ipsec-to-dns.rsc b/ipsec-to-dns.rsc index 91f6b45..26dab0a 100644 --- a/ipsec-to-dns.rsc +++ b/ipsec-to-dns.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2021-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, ipsec # # and add/remove/update DNS entries from IPSec mode-config diff --git a/ipv6-update.rsc b/ipv6-update.rsc index 7eb625b..c6e3d65 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # update firewall and dns settings on IPv6 prefix change # https://rsc.eworm.de/doc/ipv6-update.md diff --git a/lease-script.rsc b/lease-script.rsc index b6ceac9..bf27fda 100644 --- a/lease-script.rsc +++ b/lease-script.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # run scripts on DHCP lease # https://rsc.eworm.de/doc/lease-script.md diff --git a/log-forward.rsc b/log-forward.rsc index 379fa54..58ec956 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # forward log messages via notification # https://rsc.eworm.de/doc/log-forward.md diff --git a/mod/bridge-port-to.rsc b/mod/bridge-port-to.rsc index f00e10b..39a036e 100644 --- a/mod/bridge-port-to.rsc +++ b/mod/bridge-port-to.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # reset bridge ports to default bridge # https://rsc.eworm.de/doc/mod/bridge-port-to.md diff --git a/mod/bridge-port-vlan.rsc b/mod/bridge-port-vlan.rsc index 62e71e3..0eeb9b5 100644 --- a/mod/bridge-port-vlan.rsc +++ b/mod/bridge-port-vlan.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # manage VLANs on bridge ports # https://rsc.eworm.de/doc/mod/bridge-port-vlan.md diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index 0f05da7..c861557 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # inspect variables # https://rsc.eworm.de/doc/mod/inspectvar.md diff --git a/mod/ipcalc.rsc b/mod/ipcalc.rsc index fbed74b..477cf4a 100644 --- a/mod/ipcalc.rsc +++ b/mod/ipcalc.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # ip address calculation # https://rsc.eworm.de/doc/mod/ipcalc.md diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index 404e74d..7b89d98 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, email, scheduler # # send notifications via e-mail diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index 9b2b641..e989ee0 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -4,7 +4,7 @@ # Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, fetch, scheduler # # send notifications via Matrix diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 212fde2..aac6d6c 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, fetch, scheduler # # send notifications via Ntfy (ntfy.sh) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index c3ef2dd..23ef942 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, fetch, scheduler # # send notifications via Telegram diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index e5368c4..b158c9c 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, fetch # # download script and run it once diff --git a/mode-button.rsc b/mode-button.rsc index 4cf5e75..edc5f40 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, scheduler # # act on multiple mode and reset button presses diff --git a/ospf-to-leds.rsc b/ospf-to-leds.rsc index 9d822c1..a8662b3 100644 --- a/ospf-to-leds.rsc +++ b/ospf-to-leds.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2020-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # visualize ospf instance state via leds # https://rsc.eworm.de/doc/ospf-to-leds.md diff --git a/packages-update.rsc b/packages-update.rsc index afec2f5..b11596e 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2019-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, scheduler # # download packages and reboot for installation diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index 85e9689..e09bd9d 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # run scripts on ppp up # https://rsc.eworm.de/doc/ppp-on-up.md diff --git a/sms-action.rsc b/sms-action.rsc index 34d2127..3c8307a 100644 --- a/sms-action.rsc +++ b/sms-action.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # run action on received SMS # https://rsc.eworm.de/doc/sms-action.md diff --git a/sms-forward.rsc b/sms-forward.rsc index 654fd56..8169022 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -4,7 +4,7 @@ # Anatoly Bubenkov # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # forward SMS to e-mail # https://rsc.eworm.de/doc/sms-forward.md diff --git a/unattended-lte-firmware-upgrade.rsc b/unattended-lte-firmware-upgrade.rsc index 74495d1..83925fd 100644 --- a/unattended-lte-firmware-upgrade.rsc +++ b/unattended-lte-firmware-upgrade.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2018-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, scheduler # # schedule unattended lte firmware upgrade diff --git a/update-gre-address.rsc b/update-gre-address.rsc index 6b169a0..cddfa92 100644 --- a/update-gre-address.rsc +++ b/update-gre-address.rsc @@ -3,7 +3,7 @@ # Copyright (c) 2013-2025 Christian Hesse # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # # update gre interface remote address with dynamic address from # ipsec remote peer diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index a58589b..45afa6f 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -5,7 +5,7 @@ # https://rsc.eworm.de/COPYING.md # # provides: ppp-on-up -# requires RouterOS, version=7.14 +# requires RouterOS, version=7.15 # requires device-mode, fetch # # update local address of tunnelbroker interface From a8e5b5226bc6a11a0ccbca0f3becc85f9f4904e3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Feb 2025 11:04:09 +0100 Subject: [PATCH 397/893] global-functions: $RmFile: fail on wrong type --- global-functions.rsc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 2799f39..ac37dee 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1037,6 +1037,11 @@ $LogPrint debug $0 ("Removing file: ". $FileName); + :if ([ :len [ /file/find where name=$FileName type!=file ] ] > 0) do={ + $LogPrint error $0 ("File '" . $FileName . "' is not a file."); + :return false; + } + :local File [ /file/find where name=$FileName type=file ]; :if ([ :len $File ] = 0) do={ $LogPrint debug $0 ("... which does not exist."); From 82020ddd73163194eb75aaa6f57d8e41597a7e6f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Feb 2025 11:03:34 +0100 Subject: [PATCH 398/893] global-functions: $RmDir: fail on wrong type --- global-functions.rsc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index ac37dee..cf278eb 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1014,6 +1014,11 @@ $LogPrint debug $0 ("Removing directory: ". $DirName); + :if ([ :len [ /file/find where name=$DirName type!=directory ] ] > 0) do={ + $LogPrint error $0 ("Directory '" . $DirName . "' is not a directory."); + :return false; + } + :local Dir [ /file/find where name=$DirName type=directory ]; :if ([ :len $Dir ] = 0) do={ $LogPrint debug $0 ("... which does not exist."); From dbdf2952443ada35695925628999db4ddbe80be0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 21 Jan 2025 18:33:35 +0100 Subject: [PATCH 399/893] global-functions: $CertificateDownload: use $RmFile --- global-functions.rsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index cf278eb..782c1a3 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -149,6 +149,7 @@ :global CleanName; :global FetchUserAgentStr; :global LogPrint; + :global RmFile; :global WaitForFile; $LogPrint info $0 ("Downloading and importing certificate with " . \ @@ -172,7 +173,7 @@ dst-path=$FileName as-value; $WaitForFile $FileName; :if ([ /file/get $FileName size ] = 0) do={ - /file/remove $FileName; + $RmFile $FileName; :error false; } } on-error={ @@ -183,7 +184,7 @@ /certificate/import file-name=$FileName passphrase="" as-value; :delay 1s; - /file/remove [ find where name=$FileName ]; + $RmFile $FileName; :if ([ :len [ /certificate/find where common-name=$CommonName ] ] = 0) do={ /certificate/remove [ find where name~("^" . $FileName . "_[0-9]+\$") ]; From ea8ec6b580071d832df28fd78a9e3c4c07a17bef Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 21 Jan 2025 18:35:39 +0100 Subject: [PATCH 400/893] global-functions: $DownloadPackage: use $RmFile --- global-functions.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 782c1a3..b19ec56 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -343,6 +343,7 @@ :global CleanFilePath; :global LogPrint; :global MkDir; + :global RmFile; :global WaitForFile; :if ([ :len $PkgName ] = 0) do={ :return false; } @@ -386,7 +387,7 @@ $LogPrint debug $0 ("Downloading package file failed."); } - /file/remove [ find where name=$PkgDest ]; + $RmFile $PkgDest; :set Retry ($Retry - 1); } From d19b90df08dd179163c501a08d53eaf15bc53f15 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 21 Jan 2025 18:37:01 +0100 Subject: [PATCH 401/893] global-functions: $FetchHuge: use $RmFile --- global-functions.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index b19ec56..ab6610e 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -457,6 +457,7 @@ :global IfThenElse; :global LogPrint; :global MkDir; + :global RmFile; :global WaitForFile; :set CheckCert [ $IfThenElse ($CheckCert = "false") "no" "yes-without-crl" ]; @@ -473,7 +474,7 @@ http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) as-value; } on-error={ :if ([ $WaitForFile $FileName 500ms ] = true) do={ - /file/remove $FileName; + $RmFile $FileName; } $LogPrint debug $0 ("Failed downloading from: " . $Url); /file/remove $DirName; From 4760515add1f753af7596245eb1a6c560ea37031 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 21 Jan 2025 18:38:09 +0100 Subject: [PATCH 402/893] global-functions: $FetchHuge: use $RmDir --- global-functions.rsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index ab6610e..e680b60 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -457,6 +457,7 @@ :global IfThenElse; :global LogPrint; :global MkDir; + :global RmDir; :global RmFile; :global WaitForFile; @@ -477,7 +478,7 @@ $RmFile $FileName; } $LogPrint debug $0 ("Failed downloading from: " . $Url); - /file/remove $DirName; + $RmDir $DirName; :return false; } $WaitForFile $FileName; @@ -493,7 +494,7 @@ :delay 100ms; } } - /file/remove $DirName; + $RmDir $DirName; :return $Return; } From f5f00b70e325d80db939dcc2aa885b80845566fa Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 21 Jan 2025 18:41:58 +0100 Subject: [PATCH 403/893] global-functions: $MkDir: use $RmDir --- global-functions.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index e680b60..4b1f63d 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -857,6 +857,7 @@ :global CleanFilePath; :global LogPrint; + :global RmDir; :global WaitForFile; :local MkTmpfs do={ @@ -873,7 +874,7 @@ } $LogPrint info $0 ("Creating disk of type tmpfs."); - /file/remove [ find where name="tmpfs" type="directory" ]; + $RmDir "tmpfs"; :do { /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource/get total-memory ] / 3); $WaitForFile "tmpfs"; From d748b69142a8b2b2d4328ef0e07dabe01fdbc01e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Feb 2025 16:13:43 +0100 Subject: [PATCH 404/893] backup-cloud: use $RmDir --- backup-cloud.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index 9d76080..c4e23b2 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -26,6 +26,7 @@ :global LogPrint; :global MkDir; :global RandomDelay; + :global RmDir; :global ScriptFromTerminal; :global ScriptLock; :global SendNotification2; @@ -97,7 +98,7 @@ $LogPrint error $ScriptName ("Failed uploading backup for " . $Identity . " to cloud!"); :set PackagesUpdateBackupFailure true; } - /file/remove "tmpfs/backup-cloud"; + $RmDir "tmpfs/backup-cloud"; } on-error={ :global ExitError; $ExitError $ExitOK [ :jobname ]; } From 81ba47a07d97a4cc36fc020cf35de7656e2abbb2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Feb 2025 16:10:46 +0100 Subject: [PATCH 405/893] backup-upload: use $RmDir --- backup-upload.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backup-upload.rsc b/backup-upload.rsc index 533cc55..7f15a86 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -35,6 +35,7 @@ :global LogPrint; :global MkDir; :global RandomDelay; + :global RmDir; :global ScriptFromTerminal; :global ScriptLock; :global SendNotification2; @@ -170,7 +171,7 @@ :if ($Failed = 1) do={ :set PackagesUpdateBackupFailure true; } - /file/remove $DirName; + $RmDir $DirName; } on-error={ :global ExitError; $ExitError $ExitOK [ :jobname ]; } From 88ff03136805f40f14bb5d39af370c0ace62c4e7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Feb 2025 16:10:05 +0100 Subject: [PATCH 406/893] backup-upload: use $RmFile --- backup-upload.rsc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/backup-upload.rsc b/backup-upload.rsc index 7f15a86..14c3914 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -36,6 +36,7 @@ :global MkDir; :global RandomDelay; :global RmDir; + :global RmFile; :global ScriptFromTerminal; :global ScriptLock; :global SendNotification2; @@ -100,7 +101,7 @@ :set Failed 1; } - /file/remove ($FilePath . ".backup"); + $RmFile ($FilePath . ".backup"); } # create configuration export @@ -119,7 +120,7 @@ :set Failed 1; } - /file/remove ($FilePath . ".rsc"); + $RmFile ($FilePath . ".rsc"); } # global-config-overlay @@ -140,7 +141,7 @@ :set Failed 1; } - /file/remove ($FilePath . ".conf"); + $RmFile ($FilePath . ".conf"); } :local FileInfo do={ From 63db96bdccc9c9c1356e71683157383322b40285 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Feb 2025 16:06:33 +0100 Subject: [PATCH 407/893] capsman-download-packages: use $RmFile --- capsman-download-packages.capsman.rsc | 3 ++- capsman-download-packages.template.rsc | 3 ++- capsman-download-packages.wifi.rsc | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index 2726af7..4387cb1 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -22,6 +22,7 @@ :global DownloadPackage; :global LogPrint; :global MkDir; + :global RmFile; :global ScriptLock; :global WaitFullyConnected; @@ -61,7 +62,7 @@ :if ([ $DownloadPackage ($File->"package-name") $InstalledVersion \ ($File->"package-architecture") $PackagePath ] = true) do={ :set Updated true; - /file/remove $Package; + $RmFile $Package; } } diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index 0a42bb2..744494e 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -23,6 +23,7 @@ :global DownloadPackage; :global LogPrint; :global MkDir; + :global RmFile; :global ScriptLock; :global WaitFullyConnected; @@ -63,7 +64,7 @@ :if ([ $DownloadPackage ($File->"package-name") $InstalledVersion \ ($File->"package-architecture") $PackagePath ] = true) do={ :set Updated true; - /file/remove $Package; + $RmFile $Package; } } diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 037409a..a0c5e12 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -22,6 +22,7 @@ :global DownloadPackage; :global LogPrint; :global MkDir; + :global RmFile; :global ScriptLock; :global WaitFullyConnected; @@ -61,7 +62,7 @@ :if ([ $DownloadPackage ($File->"package-name") $InstalledVersion \ ($File->"package-architecture") $PackagePath ] = true) do={ :set Updated true; - /file/remove $Package; + $RmFile $Package; } } From 6570a84904bcdd6d74090944f0fc94d1b94add90 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Feb 2025 16:08:40 +0100 Subject: [PATCH 408/893] check-certificates: use $RmFile --- check-certificates.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 25807cb..0907395 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -44,6 +44,7 @@ :global EscapeForRegEx; :global FetchUserAgentStr; :global LogPrint; + :global RmFile; :global UrlEncode; :global WaitForFile; @@ -63,7 +64,7 @@ :set DecryptionFailed false; } } - /file/remove [ find where name=$CertFileName ]; + $RmFile $CertFileName; :if ($DecryptionFailed = true) do={ $LogPrint warning $ScriptName ("Decryption failed for certificate file '" . $CertFileName . "'."); From 0fea300feaaaf8f3c87facb99e04126753713c76 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Feb 2025 16:12:51 +0100 Subject: [PATCH 409/893] mod/ssh-keys-import: use $RmDir --- mod/ssh-keys-import.rsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index 35aa7ec..2fae4b1 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -19,6 +19,7 @@ :global GetRandom20CharAlNum; :global LogPrint; :global MkDir; + :global RmDir; :global WaitForFile; :if ([ :len $Key ] = 0 || [ :len $User ] = 0) do={ @@ -58,10 +59,10 @@ /user/ssh-keys/import public-key-file=$FileName user=$User; $LogPrint info $0 ("Imported ssh public key (" . $KeyVal->2 . ", " . $KeyVal->0 . ", " . \ "MD5:" . $FingerPrintMD5 . ") for user '" . $User . "'."); - /file/remove "tmpfs/ssh-keys-import"; + $RmDir "tmpfs/ssh-keys-import"; } on-error={ $LogPrint warning $0 ("Failed importing key."); - /file/remove "tmpfs/ssh-keys-import"; + $RmDir "tmpfs/ssh-keys-import"; :return false; } } on-error={ From b156fc43cfde99935eb78d95c6a5eae35b8f70f1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Feb 2025 16:14:58 +0100 Subject: [PATCH 410/893] telegram-chat: use $RmDir --- telegram-chat.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 8f29d8c..10952a6 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -37,6 +37,7 @@ :global MIN; :global MkDir; :global RandomDelay; + :global RmDir; :global ScriptLock; :global SendTelegram2; :global SymbolForNotification; @@ -154,7 +155,7 @@ $State . [ $IfThenElse ([ :len $Content ] > 0) \ ([ $SymbolForNotification "memo" ] . "Output:\n" . $Content) \ ([ $SymbolForNotification "memo" ] . "No output.") ]) }); - /file/remove "tmpfs/telegram-chat"; + $RmDir "tmpfs/telegram-chat"; } else={ $LogPrint info $ScriptName ("The command from update " . $UpdateID . " failed syntax validation!"); $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=false; replyto=($Message->"message_id"); \ From fc3beac83b8a6fd35a7b3736759f15bb8b71a723 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Feb 2025 08:42:17 +0100 Subject: [PATCH 411/893] log-forward: make empty string a special meaning --- global-config.rsc | 10 +++++----- log-forward.rsc | 5 +++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/global-config.rsc b/global-config.rsc index df26ef9..5df7b34 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -119,17 +119,17 @@ :global FwAddrListTimeOut 1d; # This defines what log messages to filter or include by topic or message -# text. Regular expressions are supported. Do *NOT* set an empty string, -# that will filter or include everything! +# text. Regular expressions are supported. An empty string has a special +# meaning not to filter or include anything. # These are filters, so excluding messages from forwarding. :global LogForwardFilter "(debug|info|packet|raw)"; -:global LogForwardFilterMessage []; +:global LogForwardFilterMessage ""; #:global LogForwardFilterMessage "message text"; #:global LogForwardFilterMessage "(message text|another text|...)"; # ... and another setting with reverse logic. This includes messages even # if filtered above. -:global LogForwardInclude []; -:global LogForwardIncludeMessage []; +:global LogForwardInclude ""; +:global LogForwardIncludeMessage ""; #:global LogForwardInclude "account"; #:global LogForwardIncludeMessage "message text"; diff --git a/log-forward.rsc b/log-forward.rsc index 58ec956..afeb3f2 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -57,6 +57,11 @@ :local MessageVal; :local MessageDups ({}); + :set LogForwardFilter [ $EitherOr $LogForwardFilter [] ]; + :set LogForwardFilterMessage [ $EitherOr $LogForwardFilterMessage [] ]; + :set LogForwardInclude [ $EitherOr $LogForwardInclude [] ]; + :set LogForwardIncludeMessage [ $EitherOr $LogForwardIncludeMessage [] ]; + :local LogForwardFilterLogForwardingCached [ $EitherOr [ $LogForwardFilterLogForwarding ] ("\$^") ]; :foreach Message in=[ /log/find where (!(message="") and \ !(message~$LogForwardFilterLogForwardingCached) and \ From 2e42f7963c2186512c4fa2cd75de7ab07754f229 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Feb 2025 08:45:25 +0100 Subject: [PATCH 412/893] mod/notification-ntfy: use empty strings as default... ... which should be fine now that the credentials are not passed with fetch's properties, but as properly formatted authentication header. --- global-config.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-config.rsc b/global-config.rsc index 5df7b34..b0f0c64 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -56,9 +56,9 @@ # install the module: # $ScriptInstallUpdate mod/notification-ntfy :global NtfyServer "ntfy.sh"; -:global NtfyServerUser []; -:global NtfyServerPass []; -:global NtfyServerToken []; +:global NtfyServerUser ""; +:global NtfyServerPass ""; +:global NtfyServerToken ""; :global NtfyTopic ""; # It is possible to override e-mail, Telegram, Matrix and Ntfy setting From da280586b5012feb576cd7cd3e911d00ac7bf63e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Feb 2025 14:00:37 +0100 Subject: [PATCH 413/893] doc/log-forward: add a hint on defaults --- doc/log-forward.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/doc/log-forward.md b/doc/log-forward.md index 25be00a..93f6a7d 100644 --- a/doc/log-forward.md +++ b/doc/log-forward.md @@ -53,6 +53,12 @@ Just install the script: Configuration ------------- +The default configuration should provide reasonable presets, filtering +*info*, and effectively forwarding *warning* and *error*. + +> 💡️ **Hint**: Please try with defaults first, especially if you are not +> familiar with regular expressions! + The configuration goes to `global-config-overlay`, these are the parameters: * `LogForwardFilter`: define topics *not* to be forwarded From 8af67af462369968238afe874a24c26141b0b5c9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Feb 2025 14:08:06 +0100 Subject: [PATCH 414/893] doc/log-forward: mention ntfy --- doc/log-forward.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/log-forward.md b/doc/log-forward.md index 93f6a7d..3c19569 100644 --- a/doc/log-forward.md +++ b/doc/log-forward.md @@ -22,15 +22,15 @@ server (see `/system/logging`). This has some limitation, however: * does not work early after boot if network connectivity is not yet established, or breaks intermittently * lots of messages generate a flood of mails -* Matrix and Telegram are not supported +* Matrix, Ntfy and Telegram are not supported The script works around the limitations, for example it does: * read from `/log`, including messages from early boot * skip multi-repeated messages * rate-limit itself to mitigate flooding -* forward via notification (which includes *e-mail*, *Matrix* and *Telegram* - when installed and configured, see below) +* forward via notification (which includes *e-mail*, *Matrix*, *Ntfy* and + *Telegram* when installed and configured, see below) It is intended to be run periodically from scheduler, then collects new log messages and forwards them via notification. From 4d0b4a1ff4137ae0b5508fb16428ac4da7205410 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Feb 2025 14:30:14 +0100 Subject: [PATCH 415/893] fw-addr-lists: these lists are deprecated and discontinued Any alternatives around? --- certs/GlobalSign.pem | 28 ---------------------------- certs/Makefile | 2 -- doc/fw-addr-lists.md | 6 +++--- global-config.rsc | 4 ---- 4 files changed, 3 insertions(+), 37 deletions(-) delete mode 100644 certs/GlobalSign.pem diff --git a/certs/GlobalSign.pem b/certs/GlobalSign.pem deleted file mode 100644 index 47035e4..0000000 --- a/certs/GlobalSign.pem +++ /dev/null @@ -1,28 +0,0 @@ -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Label: "GlobalSign Root CA - R3" -# Serial: 4835703278459759426209954 -# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 -# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad -# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- diff --git a/certs/Makefile b/certs/Makefile index ba25303..4e252b4 100644 --- a/certs/Makefile +++ b/certs/Makefile @@ -23,12 +23,10 @@ DOMAINS_IPV4 = \ 8.8.8.8/GTS-Root-R1 \ 9.9.9.9/DigiCert-Global-Root-G3 \ api.mullvad.net/ISRG-Root-X1 \ - feodotracker.abuse.ch/GlobalSign \ ipv4.showipv6.de/ISRG-Root-X1 \ ipv4.tunnelbroker.net/Starfield-Root-Certificate-Authority-G2 \ mkcert.org/ISRG-Root-X1 \ ntfy.sh/ISRG-Root-X1 \ - sslbl.abuse.ch/GlobalSign \ www.dshield.org/ISRG-Root-X1 \ www.spamhaus.org/GTS-Root-R4 DOMAINS_IPV6 = \ diff --git a/doc/fw-addr-lists.md b/doc/fw-addr-lists.md index f581fd2..b888d4b 100644 --- a/doc/fw-addr-lists.md +++ b/doc/fw-addr-lists.md @@ -19,9 +19,9 @@ Description This script downloads, imports and updates firewall address-lists. Its main purpose is to block attacking ip addresses, spam hosts, command-and-control servers and similar malicious entities. The default configuration contains -lists from [abuse.ch](https://abuse.ch/), [dshield.org](https://dshield.org/) -and [blocklist.de](https://www.blocklist.de/), and -lists from [spamhaus.org](https://spamhaus.org/) are prepared. +lists from [dshield.org](https://dshield.org/) and +[blocklist.de](https://www.blocklist.de/), and lists from +[spamhaus.org](https://spamhaus.org/) are prepared. The address-lists are updated in place, so after initial import you will not see situation when the lists are not populated. diff --git a/global-config.rsc b/global-config.rsc index b0f0c64..2be4752 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -98,10 +98,6 @@ "block"={ # { url="https://rsc.eworm.de/main/fw-addr-lists.d/block"; # cert="ISRG Root X2" }; - { url="https://feodotracker.abuse.ch/downloads/ipblocklist_recommended.txt"; - cert="GlobalSign" }; - { url="https://sslbl.abuse.ch/blacklist/sslipblacklist.txt"; - cert="GlobalSign" }; { url="https://www.dshield.org/block.txt"; cidr="/24"; cert="ISRG Root X1" }; { url="https://lists.blocklist.de/lists/strongips.txt"; From e1c561dd91dff9ad7c6bdd1e3496e126a8ac8b2c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Feb 2025 14:56:43 +0100 Subject: [PATCH 416/893] global-functions: $MkDir: add debug output --- global-functions.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 4b1f63d..645ce3c 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -891,7 +891,10 @@ :return true; } + $LogPrint debug $0 ("Making directory: " . $Path); + :if ([ :len [ /file/find where name=$Path type="directory" ] ] = 1) do={ + $LogPrint debug $0 ("... which already exists."); :return true; } From d41f7585504b592938da5ea0fc68870d1f68c0f5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Feb 2025 15:32:05 +0100 Subject: [PATCH 417/893] introduce DEBUG info --- DEBUG.md | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 DEBUG.md diff --git a/DEBUG.md b/DEBUG.md new file mode 100644 index 0000000..3d7f025 --- /dev/null +++ b/DEBUG.md @@ -0,0 +1,49 @@ +Debug output and logs +===================== + +[![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) +[![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) +[![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) +[![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) + +[⬅️ Go back to main README](README.md) + +Sometimes scripts do not behave as expected. In these cases debug output +or logs can help. + +## Debug output + +Run this command in a terminal: + + :set PrintDebug true; + +You will then see debug output when running the script from terminal. + +To revert to default output run: + + :set PrintDebug false; + +### Debug output for specific script + +Even having debug output for a specific script or function only (or a +set of) is possible. To enable debug output for `telegram-chat` run: + + :set ($PrintDebugOverride->"telegram-chat") true; + +## Debug logs + +The debug info can go to system log. To make it show up in `memory` run: + + /system/logging/add topics=script,debug action=memory; + +Other actions (`disk`, `email`, `remote` or `support`) can be used as +well. I do not recommend using `echo` - use [debug output](#debug-output) +instead. + +Disable or remote that setting to restore regular logging. + +--- +[⬅️ Go back to main README](README.md) +[⬆️ Go back to top](#top) From c8759381e90408a01dd842e837724b77f2d8c237 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Feb 2025 19:14:42 +0100 Subject: [PATCH 418/893] global-functions: $WaitForFile: check that we can get properties MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Looks like RouterOS 7.18beta2 brings more breakage. Having a file available in listing is just the first step now. We also need to make sure that the file properties are accessible... 🤪 I have seen this taking several tens of seconds at least... 🤪🤪 So let's just try until we have properties available, or the file vanishes. Reported as SUP-179200. 🤞 --- global-functions.rsc | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 645ce3c..13dca64 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1669,6 +1669,7 @@ :global CleanFilePath; :global EitherOr; + :global LogPrintOnce; :global MAX; :set FileName [ $CleanFilePath $FileName ]; @@ -1682,7 +1683,20 @@ :delay $Delay; :set I ($I + 1); } - :return true; + + :while ([ :len [ /file/find where name=$FileName ] ] > 0) do={ + :do { + /file/get $FileName; + :return true; + } on-error={ + $LogPrintOnce warning $0 \ + ("Hit the infamous file handling breakage (SUP-179200) introduced with RouterOS 7.18beta2..."); + } + :delay $Delay; + :set Delay ($Delay * 3 / 2); + } + + :return false; } # wait to be fully connected (default route is reachable, time is sync, DNS resolves) From df631b987d86b3b20cd55de9a005b13703576784 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Feb 2025 12:13:17 +0100 Subject: [PATCH 419/893] fw-addr-lists: add a collective list in default configuration --- doc/fw-addr-lists.md | 3 ++- global-config.rsc | 4 ++++ global-functions.rsc | 2 +- news-and-changes.rsc | 1 + 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/doc/fw-addr-lists.md b/doc/fw-addr-lists.md index b888d4b..cb560d7 100644 --- a/doc/fw-addr-lists.md +++ b/doc/fw-addr-lists.md @@ -18,7 +18,8 @@ Description This script downloads, imports and updates firewall address-lists. Its main purpose is to block attacking ip addresses, spam hosts, command-and-control -servers and similar malicious entities. The default configuration contains +servers and similar malicious entities. The default configuration contains a +[collective list by GitHub user @stamparm](https://github.com/stamparm/ipsum), lists from [dshield.org](https://dshield.org/) and [blocklist.de](https://www.blocklist.de/), and lists from [spamhaus.org](https://spamhaus.org/) are prepared. diff --git a/global-config.rsc b/global-config.rsc index 2be4752..b364a25 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -90,6 +90,7 @@ :global BackupPartitionCopyBeforeFeatureUpdate false; # This defines the settings for firewall address-lists (fw-addr-lists). +# Warning: Mind your device's resources - memory and processing! :global FwAddrLists { # "allow"={ # { url="https://rsc.eworm.de/main/fw-addr-lists.d/allow"; @@ -98,6 +99,9 @@ "block"={ # { url="https://rsc.eworm.de/main/fw-addr-lists.d/block"; # cert="ISRG Root X2" }; + { url="https://raw.githubusercontent.com/stamparm/ipsum/refs/heads/master/levels/4.txt"; +# # higher level (decrease the numerical value) for more addresses, and vice versa + cert="DigiCert Global Root G2" }; { url="https://www.dshield.org/block.txt"; cidr="/24"; cert="ISRG Root X1" }; { url="https://lists.blocklist.de/lists/strongips.txt"; diff --git a/global-functions.rsc b/global-functions.rsc index 13dca64..5996370 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -13,7 +13,7 @@ :local ScriptName [ :jobname ]; # expected configuration version -:global ExpectedConfigVersion 132; +:global ExpectedConfigVersion 133; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/news-and-changes.rsc b/news-and-changes.rsc index c7e566f..6f9e96e 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -57,6 +57,7 @@ 130="Dropped intermediate certificates, depending on just root certificates now."; 131="Enhanced certificate download to fallback to mkcert.org, so all (commonly trusted) root certificates are available now."; 132="Split off plugins from 'check-health', so the script works on all devices to monitor CPU and RAM. The supported plugins for sensors in hardware are installed automatically."; + 133="Updated the default configuration for 'fw-addr-lists', deprecated lists were removed, a collective list was added."; }; # Migration steps to be applied on script updates From b7b3b43f3b11a280dbb465a425a5a554c2e8e471 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Feb 2025 13:59:31 +0100 Subject: [PATCH 420/893] mod/scriptrunonce: use $FetchHuge --- mod/scriptrunonce.rsc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index b158c9c..683e416 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -4,7 +4,6 @@ # https://rsc.eworm.de/COPYING.md # # requires RouterOS, version=7.15 -# requires device-mode, fetch # # download script and run it once # https://rsc.eworm.de/doc/mod/scriptrunonce.md @@ -18,6 +17,7 @@ :global ScriptRunOnceBaseUrl; :global ScriptRunOnceUrlSuffix; + :global FetchHuge; :global LogPrint; :global ValidateSyntax; @@ -30,11 +30,10 @@ :set Script ($ScriptRunOnceBaseUrl . $Script . ".rsc" . $ScriptRunOnceUrlSuffix); } - :local Source; - :do { - :set Source ([ /tool/fetch check-certificate=yes-without-crl $Script output=user as-value ]->"data"); - } on-error={ + :local Source [ $FetchHuge $0 $Script true ]; + :if ($Source = false) do={ $LogPrint warning $0 ("Failed fetching script '" . $Script . "'!"); + :return false; } :if ([ :len $Source ] > 0) do={ From 1c957dbc6d0a35d48f18f2fde0f2061f334feca8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Feb 2025 14:01:10 +0100 Subject: [PATCH 421/893] mod/scriptrunonce: resolve nested conditions --- mod/scriptrunonce.rsc | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index 683e416..9d990a1 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -36,17 +36,16 @@ :return false; } - :if ([ :len $Source ] > 0) do={ - :if ([ $ValidateSyntax $Source ] = true) do={ - :do { - $LogPrint info $0 ("Running script '" . $Script . "' now."); - [ :parse $Source ]; - } on-error={ - $LogPrint warning $0 ("The script '" . $Script . "' failed to run!"); - } - } else={ - $LogPrint warning $0 ("The script '" . $Script . "' failed syntax validation!"); - } + :if ([ $ValidateSyntax $Source ] = false) do={ + $LogPrint warning $0 ("The script '" . $Script . "' failed syntax validation!"); + :return false; + } + + :do { + $LogPrint info $0 ("Running script '" . $Script . "' now."); + [ :parse $Source ]; + } on-error={ + $LogPrint warning $0 ("The script '" . $Script . "' failed to run!"); } } } on-error={ From 5715bc7b57ced8f38b394d535028659655a71801 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Feb 2025 14:02:33 +0100 Subject: [PATCH 422/893] mod/scriptrunonce: always give proper return code --- mod/scriptrunonce.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index 9d990a1..7fcd5b5 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -46,7 +46,10 @@ [ :parse $Source ]; } on-error={ $LogPrint warning $0 ("The script '" . $Script . "' failed to run!"); + :return false; } + + :return true; } } on-error={ :global ExitError; $ExitError false $0; From 584e507fd18f0a0d97f6e3cbfc4f3f6e0d4854fc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 13 Feb 2025 08:50:49 +0100 Subject: [PATCH 423/893] global-functions: $DeviceInfo: show commit id (if available) --- global-functions.rsc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 5996370..71e5c66 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -13,6 +13,7 @@ :local ScriptName [ :jobname ]; # expected configuration version +:global CommitId "unknown"; :global ExpectedConfigVersion 133; # global variables not to be changed by user @@ -284,6 +285,7 @@ # get readable device info :set DeviceInfo do={ + :global CommitId; :global ExpectedConfigVersion; :global Identity; @@ -324,6 +326,8 @@ $RouterBoard->"current-firmware" != $RouterBoard->"upgrade-firmware") \ ([ $FormatLine " Firmware" ($RouterBoard->"current-firmware") ] . "\n") ] . \ "RouterOS-Scripts:\n" . \ + [ $IfThenElse ($CommitId != "unknown") \ + ([ $FormatLine " Commit" [ :pick $CommitId 0 8 ] ] . "\n") ] . \ [ $FormatLine " Version" $ExpectedConfigVersion ]); } From 0199ea8884d9b45a184717bdbd5dccf829eb527d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 13 Feb 2025 09:07:43 +0100 Subject: [PATCH 424/893] global-functions: $ScriptInstallUpdate: show commit id (if available) --- global-functions.rsc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 71e5c66..204f824 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1105,6 +1105,7 @@ :local Scripts [ :toarray $1 ]; :local NewComment [ :tostr $2 ]; + :global CommitId; :global ExpectedConfigVersion; :global Identity; :global IDonate; @@ -1137,6 +1138,7 @@ } } + :local CommitIdBefore $CommitId; :local ExpectedConfigVersionBefore $ExpectedConfigVersion; :local ReloadGlobalFunctions false; :local ReloadGlobalConfig false; @@ -1251,6 +1253,10 @@ } } + :if ($CommitId != "unknown" && $CommitIdBefore != $CommitId) do={ + $LogPrint info $0 ("Updated to commit id: " . [ :pick $CommitId 0 8 ]); + } + :if ($ExpectedConfigVersionBefore > $ExpectedConfigVersion) do={ $LogPrint warning $0 ("The configuration version decreased from " . \ $ExpectedConfigVersionBefore . " to " . $ExpectedConfigVersion . \ From dafcc1a0cb8d18b191919c4876fa1db6c3fe2e27 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 13 Feb 2025 17:49:42 +0100 Subject: [PATCH 425/893] global-functions: $RmFile: fix type safeguard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ups... 🫣 The type is not just literal 'file' - but what ever type the file is, like 'backup', 'package', 'script', '.conf file', ... So let's match those types we do *not* want to remove. Fixes: https://github.com/eworm-de/routeros-scripts/issues/90 --- global-functions.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 204f824..221b1b5 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1054,12 +1054,12 @@ $LogPrint debug $0 ("Removing file: ". $FileName); - :if ([ :len [ /file/find where name=$FileName type!=file ] ] > 0) do={ + :if ([ :len [ /file/find where name=$FileName (type=directory or type=disk) ] ] > 0) do={ $LogPrint error $0 ("File '" . $FileName . "' is not a file."); :return false; } - :local File [ /file/find where name=$FileName type=file ]; + :local File [ /file/find where name=$FileName !(type=directory or type=disk) ]; :if ([ :len $File ] = 0) do={ $LogPrint debug $0 ("... which does not exist."); :return true; From 75633872aa8a09a328e2bef07211e182bceb2725 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 17 Feb 2025 11:45:02 +0100 Subject: [PATCH 426/893] global-functions: $DeviceInfo: also show commit info --- global-functions.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 221b1b5..c6625c1 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -12,8 +12,9 @@ :local ScriptName [ :jobname ]; -# expected configuration version +# Git commit id & info, expected configuration version :global CommitId "unknown"; +:global CommitInfo "unknown"; :global ExpectedConfigVersion 133; # global variables not to be changed by user @@ -286,6 +287,7 @@ # get readable device info :set DeviceInfo do={ :global CommitId; + :global CommitInfo; :global ExpectedConfigVersion; :global Identity; @@ -327,7 +329,7 @@ ([ $FormatLine " Firmware" ($RouterBoard->"current-firmware") ] . "\n") ] . \ "RouterOS-Scripts:\n" . \ [ $IfThenElse ($CommitId != "unknown") \ - ([ $FormatLine " Commit" [ :pick $CommitId 0 8 ] ] . "\n") ] . \ + ([ $FormatLine " Commit" ($CommitInfo . "/" . [ :pick $CommitId 0 8 ]) ] . "\n") ] . \ [ $FormatLine " Version" $ExpectedConfigVersion ]); } From 2c92c78b4647e43c44da567e98adee69b7857393 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 17 Feb 2025 11:47:26 +0100 Subject: [PATCH 427/893] global-functions: $ScriptInstallUpdate: also show commit info --- global-functions.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index c6625c1..f5fa5cb 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1108,6 +1108,7 @@ :local NewComment [ :tostr $2 ]; :global CommitId; + :global CommitInfo; :global ExpectedConfigVersion; :global Identity; :global IDonate; @@ -1256,7 +1257,7 @@ } :if ($CommitId != "unknown" && $CommitIdBefore != $CommitId) do={ - $LogPrint info $0 ("Updated to commit id: " . [ :pick $CommitId 0 8 ]); + $LogPrint info $0 ("Updated to commit: " . $CommitInfo . "/" . [ :pick $CommitId 0 8 ]); } :if ($ExpectedConfigVersionBefore > $ExpectedConfigVersion) do={ From 58da92e36a704a0bd5915451fbace686e8d9456d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 19 Feb 2025 22:21:03 +0100 Subject: [PATCH 428/893] global-functions: $WaitForFile: drop the warning on file handling breakage... ... but keep the workaround for now - just to be sure. --- global-functions.rsc | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index f5fa5cb..99e52f8 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1682,7 +1682,6 @@ :global CleanFilePath; :global EitherOr; - :global LogPrintOnce; :global MAX; :set FileName [ $CleanFilePath $FileName ]; @@ -1701,10 +1700,7 @@ :do { /file/get $FileName; :return true; - } on-error={ - $LogPrintOnce warning $0 \ - ("Hit the infamous file handling breakage (SUP-179200) introduced with RouterOS 7.18beta2..."); - } + } on-error={ } :delay $Delay; :set Delay ($Delay * 3 / 2); } From cad104879cbc758717f6cbf18f2f1b8946078c19 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 24 Feb 2025 14:49:30 +0100 Subject: [PATCH 429/893] mod/notification-telegram: simplify the queue... ... and pass http-data as a complete sting. --- mod/notification-telegram.rsc | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 23ef942..be4a915 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -22,7 +22,6 @@ :global IsFullyConnected; :global LogPrint; - :global UrlEncode; :if ([ $IsFullyConnected ] = false) do={ $LogPrint debug $0 ("System is not fully connected, not flushing."); @@ -41,9 +40,7 @@ :do { :local Data ([ /tool/fetch check-certificate=yes-without-crl output=user http-method=post \ ("https://api.telegram.org/bot" . ($Message->"tokenid") . "/sendMessage") \ - http-data=("chat_id=" . ($Message->"chatid") . "&disable_notification=" . ($Message->"silent") . \ - "&reply_to_message_id=" . ($Message->"replyto") . "&disable_web_page_preview=true" . \ - "&parse_mode=MarkdownV2&text=" . [ $UrlEncode ($Message->"text") ]) as-value ]->"data"); + http-data=($Message->"http-data") as-value ]->"data"); :set ($TelegramQueue->$Id); :set ($TelegramMessageIDs->[ :tostr ([ :deserialize from=json value=$Data ]->"result"->"message_id") ]) 1; } on-error={ @@ -145,6 +142,9 @@ (($LenSum - [ :len $Text ]) * 100 / $LenSum) . "%_!") "plain" "_" ]); } + :local HTTPData ("chat_id=" . $ChatId . "&disable_notification=" . ($Notification->"silent") . \ + "&reply_to_message_id=" . ($Notification->"replyto") . "&disable_web_page_preview=true" . \ + "&parse_mode=MarkdownV2"); :do { :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); @@ -152,9 +152,7 @@ } :local Data ([ /tool/fetch check-certificate=yes-without-crl output=user http-method=post \ ("https://api.telegram.org/bot" . $TokenId . "/sendMessage") \ - http-data=("chat_id=" . $ChatId . "&disable_notification=" . ($Notification->"silent") . \ - "&reply_to_message_id=" . ($Notification->"replyto") . "&disable_web_page_preview=true" . \ - "&parse_mode=MarkdownV2&text=" . [ $UrlEncode $Text ]) as-value ]->"data"); + http-data=($HTTPData . "&text=" . [ $UrlEncode $Text ]) as-value ]->"data"); :set ($TelegramMessageIDs->[ :tostr ([ :deserialize from=json value=$Data ]->"result"->"message_id") ]) 1; } on-error={ $LogPrint info $0 ("Failed sending Telegram notification! Queuing..."); @@ -165,8 +163,8 @@ :set Text ($Text . "\n" . [ $SymbolForNotification "alarm-clock" ] . \ [ $EscapeMD ("This message was queued since _" . [ /system/clock/get date ] . \ " " . [ /system/clock/get time ] . "_ and may be obsolete.") "plain" "_" ]); - :set ($TelegramQueue->[ :len $TelegramQueue ]) { chatid=$ChatId; tokenid=$TokenId; - text=$Text; silent=($Notification->"silent"); replyto=($Notification->"replyto") }; + :set ($TelegramQueue->[ :len $TelegramQueue ]) { tokenid=$TokenId; + http-data=($HTTPData . "&text=" . [ $UrlEncode $Text ]) }; :if ([ :len [ /system/scheduler/find where name="_FlushTelegramQueue" ] ] = 0) do={ /system/scheduler/add name="_FlushTelegramQueue" interval=1m start-time=startup \ on-event=(":global FlushTelegramQueue; \$FlushTelegramQueue;"); From a22b62f58803141a3055db046363f4d41b12ea83 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 24 Feb 2025 14:57:26 +0100 Subject: [PATCH 430/893] mod/notification-telegram: support sending to group's topic... ... when a group has enabled the "Topics" feature. --- doc/mod/notification-telegram.md | 3 +++ global-config.rsc | 2 ++ mod/notification-telegram.rsc | 8 ++++++-- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/doc/mod/notification-telegram.md b/doc/mod/notification-telegram.md index b85d09c..8043716 100644 --- a/doc/mod/notification-telegram.md +++ b/doc/mod/notification-telegram.md @@ -58,6 +58,9 @@ Sending notifications to a group is possible as well. Add your bot and the *GetIDs Bot* to a group, then use the group's id (which starts with a dash) for `TelegramChatId`. Then remove *GetIDs Bot* from group. +Groups can enable the `Topics` feature. Use `TelegramThreadId` to send to a +specific topic in a group. + Usage and invocation -------------------- diff --git a/global-config.rsc b/global-config.rsc index b364a25..2524ded 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -33,6 +33,8 @@ :global TelegramChatId ""; #:global TelegramTokenId "123456:ABCDEF-GHI"; #:global TelegramChatId "12345678"; +# Use this to send notifications to a specific topic in group. +:global TelegramThreadId ""; # Using telegram-chat you have to define trusted chat ids (not group ids!) # or user names. Groups allow to chat with devices simultaneously. #:global TelegramChatIdsTrusted { diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index be4a915..d04893f 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -68,6 +68,8 @@ :global TelegramChatIdOverride; :global TelegramMessageIDs; :global TelegramQueue; + :global TelegramThreadId; + :global TelegramThreadIdOverride; :global TelegramTokenId; :global TelegramTokenIdOverride; @@ -108,6 +110,8 @@ :local ChatId [ $EitherOr ($Notification->"chatid") \ [ $EitherOr ($TelegramChatIdOverride->($Notification->"origin")) $TelegramChatId ] ]; + :local ThreadId [ $EitherOr ($Notification->"threadid") \ + [ $EitherOr ($TelegramThreadIdOverride->($Notification->"origin")) $TelegramThreadId ] ]; :local TokenId [ $EitherOr ($TelegramTokenIdOverride->($Notification->"origin")) $TelegramTokenId ]; :if ([ :len $TokenId ] = 0 || [ :len $ChatId ] = 0) do={ @@ -143,8 +147,8 @@ } :local HTTPData ("chat_id=" . $ChatId . "&disable_notification=" . ($Notification->"silent") . \ - "&reply_to_message_id=" . ($Notification->"replyto") . "&disable_web_page_preview=true" . \ - "&parse_mode=MarkdownV2"); + "&reply_to_message_id=" . ($Notification->"replyto") . "&message_thread_id=" . $ThreadId . \ + "&disable_web_page_preview=true&parse_mode=MarkdownV2"); :do { :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); From 757fa60e6f37cc684abec5582d1b6051f6ef8d6d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 25 Feb 2025 10:46:25 +0100 Subject: [PATCH 431/893] telegram-chat: make $IsReply a boolean... ... and check for correct data type. We need this for a group with topic feature enabled, as that variable is set there, but is is an array. --- telegram-chat.rsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 10952a6..eacbbcb 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -97,7 +97,7 @@ :foreach Update in=($JSON->"result") do={ :set UpdateID ($Update->"update_id"); :local Message ($Update->"message"); - :local IsReply [ :len ($Message->"reply_to_message") ]; + :local IsReply ([ :typeof ($Message->"reply_to_message") ] = "string"); :local IsMyReply ($TelegramMessageIDs->[ :tostr ($Message->"reply_to_message"->"message_id") ]); :if (($IsMyReply = 1 || $TelegramChatOffset->0 > 0 || $Uptime > 5m) && $UpdateID >= $TelegramChatOffset->2) do={ :local Trusted false; @@ -130,7 +130,8 @@ " from update " . $UpdateID . "!"); :set Done true; } - :if ($Done = false && ($IsMyReply = 1 || ($IsReply = 0 && $TelegramChatActive = true)) && [ :len $Command ] > 0) do={ + :if ($Done = false && ($IsMyReply = 1 || ($IsReply = false && \ + $TelegramChatActive = true)) && [ :len $Command ] > 0) do={ :if ([ $ValidateSyntax $Command ] = true) do={ :local State ""; :local File ("tmpfs/telegram-chat/" . [ $GetRandom20CharAlNum 6 ]); From 7928c5f0543765e27379e39bbaff6bdb19638971 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 24 Feb 2025 15:31:34 +0100 Subject: [PATCH 432/893] telegram-chat: support reply in group's topic --- telegram-chat.rsc | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index eacbbcb..07e3816 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -104,6 +104,7 @@ :local Chat ($Message->"chat"); :local From ($Message->"from"); :local Command ($Message->"text"); + :local ThreadId [ $IfThenElse ($Message->"is_topic_message") ($Message->"message_thread_id") "" ]; :foreach IdsTrusted in=($TelegramChatId, $TelegramChatIdsTrusted) do={ :if ($From->"id" = $IdsTrusted || $From->"username" = $IdsTrusted) do={ @@ -115,7 +116,8 @@ :local Done false; :if ($Command = "?") do={ $LogPrint info $ScriptName ("Sending notice for update " . $UpdateID . "."); - $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=true; replyto=($Message->"message_id"); \ + $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=true; \ + replyto=($Message->"message_id"); threadid=$ThreadId; \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ message=("Online" . [ $IfThenElse $TelegramChatActive " (and active!)" ] . ", awaiting your commands!") }); :set Done true; @@ -150,7 +152,8 @@ :set State ([ $SymbolForNotification "cross-mark" ] . "The command failed with an error!\n\n"); } :local Content ([ /file/read chunk-size=32768 file=$File as-value ]->"data"); - $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=true; replyto=($Message->"message_id"); \ + $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=true; \ + replyto=($Message->"message_id"); threadid=$ThreadId; \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ message=([ $SymbolForNotification "gear" ] . "Command:\n" . $Command . "\n\n" . \ $State . [ $IfThenElse ([ :len $Content ] > 0) \ @@ -159,7 +162,8 @@ $RmDir "tmpfs/telegram-chat"; } else={ $LogPrint info $ScriptName ("The command from update " . $UpdateID . " failed syntax validation!"); - $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=false; replyto=($Message->"message_id"); \ + $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=false; \ + replyto=($Message->"message_id"); threadid=$ThreadId; \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ message=([ $SymbolForNotification "gear" ] . "Command:\n" . $Command . "\n\n" . \ [ $SymbolForNotification "cross-mark" ] . "The command failed syntax validation!") }); @@ -171,7 +175,8 @@ " (ID " . $From->"id" . ") in update " . $UpdateID . "!"); :if ($Command ~ ("^! *" . [ $EscapeForRegEx $Identity ] . "\$")) do={ $LogPrint warning $ScriptName $MessageText; - $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=false; replyto=($Message->"message_id"); \ + $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=false; \ + replyto=($Message->"message_id"); threadid=$ThreadId; \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ message=("You are not trusted.") }); } else={ From e5de9de391283f64763ad16446fa2f6727191306 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 25 Feb 2025 12:19:49 +0100 Subject: [PATCH 433/893] notify on support for Telegram group topics --- global-functions.rsc | 2 +- news-and-changes.rsc | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 99e52f8..42782bc 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -15,7 +15,7 @@ # Git commit id & info, expected configuration version :global CommitId "unknown"; :global CommitInfo "unknown"; -:global ExpectedConfigVersion 133; +:global ExpectedConfigVersion 134; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 6f9e96e..a735ff7 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -58,6 +58,7 @@ 131="Enhanced certificate download to fallback to mkcert.org, so all (commonly trusted) root certificates are available now."; 132="Split off plugins from 'check-health', so the script works on all devices to monitor CPU and RAM. The supported plugins for sensors in hardware are installed automatically."; 133="Updated the default configuration for 'fw-addr-lists', deprecated lists were removed, a collective list was added."; + 134="Enhanced 'mod/notification-telegram' and 'telegram-chat' to support topics in groups."; }; # Migration steps to be applied on script updates From c33eb41c9cfb73e7e5b5ec7a3c37aa9e92ebc9cb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 18 Dec 2024 17:50:56 +0100 Subject: [PATCH 434/893] global-functions: $DeviceInfo: add license level, re-order --- global-functions.rsc | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 42782bc..b3166dc 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -309,16 +309,19 @@ ([ $FormatLine "Location" ($Snmp->"location") ] . "\n") ] . \ [ $IfThenElse ([ :len ($Snmp->"contact") ] > 0) \ ([ $FormatLine "Contact" ($Snmp->"contact") ] . "\n") ] . \ - [ $FormatLine "Board name" ($Resource->"board-name") ] . "\n" . \ - [ $FormatLine "Architecture" ($Resource->"architecture-name") ] . "\n" . \ + "Hardware:\n" . \ + [ $FormatLine " Board" ($Resource->"board-name") ] . "\n" . \ + [ $FormatLine " Arch" ($Resource->"architecture-name") ] . "\n" . \ [ $IfThenElse ($RouterBoard->"routerboard" = true) \ - ([ $FormatLine "Model" ($RouterBoard->"model") ] . \ + ([ $FormatLine " Model" ($RouterBoard->"model") ] . \ [ $IfThenElse ([ :len ($RouterBoard->"revision") ] > 0) \ (" " . $RouterBoard->"revision") ] . "\n" . \ - [ $FormatLine "Serial number" ($RouterBoard->"serial-number") ] . "\n") ] . \ - [ $IfThenElse ([ :len ($License->"level") ] > 0) \ - ([ $FormatLine "License" ($License->"level") ] . "\n") ] . \ + [ $FormatLine " Serial" ($RouterBoard->"serial-number") ] . "\n") ] . \ + [ $IfThenElse ([ :len ($License->"nlevel") ] > 0) \ + ([ $FormatLine " License" ("level " . ($License->"nlevel")) ] . "\n") ] . \ "RouterOS:\n" . \ + [ $IfThenElse ([ :len ($License->"level") ] > 0) \ + ([ $FormatLine " License" ("level " . ($License->"level")) ] . "\n") ] . \ [ $FormatLine " Channel" ($Update->"channel") ] . "\n" . \ [ $FormatLine " Installed" ($Update->"installed-version") ] . "\n" . \ [ $IfThenElse ([ :typeof ($Update->"latest-version") ] != "nothing" && \ From 4eafcaa3ace2be0f17618c90c0d320647dfd8e38 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 25 Feb 2025 21:26:52 +0100 Subject: [PATCH 435/893] telegram-chat: say hello when awaiting commands --- telegram-chat.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 07e3816..5db4860 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -119,7 +119,8 @@ $SendTelegram2 ({ origin=$ScriptName; chatid=($Chat->"id"); silent=true; \ replyto=($Message->"message_id"); threadid=$ThreadId; \ subject=([ $SymbolForNotification "speech-balloon" ] . "Telegram Chat"); \ - message=("Online" . [ $IfThenElse $TelegramChatActive " (and active!)" ] . ", awaiting your commands!") }); + message=([ $IfThenElse ([ :len ($From->"first_name") ] > 0) ("Hello " . ($From->"first_name") . "!\n\n") ] . \ + "Online" . [ $IfThenElse $TelegramChatActive " (and active!)" ] . ", awaiting your commands!") }); :set Done true; } :if ($Done = false && [ :pick $Command 0 1 ] = "!") do={ From 53b13b295af835658dc4ef6192624b2ae898bab1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 25 Feb 2025 21:33:08 +0100 Subject: [PATCH 436/893] mod/notification-telegram: introduce $GetTelegramChatId --- .../notification-telegram.d/getchatid.avif | Bin 0 -> 3896 bytes doc/mod/notification-telegram.md | 24 ++++++++----- global-functions.rsc | 2 +- mod/notification-telegram.rsc | 34 ++++++++++++++++++ news-and-changes.rsc | 1 + 5 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 doc/mod/notification-telegram.d/getchatid.avif diff --git a/doc/mod/notification-telegram.d/getchatid.avif b/doc/mod/notification-telegram.d/getchatid.avif new file mode 100644 index 0000000000000000000000000000000000000000..779296915de91a9b21e2f05685e34a1539d9c73e GIT binary patch literal 3896 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 ℹ️ **Info**: Copy relevant configuration from @@ -54,9 +61,10 @@ reload the configuration. ### Notifications to a group -Sending notifications to a group is possible as well. Add your bot and the -*GetIDs Bot* to a group, then use the group's id (which starts with a dash) -for `TelegramChatId`. Then remove *GetIDs Bot* from group. +Sending notifications to a group is possible as well. Add your bot to a group +and make it an admin (required for read access!) and send a message and run +`$GetTelegramChatId` again. Then use that chat id (which starts with a dash) +for `TelegramChatId`. Groups can enable the `Topics` feature. Use `TelegramThreadId` to send to a specific topic in a group. diff --git a/global-functions.rsc b/global-functions.rsc index b3166dc..43cd7f0 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -15,7 +15,7 @@ # Git commit id & info, expected configuration version :global CommitId "unknown"; :global CommitInfo "unknown"; -:global ExpectedConfigVersion 134; +:global ExpectedConfigVersion 135; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index d04893f..7782fcf 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -10,6 +10,7 @@ # https://rsc.eworm.de/doc/mod/notification-telegram.md :global FlushTelegramQueue; +:global GetTelegramChatId; :global NotificationFunctions; :global PurgeTelegramQueue; :global SendTelegram; @@ -58,6 +59,39 @@ :global ExitError; $ExitError false $0; } } +# get the chat id +:set GetTelegramChatId do={ :do { + :global TelegramTokenId; + + :global CertificateAvailable; + :global LogPrint; + + :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={ + $LogPrint warning $0 ("Downloading required certificate failed."); + :return false; + } + + :local Data; + :do { + :set Data ([ /tool/fetch check-certificate=yes-without-crl output=user \ + ("https://api.telegram.org/bot" . $TelegramTokenId . "/getUpdates?offset=0" . \ + "&allowed_updates=%5B%22message%22%5D") as-value ]->"data"); + } on-error={ + $LogPrint warning $0 ("Fetching data failed!"); + :return false; + } + + :local JSON [ :deserialize from=json value=$Data ]; + :foreach Update in=($JSON->"result") do={ + $LogPrint info $0 ("The chat id is: " . ($Update->"message"->"chat"->"id")); + :return true; + } + + $LogPrint info $0 ("No message received."); +} on-error={ + :global ExitError; $ExitError false $0; +} } + # send notification via telegram - expects one array argument :set ($NotificationFunctions->"telegram") do={ :local Notification $1; diff --git a/news-and-changes.rsc b/news-and-changes.rsc index a735ff7..459326f 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -59,6 +59,7 @@ 132="Split off plugins from 'check-health', so the script works on all devices to monitor CPU and RAM. The supported plugins for sensors in hardware are installed automatically."; 133="Updated the default configuration for 'fw-addr-lists', deprecated lists were removed, a collective list was added."; 134="Enhanced 'mod/notification-telegram' and 'telegram-chat' to support topics in groups."; + 135="Introduced helper function '\$GetTelegramChatId' for 'mod/notification-telegram' which helps retrieve information."; }; # Migration steps to be applied on script updates From f6c2225f68fae8494d620dca0fc41b50a0450977 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 26 Feb 2025 13:37:57 +0100 Subject: [PATCH 437/893] check-certificates: catch and ignore import error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hmm... 🤨 When was that runtime error introduced? I *think* it worked before. --- check-certificates.rsc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 0907395..94f23a7 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -59,10 +59,12 @@ :local DecryptionFailed true; :foreach PassPhrase in=$CertRenewPass do={ - :local Result [ /certificate/import file-name=$CertFileName passphrase=$PassPhrase as-value ]; - :if ($Result->"decryption-failures" = 0) do={ - :set DecryptionFailed false; - } + :do { + :local Result [ /certificate/import file-name=$CertFileName passphrase=$PassPhrase as-value ]; + :if ($Result->"decryption-failures" = 0) do={ + :set DecryptionFailed false; + } + } on-error={ } } $RmFile $CertFileName; From a6d4e7e82cc9870c6cfd1e0ee9724eb6129ce5ab Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 26 Feb 2025 18:03:17 +0100 Subject: [PATCH 438/893] check-certificates: drop dot from type... ... and add it in file name. --- check-certificates.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 94f23a7..20ac2e2 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -50,8 +50,8 @@ :local Return false; - :foreach Type in={ ".pem"; ".p12" } do={ - :local CertFileName ([ $UrlEncode $FetchName ] . $Type); + :foreach Type in={ "pem"; "p12" } do={ + :local CertFileName ([ $UrlEncode $FetchName ] . "." . $Type); :do { /tool/fetch check-certificate=yes-without-crl http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) \ ($CertRenewUrl . $CertFileName) dst-path=$CertFileName as-value; From 3d40b4419d47f41edf5059c00c1ab575f49c6da1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 26 Feb 2025 13:40:12 +0100 Subject: [PATCH 439/893] check-certificates: add more debug output --- check-certificates.rsc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 20ac2e2..6862015 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -58,10 +58,12 @@ $WaitForFile $CertFileName; :local DecryptionFailed true; - :foreach PassPhrase in=$CertRenewPass do={ + :foreach I,PassPhrase in=$CertRenewPass do={ :do { + $LogPrint debug $ScriptName ("Trying " . $I . ". passphrase... "); :local Result [ /certificate/import file-name=$CertFileName passphrase=$PassPhrase as-value ]; :if ($Result->"decryption-failures" = 0) do={ + $LogPrint debug $ScriptName ("Success!"); :set DecryptionFailed false; } } on-error={ } From 512c54bd590503af27e754c5c65c34b5307cf9c9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 26 Feb 2025 13:55:09 +0100 Subject: [PATCH 440/893] check-certificates: ... and even more --- check-certificates.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/check-certificates.rsc b/check-certificates.rsc index 6862015..6dff9ba 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -52,6 +52,9 @@ :foreach Type in={ "pem"; "p12" } do={ :local CertFileName ([ $UrlEncode $FetchName ] . "." . $Type); + $LogPrint debug $ScriptName ("Trying type '" . $Type . "' for '" . $CertName . \ + "' (file '" . $CertFileName . "')..."); + :do { /tool/fetch check-certificate=yes-without-crl http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) \ ($CertRenewUrl . $CertFileName) dst-path=$CertFileName as-value; From e833dfcf25175fb1d5c652dcf898c6332ce70404 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 26 Feb 2025 13:51:25 +0100 Subject: [PATCH 441/893] check-certificates: simplify return from function... ... and also break earch on success. --- check-certificates.rsc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 6dff9ba..5065c33 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -48,8 +48,6 @@ :global UrlEncode; :global WaitForFile; - :local Return false; - :foreach Type in={ "pem"; "p12" } do={ :local CertFileName ([ $UrlEncode $FetchName ] . "." . $Type); $LogPrint debug $ScriptName ("Trying type '" . $Type . "' for '" . $CertName . \ @@ -84,13 +82,13 @@ $CertificateNameByCN [ /certificate/get $CertInChain common-name ]; } - :set Return true; + :return true; } on-error={ $LogPrint debug $ScriptName ("Could not download certificate file '" . $CertFileName . "'."); } } - :return $Return; + :return false; } :local FormatInfo do={ From 14195c51ca381063789ca58c760d70037328e600 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 26 Feb 2025 18:25:58 +0100 Subject: [PATCH 442/893] check-certificates: try PKCS#12 before PEM... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ... as that is more likely to have a private key. Is that true? 🤨 --- check-certificates.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 5065c33..be8e4df 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -48,7 +48,7 @@ :global UrlEncode; :global WaitForFile; - :foreach Type in={ "pem"; "p12" } do={ + :foreach Type in={ "p12"; "pem" } do={ :local CertFileName ([ $UrlEncode $FetchName ] . "." . $Type); $LogPrint debug $ScriptName ("Trying type '" . $Type . "' for '" . $CertName . \ "' (file '" . $CertFileName . "')..."); From b11be59b0824efac6df128fde46a529ced14a2d0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 27 Feb 2025 10:44:53 +0100 Subject: [PATCH 443/893] README: quote the certificate file name --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a76d50f..fae6986 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ file to your MikroTik device. Then we import the certificate. - /certificate/import file-name=isrg-root-x2.pem passphrase=""; + /certificate/import file-name="isrg-root-x2.pem" passphrase=""; Do not worry that the command is not shown - that happens because it contains a sensitive property, the passphrase. From e2fe653035ca2217dc56235de780f72dbb790e1d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 26 Feb 2025 20:16:12 +0100 Subject: [PATCH 444/893] mod/notification-telegram: $GetTelegramChatId: use last message --- mod/notification-telegram.rsc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 7782fcf..4528615 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -82,12 +82,15 @@ } :local JSON [ :deserialize from=json value=$Data ]; - :foreach Update in=($JSON->"result") do={ - $LogPrint info $0 ("The chat id is: " . ($Update->"message"->"chat"->"id")); - :return true; + :local Count [ :len ($JSON->"result") ]; + + :if ($Count = 0) do={ + $LogPrint info $0 ("No message received."); + :return false; } - $LogPrint info $0 ("No message received."); + :local Message ($JSON->"result"->($Count - 1)->"message"); + $LogPrint info $0 ("The chat id is: " . ($Message->"chat"->"id")); } on-error={ :global ExitError; $ExitError false $0; } } From f5189b8bd7ca01fb6e26414960764960a03066c4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 27 Feb 2025 10:45:30 +0100 Subject: [PATCH 445/893] INITIAL-COMMANDS: quote the certificate file name --- INITIAL-COMMANDS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 424ef32..8b64d28 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -19,7 +19,7 @@ Run the complete base installation: { /tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/ISRG-Root-X2.pem" dst-path="isrg-root-x2.pem" as-value; :delay 1s; - /certificate/import file-name=isrg-root-x2.pem passphrase=""; + /certificate/import file-name="isrg-root-x2.pem" passphrase=""; :if ([ :len [ /certificate/find where fingerprint="69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470" ] ] != 1) do={ :error "Something is wrong with your certificates!"; }; From 0c4fb42616f8015dd128ec7df1d1afce590d26ed Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 26 Feb 2025 20:18:12 +0100 Subject: [PATCH 446/893] mod/notification-telegram: $GetTelegramChatId: give thead id... ... if message was sent to group's topic. --- mod/notification-telegram.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 4528615..68e913f 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -91,6 +91,9 @@ :local Message ($JSON->"result"->($Count - 1)->"message"); $LogPrint info $0 ("The chat id is: " . ($Message->"chat"->"id")); + :if (($Message->"is_topic_message") = true) do={ + $LogPrint info $0 ("The thread id is: " . ($Message->"message_thread_id")); + } } on-error={ :global ExitError; $ExitError false $0; } } From 33c02e06092eded4b3344a6eb22742c9be531fb2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 3 Mar 2025 09:10:54 +0100 Subject: [PATCH 447/893] ipv6-update: ignore if prefix is no longer valid --- ipv6-update.rsc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ipv6-update.rsc b/ipv6-update.rsc index c6e3d65..beccde0 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -20,7 +20,9 @@ :global ScriptLock; :local NaAddress $"na-address"; + :local NaValid $"na-valid"; :local PdPrefix $"pd-prefix"; + :local PdValid $"pd-valid"; :if ([ $ScriptLock $ScriptName ] = false) do={ :set ExitOK true; @@ -39,6 +41,12 @@ :error false; } + :if ($PdValid != 1) do={ + $LogPrint info $ScriptName ("The prefix " . $PdPrefix . " is no longer valid. Ignoring."); + :set ExitOK true; + :error false; + } + :local Pool [ /ipv6/pool/get [ find where prefix=$PdPrefix ] name ]; :if ([ :len [ /ipv6/firewall/address-list/find where comment=("ipv6-pool-" . $Pool) ] ] = 0) do={ /ipv6/firewall/address-list/add list=("ipv6-pool-" . $Pool) address=:: comment=("ipv6-pool-" . $Pool) dynamic=yes; From 469f783a92c8e67088d70572157ff4cd7d47fcd8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 3 Mar 2025 09:12:43 +0100 Subject: [PATCH 448/893] ipv6-update: check for availability of both variables --- ipv6-update.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ipv6-update.rsc b/ipv6-update.rsc index beccde0..94bd1bc 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -35,7 +35,7 @@ :error false; } - :if ([ :typeof $PdPrefix ] = "nothing") do={ + :if ([ :typeof $PdPrefix ] = "nothing" || [ :typeof $PdValid ] = "nothing") do={ $LogPrint error $ScriptName ("This script is supposed to run from ipv6 dhcp-client."); :set ExitOK true; :error false; From 3ccaafd1b38f4335aa28361778aa37db2ca22d5f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 5 Mar 2025 00:28:01 +0100 Subject: [PATCH 449/893] global-functions: $ScriptInstallUpdate: move code into block --- global-functions.rsc | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 43cd7f0..8fcd56d 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1163,7 +1163,12 @@ } } - :if (!($ScriptInfo->"ignore" = true)) do={ + :do { + :if ($ScriptInfo->"ignore" = true) do={ + $LogPrint debug $0 ("Ignoring script '" . $ScriptVal->"name" . "', as requested."); + :error true; + } + :do { :local BaseUrl [ $EitherOr ($ScriptInfo->"base-url") $ScriptUpdatesBaseUrl ]; :local UrlSuffix [ $EitherOr ($ScriptInfo->"url-suffix") $ScriptUpdatesUrlSuffix ]; @@ -1182,10 +1187,9 @@ } else={ $LogPrint warning $0 ("Failed fetching script '" . $ScriptVal->"name" . "'!"); } + :error false; } - } - :do { :if ([ :len $SourceNew ] = 0) do={ $LogPrint debug $0 ("No update for script '" . $ScriptVal->"name" . "'."); :error false; From 0c1d96f89dfb4d209b0848d5ac2d81a640e0f056 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 5 Mar 2025 00:18:43 +0100 Subject: [PATCH 450/893] global-functions: $ScriptInstallUpdate: get and compare checksums MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The file 'checksums.json' is generated when deploying to my web server... This should speed up the update a lot as it reduces downloads to a minimum. 🎉😁 --- global-functions.rsc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 8fcd56d..8405c92 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1150,6 +1150,14 @@ :local ReloadGlobalConfig false; :local DeviceMode [ /system/device-mode/get ]; + :local CheckSums ({}); + :do { + :local Url ($ScriptUpdatesBaseUrl . "checksums.json" . $ScriptUpdatesUrlSuffix); + $LogPrint debug $0 ("Fetching checksums from url: " . $Url); + :set CheckSums [ :deserialize from=json ([ /tool/fetch check-certificate=yes-without-crl \ + http-header-field=({ [ $FetchUserAgentStr $0 ] }) $Url output=user as-value ]->"data") ]; + } on-error={ } + :foreach Script in=[ /system/script/find where source~"^#!rsc by RouterOS\r?\n" ] do={ :local ScriptVal [ /system/script/get $Script ]; :local ScriptInfo [ $ParseKeyValueStore ($ScriptVal->"comment") ]; @@ -1169,6 +1177,11 @@ :error true; } + :if ([ :convert transform=md5 to=hex ($ScriptVal->"source") ] = ($CheckSums->($ScriptVal->"name"))) do={ + $LogPrint debug $0 ("Checksum for script '" . $ScriptVal->"name" . "' matches, ignoring."); + :error true; + } + :do { :local BaseUrl [ $EitherOr ($ScriptInfo->"base-url") $ScriptUpdatesBaseUrl ]; :local UrlSuffix [ $EitherOr ($ScriptInfo->"url-suffix") $ScriptUpdatesUrlSuffix ]; From 10374afc182cd8b08e07a3d45890518e8b6be73c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 5 Mar 2025 01:37:42 +0100 Subject: [PATCH 451/893] global-functions: $ScriptInstallUpdate: support checksums for CRLF scripts --- global-functions.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 8405c92..d883aa0 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1177,7 +1177,8 @@ :error true; } - :if ([ :convert transform=md5 to=hex ($ScriptVal->"source") ] = ($CheckSums->($ScriptVal->"name"))) do={ + :if ([ :convert transform=md5 to=hex ($ScriptVal->"source") ] = ($CheckSums->($ScriptVal->"name")) || \ + [ :convert transform=md5 to=hex [ :tolf ($ScriptVal->"source") ] ] = ($CheckSums->($ScriptVal->"name"))) do={ $LogPrint debug $0 ("Checksum for script '" . $ScriptVal->"name" . "' matches, ignoring."); :error true; } From c9de6d85790897a945910316a14db16b0435c41e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 5 Mar 2025 01:39:59 +0100 Subject: [PATCH 452/893] global-functions: $ScriptInstallUpdate: put checksum into variable --- global-functions.rsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index d883aa0..a9fa938 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1177,8 +1177,9 @@ :error true; } - :if ([ :convert transform=md5 to=hex ($ScriptVal->"source") ] = ($CheckSums->($ScriptVal->"name")) || \ - [ :convert transform=md5 to=hex [ :tolf ($ScriptVal->"source") ] ] = ($CheckSums->($ScriptVal->"name"))) do={ + :local CheckSum ($CheckSums->($ScriptVal->"name")); + :if ([ :convert transform=md5 to=hex ($ScriptVal->"source") ] = $CheckSum || \ + [ :convert transform=md5 to=hex [ :tolf ($ScriptVal->"source") ] ] = $CheckSum) do={ $LogPrint debug $0 ("Checksum for script '" . $ScriptVal->"name" . "' matches, ignoring."); :error true; } From b13360e4b86838d95cd8c9a1a4e2ea8d757dbb0f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 5 Mar 2025 01:53:04 +0100 Subject: [PATCH 453/893] global-functions: $ScriptInstallUpdate: simplify check This one should suffice... --- global-functions.rsc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index a9fa938..4c777a1 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1178,8 +1178,7 @@ } :local CheckSum ($CheckSums->($ScriptVal->"name")); - :if ([ :convert transform=md5 to=hex ($ScriptVal->"source") ] = $CheckSum || \ - [ :convert transform=md5 to=hex [ :tolf ($ScriptVal->"source") ] ] = $CheckSum) do={ + :if ([ :convert transform=md5 to=hex [ :tolf ($ScriptVal->"source") ] ] = $CheckSum) do={ $LogPrint debug $0 ("Checksum for script '" . $ScriptVal->"name" . "' matches, ignoring."); :error true; } From 1b46a5fd9bc69f4d609b28e7ff8d36717a3b9a8f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 5 Mar 2025 08:55:06 +0100 Subject: [PATCH 454/893] global-functions: $ScriptInstallUpdate: checksum only for same source So ignore if script is fetched from different base or with different suffix. --- global-functions.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 4c777a1..da31165 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1178,7 +1178,8 @@ } :local CheckSum ($CheckSums->($ScriptVal->"name")); - :if ([ :convert transform=md5 to=hex [ :tolf ($ScriptVal->"source") ] ] = $CheckSum) do={ + :if ([ :len ($ScriptInfo->"base-url") ] = 0 && [ :len ($ScriptInfo->"url-suffix") ] = 0 && \ + [ :convert transform=md5 to=hex [ :tolf ($ScriptVal->"source") ] ] = $CheckSum) do={ $LogPrint debug $0 ("Checksum for script '" . $ScriptVal->"name" . "' matches, ignoring."); :error true; } From e341e1c30ca4ff8b87bc757cc5c0effbc50a7ea6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 6 Mar 2025 15:02:31 +0100 Subject: [PATCH 455/893] global-functions: introduce $LogPrintVerbose ... ... which is a declared function, but has no code, intentionally. It can be called as a no-op by default. If you want this output set the function to be the same as $LogPrint: :set LogPrintVerbose $LogPrint; --- global-functions.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index da31165..911ff6a 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -55,6 +55,7 @@ :global IsTimeSync; :global LogPrint; :global LogPrintOnce; +:global LogPrintVerbose; :global MAX; :global MIN; :global MkDir; @@ -848,6 +849,8 @@ :return true; } +# The function $LogPrintVerbose is declared, but has no code, intentionally. + # get max value :set MAX do={ :if ($1 > $2) do={ :return $1; } From 6d718ec9877c3ecfc10681e85d050d15ed4d4b80 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 6 Mar 2025 14:38:35 +0100 Subject: [PATCH 456/893] fw-addr-lists: use $LogPrintVerbose ... ... to reduce debug output and speed up execution. --- fw-addr-lists.rsc | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index d41dc04..af8c65d 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -24,6 +24,7 @@ :global HumanReadableNum; :global LogPrint; :global LogPrintOnce; + :global LogPrintVerbose; :global ScriptLock; :global WaitFullyConnected; @@ -120,14 +121,14 @@ list=$FwListName comment=$ListComment ] do={ :local Address [ /ip/firewall/address-list/get $Entry address ]; :if ([ :typeof ($IPv4Addresses->$Address) ] = "time") do={ - $LogPrint debug $ScriptName ("Renewing IPv4 address in list '" . $FwListName . \ + $LogPrintVerbose debug $ScriptName ("Renewing IPv4 address in list '" . $FwListName . \ "' with " . ($IPv4Addresses->$Address) . ": " . $Address); /ip/firewall/address-list/set $Entry timeout=($IPv4Addresses->$Address); :set ($IPv4Addresses->$Address); :set CntRenew ($CntRenew + 1); } else={ :if ($Failure = false) do={ - $LogPrint debug $ScriptName ("Removing IPv4 address from list '" . $FwListName . \ + $LogPrintVerbose debug $ScriptName ("Removing IPv4 address from list '" . $FwListName . \ "': " . $Address); /ip/firewall/address-list/remove $Entry; :set CntRemove ($CntRemove + 1); @@ -139,14 +140,14 @@ list=$FwListName comment=$ListComment ] do={ :local Address [ /ipv6/firewall/address-list/get $Entry address ]; :if ([ :typeof ($IPv6Addresses->$Address) ] = "time") do={ - $LogPrint debug $ScriptName ("Renewing IPv6 address in list '" . $FwListName . \ + $LogPrintVerbose debug $ScriptName ("Renewing IPv6 address in list '" . $FwListName . \ "' with " . ($IPv6Addresses->$Address) . ": " . $Address); /ipv6/firewall/address-list/set $Entry timeout=($IPv6Addresses->$Address); :set ($IPv6Addresses->$Address); :set CntRenew ($CntRenew + 1); } else={ :if ($Failure = false) do={ - $LogPrint debug $ScriptName ("Removing IPv6 address from list '" . $FwListName . \ + $LogPrintVerbose debug $ScriptName ("Removing IPv6 address from list '" . $FwListName . \ "': " . $Address); /ipv6/firewall/address-list/remove $Entry; :set CntRemove ($CntRemove + 1); @@ -155,7 +156,7 @@ } :foreach Address,Timeout in=$IPv4Addresses do={ - $LogPrint debug $ScriptName ("Adding IPv4 address to list '" . $FwListName . \ + $LogPrintVerbose debug $ScriptName ("Adding IPv4 address to list '" . $FwListName . \ "' with " . $Timeout . ": " . $Address); :do { /ip/firewall/address-list/add list=$FwListName comment=$ListComment \ @@ -169,7 +170,7 @@ } :foreach Address,Timeout in=$IPv6Addresses do={ - $LogPrint debug $ScriptName ("Adding IPv6 address to list '" . $FwListName . \ + $LogPrintVerbose debug $ScriptName ("Adding IPv6 address to list '" . $FwListName . \ "' with " . $Timeout . ": " . $Address); :do { /ipv6/firewall/address-list/add list=$FwListName comment=$ListComment \ From 7be26a07125b9c946859560bd59323f84feb9494 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 6 Mar 2025 14:54:38 +0100 Subject: [PATCH 457/893] DEBUG: add info on $LogPrintVerbose --- DEBUG.md | 14 ++++++++++++++ global-functions.rsc | 1 + 2 files changed, 15 insertions(+) diff --git a/DEBUG.md b/DEBUG.md index 3d7f025..d5e9beb 100644 --- a/DEBUG.md +++ b/DEBUG.md @@ -44,6 +44,20 @@ instead. Disable or remote that setting to restore regular logging. +## Verbose output + +Specific scripts can generate huge amount of output. These do use a function +`$LogPrintVerbose`, which is declared, but has no code, intentionally. + +If you *really* want that output set the function to be the same as +`$LogPrint`: + + :set LogPrintVerbose $LogPrint; + +To revert that change just run: + + :set LogPrintVerbose; + --- [⬅️ Go back to main README](README.md) [⬆️ Go back to top](#top) diff --git a/global-functions.rsc b/global-functions.rsc index 911ff6a..8ae7bb8 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -850,6 +850,7 @@ } # The function $LogPrintVerbose is declared, but has no code, intentionally. +# https://rsc.eworm.de/DEBUG.md#verbose-output # get max value :set MAX do={ From fb343c99e399d679f3e2a22e76c14a5899024319 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 6 Mar 2025 22:59:31 +0100 Subject: [PATCH 458/893] fw-addr-lists: put timeout into variable --- fw-addr-lists.rsc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index af8c65d..331d2c6 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -120,10 +120,11 @@ :foreach Entry in=[ /ip/firewall/address-list/find where \ list=$FwListName comment=$ListComment ] do={ :local Address [ /ip/firewall/address-list/get $Entry address ]; - :if ([ :typeof ($IPv4Addresses->$Address) ] = "time") do={ + :local TimeOut ($IPv4Addresses->$Address); + :if ([ :typeof $TimeOut ] = "time") do={ $LogPrintVerbose debug $ScriptName ("Renewing IPv4 address in list '" . $FwListName . \ - "' with " . ($IPv4Addresses->$Address) . ": " . $Address); - /ip/firewall/address-list/set $Entry timeout=($IPv4Addresses->$Address); + "' with " . $TimeOut . ": " . $Address); + /ip/firewall/address-list/set $Entry timeout=$TimeOut; :set ($IPv4Addresses->$Address); :set CntRenew ($CntRenew + 1); } else={ @@ -139,10 +140,11 @@ :foreach Entry in=[ /ipv6/firewall/address-list/find where \ list=$FwListName comment=$ListComment ] do={ :local Address [ /ipv6/firewall/address-list/get $Entry address ]; - :if ([ :typeof ($IPv6Addresses->$Address) ] = "time") do={ + :local TimeOut ($IPv6Addresses->$Address); + :if ([ :typeof $TimeOut ] = "time") do={ $LogPrintVerbose debug $ScriptName ("Renewing IPv6 address in list '" . $FwListName . \ - "' with " . ($IPv6Addresses->$Address) . ": " . $Address); - /ipv6/firewall/address-list/set $Entry timeout=($IPv6Addresses->$Address); + "' with " . $TimeOut . ": " . $Address); + /ipv6/firewall/address-list/set $Entry timeout=$TimeOut; :set ($IPv6Addresses->$Address); :set CntRenew ($CntRenew + 1); } else={ From ea6de35699a5b62dfffcc583c1a7181e1a6a688f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 6 Mar 2025 23:00:50 +0100 Subject: [PATCH 459/893] fw-addr-lists: do not clean up Cleanup is important on renew (so the script does not attempt to re-add), but we do not care here. --- fw-addr-lists.rsc | 2 -- 1 file changed, 2 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 331d2c6..70893e3 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -163,7 +163,6 @@ :do { /ip/firewall/address-list/add list=$FwListName comment=$ListComment \ address=$Address timeout=$Timeout; - :set ($IPv4Addresses->$Address); :set CntAdd ($CntAdd + 1); } on-error={ $LogPrint warning $ScriptName ("Failed to add IPv4 address to list '" . $FwListName . \ @@ -177,7 +176,6 @@ :do { /ipv6/firewall/address-list/add list=$FwListName comment=$ListComment \ address=$Address timeout=$Timeout; - :set ($IPv6Addresses->$Address); :set CntAdd ($CntAdd + 1); } on-error={ $LogPrint warning $ScriptName ("Failed to add IPv6 address to list '" . $FwListName . \ From 2f55bfaf009d726e1174b50887fdb8f9b4b57573 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Mar 2025 12:21:22 +0100 Subject: [PATCH 460/893] fw-addr-lists: strip cidr for host addresses This makes sure the addresses match later when we read them from address-list for renew. --- fw-addr-lists.rsc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 70893e3..fc53795 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -101,10 +101,16 @@ } :do { :if ($Address ~ "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}(/[0-9]{1,2})?\$") do={ + :if ($Address ~ "/32\$") do={ + :set Address [ :pick $Address 0 ([ :len $Address ] - 3) ]; + } :set ($IPv4Addresses->$Address) $TimeOut; :error true; } :if ($Address ~ "^[0-9a-zA-Z]*:[0-9a-zA-Z:\\.]+(/[0-9]{1,3})?\$") do={ + :if ($Address ~ "/128\$") do={ + :set Address [ :pick $Address 0 ([ :len $Address ] - 4) ]; + } :set ($IPv6Addresses->$Address) $TimeOut; :error true; } From e148df9e573801803e35d8dfaef277f571952fdc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 6 Mar 2025 23:05:45 +0100 Subject: [PATCH 461/893] fw-addr-lists: put addresses into "branches"... ... effectively adding another layer and some complexity, but: The addresses are sorted inside the array, and sorting less addresses in a branch saves a lot of processing power. So this is a lot faster now... --- fw-addr-lists.rsc | 65 +++++++++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index fc53795..a97f7ed 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -100,23 +100,24 @@ :set Address ([ :pick $Line 0 [ $FindDelim $Line ] ] . ($List->"cidr")); } :do { + :local Branch [ :pick $Address 0 1 ]; :if ($Address ~ "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}(/[0-9]{1,2})?\$") do={ :if ($Address ~ "/32\$") do={ :set Address [ :pick $Address 0 ([ :len $Address ] - 3) ]; } - :set ($IPv4Addresses->$Address) $TimeOut; + :set ($IPv4Addresses->$Branch->$Address) $TimeOut; :error true; } :if ($Address ~ "^[0-9a-zA-Z]*:[0-9a-zA-Z:\\.]+(/[0-9]{1,3})?\$") do={ :if ($Address ~ "/128\$") do={ :set Address [ :pick $Address 0 ([ :len $Address ] - 4) ]; } - :set ($IPv6Addresses->$Address) $TimeOut; + :set ($IPv6Addresses->$Branch->$Address) $TimeOut; :error true; } :if ($Address ~ "^[\\.a-zA-Z0-9-]+\\.[a-zA-Z]{2,}\$") do={ - :set ($IPv4Addresses->$Address) $TimeOut; - :set ($IPv6Addresses->$Address) $TimeOut; + :set ($IPv4Addresses->$Branch->$Address) $TimeOut; + :set ($IPv6Addresses->$Branch->$Address) $TimeOut; :error true; } } on-error={ } @@ -126,12 +127,13 @@ :foreach Entry in=[ /ip/firewall/address-list/find where \ list=$FwListName comment=$ListComment ] do={ :local Address [ /ip/firewall/address-list/get $Entry address ]; - :local TimeOut ($IPv4Addresses->$Address); + :local Branch [ :pick $Address 0 1 ]; + :local TimeOut ($IPv4Addresses->$Branch->$Address); :if ([ :typeof $TimeOut ] = "time") do={ $LogPrintVerbose debug $ScriptName ("Renewing IPv4 address in list '" . $FwListName . \ "' with " . $TimeOut . ": " . $Address); /ip/firewall/address-list/set $Entry timeout=$TimeOut; - :set ($IPv4Addresses->$Address); + :set ($IPv4Addresses->$Branch->$Address); :set CntRenew ($CntRenew + 1); } else={ :if ($Failure = false) do={ @@ -146,12 +148,13 @@ :foreach Entry in=[ /ipv6/firewall/address-list/find where \ list=$FwListName comment=$ListComment ] do={ :local Address [ /ipv6/firewall/address-list/get $Entry address ]; - :local TimeOut ($IPv6Addresses->$Address); + :local Branch [ :pick $Address 0 1 ]; + :local TimeOut ($IPv6Addresses->$Branch->$Address); :if ([ :typeof $TimeOut ] = "time") do={ $LogPrintVerbose debug $ScriptName ("Renewing IPv6 address in list '" . $FwListName . \ "' with " . $TimeOut . ": " . $Address); /ipv6/firewall/address-list/set $Entry timeout=$TimeOut; - :set ($IPv6Addresses->$Address); + :set ($IPv6Addresses->$Branch->$Address); :set CntRenew ($CntRenew + 1); } else={ :if ($Failure = false) do={ @@ -163,29 +166,35 @@ } } - :foreach Address,Timeout in=$IPv4Addresses do={ - $LogPrintVerbose debug $ScriptName ("Adding IPv4 address to list '" . $FwListName . \ - "' with " . $Timeout . ": " . $Address); - :do { - /ip/firewall/address-list/add list=$FwListName comment=$ListComment \ - address=$Address timeout=$Timeout; - :set CntAdd ($CntAdd + 1); - } on-error={ - $LogPrint warning $ScriptName ("Failed to add IPv4 address to list '" . $FwListName . \ - "': " . $Address); + :foreach BranchName,Branch in=$IPv4Addresses do={ + $LogPrintVerbose debug $ScriptName ("Handling branch: " . $BranchName); + :foreach Address,Timeout in=$Branch do={ + $LogPrintVerbose debug $ScriptName ("Adding IPv4 address to list '" . $FwListName . \ + "' with " . $Timeout . ": " . $Address); + :do { + /ip/firewall/address-list/add list=$FwListName comment=$ListComment \ + address=$Address timeout=$Timeout; + :set CntAdd ($CntAdd + 1); + } on-error={ + $LogPrint warning $ScriptName ("Failed to add IPv4 address to list '" . $FwListName . \ + "': " . $Address); + } } } - :foreach Address,Timeout in=$IPv6Addresses do={ - $LogPrintVerbose debug $ScriptName ("Adding IPv6 address to list '" . $FwListName . \ - "' with " . $Timeout . ": " . $Address); - :do { - /ipv6/firewall/address-list/add list=$FwListName comment=$ListComment \ - address=$Address timeout=$Timeout; - :set CntAdd ($CntAdd + 1); - } on-error={ - $LogPrint warning $ScriptName ("Failed to add IPv6 address to list '" . $FwListName . \ - "': " . $Address); + :foreach BranchName,Branch in=$IPv6Addresses do={ + $LogPrintVerbose debug $ScriptName ("Handling branch: " . $BranchName); + :foreach Address,Timeout in=$Branch do={ + $LogPrintVerbose debug $ScriptName ("Adding IPv6 address to list '" . $FwListName . \ + "' with " . $Timeout . ": " . $Address); + :do { + /ipv6/firewall/address-list/add list=$FwListName comment=$ListComment \ + address=$Address timeout=$Timeout; + :set CntAdd ($CntAdd + 1); + } on-error={ + $LogPrint warning $ScriptName ("Failed to add IPv6 address to list '" . $FwListName . \ + "': " . $Address); + } } } From d71ea804b077d35183df318fb305b213fb961d27 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Mar 2025 20:35:36 +0100 Subject: [PATCH 462/893] fw-addr-lists: two characters for branch Using one character for IPv4 is ok (1 to 9), but IPv6 global unicase (2000::/3) results in just two different characters (2 and 3). So let's use first two characters... --- fw-addr-lists.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index a97f7ed..9ad5b3a 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -100,7 +100,7 @@ :set Address ([ :pick $Line 0 [ $FindDelim $Line ] ] . ($List->"cidr")); } :do { - :local Branch [ :pick $Address 0 1 ]; + :local Branch [ :pick $Address 0 2 ]; :if ($Address ~ "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}(/[0-9]{1,2})?\$") do={ :if ($Address ~ "/32\$") do={ :set Address [ :pick $Address 0 ([ :len $Address ] - 3) ]; @@ -127,7 +127,7 @@ :foreach Entry in=[ /ip/firewall/address-list/find where \ list=$FwListName comment=$ListComment ] do={ :local Address [ /ip/firewall/address-list/get $Entry address ]; - :local Branch [ :pick $Address 0 1 ]; + :local Branch [ :pick $Address 0 2 ]; :local TimeOut ($IPv4Addresses->$Branch->$Address); :if ([ :typeof $TimeOut ] = "time") do={ $LogPrintVerbose debug $ScriptName ("Renewing IPv4 address in list '" . $FwListName . \ @@ -148,7 +148,7 @@ :foreach Entry in=[ /ipv6/firewall/address-list/find where \ list=$FwListName comment=$ListComment ] do={ :local Address [ /ipv6/firewall/address-list/get $Entry address ]; - :local Branch [ :pick $Address 0 1 ]; + :local Branch [ :pick $Address 0 2 ]; :local TimeOut ($IPv6Addresses->$Branch->$Address); :if ([ :typeof $TimeOut ] = "time") do={ $LogPrintVerbose debug $ScriptName ("Renewing IPv6 address in list '" . $FwListName . \ From f0e6cbcfe1a0be05f30d37cd495d4dbea0888f07 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 8 Mar 2025 10:09:51 +0100 Subject: [PATCH 463/893] fw-addr-lists: get branch from calculated checksum The addresses were spread very uneven before. Let's calculate a checksum, and take the first two characters of that. The addresses are now spread evenly on 256 branches (0x00 to 0xff). --- fw-addr-lists.rsc | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 9ad5b3a..f0940fe 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -37,6 +37,11 @@ } } + :local GetBranch do={ + :global EitherOr; + :return [ :pick [ :convert transform=md5 to=hex [ :pick $1 0 [ $EitherOr [ :find $1 "/" ] [ :len $1 ] ] ] ] 0 2 ]; + } + :if ([ $ScriptLock $ScriptName ] = false) do={ :set ExitOK true; :error false; @@ -100,7 +105,7 @@ :set Address ([ :pick $Line 0 [ $FindDelim $Line ] ] . ($List->"cidr")); } :do { - :local Branch [ :pick $Address 0 2 ]; + :local Branch [ $GetBranch $Address ]; :if ($Address ~ "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}(/[0-9]{1,2})?\$") do={ :if ($Address ~ "/32\$") do={ :set Address [ :pick $Address 0 ([ :len $Address ] - 3) ]; @@ -127,7 +132,7 @@ :foreach Entry in=[ /ip/firewall/address-list/find where \ list=$FwListName comment=$ListComment ] do={ :local Address [ /ip/firewall/address-list/get $Entry address ]; - :local Branch [ :pick $Address 0 2 ]; + :local Branch [ $GetBranch $Address ]; :local TimeOut ($IPv4Addresses->$Branch->$Address); :if ([ :typeof $TimeOut ] = "time") do={ $LogPrintVerbose debug $ScriptName ("Renewing IPv4 address in list '" . $FwListName . \ @@ -148,7 +153,7 @@ :foreach Entry in=[ /ipv6/firewall/address-list/find where \ list=$FwListName comment=$ListComment ] do={ :local Address [ /ipv6/firewall/address-list/get $Entry address ]; - :local Branch [ :pick $Address 0 2 ]; + :local Branch [ $GetBranch $Address ]; :local TimeOut ($IPv6Addresses->$Branch->$Address); :if ([ :typeof $TimeOut ] = "time") do={ $LogPrintVerbose debug $ScriptName ("Renewing IPv6 address in list '" . $FwListName . \ From eb59dd21caf8026748eada3aee137b8e3b6590b7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Mar 2025 17:33:51 +0100 Subject: [PATCH 464/893] check-routeros-update: check perpetual license... ... as these have to be renewed and can expire. --- check-routeros-update.rsc | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 361be34..8d200d2 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -66,6 +66,27 @@ :error "A reboot for update is already scheduled."; } + :local License [ /system/license/get ]; + :if ([ :typeof ($License->"deadline-at") ] = "str") do={ + :if ([ :len ($License->"next-renewal-at") ] = 0 && ($License->"limited-upgrades") = true) do={ + $LogPrint warning $ScriptName ("Your license expired on " . ($License->"deadline-at") . "!"); + $SendNotification2 ({ origin=$ScriptName; \ + subject=([ $SymbolForNotification "warning-sign" ] . "License expired!"); \ + message=("Your license expired on " . ($License->"deadline-at") . \ + ", can no longer update RouterOS on " . $Identity . "...") }); + :set ExitOK true; + :error false; + } + + :if ([ :totime ($License->"next-renewal-at") ] + 1w < [ :timestamp ]) do={ + $LogPrint warning $ScriptName ("Your license will expire on " . ($License->"deadline-at") . "!"); + $SendNotification2 ({ origin=$ScriptName; \ + subject=([ $SymbolForNotification "warning-sign" ] . "License about to expire!"); \ + message=("Your license failed to renew and is about to expire on " . \ + ($License->"deadline-at") . " on " . $Identity . "...") }); + } + } + $LogPrint debug $ScriptName ("Checking for updates..."); /system/package/update/check-for-updates without-paging as-value; :local Update [ /system/package/update/get ]; From 788400c4586b6a2e61c6e36acd10ab5d20da00c9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Mar 2025 16:29:06 +0100 Subject: [PATCH 465/893] fw-addr-lists: raw.githubusercontent.com requires 'USERTrust RSA Certification Authority' now --- certs/Makefile | 2 +- .../USERTrust-RSA-Certification-Authority.pem | 41 +++++++++++++++++++ global-config.rsc | 2 +- 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 certs/USERTrust-RSA-Certification-Authority.pem diff --git a/certs/Makefile b/certs/Makefile index 4e252b4..3ccad6e 100644 --- a/certs/Makefile +++ b/certs/Makefile @@ -15,7 +15,7 @@ DOMAINS_DUAL = \ git.eworm.de/ISRG-Root-X2 \ lists.blocklist.de/Certum-Trusted-Network-CA \ matrix.org/GTS-Root-R4 \ - raw.githubusercontent.com/DigiCert-Global-Root-G2 \ + raw.githubusercontent.com/USERTrust-RSA-Certification-Authority \ rsc.eworm.de/ISRG-Root-X2 \ upgrade.mikrotik.com/ISRG-Root-X1 DOMAINS_IPV4 = \ diff --git a/certs/USERTrust-RSA-Certification-Authority.pem b/certs/USERTrust-RSA-Certification-Authority.pem new file mode 100644 index 0000000..0fbeef6 --- /dev/null +++ b/certs/USERTrust-RSA-Certification-Authority.pem @@ -0,0 +1,41 @@ +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- diff --git a/global-config.rsc b/global-config.rsc index 2524ded..fa32b16 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -103,7 +103,7 @@ # cert="ISRG Root X2" }; { url="https://raw.githubusercontent.com/stamparm/ipsum/refs/heads/master/levels/4.txt"; # # higher level (decrease the numerical value) for more addresses, and vice versa - cert="DigiCert Global Root G2" }; + cert="USERTrust RSA Certification Authority" }; { url="https://www.dshield.org/block.txt"; cidr="/24"; cert="ISRG Root X1" }; { url="https://lists.blocklist.de/lists/strongips.txt"; From 97b99316b2f96fa9c5d2f539e31aa308e86c99b4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Mar 2025 10:31:11 +0100 Subject: [PATCH 466/893] netwatch-notify: increase timeout... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ... as a timeout of one second expires immediately. 🤨 --- netwatch-notify.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index 8b05c5e..9a4c9d9 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -61,12 +61,12 @@ :global GetRandom20CharAlNum; :local FwAddrList ($ScriptName . "-" . [ $GetRandom20CharAlNum ]); - /ip/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=1s; + /ip/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=2s; :delay 20ms; :if ([ :len [ /ip/firewall/address-list/find where list=$FwAddrList address=$Expected ] ] > 0) do={ :return true; } - /ipv6/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=1s; + /ipv6/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=2s; :delay 20ms; :if ([ :len [ /ipv6/firewall/address-list/find where list=$FwAddrList address=$Expected ] ] > 0) do={ :return true; From 155542668719f9feaac45fdb786b2e5fc5fd1e71 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Mar 2025 11:18:18 +0100 Subject: [PATCH 467/893] netwatch-notify: increase the timeout even more MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This interacts with the number of addresses in the address-list. Having a lot of addresses there (for exemple from script 'fw-addr-lists' 😜) makes the 'find' take longer. We have to make sure that 'find' succeeds before the address times out. As this does not hurt... Let's just bump to 10 seconds to be safe. --- netwatch-notify.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index 9a4c9d9..2a5050c 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -61,12 +61,12 @@ :global GetRandom20CharAlNum; :local FwAddrList ($ScriptName . "-" . [ $GetRandom20CharAlNum ]); - /ip/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=2s; + /ip/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=10s; :delay 20ms; :if ([ :len [ /ip/firewall/address-list/find where list=$FwAddrList address=$Expected ] ] > 0) do={ :return true; } - /ipv6/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=2s; + /ipv6/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=10s; :delay 20ms; :if ([ :len [ /ipv6/firewall/address-list/find where list=$FwAddrList address=$Expected ] ] > 0) do={ :return true; From b63e0fcb2fc282ac69cbef74b35bd40e8df5a464 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 12 Mar 2025 11:26:22 +0100 Subject: [PATCH 468/893] netwatch-notify: check matching address type only --- netwatch-notify.rsc | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index 2a5050c..0b8a8dc 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -61,15 +61,19 @@ :global GetRandom20CharAlNum; :local FwAddrList ($ScriptName . "-" . [ $GetRandom20CharAlNum ]); - /ip/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=10s; - :delay 20ms; - :if ([ :len [ /ip/firewall/address-list/find where list=$FwAddrList address=$Expected ] ] > 0) do={ - :return true; + :if ([ :typeof [ :toip $Expected ] ] = "ip") do={ + /ip/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=10s; + :delay 20ms; + :if ([ :len [ /ip/firewall/address-list/find where list=$FwAddrList address=$Expected ] ] > 0) do={ + :return true; + } } - /ipv6/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=10s; - :delay 20ms; - :if ([ :len [ /ipv6/firewall/address-list/find where list=$FwAddrList address=$Expected ] ] > 0) do={ - :return true; + :if ([ :typeof [ :toip6 $Expected ] ] = "ip6") do={ + /ipv6/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=10s; + :delay 20ms; + :if ([ :len [ /ipv6/firewall/address-list/find where list=$FwAddrList address=$Expected ] ] > 0) do={ + :return true; + } } :return false; From 20bf609c44c2b4111bb387b36b955b8c3243fbf1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 13 Mar 2025 10:51:39 +0100 Subject: [PATCH 469/893] check-routeros-update: fix condition for license check Turns out that `next-renewal-at` is moved forward when renewal failed, so it never matches the criteria. Just start complaining three weeks before deadline. --- check-routeros-update.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 8d200d2..78161e4 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -78,7 +78,7 @@ :error false; } - :if ([ :totime ($License->"next-renewal-at") ] + 1w < [ :timestamp ]) do={ + :if ([ :totime ($License->"deadline-at") ] - 3w < [ :timestamp ]) do={ $LogPrint warning $ScriptName ("Your license will expire on " . ($License->"deadline-at") . "!"); $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "warning-sign" ] . "License about to expire!"); \ From ce39b79f69f978a8de521643b07b9c19de02b06f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 13 Mar 2025 11:50:38 +0100 Subject: [PATCH 470/893] capsman-download-packages: fix parameter for $RmFile The function can not handle ids, we have to pass a name instead. --- capsman-download-packages.capsman.rsc | 2 +- capsman-download-packages.template.rsc | 2 +- capsman-download-packages.wifi.rsc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index 4387cb1..25c43f5 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -62,7 +62,7 @@ :if ([ $DownloadPackage ($File->"package-name") $InstalledVersion \ ($File->"package-architecture") $PackagePath ] = true) do={ :set Updated true; - $RmFile $Package; + $RmFile ($File->"name"); } } diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index 744494e..b269838 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -64,7 +64,7 @@ :if ([ $DownloadPackage ($File->"package-name") $InstalledVersion \ ($File->"package-architecture") $PackagePath ] = true) do={ :set Updated true; - $RmFile $Package; + $RmFile ($File->"name"); } } diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index a0c5e12..901bb0a 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -62,7 +62,7 @@ :if ([ $DownloadPackage ($File->"package-name") $InstalledVersion \ ($File->"package-architecture") $PackagePath ] = true) do={ :set Updated true; - $RmFile $Package; + $RmFile ($File->"name"); } } From f8c3659f6a329498b7aea5ff7f4b67ae1ef727df Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 26 Mar 2025 09:19:02 +0100 Subject: [PATCH 471/893] support creating the checksums file --- .gitignore | 3 +++ Makefile | 7 +++++-- contrib/checksums.sh | 9 +++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100755 contrib/checksums.sh diff --git a/.gitignore b/.gitignore index cf89f87..8abdc28 100644 --- a/.gitignore +++ b/.gitignore @@ -9,5 +9,8 @@ # html files (as generated from markdown) *.html +# checksums file as used by $ScriptInstallUpdate +checksums.json + # Mac OS X folder settings file .DS_Store diff --git a/Makefile b/Makefile index d21713c..8951741 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ WIFI = $(wildcard *.wifi.rsc) MARKDOWN = $(wildcard *.md doc/*.md doc/mod/*.md) HTML = $(MARKDOWN:.md=.html) -all: $(CAPSMAN) $(LOCAL) $(WIFI) $(HTML) +all: $(CAPSMAN) $(LOCAL) $(WIFI) $(HTML) checksums.json %.html: %.md Makefile markdown $< | sed 's/href="\([-_\./[:alnum:]]*\)\.md"/href="\1.html"/g' > $@ @@ -32,5 +32,8 @@ all: $(CAPSMAN) $(LOCAL) $(WIFI) $(HTML) -e '/^# !!/,/^# !!/c # !! Do not edit this file, it is generated from template!' \ < $< > $@ +checksums.json: contrib/checksums.sh *.rsc */*.rsc + contrib/checksums.sh + clean: - rm -f $(HTML) + rm -f $(HTML) checksums.json diff --git a/contrib/checksums.sh b/contrib/checksums.sh new file mode 100755 index 0000000..b472b49 --- /dev/null +++ b/contrib/checksums.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +# generate a checksums file as used by $ScriptInstallUpdate + +set -e + +md5sum $(find -name '*.rsc' | sort) | \ + sed -e "s| \./||" -e 's|.rsc$||' | \ + jq --raw-input --null-input '[ inputs | split (" ") | { (.[1]): (.[0]) }] | add' > 'checksums.json' From 690951469291ae96ead1f88226be78ec7735d098 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 20 Mar 2025 09:48:01 +0100 Subject: [PATCH 472/893] check-routeros-update: send certificate warning just once... ... and another one once expired. --- check-routeros-update.rsc | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 78161e4..51df175 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -22,6 +22,7 @@ :global SafeUpdateNeighborIdentity; :global SafeUpdatePatch; :global SafeUpdateUrl; + :global SentCertificateNotification; :global SentRouterosUpdateNotification; :global DeviceInfo; @@ -70,20 +71,26 @@ :if ([ :typeof ($License->"deadline-at") ] = "str") do={ :if ([ :len ($License->"next-renewal-at") ] = 0 && ($License->"limited-upgrades") = true) do={ $LogPrint warning $ScriptName ("Your license expired on " . ($License->"deadline-at") . "!"); - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "warning-sign" ] . "License expired!"); \ - message=("Your license expired on " . ($License->"deadline-at") . \ - ", can no longer update RouterOS on " . $Identity . "...") }); + :if ($SentCertificateNotification != "expired") do={ + $SendNotification2 ({ origin=$ScriptName; \ + subject=([ $SymbolForNotification "warning-sign" ] . "License expired!"); \ + message=("Your license expired on " . ($License->"deadline-at") . \ + ", can no longer update RouterOS on " . $Identity . "...") }); + :set SentCertificateNotification "expired"; + } :set ExitOK true; :error false; } :if ([ :totime ($License->"deadline-at") ] - 3w < [ :timestamp ]) do={ $LogPrint warning $ScriptName ("Your license will expire on " . ($License->"deadline-at") . "!"); - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "warning-sign" ] . "License about to expire!"); \ - message=("Your license failed to renew and is about to expire on " . \ - ($License->"deadline-at") . " on " . $Identity . "...") }); + :if ($SentCertificateNotification != "warning") do={ + $SendNotification2 ({ origin=$ScriptName; \ + subject=([ $SymbolForNotification "warning-sign" ] . "License about to expire!"); \ + message=("Your license failed to renew and is about to expire on " . \ + ($License->"deadline-at") . " on " . $Identity . "...") }); + :set SentCertificateNotification "warning"; + } } } From 16c9ce437ef268780303f627bba08a166e2aef05 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 24 Mar 2025 21:14:12 +0100 Subject: [PATCH 473/893] check-routeros-update: send notification on renewed license... ... when a warning has been sent before. --- check-routeros-update.rsc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 51df175..1a5a930 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -92,6 +92,16 @@ :set SentCertificateNotification "warning"; } } + + :if ([ :typeof $SentCertificateNotification ] = "str" && \ + [ :totime ($License->"deadline-at") ] - 4w > [ :timestamp ]) do={ + $LogPrint info $ScriptName ("Your license was successfully renewed."); + $SendNotification2 ({ origin=$ScriptName; \ + subject=([ $SymbolForNotification "white-heavy-check-mark" ] . "License renewed"); \ + message=("Your license was successfully renewed on " . $Identity . \ + ". It is now valid until " . ($License->"deadline-at") . ".") }); + :set SentCertificateNotification; + } } $LogPrint debug $ScriptName ("Checking for updates..."); From 3c30276e235b6c8105f44db49ba6586d296f264c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 25 Mar 2025 17:54:09 +0100 Subject: [PATCH 474/893] check-routeros-update: split off check-perpetual-license... ... and also add documentation, screenshot, etc. --- README.md | 1 + check-perpetual-license.rsc | 78 ++++++++++++++++++ check-routeros-update.rsc | 38 --------- .../notification.avif | Bin 0 -> 4004 bytes doc/check-perpetual-license.md | 70 ++++++++++++++++ doc/check-routeros-update.md | 1 + global-functions.rsc | 2 +- news-and-changes.rsc | 1 + 8 files changed, 152 insertions(+), 39 deletions(-) create mode 100644 check-perpetual-license.rsc create mode 100644 doc/check-perpetual-license.d/notification.avif create mode 100644 doc/check-perpetual-license.md diff --git a/README.md b/README.md index fae6986..ffbc27e 100644 --- a/README.md +++ b/README.md @@ -225,6 +225,7 @@ Available scripts * [Renew certificates and notify on expiration](doc/check-certificates.md) * [Notify about health state](doc/check-health.md) * [Notify on LTE firmware upgrade](doc/check-lte-firmware-upgrade.md) +* [Check perpetual license on CHR](doc/check-perpetual-license.md) * [Notify on RouterOS update](doc/check-routeros-update.md) * [Collect MAC addresses in wireless access list](doc/collect-wireless-mac.md) * [Use wireless network with daily psk](doc/daily-psk.md) diff --git a/check-perpetual-license.rsc b/check-perpetual-license.rsc new file mode 100644 index 0000000..9a3a3c7 --- /dev/null +++ b/check-perpetual-license.rsc @@ -0,0 +1,78 @@ +#!rsc by RouterOS +# RouterOS script: check-perpetual-license +# Copyright (c) 2025 Christian Hesse +# https://rsc.eworm.de/COPYING.md +# +# requires RouterOS, version=7.15 +# +# check perpetual license on CHR +# https://rsc.eworm.de/doc/check-perpetual-license.md + +:global GlobalFunctionsReady; +:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } + +:local ExitOK false; +:do { + :local ScriptName [ :jobname ]; + + :global Identity; + :global SentCertificateNotification; + + :global LogPrint; + :global ScriptLock; + :global SendNotification2; + :global SymbolForNotification; + :global WaitFullyConnected; + + :if ([ $ScriptLock $ScriptName ] = false) do={ + :set ExitOK true; + :error false; + } + + $WaitFullyConnected; + + :local License [ /system/license/get ]; + :if ([ :typeof ($License->"deadline-at") ] != "str") do={ + $LogPrint info $ScriptName ("This device does not have a perpetual license."); + :set ExitOK true; + :error true; + } + + :if ([ :len ($License->"next-renewal-at") ] = 0 && ($License->"limited-upgrades") = true) do={ + $LogPrint warning $ScriptName ("Your license expired on " . ($License->"deadline-at") . "!"); + :if ($SentCertificateNotification != "expired") do={ + $SendNotification2 ({ origin=$ScriptName; \ + subject=([ $SymbolForNotification "warning-sign" ] . "License expired!"); \ + message=("Your license expired on " . ($License->"deadline-at") . \ + ", can no longer update RouterOS on " . $Identity . "...") }); + :set SentCertificateNotification "expired"; + } + :set ExitOK true; + :error true; + } + + :if ([ :totime ($License->"deadline-at") ] - 3w < [ :timestamp ]) do={ + $LogPrint warning $ScriptName ("Your license will expire on " . ($License->"deadline-at") . "!"); + :if ($SentCertificateNotification != "warning") do={ + $SendNotification2 ({ origin=$ScriptName; \ + subject=([ $SymbolForNotification "warning-sign" ] . "License about to expire!"); \ + message=("Your license failed to renew and is about to expire on " . \ + ($License->"deadline-at") . " on " . $Identity . "...") }); + :set SentCertificateNotification "warning"; + } + :set ExitOK true; + :error true; + } + + :if ([ :typeof $SentCertificateNotification ] = "str" && \ + [ :totime ($License->"deadline-at") ] - 4w > [ :timestamp ]) do={ + $LogPrint info $ScriptName ("Your license was successfully renewed."); + $SendNotification2 ({ origin=$ScriptName; \ + subject=([ $SymbolForNotification "white-heavy-check-mark" ] . "License renewed"); \ + message=("Your license was successfully renewed on " . $Identity . \ + ". It is now valid until " . ($License->"deadline-at") . ".") }); + :set SentCertificateNotification; + } +} on-error={ + :global ExitError; $ExitError $ExitOK [ :jobname ]; +} diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 1a5a930..361be34 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -22,7 +22,6 @@ :global SafeUpdateNeighborIdentity; :global SafeUpdatePatch; :global SafeUpdateUrl; - :global SentCertificateNotification; :global SentRouterosUpdateNotification; :global DeviceInfo; @@ -67,43 +66,6 @@ :error "A reboot for update is already scheduled."; } - :local License [ /system/license/get ]; - :if ([ :typeof ($License->"deadline-at") ] = "str") do={ - :if ([ :len ($License->"next-renewal-at") ] = 0 && ($License->"limited-upgrades") = true) do={ - $LogPrint warning $ScriptName ("Your license expired on " . ($License->"deadline-at") . "!"); - :if ($SentCertificateNotification != "expired") do={ - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "warning-sign" ] . "License expired!"); \ - message=("Your license expired on " . ($License->"deadline-at") . \ - ", can no longer update RouterOS on " . $Identity . "...") }); - :set SentCertificateNotification "expired"; - } - :set ExitOK true; - :error false; - } - - :if ([ :totime ($License->"deadline-at") ] - 3w < [ :timestamp ]) do={ - $LogPrint warning $ScriptName ("Your license will expire on " . ($License->"deadline-at") . "!"); - :if ($SentCertificateNotification != "warning") do={ - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "warning-sign" ] . "License about to expire!"); \ - message=("Your license failed to renew and is about to expire on " . \ - ($License->"deadline-at") . " on " . $Identity . "...") }); - :set SentCertificateNotification "warning"; - } - } - - :if ([ :typeof $SentCertificateNotification ] = "str" && \ - [ :totime ($License->"deadline-at") ] - 4w > [ :timestamp ]) do={ - $LogPrint info $ScriptName ("Your license was successfully renewed."); - $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification "white-heavy-check-mark" ] . "License renewed"); \ - message=("Your license was successfully renewed on " . $Identity . \ - ". It is now valid until " . ($License->"deadline-at") . ".") }); - :set SentCertificateNotification; - } - } - $LogPrint debug $ScriptName ("Checking for updates..."); /system/package/update/check-for-updates without-paging as-value; :local Update [ /system/package/update/get ]; diff --git a/doc/check-perpetual-license.d/notification.avif b/doc/check-perpetual-license.d/notification.avif new file mode 100644 index 0000000000000000000000000000000000000000..70ca603d4488773dd8a476ced8c89506407b95ef GIT binary patch literal 4004 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 literal 0 HcmV?d00001 diff --git a/doc/check-perpetual-license.md b/doc/check-perpetual-license.md new file mode 100644 index 0000000..d444004 --- /dev/null +++ b/doc/check-perpetual-license.md @@ -0,0 +1,70 @@ +Check perpetual license on CHR +============================== + +[![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) +[![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) +[![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) +[![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) + +[⬅️ Go back to main README](../README.md) + +> ℹ️ **Info**: This script can not be used on its own but requires the base +> installation. See [main README](../README.md) for details. + +Description +----------- + +On *Cloud Hosted Router* (*CHR*) the licensing is perpetual: Buy once, use +forever - but it needs regular renewal. This script checks licensing state +and sends a notification to warn before expiration. + +### Sample notification + +![check-perpetual-license notification](check-perpetual-license.d/notification.avif) + +Requirements and installation +----------------------------- + +Just install the script: + + $ScriptInstallUpdate check-perpetual-license; + +And add a scheduler for automatic update notification: + + /system/scheduler/add interval=1d name=check-perpetual-license on-event="/system/script/run check-perpetual-license;" start-time=startup; + +Configuration +------------- + +No extra configuration is required for this script, but notification +settings are required for +[e-mail](mod/notification-email.md), +[matrix](mod/notification-matrix.md), +[ntfy](mod/notification-ntfy.md) and/or +[telegram](mod/notification-telegram.md). + +Usage and invocation +-------------------- + +Be notified when run from scheduler or run it manually: + + /system/script/run check-perpetual-license; + +Tips & Tricks +------------- + +The script checks for full connectivity before acting, so scheduling at +startup is perfectly valid: + + /system/scheduler/add name=check-perpetual-license@startup on-event="/system/script/run check-perpetual-license;" start-time=startup; + +See also +-------- + +* [Notify on RouterOS update](check-routeros-update.md) + +--- +[⬅️ Go back to main README](../README.md) +[⬆️ Go back to top](#top) diff --git a/doc/check-routeros-update.md b/doc/check-routeros-update.md index 926b4aa..b6c716c 100644 --- a/doc/check-routeros-update.md +++ b/doc/check-routeros-update.md @@ -99,6 +99,7 @@ startup is perfectly valid: See also -------- +* [Check perpetual license on CHR](check-perpetual-license.md) * [Automatically upgrade firmware and reboot](firmware-upgrade-reboot.md) * [Manage system update](packages-update.md) diff --git a/global-functions.rsc b/global-functions.rsc index 8ae7bb8..8ade79b 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -15,7 +15,7 @@ # Git commit id & info, expected configuration version :global CommitId "unknown"; :global CommitInfo "unknown"; -:global ExpectedConfigVersion 135; +:global ExpectedConfigVersion 136; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 459326f..55b4165 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -60,6 +60,7 @@ 133="Updated the default configuration for 'fw-addr-lists', deprecated lists were removed, a collective list was added."; 134="Enhanced 'mod/notification-telegram' and 'telegram-chat' to support topics in groups."; 135="Introduced helper function '\$GetTelegramChatId' for 'mod/notification-telegram' which helps retrieve information."; + 136="Introduced script 'check-perpetual-license' to check for license state on CHR."; }; # Migration steps to be applied on script updates From cdfb086b490cafd685e947433515e43dc5547a62 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 31 Mar 2025 11:19:23 +0200 Subject: [PATCH 475/893] mod/notification-telegram: fix override quirk IDs for chat and thread can be overridden. Overriding the chat probably makes the thread invalid - so ignore that then. --- mod/notification-telegram.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 68e913f..5ef353b 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -151,7 +151,8 @@ :local ChatId [ $EitherOr ($Notification->"chatid") \ [ $EitherOr ($TelegramChatIdOverride->($Notification->"origin")) $TelegramChatId ] ]; :local ThreadId [ $EitherOr ($Notification->"threadid") \ - [ $EitherOr ($TelegramThreadIdOverride->($Notification->"origin")) $TelegramThreadId ] ]; + [ $EitherOr ($TelegramThreadIdOverride->($Notification->"origin")) \ + [ $IfThenElse ([ :len ($TelegramChatIdOverride->($Notification->"origin")) ] = 0) $TelegramThreadId ] ] ]; :local TokenId [ $EitherOr ($TelegramTokenIdOverride->($Notification->"origin")) $TelegramTokenId ]; :if ([ :len $TokenId ] = 0 || [ :len $ChatId ] = 0) do={ From b560ea4b7d3da75b5f54633eea6a5fb7472d5bd6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 31 Mar 2025 14:30:56 +0200 Subject: [PATCH 476/893] logo: strip some bytes... ... by just re-compressing/re-encoding. --- logo.avif | Bin 2001 -> 1744 bytes logo.png | Bin 4428 -> 4406 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/logo.avif b/logo.avif index 399a2f5ad184fabd7e8127b1e2f1bd994ac7a6b4..956fea8a115623093ec4aef204d69a1a29b53db4 100644 GIT binary patch delta 843 zcmV-R1GN0n56}&eBMpXaWprTx00000001G8FdUInClmsK000C}00IC2009610j>Z5 z0MoIKApw5{Ds5z8bP@mx1{fKy-(gTP#sNfR0frRY%c{{n{hP|N?3Uaqj0L}}@qNfO zUB2aZ8Kr1U{|(j(T$tyh0vOM1q|wTT0X(pK|2Cc9mV0U>am(|lq5{?-y_i?Zr%fu$ zhCDQU=SG}pl+0lejjhL_%w5(HDH(E*okS>|c<+C}P|5$Cf3i?w@OMvy-89`L;#}oM z#2YLk@1}eq#BCuEpbjI5&bIPhY)ZN!fIW7@!JRM9tZSY=8tl(Zn50AhCeIn}bsHqt zVjhC`$G`d1oc$}4gYH%lC=vh)2{;+A-(dj_29Pqp2t;H6VTKq`-8AXdR-Lqe?ll_b zFZZ*n0~`W>ozo$$2fsVSgxpZ#`gr)>n>xw_(#K$B*CM4aHkwEn#JzNubEuV$7=|bA z+ROhT#2ittG2`z=D|OK4zz~ip#0=ynf)@69qgTUtc0+U0uVpYVnm_j8zn0 zJjAjZ9#{~&B=BfFlV5^?`+Bg~S3lvt=dZ1bMkPXj%M`I5p6v2f7J3b@(m+zN6G0CG z{>v?H18V1~@QQG}uh>+c4cY33da3fQ@firsI+uS(o8t{=MtAATH=Lm)TuQAPYya;@v3#M7IYcTEH*jc21m6D)sW-ivCX~$+cSN*r2BpR|Tb22mj|3DNH zT_*pR4q1Qq{z@4w3$5CBwN)%tU^mL(%3q*e9|R8b<56wQ^9`(%3tH$y{UL2-whDf z+PTBdBt(eDqSo^hFgbp(q)#zr2WYWtTbv|w_sz`3(xK`HZ^Wld@#0fDAk(E3KqjJV zz@p4**S2B5Axq>5d?~(DcWcfn@0Gs-wjg(jH~rSuRt;kgdOR8IFNG#knQ0V1TZ3~i z{TlO|tkVnTj)H$$Qb#lavhGSviyk4IJ-g^UwjH~xR7&7SpHW^fe`YmIBX?2Aqr zu8_1h^hG$GGy=y`3LIlI`rBGbwh2kd13ji1;2ei$0-$M4jMe@bt5xL|t${H^4RE-Q zpG%uN7Z!`MfEbi_9^@tGJyxq8x;(wr1VJtc5nJr#OzwsX=}tN(;LpDRJjy5|ddREv zd?KC`i%f&ZEB@53j3wi zl_RoNS*Raoq@rbLZm4~lEaA3srZ@-8A(nYyxW!PEbvL)zS>NC;=@2O@pkAzFEw>>R z#!t2z-sGcGhBZRmWj9_an-~xQN%q|fOQuJ>IA2Jewfl0ctt7)TkciXY5*Z#$ zk8~jc#NV#gn;>c9ZkhO(Xx%U9!h%ElLo)Jw;CDbsZYyeFmmdxIYAGz#837LAKx{w{ z0=K5F+bLRn>s#zg)nWKKMmn}bcWI!ZYkBtH^BNq zrrSDz_1XfK{W_rx^Krge(1;-v#Q@xCU9FIF>7gC9{6qS+MHKcIz<(aA&ha=2IZ8F9 z#8QUWD}S?cFpN9SU5-vgikk;H8#n@Tx5!|`458gpN4b2BUT#>w7= z0CWfOO%ucw+c?ki!hG2fhgu3_1Qnfq#WPK_7b_d|_7AftXk0qc zYNiQDrFZq9_kZ@#=~`%9@4ls-Dt-YZ>XTWJLq|SqWe(SR-hI>BfoA9!n*Y(DvhMy1 diff --git a/logo.png b/logo.png index d97b75dc7d39e2c9e6ff6339d47711e97d6be1f0..7bec10e5242bbc518dc3d730c44425295b283433 100644 GIT binary patch delta 4394 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 delta 4397 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 From 2cc47f56b95b36eb73ed9bbe3e74f28b4f37dccd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 2 Apr 2025 11:32:24 +0200 Subject: [PATCH 477/893] README: give the script names --- README.md | 102 +++++++++++++++++++++++++++--------------------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index ffbc27e..1f7c8ed 100644 --- a/README.md +++ b/README.md @@ -214,61 +214,61 @@ There's much more to explore... Have fun! Available scripts ----------------- -* [Find and remove access list duplicates](doc/accesslist-duplicates.md) -* [Upload backup to Mikrotik cloud](doc/backup-cloud.md) -* [Send backup via e-mail](doc/backup-email.md) -* [Save configuration to fallback partition](doc/backup-partition.md) -* [Upload backup to server](doc/backup-upload.md) -* [Download packages for CAP upgrade from CAPsMAN](doc/capsman-download-packages.md) -* [Run rolling CAP upgrades from CAPsMAN](doc/capsman-rolling-upgrade.md) -* [Renew locally issued certificates](doc/certificate-renew-issued.md) -* [Renew certificates and notify on expiration](doc/check-certificates.md) -* [Notify about health state](doc/check-health.md) -* [Notify on LTE firmware upgrade](doc/check-lte-firmware-upgrade.md) -* [Check perpetual license on CHR](doc/check-perpetual-license.md) -* [Notify on RouterOS update](doc/check-routeros-update.md) -* [Collect MAC addresses in wireless access list](doc/collect-wireless-mac.md) -* [Use wireless network with daily psk](doc/daily-psk.md) -* [Comment DHCP leases with info from access list](doc/dhcp-lease-comment.md) -* [Create DNS records for DHCP leases](doc/dhcp-to-dns.md) -* [Automatically upgrade firmware and reboot](doc/firmware-upgrade-reboot.md) -* [Download, import and update firewall address-lists](doc/fw-addr-lists.md) -* [Wait for global functions und modules](doc/global-wait.md) -* [Send GPS position to server](doc/gps-track.md) -* [Use WPA network with hotspot credentials](doc/hotspot-to-wpa.md) -* [Create DNS records for IPSec peers](doc/ipsec-to-dns.md) -* [Update configuration on IPv6 prefix change](doc/ipv6-update.md) -* [Manage IP addresses with bridge status](doc/ip-addr-bridge.md) -* [Run other scripts on DHCP lease](doc/lease-script.md) -* [Manage LEDs dark mode](doc/leds-mode.md) -* [Forward log messages via notification](doc/log-forward.md) -* [Mode button with multiple presses](doc/mode-button.md) -* [Manage DNS and DoH servers from netwatch](doc/netwatch-dns.md) -* [Notify on host up and down](doc/netwatch-notify.md) -* [Visualize OSPF state via LEDs](doc/ospf-to-leds.md) -* [Manage system update](doc/packages-update.md) -* [Run scripts on ppp connection](doc/ppp-on-up.md) -* [Act on received SMS](doc/sms-action.md) -* [Forward received SMS](doc/sms-forward.md) -* [Play Super Mario theme](doc/super-mario-theme.md) -* [Chat with your router and send commands via Telegram bot](doc/telegram-chat.md) -* [Install LTE firmware upgrade](doc/unattended-lte-firmware-upgrade.md) -* [Update GRE configuration with dynamic addresses](doc/update-gre-address.md) -* [Update tunnelbroker configuration](doc/update-tunnelbroker.md) +* [Find and remove access list duplicates](doc/accesslist-duplicates.md) (`accesslist-duplicates`) +* [Upload backup to Mikrotik cloud](doc/backup-cloud.md) (`backup-cloud`) +* [Send backup via e-mail](doc/backup-email.md) (`backup-email`) +* [Save configuration to fallback partition](doc/backup-partition.md) (`backup-partition`) +* [Upload backup to server](doc/backup-upload.md) (`backup-upload`) +* [Download packages for CAP upgrade from CAPsMAN](doc/capsman-download-packages.md) (`capsman-download-packages`) +* [Run rolling CAP upgrades from CAPsMAN](doc/capsman-rolling-upgrade.md) (`capsman-rolling-upgrade`) +* [Renew locally issued certificates](doc/certificate-renew-issued.md) (`certificate-renew-issued`) +* [Renew certificates and notify on expiration](doc/check-certificates.md) (`check-certificates`) +* [Notify about health state](doc/check-health.md) (`check-health`) +* [Notify on LTE firmware upgrade](doc/check-lte-firmware-upgrade.md) (`check-lte-firmware-upgrade`) +* [Check perpetual license on CHR](doc/check-perpetual-license.md) (`check-perpetual-license`) +* [Notify on RouterOS update](doc/check-routeros-update.md) (`check-routeros-update`) +* [Collect MAC addresses in wireless access list](doc/collect-wireless-mac.md) (`collect-wireless-mac`) +* [Use wireless network with daily psk](doc/daily-psk.md) (`daily-psk`) +* [Comment DHCP leases with info from access list](doc/dhcp-lease-comment.md) (`dhcp-lease-comment`) +* [Create DNS records for DHCP leases](doc/dhcp-to-dns.md) (`dhcp-to-dns`) +* [Automatically upgrade firmware and reboot](doc/firmware-upgrade-reboot.md) (`firmware-upgrade-reboot`) +* [Download, import and update firewall address-lists](doc/fw-addr-lists.md) (`fw-addr-lists`) +* [Wait for global functions und modules](doc/global-wait.md) (`global-wait`) +* [Send GPS position to server](doc/gps-track.md) (`gps-track`) +* [Use WPA network with hotspot credentials](doc/hotspot-to-wpa.md) (`hotspot-to-wpa` & `hotspot-to-wpa-cleanup`) +* [Create DNS records for IPSec peers](doc/ipsec-to-dns.md) (`ipsec-to-dns`) +* [Update configuration on IPv6 prefix change](doc/ipv6-update.md) (`ipv6-update`) +* [Manage IP addresses with bridge status](doc/ip-addr-bridge.md) (`ip-addr-bridge`) +* [Run other scripts on DHCP lease](doc/lease-script.md) (`lease-script`) +* [Manage LEDs dark mode](doc/leds-mode.md) (`leds-day-mode`, `leds-night-mode` & `leds-toggle-mode`) +* [Forward log messages via notification](doc/log-forward.md) (`log-forward`) +* [Mode button with multiple presses](doc/mode-button.md) (`mode-button`) +* [Manage DNS and DoH servers from netwatch](doc/netwatch-dns.md) (`netwatch-dns`) +* [Notify on host up and down](doc/netwatch-notify.md) (`netwatch-notify`) +* [Visualize OSPF state via LEDs](doc/ospf-to-leds.md) (`ospf-to-leds`) +* [Manage system update](doc/packages-update.md) (`packages-update`) +* [Run scripts on ppp connection](doc/ppp-on-up.md) (`ppp-on-up`) +* [Act on received SMS](doc/sms-action.md) (`sms-action`) +* [Forward received SMS](doc/sms-forward.md) (`sms-forward`) +* [Play Super Mario theme](doc/super-mario-theme.md) (`super-mario-theme`) +* [Chat with your router and send commands via Telegram bot](doc/telegram-chat.md) (`telegram-chat`) +* [Install LTE firmware upgrade](doc/unattended-lte-firmware-upgrade.md) (`unattended-lte-firmware-upgrade`) +* [Update GRE configuration with dynamic addresses](doc/update-gre-address.md) (`update-gre-address`) +* [Update tunnelbroker configuration](doc/update-tunnelbroker.md) (`update-tunnelbroker`) Available modules ----------------- -* [Manage ports in bridge](doc/mod/bridge-port-to.md) -* [Manage VLANs on bridge ports](doc/mod/bridge-port-vlan.md) -* [Inspect variables](doc/mod/inspectvar.md) -* [IP address calculation](doc/mod/ipcalc.md) -* [Send notifications via e-mail](doc/mod/notification-email.md) -* [Send notifications via Matrix](doc/mod/notification-matrix.md) -* [Send notifications via Ntfy](doc/mod/notification-ntfy.md) -* [Send notifications via Telegram](doc/mod/notification-telegram.md) -* [Download script and run it once](doc/mod/scriptrunonce.md) -* [Import ssh keys for public key authentication](doc/mod/ssh-keys-import.md) +* [Manage ports in bridge](doc/mod/bridge-port-to.md) (`mod/bridge-port-to`) +* [Manage VLANs on bridge ports](doc/mod/bridge-port-vlan.md) (`mod/bridge-port-vlan`) +* [Inspect variables](doc/mod/inspectvar.md) (`mod/inspectvar`) +* [IP address calculation](doc/mod/ipcalc.md) (`mod/ipcalc`) +* [Send notifications via e-mail](doc/mod/notification-email.md) (`mod/notification-email`) +* [Send notifications via Matrix](doc/mod/notification-matrix.md) (`mod/notification-matrix`) +* [Send notifications via Ntfy](doc/mod/notification-ntfy.md) (`mod/notification-ntfy`) +* [Send notifications via Telegram](doc/mod/notification-telegram.md) (`mod/notification-telegram`) +* [Download script and run it once](doc/mod/scriptrunonce.md) (`mod/scriptrunonce`) +* [Import ssh keys for public key authentication](doc/mod/ssh-keys-import.md) (`mod/ssh-keys-import`) Installing custom scripts & modules ----------------------------------- From 27987a0d7cf54343aa15ee9dd23f7006b323bf2a Mon Sep 17 00:00:00 2001 From: Ilya Kulakov Date: Mon, 7 Apr 2025 11:27:22 +0200 Subject: [PATCH 478/893] global-functions: $ScriptLock: fix second parameter This broke with 1e8918fdaa5a30393e2004d1f5e4dff458936b67... Fixes: https://github.com/eworm-de/routeros-scripts/issues/95 --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 8ade79b..d666122 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1388,7 +1388,7 @@ # lock script against multiple invocation :set ScriptLock do={ :local Script [ :tostr $1 ]; - :local WaitMax ([ :tonum $3 ] * 10); + :local WaitMax ([ :tonum $2 ] * 10); :global GetRandom20CharAlNum; :global IfThenElse; From 67e7b11aa7def03e69ff9135653039eed220c619 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 8 Apr 2025 09:13:20 +0200 Subject: [PATCH 479/893] update list of contributors --- CONTRIBUTIONS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index 0b35c40..55d2205 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -21,6 +21,7 @@ for details! * [Ben Harris](mailto:mail@bharr.is) (@bharrisau) * [Daniel Ziegenberg](mailto:daniel@ziegenberg.at) (@ziegenberg) * [Ignacio Serrano](mailto:ignic@ignic.com) (@ignic) +* [Ilya Kulakov](mailto:kulakov.ilya@gmail.com) (@Kentzo) * [Michael Gisbers](mailto:michael@gisbers.de) (@mgisbers) * [Miquel Bonastre](mailto:mbonastre@yahoo.com) (@mbonastre) * @netravnen From 314ba5796d05591ec4781b72222b95c9c8590928 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 8 Apr 2025 09:41:25 +0200 Subject: [PATCH 480/893] global-functions: $ScriptLock: increase interval with wait time Inspired by: https://github.com/eworm-de/routeros-scripts/issues/95#issuecomment-2773513467 --- global-functions.rsc | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index d666122..d488c0f 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1387,8 +1387,8 @@ # lock script against multiple invocation :set ScriptLock do={ - :local Script [ :tostr $1 ]; - :local WaitMax ([ :tonum $2 ] * 10); + :local Script [ :tostr $1 ]; + :local WaitMax [ :totime $2 ]; :global GetRandom20CharAlNum; :global IfThenElse; @@ -1477,6 +1477,10 @@ :set ($ScriptLockOrder->$Script) ({}); } + :if ([ :typeof $WaitMax ] = "nil" ) do={ + :set WaitMax 0s; + } + :if ([ :len [ /system/script/find where name=$Script ] ] = 0) do={ $LogPrint error $0 ("A script named '" . $Script . "' does not exist!"); :error false; @@ -1496,12 +1500,13 @@ :local MyTicket [ $GetRandom20CharAlNum 6 ]; $AddTicket $Script $MyTicket; - :local WaitCount 0; - :while ($WaitMax > $WaitCount && \ + :local WaitInterval ($WaitMax / 20); + :local WaitTime $WaitMax; + :while ($WaitTime > 0 && \ ([ $IsFirstTicket $Script $MyTicket ] = false || \ [ $TicketCount $Script ] < [ $JobCount $Script ])) do={ - :set WaitCount ($WaitCount + 1); - :delay 100ms; + :set WaitTime ($WaitTime - $WaitInterval); + :delay $WaitInterval; } :if ([ $IsFirstTicket $Script $MyTicket ] = true && \ @@ -1513,7 +1518,7 @@ $RemoveTicket $Script $MyTicket; $LogPrint debug $0 ("Script '" . $Script . "' started more than once" . \ - [ $IfThenElse ($WaitCount > 0) " and timed out waiting for lock" "" ] . "..."); + [ $IfThenElse ($WaitTime < $WaitMax) " and timed out waiting for lock" "" ] . "..."); :return false; } From 019e10e1903e261ed1629a1db6ff2d64257916aa Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 7 Apr 2025 13:44:53 +0200 Subject: [PATCH 481/893] global-functions: $CertificateDownload: no infinite loop We can not call $CertificateAvailable here, as that will most likely cause an infinite loop. After all that's the certificate mkcert.org is using. And it *is* available in this repository. --- global-functions.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index d488c0f..30374aa 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -167,8 +167,8 @@ $LogPrint warning $0 ("Failed downloading certificate with CommonName '" . $CommonName . \ "' from repository! Trying fallback to mkcert.org..."); :do { - :if ([ $CertificateAvailable "ISRG Root X1" ] = false) do={ - $LogPrint error $0 ("Downloading required certificate failed."); + :if ([ :len [ /certificate/find where common-name="ISRG Root X1" ] ] = 0) do={ + $LogPrint error $0 ("Required certificate is not available."); :return false; } /tool/fetch check-certificate=yes-without-crl http-header-field=({ [ $FetchUserAgentStr $0 ] }) \ From e36613608c18bc4bcbc11e2d8da47f6c8c53c454 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 7 Apr 2025 14:14:00 +0200 Subject: [PATCH 482/893] global-functions: $CertificateNameByCN: support matching by fingerprint and name --- global-functions.rsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 30374aa..f73ea14 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -203,11 +203,12 @@ # name a certificate by its common-name :set CertificateNameByCN do={ - :local CommonName [ :tostr $1 ]; + :local Match [ :tostr $1 ]; :global CleanName; - :local Cert [ /certificate/find where common-name=$CommonName ]; + :local Cert [ /certificate/find where (common-name=$Match or fingerprint=$Match or name=$Match) ]; + :local CommonName [ /certificate/get $Cert common-name ]; /certificate/set $Cert name=[ $CleanName $CommonName ]; } From 44fa91f5c47ec739a7f74aa2861ab58cc42bed39 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 7 Apr 2025 15:05:27 +0200 Subject: [PATCH 483/893] global-functions: $CertificateNameByCN: pick the first match only --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index f73ea14..7b1c214 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -207,7 +207,7 @@ :global CleanName; - :local Cert [ /certificate/find where (common-name=$Match or fingerprint=$Match or name=$Match) ]; + :local Cert ([ /certificate/find where (common-name=$Match or fingerprint=$Match or name=$Match) ]->0); :local CommonName [ /certificate/get $Cert common-name ]; /certificate/set $Cert name=[ $CleanName $CommonName ]; } From c823ff87ed32beeea6e0a49d194178db9944693d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 8 Apr 2025 14:42:51 +0200 Subject: [PATCH 484/893] global-functions: $CertificateNameByCN: return false without match... ... and return true on success. --- global-functions.rsc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 7b1c214..d014567 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -208,8 +208,12 @@ :global CleanName; :local Cert ([ /certificate/find where (common-name=$Match or fingerprint=$Match or name=$Match) ]->0); + :if ([ :len $Cert ] = 0) do={ + :return false; + } :local CommonName [ /certificate/get $Cert common-name ]; /certificate/set $Cert name=[ $CleanName $CommonName ]; + :return true; } # multiply given character(s) From d4b5e1f5e7acb59bc365c6598749d1ec15c8cd36 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 10 Apr 2025 11:07:59 +0200 Subject: [PATCH 485/893] global-functions: $CertificateNameByCN: warn with no match --- global-functions.rsc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index d014567..70269c8 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -206,9 +206,11 @@ :local Match [ :tostr $1 ]; :global CleanName; + :global LogPrint; :local Cert ([ /certificate/find where (common-name=$Match or fingerprint=$Match or name=$Match) ]->0); :if ([ :len $Cert ] = 0) do={ + $LogPrint warning $0 ("No matching certificate found."); :return false; } :local CommonName [ /certificate/get $Cert common-name ]; From 75163f0d3cbd9daf6ff7977f60403beff1b9e76a Mon Sep 17 00:00:00 2001 From: Miquel Bonastre Date: Mon, 7 Apr 2025 13:51:56 +0200 Subject: [PATCH 486/893] INITIAL-COMMANDS: support installation from custom server Closes: https://github.com/eworm-de/routeros-scripts/pull/96 Co-authored-by: Christian Hesse --- INITIAL-COMMANDS.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 8b64d28..002e51a 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -17,23 +17,27 @@ Initial commands Run the complete base installation: { - /tool/fetch "https://git.eworm.de/cgit/routeros-scripts/plain/certs/ISRG-Root-X2.pem" dst-path="isrg-root-x2.pem" as-value; + :local BaseUrl "https://git.eworm.de/cgit/routeros-scripts/plain/"; + :local CertFileName "ISRG-Root-X2.pem"; + :local CertFingerprint "69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470"; + + /tool/fetch ($BaseUrl . "certs/" . $CertFileName) dst-path=$CertFileName as-value; :delay 1s; - /certificate/import file-name="isrg-root-x2.pem" passphrase=""; - :if ([ :len [ /certificate/find where fingerprint="69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470" ] ] != 1) do={ + /certificate/import file-name=$CertFileName passphrase=""; + :if ([ :len [ /certificate/find where fingerprint=$CertFingerprint ] ] != 1) do={ :error "Something is wrong with your certificates!"; }; :delay 1s; /system/script/set name=("global-config-overlay-" . [ /system/clock/get date ] . "-" . [ /system/clock/get time ]) [ find where name="global-config-overlay" ]; :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ /system/script/remove [ find where name=$Script ]; - /system/script/add name=$Script owner=$Script source=([ /tool/fetch check-certificate=yes-without-crl ("https://git.eworm.de/cgit/routeros-scripts/plain/" . $Script . ".rsc") output=user as-value]->"data"); + /system/script/add name=$Script owner=$Script source=([ /tool/fetch check-certificate=yes-without-crl ($BaseUrl . $Script . ".rsc") output=user as-value]->"data"); }; /system/script { run global-config; run global-functions; }; /system/scheduler/remove [ find where name="global-scripts" ]; /system/scheduler/add name="global-scripts" start-time=startup on-event="/system/script { run global-config; run global-functions; }"; :global CertificateNameByCN; - $CertificateNameByCN "ISRG Root X2"; + $CertificateNameByCN $CertFingerprint; }; Then continue setup with From 390e3653d714472f038814194239ad362c24baa9 Mon Sep 17 00:00:00 2001 From: Miquel Bonastre Date: Mon, 7 Apr 2025 16:16:19 +0200 Subject: [PATCH 487/893] INITIAL-COMMANDS: add status output Co-authored-by: Christian Hesse --- INITIAL-COMMANDS.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 002e51a..65b313b 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -21,6 +21,7 @@ Run the complete base installation: :local CertFileName "ISRG-Root-X2.pem"; :local CertFingerprint "69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470"; + :put "Importing certificate..."; /tool/fetch ($BaseUrl . "certs/" . $CertFileName) dst-path=$CertFileName as-value; :delay 1s; /certificate/import file-name=$CertFileName passphrase=""; @@ -28,14 +29,19 @@ Run the complete base installation: :error "Something is wrong with your certificates!"; }; :delay 1s; + :put "Renaming global-config-overlay, if exists..."; /system/script/set name=("global-config-overlay-" . [ /system/clock/get date ] . "-" . [ /system/clock/get time ]) [ find where name="global-config-overlay" ]; :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ + :put "Installing $Script..."; /system/script/remove [ find where name=$Script ]; /system/script/add name=$Script owner=$Script source=([ /tool/fetch check-certificate=yes-without-crl ($BaseUrl . $Script . ".rsc") output=user as-value]->"data"); }; + :put "Loading configuration and functions..."; /system/script { run global-config; run global-functions; }; + :put "Scheduling to load configuration and functions..."; /system/scheduler/remove [ find where name="global-scripts" ]; /system/scheduler/add name="global-scripts" start-time=startup on-event="/system/script { run global-config; run global-functions; }"; + :put "Renaming certificate by its common-name..."; :global CertificateNameByCN; $CertificateNameByCN $CertFingerprint; }; From d80f43a1c86760565d0e0a662ceb0de63636c61a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 11 Apr 2025 08:07:17 +0200 Subject: [PATCH 488/893] INITIAL-COMMANDS: fix typos --- INITIAL-COMMANDS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 65b313b..79773bd 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -10,7 +10,7 @@ Initial commands [⬅️ Go back to main README](README.md) -> ⚠️ **Warning**: These command are inteneded for initial setup. If you are +> ⚠️ **Warning**: These commands are intended for initial setup. If you are > not aware of the procedure please follow > [the long way in detail](README.md#the-long-way-in-detail). From 29bcd191ee7b4487cb9c909e6c7778767c6283f8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 17 Apr 2025 10:44:05 +0200 Subject: [PATCH 489/893] global-functions: $ScriptInstallUpdate: support downloading certificate... ... for individual scripts. Just add it in comment with "certificate=...". This also works on installtion: $ScriptInstallUpdate new-script "base-url=..., certificate=..."; Closes: https://github.com/eworm-de/routeros-scripts/pull/97 --- global-functions.rsc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 70269c8..72c36cd 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1195,6 +1195,12 @@ :error true; } + :if ([ :len ($ScriptInfo->"certificate") ] > 0) do={ + :if ([ $CertificateAvailable ($ScriptInfo->"certificate") ] = false) do={ + $LogPrint warning $0 ("Downloading certificate failed, trying without."); + } + } + :do { :local BaseUrl [ $EitherOr ($ScriptInfo->"base-url") $ScriptUpdatesBaseUrl ]; :local UrlSuffix [ $EitherOr ($ScriptInfo->"url-suffix") $ScriptUpdatesUrlSuffix ]; From b78df91b23a4e108ef0268c3c604191581d104ae Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 17 Apr 2025 22:22:05 +0200 Subject: [PATCH 490/893] README: and another hint on RouterOS version --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 1f7c8ed..e8e1b68 100644 --- a/README.md +++ b/README.md @@ -122,6 +122,9 @@ And finally load configuration and functions and add the scheduler. ![screenshot: run and schedule scripts](README.d/05-run-and-schedule-scripts.avif) +> 💡️ **Hint**: You see complaints regarding syntax errors? Most likely the +> RouterOS on your device is too old. Check for updates! + ### Scheduled automatic updates The last step is optional: Add this scheduler **only** if you want the From 405c329f39d402911ad5040f893a952df6407813 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:07:11 +0200 Subject: [PATCH 491/893] README: mark all external links --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index e8e1b68..dcf9c28 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,9 @@ RouterOS Scripts ![RouterOS Scripts Logo](logo.svg) -[RouterOS](https://mikrotik.com/software) is the operating system developed -by [MikroTik](https://mikrotik.com/aboutus) for networking tasks. This -repository holds a number of [scripts](https://wiki.mikrotik.com/wiki/Manual:Scripting) +[RouterOS ↗️](https://mikrotik.com/software) is the operating system developed +by [MikroTik ↗️](https://mikrotik.com/aboutus) for networking tasks. This +repository holds a number of [scripts ↗️](https://wiki.mikrotik.com/wiki/Manual:Scripting) to manage RouterOS devices or extend their functionality. *Use at your own risk*, pay attention to @@ -35,7 +35,7 @@ Specific scripts may require even newer RouterOS version. > running RouterOS v6 switch to `routeros-v6` branch! Starting with RouterOS 7.17 the -[device-mode](https://help.mikrotik.com/docs/spaces/ROS/pages/93749258/Device-mode) +[device-mode ↗️](https://help.mikrotik.com/docs/spaces/ROS/pages/93749258/Device-mode) has been extended to give more fine-grained control over what features are available. You need to enable `scheduler` and `fetch` at least, specific scripts may require additional features. @@ -61,9 +61,9 @@ First time users should take the long way below. ### Live presentation Want to see it in action? I've had a presentation [Repository based -RouterOS script distribution](https://www.youtube.com/watch?v=B9neG3oAhcY) +RouterOS script distribution ↗️](https://www.youtube.com/watch?v=B9neG3oAhcY) including demonstation recorded live at [MUM Europe -2019](https://mum.mikrotik.com/2019/EU/) in Vienna. +2019 ↗️](https://mum.mikrotik.com/2019/EU/) in Vienna. > ⚠️ **Warning**: Some details changed. So see the presentation, then follow > the steps below for up-to-date commands. @@ -83,7 +83,7 @@ Note that the commands above do *not* verify server certificate, so if you want to be safe download with your workstations's browser and transfer the file to your MikroTik device. -* [ISRG Root X2](https://letsencrypt.org/certs/isrg-root-x2.pem) +* [ISRG Root X2 ↗️](https://letsencrypt.org/certs/isrg-root-x2.pem) Then we import the certificate. @@ -194,7 +194,7 @@ Scheduler and events -------------------- Most scripts are designed to run regularly from -[scheduler](https://wiki.mikrotik.com/wiki/Manual:System/Scheduler). We just +[scheduler ↗️](https://wiki.mikrotik.com/wiki/Manual:System/Scheduler). We just added `check-routeros-update`, so let's run it daily to make sure not to miss an update. @@ -328,7 +328,7 @@ Possibly a scheduler and other configuration has to be removed as well. Contact ------- -We have a Telegram Group [RouterOS-Scripts](https://t.me/routeros_scripts)! +We have a Telegram Group [RouterOS-Scripts ↗️](https://t.me/routeros_scripts)! [![RouterOS Scripts Telegram Group](README.d/telegram-group.avif)](https://t.me/routeros_scripts) @@ -352,7 +352,7 @@ at github. This project is developed in private spare time and usage is free of charge for you. If you like the scripts and think this is of value for you or your business please consider to -[donate with PayPal](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J). +[donate with PayPal ↗️](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J). [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=for-the-badge)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) From 158230070fbfae7a83b881b7bcd6f1651de45e54 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:14:02 +0200 Subject: [PATCH 492/893] BRANCHES: mark all external links --- BRANCHES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BRANCHES.md b/BRANCHES.md index 8a0bdad..dc4f4ac 100644 --- a/BRANCHES.md +++ b/BRANCHES.md @@ -13,7 +13,7 @@ Installing from branches > ⚠️ **Warning**: Living on the edge? Great, read on! > If not: Please use the `main` branch and leave this page! -These scripts are developed in a [git](https://git-scm.com/) repository. +These scripts are developed in a [git ↗️](https://git-scm.com/) repository. Development and experimental branches are used to provide early access for specific changes. You can install scripts from these branches for testing. From 8328400e8724006ce68a401d8297cbd8f4f30a7e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:14:53 +0200 Subject: [PATCH 493/893] CERTIFICATES: mark all external links --- CERTIFICATES.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CERTIFICATES.md b/CERTIFICATES.md index 5432d78..8ead452 100644 --- a/CERTIFICATES.md +++ b/CERTIFICATES.md @@ -21,7 +21,7 @@ first step of [installation](README.md#the-long-way-in-detail) is importing the certificate. The scripts can install additional certificates when required. This happens -from this repository if available, or from [mkcert.org](https://mkcert.org) +from this repository if available, or from [mkcert.org ↗️](https://mkcert.org) as a fallback. Get the certificate's CommonName @@ -29,7 +29,7 @@ Get the certificate's CommonName But how to determine what certificate may be required? Often easiest way is to use a desktop browser to get that information. This demonstration uses -[Mozilla Firefox](https://www.mozilla.org/firefox/). +[Mozilla Firefox ↗️](https://www.mozilla.org/firefox/). Let's assume we want to make sure the certificate for [git.eworm.de](https://git.eworm.de/) is available. Open that page in the From a1437a4c8315f2640925323cdea7fb620b7bbf5f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:13:00 +0200 Subject: [PATCH 494/893] CONTRIBUTIONS: mark all external links --- CONTRIBUTIONS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index 55d2205..0b89453 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -31,7 +31,7 @@ for details! ## Donations Add yourself to the list, -[donate with PayPal](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J)! +[donate with PayPal ↗️](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J)! * Abdul Mannan Abbasi * Andrea Ruffini Perico From b12f8a39745cb54318b5d55bf65a1d8cfff81b02 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:17:58 +0200 Subject: [PATCH 495/893] doc/backup-cloud: mark all external links --- doc/backup-cloud.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/backup-cloud.md b/doc/backup-cloud.md index 7286960..740af53 100644 --- a/doc/backup-cloud.md +++ b/doc/backup-cloud.md @@ -17,7 +17,7 @@ Description ----------- This script uploads -[binary backup to Mikrotik cloud](https://wiki.mikrotik.com/wiki/Manual:IP/Cloud#Backup). +[binary backup to Mikrotik cloud ↗️](https://wiki.mikrotik.com/wiki/Manual:IP/Cloud#Backup). > ⚠️ **Warning**: The used command can hit errors that a script can with > workaround only. A notification *should* be sent anyway. But it can result From 4118f53aae9c87dcc90dff6c800a8baf5d04785d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:18:09 +0200 Subject: [PATCH 496/893] doc/backup-partition: mark all external links --- doc/backup-partition.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/backup-partition.md b/doc/backup-partition.md index 9d615a5..50b8a09 100644 --- a/doc/backup-partition.md +++ b/doc/backup-partition.md @@ -17,7 +17,7 @@ Description ----------- This script saves the current configuration to fallback -[partition](https://wiki.mikrotik.com/wiki/Manual:Partitions). +[partition ↗️](https://wiki.mikrotik.com/wiki/Manual:Partitions). It can also copy-over the RouterOS installation when run interactively or just before a feature update. From 34eac64f3378387f402151d1a017fc00e81b7c61 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:18:26 +0200 Subject: [PATCH 497/893] doc/check-routeros-update: mark all external links --- doc/check-routeros-update.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/check-routeros-update.md b/doc/check-routeros-update.md index b6c716c..ea9bcbe 100644 --- a/doc/check-routeros-update.md +++ b/doc/check-routeros-update.md @@ -30,8 +30,8 @@ automatically is supported. > ⚠️ **Warning**: Installing updates is important from a security point > of view. At the same time it can be source of serve breakage. So test > versions in lab and read -> [changelog](https://mikrotik.com/download/changelogs/) and -> [forum](https://forum.mikrotik.com/viewforum.php?f=21) before deploying +> [changelog ↗️](https://mikrotik.com/download/changelogs/) and +> [forum ↗️](https://forum.mikrotik.com/viewforum.php?f=21) before deploying > to your production environment! Automatic updates should be handled > with care! From 3788a3e2861c7a3f48f221771977c133204a7f32 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:18:40 +0200 Subject: [PATCH 498/893] doc/fw-addr-lists: mark all external links --- doc/fw-addr-lists.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/fw-addr-lists.md b/doc/fw-addr-lists.md index cb560d7..d09383b 100644 --- a/doc/fw-addr-lists.md +++ b/doc/fw-addr-lists.md @@ -19,10 +19,10 @@ Description This script downloads, imports and updates firewall address-lists. Its main purpose is to block attacking ip addresses, spam hosts, command-and-control servers and similar malicious entities. The default configuration contains a -[collective list by GitHub user @stamparm](https://github.com/stamparm/ipsum), -lists from [dshield.org](https://dshield.org/) and -[blocklist.de](https://www.blocklist.de/), and lists from -[spamhaus.org](https://spamhaus.org/) are prepared. +[collective list by GitHub user @stamparm ↗️](https://github.com/stamparm/ipsum), +lists from [dshield.org ↗️](https://dshield.org/) and +[blocklist.de ↗️](https://www.blocklist.de/), and lists from +[spamhaus.org ↗️](https://spamhaus.org/) are prepared. The address-lists are updated in place, so after initial import you will not see situation when the lists are not populated. From 2fa044972cc2e38e404b0e76035609c51174c0d3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:18:50 +0200 Subject: [PATCH 499/893] doc/log-forward: mark all external links --- doc/log-forward.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/log-forward.md b/doc/log-forward.md index 3c19569..9ead165 100644 --- a/doc/log-forward.md +++ b/doc/log-forward.md @@ -72,7 +72,7 @@ The configuration goes to `global-config-overlay`, these are the parameters: > your local `global-config-overlay` and modify it to your specific needs. These patterns are matched as -[regular expressions](https://wiki.mikrotik.com/wiki/Manual:Regular_Expressions). +[regular expressions ↗️](https://wiki.mikrotik.com/wiki/Manual:Regular_Expressions). To forward **all** (ignoring severity) log messages with topics `account` (which includes user logins) and `dhcp` you need something like: From 0eaefcdc72ba217990fce4bf17460337697305a9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:23:12 +0200 Subject: [PATCH 500/893] doc/mod/notification-email: mark all external links --- doc/mod/notification-email.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/mod/notification-email.md b/doc/mod/notification-email.md index 34d1c09..dabadf3 100644 --- a/doc/mod/notification-email.md +++ b/doc/mod/notification-email.md @@ -32,7 +32,7 @@ Configuration ------------- Set up your device's -[e-mail settings](https://wiki.mikrotik.com/wiki/Manual:Tools/email). +[e-mail settings ↗️](https://wiki.mikrotik.com/wiki/Manual:Tools/email). Also make sure the device has correct time configured, best is to set up the ntp client. From 183b16d83c1a182ba35d21453687a27106d94883 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:23:31 +0200 Subject: [PATCH 501/893] doc/mod/notification-matrix: mark all external links --- doc/mod/notification-matrix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/mod/notification-matrix.md b/doc/mod/notification-matrix.md index 89c1b01..da725cf 100644 --- a/doc/mod/notification-matrix.md +++ b/doc/mod/notification-matrix.md @@ -17,7 +17,7 @@ Description ----------- This module adds support for sending notifications via -[Matrix](https://matrix.org/) via client server api. A queue is used to +[Matrix ↗️](https://matrix.org/) via client server api. A queue is used to make sure notifications are not lost on failure but sent later. Requirements and installation From c69b13c87961dbfced0002e85b98a32fe6b7fc84 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:23:41 +0200 Subject: [PATCH 502/893] doc/mod/notification-notify: mark all external links --- doc/mod/notification-ntfy.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/mod/notification-ntfy.md b/doc/mod/notification-ntfy.md index 51756ac..ef5dd58 100644 --- a/doc/mod/notification-ntfy.md +++ b/doc/mod/notification-ntfy.md @@ -17,7 +17,7 @@ Description ----------- This module adds support for sending notifications via -[Ntfy](https://ntfy.sh/). A queue is used to make sure +[Ntfy ↗️](https://ntfy.sh/). A queue is used to make sure notifications are not lost on failure but sent later. Requirements and installation @@ -28,7 +28,7 @@ Just install the module: $ScriptInstallUpdate mod/notification-ntfy; Also install the Ntfy app on your mobile device or use the -[web app](https://ntfy.sh/app) in a browser of your choice. +[web app ↗️](https://ntfy.sh/app) in a browser of your choice. Configuration ------------- From 3822887ba2d157101caf3529a5234d3974ef472e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 24 Apr 2025 23:23:49 +0200 Subject: [PATCH 503/893] doc/mod/notification-telegram: mark all external links --- doc/mod/notification-telegram.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/mod/notification-telegram.md b/doc/mod/notification-telegram.md index 2d00116..6b10fed 100644 --- a/doc/mod/notification-telegram.md +++ b/doc/mod/notification-telegram.md @@ -17,7 +17,7 @@ Description ----------- This module adds support for sending notifications via -[Telegram](https://telegram.org/) via bot api. A queue is used to make sure +[Telegram ↗️](https://telegram.org/) via bot api. A queue is used to make sure notifications are not lost on failure but sent later. Requirements and installation @@ -33,7 +33,7 @@ and create an account. Configuration ------------- -Open Telegram, then start a chat with [BotFather](https://t.me/BotFather) and +Open Telegram, then start a chat with [BotFather ↗️](https://t.me/BotFather) and create your own bot: ![create new bot](notification-telegram.d/newbot.avif) @@ -102,7 +102,7 @@ Tips & Tricks ### Set a profile photo You can use a profile photo for your bot to make it recognizable. Open the -chat with [BotFather](https://t.me/BotFather) and set it there. +chat with [BotFather ↗️](https://t.me/BotFather) and set it there. ![set profile photo](notification-telegram.d/setuserpic.avif) From fe649181180986935a049b489322b10327ba0697 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 28 Apr 2025 10:48:36 +0200 Subject: [PATCH 504/893] README: add disclaimer on external links --- README.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index dcf9c28..1d2d64f 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,8 @@ repository holds a number of [scripts ↗️](https://wiki.mikrotik.com/wiki/Man to manage RouterOS devices or extend their functionality. *Use at your own risk*, pay attention to -[license and warranty](#license-and-warranty)! +[license and warranty](#license-and-warranty), and +[disclaimer on external links](#disclaimer-on-external-links)! Requirements ------------ @@ -371,6 +372,21 @@ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the [GNU General Public License](COPYING.md) for more details. +Disclaimer on external links +---------------------------- + +Our website contains links to the websites of third parties ("external +links"). As the content of these websites is not under our control, we +cannot assume any liability for such external content. In all cases, the +provider of information of the linked websites is liable for the content +and accuracy of the information provided. At the point in time when the +links were placed, no infringements of the law were recognisable to us. +As soon as an infringement of the law becomes known to us, we will +immediately remove the link in question. + +> 💡️ **Hint**: All external links are marked with an arrow pointing +> diagonally in an up-right (or north-east) direction (↗️). + Upstream -------- From 0717ebfbd500517231a6da31091a1f4d59bedd00 Mon Sep 17 00:00:00 2001 From: Leonardo David Monteiro Date: Tue, 4 Mar 2025 17:21:00 +0100 Subject: [PATCH 505/893] introduce mod/notification-gotify... ... for sending notifications via Gotify (https://gotify.net). Closes: https://github.com/eworm-de/routeros-scripts/pull/92 Co-authored-by: Christian Hesse --- CERTIFICATES.md | 1 + README.md | 1 + doc/backup-cloud.md | 1 + doc/backup-upload.md | 1 + doc/check-certificates.md | 1 + doc/check-health.md | 1 + doc/check-lte-firmware-upgrade.md | 1 + doc/check-perpetual-license.md | 1 + doc/check-routeros-update.md | 1 + doc/collect-wireless-mac.md | 1 + doc/daily-psk.md | 1 + doc/log-forward.md | 7 +- doc/mod/notification-email.md | 1 + doc/mod/notification-gotify.d/appsetup.avif | Bin 0 -> 18099 bytes doc/mod/notification-gotify.md | 97 ++++++++++++++ doc/mod/notification-matrix.md | 1 + doc/mod/notification-ntfy.md | 1 + doc/mod/notification-telegram.md | 1 + doc/netwatch-notify.md | 1 + doc/sms-forward.md | 1 + global-config.rsc | 6 + global-functions.rsc | 2 +- mod/notification-gotify.rsc | 139 ++++++++++++++++++++ news-and-changes.rsc | 1 + 24 files changed, 265 insertions(+), 4 deletions(-) create mode 100644 doc/mod/notification-gotify.d/appsetup.avif create mode 100644 doc/mod/notification-gotify.md create mode 100644 mod/notification-gotify.rsc diff --git a/CERTIFICATES.md b/CERTIFICATES.md index 8ead452..69d6c18 100644 --- a/CERTIFICATES.md +++ b/CERTIFICATES.md @@ -74,6 +74,7 @@ See also * [Download, import and update firewall address-lists](doc/fw-addr-lists.md) * [Manage DNS and DoH servers from netwatch](doc/netwatch-dns.md) +* [Send notifications via Gotify](doc/mod/notification-gotify.md) * [Send notifications via Matrix](doc/mod/notification-matrix.md) * [Send notifications via Ntfy](doc/mod/notification-ntfy.md) diff --git a/README.md b/README.md index 1d2d64f..2a8b2ce 100644 --- a/README.md +++ b/README.md @@ -268,6 +268,7 @@ Available modules * [Inspect variables](doc/mod/inspectvar.md) (`mod/inspectvar`) * [IP address calculation](doc/mod/ipcalc.md) (`mod/ipcalc`) * [Send notifications via e-mail](doc/mod/notification-email.md) (`mod/notification-email`) +* [Send notifications via Gotify](doc/mod/notification-gotify.md) (`mod/notification-gotify`) * [Send notifications via Matrix](doc/mod/notification-matrix.md) (`mod/notification-matrix`) * [Send notifications via Ntfy](doc/mod/notification-ntfy.md) (`mod/notification-ntfy`) * [Send notifications via Telegram](doc/mod/notification-telegram.md) (`mod/notification-telegram`) diff --git a/doc/backup-cloud.md b/doc/backup-cloud.md index 740af53..7d55d74 100644 --- a/doc/backup-cloud.md +++ b/doc/backup-cloud.md @@ -49,6 +49,7 @@ The configuration goes to `global-config-overlay`, these are the parameters: Also notification settings are required for [e-mail](mod/notification-email.md), +[gotify](mod/notification-gotify.md), [matrix](mod/notification-matrix.md), [ntfy](mod/notification-ntfy.md) and/or [telegram](mod/notification-telegram.md). diff --git a/doc/backup-upload.md b/doc/backup-upload.md index 6a5b0e4..b4012c8 100644 --- a/doc/backup-upload.md +++ b/doc/backup-upload.md @@ -55,6 +55,7 @@ The configuration goes to `global-config-overlay`, these are the parameters: Also notification settings are required for [e-mail](mod/notification-email.md), +[gotify](mod/notification-gotify.md), [matrix](mod/notification-matrix.md), [ntfy](mod/notification-ntfy.md) and/or [telegram](mod/notification-telegram.md). diff --git a/doc/check-certificates.md b/doc/check-certificates.md index 4c144ba..a9426db 100644 --- a/doc/check-certificates.md +++ b/doc/check-certificates.md @@ -51,6 +51,7 @@ subject alternative name (aka *Subject Alt Name* or *SAN*) can be used. Also notification settings are required for [e-mail](mod/notification-email.md), +[gotify](mod/notification-gotify.md), [matrix](mod/notification-matrix.md), [ntfy](mod/notification-ntfy.md) and/or [telegram](mod/notification-telegram.md). diff --git a/doc/check-health.md b/doc/check-health.md index 7cf0c33..33847e3 100644 --- a/doc/check-health.md +++ b/doc/check-health.md @@ -113,6 +113,7 @@ The configuration goes to `global-config-overlay`, these are the parameters: Also notification settings are required for [e-mail](mod/notification-email.md), +[gotify](mod/notification-gotify.md), [matrix](mod/notification-matrix.md), [ntfy](mod/notification-ntfy.md) and/or [telegram](mod/notification-telegram.md). diff --git a/doc/check-lte-firmware-upgrade.md b/doc/check-lte-firmware-upgrade.md index 3693b71..a84e2ac 100644 --- a/doc/check-lte-firmware-upgrade.md +++ b/doc/check-lte-firmware-upgrade.md @@ -44,6 +44,7 @@ Configuration Also notification settings are required for [e-mail](mod/notification-email.md), +[gotify](mod/notification-gotify.md), [matrix](mod/notification-matrix.md) and/or [telegram](mod/notification-telegram.md). diff --git a/doc/check-perpetual-license.md b/doc/check-perpetual-license.md index d444004..0335fb5 100644 --- a/doc/check-perpetual-license.md +++ b/doc/check-perpetual-license.md @@ -41,6 +41,7 @@ Configuration No extra configuration is required for this script, but notification settings are required for [e-mail](mod/notification-email.md), +[gotify](mod/notification-gotify.md), [matrix](mod/notification-matrix.md), [ntfy](mod/notification-ntfy.md) and/or [telegram](mod/notification-telegram.md). diff --git a/doc/check-routeros-update.md b/doc/check-routeros-update.md index ea9bcbe..a45e075 100644 --- a/doc/check-routeros-update.md +++ b/doc/check-routeros-update.md @@ -73,6 +73,7 @@ The configuration goes to `global-config-overlay`, these are the parameters: Also notification settings are required for [e-mail](mod/notification-email.md), +[gotify](mod/notification-gotify.md), [matrix](mod/notification-matrix.md), [ntfy](mod/notification-ntfy.md) and/or [telegram](mod/notification-telegram.md). diff --git a/doc/collect-wireless-mac.md b/doc/collect-wireless-mac.md index 0197522..2378fed 100644 --- a/doc/collect-wireless-mac.md +++ b/doc/collect-wireless-mac.md @@ -54,6 +54,7 @@ entries are to be added. Also notification settings are required for [e-mail](mod/notification-email.md), +[gotify](mod/notification-gotify.md), [matrix](mod/notification-matrix.md), [ntfy](mod/notification-ntfy.md) and/or [telegram](mod/notification-telegram.md). diff --git a/doc/daily-psk.md b/doc/daily-psk.md index 4a3de64..118d768 100644 --- a/doc/daily-psk.md +++ b/doc/daily-psk.md @@ -79,6 +79,7 @@ For legacy local interface: Also notification settings are required for [e-mail](mod/notification-email.md), +[gotify](mod/notification-gotify.md), [trix](mod/notification-matrix.md), [ntfy](mod/notification-ntfy.md) and/or [telegram](mod/notification-telegram.md). diff --git a/doc/log-forward.md b/doc/log-forward.md index 9ead165..f6086c8 100644 --- a/doc/log-forward.md +++ b/doc/log-forward.md @@ -22,15 +22,15 @@ server (see `/system/logging`). This has some limitation, however: * does not work early after boot if network connectivity is not yet established, or breaks intermittently * lots of messages generate a flood of mails -* Matrix, Ntfy and Telegram are not supported +* Gotify, Matrix, Ntfy and Telegram are not supported The script works around the limitations, for example it does: * read from `/log`, including messages from early boot * skip multi-repeated messages * rate-limit itself to mitigate flooding -* forward via notification (which includes *e-mail*, *Matrix*, *Ntfy* and - *Telegram* when installed and configured, see below) +* forward via notification (which includes *e-mail*, *Gotify*, *Matrix*, + *Ntfy* and *Telegram* when installed and configured, see below) It is intended to be run periodically from scheduler, then collects new log messages and forwards them via notification. @@ -80,6 +80,7 @@ To forward **all** (ignoring severity) log messages with topics `account` Also notification settings are required for [e-mail](mod/notification-email.md), +[gotify](mod/notification-gotify.md), [matrix](mod/notification-matrix.md), [ntfy](mod/notification-ntfy.md) and/or [telegram](mod/notification-telegram.md). diff --git a/doc/mod/notification-email.md b/doc/mod/notification-email.md index dabadf3..127bf96 100644 --- a/doc/mod/notification-email.md +++ b/doc/mod/notification-email.md @@ -79,6 +79,7 @@ function available: See also -------- +* [Send notifications via Gotify](notification-gotify.md) * [Send notifications via Matrix](notification-matrix.md) * [Send notifications via Ntfy](notification-ntfy.md) * [Send notifications via Telegram](notification-telegram.md) diff --git a/doc/mod/notification-gotify.d/appsetup.avif b/doc/mod/notification-gotify.d/appsetup.avif new file mode 100644 index 0000000000000000000000000000000000000000..58f57a807cd9c4853bf819336af8dc65f2eddd48 GIT binary patch literal 18099 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 literal 0 HcmV?d00001 diff --git a/doc/mod/notification-gotify.md b/doc/mod/notification-gotify.md new file mode 100644 index 0000000..6fce629 --- /dev/null +++ b/doc/mod/notification-gotify.md @@ -0,0 +1,97 @@ +Send notifications via Gotify +=========================== + +[![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) +[![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) +[![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) +[![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) + +[⬅️ Go back to main README](../../README.md) + +> ℹ️️ **Info**: This module can not be used on its own but requires the base +> installation. See [main README](../../README.md) for details. + +Description +----------- + +This module adds support for sending notifications via +[Gotify ↗️](https://gotify.net/). A queue is used to make sure +notifications are not lost on failure but sent later. + +Requirements and installation +----------------------------- + +Just install the module: + + $ScriptInstallUpdate mod/notification-gotify; + +Also deploy the [Gotify server ↗️](https://github.com/gotify/server) and +optionally install a Gotify client on your mobile device. + +Configuration +------------- + +Follow the [Installation ↗️](https://gotify.net/docs/install) instructions +and the [First Login ↗️](https://gotify.net/docs/first-login) setup. Once +you have a user and account you can start creating apps. Each app is an +independent notification feed for a device or application. + +![Create new app](notification-gotify.d/appsetup.avif) + +On creation apps are assigned a *Token* for authentification, you will need +that in configuration. + +Edit `global-config-overlay`, add `GotifyServer` with your server address +(just the address, no protocol - `https://` is assumed) and `GotifyToken` +with the *Token* from your configured app on the Gotify server. Then reload +the configuration. + +> ℹ️ **Info**: Copy relevant configuration from +> [`global-config`](../../global-config.rsc) (the one without `-overlay`) to +> your local `global-config-overlay` and modify it to your specific needs. + +For a custom service installing an additional certificate may be required. +You may want to install that certificate manually, after finding the +[certificate name from browser](../../CERTIFICATES.md). + +Usage and invocation +-------------------- + +There's nothing special to do. Every script or function sending a notification +will now send it to your Gotify application feed. + +But of course you can use the function to send notifications directly. Give +it a try: + + $SendGotify "Subject..." "Body..."; + +Alternatively this sends a notification with all available and configured +methods: + + $SendNotification "Subject..." "Body..."; + +To use the functions in your own scripts you have to declare them first. +Place this before you call them: + + :global SendGotify; + :global SendNotification; + +In case there is a situation when the queue needs to be purged there is a +function available: + + $PurgeGotifyQueue; + +See also +-------- + +* [Certificate name from browser](../../CERTIFICATES.md) +* [Send notifications via e-mail](notification-email.md) +* [Send notifications via Matrix](notification-matrix.md) +* [Send notifications via Ntfy](notification-ntfy.md) +* [Send notifications via Telegram](notification-telegram.md) + +--- +[⬅️ Go back to main README](../../README.md) +[⬆️ Go back to top](#top) diff --git a/doc/mod/notification-matrix.md b/doc/mod/notification-matrix.md index da725cf..da6d6de 100644 --- a/doc/mod/notification-matrix.md +++ b/doc/mod/notification-matrix.md @@ -131,6 +131,7 @@ See also * [Certificate name from browser](../../CERTIFICATES.md) * [Send notifications via e-mail](notification-email.md) +* [Send notifications via Gotify](notification-gotify.md) * [Send notifications via Ntfy](notification-ntfy.md) * [Send notifications via Telegram](notification-telegram.md) diff --git a/doc/mod/notification-ntfy.md b/doc/mod/notification-ntfy.md index ef5dd58..993501d 100644 --- a/doc/mod/notification-ntfy.md +++ b/doc/mod/notification-ntfy.md @@ -90,6 +90,7 @@ See also * [Certificate name from browser](../../CERTIFICATES.md) * [Send notifications via e-mail](notification-email.md) +* [Send notifications via Gotify](notification-gotify.md) * [Send notifications via Matrix](notification-matrix.md) * [Send notifications via Telegram](notification-telegram.md) diff --git a/doc/mod/notification-telegram.md b/doc/mod/notification-telegram.md index 6b10fed..804104f 100644 --- a/doc/mod/notification-telegram.md +++ b/doc/mod/notification-telegram.md @@ -115,6 +115,7 @@ See also * [Chat with your router and send commands via Telegram bot](../telegram-chat.md) * [Send notifications via e-mail](notification-email.md) +* [Send notifications via Gotify](notification-gotify.md) * [Send notifications via Matrix](notification-matrix.md) * [Send notifications via Ntfy](notification-ntfy.md) diff --git a/doc/netwatch-notify.md b/doc/netwatch-notify.md index 81adfe9..91c568f 100644 --- a/doc/netwatch-notify.md +++ b/doc/netwatch-notify.md @@ -47,6 +47,7 @@ The hosts to be checked have to be added to netwatch with specific comment: Also notification settings are required for [e-mail](mod/notification-email.md), +[gotify](mod/notification-gotify.md), [matrix](mod/notification-matrix.md), [ntfy](mod/notification-ntfy.md) and/or [telegram](mod/notification-telegram.md). diff --git a/doc/sms-forward.md b/doc/sms-forward.md index ccb6482..0c1317d 100644 --- a/doc/sms-forward.md +++ b/doc/sms-forward.md @@ -56,6 +56,7 @@ The configuration goes to `global-config-overlay`, this is the only parameter: Notification settings are required for [e-mail](mod/notification-email.md), +[gotify](mod/notification-gotify.md), [matrix](mod/notification-matrix.md), [ntfy](mod/notification-ntfy.md) and/or [telegram](mod/notification-telegram.md). diff --git a/global-config.rsc b/global-config.rsc index fa32b16..42a457a 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -63,6 +63,12 @@ :global NtfyServerToken ""; :global NtfyTopic ""; +# You can send Gotify notifications. Configure these settings and +# install the module: +# $ScriptInstallUpdate mod/notification-gotify +:global GotifyServer ""; +:global GotifyToken ""; + # It is possible to override e-mail, Telegram, Matrix and Ntfy setting # for every script. This is done in arrays, where 'Override' is appended # to the variable name, like this: diff --git a/global-functions.rsc b/global-functions.rsc index 72c36cd..71aa7de 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -15,7 +15,7 @@ # Git commit id & info, expected configuration version :global CommitId "unknown"; :global CommitInfo "unknown"; -:global ExpectedConfigVersion 136; +:global ExpectedConfigVersion 137; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/mod/notification-gotify.rsc b/mod/notification-gotify.rsc new file mode 100644 index 0000000..7070918 --- /dev/null +++ b/mod/notification-gotify.rsc @@ -0,0 +1,139 @@ +#!rsc by RouterOS +# RouterOS script: mod/notification-gotify +# Copyright (c) 2013-2025 Christian Hesse +# Leonardo David Monteiro +# https://rsc.eworm.de/COPYING.md +# +# requires RouterOS, version=7.15 +# requires device-mode, fetch, scheduler +# +# send notifications via Gotify (gotify.net) +# https://rsc.eworm.de/doc/mod/notification-gotify.md + +:global FlushGotifyQueue; +:global NotificationFunctions; +:global PurgeGotifyQueue; +:global SendGotify; +:global SendGotify2; + +# flush Gotify queue +:set FlushGotifyQueue do={ :do { + :global GotifyQueue; + + :global IsFullyConnected; + :global LogPrint; + + :if ([ $IsFullyConnected ] = false) do={ + $LogPrint debug $0 ("System is not fully connected, not flushing."); + :return false; + } + + :local AllDone true; + :local QueueLen [ :len $GotifyQueue ]; + + :if ([ :len [ /system/scheduler/find where name="_FlushGotifyQueue" ] ] > 0 && $QueueLen = 0) do={ + $LogPrint warning $0 ("Flushing Gotify messages from scheduler, but queue is empty."); + } + + :foreach Id,Message in=$GotifyQueue do={ + :if ([ :typeof $Message ] = "array" ) do={ + :do { + /tool/fetch check-certificate=yes-without-crl output=none http-method=post \ + http-header-field=($Message->"headers") http-data=[ :serialize to=json ($Message->"message") ] \ + ($Message->"url") as-value; + :set ($GotifyQueue->$Id); + } on-error={ + $LogPrint debug $0 ("Sending queued Gotify message failed."); + :set AllDone false; + } + } + } + + :if ($AllDone = true && $QueueLen = [ :len $GotifyQueue ]) do={ + /system/scheduler/remove [ find where name="_FlushGotifyQueue" ]; + :set GotifyQueue; + } +} on-error={ + :global ExitError; $ExitError false $0; +} } + +# send notification via Gotify - expects one array argument +:set ($NotificationFunctions->"gotify") do={ + :local Notification $1; + + :global Identity; + :global IdentityExtra; + :global GotifyQueue; + :global GotifyServer; + :global GotifyServerOverride; + :global GotifyToken; + :global GotifyTokenOverride; + + :global EitherOr; + :global FetchUserAgentStr; + :global IfThenElse; + :global LogPrint; + :global SymbolForNotification; + + :local Server [ $EitherOr ($GotifyServerOverride->($Notification->"origin")) $GotifyServer ]; + :local Token [ $EitherOr ($GotifyTokenOverride->($Notification->"origin")) $GotifyToken ]; + + :if ([ :len $Token ] = 0) do={ + :return false; + } + + :local Url ("https://" . $Server . "/message"); + :local Headers ({ [ $FetchUserAgentStr ($Notification->"origin") ]; \ + ("X-Gotify-Key: " . $Token); "Content-Type: application/json" }); + :local Message ({ + "title"=("[" . $IdentityExtra . $Identity . "] " . ($Notification->"subject")); \ + "message"=(($Notification->"message") . "\n" . [ $IfThenElse ([ :len ($Notification->"link") ] > 0) \ + ("\n" . [ $SymbolForNotification "link" ] . ($Notification->"link")) ]); \ + "priority"=[ :tonum [ $IfThenElse ($Notification->"silent") 2 5 ] ] }); + + :do { + /tool/fetch check-certificate=yes-without-crl output=none http-method=post \ + http-header-field=$Headers http-data=[ :serialize to=json $Message ] $Url as-value; + } on-error={ + $LogPrint info $0 ("Failed sending Gotify notification! Queuing..."); + + :if ([ :typeof $GotifyQueue ] = "nothing") do={ + :set GotifyQueue ({}); + } + :set ($Message->"message") (($Notification->"message") . "\n" . \ + [ $SymbolForNotification "alarm-clock" ] . "This message was queued since " . \ + [ /system/clock/get date ] . " " . [ /system/clock/get time ] . " and may be obsolete."); + :set ($GotifyQueue->[ :len $GotifyQueue ]) \ + { url=$Url; headers=$Headers; message=$Message }; + :if ([ :len [ /system/scheduler/find where name="_FlushGotifyQueue" ] ] = 0) do={ + /system/scheduler/add name="_FlushGotifyQueue" interval=1m start-time=startup \ + on-event=(":global FlushGotifyQueue; \$FlushGotifyQueue;"); + } + } +} + +# purge the Gotify queue +:set PurgeGotifyQueue do={ + :global GotifyQueue; + + /system/scheduler/remove [ find where name="_FlushGotifyQueue" ]; + :set GotifyQueue; +} + +# send notification via Gotify - expects at least two string arguments +:set SendGotify do={ :do { + :global SendGotify2; + + $SendGotify2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); +} on-error={ + :global ExitError; $ExitError false $0; +} } + +# send notification via Gotify - expects one array argument +:set SendGotify2 do={ + :local Notification $1; + + :global NotificationFunctions; + + ($NotificationFunctions->"gotify") ("\$NotificationFunctions->\"gotify\"") $Notification; +} diff --git a/news-and-changes.rsc b/news-and-changes.rsc index 55b4165..a9a2904 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -61,6 +61,7 @@ 134="Enhanced 'mod/notification-telegram' and 'telegram-chat' to support topics in groups."; 135="Introduced helper function '\$GetTelegramChatId' for 'mod/notification-telegram' which helps retrieve information."; 136="Introduced script 'check-perpetual-license' to check for license state on CHR."; + 137="Added support to send notifications via Gotify (gotify.net)."; }; # Migration steps to be applied on script updates From 07541a3cbcacdc53c7108fabb17deb73e5c93bef Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 26 Apr 2025 01:18:40 +0200 Subject: [PATCH 506/893] update list of contributors --- CONTRIBUTIONS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index 0b89453..5bf5d08 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -22,6 +22,7 @@ for details! * [Daniel Ziegenberg](mailto:daniel@ziegenberg.at) (@ziegenberg) * [Ignacio Serrano](mailto:ignic@ignic.com) (@ignic) * [Ilya Kulakov](mailto:kulakov.ilya@gmail.com) (@Kentzo) +* [Leonardo David Monteiro](mailto:leo@cub3.xyz) (@leosfsm) * [Michael Gisbers](mailto:michael@gisbers.de) (@mgisbers) * [Miquel Bonastre](mailto:mbonastre@yahoo.com) (@mbonastre) * @netravnen From fa83c76be17c6a6bb1472c7e1e7dacf20178397f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 26 Apr 2025 00:54:46 +0200 Subject: [PATCH 507/893] doc/check-lte-firmware-upgrade: add missing reference for ntfy --- doc/check-lte-firmware-upgrade.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/check-lte-firmware-upgrade.md b/doc/check-lte-firmware-upgrade.md index a84e2ac..a0c441e 100644 --- a/doc/check-lte-firmware-upgrade.md +++ b/doc/check-lte-firmware-upgrade.md @@ -45,7 +45,8 @@ Configuration Also notification settings are required for [e-mail](mod/notification-email.md), [gotify](mod/notification-gotify.md), -[matrix](mod/notification-matrix.md) and/or +[matrix](mod/notification-matrix.md), +[ntfy](mod/notification-ntfy.md) and/or [telegram](mod/notification-telegram.md). See also From 154fb438002c0103eef88a207f0f86b417a86dda Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 3 May 2025 22:01:47 +0200 Subject: [PATCH 508/893] mod/notification-ntfy: drop unused variable --- mod/notification-ntfy.rsc | 1 - 1 file changed, 1 deletion(-) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index aac6d6c..2748c5b 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -18,7 +18,6 @@ # flush ntfy queue :set FlushNtfyQueue do={ :do { :global NtfyQueue; - :global NtfyMessageIDs; :global IsFullyConnected; :global LogPrint; From ccfe1a781edc2990575cca57d49582e7e046d960 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:25:28 +0200 Subject: [PATCH 509/893] check-routeros-update: log and print info with scheduler --- check-routeros-update.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 361be34..1b68d5a 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -62,8 +62,9 @@ $WaitFullyConnected; :if ([ :len [ /system/scheduler/find where name="_RebootForUpdate" ] ] > 0) do={ + $LogPrint info $ScriptName ("A reboot for update is already scheduled."); :set ExitOK true; - :error "A reboot for update is already scheduled."; + :error false; } $LogPrint debug $ScriptName ("Checking for updates..."); From 90f61d3d75bccb8f8892dc7190ec325ccc7d940f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:17:26 +0200 Subject: [PATCH 510/893] global-functions: $ExitError: support to pass in error message --- global-functions.rsc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 71aa7de..17b3674 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -452,13 +452,15 @@ :set ExitError do={ :local ExitOK [ :tostr $1 ]; :local Name [ :tostr $2 ]; + :local Error [ :tostr $3 ]; :global IfThenElse; :global LogPrint; :if ($ExitOK = "false") do={ $LogPrint error $Name ([ $IfThenElse ([ :pick $Name 0 1 ] = "\$") \ - "Function" "Script" ] . " '" . $Name . "' exited with error."); + "Function" "Script" ] . " '" . $Name . "' exited with error" . \ + [ $IfThenElse (!($Error ~ "^(|true|false)\$")) (": " . $Error) "." ]); } } From 41bf9677db821c1d2c2479dc4f6f8b8740f3bdbe Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:49:49 +0200 Subject: [PATCH 511/893] global-functions: use :onerror for outer block --- global-functions.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 17b3674..29e6d06 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1119,7 +1119,7 @@ } # install new scripts, update existing scripts -:set ScriptInstallUpdate do={ :do { +:set ScriptInstallUpdate do={ :onerror Err { :local Scripts [ :toarray $1 ]; :local NewComment [ :tostr $2 ]; @@ -1396,8 +1396,8 @@ :set GlobalConfigChanges; :set GlobalConfigMigration; } -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # lock script against multiple invocation @@ -1538,12 +1538,12 @@ } # send notification via NotificationFunctions - expects at least two string arguments -:set SendNotification do={ :do { +:set SendNotification do={ :onerror Err { :global SendNotification2; $SendNotification2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # send notification via NotificationFunctions - expects one array argument From b9faeb86b98cc1667f0591dfd34ca43dbd6a718b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 512/893] accesslist-duplicates: use :onerror for outer block --- accesslist-duplicates.capsman.rsc | 6 +++--- accesslist-duplicates.local.rsc | 6 +++--- accesslist-duplicates.template.rsc | 6 +++--- accesslist-duplicates.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/accesslist-duplicates.capsman.rsc b/accesslist-duplicates.capsman.rsc index 27546c8..c096754 100644 --- a/accesslist-duplicates.capsman.rsc +++ b/accesslist-duplicates.capsman.rsc @@ -14,7 +14,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :local Seen ({}); @@ -32,6 +32,6 @@ } :set ($Seen->$Mac) 1; } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/accesslist-duplicates.local.rsc b/accesslist-duplicates.local.rsc index 589815d..6f2d120 100644 --- a/accesslist-duplicates.local.rsc +++ b/accesslist-duplicates.local.rsc @@ -14,7 +14,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :local Seen ({}); @@ -32,6 +32,6 @@ } :set ($Seen->$Mac) 1; } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/accesslist-duplicates.template.rsc b/accesslist-duplicates.template.rsc index ccbca3d..b08f2ad 100644 --- a/accesslist-duplicates.template.rsc +++ b/accesslist-duplicates.template.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :local Seen ({}); @@ -41,6 +41,6 @@ } :set ($Seen->$Mac) 1; } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/accesslist-duplicates.wifi.rsc b/accesslist-duplicates.wifi.rsc index 527ebb4..ccd04f5 100644 --- a/accesslist-duplicates.wifi.rsc +++ b/accesslist-duplicates.wifi.rsc @@ -14,7 +14,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :local Seen ({}); @@ -32,6 +32,6 @@ } :set ($Seen->$Mac) 1; } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 02a205b14ecec27f535b0453c012e27a03c2a6ed Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 513/893] backup-cloud: use :onerror for outer block --- backup-cloud.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index c4e23b2..bc09aac 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global BackupRandomDelay; @@ -99,6 +99,6 @@ :set PackagesUpdateBackupFailure true; } $RmDir "tmpfs/backup-cloud"; -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 953daca8ac06c01050057f1e14e2020a58116f50 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 514/893] backup-email: use :onerror for outer block --- backup-email.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backup-email.rsc b/backup-email.rsc index d097301..95f2510 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global BackupPassword; @@ -135,6 +135,6 @@ :delay 1s; :set I ($I + 1); } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 34c052c5f14da6d9a68861f26b383594ee61bcb4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 515/893] backup-partition: use :onerror for outer block --- backup-partition.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index 1f0cf2e..42f7790 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -14,7 +14,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global BackupPartitionCopyBeforeFeatureUpdate; @@ -121,6 +121,6 @@ :set ExitOK true; :error false; } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 0a9acab0405fc5ec5081e6f423c04e26c1847cac Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 516/893] backup-upload: use :onerror for outer block --- backup-upload.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backup-upload.rsc b/backup-upload.rsc index 14c3914..945659a 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -14,7 +14,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global BackupPassword; @@ -173,6 +173,6 @@ :set PackagesUpdateBackupFailure true; } $RmDir $DirName; -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From e0ba2c8282be0af1a1f43a5ebd51fb5848c955b9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 517/893] capsman-download-packages: use :onerror for outer block --- capsman-download-packages.capsman.rsc | 6 +++--- capsman-download-packages.template.rsc | 6 +++--- capsman-download-packages.wifi.rsc | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index 25c43f5..688f704 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global CleanFilePath; @@ -87,6 +87,6 @@ /caps-man/remote-cap/upgrade [ find where version!=$InstalledVersion ]; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index b269838..12506ea 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -16,7 +16,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global CleanFilePath; @@ -98,6 +98,6 @@ /interface/wifi/capsman/remote-cap/upgrade [ find where version!=$InstalledVersion ]; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 901bb0a..78238ef 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global CleanFilePath; @@ -89,6 +89,6 @@ /interface/wifi/capsman/remote-cap/upgrade [ find where version!=$InstalledVersion ]; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 54a3012e89a4b377a1f5f1ac9435b7d3a8912ec1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 518/893] capsman-rolling-upgrade: use :onerror for outer block --- capsman-rolling-upgrade.capsman.rsc | 6 +++--- capsman-rolling-upgrade.template.rsc | 6 +++--- capsman-rolling-upgrade.wifi.rsc | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/capsman-rolling-upgrade.capsman.rsc b/capsman-rolling-upgrade.capsman.rsc index 791b3db..813b8e5 100644 --- a/capsman-rolling-upgrade.capsman.rsc +++ b/capsman-rolling-upgrade.capsman.rsc @@ -16,7 +16,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global LogPrint; @@ -45,6 +45,6 @@ :delay ($Delay . "s"); } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/capsman-rolling-upgrade.template.rsc b/capsman-rolling-upgrade.template.rsc index 0b1cc2b..355926d 100644 --- a/capsman-rolling-upgrade.template.rsc +++ b/capsman-rolling-upgrade.template.rsc @@ -17,7 +17,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global LogPrint; @@ -53,6 +53,6 @@ :delay ($Delay . "s"); } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/capsman-rolling-upgrade.wifi.rsc b/capsman-rolling-upgrade.wifi.rsc index 4afdee2..3d5c801 100644 --- a/capsman-rolling-upgrade.wifi.rsc +++ b/capsman-rolling-upgrade.wifi.rsc @@ -16,7 +16,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global LogPrint; @@ -46,6 +46,6 @@ :delay ($Delay . "s"); } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 009516dbd4525126d688b26e189fa7f3be893f93 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 519/893] certificate-renew-issued: use :onerror for outer block --- certificate-renew-issued.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/certificate-renew-issued.rsc b/certificate-renew-issued.rsc index 91a48de..dc724b0 100644 --- a/certificate-renew-issued.rsc +++ b/certificate-renew-issued.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global CertIssuedExportPass; @@ -47,6 +47,6 @@ $LogPrint info $ScriptName ("Issued a new certificate for '" . $CertVal->"common-name" . "'."); } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From e44a5384b7e21e0013746a1d06762d969d5b45d7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 520/893] check-certificates: use :onerror for outer block --- check-certificates.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index be8e4df..75a006e 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global CertRenewTime; @@ -237,6 +237,6 @@ ", it is invalid after " . ($CertVal->"invalid-after") . "."); } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 051a1d95e5e1f5e90e79d505ef4bf542344cd64d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 521/893] check-health: use :onerror for outer block --- check-health.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-health.rsc b/check-health.rsc index f02a249..75710a0 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global CheckHealthCPUUtilization; @@ -105,6 +105,6 @@ } :set CheckHealthPlugins; -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From b959f2d941a87bd24e3495ca3d30a765200f8698 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 522/893] check-lte-firmware-upgrade: use :onerror for outer block --- check-lte-firmware-upgrade.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index c5b6cb5..f0b173f 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global SentLteFirmwareUpgradeNotification; @@ -102,6 +102,6 @@ :foreach Interface in=[ /interface/lte/find ] do={ $CheckInterface $ScriptName $Interface; } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From f5c33a9cfb367cf80b2bf34a924f95d6e124c454 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 523/893] check-perpetual-license: use :onerror for outer block --- check-perpetual-license.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-perpetual-license.rsc b/check-perpetual-license.rsc index 9a3a3c7..7caa69a 100644 --- a/check-perpetual-license.rsc +++ b/check-perpetual-license.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global Identity; @@ -73,6 +73,6 @@ ". It is now valid until " . ($License->"deadline-at") . ".") }); :set SentCertificateNotification; } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 472dc9289dd1bf9309c17341bd996149ef0837d8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 524/893] check-routeros-update: use :onerror for outer block --- check-routeros-update.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 1b68d5a..ee7e5da 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global Identity; @@ -214,6 +214,6 @@ " is available for downgrade."); :set SentRouterosUpdateNotification ($Update->"latest-version"); } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 7d8e9fda29f219471d8d68e1feb70e01e8d7e8dc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 525/893] collect-wireless-mac: use :onerror for outer block --- collect-wireless-mac.capsman.rsc | 6 +++--- collect-wireless-mac.local.rsc | 6 +++--- collect-wireless-mac.template.rsc | 6 +++--- collect-wireless-mac.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/collect-wireless-mac.capsman.rsc b/collect-wireless-mac.capsman.rsc index 17e09e3..5cec9b9 100644 --- a/collect-wireless-mac.capsman.rsc +++ b/collect-wireless-mac.capsman.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global Identity; @@ -95,6 +95,6 @@ $LogPrint debug $ScriptName ("No mac address available... Ignoring."); } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/collect-wireless-mac.local.rsc b/collect-wireless-mac.local.rsc index 4a38bfa..db75d69 100644 --- a/collect-wireless-mac.local.rsc +++ b/collect-wireless-mac.local.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global Identity; @@ -96,6 +96,6 @@ $LogPrint debug $ScriptName ("No mac address available... Ignoring."); } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/collect-wireless-mac.template.rsc b/collect-wireless-mac.template.rsc index da901be..144a8be 100644 --- a/collect-wireless-mac.template.rsc +++ b/collect-wireless-mac.template.rsc @@ -16,7 +16,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global Identity; @@ -113,6 +113,6 @@ $LogPrint debug $ScriptName ("No mac address available... Ignoring."); } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/collect-wireless-mac.wifi.rsc b/collect-wireless-mac.wifi.rsc index cb217ce..74f3ec6 100644 --- a/collect-wireless-mac.wifi.rsc +++ b/collect-wireless-mac.wifi.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global Identity; @@ -95,6 +95,6 @@ $LogPrint debug $ScriptName ("No mac address available... Ignoring."); } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 55e07a8a4223850c94e24706fcf929c2328415d2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 526/893] daily-psk: use :onerror for outer block --- daily-psk.capsman.rsc | 6 +++--- daily-psk.local.rsc | 6 +++--- daily-psk.template.rsc | 6 +++--- daily-psk.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index 5672931..e4e7b8b 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global DailyPskMatchComment; @@ -91,6 +91,6 @@ } } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index 9dea469..efea9b5 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global DailyPskMatchComment; @@ -90,6 +90,6 @@ } } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 8202eeb..5944c74 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -16,7 +16,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global DailyPskMatchComment; @@ -106,6 +106,6 @@ } } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index 3de3c5b..050e9c2 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global DailyPskMatchComment; @@ -91,6 +91,6 @@ } } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 5dc6b712e187af1e84b75d7e497ad7f50ca1bad7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 527/893] dhcp-lease-comment: use :onerror for outer block --- dhcp-lease-comment.capsman.rsc | 6 +++--- dhcp-lease-comment.local.rsc | 6 +++--- dhcp-lease-comment.template.rsc | 6 +++--- dhcp-lease-comment.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/dhcp-lease-comment.capsman.rsc b/dhcp-lease-comment.capsman.rsc index 36b31c8..92495c9 100644 --- a/dhcp-lease-comment.capsman.rsc +++ b/dhcp-lease-comment.capsman.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global LogPrint; @@ -38,6 +38,6 @@ /ip/dhcp-server/lease/set comment=$NewComment $Lease; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/dhcp-lease-comment.local.rsc b/dhcp-lease-comment.local.rsc index 35dc6f6..07802bc 100644 --- a/dhcp-lease-comment.local.rsc +++ b/dhcp-lease-comment.local.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global LogPrint; @@ -38,6 +38,6 @@ /ip/dhcp-server/lease/set comment=$NewComment $Lease; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/dhcp-lease-comment.template.rsc b/dhcp-lease-comment.template.rsc index 47a8554..814e1d7 100644 --- a/dhcp-lease-comment.template.rsc +++ b/dhcp-lease-comment.template.rsc @@ -16,7 +16,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global LogPrint; @@ -43,6 +43,6 @@ /ip/dhcp-server/lease/set comment=$NewComment $Lease; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/dhcp-lease-comment.wifi.rsc b/dhcp-lease-comment.wifi.rsc index e0f9785..92fb6b0 100644 --- a/dhcp-lease-comment.wifi.rsc +++ b/dhcp-lease-comment.wifi.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global LogPrint; @@ -38,6 +38,6 @@ /ip/dhcp-server/lease/set comment=$NewComment $Lease; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 8ed83a311d3b9140b01c2dd5064f59ad4bcc3955 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 528/893] dhcp-to-dns: use :onerror for outer block --- dhcp-to-dns.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dhcp-to-dns.rsc b/dhcp-to-dns.rsc index 9b94098..b032071 100644 --- a/dhcp-to-dns.rsc +++ b/dhcp-to-dns.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global Domain; @@ -125,6 +125,6 @@ $LogPrint debug $ScriptName ("No address available... Ignoring."); } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From d99380443b1607389d107bf0fbc4182168a4d8b0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 529/893] firmware-upgrade-reboot: use :onerror for outer block --- firmware-upgrade-reboot.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/firmware-upgrade-reboot.rsc b/firmware-upgrade-reboot.rsc index 86a9a8c..9c3ba76 100644 --- a/firmware-upgrade-reboot.rsc +++ b/firmware-upgrade-reboot.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global LogPrint; @@ -55,6 +55,6 @@ $LogPrint info $ScriptName ("Firmware upgrade successful, rebooting."); /system/reboot; -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 0e93d8ca665100a0db14b4191c494af51a238a35 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 530/893] fw-addr-lists: use :onerror for outer block --- fw-addr-lists.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index f0940fe..0fd79c1 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global FwAddrLists; @@ -209,6 +209,6 @@ " - renewed: " . [ $HumanReadableNum $CntRenew 1000 ] . \ " - removed: " . [ $HumanReadableNum $CntRemove 1000 ]); } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From d609da00416f95eb74e9742dbc0a981a5b9a41b5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 531/893] gps-track: use :onerror for outer block --- gps-track.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gps-track.rsc b/gps-track.rsc index dea56d2..bd280c9 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global GpsTrackUrl; @@ -48,6 +48,6 @@ } else={ $LogPrint debug $ScriptName ("GPS data not valid."); } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 143b8a8ddc2b30940333b95e09d23574076e48cb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 532/893] hotspot-to-wpa-cleanup: use :onerror for outer block --- hotspot-to-wpa-cleanup.capsman.rsc | 6 +++--- hotspot-to-wpa-cleanup.template.rsc | 6 +++--- hotspot-to-wpa-cleanup.wifi.rsc | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index 033d0e7..6cd1bfb 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -16,7 +16,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global EitherOr; @@ -75,6 +75,6 @@ /ip/dhcp-server/lease/remove $Lease; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index 0f8c490..18d6bea 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -17,7 +17,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global EitherOr; @@ -82,6 +82,6 @@ /ip/dhcp-server/lease/remove $Lease; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index dfec697..6348f74 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -16,7 +16,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global EitherOr; @@ -75,6 +75,6 @@ /ip/dhcp-server/lease/remove $Lease; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 9ae733a1678577a96ba00a79de347a18c8cec319 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 533/893] hotspot-to-wpa: use :onerror for outer block --- hotspot-to-wpa.capsman.rsc | 6 +++--- hotspot-to-wpa.template.rsc | 6 +++--- hotspot-to-wpa.wifi.rsc | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/hotspot-to-wpa.capsman.rsc b/hotspot-to-wpa.capsman.rsc index 3f51475..54724cf 100644 --- a/hotspot-to-wpa.capsman.rsc +++ b/hotspot-to-wpa.capsman.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global EitherOr; @@ -100,6 +100,6 @@ :delay 2s; /caps-man/access-list/set $Entry action=accept; -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/hotspot-to-wpa.template.rsc b/hotspot-to-wpa.template.rsc index 068241d..6764af9 100644 --- a/hotspot-to-wpa.template.rsc +++ b/hotspot-to-wpa.template.rsc @@ -16,7 +16,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global EitherOr; @@ -120,6 +120,6 @@ :delay 2s; /caps-man/access-list/set $Entry action=accept; /interface/wifi/access-list/set $Entry action=accept; -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } diff --git a/hotspot-to-wpa.wifi.rsc b/hotspot-to-wpa.wifi.rsc index cc5e2fc..e74081a 100644 --- a/hotspot-to-wpa.wifi.rsc +++ b/hotspot-to-wpa.wifi.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global EitherOr; @@ -97,6 +97,6 @@ :delay 2s; /interface/wifi/access-list/set $Entry action=accept; -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 1075b6b24e8875ced9da78f0a9c112283e345f21 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 534/893] ipsec-to-dns: use :onerror for outer block --- ipsec-to-dns.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ipsec-to-dns.rsc b/ipsec-to-dns.rsc index 26dab0a..a273932 100644 --- a/ipsec-to-dns.rsc +++ b/ipsec-to-dns.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global Domain; @@ -79,6 +79,6 @@ /ip/dns/static/add name=$Fqdn address=($PeerVal->"dynamic-address") ttl=$Ttl comment=$Comment place-before=$PlaceBefore; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 39ab19b272160f85df034a5f71d4d5dd5748e962 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 535/893] ipv6-update: use :onerror for outer block --- ipv6-update.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ipv6-update.rsc b/ipv6-update.rsc index 94bd1bc..633919d 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global LogPrint; @@ -102,6 +102,6 @@ } } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From da9313801774c2f5d7c02d1b5bd3ac001e0be20f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 536/893] lease-script: use :onerror for outer block --- lease-script.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lease-script.rsc b/lease-script.rsc index bf27fda..309337c 100644 --- a/lease-script.rsc +++ b/lease-script.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global Grep; @@ -60,6 +60,6 @@ $LogPrint warning $ScriptName ("Running script '" . $Script . "' failed!"); } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From c643069b3e77cca143f3f58ad10fe69c9eda69e2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 537/893] log-forward: use :onerror for outer block --- log-forward.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/log-forward.rsc b/log-forward.rsc index afeb3f2..0ce420f 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global Identity; @@ -108,6 +108,6 @@ :local LogAll [ /log/find ]; :set LogForwardLast ($LogAll->([ :len $LogAll ] - 1) ); -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 9acf9781cbe85c23b76bd82d1843b7fc9fa16913 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 538/893] accesslist-duplicates: fail if global functions do not become ready --- accesslist-duplicates.capsman.rsc | 6 +++--- accesslist-duplicates.local.rsc | 6 +++--- accesslist-duplicates.template.rsc | 6 +++--- accesslist-duplicates.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/accesslist-duplicates.capsman.rsc b/accesslist-duplicates.capsman.rsc index c096754..545b24e 100644 --- a/accesslist-duplicates.capsman.rsc +++ b/accesslist-duplicates.capsman.rsc @@ -10,11 +10,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :local Seen ({}); diff --git a/accesslist-duplicates.local.rsc b/accesslist-duplicates.local.rsc index 6f2d120..ac2c7fe 100644 --- a/accesslist-duplicates.local.rsc +++ b/accesslist-duplicates.local.rsc @@ -10,11 +10,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :local Seen ({}); diff --git a/accesslist-duplicates.template.rsc b/accesslist-duplicates.template.rsc index b08f2ad..8955991 100644 --- a/accesslist-duplicates.template.rsc +++ b/accesslist-duplicates.template.rsc @@ -11,11 +11,11 @@ # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :local Seen ({}); diff --git a/accesslist-duplicates.wifi.rsc b/accesslist-duplicates.wifi.rsc index ccd04f5..331de75 100644 --- a/accesslist-duplicates.wifi.rsc +++ b/accesslist-duplicates.wifi.rsc @@ -10,11 +10,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :local Seen ({}); From 7d4e4ec273342ce0738102ce123deb673b199d3f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 539/893] backup-cloud: fail if global functions do not become ready --- backup-cloud.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index bc09aac..f0861f0 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -9,11 +9,11 @@ # upload backup to MikroTik cloud # https://rsc.eworm.de/doc/backup-cloud.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global BackupRandomDelay; From 64ec962bb6de5cef73a2c0da378f4e49a73e6e8e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 540/893] backup-email: fail if global functions do not become ready --- backup-email.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backup-email.rsc b/backup-email.rsc index 95f2510..da2ee02 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -9,11 +9,11 @@ # create and email backup and config file # https://rsc.eworm.de/doc/backup-email.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global BackupPassword; From bf1b3e3c5e7943309fbb1b036babd628b827dc63 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 541/893] backup-partition: fail if global functions do not become ready --- backup-partition.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index 42f7790..f99a66c 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -10,11 +10,11 @@ # save configuration to fallback partition # https://rsc.eworm.de/doc/backup-partition.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global BackupPartitionCopyBeforeFeatureUpdate; From 9423d8019a5aa7a78f9fea16b228af112848f1f3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 542/893] backup-upload: fail if global functions do not become ready --- backup-upload.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backup-upload.rsc b/backup-upload.rsc index 945659a..9373b4c 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -10,11 +10,11 @@ # create and upload backup and config file # https://rsc.eworm.de/doc/backup-upload.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global BackupPassword; From 33393798b1a7eb5756b1da6b89d72daff05eea96 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 543/893] capsman-download-packages: fail if global functions do not become ready --- capsman-download-packages.capsman.rsc | 6 +++--- capsman-download-packages.template.rsc | 6 +++--- capsman-download-packages.wifi.rsc | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index 688f704..ee82638 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CleanFilePath; diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index 12506ea..91a9167 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -12,11 +12,11 @@ # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CleanFilePath; diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 78238ef..cb6cb6f 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CleanFilePath; From de5aab12ae2e3d8db965925941746d202813650a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 544/893] capsman-rolling-upgrade: fail if global functions do not become ready --- capsman-rolling-upgrade.capsman.rsc | 6 +++--- capsman-rolling-upgrade.template.rsc | 6 +++--- capsman-rolling-upgrade.wifi.rsc | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/capsman-rolling-upgrade.capsman.rsc b/capsman-rolling-upgrade.capsman.rsc index 813b8e5..2097880 100644 --- a/capsman-rolling-upgrade.capsman.rsc +++ b/capsman-rolling-upgrade.capsman.rsc @@ -12,11 +12,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; diff --git a/capsman-rolling-upgrade.template.rsc b/capsman-rolling-upgrade.template.rsc index 355926d..75de088 100644 --- a/capsman-rolling-upgrade.template.rsc +++ b/capsman-rolling-upgrade.template.rsc @@ -13,11 +13,11 @@ # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; diff --git a/capsman-rolling-upgrade.wifi.rsc b/capsman-rolling-upgrade.wifi.rsc index 3d5c801..e6c6fac 100644 --- a/capsman-rolling-upgrade.wifi.rsc +++ b/capsman-rolling-upgrade.wifi.rsc @@ -12,11 +12,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; From b4188ab1a2356c0ce5f70f449a185900decc86ea Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 545/893] certificate-renew-issued: fail if global functions do not become ready --- certificate-renew-issued.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/certificate-renew-issued.rsc b/certificate-renew-issued.rsc index dc724b0..3fd6020 100644 --- a/certificate-renew-issued.rsc +++ b/certificate-renew-issued.rsc @@ -8,11 +8,11 @@ # renew locally issued certificates # https://rsc.eworm.de/doc/certificate-renew-issued.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CertIssuedExportPass; From 9b811e1ed25c9fc6c47eb4ef4d31036e3b7e3d0a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 546/893] check-certificates: fail if global functions do not become ready --- check-certificates.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 75a006e..505ec4b 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -9,11 +9,11 @@ # check for certificate validity # https://rsc.eworm.de/doc/check-certificates.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CertRenewTime; From 96cbb32a4f073e11f264e4a641cb304de49fb435 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 547/893] check-health: fail if global functions do not become ready --- check-health.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-health.rsc b/check-health.rsc index 75710a0..40ce101 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -8,11 +8,11 @@ # check for RouterOS health state # https://rsc.eworm.de/doc/check-health.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CheckHealthCPUUtilization; From 8f1ac6fa17afd96afb82de31f0e997b73f40d883 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 548/893] check-lte-firmware-upgrade: fail if global functions do not become ready --- check-lte-firmware-upgrade.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index f0b173f..6030e4d 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -8,11 +8,11 @@ # check for LTE firmware upgrade, send notification # https://rsc.eworm.de/doc/check-lte-firmware-upgrade.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global SentLteFirmwareUpgradeNotification; From 08d78224a000751409cd715c4219aae3e2ac9eba Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 549/893] check-perpetual-license: fail if global functions do not become ready --- check-perpetual-license.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-perpetual-license.rsc b/check-perpetual-license.rsc index 7caa69a..d46f0b4 100644 --- a/check-perpetual-license.rsc +++ b/check-perpetual-license.rsc @@ -8,11 +8,11 @@ # check perpetual license on CHR # https://rsc.eworm.de/doc/check-perpetual-license.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; From 69b2af4bd7ac5f63860532c36d762953adf87d90 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 10:46:44 +0200 Subject: [PATCH 550/893] check-routeros-update: fail if global functions do not become ready --- check-routeros-update.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index ee7e5da..932256a 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -9,11 +9,11 @@ # check for RouterOS update, send notification and/or install # https://rsc.eworm.de/doc/check-routeros-update.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; From 2712bcb44db3e323faf2ddc18ddd228fcdbf215a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 551/893] collect-wireless-mac: fail if global functions do not become ready --- collect-wireless-mac.capsman.rsc | 6 +++--- collect-wireless-mac.local.rsc | 6 +++--- collect-wireless-mac.template.rsc | 6 +++--- collect-wireless-mac.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/collect-wireless-mac.capsman.rsc b/collect-wireless-mac.capsman.rsc index 5cec9b9..fa6198a 100644 --- a/collect-wireless-mac.capsman.rsc +++ b/collect-wireless-mac.capsman.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; diff --git a/collect-wireless-mac.local.rsc b/collect-wireless-mac.local.rsc index db75d69..4082bbb 100644 --- a/collect-wireless-mac.local.rsc +++ b/collect-wireless-mac.local.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; diff --git a/collect-wireless-mac.template.rsc b/collect-wireless-mac.template.rsc index 144a8be..5167156 100644 --- a/collect-wireless-mac.template.rsc +++ b/collect-wireless-mac.template.rsc @@ -12,11 +12,11 @@ # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; diff --git a/collect-wireless-mac.wifi.rsc b/collect-wireless-mac.wifi.rsc index 74f3ec6..af0dd8b 100644 --- a/collect-wireless-mac.wifi.rsc +++ b/collect-wireless-mac.wifi.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; From 8418d58ff0703d18db0e513bd71484dc93c9e821 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 552/893] daily-psk: fail if global functions do not become ready --- daily-psk.capsman.rsc | 6 +++--- daily-psk.local.rsc | 6 +++--- daily-psk.template.rsc | 6 +++--- daily-psk.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index e4e7b8b..a1b01fc 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global DailyPskMatchComment; diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index efea9b5..6ba6ce2 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global DailyPskMatchComment; diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 5944c74..43ce333 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -12,11 +12,11 @@ # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global DailyPskMatchComment; diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index 050e9c2..7e1714d 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global DailyPskMatchComment; From ff03f49724cdcba8774de481779b5f7e7993dc36 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 553/893] mode-button: use :onerror for outer block --- mode-button.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mode-button.rsc b/mode-button.rsc index edc5f40..83897ba 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global ModeButton; @@ -26,7 +26,7 @@ :if ([ :len $Scheduler ] = 0) do={ $LogPrint info $ScriptName ("Creating scheduler _ModeButtonScheduler, counting presses..."); - :global ModeButtonScheduler do={ :do { + :global ModeButtonScheduler do={ :onerror Err { :local FuncName $0; :global ModeButton; @@ -82,8 +82,8 @@ } else={ $LogPrint info $FuncName ("No action defined for " . $Count . " mode-button presses."); } - } on-error={ - :global ExitError; $ExitError false $0; + } do={ + :global ExitError; $ExitError false $0 $Err; } } /system/scheduler/add name="_ModeButtonScheduler" \ on-event=":global ModeButtonScheduler; \$ModeButtonScheduler;" interval=3s; @@ -91,6 +91,6 @@ $LogPrint debug $ScriptName ("Updating scheduler _ModeButtonScheduler..."); /system/scheduler/set $Scheduler start-time=[ /system/clock/get time ]; } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From a556f4c39858223e75e60228f9618aaaf0cc0af7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 554/893] dhcp-lease-comment: fail if global functions do not become ready --- dhcp-lease-comment.capsman.rsc | 6 +++--- dhcp-lease-comment.local.rsc | 6 +++--- dhcp-lease-comment.template.rsc | 6 +++--- dhcp-lease-comment.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/dhcp-lease-comment.capsman.rsc b/dhcp-lease-comment.capsman.rsc index 92495c9..724682b 100644 --- a/dhcp-lease-comment.capsman.rsc +++ b/dhcp-lease-comment.capsman.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; diff --git a/dhcp-lease-comment.local.rsc b/dhcp-lease-comment.local.rsc index 07802bc..0a5f3b5 100644 --- a/dhcp-lease-comment.local.rsc +++ b/dhcp-lease-comment.local.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; diff --git a/dhcp-lease-comment.template.rsc b/dhcp-lease-comment.template.rsc index 814e1d7..71307b7 100644 --- a/dhcp-lease-comment.template.rsc +++ b/dhcp-lease-comment.template.rsc @@ -12,11 +12,11 @@ # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; diff --git a/dhcp-lease-comment.wifi.rsc b/dhcp-lease-comment.wifi.rsc index 92fb6b0..1f29f0b 100644 --- a/dhcp-lease-comment.wifi.rsc +++ b/dhcp-lease-comment.wifi.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; From 2d41ad718d785545c165ef4bcf4603abdbeec020 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 555/893] netwatch-dns: use :onerror for outer block --- netwatch-dns.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 467d636..1d2d86b 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global CertificateAvailable; @@ -145,6 +145,6 @@ } } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From a308d4269e5d20f3787c524a427e8acf55e7a1d2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 556/893] dhcp-to-dns: fail if global functions do not become ready --- dhcp-to-dns.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dhcp-to-dns.rsc b/dhcp-to-dns.rsc index b032071..e66704b 100644 --- a/dhcp-to-dns.rsc +++ b/dhcp-to-dns.rsc @@ -9,11 +9,11 @@ # check DHCP leases and add/remove/update DNS entries # https://rsc.eworm.de/doc/dhcp-to-dns.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Domain; From 0df4170a2e634591327088988f685f0c35d82569 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 557/893] netwatch-notify: use :onerror for outer block --- netwatch-notify.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index 0b8a8dc..d256689 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global NetwatchNotify; @@ -224,6 +224,6 @@ "since"=($Metric->"since") }; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 4d1349125da065caaa0f3a572629c875eeb01d96 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 558/893] firmware-upgrade-reboot: fail if global functions do not become ready --- firmware-upgrade-reboot.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/firmware-upgrade-reboot.rsc b/firmware-upgrade-reboot.rsc index 9c3ba76..d5774db 100644 --- a/firmware-upgrade-reboot.rsc +++ b/firmware-upgrade-reboot.rsc @@ -8,11 +8,11 @@ # install firmware upgrade, and reboot # https://rsc.eworm.de/doc/firmware-upgrade-reboot.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; From c720eadd2c42286653ac8984d6e7c255b2ad97a8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 559/893] ospf-to-leds: use :onerror for outer block --- ospf-to-leds.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ospf-to-leds.rsc b/ospf-to-leds.rsc index a8662b3..e2f4dcf 100644 --- a/ospf-to-leds.rsc +++ b/ospf-to-leds.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global LogPrint; @@ -44,6 +44,6 @@ /system/leds/set type=off [ find where leds=$LED ]; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 4b92181f2eefcc416c3281fc376c42e33712eb55 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 560/893] fw-addr-lists: fail if global functions do not become ready --- fw-addr-lists.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 0fd79c1..1a892da 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -8,11 +8,11 @@ # download, import and update firewall address-lists # https://rsc.eworm.de/doc/fw-addr-lists.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global FwAddrLists; From 9a5a2aec4fc08685725e3d0ef2b98459cfd433e3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 561/893] packages-update: use :onerror for outer block --- packages-update.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages-update.rsc b/packages-update.rsc index b11596e..dce7cca 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global BackupRandomDelay; @@ -163,6 +163,6 @@ $LogPrint info $ScriptName ("Rebooting for update."); :delay 1s; /system/reboot; -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 925e7f869e59b1c544062bdd6693f2a286a5504e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 562/893] gps-track: fail if global functions do not become ready --- gps-track.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gps-track.rsc b/gps-track.rsc index bd280c9..d66bf00 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -9,11 +9,11 @@ # track gps data by sending json data to http server # https://rsc.eworm.de/doc/gps-track.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global GpsTrackUrl; From aeccd36f16a13ebe01a48a9b522b503adf599c6e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 563/893] ppp-on-up: use :onerror for outer block --- ppp-on-up.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index e09bd9d..ffe3079 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global LogPrint; @@ -39,6 +39,6 @@ $LogPrint warning $ScriptName ("Running script '" . $ScriptName . "' failed!"); } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 76778f04319819eec8e2285f3a88703e4290cbde Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 564/893] hotspot-to-wpa-cleanup: fail if global functions do not become ready --- hotspot-to-wpa-cleanup.capsman.rsc | 6 +++--- hotspot-to-wpa-cleanup.template.rsc | 6 +++--- hotspot-to-wpa-cleanup.wifi.rsc | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index 6cd1bfb..fd0e554 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -12,11 +12,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global EitherOr; diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index 18d6bea..11f359c 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -13,11 +13,11 @@ # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global EitherOr; diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index 6348f74..7f0ebae 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -12,11 +12,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global EitherOr; From 3eec13b8b58d57c04d957e13d016c9e587a5de68 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 565/893] sms-action: use :onerror for outer block --- sms-action.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sms-action.rsc b/sms-action.rsc index 3c8307a..d5bd553 100644 --- a/sms-action.rsc +++ b/sms-action.rsc @@ -12,7 +12,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global SmsAction; @@ -36,6 +36,6 @@ } else={ $LogPrint warning $ScriptName ("The code for action '" . $Action . "' failed syntax validation!"); } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 057bbb8481f57cde2917aa358b36f6793f3bff85 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 566/893] hotspot-to-wpa: fail if global functions do not become ready --- hotspot-to-wpa.capsman.rsc | 6 +++--- hotspot-to-wpa.template.rsc | 6 +++--- hotspot-to-wpa.wifi.rsc | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/hotspot-to-wpa.capsman.rsc b/hotspot-to-wpa.capsman.rsc index 54724cf..a9a1407 100644 --- a/hotspot-to-wpa.capsman.rsc +++ b/hotspot-to-wpa.capsman.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global EitherOr; diff --git a/hotspot-to-wpa.template.rsc b/hotspot-to-wpa.template.rsc index 6764af9..84a43bc 100644 --- a/hotspot-to-wpa.template.rsc +++ b/hotspot-to-wpa.template.rsc @@ -12,11 +12,11 @@ # !! This is just a template to generate the real script! # !! Pattern '%TEMPL%' is replaced, paths are filtered. -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global EitherOr; diff --git a/hotspot-to-wpa.wifi.rsc b/hotspot-to-wpa.wifi.rsc index e74081a..5c5afda 100644 --- a/hotspot-to-wpa.wifi.rsc +++ b/hotspot-to-wpa.wifi.rsc @@ -11,11 +11,11 @@ # # !! Do not edit this file, it is generated from template! -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global EitherOr; From aae9b4d4e39c36ceeef1d0e1125c8bce9255bdac Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 567/893] sms-forward: use :onerror for outer block --- sms-forward.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sms-forward.rsc b/sms-forward.rsc index 8169022..ddaa3a8 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global Identity; @@ -96,6 +96,6 @@ } } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From bcdb74f31d9f4006ff55f83900a85e310f14c372 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 13:52:57 +0200 Subject: [PATCH 568/893] global-config: introduce a state variable --- global-config.rsc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/global-config.rsc b/global-config.rsc index 42a457a..c0577ff 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -6,6 +6,9 @@ # global configuration # https://rsc.eworm.de/ +# Warning: Do *NOT* copy this line to overlay! +:global GlobalConfigReady false; + # Set this to 'true' to disable news and change notifications. :global NoNewsAndChangesNotification false; @@ -275,3 +278,6 @@ [ /system/script/get $Script name ] . " failed!"); } } + +# signal we are ready +:set GlobalConfigReady true; From 83cf003f62877f34abb112ed5105b391ea11f4e6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 569/893] ipsec-to-dns: fail if global functions do not become ready --- ipsec-to-dns.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ipsec-to-dns.rsc b/ipsec-to-dns.rsc index a273932..fb7b55c 100644 --- a/ipsec-to-dns.rsc +++ b/ipsec-to-dns.rsc @@ -9,11 +9,11 @@ # and add/remove/update DNS entries from IPSec mode-config # https://rsc.eworm.de/doc/ipsec-to-dns.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Domain; From 3ad8cafc7a01ced329b4b1af6cafd87a282e71df Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 570/893] telegram-chat: use :onerror for outer block --- telegram-chat.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 5db4860..155bb02 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global Identity; @@ -190,6 +190,6 @@ } :set TelegramChatOffset ([ :pick $TelegramChatOffset 1 3 ], \ [ $IfThenElse ($UpdateID >= $TelegramChatOffset->2) ($UpdateID + 1) ($TelegramChatOffset->2) ]); -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 60c5e84401ddb1490bd43daf796e4ba86ca22327 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:36 +0200 Subject: [PATCH 571/893] accesslist-duplicates: check for global config to be ready --- accesslist-duplicates.capsman.rsc | 6 +++--- accesslist-duplicates.local.rsc | 6 +++--- accesslist-duplicates.template.rsc | 6 +++--- accesslist-duplicates.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/accesslist-duplicates.capsman.rsc b/accesslist-duplicates.capsman.rsc index 545b24e..5e6cf0a 100644 --- a/accesslist-duplicates.capsman.rsc +++ b/accesslist-duplicates.capsman.rsc @@ -12,9 +12,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :local Seen ({}); diff --git a/accesslist-duplicates.local.rsc b/accesslist-duplicates.local.rsc index ac2c7fe..a6b4f41 100644 --- a/accesslist-duplicates.local.rsc +++ b/accesslist-duplicates.local.rsc @@ -12,9 +12,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :local Seen ({}); diff --git a/accesslist-duplicates.template.rsc b/accesslist-duplicates.template.rsc index 8955991..e51198d 100644 --- a/accesslist-duplicates.template.rsc +++ b/accesslist-duplicates.template.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :local Seen ({}); diff --git a/accesslist-duplicates.wifi.rsc b/accesslist-duplicates.wifi.rsc index 331de75..cadacb6 100644 --- a/accesslist-duplicates.wifi.rsc +++ b/accesslist-duplicates.wifi.rsc @@ -12,9 +12,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :local Seen ({}); From 41b705aa5a2158a7da7c51da4c95db96d7363d9c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 572/893] ipv6-update: fail if global functions do not become ready --- ipv6-update.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ipv6-update.rsc b/ipv6-update.rsc index 633919d..24167c0 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -8,11 +8,11 @@ # update firewall and dns settings on IPv6 prefix change # https://rsc.eworm.de/doc/ipv6-update.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; From fe3d9f841822d210d13af90025415015e89743a8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 573/893] update-gre-address: use :onerror for outer block --- update-gre-address.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/update-gre-address.rsc b/update-gre-address.rsc index cddfa92..2570f80 100644 --- a/update-gre-address.rsc +++ b/update-gre-address.rsc @@ -13,7 +13,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global CharacterReplace; @@ -41,6 +41,6 @@ } } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From d57916fc267e9fdeb9c878f578c2b7d3736fbac6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:36 +0200 Subject: [PATCH 574/893] backup-cloud: check for global config to be ready --- backup-cloud.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backup-cloud.rsc b/backup-cloud.rsc index f0861f0..e41db27 100644 --- a/backup-cloud.rsc +++ b/backup-cloud.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global BackupRandomDelay; From 829fce789b6d0bd5de192c8491e1b54a5fe9ba35 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 575/893] lease-script: fail if global functions do not become ready --- lease-script.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lease-script.rsc b/lease-script.rsc index 309337c..501e047 100644 --- a/lease-script.rsc +++ b/lease-script.rsc @@ -8,11 +8,11 @@ # run scripts on DHCP lease # https://rsc.eworm.de/doc/lease-script.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Grep; From d2af793683cdfa7e187da10cf8baf5c99e9c7fe1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:44:23 +0200 Subject: [PATCH 576/893] update-tunnelbroker: use :onerror for outer block --- update-tunnelbroker.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index 45afa6f..10adef0 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -15,7 +15,7 @@ :while ($GlobalFunctionsReady != true) do={ :delay 500ms; } :local ExitOK false; -:do { +:onerror Err { :local ScriptName [ :jobname ]; :global CertificateAvailable; @@ -69,6 +69,6 @@ /interface/6to4/set $Interface local-address=$PublicAddress; } } -} on-error={ - :global ExitError; $ExitError $ExitOK [ :jobname ]; +} do={ + :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From 37a6d4cc438b2b3481d8904aa0ec4dcde9a96ce8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:36 +0200 Subject: [PATCH 577/893] backup-email: check for global config to be ready --- backup-email.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backup-email.rsc b/backup-email.rsc index da2ee02..632d2e6 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global BackupPassword; From a6ab95ccef4bc3255b7d45f66f86865337459f67 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 578/893] log-forward: fail if global functions do not become ready --- log-forward.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/log-forward.rsc b/log-forward.rsc index 0ce420f..3774dac 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -8,11 +8,11 @@ # forward log messages via notification # https://rsc.eworm.de/doc/log-forward.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; From 02986eb77a2f6e2b8a0f008ca21ed49dd6195e24 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:45:14 +0200 Subject: [PATCH 579/893] mod/bridge-port-to: use :onerror for outer block --- mod/bridge-port-to.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mod/bridge-port-to.rsc b/mod/bridge-port-to.rsc index 39a036e..93eedce 100644 --- a/mod/bridge-port-to.rsc +++ b/mod/bridge-port-to.rsc @@ -10,7 +10,7 @@ :global BridgePortTo; -:set BridgePortTo do={ :do { +:set BridgePortTo do={ :onerror Err { :local BridgePortTo [ :tostr $1 ]; :global IfThenElse; @@ -65,6 +65,6 @@ $LogPrint info $0 ("Re-enabling interfaces..."); /interface/ethernet/enable $InterfaceReEnable; } -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } From 200167fa38037a02d63c249639027614f101118f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:36 +0200 Subject: [PATCH 580/893] backup-partition: check for global config to be ready --- backup-partition.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index f99a66c..c2221d2 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -12,9 +12,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global BackupPartitionCopyBeforeFeatureUpdate; From 63606ad25cec7d1345c3b3a9158472328f02444c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 581/893] mode-button: fail if global functions do not become ready --- mode-button.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mode-button.rsc b/mode-button.rsc index 83897ba..e5c836f 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -9,11 +9,11 @@ # act on multiple mode and reset button presses # https://rsc.eworm.de/doc/mode-button.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global ModeButton; From d5141f43e5e812e387eadb7b6f505f136032c48f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:45:14 +0200 Subject: [PATCH 582/893] mod/bridge-port-vlan: use :onerror for outer block --- mod/bridge-port-vlan.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mod/bridge-port-vlan.rsc b/mod/bridge-port-vlan.rsc index 0eeb9b5..6deee99 100644 --- a/mod/bridge-port-vlan.rsc +++ b/mod/bridge-port-vlan.rsc @@ -10,7 +10,7 @@ :global BridgePortVlan; -:global BridgePortVlan do={ :do { +:global BridgePortVlan do={ :onerror Err { :local ConfigTo [ :tostr $1 ]; :global IfThenElse; @@ -74,6 +74,6 @@ $LogPrint info $0 ("Re-enabling interfaces..."); /interface/ethernet/enable $InterfaceReEnable; } -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } From 27fc07e9406ae6a37f642213d5da3d23b92e63f2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:36 +0200 Subject: [PATCH 583/893] backup-upload: check for global config to be ready --- backup-upload.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backup-upload.rsc b/backup-upload.rsc index 9373b4c..11ced4c 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -12,9 +12,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global BackupPassword; From 2374be9a2192a1bcf43aa487facc1c17da34e08d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 584/893] netwatch-dns: fail if global functions do not become ready --- netwatch-dns.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 1d2d86b..5a928f0 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -9,11 +9,11 @@ # monitor and manage dns/doh with netwatch # https://rsc.eworm.de/doc/netwatch-dns.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CertificateAvailable; From 9b558ff8a1bc57f3197e71d73b468e820577d4f7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:45:14 +0200 Subject: [PATCH 585/893] mod/inspectvar: use :onerror for outer block --- mod/inspectvar.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index c861557..89c0286 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -12,12 +12,12 @@ :global InspectVarReturn; # inspect variable and print on terminal -:set InspectVar do={ :do { +:set InspectVar do={ :onerror Err { :global InspectVarReturn; :put [ :tocrlf [ $InspectVarReturn $1 ] ]; -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # inspect variable and return formatted string From 12037ff6e618d84bead0252d9fee36617e9e7ee6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:36 +0200 Subject: [PATCH 586/893] capsman-download-packages: check for global config to be ready --- capsman-download-packages.capsman.rsc | 6 +++--- capsman-download-packages.template.rsc | 6 +++--- capsman-download-packages.wifi.rsc | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index ee82638..cab1e4c 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CleanFilePath; diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index 91a9167..ea41120 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -14,9 +14,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CleanFilePath; diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index cb6cb6f..a810356 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CleanFilePath; From 446aa3d7ffff5f9b70be2bfafdcef2ec88f3742c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 587/893] netwatch-notify: fail if global functions do not become ready --- netwatch-notify.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index d256689..0c48330 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -8,11 +8,11 @@ # monitor netwatch and send notifications # https://rsc.eworm.de/doc/netwatch-notify.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global NetwatchNotify; From 8cddc63767010072417d405cc4460febb8e9978d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:45:14 +0200 Subject: [PATCH 588/893] mod/ipcalc: use :onerror for outer block --- mod/ipcalc.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mod/ipcalc.rsc b/mod/ipcalc.rsc index 477cf4a..eacff6d 100644 --- a/mod/ipcalc.rsc +++ b/mod/ipcalc.rsc @@ -12,7 +12,7 @@ :global IPCalcReturn; # print netmask, network, min host, max host and broadcast -:set IPCalc do={ :do { +:set IPCalc do={ :onerror Err { :local Input [ :tostr $1 ]; :global FormatLine; @@ -27,8 +27,8 @@ [ $FormatLine "HostMin" ($Values->"hostmin") ] . "\n" . \ [ $FormatLine "HostMax" ($Values->"hostmax") ] . "\n" . \ [ $FormatLine "Broadcast" ($Values->"broadcast") ]) ]; -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # calculate and return netmask, network, min host, max host and broadcast From 40b19a179d0b7b87cfc2bf2fd9a92c0a20f95532 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:36 +0200 Subject: [PATCH 589/893] capsman-rolling-upgrade: check for global config to be ready --- capsman-rolling-upgrade.capsman.rsc | 6 +++--- capsman-rolling-upgrade.template.rsc | 6 +++--- capsman-rolling-upgrade.wifi.rsc | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/capsman-rolling-upgrade.capsman.rsc b/capsman-rolling-upgrade.capsman.rsc index 2097880..0d4114a 100644 --- a/capsman-rolling-upgrade.capsman.rsc +++ b/capsman-rolling-upgrade.capsman.rsc @@ -14,9 +14,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; diff --git a/capsman-rolling-upgrade.template.rsc b/capsman-rolling-upgrade.template.rsc index 75de088..690d73d 100644 --- a/capsman-rolling-upgrade.template.rsc +++ b/capsman-rolling-upgrade.template.rsc @@ -15,9 +15,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; diff --git a/capsman-rolling-upgrade.wifi.rsc b/capsman-rolling-upgrade.wifi.rsc index e6c6fac..8e32ab2 100644 --- a/capsman-rolling-upgrade.wifi.rsc +++ b/capsman-rolling-upgrade.wifi.rsc @@ -14,9 +14,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; From ff812dd1928657dbae9df59e2d19d6f6fe33fb1f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 590/893] ospf-to-leds: fail if global functions do not become ready --- ospf-to-leds.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ospf-to-leds.rsc b/ospf-to-leds.rsc index e2f4dcf..cdc06e5 100644 --- a/ospf-to-leds.rsc +++ b/ospf-to-leds.rsc @@ -8,11 +8,11 @@ # visualize ospf instance state via leds # https://rsc.eworm.de/doc/ospf-to-leds.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; From 862830b341716250daba288091b36d64926dccdb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:45:14 +0200 Subject: [PATCH 591/893] mod/notification-email: use :onerror for outer block --- mod/notification-email.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index 7b89d98..c0f9d86 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -35,7 +35,7 @@ } # flush e-mail queue -:set FlushEmailQueue do={ :do { +:set FlushEmailQueue do={ :onerror Err { :global EmailQueue; :global EitherOr; @@ -135,8 +135,8 @@ /system/scheduler/set interval=(($SchedVal->"run-count") . "m") \ comment="Waiting for retry..." $Scheduler; -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # generate filter for log-forward @@ -248,12 +248,12 @@ } # send notification via e-mail - expects at least two string arguments -:set SendEMail do={ :do { +:set SendEMail do={ :onerror Err { :global SendEMail2; $SendEMail2 ({ origin=$0; subject=$1; message=$2; link=$3 }); -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # send notification via e-mail - expects one array argument From ef1a402c4e61be10824ef441811d6f8a03ed35a7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 592/893] certificate-renew-issued: check for global config to be ready --- certificate-renew-issued.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/certificate-renew-issued.rsc b/certificate-renew-issued.rsc index 3fd6020..14917e4 100644 --- a/certificate-renew-issued.rsc +++ b/certificate-renew-issued.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CertIssuedExportPass; From 4358dabb19d45e3bee816d6f9bc76dad21a3c10c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 593/893] packages-update: fail if global functions do not become ready --- packages-update.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages-update.rsc b/packages-update.rsc index dce7cca..81a6d13 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -9,11 +9,11 @@ # download packages and reboot for installation # https://rsc.eworm.de/doc/packages-update.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global BackupRandomDelay; From 9d845d40f00250e1b3107c175aa2f1a77ffb3a63 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:45:14 +0200 Subject: [PATCH 594/893] mod/notification-gotify: use :onerror for outer block --- mod/notification-gotify.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mod/notification-gotify.rsc b/mod/notification-gotify.rsc index 7070918..3ae4cdd 100644 --- a/mod/notification-gotify.rsc +++ b/mod/notification-gotify.rsc @@ -17,7 +17,7 @@ :global SendGotify2; # flush Gotify queue -:set FlushGotifyQueue do={ :do { +:set FlushGotifyQueue do={ :onerror Err { :global GotifyQueue; :global IsFullyConnected; @@ -53,8 +53,8 @@ /system/scheduler/remove [ find where name="_FlushGotifyQueue" ]; :set GotifyQueue; } -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # send notification via Gotify - expects one array argument @@ -121,12 +121,12 @@ } # send notification via Gotify - expects at least two string arguments -:set SendGotify do={ :do { +:set SendGotify do={ :onerror Err { :global SendGotify2; $SendGotify2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # send notification via Gotify - expects one array argument From 4954a886958a7e3e0b9c05dcd9e8d4135f0d5a04 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 595/893] check-certificates: check for global config to be ready --- check-certificates.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index 505ec4b..c10e33b 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CertRenewTime; From 7b624faaa108201522cb792fcf776c39e30a0839 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 596/893] ppp-on-up: fail if global functions do not become ready --- ppp-on-up.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index ffe3079..ef08c9d 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -8,11 +8,11 @@ # run scripts on ppp up # https://rsc.eworm.de/doc/ppp-on-up.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; From d865deb8a8710d98453adf221e72fdfd0a71dc33 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:45:14 +0200 Subject: [PATCH 597/893] mod/notification-matrix: use :onerror for outer block --- mod/notification-matrix.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index e989ee0..c8cf887 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -19,7 +19,7 @@ :global SetupMatrixJoinRoom; # flush Matrix queue -:set FlushMatrixQueue do={ :do { +:set FlushMatrixQueue do={ :onerror Err { :global MatrixQueue; :global IsFullyConnected; @@ -58,8 +58,8 @@ /system/scheduler/remove [ find where name="_FlushMatrixQueue" ]; :set MatrixQueue; } -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # send notification via Matrix - expects one array argument @@ -167,12 +167,12 @@ } # send notification via Matrix - expects at least two string arguments -:set SendMatrix do={ :do { +:set SendMatrix do={ :onerror Err { :global SendMatrix2; $SendMatrix2 ({ origin=$0; subject=$1; message=$2; link=$3 }); -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # send notification via Matrix - expects one array argument From 1936dcb563c47b4ca4847912077f5f609d1360ad Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 598/893] check-health: check for global config to be ready --- check-health.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-health.rsc b/check-health.rsc index 40ce101..1b92d1e 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CheckHealthCPUUtilization; From 0ef8888412f2f9ad8fe8ffc714b3dfb30802f55e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 599/893] sms-action: fail if global functions do not become ready --- sms-action.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sms-action.rsc b/sms-action.rsc index d5bd553..0f02bce 100644 --- a/sms-action.rsc +++ b/sms-action.rsc @@ -8,11 +8,11 @@ # run action on received SMS # https://rsc.eworm.de/doc/sms-action.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global SmsAction; From e3a15cc6b803453290d2cc8e2415c207473aa2a1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:45:14 +0200 Subject: [PATCH 600/893] mod/notification-ntfy: use :onerror for outer block --- mod/notification-ntfy.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 2748c5b..8e5688e 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -16,7 +16,7 @@ :global SendNtfy2; # flush ntfy queue -:set FlushNtfyQueue do={ :do { +:set FlushNtfyQueue do={ :onerror Err { :global NtfyQueue; :global IsFullyConnected; @@ -52,8 +52,8 @@ /system/scheduler/remove [ find where name="_FlushNtfyQueue" ]; :set NtfyQueue; } -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # send notification via ntfy - expects one array argument @@ -143,12 +143,12 @@ } # send notification via ntfy - expects at least two string arguments -:set SendNtfy do={ :do { +:set SendNtfy do={ :onerror Err { :global SendNtfy2; $SendNtfy2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # send notification via ntfy - expects one array argument From 506acb748b9e6670323b68fb46b90e5d16ddff15 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 601/893] check-lte-firmware-upgrade: check for global config to be ready --- check-lte-firmware-upgrade.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index 6030e4d..1a5e08c 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global SentLteFirmwareUpgradeNotification; From 24ea16cf91dae10a654e77911dbb53b213a6fd4f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 602/893] sms-forward: fail if global functions do not become ready --- sms-forward.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sms-forward.rsc b/sms-forward.rsc index ddaa3a8..9c3e4a5 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -9,11 +9,11 @@ # forward SMS to e-mail # https://rsc.eworm.de/doc/sms-forward.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; From f7ba78702f92bec374b59066e57772d76f97358f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:45:14 +0200 Subject: [PATCH 603/893] mod/notification-telegram: use :onerror for outer block --- mod/notification-telegram.rsc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 5ef353b..51c8dbf 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -17,7 +17,7 @@ :global SendTelegram2; # flush telegram queue -:set FlushTelegramQueue do={ :do { +:set FlushTelegramQueue do={ :onerror Err { :global TelegramQueue; :global TelegramMessageIDs; @@ -55,12 +55,12 @@ /system/scheduler/remove [ find where name="_FlushTelegramQueue" ]; :set TelegramQueue; } -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # get the chat id -:set GetTelegramChatId do={ :do { +:set GetTelegramChatId do={ :onerror Err { :global TelegramTokenId; :global CertificateAvailable; @@ -94,8 +94,8 @@ :if (($Message->"is_topic_message") = true) do={ $LogPrint info $0 ("The thread id is: " . ($Message->"message_thread_id")); } -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # send notification via telegram - expects one array argument @@ -226,12 +226,12 @@ } # send notification via telegram - expects at least two string arguments -:set SendTelegram do={ :do { +:set SendTelegram do={ :onerror Err { :global SendTelegram2; $SendTelegram2 ({ origin=$0; subject=$1; message=$2; link=$3; silent=$4 }); -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # send notification via telegram - expects one array argument From 78463f469b02768c1197db9c2cc35c46581c7fcc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 604/893] check-perpetual-license: check for global config to be ready --- check-perpetual-license.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-perpetual-license.rsc b/check-perpetual-license.rsc index d46f0b4..c2f0dff 100644 --- a/check-perpetual-license.rsc +++ b/check-perpetual-license.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; From 35bce7c5eb775e7d9d0e774344918383d17b9009 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 605/893] telegram-chat: fail if global functions do not become ready --- telegram-chat.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 155bb02..f62034c 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -9,11 +9,11 @@ # use Telegram to chat with your Router and send commands # https://rsc.eworm.de/doc/telegram-chat.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; From 5958851bd7e3b034dda25f670e0019247c4d73a0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:45:14 +0200 Subject: [PATCH 606/893] mod/scriptrunonce: use :onerror for outer block --- mod/scriptrunonce.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index 7fcd5b5..3797c15 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -11,7 +11,7 @@ :global ScriptRunOnce; # fetch and run script(s) once -:set ScriptRunOnce do={ :do { +:set ScriptRunOnce do={ :onerror Err { :local Scripts [ :toarray $1 ]; :global ScriptRunOnceBaseUrl; @@ -51,6 +51,6 @@ :return true; } -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } From 59c66de69065989d8f3b6032c156d484299f2032 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 607/893] check-routeros-update: check for global config to be ready --- check-routeros-update.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 932256a..34d0647 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; From 87edd0bd29f3825fd638760f20343f5afe890ae3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 608/893] update-gre-address: fail if global functions do not become ready --- update-gre-address.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/update-gre-address.rsc b/update-gre-address.rsc index 2570f80..8d98eaa 100644 --- a/update-gre-address.rsc +++ b/update-gre-address.rsc @@ -9,11 +9,11 @@ # ipsec remote peer # https://rsc.eworm.de/doc/update-gre-address.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CharacterReplace; From af40ae82edaccbf6d1995f8ad1a5250f57f950db Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 09:45:14 +0200 Subject: [PATCH 609/893] mod/ssh-keys-import: use :onerror for outer block --- mod/ssh-keys-import.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index 2fae4b1..9a6cd39 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -12,7 +12,7 @@ :global SSHKeysImportFile; # import single key passed as string -:set SSHKeysImport do={ :do { +:set SSHKeysImport do={ :onerror Err { :local Key [ :tostr $1 ]; :local User [ :tostr $2 ]; @@ -65,12 +65,12 @@ $RmDir "tmpfs/ssh-keys-import"; :return false; } -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } # import keys from a file -:set SSHKeysImportFile do={ :do { +:set SSHKeysImportFile do={ :onerror Err { :local FileName [ :tostr $1 ]; :local User [ :tostr $2 ]; @@ -109,6 +109,6 @@ $LogPrint warning $0 ("SSH key of type '" . $KeyVal->0 . "' is not supported."); } } -} on-error={ - :global ExitError; $ExitError false $0; +} do={ + :global ExitError; $ExitError false $0 $Err; } } From 286ed96cc34efa929093bb72e64d102b458ae60e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 610/893] collect-wireless-mac: check for global config to be ready --- collect-wireless-mac.capsman.rsc | 6 +++--- collect-wireless-mac.local.rsc | 6 +++--- collect-wireless-mac.template.rsc | 6 +++--- collect-wireless-mac.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/collect-wireless-mac.capsman.rsc b/collect-wireless-mac.capsman.rsc index fa6198a..06b8d84 100644 --- a/collect-wireless-mac.capsman.rsc +++ b/collect-wireless-mac.capsman.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; diff --git a/collect-wireless-mac.local.rsc b/collect-wireless-mac.local.rsc index 4082bbb..6716582 100644 --- a/collect-wireless-mac.local.rsc +++ b/collect-wireless-mac.local.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; diff --git a/collect-wireless-mac.template.rsc b/collect-wireless-mac.template.rsc index 5167156..53e6b0a 100644 --- a/collect-wireless-mac.template.rsc +++ b/collect-wireless-mac.template.rsc @@ -14,9 +14,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; diff --git a/collect-wireless-mac.wifi.rsc b/collect-wireless-mac.wifi.rsc index af0dd8b..43ac851 100644 --- a/collect-wireless-mac.wifi.rsc +++ b/collect-wireless-mac.wifi.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; From 6040f70b19a06dc0d9817f3240b1bb13c34d453c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 11:15:15 +0200 Subject: [PATCH 611/893] update-tunnelbroker: fail if global functions do not become ready --- update-tunnelbroker.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index 10adef0..2deb5b2 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -11,11 +11,11 @@ # update local address of tunnelbroker interface # https://rsc.eworm.de/doc/update-tunnelbroker.md -:global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } - :local ExitOK false; :onerror Err { + :global GlobalFunctionsReady; + :retry { :if ($GlobalFunctionsReady != true) \ + do={ :error ("Global functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CertificateAvailable; From b19c448f7839aea73830fb0f3bb7314f98ce2f2c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 612/893] daily-psk: check for global config to be ready --- daily-psk.capsman.rsc | 6 +++--- daily-psk.local.rsc | 6 +++--- daily-psk.template.rsc | 6 +++--- daily-psk.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/daily-psk.capsman.rsc b/daily-psk.capsman.rsc index a1b01fc..3ecd6b6 100644 --- a/daily-psk.capsman.rsc +++ b/daily-psk.capsman.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global DailyPskMatchComment; diff --git a/daily-psk.local.rsc b/daily-psk.local.rsc index 6ba6ce2..d496350 100644 --- a/daily-psk.local.rsc +++ b/daily-psk.local.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global DailyPskMatchComment; diff --git a/daily-psk.template.rsc b/daily-psk.template.rsc index 43ce333..5a1df2f 100644 --- a/daily-psk.template.rsc +++ b/daily-psk.template.rsc @@ -14,9 +14,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global DailyPskMatchComment; diff --git a/daily-psk.wifi.rsc b/daily-psk.wifi.rsc index 7e1714d..c441e58 100644 --- a/daily-psk.wifi.rsc +++ b/daily-psk.wifi.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global DailyPskMatchComment; From ad6ad5bfccfec0bfbb83848ddf6784ef12e1e770 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 613/893] dhcp-lease-comment: check for global config to be ready --- dhcp-lease-comment.capsman.rsc | 6 +++--- dhcp-lease-comment.local.rsc | 6 +++--- dhcp-lease-comment.template.rsc | 6 +++--- dhcp-lease-comment.wifi.rsc | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/dhcp-lease-comment.capsman.rsc b/dhcp-lease-comment.capsman.rsc index 724682b..3615bb9 100644 --- a/dhcp-lease-comment.capsman.rsc +++ b/dhcp-lease-comment.capsman.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; diff --git a/dhcp-lease-comment.local.rsc b/dhcp-lease-comment.local.rsc index 0a5f3b5..9da5333 100644 --- a/dhcp-lease-comment.local.rsc +++ b/dhcp-lease-comment.local.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; diff --git a/dhcp-lease-comment.template.rsc b/dhcp-lease-comment.template.rsc index 71307b7..62cace1 100644 --- a/dhcp-lease-comment.template.rsc +++ b/dhcp-lease-comment.template.rsc @@ -14,9 +14,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; diff --git a/dhcp-lease-comment.wifi.rsc b/dhcp-lease-comment.wifi.rsc index 1f29f0b..667708c 100644 --- a/dhcp-lease-comment.wifi.rsc +++ b/dhcp-lease-comment.wifi.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; From 857993cf90b0bb432c18292816734f55ed2867cf Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 614/893] dhcp-to-dns: check for global config to be ready --- dhcp-to-dns.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dhcp-to-dns.rsc b/dhcp-to-dns.rsc index e66704b..a9c91e1 100644 --- a/dhcp-to-dns.rsc +++ b/dhcp-to-dns.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Domain; From a68763c4dd4ca4e93dcd0edd98cd25bc8ac5d734 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 615/893] firmware-upgrade-reboot: check for global config to be ready --- firmware-upgrade-reboot.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/firmware-upgrade-reboot.rsc b/firmware-upgrade-reboot.rsc index d5774db..e3ca55b 100644 --- a/firmware-upgrade-reboot.rsc +++ b/firmware-upgrade-reboot.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; From 9e70bca30b792785034422db15bf158d94e666e6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 616/893] fw-addr-lists: check for global config to be ready --- fw-addr-lists.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 1a892da..4ee3c34 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global FwAddrLists; From 148892694fe43d6382ec368e450634342965882a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 617/893] gps-track: check for global config to be ready --- gps-track.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gps-track.rsc b/gps-track.rsc index d66bf00..4cc5066 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global GpsTrackUrl; From 713e63da87d57d77961ddf606b4438a4c2b7ecd7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 618/893] hotspot-to-wpa-cleanup: check for global config to be ready --- hotspot-to-wpa-cleanup.capsman.rsc | 6 +++--- hotspot-to-wpa-cleanup.template.rsc | 6 +++--- hotspot-to-wpa-cleanup.wifi.rsc | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/hotspot-to-wpa-cleanup.capsman.rsc b/hotspot-to-wpa-cleanup.capsman.rsc index fd0e554..e4ac967 100644 --- a/hotspot-to-wpa-cleanup.capsman.rsc +++ b/hotspot-to-wpa-cleanup.capsman.rsc @@ -14,9 +14,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global EitherOr; diff --git a/hotspot-to-wpa-cleanup.template.rsc b/hotspot-to-wpa-cleanup.template.rsc index 11f359c..d51e1d0 100644 --- a/hotspot-to-wpa-cleanup.template.rsc +++ b/hotspot-to-wpa-cleanup.template.rsc @@ -15,9 +15,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global EitherOr; diff --git a/hotspot-to-wpa-cleanup.wifi.rsc b/hotspot-to-wpa-cleanup.wifi.rsc index 7f0ebae..8bb2631 100644 --- a/hotspot-to-wpa-cleanup.wifi.rsc +++ b/hotspot-to-wpa-cleanup.wifi.rsc @@ -14,9 +14,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global EitherOr; From 6a9fced721e9ed54b451aeecc2e68f761663dfb6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 619/893] hotspot-to-wpa: check for global config to be ready --- hotspot-to-wpa.capsman.rsc | 6 +++--- hotspot-to-wpa.template.rsc | 6 +++--- hotspot-to-wpa.wifi.rsc | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/hotspot-to-wpa.capsman.rsc b/hotspot-to-wpa.capsman.rsc index a9a1407..8977cee 100644 --- a/hotspot-to-wpa.capsman.rsc +++ b/hotspot-to-wpa.capsman.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global EitherOr; diff --git a/hotspot-to-wpa.template.rsc b/hotspot-to-wpa.template.rsc index 84a43bc..c5d977d 100644 --- a/hotspot-to-wpa.template.rsc +++ b/hotspot-to-wpa.template.rsc @@ -14,9 +14,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global EitherOr; diff --git a/hotspot-to-wpa.wifi.rsc b/hotspot-to-wpa.wifi.rsc index 5c5afda..6a97e46 100644 --- a/hotspot-to-wpa.wifi.rsc +++ b/hotspot-to-wpa.wifi.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global EitherOr; From ce29fcf49ed381ebd910f74193ce3be7cac1def9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 620/893] ipsec-to-dns: check for global config to be ready --- ipsec-to-dns.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ipsec-to-dns.rsc b/ipsec-to-dns.rsc index fb7b55c..1b5ed13 100644 --- a/ipsec-to-dns.rsc +++ b/ipsec-to-dns.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Domain; From 59f9a1187f769dc57d778a77264ae69591ac594b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 621/893] ipv6-update: check for global config to be ready --- ipv6-update.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ipv6-update.rsc b/ipv6-update.rsc index 24167c0..580a426 100644 --- a/ipv6-update.rsc +++ b/ipv6-update.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; From 10bd9a1cb5b3d556abcc5732d894e3bcc797e94b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 622/893] lease-script: check for global config to be ready --- lease-script.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lease-script.rsc b/lease-script.rsc index 501e047..b166ee3 100644 --- a/lease-script.rsc +++ b/lease-script.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Grep; From 160effd91b66459dd9a2ecaf5ecc442a33f135c5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 623/893] log-forward: check for global config to be ready --- log-forward.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/log-forward.rsc b/log-forward.rsc index 3774dac..be7eff7 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; From bc1c238158a18f5fc7122a5110f21d29e72540cb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 624/893] mode-button: check for global config to be ready --- mode-button.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mode-button.rsc b/mode-button.rsc index e5c836f..c6422f0 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global ModeButton; From 2d39dbdf7c363ba5657dee6c94f9763bbaab3e86 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 625/893] netwatch-dns: check for global config to be ready --- netwatch-dns.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 5a928f0..3da1498 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CertificateAvailable; From 5b40380cd2dfe6b3fcd0828460851c41e1d1b416 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 626/893] netwatch-notify: check for global config to be ready --- netwatch-notify.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index 0c48330..fb8e8d5 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global NetwatchNotify; From aaecd1b457f5e5779276c7217d1c5429536d5534 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 627/893] ospf-to-leds: check for global config to be ready --- ospf-to-leds.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ospf-to-leds.rsc b/ospf-to-leds.rsc index cdc06e5..26f8aa3 100644 --- a/ospf-to-leds.rsc +++ b/ospf-to-leds.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; From 38ec392a5fd462a803f4e04219a0d4acbf98bc63 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 628/893] packages-update: check for global config to be ready --- packages-update.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages-update.rsc b/packages-update.rsc index 81a6d13..4fde131 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global BackupRandomDelay; From 194698f53f27bebc9ee349597c764b58cd4475b0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 629/893] ppp-on-up: check for global config to be ready --- ppp-on-up.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ppp-on-up.rsc b/ppp-on-up.rsc index ef08c9d..f16d73f 100644 --- a/ppp-on-up.rsc +++ b/ppp-on-up.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global LogPrint; From 6270ac45d8ed241cfe31e345cccc097cb33bd02b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 630/893] sms-action: check for global config to be ready --- sms-action.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sms-action.rsc b/sms-action.rsc index 0f02bce..47e1922 100644 --- a/sms-action.rsc +++ b/sms-action.rsc @@ -10,9 +10,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global SmsAction; From 15248ffd39b982a176d87c39db6c3f789102a29f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 631/893] sms-forward: check for global config to be ready --- sms-forward.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sms-forward.rsc b/sms-forward.rsc index 9c3e4a5..8ca5ae4 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; From 9b5419b939cadc751076c68a2b6bb8434a828444 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 632/893] telegram-chat: check for global config to be ready --- telegram-chat.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index f62034c..b1f7f99 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global Identity; From b4d80d3b178e376568a3e7bbcb5dce29c631e383 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 633/893] update-gre-address: check for global config to be ready --- update-gre-address.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/update-gre-address.rsc b/update-gre-address.rsc index 8d98eaa..dd7d63e 100644 --- a/update-gre-address.rsc +++ b/update-gre-address.rsc @@ -11,9 +11,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CharacterReplace; From f2dbb9eff34aa43fd2be41f9a6a36da06e07dbb0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:08:37 +0200 Subject: [PATCH 634/893] update-tunnelbroker: check for global config to be ready --- update-tunnelbroker.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index 2deb5b2..8e5e1d0 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -13,9 +13,9 @@ :local ExitOK false; :onerror Err { - :global GlobalFunctionsReady; - :retry { :if ($GlobalFunctionsReady != true) \ - do={ :error ("Global functions not ready."); }; } delay=500ms max=50; + :global GlobalConfigReady; :global GlobalFunctionsReady; + :retry { :if ($GlobalConfigReady != true || $GlobalFunctionsReady != true) \ + do={ :error ("Global config and/or functions not ready."); }; } delay=500ms max=50; :local ScriptName [ :jobname ]; :global CertificateAvailable; From 0f58cecc0f2f114d5520db5d283fcd7d243c1bc1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:09:50 +0200 Subject: [PATCH 635/893] global-wait: check for global config to be ready --- global-wait.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/global-wait.rsc b/global-wait.rsc index ca3fc0c..23b5629 100644 --- a/global-wait.rsc +++ b/global-wait.rsc @@ -8,5 +8,6 @@ # wait for global-functions to finish # https://rsc.eworm.de/doc/global-wait.md +:global GlobalConfigReady; :global GlobalFunctionsReady; -:while ($GlobalFunctionsReady != true) do={ :delay 500ms; } +:while ($GlobalConfigReady != true || $GlobalFunctionsReady != true) do={ :delay 500ms; } From 4561b17dbff272b1b5671155ee1838dba2f24062 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 13:57:05 +0200 Subject: [PATCH 636/893] global-config: add another comment with visual hint --- global-config.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/global-config.rsc b/global-config.rsc index c0577ff..2d7d43d 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -8,6 +8,9 @@ # Warning: Do *NOT* copy this line to overlay! :global GlobalConfigReady false; +# || ... but +# \||/ start +# \/ here! # Set this to 'true' to disable news and change notifications. :global NoNewsAndChangesNotification false; From 661aad522b09bf4aba5b0be4877669e0a826b4a6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 14:05:47 +0200 Subject: [PATCH 637/893] global-config: add another visual hint --- global-config.rsc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/global-config.rsc b/global-config.rsc index 2d7d43d..589a58a 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -270,8 +270,11 @@ "cert2-cn"="4n0th3r-s3cr3t"; }; +# /\ Warning: Do *NOT* copy +# /\7\ the code below to overlay! +# /_()_\ Things *will* break! +# # load custom settings from overlay and snippets -# Warning: Do *NOT* copy this code to overlay! :foreach Script in=([ /system/script/find where name="global-config-overlay" ], \ [ /system/script/find where name~"^global-config-overlay.d/" ]) do={ :do { From f095b581e74b5c5a8110c801243b2ec039499120 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 6 May 2025 19:42:12 +0200 Subject: [PATCH 638/893] global-functions: $ScriptInstallUpdate: set config and functions not ready... ... before reload. This should fix some corner cases where scripts ran with broken configuration or functions. Also do reload both - configuration and functions - to simplify the function. --- global-functions.rsc | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 29e6d06..6e3d712 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1126,6 +1126,8 @@ :global CommitId; :global CommitInfo; :global ExpectedConfigVersion; + :global GlobalConfigReady; + :global GlobalFunctionsReady; :global Identity; :global IDonate; :global NoNewsAndChangesNotification; @@ -1159,8 +1161,7 @@ :local CommitIdBefore $CommitId; :local ExpectedConfigVersionBefore $ExpectedConfigVersion; - :local ReloadGlobalFunctions false; - :local ReloadGlobalConfig false; + :local ReloadGlobal false; :local DeviceMode [ /system/device-mode/get ]; :local CheckSums ({}); @@ -1269,31 +1270,25 @@ $LogPrint info $0 ("Updating script: " . $ScriptVal->"name"); /system/script/set owner=($ScriptVal->"name") \ source=[ $IfThenElse ($ScriptUpdatesCRLF = true) $SourceCRLF $SourceNew ] $Script; - :if ($ScriptVal->"name" = "global-config") do={ - :set ReloadGlobalConfig true; - } - :if ($ScriptVal->"name" = "global-functions" || $ScriptVal->"name" ~ ("^mod/.")) do={ - :set ReloadGlobalFunctions true; + :if ($ScriptVal->"name" = "global-config" || \ + $ScriptVal->"name" = "global-functions" || \ + $ScriptVal->"name" ~ ("^mod/.")) do={ + :set ReloadGlobal true; } } on-error={ } } - :if ($ReloadGlobalFunctions = true) do={ - $LogPrint info $0 ("Reloading global functions."); - :do { - /system/script/run global-functions; - } on-error={ - $LogPrint error $0 ("Reloading global functions failed!"); - } - } + :if ($ReloadGlobal = true) do={ + $LogPrint info $0 ("Reloading global configuration and functions."); + :set GlobalConfigReady false; + :set GlobalFunctionsReady false; + :delay 1s; - :if ($ReloadGlobalConfig = true) do={ - $LogPrint info $0 ("Reloading global configuration."); - :do { + :onerror Err { /system/script/run global-config; - } on-error={ - $LogPrint error $0 ("Reloading global configuration failed!" . \ - " Syntax error or missing overlay?"); + /system/script/run global-functions; + } do={ + $LogPrint error $0 ("Reloading global configuration and functions failed! " . $Err); } } From 90857805622a97ac3b150da60579952bf2ba0185 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 7 May 2025 11:45:55 +0200 Subject: [PATCH 639/893] sms-forward: delay after removal... ... to give the SIM card some time to succeed. Removing several messages one after another fails without this. --- sms-forward.rsc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sms-forward.rsc b/sms-forward.rsc index 8ca5ae4..4798a8a 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -62,6 +62,7 @@ ($SmsVal->"message")~("^:cmd " . $Settings->"secret" . " script ")) do={ $LogPrint debug $ScriptName ("Removing SMS, which started a script."); /tool/sms/inbox/remove $Sms; + :delay 50ms; } else={ :set Messages ($Messages . "\n\nOn " . $SmsVal->"timestamp" . \ " type " . $SmsVal->"type" . ":\n" . $SmsVal->"message"); @@ -93,6 +94,7 @@ " by " . $Identity . " from " . $Phone . ":" . $Messages) }); :foreach Sms in=$Delete do={ /tool/sms/inbox/remove $Sms; + :delay 50ms; } } } From 01f3cb91e796fba77bc7ec810d98a31fe2a33843 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 7 May 2025 14:31:37 +0200 Subject: [PATCH 640/893] sms-forward: add error handling on message removal --- sms-forward.rsc | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/sms-forward.rsc b/sms-forward.rsc index 4798a8a..a564056 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -61,8 +61,12 @@ :if ($Phone = $Settings->"allowed-number" && \ ($SmsVal->"message")~("^:cmd " . $Settings->"secret" . " script ")) do={ $LogPrint debug $ScriptName ("Removing SMS, which started a script."); - /tool/sms/inbox/remove $Sms; - :delay 50ms; + :onerror Err { + /tool/sms/inbox/remove $Sms; + :delay 50ms; + } do={ + $LogPrint warning $ScriptName ("Failed to remove message: " . $Err); + } } else={ :set Messages ($Messages . "\n\nOn " . $SmsVal->"timestamp" . \ " type " . $SmsVal->"type" . ":\n" . $SmsVal->"message"); @@ -93,8 +97,12 @@ message=("Received " . [ $IfThenElse ($Count = 1) "this message" ("these " . $Count . " messages") ] . \ " by " . $Identity . " from " . $Phone . ":" . $Messages) }); :foreach Sms in=$Delete do={ - /tool/sms/inbox/remove $Sms; - :delay 50ms; + :onerror Err { + /tool/sms/inbox/remove $Sms; + :delay 50ms; + } do={ + $LogPrint warning $ScriptName ("Failed to remove message: " . $Err); + } } } } From 6691e2e765c7dbfa3e639bea2331bbbf0b83ed4f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 21 May 2025 21:51:16 +0200 Subject: [PATCH 641/893] global-functions: $DownloadPackage: reverse failure logic... ... and do not retry. --- global-functions.rsc | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 6e3d712..1dd7708 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -391,25 +391,22 @@ :local Url ("https://upgrade.mikrotik.com/routeros/" . $PkgVer . "/" . $PkgFile); $LogPrint info $0 ("Downloading package file '" . $PkgName . "'..."); $LogPrint debug $0 ("... from url: " . $Url); - :local Retry 3; - :while ($Retry > 0) do={ - :do { - /tool/fetch check-certificate=yes-without-crl $Url dst-path=$PkgDest; - $WaitForFile $PkgDest; - :if ([ /file/get [ find where name=$PkgDest ] type ] = "package") do={ - :return true; - } - } on-error={ - $LogPrint debug $0 ("Downloading package file failed."); - } - - $RmFile $PkgDest; - :set Retry ($Retry - 1); + :do { + /tool/fetch check-certificate=yes-without-crl $Url dst-path=$PkgDest; + $WaitForFile $PkgDest; + } on-error={ + $LogPrint warning $0 ("Downloading package file '" . $PkgName . "' failed."); + :return false; } - $LogPrint warning $0 ("Downloading package file '" . $PkgName . "' failed."); - :return false; + :if ([ /file/get [ find where name=$PkgDest ] type ] != "package") do={ + $LogPrint warning $0 ("Downloaded file is not a package, removing."); + $RmFile $PkgDest; + :return false; + } + + :return true; } # return either first (if "true") or second From c3fce370660b8c128f579d2a419c657395748c2e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 7 May 2025 17:59:20 +0200 Subject: [PATCH 642/893] backup-partition: :do ... on-error=... -> :onerror ... do=... --- backup-partition.rsc | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/backup-partition.rsc b/backup-partition.rsc index c2221d2..ae7ad03 100644 --- a/backup-partition.rsc +++ b/backup-partition.rsc @@ -32,14 +32,15 @@ :global LogPrint; - :do { + :onerror Err { /partitions/copy-to $FallbackTo; $LogPrint info $ScriptName ("Copied RouterOS to partition '" . $FallbackToName . "'."); - :return true; - } on-error={ - $LogPrint error $ScriptName ("Failed copying RouterOS to partition '" . $FallbackToName . "'!"); + } do={ + $LogPrint error $ScriptName ("Failed copying RouterOS to partition '" . \ + $FallbackToName . "': " . $Err); :return false; } + :return true; } :if ([ $ScriptLock $ScriptName ] = false) do={ @@ -107,16 +108,17 @@ } } - :do { + :onerror Err { /system/scheduler/add start-time=startup name="running-from-backup-partition" \ on-event=(":log warning (\"Running from partition '\" . " . \ "[ /partitions/get [ find where running ] name ] . \"'!\")"); /partitions/save-config-to $FallbackTo; /system/scheduler/remove "running-from-backup-partition"; $LogPrint info $ScriptName ("Saved configuration to partition '" . $FallbackToName . "'."); - } on-error={ + } do={ /system/scheduler/remove [ find where name="running-from-backup-partition" ]; - $LogPrint error $ScriptName ("Failed saving configuration to partition '" . $FallbackToName . "'!"); + $LogPrint error $ScriptName ("Failed saving configuration to partition '" . \ + $FallbackToName . "': " . $Err); :set PackagesUpdateBackupFailure true; :set ExitOK true; :error false; From dc2296d5004b806aa5c5812c0e1a7ff4016be005 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 7 May 2025 18:03:30 +0200 Subject: [PATCH 643/893] backup-upload: :do ... on-error=... -> :onerror ... do=... --- backup-upload.rsc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/backup-upload.rsc b/backup-upload.rsc index 11ced4c..e6b9f92 100644 --- a/backup-upload.rsc +++ b/backup-upload.rsc @@ -90,13 +90,13 @@ /system/backup/save encryption=aes-sha256 name=$FilePath password=$BackupPassword; $WaitForFile ($FilePath . ".backup"); - :do { + :onerror Err { /tool/fetch upload=yes url=($BackupUploadUrl . "/" . $FileName . ".backup") \ user=$BackupUploadUser password=$BackupUploadPass src-path=($FilePath . ".backup"); :set BackupFile [ /file/get ($FilePath . ".backup") ]; :set ($BackupFile->"name") ($FileName . ".backup"); - } on-error={ - $LogPrint error $ScriptName ("Uploading backup file failed!"); + } do={ + $LogPrint error $ScriptName ("Uploading backup file failed: " . $Err); :set BackupFile "failed"; :set Failed 1; } @@ -109,13 +109,13 @@ /export terse show-sensitive file=$FilePath; $WaitForFile ($FilePath . ".rsc"); - :do { + :onerror Err { /tool/fetch upload=yes url=($BackupUploadUrl . "/" . $FileName . ".rsc") \ user=$BackupUploadUser password=$BackupUploadPass src-path=($FilePath . ".rsc"); :set ExportFile [ /file/get ($FilePath . ".rsc") ]; :set ($ExportFile->"name") ($FileName . ".rsc"); - } on-error={ - $LogPrint error $ScriptName ("Uploading configuration export failed!"); + } do={ + $LogPrint error $ScriptName ("Uploading configuration export failed: " . $Err); :set ExportFile "failed"; :set Failed 1; } @@ -130,13 +130,13 @@ file=($FilePath . ".conf\00"); $WaitForFile ($FilePath . ".conf"); - :do { + :onerror Err { /tool/fetch upload=yes url=($BackupUploadUrl . "/" . $FileName . ".conf") \ user=$BackupUploadUser password=$BackupUploadPass src-path=($FilePath . ".conf"); :set ConfigFile [ /file/get ($FilePath . ".conf") ]; :set ($ConfigFile->"name") ($FileName . ".conf"); - } on-error={ - $LogPrint error $ScriptName ("Uploading global-config-overlay failed!"); + } do={ + $LogPrint error $ScriptName ("Uploading global-config-overlay failed: " . $Err); :set ConfigFile "failed"; :set Failed 1; } From 187aeba78bebef1d1f47524c690ad260adffcadd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:04:15 +0200 Subject: [PATCH 644/893] check-health: :do ... on-error=... -> :onerror ... do=... --- check-health.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-health.rsc b/check-health.rsc index 1b92d1e..4cb9940 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -89,10 +89,10 @@ :foreach Plugin in=$Plugins do={ :local PluginVal [ /system/script/get $Plugin ]; :if ([ $ValidateSyntax ($PluginVal->"source") ] = true) do={ - :do { + :onerror Err { /system/script/run $Plugin; - } on-error={ - $LogPrint error $ScriptName ("Plugin '" . $ScriptVal->"name" . "' failed to run."); + } do={ + $LogPrint error $ScriptName ("Plugin '" . $ScriptVal->"name" . "' failed to run: " . $Err); } } else={ $LogPrint error $ScriptName ("Plugin '" . $ScriptVal->"name" . "' failed syntax validation, skipping."); From 1925d2847c6d9b48364e24153fcbfb10cd9e758d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:05:41 +0200 Subject: [PATCH 645/893] check-lte-firmware-upgrade: :do ... on-error=... -> :onerror ... do=... --- check-lte-firmware-upgrade.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-lte-firmware-upgrade.rsc b/check-lte-firmware-upgrade.rsc index 1a5e08c..9f4b656 100644 --- a/check-lte-firmware-upgrade.rsc +++ b/check-lte-firmware-upgrade.rsc @@ -45,12 +45,12 @@ :local IntName [ /interface/lte/get $Interface name ]; :local Firmware; :local Info; - :do { + :onerror Err { :set Firmware [ /interface/lte/firmware-upgrade $Interface as-value ]; :set Info [ /interface/lte/monitor $Interface once as-value ]; - } on-error={ + } do={ $LogPrint debug $ScriptName ("Could not get latest LTE firmware version for interface " . \ - $IntName . "."); + $IntName . ": " . $Err); :return false; } From 79f681b80115b2f663feda478294717bb021c7ba Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:06:25 +0200 Subject: [PATCH 646/893] check-routeros-update: :do ... on-error=... -> :onerror ... do=... --- check-routeros-update.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index 34d0647..e28a019 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -141,13 +141,13 @@ :if ([ :len $SafeUpdateUrl ] > 0) do={ :local Result; - :do { + :onerror Err { :set Result [ /tool/fetch check-certificate=yes-without-crl \ ($SafeUpdateUrl . $Update->"channel" . "?installed=" . $Update->"installed-version" . \ "&latest=" . $Update->"latest-version") http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) \ output=user as-value ]; - } on-error={ - $LogPrint warning $ScriptName ("Failed receiving safe version for " . $Update->"channel" . "."); + } do={ + $LogPrint warning $ScriptName ("Failed receiving safe version for " . $Update->"channel" . ": " . $Err); } :if ($Result->"status" = "finished" && $Result->"data" = $Update->"latest-version") do={ $LogPrint info $ScriptName ("Version " . $Update->"latest-version" . " is considered safe, updating..."); From 142b0760b0e8daa205cc1fc8f471716e219ece82 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:17:46 +0200 Subject: [PATCH 647/893] fw-addr-lists: :do ... on-error=... -> :onerror ... do=... --- fw-addr-lists.rsc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 4ee3c34..659fb2f 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -176,13 +176,13 @@ :foreach Address,Timeout in=$Branch do={ $LogPrintVerbose debug $ScriptName ("Adding IPv4 address to list '" . $FwListName . \ "' with " . $Timeout . ": " . $Address); - :do { + :onerror Err { /ip/firewall/address-list/add list=$FwListName comment=$ListComment \ address=$Address timeout=$Timeout; :set CntAdd ($CntAdd + 1); - } on-error={ - $LogPrint warning $ScriptName ("Failed to add IPv4 address to list '" . $FwListName . \ - "': " . $Address); + } do={ + $LogPrint warning $ScriptName ("Failed to add IPv4 address " . $Address . \ + " to list '" . $FwListName . "': " . $Err); } } } @@ -192,13 +192,13 @@ :foreach Address,Timeout in=$Branch do={ $LogPrintVerbose debug $ScriptName ("Adding IPv6 address to list '" . $FwListName . \ "' with " . $Timeout . ": " . $Address); - :do { + :onerror Err { /ipv6/firewall/address-list/add list=$FwListName comment=$ListComment \ address=$Address timeout=$Timeout; :set CntAdd ($CntAdd + 1); - } on-error={ - $LogPrint warning $ScriptName ("Failed to add IPv6 address to list '" . $FwListName . \ - "': " . $Address); + } do={ + $LogPrint warning $ScriptName ("Failed to add IPv6 address " . $Address . \ + " to list '" . $FwListName . "': " . $Err); } } } From b807fc9e90b105c2057631c23f5685d18b811951 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:21:03 +0200 Subject: [PATCH 648/893] fw-addr-lists: adopt changes in wording... ... to match the changes from previous commit. --- fw-addr-lists.rsc | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 659fb2f..5a03875 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -135,15 +135,15 @@ :local Branch [ $GetBranch $Address ]; :local TimeOut ($IPv4Addresses->$Branch->$Address); :if ([ :typeof $TimeOut ] = "time") do={ - $LogPrintVerbose debug $ScriptName ("Renewing IPv4 address in list '" . $FwListName . \ - "' with " . $TimeOut . ": " . $Address); + $LogPrintVerbose debug $ScriptName ("Renewing IPv4 address " . $Address . \ + " in list '" . $FwListName . "' with " . $TimeOut . "."); /ip/firewall/address-list/set $Entry timeout=$TimeOut; :set ($IPv4Addresses->$Branch->$Address); :set CntRenew ($CntRenew + 1); } else={ :if ($Failure = false) do={ - $LogPrintVerbose debug $ScriptName ("Removing IPv4 address from list '" . $FwListName . \ - "': " . $Address); + $LogPrintVerbose debug $ScriptName ("Removing IPv4 address " . $Address . \ + " from list '" . $FwListName . "."); /ip/firewall/address-list/remove $Entry; :set CntRemove ($CntRemove + 1); } @@ -156,15 +156,15 @@ :local Branch [ $GetBranch $Address ]; :local TimeOut ($IPv6Addresses->$Branch->$Address); :if ([ :typeof $TimeOut ] = "time") do={ - $LogPrintVerbose debug $ScriptName ("Renewing IPv6 address in list '" . $FwListName . \ - "' with " . $TimeOut . ": " . $Address); + $LogPrintVerbose debug $ScriptName ("Renewing IPv6 address " . $Address . \ + " in list '" . $FwListName . "' with " . $TimeOut . "."); /ipv6/firewall/address-list/set $Entry timeout=$TimeOut; :set ($IPv6Addresses->$Branch->$Address); :set CntRenew ($CntRenew + 1); } else={ :if ($Failure = false) do={ - $LogPrintVerbose debug $ScriptName ("Removing IPv6 address from list '" . $FwListName . \ - "': " . $Address); + $LogPrintVerbose debug $ScriptName ("Removing IPv6 address " . $Address . \ + " from list '" . $FwListName ."."); /ipv6/firewall/address-list/remove $Entry; :set CntRemove ($CntRemove + 1); } @@ -174,8 +174,8 @@ :foreach BranchName,Branch in=$IPv4Addresses do={ $LogPrintVerbose debug $ScriptName ("Handling branch: " . $BranchName); :foreach Address,Timeout in=$Branch do={ - $LogPrintVerbose debug $ScriptName ("Adding IPv4 address to list '" . $FwListName . \ - "' with " . $Timeout . ": " . $Address); + $LogPrintVerbose debug $ScriptName ("Adding IPv4 address " . $Address . \ + " to list '" . $FwListName . "' with " . $Timeout . "."); :onerror Err { /ip/firewall/address-list/add list=$FwListName comment=$ListComment \ address=$Address timeout=$Timeout; @@ -190,8 +190,8 @@ :foreach BranchName,Branch in=$IPv6Addresses do={ $LogPrintVerbose debug $ScriptName ("Handling branch: " . $BranchName); :foreach Address,Timeout in=$Branch do={ - $LogPrintVerbose debug $ScriptName ("Adding IPv6 address to list '" . $FwListName . \ - "' with " . $Timeout . ": " . $Address); + $LogPrintVerbose debug $ScriptName ("Adding IPv6 address " . $Address . \ + " to list '" . $FwListName . "' with " . $Timeout . "."); :onerror Err { /ipv6/firewall/address-list/add list=$FwListName comment=$ListComment \ address=$Address timeout=$Timeout; From a9e7bb0a05c4b4a2744039ce7369760c5cbc0c9f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:22:02 +0200 Subject: [PATCH 649/893] global-config: :do ... on-error=... -> :onerror ... do=... --- global-config.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-config.rsc b/global-config.rsc index 589a58a..86d528a 100644 --- a/global-config.rsc +++ b/global-config.rsc @@ -277,11 +277,11 @@ # load custom settings from overlay and snippets :foreach Script in=([ /system/script/find where name="global-config-overlay" ], \ [ /system/script/find where name~"^global-config-overlay.d/" ]) do={ - :do { + :onerror Err { /system/script/run $Script; - } on-error={ + } do={ :log error ("Loading configuration from overlay or snippet " . \ - [ /system/script/get $Script name ] . " failed!"); + [ /system/script/get $Script name ] . " failed: " . $Err); } } From 5b89f3e425c0703c804dda76ef22efe22b438cc3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 21 May 2025 21:53:34 +0200 Subject: [PATCH 650/893] global-functions: $DownloadPackage: :do ... on-error=... -> :onerror ... do=... --- global-functions.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 1dd7708..fc33f5a 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -392,11 +392,11 @@ $LogPrint info $0 ("Downloading package file '" . $PkgName . "'..."); $LogPrint debug $0 ("... from url: " . $Url); - :do { + :onerror Err { /tool/fetch check-certificate=yes-without-crl $Url dst-path=$PkgDest; $WaitForFile $PkgDest; - } on-error={ - $LogPrint warning $0 ("Downloading package file '" . $PkgName . "' failed."); + } do={ + $LogPrint warning $0 ("Downloading package file '" . $PkgName . "' failed: " . $Err); :return false; } From a6b36dde7bbd9bd4308588cbe0b10ae04399b8e6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:24:56 +0200 Subject: [PATCH 651/893] global-functions: $FetchHuge: :do ... on-error=... -> :onerror ... do=... --- global-functions.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index fc33f5a..3b7ff7c 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -486,14 +486,14 @@ } :local FileName ($DirName . "/" . [ $CleanName $0 ] . "-" . [ $GetRandom20CharAlNum ]); - :do { + :onerror Err { /tool/fetch check-certificate=$CheckCert $Url dst-path=$FileName \ http-header-field=({ [ $FetchUserAgentStr $ScriptName ] }) as-value; - } on-error={ + } do={ :if ([ $WaitForFile $FileName 500ms ] = true) do={ $RmFile $FileName; } - $LogPrint debug $0 ("Failed downloading from: " . $Url); + $LogPrint debug $0 ("Failed downloading from " . $Url . " - " . $Err); $RmDir $DirName; :return false; } From 7a1fef78a26bfa913c4aaa5702b2d4178e663118 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:26:53 +0200 Subject: [PATCH 652/893] global-functions: $GetMacVendor: :do ... on-error=... -> :onerror ... do=... --- global-functions.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 3b7ff7c..35dd0e0 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -586,12 +586,12 @@ ("https://api.macvendors.com/" . [ :pick $Mac 0 8 ]) output=user as-value ]->"data"); :return $Vendor; } on-error={ - :do { + :onerror Err { /tool/fetch check-certificate=yes-without-crl ("https://api.macvendors.com/") \ output=none as-value; $LogPrint debug $0 ("The mac vendor is not known in database."); - } on-error={ - $LogPrint warning $0 ("Failed getting mac vendor."); + } do={ + $LogPrint warning $0 ("Failed getting mac vendor: " . $Err); } :return "unknown vendor"; } From 09f9826760316c35cb229bde4d065c89290c6076 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:27:50 +0200 Subject: [PATCH 653/893] global-functions: $MkDir: :do ... on-error=... -> :onerror ... do=... --- global-functions.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 35dd0e0..271e3a2 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -894,11 +894,11 @@ $LogPrint info $0 ("Creating disk of type tmpfs."); $RmDir "tmpfs"; - :do { + :onerror Err { /disk/add slot=tmpfs type=tmpfs tmpfs-max-size=([ /system/resource/get total-memory ] / 3); $WaitForFile "tmpfs"; - } on-error={ - $LogPrint warning $0 ("Creating disk of type tmpfs failed!"); + } do={ + $LogPrint warning $0 ("Creating disk of type tmpfs failed: " . $Err); :return false; } :return true; @@ -923,11 +923,11 @@ } } - :do { + :onerror Err { /file/add type="directory" name=$Path; $WaitForFile $Path; - } on-error={ - $LogPrint warning $0 ("Making directory '" . $Path . "' failed!"); + } do={ + $LogPrint warning $0 ("Making directory '" . $Path . "' failed: " . $Err); :return false; } From 86a8919ed2f87d75b2150b09ec5f237dc93f046e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:29:22 +0200 Subject: [PATCH 654/893] global-functions: $RmDir: :do ... on-error=... -> :onerror ... do=... --- global-functions.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 271e3a2..f0256fc 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1052,10 +1052,10 @@ :return true; } - :do { + :onerror Err { /file/remove $Dir; - } on-error={ - $LogPrint error $0 ("Removing directory '" . $DirName . "' (" . $Dir . ") failed."); + } do={ + $LogPrint error $0 ("Removing directory '" . $DirName . "' (" . $Dir . ") failed: " . $Err); :return false; } :return true; From 2317013121f8b3a53dd588f0fa5020b61ba7da53 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:30:08 +0200 Subject: [PATCH 655/893] global-functions: $RmFile: :do ... on-error=... -> :onerror ... do=... --- global-functions.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index f0256fc..c883291 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1080,10 +1080,10 @@ :return true; } - :do { + :onerror Err { /file/remove $File; - } on-error={ - $LogPrint error $0 ("Removing file '" . $FileName . "' (" . $File . ") failed."); + } do={ + $LogPrint error $0 ("Removing file '" . $FileName . "' (" . $File . ") failed: " . $Err); :return false; } :return true; From 12926b7c429f93a2579b134deef245793195744b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:33:39 +0200 Subject: [PATCH 656/893] global-functions: $ScriptInstallUpdate: :do ... on-error=... -> :onerror ... do=... --- global-functions.rsc | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index c883291..1bbc77e 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1201,7 +1201,7 @@ } } - :do { + :onerror Err { :local BaseUrl [ $EitherOr ($ScriptInfo->"base-url") $ScriptUpdatesBaseUrl ]; :local UrlSuffix [ $EitherOr ($ScriptInfo->"url-suffix") $ScriptUpdatesUrlSuffix ]; :local Url ($BaseUrl . $ScriptVal->"name" . ".rsc" . $UrlSuffix); @@ -1211,13 +1211,11 @@ :if ($Result->"status" = "finished") do={ :set SourceNew [ :tolf ($Result->"data") ]; } - } on-error={ + } do={ + $LogPrint warning $0 ("Failed fetching script '" . $ScriptVal->"name" . . "': " . $Err); :if ($ScriptVal->"source" = "#!rsc by RouterOS\n") do={ - $LogPrint warning $0 ("Failed fetching script '" . $ScriptVal->"name" . \ - "', removing dummy. Typo on installation?"); + $LogPrint warning $0 ("Removing dummy. Typo on installation?"); /system/script/remove $Script; - } else={ - $LogPrint warning $0 ("Failed fetching script '" . $ScriptVal->"name" . "'!"); } :error false; } @@ -1304,7 +1302,7 @@ :global GlobalConfigMigration; :local ChangeLogCode; - :do { + :onerror Err { :local Url ($ScriptUpdatesBaseUrl . "news-and-changes.rsc" . $ScriptUpdatesUrlSuffix); $LogPrint debug $0 ("Fetching news, changes and migration: " . $Url); :local Result [ /tool/fetch check-certificate=yes-without-crl \ @@ -1312,16 +1310,16 @@ :if ($Result->"status" = "finished") do={ :set ChangeLogCode ($Result->"data"); } - } on-error={ - $LogPrint warning $0 ("Failed fetching news, changes and migration!"); + } do={ + $LogPrint warning $0 ("Failed fetching news, changes and migration: " . $Err); } :if ([ :len $ChangeLogCode ] > 0) do={ :if ([ $ValidateSyntax $ChangeLogCode ] = true) do={ - :do { + :onerror Err { [ :parse $ChangeLogCode ]; - } on-error={ - $LogPrint warning $0 ("The changelog failed to run!"); + } do={ + $LogPrint warning $0 ("The changelog failed to run: " . $Err); } } else={ $LogPrint warning $0 ("The changelog failed syntax validation!"); @@ -1343,10 +1341,10 @@ } $LogPrint info $0 ("Applying migration for change " . $I . ": " . $Migration); - :do { + :onerror Err { [ :parse $Migration ]; - } on-error={ - $LogPrint warning $0 ("Migration code for change " . $I . " failed to run!"); + } do={ + $LogPrint warning $0 ("Migration code for change " . $I . " failed to run: " . $Err); } } on-error={ } } From f5c4378676ef1e791738106723071c3dd6fe65ca Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:37:18 +0200 Subject: [PATCH 657/893] global-functions: $ValidateSyntax: :do ... on-error=... -> :onerror ... do=... --- global-functions.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 1bbc77e..11ab677 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1652,9 +1652,9 @@ :set ValidateSyntax do={ :local Code [ :tostr $1 ]; - :do { + :onerror Err { [ :parse (":local Validate do={\n" . $Code . "\n}") ]; - } on-error={ + } do={ :return false; } :return true; From 8b1b73c936c0a0172383a521f7bc5fb70d9d2f14 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:39:17 +0200 Subject: [PATCH 658/893] global-functions: $ValidateSyntax: add debug output --- global-functions.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 11ab677..51b47b5 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1652,9 +1652,12 @@ :set ValidateSyntax do={ :local Code [ :tostr $1 ]; + :global LogPrint; + :onerror Err { [ :parse (":local Validate do={\n" . $Code . "\n}") ]; } do={ + $LogPrint debug $0 ("Valdation failed: " . $Err); :return false; } :return true; From 5c599beae1c539ef4b657a6d8cb32195b4bfa174 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:40:41 +0200 Subject: [PATCH 659/893] global-functions: :do ... on-error=... -> :onerror ... do=... --- global-functions.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 51b47b5..8331e4a 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1771,10 +1771,10 @@ :foreach Script in=[ /system/script/find where name ~ "^mod/." ] do={ :local ScriptVal [ /system/script/get $Script ]; :if ([ $ValidateSyntax ($ScriptVal->"source") ] = true) do={ - :do { + :onerror Err { /system/script/run $Script; - } on-error={ - $LogPrint error $0 ("Module '" . $ScriptVal->"name" . "' failed to run."); + } do={ + $LogPrint error $0 ("Module '" . $ScriptVal->"name" . "' failed to run: " . $Err); } } else={ $LogPrint error $0 ("Module '" . $ScriptVal->"name" . "' failed syntax validation, skipping."); From d5f9ecebfbda885c4600ff99ee2713a5827e0398 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:41:57 +0200 Subject: [PATCH 660/893] gps-track: :do ... on-error=... -> :onerror ... do=... --- gps-track.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gps-track.rsc b/gps-track.rsc index 4cc5066..6a090bf 100644 --- a/gps-track.rsc +++ b/gps-track.rsc @@ -34,7 +34,7 @@ :local Gps [ /system/gps/monitor once as-value ]; :if ($Gps->"valid" = true) do={ - :do { + :onerror Err { /tool/fetch check-certificate=yes-without-crl output=none http-method=post \ http-header-field=({ [ $FetchUserAgentStr $ScriptName ]; "Content-Type: application/json" }) \ http-data=[ :serialize to=json { "identity"=$Identity; \ @@ -42,8 +42,8 @@ $LogPrint debug $ScriptName ("Sending GPS data in " . $CoordinateFormat . " format: " . \ "lat: " . ($Gps->"latitude") . " " . \ "lon: " . ($Gps->"longitude")); - } on-error={ - $LogPrint warning $ScriptName ("Failed sending GPS data!"); + } do={ + $LogPrint warning $ScriptName ("Failed sending GPS data: " . $Err); } } else={ $LogPrint debug $ScriptName ("GPS data not valid."); From c1e6348bb9ffaaa9e43dafab039ec261614e0711 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:42:48 +0200 Subject: [PATCH 661/893] lease-script: :do ... on-error=... -> :onerror ... do=... --- lease-script.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lease-script.rsc b/lease-script.rsc index b166ee3..ab44956 100644 --- a/lease-script.rsc +++ b/lease-script.rsc @@ -53,11 +53,11 @@ } :foreach Order,Script in=$RunOrder do={ - :do { + :onerror Err { $LogPrint debug $ScriptName ("Running script with order " . $Order . ": " . $Script); /system/script/run $Script; - } on-error={ - $LogPrint warning $ScriptName ("Running script '" . $Script . "' failed!"); + } do={ + $LogPrint warning $ScriptName ("Running script '" . $Script . "' failed: " . $Err); } } } do={ From 5badafe109c6514a83b2935aa3543054eb20ddc3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:54:51 +0200 Subject: [PATCH 662/893] mod/notification-telegram: :do ... on-error=... -> :onerror ... do=... --- mod/notification-telegram.rsc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 51c8dbf..0832b07 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -38,14 +38,14 @@ :foreach Id,Message in=$TelegramQueue do={ :if ([ :typeof $Message ] = "array" ) do={ - :do { + :onerror Err { :local Data ([ /tool/fetch check-certificate=yes-without-crl output=user http-method=post \ ("https://api.telegram.org/bot" . ($Message->"tokenid") . "/sendMessage") \ http-data=($Message->"http-data") as-value ]->"data"); :set ($TelegramQueue->$Id); :set ($TelegramMessageIDs->[ :tostr ([ :deserialize from=json value=$Data ]->"result"->"message_id") ]) 1; - } on-error={ - $LogPrint debug $0 ("Sending queued Telegram message failed."); + } do={ + $LogPrint debug $0 ("Sending queued Telegram message failed: " . $Err); :set AllDone false; } } @@ -72,12 +72,12 @@ } :local Data; - :do { + :onerror Err { :set Data ([ /tool/fetch check-certificate=yes-without-crl output=user \ ("https://api.telegram.org/bot" . $TelegramTokenId . "/getUpdates?offset=0" . \ "&allowed_updates=%5B%22message%22%5D") as-value ]->"data"); - } on-error={ - $LogPrint warning $0 ("Fetching data failed!"); + } do={ + $LogPrint warning $0 ("Fetching data failed: " . $Err); :return false; } @@ -190,7 +190,7 @@ :local HTTPData ("chat_id=" . $ChatId . "&disable_notification=" . ($Notification->"silent") . \ "&reply_to_message_id=" . ($Notification->"replyto") . "&message_thread_id=" . $ThreadId . \ "&disable_web_page_preview=true&parse_mode=MarkdownV2"); - :do { + :onerror Err { :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); :error false; @@ -199,8 +199,8 @@ ("https://api.telegram.org/bot" . $TokenId . "/sendMessage") \ http-data=($HTTPData . "&text=" . [ $UrlEncode $Text ]) as-value ]->"data"); :set ($TelegramMessageIDs->[ :tostr ([ :deserialize from=json value=$Data ]->"result"->"message_id") ]) 1; - } on-error={ - $LogPrint info $0 ("Failed sending Telegram notification! Queuing..."); + } do={ + $LogPrint info $0 ("Failed sending Telegram notification: " . $Err . " - Queuing..."); :if ([ :typeof $TelegramQueue ] = "nothing") do={ :set TelegramQueue ({}); From 2a7fd7ea53d62cc9897643250bb04022f1377ae3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:55:55 +0200 Subject: [PATCH 663/893] mod/notification-ntfy: :do ... on-error=... -> :onerror ... do=... --- mod/notification-ntfy.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 8e5688e..7114020 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -36,13 +36,13 @@ :foreach Id,Message in=$NtfyQueue do={ :if ([ :typeof $Message ] = "array" ) do={ - :do { + :onerror Err { /tool/fetch check-certificate=yes-without-crl output=none http-method=post \ http-header-field=($Message->"headers") http-data=($Message->"text") \ ($Message->"url") as-value; :set ($NtfyQueue->$Id); - } on-error={ - $LogPrint debug $0 ("Sending queued Ntfy message failed."); + } do={ + $LogPrint debug $0 ("Sending queued Ntfy message failed: " . $Err); :set AllDone false; } } @@ -107,7 +107,7 @@ :set Text ($Text . "\n" . [ $SymbolForNotification "link" ] . ($Notification->"link")); } - :do { + :onerror Err { :if ($Server = "ntfy.sh") do={ :if ([ $CertificateAvailable "ISRG Root X1" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); @@ -116,8 +116,8 @@ } /tool/fetch check-certificate=yes-without-crl output=none http-method=post \ http-header-field=$Headers http-data=$Text $Url as-value; - } on-error={ - $LogPrint info $0 ("Failed sending ntfy notification! Queuing..."); + } do={ + $LogPrint info $0 ("Failed sending ntfy notification: " . $Err . " - Queuing..."); :if ([ :typeof $NtfyQueue ] = "nothing") do={ :set NtfyQueue ({}); From 3f092d34774ac500faec0870e89a048a26a5bbf0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:57:31 +0200 Subject: [PATCH 664/893] mod/notification-matrix: :do ... on-error=... -> :onerror ... do=... --- mod/notification-matrix.rsc | 42 ++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/mod/notification-matrix.rsc b/mod/notification-matrix.rsc index c8cf887..e9b42a0 100644 --- a/mod/notification-matrix.rsc +++ b/mod/notification-matrix.rsc @@ -39,7 +39,7 @@ :foreach Id,Message in=$MatrixQueue do={ :if ([ :typeof $Message ] = "array" ) do={ - :do { + :onerror Err { /tool/fetch check-certificate=yes-without-crl output=none \ http-header-field=($Message->"headers") http-method=post \ http-data=[ :serialize to=json { "msgtype"="m.text"; "body"=($Message->"plain"); @@ -47,8 +47,8 @@ ("https://" . $Message->"homeserver" . "/_matrix/client/r0/rooms/" . $Message->"room" . \ "/send/m.room.message?access_token=" . $Message->"accesstoken") as-value; :set ($MatrixQueue->$Id); - } on-error={ - $LogPrint debug $0 ("Sending queued Matrix message failed."); + } do={ + $LogPrint debug $0 ("Sending queued Matrix message failed: " . $Err); :set AllDone false; } } @@ -129,15 +129,15 @@ [ $PrepareText $Label ] . ""); } - :do { + :onerror Err { /tool/fetch check-certificate=yes-without-crl output=none \ http-header-field=$Headers http-method=post \ http-data=[ :serialize to=json { "msgtype"="m.text"; "body"=$Plain; "format"="org.matrix.custom.html"; "formatted_body"=$Formatted } ] \ ("https://" . $HomeServer . "/_matrix/client/r0/rooms/" . $Room . \ "/send/m.room.message?access_token=" . $AccessToken) as-value; - } on-error={ - $LogPrint info $0 ("Failed sending Matrix notification! Queuing..."); + } do={ + $LogPrint info $0 ("Failed sending Matrix notification: " . $Err . " - Queuing..."); :if ([ :typeof $MatrixQueue ] = "nothing") do={ :set MatrixQueue ({}); @@ -196,14 +196,14 @@ :global MatrixHomeServer; :local Domain [ :pick $User ([ :find $User ":" ] + 1) [ :len $User] ]; - :do { + :onerror Err { :local Data ([ /tool/fetch check-certificate=yes-without-crl output=user \ http-header-field=({ [ $FetchUserAgentStr $0 ] }) \ ("https://" . $Domain . "/.well-known/matrix/client") as-value ]->"data"); :set MatrixHomeServer ([ :deserialize from=json value=$Data ]->"m.homeserver"->"base_url"); $LogPrint debug $0 ("Home server is: " . $MatrixHomeServer); - } on-error={ - $LogPrint error $0 ("Failed getting home server!"); + } do={ + $LogPrint error $0 ("Failed getting home server: " . $Err); :return false; } @@ -211,27 +211,27 @@ :set MatrixHomeServer [ :pick $MatrixHomeServer 8 [ :len $MatrixHomeServer ] ]; } - :do { + :onerror Err { :local Data ([ /tool/fetch check-certificate=yes-without-crl output=user \ http-header-field=({ [ $FetchUserAgentStr $0 ] }) http-method=post \ http-data=[ :serialize to=json { "type"="m.login.password"; "user"=$User; "password"=$Pass } ] \ ("https://" . $MatrixHomeServer . "/_matrix/client/r0/login") as-value ]->"data"); :set MatrixAccessToken ([ :deserialize from=json value=$Data ]->"access_token"); $LogPrint debug $0 ("Access token is: " . $MatrixAccessToken); - } on-error={ - $LogPrint error $0 ("Failed logging in (and getting access token)!"); + } do={ + $LogPrint error $0 ("Failed logging in (and getting access token): " . $Err); :return false; } - :do { + :onerror Err { /system/script/remove [ find where name="global-config-overlay.d/mod/notification-matrix" ]; /system/script/add name="global-config-overlay.d/mod/notification-matrix" source=( \ "# configuration snippet: mod/notification-matrix\n\n" . \ ":global MatrixHomeServer \"" . $MatrixHomeServer . "\";\n" . \ ":global MatrixAccessToken \"" . $MatrixAccessToken . "\";\n"); $LogPrint info $0 ("Added configuration snippet. Now create and join a room, please!"); - } on-error={ - $LogPrint error $0 ("Failed adding configuration snippet!"); + } do={ + $LogPrint error $0 ("Failed adding configuration snippet: " . $Err); :return false; } } @@ -248,24 +248,24 @@ :global MatrixHomeServer; :global MatrixRoom; - :do { + :onerror Err { /tool/fetch check-certificate=yes-without-crl output=none \ http-header-field=({ [ $FetchUserAgentStr $0 ] }) http-method=post http-data="" \ ("https://" . $MatrixHomeServer . "/_matrix/client/r0/rooms/" . [ $UrlEncode $MatrixRoom ] . \ "/join?access_token=" . [ $UrlEncode $MatrixAccessToken ]) as-value; $LogPrint debug $0 ("Joined the room."); - } on-error={ - $LogPrint error $0 ("Failed joining the room!"); + } do={ + $LogPrint error $0 ("Failed joining the room: " . $Err); :return false; } - :do { + :onerror Err { :local Snippet [ /system/script/find where name="global-config-overlay.d/mod/notification-matrix" ]; /system/script/set $Snippet source=([ get $Snippet source ] . \ ":global MatrixRoom \"" . $MatrixRoom . "\";\n"); $LogPrint info $0 ("Appended configuration to configuration snippet. Please review!"); - } on-error={ - $LogPrint error $0 ("Failed appending configuration to snippet!"); + } do={ + $LogPrint error $0 ("Failed appending configuration to snippet: " . $Err); :return false; } } From e01873301f7a92fc0109d8afce845a175f414504 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:58:53 +0200 Subject: [PATCH 665/893] mod/notification-gotify: :do ... on-error=... -> :onerror ... do=... --- mod/notification-gotify.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mod/notification-gotify.rsc b/mod/notification-gotify.rsc index 3ae4cdd..d8eafbe 100644 --- a/mod/notification-gotify.rsc +++ b/mod/notification-gotify.rsc @@ -37,13 +37,13 @@ :foreach Id,Message in=$GotifyQueue do={ :if ([ :typeof $Message ] = "array" ) do={ - :do { + :onerror Err { /tool/fetch check-certificate=yes-without-crl output=none http-method=post \ http-header-field=($Message->"headers") http-data=[ :serialize to=json ($Message->"message") ] \ ($Message->"url") as-value; :set ($GotifyQueue->$Id); - } on-error={ - $LogPrint debug $0 ("Sending queued Gotify message failed."); + } do={ + $LogPrint debug $0 ("Sending queued Gotify message failed: " . $Err); :set AllDone false; } } @@ -91,11 +91,11 @@ ("\n" . [ $SymbolForNotification "link" ] . ($Notification->"link")) ]); \ "priority"=[ :tonum [ $IfThenElse ($Notification->"silent") 2 5 ] ] }); - :do { + :onerror Err { /tool/fetch check-certificate=yes-without-crl output=none http-method=post \ http-header-field=$Headers http-data=[ :serialize to=json $Message ] $Url as-value; - } on-error={ - $LogPrint info $0 ("Failed sending Gotify notification! Queuing..."); + } do={ + $LogPrint info $0 ("Failed sending Gotify notification: " . $Err . " - Queuing..."); :if ([ :typeof $GotifyQueue ] = "nothing") do={ :set GotifyQueue ({}); From 314e68e4cd3d097d510cb0bef25fec838421b689 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 09:45:59 +0200 Subject: [PATCH 666/893] mode-button: :do ... on-error=... -> :onerror ... do=... --- mode-button.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mode-button.rsc b/mode-button.rsc index c6422f0..d82f899 100644 --- a/mode-button.rsc +++ b/mode-button.rsc @@ -69,11 +69,11 @@ :delay 200ms; } - :do { + :onerror Err { [ :parse $Code ]; - } on-error={ + } do={ $LogPrint warning $FuncName \ - ("The code for " . $Count . " mode-button presses failed with runtime error!"); + ("The code for " . $Count . " mode-button presses failed with runtime error: " . $Err); } } else={ $LogPrint warning $FuncName \ From 9ae21c00bdbbda52fea6c2cc32248d714617f1f8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 10:02:15 +0200 Subject: [PATCH 667/893] mod/scriptrunonce: :do ... on-error=... -> :onerror ... do=... --- mod/scriptrunonce.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mod/scriptrunonce.rsc b/mod/scriptrunonce.rsc index 3797c15..1d6aaf1 100644 --- a/mod/scriptrunonce.rsc +++ b/mod/scriptrunonce.rsc @@ -41,11 +41,11 @@ :return false; } - :do { + :onerror Err { $LogPrint info $0 ("Running script '" . $Script . "' now."); [ :parse $Source ]; - } on-error={ - $LogPrint warning $0 ("The script '" . $Script . "' failed to run!"); + } do={ + $LogPrint warning $0 ("The script '" . $Script . "' failed to run: " . $Err); :return false; } From 9cd4ed08a475b93fbf11266dc5a0804afd58e195 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 10:05:12 +0200 Subject: [PATCH 668/893] mod/ssh-keys-import: :do ... on-error=... -> :onerror ... do=... --- mod/ssh-keys-import.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index 9a6cd39..176c1b4 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -55,13 +55,13 @@ /file/add name=$FileName contents=($Key . ", md5=" . $FingerPrintMD5); $WaitForFile $FileName; - :do { + :onerror Err { /user/ssh-keys/import public-key-file=$FileName user=$User; $LogPrint info $0 ("Imported ssh public key (" . $KeyVal->2 . ", " . $KeyVal->0 . ", " . \ "MD5:" . $FingerPrintMD5 . ") for user '" . $User . "'."); $RmDir "tmpfs/ssh-keys-import"; - } on-error={ - $LogPrint warning $0 ("Failed importing key."); + } do={ + $LogPrint warning $0 ("Failed importing key: " . $Err); $RmDir "tmpfs/ssh-keys-import"; :return false; } From c757064eb9537321b7cad69db6e05ddc9c576583 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 10:05:39 +0200 Subject: [PATCH 669/893] =?UTF-8?q?mod/ssh-keys-import:=20:do=20...=20on-e?= =?UTF-8?q?rror=3D...=20->=20...=20well...=20-=20fix=20condition=20?= =?UTF-8?q?=F0=9F=A5=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mod/ssh-keys-import.rsc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index 176c1b4..9467525 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -94,9 +94,7 @@ :foreach KeyVal in=[ :deserialize $Keys delimiter=" " from=dsv options=dsv.plain ] do={ :local Continue false; :if ($KeyVal->0 = "ssh-ed25519" || $KeyVal->0 = "ssh-rsa") do={ - :do { - $SSHKeysImport ($KeyVal->0 . " " . $KeyVal->1 . " " . $KeyVal->2) $User; - } on-error={ + :if ([ $SSHKeysImport ($KeyVal->0 . " " . $KeyVal->1 . " " . $KeyVal->2) $User ] = false) do={ $LogPrint warning $0 ("Failed importing key for user '" . $User . "'."); } :set Continue true; From a523f9793861d8927388f18bb5f2319bbe04c0b8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 10:07:30 +0200 Subject: [PATCH 670/893] netwatch-dns: :do ... on-error=... -> :onerror ... do=... --- netwatch-dns.rsc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 3da1498..4fa076a 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -118,15 +118,15 @@ } :local Data false; - :do { + :onerror Err { :set Data ([ /tool/fetch check-certificate=yes-without-crl output=user \ http-header-field=({ "accept: application/dns-message" }) \ url=(($DohServer->"doh-url") . "?dns=" . [ :convert to=base64 ([ :rndstr length=2 ] . \ "\01\00" . "\00\01" . "\00\00" . "\00\00" . "\00\00" . "\09doh-check\05eworm\02de\00" . \ "\00\10" . "\00\01") ]) as-value ]->"data"); - } on-error={ - $LogPrint warning $ScriptName ("Request to DoH server failed (network or certificate issue): " . \ - ($DohServer->"doh-url")); + } do={ + $LogPrint warning $ScriptName ("Request to DoH server " . ($DohServer->"doh-url") . \ + " failed: " . $Err); } :if ($Data != false) do={ From fefe59751f1487fbdd4feace39c32445bd97547c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 10:09:59 +0200 Subject: [PATCH 671/893] netwatch-notify: :do ... on-error=... -> :onerror ... do=... --- netwatch-notify.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index fb8e8d5..00f03cd 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -38,10 +38,10 @@ :global ValidateSyntax; :if ([ $ValidateSyntax $Hook ] = true) do={ - :do { + onerror Err { [ :parse $Hook ]; - } on-error={ - $LogPrint warning $ScriptName ("The " . $State . "-hook for " . $Type . " '" . $Name . "' failed to run."); + } do={ + $LogPrint warning $ScriptName ("The " . $State . "-hook for " . $Type . " '" . $Name . "' failed to run: " . $Err); :return ("The hook failed to run."); } } else={ @@ -107,7 +107,7 @@ :if ([ :typeof ($HostInfo->"resolve") ] = "str") do={ :if ([ $IsDNSResolving ] = true) do={ - :do { + :onerror Err { :local Resolve [ :resolve type=[ $IfThenElse ([ :typeof ($HostVal->"host") ] = "ip") \ "ipv4" "ipv6" ] ($HostInfo->"resolve") ]; :if ($Resolve != $HostVal->"host") do={ @@ -121,13 +121,13 @@ :set ($HostVal->"status") "unknown"; } } - } on-error={ + } do={ :set ($Metric->"resolve-failcnt") ($Metric->"resolve-failcnt" + 1); :if ($Metric->"resolve-failcnt" = 3) do={ $LogPrint [ $IfThenElse ($HostInfo->"no-resolve-fail" != true) warning debug ] \ $ScriptName ("Resolving name '" . $HostInfo->"resolve" . [ $IfThenElse \ ($HostInfo->"resolve" != $HostInfo->"name") ("' for " . $Type . " '" . \ - $HostInfo->"name") "" ] . "' failed."); + $HostInfo->"name") "" ] . "' failed: " . $Err); } } } From d0adf9974e75668fc16e736ce2dc29a1477b10b8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 10:12:08 +0200 Subject: [PATCH 672/893] sms-forward: :do ... on-error=... -> :onerror ... do=... --- sms-forward.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sms-forward.rsc b/sms-forward.rsc index a564056..feb640e 100644 --- a/sms-forward.rsc +++ b/sms-forward.rsc @@ -74,12 +74,12 @@ :if ($Phone~($Hook->"allowed-number") && ($SmsVal->"message")~($Hook->"match")) do={ :if ([ $ValidateSyntax ($Hook->"command") ] = true) do={ $LogPrint info $ScriptName ("Running hook '" . $Hook->"match" . "': " . $Hook->"command"); - :do { + :onerror Err { :local Command [ :parse ($Hook->"command") ]; $Command Phone=$Phone Message=($SmsVal->"message"); :set Messages ($Messages . "\n\nRan hook '" . $Hook->"match" . "':\n" . $Hook->"command"); - } on-error={ - $LogPrint warning $ScriptName ("The code for hook '" . $Hook->"match" . "' failed to run!"); + } do={ + $LogPrint warning $ScriptName ("The code for hook '" . $Hook->"match" . "' failed to run: " . $Err); } } else={ $LogPrint warning $ScriptName ("The code for hook '" . $Hook->"match" . "' failed syntax validation!"); From f22d46da96dfe0c421172d30ee1baf9976205329 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 10:13:05 +0200 Subject: [PATCH 673/893] telegram-chat: :do ... on-error=... -> :onerror ... do=... --- telegram-chat.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index b1f7f99..5bfa31c 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -70,14 +70,14 @@ :local Data false; :for I from=1 to=4 do={ :if ($Data = false) do={ - :do { + :onerror Err { :set Data ([ /tool/fetch check-certificate=yes-without-crl output=user \ ("https://api.telegram.org/bot" . $TelegramTokenId . "/getUpdates?offset=" . \ $TelegramChatOffset->0 . "&allowed_updates=%5B%22message%22%5D") as-value ]->"data"); :set TelegramRandomDelay [ $MAX 0 ($TelegramRandomDelay - 1) ]; - } on-error={ + } do={ :if ($I < 4) do={ - $LogPrint debug $ScriptName ("Fetch failed, " . $I . ". try."); + $LogPrint debug $ScriptName ("Fetch failed, " . $I . ". try: " . $Err); :set TelegramRandomDelay [ $MIN 15 ($TelegramRandomDelay + 5) ]; :delay (($I * $I) . "s"); } From 10ac81634877858717a3d99fee418edc9887b377 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 10:14:24 +0200 Subject: [PATCH 674/893] unattended-lte-firmware-upgrade: :do ... on-error=... -> :onerror ... do=... --- unattended-lte-firmware-upgrade.rsc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/unattended-lte-firmware-upgrade.rsc b/unattended-lte-firmware-upgrade.rsc index 83925fd..237c2d8 100644 --- a/unattended-lte-firmware-upgrade.rsc +++ b/unattended-lte-firmware-upgrade.rsc @@ -12,10 +12,10 @@ :foreach Interface in=[ /interface/lte/find where running ] do={ :local Firmware; :local IntName [ /interface/lte/get $Interface name ]; - :do { + :onerror Err { :set Firmware [ /interface/lte/firmware-upgrade $Interface as-value ]; - } on-error={ - :log debug ("Could not get latest LTE firmware version for interface " . $IntName . "."); + } do={ + :log debug ("Could not get latest LTE firmware version for interface " . $IntName . ": " . $Err); } :if ([ :typeof $Firmware ] = "array") do={ @@ -27,7 +27,7 @@ :set LTEFirmwareUpgrade; /system/scheduler/remove ($1 . "-firmware-upgrade"); - :do { + :onerror Err { /interface/lte/firmware-upgrade $1 upgrade=yes; :log info ("LTE firmware upgrade on '" . $1 . "' finished, waiting for reset."); :delay 240s; @@ -36,8 +36,8 @@ ($Firmware->"installed") != ($Firmware->"latest")) do={ :log warning ("LTE firmware versions still differ. Upgrade failed anyway?"); } - } on-error={ - :log error ("LTE firmware upgrade on '" . $1 . "' failed."); + } do={ + :log error ("LTE firmware upgrade on '" . $1 . "' failed: " . $Err); } } From 205bcce6f9d49518f1e1999154d96b0e0bb6d1ed Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 10:15:35 +0200 Subject: [PATCH 675/893] update-tunnelbroker: :do ... on-error=... -> :onerror ... do=... --- update-tunnelbroker.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index 8e5e1d0..9057e1e 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -41,12 +41,12 @@ :for I from=2 to=0 do={ :if ($Data = false) do={ - :do { + :onerror Err { :set Data ([ /tool/fetch check-certificate=yes-without-crl \ ("https://ipv4.tunnelbroker.net/nic/update?hostname=" . $Comment->"id") \ user=($Comment->"user") password=($Comment->"pass") output=user as-value ]->"data"); - } on-error={ - $LogPrint debug $ScriptName ("Failed downloading, " . $I . " retries pending."); + } do={ + $LogPrint debug $ScriptName ("Failed downloading: " . $Err . " - " . $I . " retries pending."); :delay 2s; } } From 3521995dbc1173e722819efca1908cd0df251b1d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 11:07:39 +0200 Subject: [PATCH 676/893] mod/inspectvar: use $CharacterMultiply --- mod/inspectvar.rsc | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index 89c0286..b864d9a 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -33,11 +33,9 @@ :local Value [ :tostr $2 ]; :local Level [ :tonum $3 ]; - :local Indent ""; - :for I from=1 to=$Level step=1 do={ - :set Indent ($Indent . " "); - } - :return ($Indent . "-" . $Prefix . "-> " . $Value); + :global CharacterMultiply; + + :return ([ $CharacterMultiply " " $Level ] . "-" . $Prefix . "-> " . $Value); } :local TypeOf [ :typeof $Input ]; From 187735f35f7b361b1cc6d45f703d5c121681254c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 11:12:02 +0200 Subject: [PATCH 677/893] mod/inspectvar: print the length for strings --- mod/inspectvar.rsc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index b864d9a..84c40d8 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -39,6 +39,7 @@ } :local TypeOf [ :typeof $Input ]; + :local Len [ :len $Input ]; :local Return [ $IndentReturn "type" $TypeOf $Level ]; :if ($TypeOf = "array") do={ @@ -48,6 +49,10 @@ [ $InspectVarReturn $Value ($Level + 2) ]); } } else={ + :if ($TypeOf = "str") do={ + :set $Return ($Return . "\n" . \ + [ $IndentReturn "len" $Len $Level ]); + } :if ($TypeOf != "nothing") do={ :set $Return ($Return . "\n" . \ [ $IndentReturn "value" [ $IfThenElse ([ :len $Input ] > 80) \ From 36f155ce621abe427d126a6ee3a3363bff15b2bb Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 11:15:21 +0200 Subject: [PATCH 678/893] mod/inspectvar: remove CR, replace LF --- mod/inspectvar.rsc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index 84c40d8..b32480f 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -25,6 +25,7 @@ :local Input $1; :local Level (0 + [ :tonum $2 ]); + :global CharacterReplace; :global IfThenElse; :global InspectVarReturn; @@ -52,6 +53,7 @@ :if ($TypeOf = "str") do={ :set $Return ($Return . "\n" . \ [ $IndentReturn "len" $Len $Level ]); + :set Input [ $CharacterReplace [ $CharacterReplace $Input ("\r") "" ] ("\n") " " ]; } :if ($TypeOf != "nothing") do={ :set $Return ($Return . "\n" . \ From bd3cc3bbd49934f42fe9f6c6820501c7cc9d33ba Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 13:35:49 +0200 Subject: [PATCH 679/893] mod/inspectvar: replace only when matching --- mod/inspectvar.rsc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mod/inspectvar.rsc b/mod/inspectvar.rsc index b32480f..fc1b366 100644 --- a/mod/inspectvar.rsc +++ b/mod/inspectvar.rsc @@ -53,7 +53,12 @@ :if ($TypeOf = "str") do={ :set $Return ($Return . "\n" . \ [ $IndentReturn "len" $Len $Level ]); - :set Input [ $CharacterReplace [ $CharacterReplace $Input ("\r") "" ] ("\n") " " ]; + :if ([ :typeof [ :find $Input ("\r") ] ] = "num") do={ + :set Input [ $CharacterReplace $Input ("\r") "" ]; + } + :if ([ :typeof [ :find $Input ("\n") ] ] = "num") do={ + :set Input [ $CharacterReplace $Input ("\n") " " ]; + } } :if ($TypeOf != "nothing") do={ :set $Return ($Return . "\n" . \ From ff218e4ce5032b2ead7f33f53382bda98f6e5e2e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 11:21:59 +0200 Subject: [PATCH 680/893] mod/notification-email: add error handling when sending mail --- mod/notification-email.rsc | 57 +++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index c0f9d86..e05a813 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -89,35 +89,40 @@ :foreach Id,Message in=$EmailQueue do={ :if ([ :typeof $Message ] = "array" ) do={ - :local Attach ({}); :while ([ /tool/e-mail/get last-status ] = "in-progress") do={ :delay 1s; } - :foreach File in=[ :toarray [ $EitherOr ($Message->"attach") "" ] ] do={ - :if ([ :len [ /file/find where name=$File ] ] = 1) do={ - :set Attach ($Attach, $File); - } else={ - $LogPrint warning $0 ("File '" . $File . "' does not exist, can not attach."); - } - } - /tool/e-mail/send from=[ $EMailGenerateFrom ] to=($Message->"to") cc=($Message->"cc") \ - subject=($Message->"subject") body=($Message->"body") file=$Attach; - :local Wait true; - :do { - :delay 1s; - :local Status [ /tool/e-mail/get last-status ]; - :if ($Status = "succeeded") do={ - :set ($EmailQueue->$Id); - :set Wait false; - :if (($Message->"remove-attach") = true) do={ - :foreach File in=$Attach do={ - /file/remove $File; - } + :onerror Err { + :local Attach ({}); + :foreach File in=[ :toarray [ $EitherOr ($Message->"attach") "" ] ] do={ + :if ([ :len [ /file/find where name=$File ] ] = 1) do={ + :set Attach ($Attach, $File); + } else={ + $LogPrint warning $0 ("File '" . $File . "' does not exist, can not attach."); } } - :if ($Status = "failed") do={ - :set AllDone false; - :set Wait false; - } - } while=($Wait = true); + /tool/e-mail/send from=[ $EMailGenerateFrom ] to=($Message->"to") cc=($Message->"cc") \ + subject=($Message->"subject") body=($Message->"body") file=$Attach; + :local Wait true; + :do { + :delay 1s; + :local Status [ /tool/e-mail/get last-status ]; + :if ($Status = "succeeded") do={ + :set ($EmailQueue->$Id); + :set Wait false; + :if (($Message->"remove-attach") = true) do={ + :foreach File in=$Attach do={ + /file/remove $File; + } + } + } + :if ($Status = "failed") do={ + :set AllDone false; + :set Wait false; + } + } while=($Wait = true); + } do={ + $LogPrint warning $0 ("Sending queued mail failed: " . $Err); + :set AllDone false; + } } } From 74dc809b98759cb337fbaf6b1fa98bb0137dadc0 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 13:29:01 +0200 Subject: [PATCH 681/893] mod/notification-email: properly truncate the body Truned out that the size limit for e-mail message/body is anywhere just below 64kB... So truncate at about 62.000 bytes. --- mod/notification-email.rsc | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index e05a813..c799c87 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -181,6 +181,7 @@ :global IfThenElse; :global NotificationEMailSignature; :global NotificationEMailSubject; + :global SymbolForNotification; :local To [ $EitherOr ($EmailGeneralToOverride->($Notification->"origin")) $EmailGeneralTo ]; :local Cc [ $EitherOr ($EmailGeneralCcOverride->($Notification->"origin")) $EmailGeneralCc ]; @@ -193,13 +194,22 @@ :if ([ :typeof $EmailQueue ] = "nothing") do={ :set EmailQueue ({}); } + :local Truncated false; + :local Body ($Notification->"message"); + :if ([ :len $Body ] > 62000) do={ + :set Body ([ :pick $Body 0 62000 ] . "..."); + :set Truncated true; + } :local Signature [ $EitherOr [ $NotificationEMailSignature ] [ /system/note/get note ] ]; + :set Body ($Body . "\n" . \ + [ $IfThenElse ([ :len ($Notification->"link") ] > 0) ("\n" . ($Notification->"link")) ] . \ + [ $IfThenElse ($Truncated = true) ("\n" . [ $SymbolForNotification "scissors" ] . \ + "The message was too long and has been truncated!") ] . \ + [ $IfThenElse ([ :len $Signature ] > 0) ("\n-- \n" . $Signature) "" ]); :set ($EmailQueue->[ :len $EmailQueue ]) { to=$To; cc=$Cc; subject=[ $NotificationEMailSubject ($Notification->"subject") ]; - body=(($Notification->"message") . \ - [ $IfThenElse ([ :len ($Notification->"link") ] > 0) ("\n\n" . ($Notification->"link")) "" ] . \ - [ $IfThenElse ([ :len $Signature ] > 0) ("\n-- \n" . $Signature) "" ]); \ + body=$Body; \ attach=($Notification->"attach"); remove-attach=($Notification->"remove-attach") }; :if ([ :len [ /system/scheduler/find where name="_FlushEmailQueue" ] ] = 0) do={ /system/scheduler/add name="_FlushEmailQueue" interval=1s start-time=startup \ From 2a956874777c83748f4a2afea4e9ee1382928230 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 8 May 2025 14:54:42 +0200 Subject: [PATCH 682/893] mod/notification-email: add the link symbol --- mod/notification-email.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index c799c87..5293766 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -202,7 +202,8 @@ } :local Signature [ $EitherOr [ $NotificationEMailSignature ] [ /system/note/get note ] ]; :set Body ($Body . "\n" . \ - [ $IfThenElse ([ :len ($Notification->"link") ] > 0) ("\n" . ($Notification->"link")) ] . \ + [ $IfThenElse ([ :len ($Notification->"link") ] > 0) \ + ("\n" . [ $SymbolForNotification "link" ] . ($Notification->"link")) ] . \ [ $IfThenElse ($Truncated = true) ("\n" . [ $SymbolForNotification "scissors" ] . \ "The message was too long and has been truncated!") ] . \ [ $IfThenElse ([ :len $Signature ] > 0) ("\n-- \n" . $Signature) "" ]); From ce129ee4418a09d4b1987e3d94818a561d9fd384 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sun, 11 May 2025 22:02:18 +0200 Subject: [PATCH 683/893] fw-addr-lists: for IPv6 the CIDR is always expected --- fw-addr-lists.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 5a03875..efd37db 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -114,8 +114,8 @@ :error true; } :if ($Address ~ "^[0-9a-zA-Z]*:[0-9a-zA-Z:\\.]+(/[0-9]{1,3})?\$") do={ - :if ($Address ~ "/128\$") do={ - :set Address [ :pick $Address 0 ([ :len $Address ] - 4) ]; + :if ([ :typeof [ :find $Address "/" ] ] = "nil") do={ + :set Address ($Address . "/128"); } :set ($IPv6Addresses->$Branch->$Address) $TimeOut; :error true; From e78c71948dfa847fd21820dffacd3c6e7165d832 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 12 May 2025 16:50:06 +0200 Subject: [PATCH 684/893] mod/notification-telegram: fix indention --- mod/notification-telegram.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 0832b07..2eb90e1 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -189,7 +189,7 @@ :local HTTPData ("chat_id=" . $ChatId . "&disable_notification=" . ($Notification->"silent") . \ "&reply_to_message_id=" . ($Notification->"replyto") . "&message_thread_id=" . $ThreadId . \ - "&disable_web_page_preview=true&parse_mode=MarkdownV2"); + "&disable_web_page_preview=true&parse_mode=MarkdownV2"); :onerror Err { :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); From 1b5dd1e1d3555f347bd6ff587659ac8b8ec5c73e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 12 May 2025 16:53:55 +0200 Subject: [PATCH 685/893] telegram-chat: support trusted group chat ids But be warned: Adding a person to a trusted group will give her/him administrative control over the device(s) - without changes on the device itself! On the other hand... Removing permissions is easily done by removing a person from a group. Closes: https://github.com/eworm-de/routeros-scripts/issues/101 --- telegram-chat.rsc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 5bfa31c..50fc0cc 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -107,7 +107,9 @@ :local ThreadId [ $IfThenElse ($Message->"is_topic_message") ($Message->"message_thread_id") "" ]; :foreach IdsTrusted in=($TelegramChatId, $TelegramChatIdsTrusted) do={ - :if ($From->"id" = $IdsTrusted || $From->"username" = $IdsTrusted) do={ + :if ($From->"id" = $IdsTrusted || \ + $From->"username" = $IdsTrusted || \ + $Chat->"id" = $IdsTrusted) do={ :set Trusted true; } } From f1396b83aa7f506fe653184016cd970728eb9407 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 13 May 2025 09:52:12 +0200 Subject: [PATCH 686/893] telegram-chat: support debug output for updates in JSON --- telegram-chat.rsc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 50fc0cc..277c40f 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -33,6 +33,7 @@ :global GetRandom20CharAlNum; :global IfThenElse; :global LogPrint; + :global LogPrintVerbose; :global MAX; :global MIN; :global MkDir; @@ -96,6 +97,8 @@ :local Uptime [ /system/resource/get uptime ]; :foreach Update in=($JSON->"result") do={ :set UpdateID ($Update->"update_id"); + $LogPrintVerbose debug $ScriptName ("Update " . $UpdateID . ": " . [ :serialize to=json $Update ]); + :local Message ($Update->"message"); :local IsReply ([ :typeof ($Message->"reply_to_message") ] = "string"); :local IsMyReply ($TelegramMessageIDs->[ :tostr ($Message->"reply_to_message"->"message_id") ]); From 64fe923c5aea4e6b8cd549a39f8e76c1e9814391 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 13 May 2025 10:02:03 +0200 Subject: [PATCH 687/893] DEBUG: fix typo --- DEBUG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEBUG.md b/DEBUG.md index d5e9beb..66bf728 100644 --- a/DEBUG.md +++ b/DEBUG.md @@ -42,7 +42,7 @@ Other actions (`disk`, `email`, `remote` or `support`) can be used as well. I do not recommend using `echo` - use [debug output](#debug-output) instead. -Disable or remote that setting to restore regular logging. +Disable or remove that setting to restore regular logging. ## Verbose output From 86ad41f6b612ef3b904e053b2dbf2f12d3260842 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 23 May 2025 09:06:02 +0200 Subject: [PATCH 688/893] fix the trust state for certificates RouterOS 7.19 is suffering an issue with certificate store, where the trust state is not available correctly. This effects certificates imported a long time ago, with RouterOS 7.4 or older. Fixing trust state for all certificates by re-setting the trust state... (Reported as SUP-188791...) --- global-functions.rsc | 2 +- news-and-changes.rsc | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 8331e4a..ef849e0 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -15,7 +15,7 @@ # Git commit id & info, expected configuration version :global CommitId "unknown"; :global CommitInfo "unknown"; -:global ExpectedConfigVersion 137; +:global ExpectedConfigVersion 138; # global variables not to be changed by user :global GlobalFunctionsReady false; diff --git a/news-and-changes.rsc b/news-and-changes.rsc index a9a2904..dbfb1b9 100644 --- a/news-and-changes.rsc +++ b/news-and-changes.rsc @@ -62,6 +62,7 @@ 135="Introduced helper function '\$GetTelegramChatId' for 'mod/notification-telegram' which helps retrieve information."; 136="Introduced script 'check-perpetual-license' to check for license state on CHR."; 137="Added support to send notifications via Gotify (gotify.net)."; + 138="RouterOS 7.19 is suffering an issue with certificate store. Fixing trust state for all certificates..."; }; # Migration steps to be applied on script updates @@ -71,4 +72,5 @@ 104=":global CharacterReplace; :global ScriptInstallUpdate; :foreach Script in={ \"capsman-download-packages\"; \"capsman-rolling-upgrade\"; \"hotspot-to-wpa\"; \"hotspot-to-wpa-cleanup\" } do={ /system/script/set name=(\$Script . \".capsman\") [ find where name=\$Script ]; :foreach Scheduler in=[ /system/scheduler/find where on-event~(\$Script . \"([^-.]|\\\$)\") ] do={ /system/scheduler/set \$Scheduler on-event=[ \$CharacterReplace [ get \$Scheduler on-event ] \$Script (\$Script . \".capsman\") ]; }; }; /ip/hotspot/user/profile/set on-login=\"hotspot-to-wpa.capsman\" [ find where on-login=\"hotspot-to-wpa\" ]; \$ScriptInstallUpdate;"; 111=":local Rec [ /ip/dns/static/find where comment~\"^managed by dhcp-to-dns for \" ]; :if ([ :len \$Rec ] > 0) do={ /ip/dns/static/remove \$Rec; /system/script/run dhcp-to-dns; }"; 132=":if ([ :len [ /system/script/find where name=\"check-health\" ] ] > 0) do={ :local Code \":local Install \\\"check-health\\\"; :if ([ :len [ /system/health/find where type=\\\"\\\" name~\\\"-state\\\\\\\$\\\" ] ] > 0) do={ :set Install (\\\$Install . \\\",check-health.d/state\\\"); }; :if ([ :len [ /system/health/find where type=\\\"C\\\" ] ] > 0) do={ :set Install (\\\$Install . \\\",check-health.d/temperature\\\"); }; :if ([ :len [ /system/health/find where type=\\\"V\\\" ] ] > 0) do={ :set Install (\\\$Install . \\\",check-health.d/voltage\\\"); }; :global ScriptInstallUpdate; \\\$ScriptInstallUpdate \\\$Install;\"; :global ValidateSyntax; :if ([ \$ValidateSyntax \$Code ] = true) do={ :do { [ :parse \$Code ]; } on-error={ }; }; }"; + 138="/certificate/set trusted=yes [ find where trusted=yes ];"; }; From 4bd7d44cd2b9252d7389f049c367e57c642551d5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 23 May 2025 11:16:40 +0200 Subject: [PATCH 689/893] global-functions: $ScriptInstallUpdate: fix syntax error --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index ef849e0..55dbdee 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1212,7 +1212,7 @@ :set SourceNew [ :tolf ($Result->"data") ]; } } do={ - $LogPrint warning $0 ("Failed fetching script '" . $ScriptVal->"name" . . "': " . $Err); + $LogPrint warning $0 ("Failed fetching script '" . $ScriptVal->"name" . "': " . $Err); :if ($ScriptVal->"source" = "#!rsc by RouterOS\n") do={ $LogPrint warning $0 ("Removing dummy. Typo on installation?"); /system/script/remove $Script; From c50acd697a75d9e1dd3d336405d4bdc1567546ee Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 23 May 2025 17:36:56 +0200 Subject: [PATCH 690/893] telegram-chat: fix detection of replies --- telegram-chat.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 277c40f..9862479 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -100,7 +100,7 @@ $LogPrintVerbose debug $ScriptName ("Update " . $UpdateID . ": " . [ :serialize to=json $Update ]); :local Message ($Update->"message"); - :local IsReply ([ :typeof ($Message->"reply_to_message") ] = "string"); + :local IsReply ([ :typeof ($Message->"reply_to_message") ] = "array"); :local IsMyReply ($TelegramMessageIDs->[ :tostr ($Message->"reply_to_message"->"message_id") ]); :if (($IsMyReply = 1 || $TelegramChatOffset->0 > 0 || $Uptime > 5m) && $UpdateID >= $TelegramChatOffset->2) do={ :local Trusted false; From 6a49c483b679d7dc68b7b12617be24508c3fa5b4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 23 May 2025 17:38:22 +0200 Subject: [PATCH 691/893] telegram-chat: rename variable... ... to better describe the use. --- telegram-chat.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 9862479..fdd0883 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -100,7 +100,7 @@ $LogPrintVerbose debug $ScriptName ("Update " . $UpdateID . ": " . [ :serialize to=json $Update ]); :local Message ($Update->"message"); - :local IsReply ([ :typeof ($Message->"reply_to_message") ] = "array"); + :local IsAnyReply ([ :typeof ($Message->"reply_to_message") ] = "array"); :local IsMyReply ($TelegramMessageIDs->[ :tostr ($Message->"reply_to_message"->"message_id") ]); :if (($IsMyReply = 1 || $TelegramChatOffset->0 > 0 || $Uptime > 5m) && $UpdateID >= $TelegramChatOffset->2) do={ :local Trusted false; @@ -138,7 +138,7 @@ " from update " . $UpdateID . "!"); :set Done true; } - :if ($Done = false && ($IsMyReply = 1 || ($IsReply = false && \ + :if ($Done = false && ($IsMyReply = 1 || ($IsAnyReply = false && \ $TelegramChatActive = true)) && [ :len $Command ] > 0) do={ :if ([ $ValidateSyntax $Command ] = true) do={ :local State ""; From 3d3b270748b43362d0ec51a1e52f300e6770b469 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 28 May 2025 14:07:57 +0200 Subject: [PATCH 692/893] README: give a hint on builtin certificate store I guess this should become the default any time in future... --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2a8b2ce..bc09840 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,14 @@ including demonstation recorded live at [MUM Europe ### The long way in detail The update script does server certificate verification, so first step is to -download the certificates. If you intend to download the scripts from a +download the certificates. + +> 💡️ **Hint**: RouterOS 7.19 comes with a builtin certificate store. You +> can skip the steps regarding certificate download and import if you set +> the trust for these builtin trust anchors: +> `/certificate/settings/set builtin-trust-anchors=trusted;` + +If you intend to download the scripts from a different location (for example from github.com) install the corresponding certificate chain. From d59c4aee26788f3c5088c32a3bd54f0562b4d2b4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 28 May 2025 14:16:57 +0200 Subject: [PATCH 693/893] README: add a paragraph and link to jump --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bc09840..243e1fc 100644 --- a/README.md +++ b/README.md @@ -75,8 +75,9 @@ The update script does server certificate verification, so first step is to download the certificates. > 💡️ **Hint**: RouterOS 7.19 comes with a builtin certificate store. You -> can skip the steps regarding certificate download and import if you set -> the trust for these builtin trust anchors: +> can skip the steps regarding certificate download and import and jump +> to [installation of scripts](#installation-of-scripts) if you set the +> trust for these builtin trust anchors: > `/certificate/settings/set builtin-trust-anchors=trusted;` If you intend to download the scripts from a @@ -113,6 +114,8 @@ is shown. Always make sure there are no certificates installed you do not know or want! +#### Installation of scripts + All following commands will verify the server certificate. For validity the certificate's lifetime is checked with local time, so make sure the device's date and time is set correctly! From bf684a7197f9ad07e23415de5779a366af7dd71b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 28 May 2025 15:08:26 +0200 Subject: [PATCH 694/893] global-functions: $CertificateAvailable: try to use builtin certificates The builtin certificates were introduced with RouterOS 7.19, so requires this hacky :parse workaround. --- global-functions.rsc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 55dbdee..759b274 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -119,6 +119,11 @@ :return false; } + :if (([ /certificate/settings/get ]->"builtin-trust-anchors") = "trusted" && \ + [[ :parse (":return [ :len [ /certificate/builtin/find where common-name=\"" . $CommonName . "\" ] ]") ]] > 0) do={ + :return true; + } + :if ([ :len [ /certificate/find where common-name=$CommonName ] ] = 0) do={ $LogPrint info $0 ("Certificate with CommonName '" . $CommonName . "' not available."); :if ([ $CertificateDownload $CommonName ] = false) do={ From d69b39957278a9393762ec1653895eeb69483e9e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 28 May 2025 16:38:50 +0200 Subject: [PATCH 695/893] INITIAL-COMMANDS: use builtin certificates if possible --- INITIAL-COMMANDS.md | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 79773bd..40f609b 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -18,17 +18,21 @@ Run the complete base installation: { :local BaseUrl "https://git.eworm.de/cgit/routeros-scripts/plain/"; + :local CertCommonName "ISRG Root X2"; :local CertFileName "ISRG-Root-X2.pem"; :local CertFingerprint "69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470"; - :put "Importing certificate..."; - /tool/fetch ($BaseUrl . "certs/" . $CertFileName) dst-path=$CertFileName as-value; - :delay 1s; - /certificate/import file-name=$CertFileName passphrase=""; - :if ([ :len [ /certificate/find where fingerprint=$CertFingerprint ] ] != 1) do={ - :error "Something is wrong with your certificates!"; + :if (!(([ /certificate/settings/get ]->"builtin-trust-anchors") = "trusted" && \ + [[ :parse (":return [ :len [ /certificate/builtin/find where common-name=\"" . $CertCommonName . "\" ] ]") ]] > 0)) do={ + :put "Importing certificate..."; + /tool/fetch ($BaseUrl . "certs/" . $CertFileName) dst-path=$CertFileName as-value; + :delay 1s; + /certificate/import file-name=$CertFileName passphrase=""; + :if ([ :len [ /certificate/find where fingerprint=$CertFingerprint ] ] != 1) do={ + :error "Something is wrong with your certificates!"; + }; + :delay 1s; }; - :delay 1s; :put "Renaming global-config-overlay, if exists..."; /system/script/set name=("global-config-overlay-" . [ /system/clock/get date ] . "-" . [ /system/clock/get time ]) [ find where name="global-config-overlay" ]; :foreach Script in={ "global-config"; "global-config-overlay"; "global-functions" } do={ @@ -41,9 +45,11 @@ Run the complete base installation: :put "Scheduling to load configuration and functions..."; /system/scheduler/remove [ find where name="global-scripts" ]; /system/scheduler/add name="global-scripts" start-time=startup on-event="/system/script { run global-config; run global-functions; }"; - :put "Renaming certificate by its common-name..."; - :global CertificateNameByCN; - $CertificateNameByCN $CertFingerprint; + :if ([ :len [ /certificate/find where fingerprint=$CertFingerprint ] ] > 0) do={ + :put "Renaming certificate by its common-name..."; + :global CertificateNameByCN; + $CertificateNameByCN $CertFingerprint; + }; }; Then continue setup with From b70e6e79843f7c1bbc0031dd74cdf8005d3da4ff Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 2 Jun 2025 21:53:23 +0200 Subject: [PATCH 696/893] global-functions: introduce $FileGet --- global-functions.rsc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 759b274..3a2d20a 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -38,6 +38,7 @@ :global ExitError; :global FetchHuge; :global FetchUserAgentStr; +:global FileGet; :global FormatLine; :global FormatMultiLines; :global GetMacVendor; @@ -529,6 +530,18 @@ $Resource->"architecture-name" . " " . $Caller . "/Fetch (https://rsc.eworm.de/)"); } +# get file properties in array, or false on error +:set FileGet do={ + :local FileName [ :tostr $1 ]; + + :local FileVal false; + :do { + :set FileVal [ /file/get $FileName ]; + } on-error={ } + + :return $FileVal; +} + # format a line for output :set FormatLine do={ :local Key [ :tostr $1 ]; From 1e4f168735663cc09395980b5fa24a25f6403347 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 20:42:25 +0200 Subject: [PATCH 697/893] global-functions: $MkDir: use $FileGet ... ... to work around restrictions in new file handling. --- global-functions.rsc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 3a2d20a..3b2ab95 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -893,6 +893,7 @@ :local Path [ :tostr $1 ]; :global CleanFilePath; + :global FileGet; :global LogPrint; :global RmDir; :global WaitForFile; @@ -930,7 +931,8 @@ $LogPrint debug $0 ("Making directory: " . $Path); - :if ([ :len [ /file/find where name=$Path type="directory" ] ] = 1) do={ + :local PathVal [ $FileGet $Path ]; + :if ($PathVal->"type" = "directory") do={ $LogPrint debug $0 ("... which already exists."); :return true; } From d993495e44563f841f7fed19fcf3162a6cb7b971 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 21:38:26 +0200 Subject: [PATCH 698/893] global-functions: $RmDir: use $FileGet ... ... to work around restrictions in new file handling. --- global-functions.rsc | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 3b2ab95..2d0cd39 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1057,25 +1057,26 @@ :set RmDir do={ :local DirName [ :tostr $1 ]; + :global FileGet; :global LogPrint; $LogPrint debug $0 ("Removing directory: ". $DirName); - :if ([ :len [ /file/find where name=$DirName type!=directory ] ] > 0) do={ - $LogPrint error $0 ("Directory '" . $DirName . "' is not a directory."); - :return false; - } - - :local Dir [ /file/find where name=$DirName type=directory ]; - :if ([ :len $Dir ] = 0) do={ + :local DirVal [ $FileGet $DirName ]; + :if ($DirVal = false) do={ $LogPrint debug $0 ("... which does not exist."); :return true; } + :if ($DirVal->"type" != "directory") do={ + $LogPrint error $0 ("Directory '" . $DirName . "' is not a directory."); + :return false; + } + :onerror Err { - /file/remove $Dir; + /file/remove $DirName; } do={ - $LogPrint error $0 ("Removing directory '" . $DirName . "' (" . $Dir . ") failed: " . $Err); + $LogPrint error $0 ("Removing directory '" . $DirName . "' failed: " . $Err); :return false; } :return true; From fb8e616846ab8decb10a8b792b5307a01195110d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 21:41:34 +0200 Subject: [PATCH 699/893] global-functions: $RmFile: use $FileGet ... ... to work around restrictions in new file handling. --- global-functions.rsc | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 2d0cd39..985deba 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1086,25 +1086,26 @@ :set RmFile do={ :local FileName [ :tostr $1 ]; + :global FileGet; :global LogPrint; $LogPrint debug $0 ("Removing file: ". $FileName); - :if ([ :len [ /file/find where name=$FileName (type=directory or type=disk) ] ] > 0) do={ - $LogPrint error $0 ("File '" . $FileName . "' is not a file."); - :return false; - } - - :local File [ /file/find where name=$FileName !(type=directory or type=disk) ]; - :if ([ :len $File ] = 0) do={ + :local FileVal [ $FileGet $FileName ]; + :if ($FileVal = false) do={ $LogPrint debug $0 ("... which does not exist."); :return true; } + :if ($FileVal->"type" = "directory" || $FileVal->"type" = "disk") do={ + $LogPrint error $0 ("File '" . $FileName . "' is not a file."); + :return false; + } + :onerror Err { - /file/remove $File; + /file/remove $FileName; } do={ - $LogPrint error $0 ("Removing file '" . $FileName . "' (" . $File . ") failed: " . $Err); + $LogPrint error $0 ("Removing file '" . $FileName . "' failed: " . $Err); :return false; } :return true; From e08bb2192dfd22b25652553f28304818a3602331 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 20:48:05 +0200 Subject: [PATCH 700/893] global-functions: $WaitForFile: drop the workaround This was fixed in RouterOS 7.18rc1, so should be ok to remove now. --- global-functions.rsc | 9 --------- 1 file changed, 9 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 985deba..3a62169 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1757,15 +1757,6 @@ :set I ($I + 1); } - :while ([ :len [ /file/find where name=$FileName ] ] > 0) do={ - :do { - /file/get $FileName; - :return true; - } on-error={ } - :delay $Delay; - :set Delay ($Delay * 3 / 2); - } - :return false; } From 0e00a228d67d77fadc80eee2df04c2cec25b8db8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 21:25:20 +0200 Subject: [PATCH 701/893] global-functions: $WaitForFile: use :retry for simplification, ... ... and to work around restrictions in new file handling. --- global-functions.rsc | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 3a62169..fa5d2be 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1746,16 +1746,14 @@ :global MAX; :set FileName [ $CleanFilePath $FileName ]; - :local I 1; :local Delay ([ $MAX [ $EitherOr $WaitTime 2s ] 100ms ] / 10); - :while ([ :len [ /file/find where name=$FileName ] ] = 0) do={ - :if ($I >= 10) do={ - :return false; - } - :delay $Delay; - :set I ($I + 1); - } + :do { + :retry { + /file/get $FileName; + :return true; + } delay=$Delay max=10; + } on-error={ } :return false; } From cb984a5e527a12aaa2336cfd66f180302755f066 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 20:34:07 +0200 Subject: [PATCH 702/893] global-functions: introduce $FileExists --- global-functions.rsc | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index fa5d2be..ddddc40 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -38,6 +38,7 @@ :global ExitError; :global FetchHuge; :global FetchUserAgentStr; +:global FileExists; :global FileGet; :global FormatLine; :global FormatMultiLines; @@ -530,6 +531,29 @@ $Resource->"architecture-name" . " " . $Caller . "/Fetch (https://rsc.eworm.de/)"); } +# check for existence of file, optionally with type +:set FileExists do={ + :local FileName [ :tostr $1 ]; + :local Type [ :tostr $2 ]; + + :global FileGet; + + :local FileVal [ $FileGet $FileName ]; + :if ($FileVal = false) do={ + :return false; + } + + :if ([ :len ($FileVal->"size") ] = 0) do={ + :return false; + } + + :if ([ :len $Type ] = 0 || $FileVal->"type" = $Type) do={ + :return true; + } + + :return false; +} + # get file properties in array, or false on error :set FileGet do={ :local FileName [ :tostr $1 ]; From 8353a8547f45a18e167b8ffd3779d8bd469dd1c7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 20:44:49 +0200 Subject: [PATCH 703/893] global-functions: $DownloadPackage: use $FileExists ... ... to work around restrictions in new file handling. --- global-functions.rsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index ddddc40..50426b6 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -365,6 +365,7 @@ :global CertificateAvailable; :global CleanFilePath; + :global FileExists; :global LogPrint; :global MkDir; :global RmFile; @@ -385,7 +386,7 @@ :return false; } - :if ([ :len [ /file/find where name=$PkgDest type="package" ] ] > 0) do={ + :if ([ $FileExists $PkgDest "package" ] = true) do={ $LogPrint info $0 ("Package file " . $PkgName . " already exists."); :return true; } @@ -407,7 +408,7 @@ :return false; } - :if ([ /file/get [ find where name=$PkgDest ] type ] != "package") do={ + :if ([ $FileExists $PkgDest "package" ] = false) do={ $LogPrint warning $0 ("Downloaded file is not a package, removing."); $RmFile $PkgDest; :return false; From a2f837be591e4e64f2634e1d2e57352989326e98 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 22:39:18 +0200 Subject: [PATCH 704/893] backup-email: use :retry and $FileExists ... ... to work around restrictions in new file handling. --- backup-email.rsc | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/backup-email.rsc b/backup-email.rsc index 632d2e6..cff6fd8 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -27,6 +27,7 @@ :global CleanName; :global DeviceInfo; + :global FileExists; :global FormatLine; :global LogPrint; :global MkDir; @@ -124,16 +125,16 @@ attach=$Attach; remove-attach=true }); # wait for the mail to be sent - :local I 0; - :while ([ :len [ /file/find where name ~ ($FilePath . "\\.(backup|rsc)\$") ] ] > 0) do={ - :if ($I >= 120) do={ - $LogPrint warning $ScriptName ("Files are still available, sending e-mail failed."); - :set PackagesUpdateBackupFailure true; - :set ExitOK true; - :error false; - } - :delay 1s; - :set I ($I + 1); + :do { + :retry { + :if ([ $FileExists ($FilePath . ".backup") "backup" ] = true || \ + [ $FileExists ($FilePath . ".rsc") "script" ] = true) do={ + :error "Files are still available."; + } + } delay=1s max=120; + } on-error={ + $LogPrint warning $ScriptName ("Files are still available, sending e-mail failed."); + :set PackagesUpdateBackupFailure true; } } do={ :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; From 43bac7c33c50e164ff7ac56029519d510bc08973 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 2 Jun 2025 23:52:29 +0200 Subject: [PATCH 705/893] backup-email: check for .conf file --- backup-email.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backup-email.rsc b/backup-email.rsc index cff6fd8..cc62105 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -127,7 +127,8 @@ # wait for the mail to be sent :do { :retry { - :if ([ $FileExists ($FilePath . ".backup") "backup" ] = true || \ + :if ([ $FileExists ($FilePath . ".conf") ".conf file" ] = true || \ + [ $FileExists ($FilePath . ".backup") "backup" ] = true || \ [ $FileExists ($FilePath . ".rsc") "script" ] = true) do={ :error "Files are still available."; } From daee05dbd7c03aa7ce977ba7856234026185c4a1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 2 Jun 2025 23:49:50 +0200 Subject: [PATCH 706/893] backup-email: add a comment why files are not removed --- backup-email.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/backup-email.rsc b/backup-email.rsc index cc62105..8015bea 100644 --- a/backup-email.rsc +++ b/backup-email.rsc @@ -137,6 +137,7 @@ $LogPrint warning $ScriptName ("Files are still available, sending e-mail failed."); :set PackagesUpdateBackupFailure true; } + # do not remove the files here, as the mail is still queued! } do={ :global ExitError; $ExitError $ExitOK [ :jobname ] $Err; } From e3284ca77081642d2105d6a6773fa6767188dbec Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 22:46:03 +0200 Subject: [PATCH 707/893] mod/notification-email: use $FileExists ... ... to work around restrictions in new file handling. --- mod/notification-email.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index 5293766..75e11b9 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -40,6 +40,7 @@ :global EitherOr; :global EMailGenerateFrom; + :global FileExists; :global IsDNSResolving; :global IsTimeSync; :global LogPrint; @@ -93,7 +94,7 @@ :onerror Err { :local Attach ({}); :foreach File in=[ :toarray [ $EitherOr ($Message->"attach") "" ] ] do={ - :if ([ :len [ /file/find where name=$File ] ] = 1) do={ + :if ([ $FileExists $File ] = true) do={ :set Attach ($Attach, $File); } else={ $LogPrint warning $0 ("File '" . $File . "' does not exist, can not attach."); From 2d81984aed8894200e4f8c6c72596b8b05bdbb93 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 22:46:16 +0200 Subject: [PATCH 708/893] mod/notification-email: use $RmFile --- mod/notification-email.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index 75e11b9..ad9762a 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -44,6 +44,7 @@ :global IsDNSResolving; :global IsTimeSync; :global LogPrint; + :global RmFile; :local AllDone true; :local QueueLen [ :len $EmailQueue ]; @@ -111,7 +112,7 @@ :set Wait false; :if (($Message->"remove-attach") = true) do={ :foreach File in=$Attach do={ - /file/remove $File; + $RmFile $File; } } } From 80aed200fd7400e4a4958ba314912488780be635 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 22:48:57 +0200 Subject: [PATCH 709/893] mod/ssh-keys-import: use $FileExists ... ... to work around restrictions in new file handling. --- mod/ssh-keys-import.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index 9467525..7bdc95d 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -75,6 +75,7 @@ :local User [ :tostr $2 ]; :global EitherOr; + :global FileExists; :global LogPrint; :global ParseKeyValueStore; :global SSHKeysImport; @@ -84,8 +85,7 @@ :return false; } - :local File [ /file/find where name=$FileName ]; - :if ([ :len $File ] = 0) do={ + :if ([ $FileExists $FileName ] = true) do={ $LogPrint warning $0 ("File '" . $FileName . "' does not exist."); :return false; } From 30b80e903dbf80510fbb05f21c598ecf6c1834d7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 22:41:03 +0200 Subject: [PATCH 710/893] telegram-chat: use $FileExists ... ... to work around restrictions in new file handling. --- telegram-chat.rsc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index fdd0883..7f7b7a7 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -30,6 +30,7 @@ :global CertificateAvailable; :global EitherOr; :global EscapeForRegEx; + :global FileExists; :global GetRandom20CharAlNum; :global IfThenElse; :global LogPrint; @@ -154,7 +155,7 @@ :if ([ $WaitForFile ($File . ".done") [ $EitherOr $TelegramChatRunTime 20s ] ] = false) do={ :set State ([ $SymbolForNotification "warning-sign" ] . "The command did not finish, still running in background.\n\n"); } - :if ([ :len [ /file/find where name=($File . ".failed") ] ] > 0) do={ + :if ([ $FileExists ($File . ".failed") ] = true) do={ :set State ([ $SymbolForNotification "cross-mark" ] . "The command failed with an error!\n\n"); } :local Content ([ /file/read chunk-size=32768 file=$File as-value ]->"data"); From 5b15c82bb11f9da1b6858504dc1e0de401e91c8f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 2 Jun 2025 22:16:43 +0200 Subject: [PATCH 711/893] capsman-download-packages: use $FileGet ... ... to work around restrictions in new file handling. --- capsman-download-packages.capsman.rsc | 3 ++- capsman-download-packages.template.rsc | 3 ++- capsman-download-packages.wifi.rsc | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index cab1e4c..e296e15 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -20,6 +20,7 @@ :global CleanFilePath; :global DownloadPackage; + :global FileGet; :global LogPrint; :global MkDir; :global RmFile; @@ -42,7 +43,7 @@ :error false; } - :if ([ :len [ /file/find where name=$PackagePath type="directory" ] ] = 0) do={ + :if ([ $FileGet $PackagePath ] = false) do={ :if ([ $MkDir $PackagePath ] = false) do={ $LogPrint warning $ScriptName ("Creating directory at CAPsMAN package path (" . \ $PackagePath . ") failed!"); diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index ea41120..4040d4d 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -21,6 +21,7 @@ :global CleanFilePath; :global DownloadPackage; + :global FileGet; :global LogPrint; :global MkDir; :global RmFile; @@ -44,7 +45,7 @@ :error false; } - :if ([ :len [ /file/find where name=$PackagePath type="directory" ] ] = 0) do={ + :if ([ $FileGet $PackagePath ] = false) do={ :if ([ $MkDir $PackagePath ] = false) do={ $LogPrint warning $ScriptName ("Creating directory at CAPsMAN package path (" . \ $PackagePath . ") failed!"); diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index a810356..809fe8e 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -20,6 +20,7 @@ :global CleanFilePath; :global DownloadPackage; + :global FileGet; :global LogPrint; :global MkDir; :global RmFile; @@ -42,7 +43,7 @@ :error false; } - :if ([ :len [ /file/find where name=$PackagePath type="directory" ] ] = 0) do={ + :if ([ $FileGet $PackagePath ] = false) do={ :if ([ $MkDir $PackagePath ] = false) do={ $LogPrint warning $ScriptName ("Creating directory at CAPsMAN package path (" . \ $PackagePath . ") failed!"); From 15fd522d3db507cc7c22af9cd59ff85d41a5be6f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 30 May 2025 23:22:59 +0200 Subject: [PATCH 712/893] capsman-download-packages: adopt new functionality from file menu --- capsman-download-packages.capsman.rsc | 8 ++++---- capsman-download-packages.template.rsc | 8 ++++---- capsman-download-packages.wifi.rsc | 8 ++++---- doc/capsman-download-packages.md | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index e296e15..aaebf5c 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.15 +# requires RouterOS, version=7.18 # # download and cleanup packages for CAP installation from CAPsMAN # https://rsc.eworm.de/doc/capsman-download-packages.md @@ -54,8 +54,8 @@ "). Please place your packages!"); } - :foreach Package in=[ /file/find where type=package \ - package-version!=$InstalledVersion name~("^" . $PackagePath) ] do={ + :foreach Package in=[ /file/find recursive where path=$PackagePath \ + type="package" package-version!=$InstalledVersion ] do={ :local File [ /file/get $Package ]; :if ($File->"package-architecture" = "mips") do={ :set ($File->"package-architecture") "mipsbe"; @@ -67,7 +67,7 @@ } } - :if ([ :len [ /file/find where type=package name~("^" . $PackagePath) ] ] = 0) do={ + :if ([ :len [ /file/find recursive where path=$PackagePath type="package" ] ] = 0) do={ $LogPrint info $ScriptName ("No packages available, downloading default set."); :foreach Arch in={ "arm"; "mipsbe" } do={ :foreach Package in={ "routeros"; "wireless" } do={ diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index 4040d4d..ebbba70 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.15 +# requires RouterOS, version=7.18 # # download and cleanup packages for CAP installation from CAPsMAN # https://rsc.eworm.de/doc/capsman-download-packages.md @@ -56,8 +56,8 @@ "). Please place your packages!"); } - :foreach Package in=[ /file/find where type=package \ - package-version!=$InstalledVersion name~("^" . $PackagePath) ] do={ + :foreach Package in=[ /file/find recursive where path=$PackagePath \ + type="package" package-version!=$InstalledVersion ] do={ :local File [ /file/get $Package ]; :if ($File->"package-architecture" = "mips") do={ :set ($File->"package-architecture") "mipsbe"; @@ -69,7 +69,7 @@ } } - :if ([ :len [ /file/find where type=package name~("^" . $PackagePath) ] ] = 0) do={ + :if ([ :len [ /file/find recursive where path=$PackagePath type="package" ] ] = 0) do={ $LogPrint info $ScriptName ("No packages available, downloading default set."); # NOT /interface/wifi/ # :foreach Arch in={ "arm"; "mipsbe" } do={ diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 809fe8e..7de0431 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.15 +# requires RouterOS, version=7.18 # # download and cleanup packages for CAP installation from CAPsMAN # https://rsc.eworm.de/doc/capsman-download-packages.md @@ -54,8 +54,8 @@ "). Please place your packages!"); } - :foreach Package in=[ /file/find where type=package \ - package-version!=$InstalledVersion name~("^" . $PackagePath) ] do={ + :foreach Package in=[ /file/find recursive where path=$PackagePath \ + type="package" package-version!=$InstalledVersion ] do={ :local File [ /file/get $Package ]; :if ($File->"package-architecture" = "mips") do={ :set ($File->"package-architecture") "mipsbe"; @@ -67,7 +67,7 @@ } } - :if ([ :len [ /file/find where type=package name~("^" . $PackagePath) ] ] = 0) do={ + :if ([ :len [ /file/find recursive where path=$PackagePath type="package" ] ] = 0) do={ $LogPrint info $ScriptName ("No packages available, downloading default set."); :foreach Arch in={ "arm"; "arm64" } do={ :local Packages { "arm"={ "routeros"; "wifi-qcom"; "wifi-qcom-ac" }; diff --git a/doc/capsman-download-packages.md b/doc/capsman-download-packages.md index 5722227..4daad49 100644 --- a/doc/capsman-download-packages.md +++ b/doc/capsman-download-packages.md @@ -4,7 +4,7 @@ Download packages for CAP upgrade from CAPsMAN [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.18-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) From c3d3d61f92d4d3e219373045dbd3b982af18a824 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 2 Jun 2025 15:58:00 +0200 Subject: [PATCH 713/893] packages-update: support deferred reboot with longer interval --- doc/packages-update.md | 4 ++-- packages-update.rsc | 11 ++++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/doc/packages-update.md b/doc/packages-update.md index 75225fe..a0a1795 100644 --- a/doc/packages-update.md +++ b/doc/packages-update.md @@ -46,8 +46,8 @@ Configuration The configuration goes to `global-config-overlay`, this is the only parameter: -* `PackagesUpdateDeferReboot`: defer the reboot for night (between 3 AM - and 5 AM) +* `PackagesUpdateDeferReboot`: defer the reboot for night (between 3 AM and + 5 AM), use a numerical value in days suffixed with a `d` to defer further By modifying the scheduler's `start-time` you can force the reboot at different time. diff --git a/packages-update.rsc b/packages-update.rsc index 4fde131..43f6749 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -31,19 +31,24 @@ :local Schedule do={ :local ScriptName [ :tostr $1 ]; + :global PackagesUpdateDeferReboot; + :global GetRandomNumber; + :global IfThenElse; :global LogPrint; :global RebootForUpdate do={ /system/reboot; } + :local Interval [ $IfThenElse ($PackagesUpdateDeferReboot >= 1d) $PackagesUpdateDeferReboot 1d ]; :local StartTime [ :tostr [ :totime (10800 + [ $GetRandomNumber 7200 ]) ] ]; - /system/scheduler/add name="_RebootForUpdate" start-time=$StartTime interval=1d \ + /system/scheduler/add name="_RebootForUpdate" start-time=$StartTime interval=$Interval \ on-event=("/system/scheduler/remove \"_RebootForUpdate\"; " . \ ":global RebootForUpdate; \$RebootForUpdate;"); $LogPrint info $ScriptName ("Scheduled reboot for update at " . $StartTime . \ - " local time (" . [ /system/clock/get time-zone-name ] . ")."); + " local time (" . [ /system/clock/get time-zone-name ] . ")" . \ + [ $IfThenElse ($Interval > 1d) (" deferred by " . $Interval) ] . "."); :return true; } @@ -153,7 +158,7 @@ :error true; } } else={ - :if ($PackagesUpdateDeferReboot = true) do={ + :if ($PackagesUpdateDeferReboot = true || $PackagesUpdateDeferReboot >= 1d) do={ $Schedule $ScriptName; :set ExitOK true; :error true; From 1f4bf9ee63c57a711652954d6d408b221a6503e5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 2 Jun 2025 16:12:28 +0200 Subject: [PATCH 714/893] check-routeros-update: remove a stale scheduler --- check-routeros-update.rsc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/check-routeros-update.rsc b/check-routeros-update.rsc index e28a019..8b80dde 100644 --- a/check-routeros-update.rsc +++ b/check-routeros-update.rsc @@ -28,6 +28,7 @@ :global EscapeForRegEx; :global FetchUserAgentStr; :global LogPrint; + :global RebootForUpdate; :global ScriptFromTerminal; :global ScriptLock; :global SendNotification2; @@ -62,9 +63,14 @@ $WaitFullyConnected; :if ([ :len [ /system/scheduler/find where name="_RebootForUpdate" ] ] > 0) do={ - $LogPrint info $ScriptName ("A reboot for update is already scheduled."); - :set ExitOK true; - :error false; + :if ([ :typeof $RebootForUpdate ] = "nothing") do={ + $LogPrint info $ScriptName ("Found a stale scheduler for reboot, removing."); + /system/scheduler/remove "_RebootForUpdate"; + } else={ + $LogPrint info $ScriptName ("A reboot for update is already scheduled."); + :set ExitOK true; + :error false; + } } $LogPrint debug $ScriptName ("Checking for updates..."); From 0de6d006ae1773b38bef60845c6c343bc20f5da6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 2 Jun 2025 21:37:59 +0200 Subject: [PATCH 715/893] update list of contributors --- CONTRIBUTIONS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index 5bf5d08..00861c1 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -35,6 +35,7 @@ Add yourself to the list, [donate with PayPal ↗️](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J)! * Abdul Mannan Abbasi +* Alex Maier * Andrea Ruffini Perico * Andrew Cox * Christoph Boss (@Kampfwurst) From 595b4aea9d43f6eef3aa3dad7a198431a7e3cf9a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 10 Jun 2025 22:54:40 +0200 Subject: [PATCH 716/893] capsman-download-packages: revert changes for "new functionality" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (Though we keep the quoting for type.) Well, turned out this functionality is for `/file/print` only, but does not work with `/file/find`. 🫣🥴 This reverts commit 15fd522d3db507cc7c22af9cd59ff85d41a5be6f. --- capsman-download-packages.capsman.rsc | 8 ++++---- capsman-download-packages.template.rsc | 8 ++++---- capsman-download-packages.wifi.rsc | 8 ++++---- doc/capsman-download-packages.md | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/capsman-download-packages.capsman.rsc b/capsman-download-packages.capsman.rsc index aaebf5c..2ea1667 100644 --- a/capsman-download-packages.capsman.rsc +++ b/capsman-download-packages.capsman.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.18 +# requires RouterOS, version=7.15 # # download and cleanup packages for CAP installation from CAPsMAN # https://rsc.eworm.de/doc/capsman-download-packages.md @@ -54,8 +54,8 @@ "). Please place your packages!"); } - :foreach Package in=[ /file/find recursive where path=$PackagePath \ - type="package" package-version!=$InstalledVersion ] do={ + :foreach Package in=[ /file/find where type="package" \ + package-version!=$InstalledVersion name~("^" . $PackagePath) ] do={ :local File [ /file/get $Package ]; :if ($File->"package-architecture" = "mips") do={ :set ($File->"package-architecture") "mipsbe"; @@ -67,7 +67,7 @@ } } - :if ([ :len [ /file/find recursive where path=$PackagePath type="package" ] ] = 0) do={ + :if ([ :len [ /file/find where type="package" name~("^" . $PackagePath) ] ] = 0) do={ $LogPrint info $ScriptName ("No packages available, downloading default set."); :foreach Arch in={ "arm"; "mipsbe" } do={ :foreach Package in={ "routeros"; "wireless" } do={ diff --git a/capsman-download-packages.template.rsc b/capsman-download-packages.template.rsc index ebbba70..f95212a 100644 --- a/capsman-download-packages.template.rsc +++ b/capsman-download-packages.template.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.18 +# requires RouterOS, version=7.15 # # download and cleanup packages for CAP installation from CAPsMAN # https://rsc.eworm.de/doc/capsman-download-packages.md @@ -56,8 +56,8 @@ "). Please place your packages!"); } - :foreach Package in=[ /file/find recursive where path=$PackagePath \ - type="package" package-version!=$InstalledVersion ] do={ + :foreach Package in=[ /file/find where type="package" \ + package-version!=$InstalledVersion name~("^" . $PackagePath) ] do={ :local File [ /file/get $Package ]; :if ($File->"package-architecture" = "mips") do={ :set ($File->"package-architecture") "mipsbe"; @@ -69,7 +69,7 @@ } } - :if ([ :len [ /file/find recursive where path=$PackagePath type="package" ] ] = 0) do={ + :if ([ :len [ /file/find where type="package" name~("^" . $PackagePath) ] ] = 0) do={ $LogPrint info $ScriptName ("No packages available, downloading default set."); # NOT /interface/wifi/ # :foreach Arch in={ "arm"; "mipsbe" } do={ diff --git a/capsman-download-packages.wifi.rsc b/capsman-download-packages.wifi.rsc index 7de0431..03fd9e7 100644 --- a/capsman-download-packages.wifi.rsc +++ b/capsman-download-packages.wifi.rsc @@ -4,7 +4,7 @@ # Michael Gisbers # https://rsc.eworm.de/COPYING.md # -# requires RouterOS, version=7.18 +# requires RouterOS, version=7.15 # # download and cleanup packages for CAP installation from CAPsMAN # https://rsc.eworm.de/doc/capsman-download-packages.md @@ -54,8 +54,8 @@ "). Please place your packages!"); } - :foreach Package in=[ /file/find recursive where path=$PackagePath \ - type="package" package-version!=$InstalledVersion ] do={ + :foreach Package in=[ /file/find where type="package" \ + package-version!=$InstalledVersion name~("^" . $PackagePath) ] do={ :local File [ /file/get $Package ]; :if ($File->"package-architecture" = "mips") do={ :set ($File->"package-architecture") "mipsbe"; @@ -67,7 +67,7 @@ } } - :if ([ :len [ /file/find recursive where path=$PackagePath type="package" ] ] = 0) do={ + :if ([ :len [ /file/find where type="package" name~("^" . $PackagePath) ] ] = 0) do={ $LogPrint info $ScriptName ("No packages available, downloading default set."); :foreach Arch in={ "arm"; "arm64" } do={ :local Packages { "arm"={ "routeros"; "wifi-qcom"; "wifi-qcom-ac" }; diff --git a/doc/capsman-download-packages.md b/doc/capsman-download-packages.md index 4daad49..5722227 100644 --- a/doc/capsman-download-packages.md +++ b/doc/capsman-download-packages.md @@ -4,7 +4,7 @@ Download packages for CAP upgrade from CAPsMAN [![GitHub stars](https://img.shields.io/github/stars/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=red)](https://github.com/eworm-de/routeros-scripts/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=green)](https://github.com/eworm-de/routeros-scripts/network) [![GitHub watchers](https://img.shields.io/github/watchers/eworm-de/routeros-scripts?logo=GitHub&style=flat&color=blue)](https://github.com/eworm-de/routeros-scripts/watchers) -[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.18-yellow?style=flat)](https://mikrotik.com/download/changelogs/) +[![required RouterOS version](https://img.shields.io/badge/RouterOS-7.15-yellow?style=flat)](https://mikrotik.com/download/changelogs/) [![Telegram group @routeros_scripts](https://img.shields.io/badge/Telegram-%40routeros__scripts-%2326A5E4?logo=telegram&style=flat)](https://t.me/routeros_scripts) [![donate with PayPal](https://img.shields.io/badge/Like_it%3F-Donate!-orange?logo=githubsponsors&logoColor=orange&style=flat)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=A4ZXBD6YS2W8J) From e2d3f0f073f1cd923892f4ac9af0d20dfb5902ff Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 Jun 2025 12:26:49 +0200 Subject: [PATCH 717/893] fw-addr-lists: delay on possible scripting subsystem crash This happens in :convert when a list is way too large. Let's use $LogPrintOnce here. If the scripting subsystem really crashes the message will be purged from $LogPrintOnceMessages anyway (as all global variables are lost). --- fw-addr-lists.rsc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index efd37db..0c45f7e 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -48,6 +48,12 @@ } $WaitFullyConnected; + :if ([ :len [ /log/find where topics=({"script"; "warning"}) \ + message=("\$LogPrintOnce: The message is already in log, scripting subsystem may have crashed before!") ] ] > 0) do={ + $LogPrintOnce warning $ScriptName ("Scripting subsystem may have crashed, possibly caused by us. Delaying!"); + :delay 5m; + } + :local ListComment ("managed by " . $ScriptName); :foreach FwListName,FwList in=$FwAddrLists do={ From de2a90d8413b832d3bb01337ef14d1866d23d981 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 11 Jun 2025 15:51:16 +0200 Subject: [PATCH 718/893] doc/fw-addr-lists: add a warning on possible subsystem crash --- doc/fw-addr-lists.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/fw-addr-lists.md b/doc/fw-addr-lists.md index d09383b..46b80c2 100644 --- a/doc/fw-addr-lists.md +++ b/doc/fw-addr-lists.md @@ -32,7 +32,10 @@ certificate is checked. > ⚠️ **Warning**: The script does not limit the size of a list, but keep in > mind that huge lists can exhaust your device's resources (RAM and CPU), -> and may take a long time to process. +> and may take a long time to process. +> Even crashes for the complete scripting (and CLI) subsystem are possible. +> This should be logged accordingly with warnings when global functions are +> reloaded from scheduler. Requirements and installation ----------------------------- From 95f8af6234ab56c9a831d0f37f338d7b8b3e0cbe Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 20 Jun 2025 23:47:47 +0200 Subject: [PATCH 719/893] packages-update: convert to time before comparing... ... to avoid: packages-update: Script 'packages-update' exited with error: Script Error: cannot compare if truth value is more than or equal to ip address --- packages-update.rsc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages-update.rsc b/packages-update.rsc index 43f6749..d3140f2 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -41,7 +41,8 @@ /system/reboot; } - :local Interval [ $IfThenElse ($PackagesUpdateDeferReboot >= 1d) $PackagesUpdateDeferReboot 1d ]; + :local Interval [ $IfThenElse ([ :totime $PackagesUpdateDeferReboot ] >= 1d) \ + $PackagesUpdateDeferReboot 1d ]; :local StartTime [ :tostr [ :totime (10800 + [ $GetRandomNumber 7200 ]) ] ]; /system/scheduler/add name="_RebootForUpdate" start-time=$StartTime interval=$Interval \ on-event=("/system/scheduler/remove \"_RebootForUpdate\"; " . \ @@ -158,7 +159,7 @@ :error true; } } else={ - :if ($PackagesUpdateDeferReboot = true || $PackagesUpdateDeferReboot >= 1d) do={ + :if ($PackagesUpdateDeferReboot = true || [ :totime $PackagesUpdateDeferReboot ] >= 1d) do={ $Schedule $ScriptName; :set ExitOK true; :error true; From 64158498504635d98adac896f480d71d9bf8a2a9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 21 Jun 2025 23:09:24 +0200 Subject: [PATCH 720/893] global-functions: $WaitForFile: (mostly) revert changes This (mostly) reverts commits 0e00a228d67d77fadc80eee2df04c2cec25b8db8 and e08bb2192dfd22b25652553f28304818a3602331. This is required for RouterOS 7.20beta4. That fixed recursive find for files, and (again, or still?) suffers timing (and thus racing) issues getting file properties. This breaks RouterOS 7.20beta2 again, so that specific version is not supported. Just update... --- global-functions.rsc | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 50426b6..fd89f0f 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1771,14 +1771,26 @@ :global MAX; :set FileName [ $CleanFilePath $FileName ]; - :local Delay ([ $MAX [ $EitherOr $WaitTime 2s ] 100ms ] / 10); + :local Delay ([ $MAX [ $EitherOr $WaitTime 2s ] 100ms ] / 9); :do { - :retry { + :retry { + :if ([ :len [ /file/find where name=$FileName ] ] = 0) do={ + :error false; + } + } delay=$Delay max=10; + } on-error={ + :return false; + } + + :while ([ :len [ /file/find where name=$FileName ] ] > 0) do={ + :do { /file/get $FileName; :return true; - } delay=$Delay max=10; - } on-error={ } + } on-error={ } + :delay $Delay; + :set Delay ($Delay * 3 / 2); + } :return false; } From 1307b8587e57deaf95146820b7f32bb9a713892d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sun, 22 Jun 2025 00:15:17 +0200 Subject: [PATCH 721/893] global-functions: $FileGet: mitigate race with file properties RouterOS is suffering a race condition, where a file exists, but its properties are not (yet) available. This is handled in $WaitForFile. This passes an interval of zero to $WaitForFile, as does not wait for the file to exist, but wants to avoid the race only. --- global-functions.rsc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index fd89f0f..829cbf2 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -559,6 +559,12 @@ :set FileGet do={ :local FileName [ :tostr $1 ]; + :global WaitForFile; + + :if ([ $WaitForFile $FileName 0s ] = false) do={ + :return false; + } + :local FileVal false; :do { :set FileVal [ /file/get $FileName ]; From d46574b4fe5ea3f72ce804bd5fb38a5408f9cd94 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 25 Jun 2025 10:30:26 +0200 Subject: [PATCH 722/893] netwatch-dns: retry doh server... ... for more resilience on bad connectivity or saturated link. --- netwatch-dns.rsc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 4fa076a..2df26b0 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -119,11 +119,13 @@ :local Data false; :onerror Err { - :set Data ([ /tool/fetch check-certificate=yes-without-crl output=user \ - http-header-field=({ "accept: application/dns-message" }) \ - url=(($DohServer->"doh-url") . "?dns=" . [ :convert to=base64 ([ :rndstr length=2 ] . \ - "\01\00" . "\00\01" . "\00\00" . "\00\00" . "\00\00" . "\09doh-check\05eworm\02de\00" . \ - "\00\10" . "\00\01") ]) as-value ]->"data"); + :retry { + :set Data ([ /tool/fetch check-certificate=yes-without-crl output=user \ + http-header-field=({ "accept: application/dns-message" }) \ + url=(($DohServer->"doh-url") . "?dns=" . [ :convert to=base64 ([ :rndstr length=2 ] . \ + "\01\00" . "\00\01" . "\00\00" . "\00\00" . "\00\00" . "\09doh-check\05eworm\02de\00" . \ + "\00\10" . "\00\01") ]) as-value ]->"data"); + } delay=1s max=3; } do={ $LogPrint warning $ScriptName ("Request to DoH server " . ($DohServer->"doh-url") . \ " failed: " . $Err); From b068f86995c63278c91f9e92831f075fab5af2f1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 25 Jun 2025 10:47:12 +0200 Subject: [PATCH 723/893] netwatch-dns: fix indention --- netwatch-dns.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 2df26b0..9e2f9bc 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -125,7 +125,7 @@ url=(($DohServer->"doh-url") . "?dns=" . [ :convert to=base64 ([ :rndstr length=2 ] . \ "\01\00" . "\00\01" . "\00\00" . "\00\00" . "\00\00" . "\09doh-check\05eworm\02de\00" . \ "\00\10" . "\00\01") ]) as-value ]->"data"); - } delay=1s max=3; + } delay=1s max=3; } do={ $LogPrint warning $ScriptName ("Request to DoH server " . ($DohServer->"doh-url") . \ " failed: " . $Err); From 89175e511fc965721fc19d88819c0fef13e383dc Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 7 Jul 2025 18:38:21 +0200 Subject: [PATCH 724/893] accesslist-duplicates: print without paging --- accesslist-duplicates.capsman.rsc | 2 +- accesslist-duplicates.local.rsc | 2 +- accesslist-duplicates.template.rsc | 6 +++--- accesslist-duplicates.wifi.rsc | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/accesslist-duplicates.capsman.rsc b/accesslist-duplicates.capsman.rsc index 5e6cf0a..1da0366 100644 --- a/accesslist-duplicates.capsman.rsc +++ b/accesslist-duplicates.capsman.rsc @@ -22,7 +22,7 @@ :foreach AccList in=[ /caps-man/access-list/find where mac-address!="00:00:00:00:00:00" ] do={ :local Mac [ /caps-man/access-list/get $AccList mac-address ]; :if ($Seen->$Mac = 1) do={ - /caps-man/access-list/print where mac-address=$Mac; + /caps-man/access-list/print without-paging where mac-address=$Mac; :local Remove [ :tonum [ /terminal/ask prompt="\nNumeric id to remove, any key to skip!" ] ]; :if ([ :typeof $Remove ] = "num") do={ diff --git a/accesslist-duplicates.local.rsc b/accesslist-duplicates.local.rsc index a6b4f41..03a9724 100644 --- a/accesslist-duplicates.local.rsc +++ b/accesslist-duplicates.local.rsc @@ -22,7 +22,7 @@ :foreach AccList in=[ /interface/wireless/access-list/find where mac-address!="00:00:00:00:00:00" ] do={ :local Mac [ /interface/wireless/access-list/get $AccList mac-address ]; :if ($Seen->$Mac = 1) do={ - /interface/wireless/access-list/print where mac-address=$Mac; + /interface/wireless/access-list/print without-paging where mac-address=$Mac; :local Remove [ :tonum [ /terminal/ask prompt="\nNumeric id to remove, any key to skip!" ] ]; :if ([ :typeof $Remove ] = "num") do={ diff --git a/accesslist-duplicates.template.rsc b/accesslist-duplicates.template.rsc index e51198d..bf23147 100644 --- a/accesslist-duplicates.template.rsc +++ b/accesslist-duplicates.template.rsc @@ -27,9 +27,9 @@ :local Mac [ /interface/wifi/access-list/get $AccList mac-address ]; :local Mac [ /interface/wireless/access-list/get $AccList mac-address ]; :if ($Seen->$Mac = 1) do={ - /caps-man/access-list/print where mac-address=$Mac; - /interface/wifi/access-list/print where mac-address=$Mac; - /interface/wireless/access-list/print where mac-address=$Mac; + /caps-man/access-list/print without-paging where mac-address=$Mac; + /interface/wifi/access-list/print without-paging where mac-address=$Mac; + /interface/wireless/access-list/print without-paging where mac-address=$Mac; :local Remove [ :tonum [ /terminal/ask prompt="\nNumeric id to remove, any key to skip!" ] ]; :if ([ :typeof $Remove ] = "num") do={ diff --git a/accesslist-duplicates.wifi.rsc b/accesslist-duplicates.wifi.rsc index cadacb6..528a73c 100644 --- a/accesslist-duplicates.wifi.rsc +++ b/accesslist-duplicates.wifi.rsc @@ -22,7 +22,7 @@ :foreach AccList in=[ /interface/wifi/access-list/find where mac-address!="00:00:00:00:00:00" ] do={ :local Mac [ /interface/wifi/access-list/get $AccList mac-address ]; :if ($Seen->$Mac = 1) do={ - /interface/wifi/access-list/print where mac-address=$Mac; + /interface/wifi/access-list/print without-paging where mac-address=$Mac; :local Remove [ :tonum [ /terminal/ask prompt="\nNumeric id to remove, any key to skip!" ] ]; :if ([ :typeof $Remove ] = "num") do={ From 4c2c7e817a03202d8202bc4902f12990b0b06028 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 21 Jul 2025 10:47:19 +0200 Subject: [PATCH 725/893] netwatch-notify: give the number of failures... ... to indicated this happened several times. --- netwatch-notify.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index 00f03cd..12f2721 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -127,7 +127,7 @@ $LogPrint [ $IfThenElse ($HostInfo->"no-resolve-fail" != true) warning debug ] \ $ScriptName ("Resolving name '" . $HostInfo->"resolve" . [ $IfThenElse \ ($HostInfo->"resolve" != $HostInfo->"name") ("' for " . $Type . " '" . \ - $HostInfo->"name") "" ] . "' failed: " . $Err); + $HostInfo->"name") "" ] . "' failed third time: " . $Err); } } } From 721e786f68cccfa789874545889169212b37bf11 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 21 Jul 2025 10:52:22 +0200 Subject: [PATCH 726/893] netwatch-notify: increase the address-list timeout even further --- netwatch-notify.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netwatch-notify.rsc b/netwatch-notify.rsc index 12f2721..1fcc203 100644 --- a/netwatch-notify.rsc +++ b/netwatch-notify.rsc @@ -62,14 +62,14 @@ :local FwAddrList ($ScriptName . "-" . [ $GetRandom20CharAlNum ]); :if ([ :typeof [ :toip $Expected ] ] = "ip") do={ - /ip/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=10s; + /ip/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=30s; :delay 20ms; :if ([ :len [ /ip/firewall/address-list/find where list=$FwAddrList address=$Expected ] ] > 0) do={ :return true; } } :if ([ :typeof [ :toip6 $Expected ] ] = "ip6") do={ - /ipv6/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=10s; + /ipv6/firewall/address-list/add address=$Name list=$FwAddrList dynamic=yes timeout=30s; :delay 20ms; :if ([ :len [ /ipv6/firewall/address-list/find where list=$FwAddrList address=$Expected ] ] > 0) do={ :return true; From a856d309df956db8bd93647a1998c95afe38da02 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 28 Jul 2025 16:47:27 +0200 Subject: [PATCH 727/893] global-functions: $SymbolByUnicodeName: allow to add more symbols... ... for example from a module. Add a script `mod/symbols-extra` with something like: :global SymbolsExtra; :set ($SymbolsExtra->"rocket") "\F0\9F\9A\80"; --- global-functions.rsc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 829cbf2..40c3817 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1608,7 +1608,9 @@ :global LogPrintOnce; - :local Symbols { + :global SymbolsExtra; + + :local Symbols ({ "abacus"="\F0\9F\A7\AE"; "alarm-clock"="\E2\8F\B0"; "arrow-down"="\E2\AC\87"; @@ -1643,7 +1645,7 @@ "star"="\E2\AD\90"; "warning-sign"="\E2\9A\A0"; "white-heavy-check-mark"="\E2\9C\85" - } + }, $SymbolsExtra); :if ([ :len ($Symbols->$Name) ] = 0) do={ $LogPrintOnce warning $0 ("No symbol available for name '" . $Name . "'!"); From fe080c0d3de677da9ac7a6831429e51c373a7b30 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 16 Aug 2025 23:06:56 +0200 Subject: [PATCH 728/893] global-functions: $CertificateAvailable: properly handle duplicate CN MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There are CA certificates with identical CommonName out there... 🤪 Let's handle these. [admin@MikroTik] > /certificate/print proplist=common-name,skid where common-name="GlobalSign"; Flags: T - TRUSTED Columns: COMMON-NAME, SKID # COMMON-NAME SKID 0 T GlobalSign 8FF04B7FA82E4524AE4D50FA639A8BDEE2DD1BBC 1 T GlobalSign 3DE629489BEA07CA21444A26DE6EDED283D09F59 2 T GlobalSign AE6C05A39313E2A2E7E2D71CD6C7F07FC86753A0 3 T GlobalSign 54B07BAD45B8E2407FFB0A6EFBBE33C93CA384D5 --- global-functions.rsc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 40c3817..10d1b41 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -133,6 +133,11 @@ } } + :if ([ :len [ /certificate/find where common-name=$CommonName ] ] > 1) do={ + $LogPrint info $0 ("There are " . $CertCount . " Certificates with CommonName '" . $CommonName . "'. Should be ok."); + :return true; + } + :local CertVal [ /certificate/get [ find where common-name=$CommonName ] ]; :while (($CertVal->"akid") != "" && ($CertVal->"akid") != ($CertVal->"skid")) do={ :if ([ :len [ /certificate/find where skid=($CertVal->"akid") ] ] = 0) do={ From 386ea2419f29c5948ff79bbb19adee8336612f40 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 25 Aug 2025 11:03:47 +0200 Subject: [PATCH 729/893] check-health: fix variable name --- check-health.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/check-health.rsc b/check-health.rsc index 4cb9940..8cffbfc 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -92,10 +92,10 @@ :onerror Err { /system/script/run $Plugin; } do={ - $LogPrint error $ScriptName ("Plugin '" . $ScriptVal->"name" . "' failed to run: " . $Err); + $LogPrint error $ScriptName ("Plugin '" . $PluginVal->"name" . "' failed to run: " . $Err); } } else={ - $LogPrint error $ScriptName ("Plugin '" . $ScriptVal->"name" . "' failed syntax validation, skipping."); + $LogPrint error $ScriptName ("Plugin '" . $PluginVal->"name" . "' failed syntax validation, skipping."); } } From 2fed8f967b9c60d8a5742aadb0004d18dccf466c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 23 Aug 2025 23:20:51 +0200 Subject: [PATCH 730/893] check-health: pass script name to plugin --- check-health.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check-health.rsc b/check-health.rsc index 8cffbfc..760636d 100644 --- a/check-health.rsc +++ b/check-health.rsc @@ -101,7 +101,7 @@ :foreach PluginName,Discard in=$CheckHealthPlugins do={ ($CheckHealthPlugins->$PluginName) \ - ("\$CheckHealthPlugins->\"" . $PluginName . "\""); + ("\$CheckHealthPlugins->\"" . $PluginName . "\"") $ScriptName; } :set CheckHealthPlugins; From 907358cb857b9cc32171191e851e1de7894e225d Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 23 Aug 2025 23:24:13 +0200 Subject: [PATCH 731/893] check-health.d/state: use script name for origin in notification --- check-health.d/state.rsc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/check-health.d/state.rsc b/check-health.d/state.rsc index 2991935..5e4cbb8 100644 --- a/check-health.d/state.rsc +++ b/check-health.d/state.rsc @@ -11,7 +11,8 @@ :global CheckHealthPlugins; :set ($CheckHealthPlugins->[ :jobname ]) do={ - :local FuncName [ :tostr $0 ]; + :local FuncName [ :tostr $0 ]; + :local ScriptName [ :tostr $1 ]; :global CheckHealthLast; :global Identity; @@ -32,13 +33,13 @@ :if ([ :typeof ($CheckHealthLast->$Name) ] != "nothing") do={ :if ($CheckHealthLast->$Name = "ok" && \ $Value != "ok") do={ - $SendNotification2 ({ origin=$FuncName; \ + $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "cross-mark" ] . "Health warning: " . $Name); \ message=("The device '" . $Name . "' on " . $Identity . " failed!") }); } :if ($CheckHealthLast->$Name != "ok" && \ $Value = "ok") do={ - $SendNotification2 ({ origin=$FuncName; \ + $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "white-heavy-check-mark" ] . "Health recovery: " . $Name); \ message=("The device '" . $Name . "' on " . $Identity . " recovered!") }); } From 62ca30b5d35d9f8c74ff8a8f4f05f4a2e8301a6f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 23 Aug 2025 23:24:29 +0200 Subject: [PATCH 732/893] check-health.d/temperature: use script name for origin in notification --- check-health.d/temperature.rsc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/check-health.d/temperature.rsc b/check-health.d/temperature.rsc index a2f632d..9f3f1a5 100644 --- a/check-health.d/temperature.rsc +++ b/check-health.d/temperature.rsc @@ -11,7 +11,8 @@ :global CheckHealthPlugins; :set ($CheckHealthPlugins->[ :jobname ]) do={ - :local FuncName [ :tostr $0 ]; + :local FuncName [ :tostr $0 ]; + :local ScriptName [ :tostr $1 ]; :global CheckHealthLast; :global CheckHealthTemperature; @@ -54,7 +55,7 @@ } :if ($Value > $CheckHealthTemperature->$Name && \ $CheckHealthTemperatureNotified->$Name != true) do={ - $SendNotification2 ({ origin=$FuncName; \ + $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "fire" ] . "Health warning: " . $Name); \ message=("The " . $Name . " on " . $Identity . " is above threshold: " . \ $Value . "\C2\B0" . "C") }); @@ -62,7 +63,7 @@ } :if ($Value <= ($CheckHealthTemperature->$Name - $CheckHealthTemperatureDeviation) && \ $CheckHealthTemperatureNotified->$Name = true) do={ - $SendNotification2 ({ origin=$FuncName; \ + $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "white-heavy-check-mark" ] . "Health recovery: " . $Name); \ message=("The " . $Name . " on " . $Identity . " dropped below threshold: " . \ $Value . "\C2\B0" . "C") }); From 22e6383e86cc345618aafc6401e9943696b3100b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sat, 23 Aug 2025 23:24:46 +0200 Subject: [PATCH 733/893] check-health.d/voltage: use script name for origin in notification --- check-health.d/voltage.rsc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/check-health.d/voltage.rsc b/check-health.d/voltage.rsc index 9071c88..5891fb4 100644 --- a/check-health.d/voltage.rsc +++ b/check-health.d/voltage.rsc @@ -11,7 +11,8 @@ :global CheckHealthPlugins; :set ($CheckHealthPlugins->[ :jobname ]) do={ - :local FuncName [ :tostr $0 ]; + :local FuncName [ :tostr $0 ]; + :local ScriptName [ :tostr $1 ]; :global CheckHealthLast; :global CheckHealthVoltageLow; @@ -39,7 +40,7 @@ :if ($NumLast * (100 + $CheckHealthVoltagePercent) < $NumCurr * 100 || \ $NumLast * 100 > $NumCurr * (100 + $CheckHealthVoltagePercent)) do={ - $SendNotification2 ({ origin=$FuncName; \ + $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification ("high-voltage-sign,chart-" . [ $IfThenElse ($NumLast < \ $NumCurr) "in" "de" ] . "creasing") ] . "Health warning: " . $Name); \ message=("The " . $Name . " on " . $Identity . " jumped more than " . $CheckHealthVoltagePercent . "%.\n\n" . \ @@ -47,12 +48,12 @@ [ $FormatLine "new value" ($Value . " V") 12 ]) }); } else={ :if ($NumCurr <= $CheckHealthVoltageLow && $NumLast > $CheckHealthVoltageLow) do={ - $SendNotification2 ({ origin=$FuncName; \ + $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "high-voltage-sign,chart-decreasing" ] . "Health warning: Low " . $Name); \ message=("The " . $Name . " on " . $Identity . " dropped to " . $Value . " V below hard limit.") }); } :if ($NumCurr > $CheckHealthVoltageLow && $NumLast <= $CheckHealthVoltageLow) do={ - $SendNotification2 ({ origin=$FuncName; \ + $SendNotification2 ({ origin=$ScriptName; \ subject=([ $SymbolForNotification "high-voltage-sign,chart-increasing" ] . "Health recovery: Low " . $Name); \ message=("The " . $Name . " on " . $Identity . " recovered to " . $Value . " V above hard limit.") }); } From 6b0c9ab17d2e7e3693cebf281e5300d1e4de3446 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 15 Sep 2025 13:10:12 +0200 Subject: [PATCH 734/893] packages-update: exit early if scheduler exists --- packages-update.rsc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages-update.rsc b/packages-update.rsc index d3140f2..cfe5222 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -41,6 +41,11 @@ /system/reboot; } + :if ([ /system/scheduler/find where name="_RebootForUpdate" ] > 0) do={ + $LogPrint warning $ScriptName ("Scheduler for reboot already exists."); + :return false; + } + :local Interval [ $IfThenElse ([ :totime $PackagesUpdateDeferReboot ] >= 1d) \ $PackagesUpdateDeferReboot 1d ]; :local StartTime [ :tostr [ :totime (10800 + [ $GetRandomNumber 7200 ]) ] ]; From 2773fef9d80fe8f7e2abdec767da5c5dcb64ddaf Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 19 Sep 2025 17:20:37 +0200 Subject: [PATCH 735/893] global-functions: $WaitForFile: try less expensive operation Checking a specific file is less expensive operation than finding one, especially when on hardware with huge storage and lots of files (like RDS). We have to keep the find command in the latter loop, though. --- global-functions.rsc | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index 10d1b41..98bc306 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1787,14 +1787,11 @@ :local Delay ([ $MAX [ $EitherOr $WaitTime 2s ] 100ms ] / 9); :do { - :retry { - :if ([ :len [ /file/find where name=$FileName ] ] = 0) do={ - :error false; - } + :retry { + /file/get $FileName; + :return true; } delay=$Delay max=10; - } on-error={ - :return false; - } + } on-error={ } :while ([ :len [ /file/find where name=$FileName ] ] > 0) do={ :do { From 2c715096b994811fbc914f68412db91f5bd62618 Mon Sep 17 00:00:00 2001 From: Miquel Bonastre Date: Wed, 24 Sep 2025 15:17:36 +0200 Subject: [PATCH 736/893] mod/ssh-keys-import: $SSHKeysImportFile: fix file exists condition... ... which broke in commit 80aed200fd7400e4a4958ba314912488780be635. --- mod/ssh-keys-import.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index 7bdc95d..dd32fd6 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -85,7 +85,7 @@ :return false; } - :if ([ $FileExists $FileName ] = true) do={ + :if ([ $FileExists $FileName ] = false) do={ $LogPrint warning $0 ("File '" . $FileName . "' does not exist."); :return false; } From 14b51d96b0b9fd80e0364407f377c26e8e0222ec Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 16 Sep 2025 12:01:32 +0200 Subject: [PATCH 737/893] generate valid HTML, including head & style --- Makefile | 4 ++-- contrib/html.sh | 9 +++++++++ contrib/html.sh.d/head.html | 15 +++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100755 contrib/html.sh create mode 100644 contrib/html.sh.d/head.html diff --git a/Makefile b/Makefile index 8951741..0265a51 100644 --- a/Makefile +++ b/Makefile @@ -11,8 +11,8 @@ HTML = $(MARKDOWN:.md=.html) all: $(CAPSMAN) $(LOCAL) $(WIFI) $(HTML) checksums.json -%.html: %.md Makefile - markdown $< | sed 's/href="\([-_\./[:alnum:]]*\)\.md"/href="\1.html"/g' > $@ +%.html: %.md contrib/html.sh contrib/html.sh.d/head.html + contrib/html.sh $< > $@ %.capsman.rsc: %.template.rsc Makefile sed -e '/\/interface\/wifi\//d' -e '/\/interface\/wireless\//d' -e 's|%TEMPL%|.capsman|' \ diff --git a/contrib/html.sh b/contrib/html.sh new file mode 100755 index 0000000..bbd8ba8 --- /dev/null +++ b/contrib/html.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +set -e + +sed "s|__TITLE__|$(head -n1 "${1}")|" < "${0}.d/head.html" +markdown -f toc,idanchor "${1}" | sed \ + -e 's/href="\([-_\./[:alnum:]]*\)\.md"/href="\1.html"/g' \ + -e '/| id="\L\1">|' +printf '' diff --git a/contrib/html.sh.d/head.html b/contrib/html.sh.d/head.html new file mode 100644 index 0000000..1b1dd03 --- /dev/null +++ b/contrib/html.sh.d/head.html @@ -0,0 +1,15 @@ + +RouterOS Scripts :: __TITLE__ + + + + From a931cb61a033949a9cc6a1b62bc1e267774b04a6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 30 Sep 2025 10:02:20 +0200 Subject: [PATCH 738/893] packages-update: fix condition when checking for scheduler This broke with commit 6b0c9ab17d2e7e3693cebf281e5300d1e4de3446... --- packages-update.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages-update.rsc b/packages-update.rsc index cfe5222..379e818 100644 --- a/packages-update.rsc +++ b/packages-update.rsc @@ -41,7 +41,7 @@ /system/reboot; } - :if ([ /system/scheduler/find where name="_RebootForUpdate" ] > 0) do={ + :if ([ :len [ /system/scheduler/find where name="_RebootForUpdate" ] ] > 0) do={ $LogPrint warning $ScriptName ("Scheduler for reboot already exists."); :return false; } From 48d0f1f0b94fe6538bec54559e6e1f1609877039 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 2 Oct 2025 11:51:08 +0200 Subject: [PATCH 739/893] fw-addr-lists: check last character of line for JSON This is not a proof, but a line also ending with a curly bracket has higher probability of being valid JSON. Better safe than sorry... We are suffering a CVE in RouterOS: https://www.cve.org/CVERecord?id=CVE-2025-10948 --- fw-addr-lists.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 0c45f7e..d56d40f 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -103,7 +103,7 @@ :foreach Line in=[ :deserialize $Data delimiter="\n" from=dsv options=dsv.plain ] do={ :set Line ($Line->0); :local Address; - :if ([ :pick $Line 0 1 ] = "{") do={ + :if ([ :pick $Line 0 1 ] = "{" && [ :pick $Line ([ :len $Line ] - 1) ] = "}") do={ :do { :set Address [ :tostr ([ :deserialize from=json $Line ]->"cidr") ]; } on-error={ } From 5ffa85f8bfb5ed11c3f3886e3b8cd7b5346b6efa Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 7 Oct 2025 16:02:53 +0200 Subject: [PATCH 740/893] mod/ssh-keys-import: handle new parameter With RouterOS 7.21beta2 the user SSH keys "key-owner" field was renamed to "info". Either of both is displayed in red by syntax highlighting, but it works anyway. --- doc/mod/ssh-keys-import.md | 5 +++-- mod/ssh-keys-import.rsc | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/doc/mod/ssh-keys-import.md b/doc/mod/ssh-keys-import.md index 344f4bc..49276d0 100644 --- a/doc/mod/ssh-keys-import.md +++ b/doc/mod/ssh-keys-import.md @@ -38,8 +38,9 @@ import that key: $SSHKeysImport "ssh-rsa AAAAB3Nza...QYZk8= user" admin; The third part of the key (`user` in this example) is inherited as -`key-owner` in RouterOS. Also the `MD5` fingerprint is recorded, this helps -to audit and verify the available keys. +`key-owner` in RouterOS (or `info` starting with RouterOS 7.21beta2). Also +the `MD5` fingerprint is recorded, this helps to audit and verify the +available keys. > ℹ️️ **Info**: Use `ssh-keygen` to show a fingerprint of an existing public > key file: `ssh-keygen -l -E md5 -f ~/.ssh/id_ed25519.pub` diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc index dd32fd6..8bea64e 100644 --- a/mod/ssh-keys-import.rsc +++ b/mod/ssh-keys-import.rsc @@ -40,7 +40,9 @@ :local FingerPrintMD5 [ :convert from=base64 transform=md5 to=hex ($KeyVal->1) ]; - :if ([ :len [ /user/ssh-keys/find where user=$User key-owner~("\\bmd5=" . $FingerPrintMD5 . "\\b") ] ] > 0) do={ + :local RegEx ("\\bmd5=" . $FingerPrintMD5 . "\\b"); + :if ([ :len [ /user/ssh-keys/find where user=$User \ + (key-owner~$RegEx or info~$RegEx) ] ] > 0) do={ $LogPrint warning $0 ("The ssh public key (MD5:" . $FingerPrintMD5 . \ ") is already available for user '" . $User . "'."); :return false; From 9ceed0926a749c51ebc050d80cd33100ecdbcc5a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 8 Oct 2025 16:02:20 +0200 Subject: [PATCH 741/893] fw-addr-lists: do not use IPv6 net addresses smaller /64 This should reduce the number of addresses in list by aggregating them, and also fix addresses with host part set (like 2001:470:1:fb5::2a0/64, which should be 2001:470:1:fb5::/64 really). The latter caused new warnings with RouterOS 7.21beta2. --- fw-addr-lists.rsc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index d56d40f..2b5fd0c 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -25,6 +25,7 @@ :global LogPrint; :global LogPrintOnce; :global LogPrintVerbose; + :global MIN; :global ScriptLock; :global WaitFullyConnected; @@ -120,9 +121,14 @@ :error true; } :if ($Address ~ "^[0-9a-zA-Z]*:[0-9a-zA-Z:\\.]+(/[0-9]{1,3})?\$") do={ - :if ([ :typeof [ :find $Address "/" ] ] = "nil") do={ - :set Address ($Address . "/128"); + :local Net $Address; + :local Cidr 64; + :local Slash [ :find $Address "/" ]; + :if ([ :typeof $Slash ] = "num") do={ + :set Net [ :toip6 [ :pick $Address 0 $Slash ] ] + :set Cidr [ $MIN [ :pick $Address ($Slash + 1) [ :len $Address ] ] 64 ]; } + :set Address (([ :toip6 $Net ] & ffff:ffff:ffff:ffff::) . "/" . $Cidr); :set ($IPv6Addresses->$Branch->$Address) $TimeOut; :error true; } From 35b556f0b20f79e2beb5d99c25159b3255124833 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 8 Oct 2025 16:23:15 +0200 Subject: [PATCH 742/893] fw-addr-lists: calculate branch after post-processing... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ... as branch will likely change, and we want to avoid duplicates. 😉 --- fw-addr-lists.rsc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 2b5fd0c..cd136f9 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -112,11 +112,12 @@ :set Address ([ :pick $Line 0 [ $FindDelim $Line ] ] . ($List->"cidr")); } :do { - :local Branch [ $GetBranch $Address ]; + :local Branch; :if ($Address ~ "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}(/[0-9]{1,2})?\$") do={ :if ($Address ~ "/32\$") do={ :set Address [ :pick $Address 0 ([ :len $Address ] - 3) ]; } + :set Branch [ $GetBranch $Address ]; :set ($IPv4Addresses->$Branch->$Address) $TimeOut; :error true; } @@ -129,10 +130,12 @@ :set Cidr [ $MIN [ :pick $Address ($Slash + 1) [ :len $Address ] ] 64 ]; } :set Address (([ :toip6 $Net ] & ffff:ffff:ffff:ffff::) . "/" . $Cidr); + :set Branch [ $GetBranch $Address ]; :set ($IPv6Addresses->$Branch->$Address) $TimeOut; :error true; } :if ($Address ~ "^[\\.a-zA-Z0-9-]+\\.[a-zA-Z]{2,}\$") do={ + :set Branch [ $GetBranch $Address ]; :set ($IPv4Addresses->$Branch->$Address) $TimeOut; :set ($IPv6Addresses->$Branch->$Address) $TimeOut; :error true; From c81618b57166cbc066aa476a31a32cee421314a8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 9 Oct 2025 09:22:39 +0200 Subject: [PATCH 743/893] log-forward: always use memo symbol... ... and add warning sign on top. --- log-forward.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/log-forward.rsc b/log-forward.rsc index be7eff7..3d7d054 100644 --- a/log-forward.rsc +++ b/log-forward.rsc @@ -95,7 +95,7 @@ :set LogForwardRateLimit ($LogForwardRateLimit + 10); $SendNotification2 ({ origin=$ScriptName; \ - subject=([ $SymbolForNotification [ $IfThenElse ($Warning = true) "warning-sign" "memo" ] ] . \ + subject=([ $SymbolForNotification ("memo" . [ $IfThenElse ($Warning = true) ",warning-sign" ]) ] . \ "Log Forwarding"); \ message=("The log on " . $Identity . " contains " . [ $IfThenElse ($Count = 1) "this message" \ ("these " . $Count . " messages") ] . " after " . [ /system/resource/get uptime ] . " uptime." . \ From 6630d35eea6510834287a7004e55718f49a6232f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 13 Oct 2025 12:06:01 +0200 Subject: [PATCH 744/893] mod/notification-telegram: $FlushTelegramQueue: check for cert, again Chances are that messages have been queued before system was fully up or connected. Thus the certificate may be missing, and it should be checked again for on flush. --- mod/notification-telegram.rsc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index 2eb90e1..ff9b4da 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -21,6 +21,7 @@ :global TelegramQueue; :global TelegramMessageIDs; + :global CertificateAvailable; :global IsFullyConnected; :global LogPrint; @@ -29,6 +30,11 @@ :return false; } + :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={ + $LogPrint warning $0 ("Downloading required certificate failed."); + :return false; + } + :local AllDone true; :local QueueLen [ :len $TelegramQueue ]; From 025b492783ad5a3dd084a6ecf4465878c970970c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 16 Oct 2025 10:27:27 +0200 Subject: [PATCH 745/893] global-functions: remove trailing space --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 98bc306..55b5292 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -465,7 +465,7 @@ :local Error [ :tostr $3 ]; :global IfThenElse; - :global LogPrint; + :global LogPrint; :if ($ExitOK = "false") do={ $LogPrint error $Name ([ $IfThenElse ([ :pick $Name 0 1 ] = "\$") \ From def540c965c40c28cce5ceef00e25132f5ab2d3f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 16 Oct 2025 10:26:50 +0200 Subject: [PATCH 746/893] global-functions: introduce $NetMask4 --- global-functions.rsc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 55b5292..5c98a20 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -61,6 +61,7 @@ :global MAX; :global MIN; :global MkDir; +:global NetMask4; :global NotificationFunctions; :global ParseDate; :global ParseKeyValueStore; @@ -990,6 +991,13 @@ :return true; } +# return an IPv4 netmask for CIDR +:set NetMask4 do={ + :local CIDR [ :tonum $1 ]; + + :return ((255.255.255.255 << (32 - $CIDR)) & 255.255.255.255); +} + # prepare NotificationFunctions array :if ([ :typeof $NotificationFunctions ] != "array") do={ :set NotificationFunctions ({}); From 9fa11cb79a2d0e23ff73b1317fdff123636fca10 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 16 Oct 2025 10:42:23 +0200 Subject: [PATCH 747/893] mod/ipcalc: use $NetMask4 --- mod/ipcalc.rsc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mod/ipcalc.rsc b/mod/ipcalc.rsc index eacff6d..fecf6f2 100644 --- a/mod/ipcalc.rsc +++ b/mod/ipcalc.rsc @@ -34,9 +34,12 @@ # calculate and return netmask, network, min host, max host and broadcast :set IPCalcReturn do={ :local Input [ :tostr $1 ]; + + :global NetMask4; + :local Address [ :toip [ :pick $Input 0 [ :find $Input "/" ] ] ]; :local Bits [ :tonum [ :pick $Input ([ :find $Input "/" ] + 1) [ :len $Input ] ] ]; - :local Mask ((255.255.255.255 << (32 - $Bits)) & 255.255.255.255); + :local Mask [ $NetMask4 $Bits ]; :local Return { "address"=$Address; From 47309e5c03e32e05ed9435ed05f9549dfddd338f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 16 Oct 2025 13:02:28 +0200 Subject: [PATCH 748/893] fw-addr-lists: normalize IPv4 addresses --- fw-addr-lists.rsc | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index cd136f9..26e041a 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -22,10 +22,12 @@ :global EitherOr; :global FetchHuge; :global HumanReadableNum; + :global IfThenElse; :global LogPrint; :global LogPrintOnce; :global LogPrintVerbose; :global MIN; + :global NetMask4; :global ScriptLock; :global WaitFullyConnected; @@ -114,8 +116,13 @@ :do { :local Branch; :if ($Address ~ "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}(/[0-9]{1,2})?\$") do={ - :if ($Address ~ "/32\$") do={ - :set Address [ :pick $Address 0 ([ :len $Address ] - 3) ]; + :local Net $Address; + :local CIDR 32; + :local Slash [ :find $Address "/" ]; + :if ([ :typeof $Slash ] = "num") do={ + :set Net [ :toip [ :pick $Address 0 $Slash ] ] + :set CIDR [ :pick $Address ($Slash + 1) [ :len $Address ] ]; + :set Address [ :tostr (([ :toip $Net ] & [ $NetMask4 $CIDR ]) . [ $IfThenElse ($CIDR < 32) ("/" . $CIDR) ]) ]; } :set Branch [ $GetBranch $Address ]; :set ($IPv4Addresses->$Branch->$Address) $TimeOut; From 6ad6f9aa08d558ff2e8ff3010fe5daec3c600c4a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 16 Oct 2025 10:30:20 +0200 Subject: [PATCH 749/893] global-functions: introduce $NetMask6 RouterOS does not support bit shifting on IPv6 data types, so we have to split the problem: * each 16 bit block is calculated separately, as number * the complete netmask is assembled in a loop, as string * the final string is casted to correct data type --- global-functions.rsc | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 5c98a20..ffa5277 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -62,6 +62,7 @@ :global MIN; :global MkDir; :global NetMask4; +:global NetMask6; :global NotificationFunctions; :global ParseDate; :global ParseKeyValueStore; @@ -998,6 +999,24 @@ :return ((255.255.255.255 << (32 - $CIDR)) & 255.255.255.255); } +# return an IPv6 netmask for CIDR +:set NetMask6 do={ + :local FuncName $0; + :local CIDR [ :tostr $1 ]; + + :global IfThenElse; + :global MAX; + :global MIN; + + :local Mask ""; + :for I from=0 to=7 do={ + :set Mask ($Mask . \ + [ :convert from=num to=hex (0xffff - (0xffff >> [ :tonum [ $MIN [ $MAX ($CIDR - (16 * $I)) 0 ] 16 ] ])) ] . \ + [ $IfThenElse ($I < 7) ":" ]); + } + :return [ :toip6 $Mask ]; +} + # prepare NotificationFunctions array :if ([ :typeof $NotificationFunctions ] != "array") do={ :set NotificationFunctions ({}); From d7a6eb1d0083c1d788e8febedaea67464361d271 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 16 Oct 2025 15:13:14 +0200 Subject: [PATCH 750/893] global-functions: $NetMask6: implement simple caching The calculation is quite complex for something that needs to be done frequently, for example by `fw-addr-lists`. The number of possible netmasks is limited, so let's cache the results that were calculated already. --- global-functions.rsc | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index ffa5277..5ede654 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1008,13 +1008,25 @@ :global MAX; :global MIN; + :global NetMask6Cache; + + :if ([ :typeof ($NetMask6Cache->$CIDR) ] = "ip6") do={ + :return ($NetMask6Cache->$CIDR); + } + + :if ([ :typeof $NetMask6Cache ] = "nothing") do={ + :set NetMask6Cache ({}); + } + :local Mask ""; :for I from=0 to=7 do={ :set Mask ($Mask . \ [ :convert from=num to=hex (0xffff - (0xffff >> [ :tonum [ $MIN [ $MAX ($CIDR - (16 * $I)) 0 ] 16 ] ])) ] . \ [ $IfThenElse ($I < 7) ":" ]); } - :return [ :toip6 $Mask ]; + :set Mask [ :toip6 $Mask ]; + :set ($NetMask6Cache->$CIDR) $Mask; + :return $Mask; } # prepare NotificationFunctions array From ea05b69f7cfb1506e24117020a115af2d1b19c4a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 16 Oct 2025 13:02:14 +0200 Subject: [PATCH 751/893] fw-addr-lists: use $NetMask6 --- fw-addr-lists.rsc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index 26e041a..c85cc8b 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -26,8 +26,8 @@ :global LogPrint; :global LogPrintOnce; :global LogPrintVerbose; - :global MIN; :global NetMask4; + :global NetMask6; :global ScriptLock; :global WaitFullyConnected; @@ -130,13 +130,13 @@ } :if ($Address ~ "^[0-9a-zA-Z]*:[0-9a-zA-Z:\\.]+(/[0-9]{1,3})?\$") do={ :local Net $Address; - :local Cidr 64; + :local CIDR 128; :local Slash [ :find $Address "/" ]; :if ([ :typeof $Slash ] = "num") do={ :set Net [ :toip6 [ :pick $Address 0 $Slash ] ] - :set Cidr [ $MIN [ :pick $Address ($Slash + 1) [ :len $Address ] ] 64 ]; + :set CIDR [ :pick $Address ($Slash + 1) [ :len $Address ] ]; } - :set Address (([ :toip6 $Net ] & ffff:ffff:ffff:ffff::) . "/" . $Cidr); + :set Address (([ :toip6 $Net ] & [ $NetMask6 $CIDR ]) . "/" . $CIDR); :set Branch [ $GetBranch $Address ]; :set ($IPv6Addresses->$Branch->$Address) $TimeOut; :error true; From b80b872e557e2513c7e9ee4c6f119e3ad56d4116 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 16 Oct 2025 17:31:15 +0200 Subject: [PATCH 752/893] mod/ipcalc: support IPv6 Well, some of these values do not make a lot of sense for IPv6... Something to be cleaned up later. --- mod/ipcalc.rsc | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/mod/ipcalc.rsc b/mod/ipcalc.rsc index fecf6f2..d65d472 100644 --- a/mod/ipcalc.rsc +++ b/mod/ipcalc.rsc @@ -36,21 +36,32 @@ :local Input [ :tostr $1 ]; :global NetMask4; + :global NetMask6; - :local Address [ :toip [ :pick $Input 0 [ :find $Input "/" ] ] ]; + :local Address [ :pick $Input 0 [ :find $Input "/" ] ]; :local Bits [ :tonum [ :pick $Input ([ :find $Input "/" ] + 1) [ :len $Input ] ] ]; - :local Mask [ $NetMask4 $Bits ]; + :local Mask; + :local One; + :if ([ :typeof [ :toip $Address ] ] = "ip") do={ + :set Address [ :toip $Address ]; + :set Mask [ $NetMask4 $Bits ]; + :set One 0.0.0.1; + } else={ + :set Address [ :toip6 $Address ]; + :set Mask [ $NetMask6 $Bits ]; + :set One ::1; + } - :local Return { + :local Return ({ "address"=$Address; "netmask"=$Mask; "networkaddress"=($Address & $Mask); "networkbits"=$Bits; "network"=(($Address & $Mask) . "/" . $Bits); - "hostmin"=(($Address & $Mask) | 0.0.0.1); - "hostmax"=(($Address | ~$Mask) ^ 0.0.0.1); + "hostmin"=(($Address & $Mask) | $One); + "hostmax"=(($Address | ~$Mask) ^ $One); "broadcast"=($Address | ~$Mask); - } + }); :return $Return; } From 20987221d978c657fe453eefd1d8c284e93b6372 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 24 Oct 2025 16:16:18 +0200 Subject: [PATCH 753/893] mod/notification-email: ignore errors (for now...) Errors are returned since RouterOS 7.21beta2. We keep the current logic for now, as we want to support older RouterOS versions. This is something to be reworked later... --- mod/notification-email.rsc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index ad9762a..7c3a6ff 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -101,8 +101,11 @@ $LogPrint warning $0 ("File '" . $File . "' does not exist, can not attach."); } } - /tool/e-mail/send from=[ $EMailGenerateFrom ] to=($Message->"to") cc=($Message->"cc") \ - subject=($Message->"subject") body=($Message->"body") file=$Attach; + :do { + /tool/e-mail/send from=[ $EMailGenerateFrom ] to=($Message->"to") \ + cc=($Message->"cc") subject=($Message->"subject") \ + body=($Message->"body") file=$Attach; + } on-error={ } :local Wait true; :do { :delay 1s; From c88953e44d9b922988e7d5638743e165a5196765 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Nov 2025 22:07:23 +0100 Subject: [PATCH 754/893] README: fix typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We had it there since 39d1027d697c09ec709a1b847a185ccff3b00540... 😜 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 243e1fc..b0d26bd 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ First time users should take the long way below. Want to see it in action? I've had a presentation [Repository based RouterOS script distribution ↗️](https://www.youtube.com/watch?v=B9neG3oAhcY) -including demonstation recorded live at [MUM Europe +including demonstration recorded live at [MUM Europe 2019 ↗️](https://mum.mikrotik.com/2019/EU/) in Vienna. > ⚠️ **Warning**: Some details changed. So see the presentation, then follow From d100cac9ed37e4b79c587daf7c2bdba45c5c2ee7 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 11:20:29 +0100 Subject: [PATCH 755/893] README: add a line break before command --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b0d26bd..529bb4c 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ download the certificates. > 💡️ **Hint**: RouterOS 7.19 comes with a builtin certificate store. You > can skip the steps regarding certificate download and import and jump > to [installation of scripts](#installation-of-scripts) if you set the -> trust for these builtin trust anchors: +> trust for these builtin trust anchors: > `/certificate/settings/set builtin-trust-anchors=trusted;` If you intend to download the scripts from a @@ -173,7 +173,7 @@ This last step is required when ever you make changes to your configuration. > ℹ️ **Info**: It is recommended to edit the configuration using the command > line interface. If using Winbox on Windows OS, the line endings may be -> missing. To fix this run: +> missing. To fix this run: > `/system/script/set source=[ :tocrlf [ get global-config-overlay source ] ] global-config-overlay;` Updating scripts From 335266f2470593dfae33d6871abad7d2fe7297d2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 19 Nov 2025 16:18:10 +0100 Subject: [PATCH 756/893] README: update the screenshot for script update... ... to match commit 2c92c78b4647e43c44da567e98adee69b7857393. --- README.d/09-update-scripts.avif | Bin 1733 -> 1928 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/README.d/09-update-scripts.avif b/README.d/09-update-scripts.avif index f549fef5bd7a33f883044d25f3fcac68134b130f..a31d60b3a0066d1ee68abbf79fd48aa6d77ffdd0 100644 GIT binary patch delta 1713 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 T^8jiU8*(U{VZwl~v4`?B()a82 From 1a1399d3026918d2b9f89f13878fe2a66855d06b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 11:20:47 +0100 Subject: [PATCH 757/893] README: support new builtin-trust-store... ... which was introduced with RouterOS 7.21beta7. --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 529bb4c..b77538d 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,10 @@ download the certificates. > can skip the steps regarding certificate download and import and jump > to [installation of scripts](#installation-of-scripts) if you set the > trust for these builtin trust anchors: -> `/certificate/settings/set builtin-trust-anchors=trusted;` +> `/certificate/settings/set builtin-trust-anchors=trusted;` +> With RouterOS 7.21 the functionality was changed. Set this at minimum, +> but make sure not to drop other targets: +> `/certificate/settings/set builtin-trust-store=fetch;` If you intend to download the scripts from a different location (for example from github.com) install the corresponding From fbfeea30426ac9be62bdaf7392fbfc51d4143ae3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 11:38:31 +0100 Subject: [PATCH 758/893] INITIAL-COMMANDS: support new builtin-trust-store... ... which was introduced with RouterOS 7.21beta7. --- INITIAL-COMMANDS.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/INITIAL-COMMANDS.md b/INITIAL-COMMANDS.md index 40f609b..6e70b66 100644 --- a/INITIAL-COMMANDS.md +++ b/INITIAL-COMMANDS.md @@ -22,8 +22,11 @@ Run the complete base installation: :local CertFileName "ISRG-Root-X2.pem"; :local CertFingerprint "69729b8e15a86efc177a57afb7171dfc64add28c2fca8cf1507e34453ccb1470"; - :if (!(([ /certificate/settings/get ]->"builtin-trust-anchors") = "trusted" && \ - [[ :parse (":return [ :len [ /certificate/builtin/find where common-name=\"" . $CertCommonName . "\" ] ]") ]] > 0)) do={ + :local CertSettings [ /certificate/settings/get ]; + :if (!((($CertSettings->"builtin-trust-anchors") = "trusted" || \ + ($CertSettings->"builtin-trust-store") ~ "fetch" || \ + ($CertSettings->"builtin-trust-store") = "all") && \ + [[ :parse (":return [ :len [ /certificate/builtin/find where common-name=\"" . $CertCommonName . "\" ] ]") ]] > 0)) do={ :put "Importing certificate..."; /tool/fetch ($BaseUrl . "certs/" . $CertFileName) dst-path=$CertFileName as-value; :delay 1s; From db0a5bf33ce5ff585f568affbea3d399466159de Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 11:47:55 +0100 Subject: [PATCH 759/893] global-functions: $CertificateAvailable: support new builtin-trust-store... ... which was introduced with RouterOS 7.21beta7. --- global-functions.rsc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index eb837aa..9f92b07 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -106,11 +106,15 @@ # check and download required certificate :set CertificateAvailable do={ :local CommonName [ :tostr $1 ]; + :local UseFor [ :tostr $2 ]; :global CertificateDownload; + :global EitherOr; :global LogPrint; :global ParseKeyValueStore; + :set UseFor [ $EitherOr $UseFor "undefined" ]; + :if ([ /system/resource/get free-hdd-space ] < 8388608 && \ [ /certificate/settings/get crl-download ] = true && \ [ /certificate/settings/get crl-store ] = "system") do={ @@ -123,7 +127,10 @@ :return false; } - :if (([ /certificate/settings/get ]->"builtin-trust-anchors") = "trusted" && \ + :local CertSettings [ /certificate/settings/get ]; + :if ((($CertSettings->"builtin-trust-anchors") = "trusted" || \ + ($CertSettings->"builtin-trust-store") ~ $UseFor || \ + ($CertSettings->"builtin-trust-store") = "all") && \ [[ :parse (":return [ :len [ /certificate/builtin/find where common-name=\"" . $CommonName . "\" ] ]") ]] > 0) do={ :return true; } From 8eb397f79fafa90b078abe880dd3b2958ae95dad Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 11:59:28 +0100 Subject: [PATCH 760/893] global-functions: $DownloadPackage: define certificate use --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 9f92b07..412777c 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -404,7 +404,7 @@ :return true; } - :if ([ $CertificateAvailable "ISRG Root X1" ] = false) do={ + :if ([ $CertificateAvailable "ISRG Root X1" "fetch" ] = false) do={ $LogPrint error $0 ("Downloading required certificate failed."); :return false; } From f3e6e152bce0d2563f864a2d0652899c22c53918 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 12:01:11 +0100 Subject: [PATCH 761/893] global-functions: $GetMacVendor: define certificate use --- global-functions.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 412777c..d4c37a2 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -640,7 +640,7 @@ } :do { - :if ([ $CertificateAvailable "GTS Root R4" ] = false) do={ + :if ([ $CertificateAvailable "GTS Root R4" "fetch" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); :error false; } From b5a026966736f8c530e902d222dbf8dc4eea9cfd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 12:01:57 +0100 Subject: [PATCH 762/893] global-functions: $ScriptInstallUpdate: define certificate use --- global-functions.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global-functions.rsc b/global-functions.rsc index d4c37a2..48aaf7f 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1248,7 +1248,7 @@ :global SymbolForNotification; :global ValidateSyntax; - :if ([ $CertificateAvailable "ISRG Root X2" ] = false) do={ + :if ([ $CertificateAvailable "ISRG Root X2" "fetch" ] = false) do={ $LogPrint warning $0 ("Downloading certificate failed, trying without."); } @@ -1299,7 +1299,7 @@ } :if ([ :len ($ScriptInfo->"certificate") ] > 0) do={ - :if ([ $CertificateAvailable ($ScriptInfo->"certificate") ] = false) do={ + :if ([ $CertificateAvailable ($ScriptInfo->"certificate") "fetch" ] = false) do={ $LogPrint warning $0 ("Downloading certificate failed, trying without."); } } From 876505c36dd2cafb9ce151a3051b1631fe09b3a1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 12:05:10 +0100 Subject: [PATCH 763/893] check-certificates: define certificate use --- check-certificates.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index f2d5c1f..3300bee 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -189,7 +189,7 @@ fingerprint!=[ :tostr ($CertVal->"fingerprint") ] expires-after>$CertRenewTime ]; :local CertNewVal [ /certificate/get $CertNew ]; - :if ([ $CertificateAvailable ([ $ParseKeyValueStore ($CertNewVal->"issuer") ]->"CN") ] = false) do={ + :if ([ $CertificateAvailable ([ $ParseKeyValueStore ($CertNewVal->"issuer") ]->"CN") "fetch" ] = false) do={ $LogPrint warning $ScriptName ("The certificate chain is not available!"); } From 677b5b8069194fdd5c1c2ddbbcd4da2c5eb0c52b Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 18 Nov 2025 16:50:09 +0100 Subject: [PATCH 764/893] doc/mod/ssh-keys-import: create code block with indention --- doc/mod/ssh-keys-import.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/doc/mod/ssh-keys-import.md b/doc/mod/ssh-keys-import.md index 49276d0..abf4d39 100644 --- a/doc/mod/ssh-keys-import.md +++ b/doc/mod/ssh-keys-import.md @@ -51,12 +51,10 @@ The functions `$SSHKeysImportFile` can read an `authorized_keys`-style file and import all the keys. The user given to the function can be overwritting from comments in the file. Create a file `keys.pub` with this content: -``` -ssh-ed25519 AAAAC3Nza...3OcN8A user@client -ssh-rsa AAAAB3Nza...ozyts= worker@station -# user=example -ssh-rsa AAAAB3Nza...GXQVk= person@host -``` + ssh-ed25519 AAAAC3Nza...3OcN8A user@client + ssh-rsa AAAAB3Nza...ozyts= worker@station + # user=example + ssh-rsa AAAAB3Nza...GXQVk= person@host Then import it with: From 87787eefe3425b29e5fffe0c636adffc04208de6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 12:06:03 +0100 Subject: [PATCH 765/893] fw-addr-lists: define certificate use --- fw-addr-lists.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index c85cc8b..e5a71aa 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -74,7 +74,7 @@ :if ([ :len ($List->"cert") ] > 0) do={ :set CheckCertificate true; - :if ([ $CertificateAvailable ($List->"cert") ] = false) do={ + :if ([ $CertificateAvailable ($List->"cert") "fetch" ] = false) do={ $LogPrint warning $ScriptName ("Downloading required certificate (" . $FwListName . \ " / " . $List->"url" . ") failed, trying anyway."); } From affb9b3baf44fe84089a5b4059b93b336f29b21c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 18 Nov 2025 16:52:21 +0100 Subject: [PATCH 766/893] doc/mode-button: create code block with indention --- doc/mode-button.md | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/doc/mode-button.md b/doc/mode-button.md index be15bc9..af95ddb 100644 --- a/doc/mode-button.md +++ b/doc/mode-button.md @@ -26,17 +26,15 @@ can configure the reset button to act the same, see Copy this code to terminal to check: -``` -:if ([ :len [ /system/routerboard/mode-button/print as-value ] ] > 0) do={ - :put "Mode button is supported."; -} else={ - :if ([ :len [ /system/routerboard/reset-button/print as-value ] ] > 0) do={ - :put "Mode button is not supported, but reset button is."; - } else={ - :put "Neither mode button nor reset button is supported."; - } -} -``` + :if ([ :len [ /system/routerboard/mode-button/print as-value ] ] > 0) do={ + :put "Mode button is supported."; + } else={ + :if ([ :len [ /system/routerboard/reset-button/print as-value ] ] > 0) do={ + :put "Mode button is not supported, but reset button is."; + } else={ + :put "Neither mode button nor reset button is supported."; + } + } Requirements and installation ----------------------------- From 8ff34a2408b920dcdb59b2ea48d70148496553e2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 12:10:22 +0100 Subject: [PATCH 767/893] mod/notification-ntfy: define certificate use --- mod/notification-ntfy.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/notification-ntfy.rsc b/mod/notification-ntfy.rsc index 7114020..dd10812 100644 --- a/mod/notification-ntfy.rsc +++ b/mod/notification-ntfy.rsc @@ -109,7 +109,7 @@ :onerror Err { :if ($Server = "ntfy.sh") do={ - :if ([ $CertificateAvailable "ISRG Root X1" ] = false) do={ + :if ([ $CertificateAvailable "ISRG Root X1" "fetch" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); :error false; } From 090f25a82d862eaa5db86a18f9d570084e20e2b5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 12:04:13 +0100 Subject: [PATCH 768/893] check-certificates: add missing semicolon --- check-certificates.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check-certificates.rsc b/check-certificates.rsc index c10e33b..f2d5c1f 100644 --- a/check-certificates.rsc +++ b/check-certificates.rsc @@ -21,7 +21,7 @@ :global CertWarnTime; :global Identity; - :global CertificateAvailable + :global CertificateAvailable; :global EscapeForRegEx; :global IfThenElse; :global LogPrint; From f0910a44723feccbf5fb25340985cd654f310cd1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 12:09:43 +0100 Subject: [PATCH 769/893] mod/notification-telegram: define certificate use --- mod/notification-telegram.rsc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mod/notification-telegram.rsc b/mod/notification-telegram.rsc index ff9b4da..b1996a3 100644 --- a/mod/notification-telegram.rsc +++ b/mod/notification-telegram.rsc @@ -30,7 +30,7 @@ :return false; } - :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={ + :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" "fetch" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); :return false; } @@ -72,7 +72,7 @@ :global CertificateAvailable; :global LogPrint; - :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={ + :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" "fetch" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); :return false; } @@ -197,7 +197,7 @@ "&reply_to_message_id=" . ($Notification->"replyto") . "&message_thread_id=" . $ThreadId . \ "&disable_web_page_preview=true&parse_mode=MarkdownV2"); :onerror Err { - :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={ + :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" "fetch" ] = false) do={ $LogPrint warning $0 ("Downloading required certificate failed."); :error false; } From 83b164d5115931209452940b2350dcd8077b139a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 11:58:23 +0100 Subject: [PATCH 770/893] global-functions: $CertificateDownload: drop unused function --- global-functions.rsc | 1 - 1 file changed, 1 deletion(-) diff --git a/global-functions.rsc b/global-functions.rsc index 5ede654..3089d2e 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -161,7 +161,6 @@ :global ScriptUpdatesBaseUrl; :global ScriptUpdatesUrlSuffix; - :global CertificateAvailable; :global CertificateNameByCN; :global CleanName; :global FetchUserAgentStr; From 7772fbb22d6eb9118075c87230a43cf9b4926da5 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 12:07:22 +0100 Subject: [PATCH 771/893] netwatch-dns: define certificate use --- netwatch-dns.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netwatch-dns.rsc b/netwatch-dns.rsc index 9e2f9bc..eee5f85 100644 --- a/netwatch-dns.rsc +++ b/netwatch-dns.rsc @@ -112,7 +112,7 @@ :foreach DohServer in=$DohServers do={ :if ([ :len ($DohServer->"doh-cert") ] > 0) do={ - :if ([ $CertificateAvailable ($DohServer->"doh-cert") ] = false) do={ + :if ([ $CertificateAvailable ($DohServer->"doh-cert") "dns" ] = false) do={ $LogPrint warning $ScriptName ("Downloading certificate failed, trying without."); } } From 7d701483d333cec77c4b7cc6ce2bb4a8fc2eb81c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 30 Oct 2025 11:07:38 +0100 Subject: [PATCH 772/893] contrib/checksums: output to stdout... ... and let the Makefile redirect. --- Makefile | 2 +- contrib/checksums.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 0265a51..d8f2387 100644 --- a/Makefile +++ b/Makefile @@ -33,7 +33,7 @@ all: $(CAPSMAN) $(LOCAL) $(WIFI) $(HTML) checksums.json < $< > $@ checksums.json: contrib/checksums.sh *.rsc */*.rsc - contrib/checksums.sh + contrib/checksums.sh > $@ clean: rm -f $(HTML) checksums.json diff --git a/contrib/checksums.sh b/contrib/checksums.sh index b472b49..ab4e973 100755 --- a/contrib/checksums.sh +++ b/contrib/checksums.sh @@ -6,4 +6,4 @@ set -e md5sum $(find -name '*.rsc' | sort) | \ sed -e "s| \./||" -e 's|.rsc$||' | \ - jq --raw-input --null-input '[ inputs | split (" ") | { (.[1]): (.[0]) }] | add' > 'checksums.json' + jq --raw-input --null-input '[ inputs | split (" ") | { (.[1]): (.[0]) }] | add' From 5ccb0d07b120f1fd7af738d5eed3b20345e2c971 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 12:10:58 +0100 Subject: [PATCH 773/893] telegram-chat: define certificate use --- telegram-chat.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/telegram-chat.rsc b/telegram-chat.rsc index 7f7b7a7..54872fb 100644 --- a/telegram-chat.rsc +++ b/telegram-chat.rsc @@ -61,7 +61,7 @@ :set TelegramRandomDelay 0; } - :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" ] = false) do={ + :if ([ $CertificateAvailable "Go Daddy Root Certificate Authority - G2" "fetch" ] = false) do={ $LogPrint warning $ScriptName ("Downloading required certificate failed."); :set ExitOK true; :error false; From 20885c4620ec95e46d914fdbb4b63378e72c25d9 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Sun, 2 Nov 2025 09:19:16 +0100 Subject: [PATCH 774/893] global-functions: $ScriptInstallUpdate: give hint on ignore Fixes: https://github.com/eworm-de/routeros-scripts/issues/112 --- global-functions.rsc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 3089d2e..b5fc0eb 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1313,6 +1313,11 @@ $LogPrint warning $0 ("Removing dummy. Typo on installation?"); /system/script/remove $Script; } + :if ([ :len ($ScriptInfo->"base-url") ] = 0 && [ :len ($ScriptInfo->"url-suffix") ] = 0 && \ + [ :len $CheckSum ] = 0) do={ + $LogPrintOnce warning $0 \ + ("Added the script manually? Skip updates with 'ignore=true' in comment."); + } :error false; } From 335bfc0a88e0a79e3ae03ee72a81edda9f5d0c32 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 12:03:33 +0100 Subject: [PATCH 775/893] update-tunnelbroker: define certificate use --- update-tunnelbroker.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/update-tunnelbroker.rsc b/update-tunnelbroker.rsc index 9057e1e..5372f4c 100644 --- a/update-tunnelbroker.rsc +++ b/update-tunnelbroker.rsc @@ -28,7 +28,7 @@ :error false; } - :if ([ $CertificateAvailable "Starfield Root Certificate Authority - G2" ] = false) do={ + :if ([ $CertificateAvailable "Starfield Root Certificate Authority - G2" "fetch" ] = false) do={ $LogPrint error $ScriptName ("Downloading required certificate failed."); :set ExitOK true; :error false; From 298a43a871b28bcdc057310dbc5b7819944e4bb2 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Nov 2025 00:00:03 +0100 Subject: [PATCH 776/893] global-functions: $ScriptInstallUpdate: either or... ... but not both. --- global-functions.rsc | 1 + 1 file changed, 1 insertion(+) diff --git a/global-functions.rsc b/global-functions.rsc index b5fc0eb..2379f9b 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1312,6 +1312,7 @@ :if ($ScriptVal->"source" = "#!rsc by RouterOS\n") do={ $LogPrint warning $0 ("Removing dummy. Typo on installation?"); /system/script/remove $Script; + :error false; } :if ([ :len ($ScriptInfo->"base-url") ] = 0 && [ :len ($ScriptInfo->"url-suffix") ] = 0 && \ [ :len $CheckSum ] = 0) do={ From 737a872a5f768eea07b1b74439580e3ce98752cd Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 12:11:38 +0100 Subject: [PATCH 777/893] CERTIFICATES: define certificate use --- CERTIFICATES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CERTIFICATES.md b/CERTIFICATES.md index 69d6c18..0e0a867 100644 --- a/CERTIFICATES.md +++ b/CERTIFICATES.md @@ -61,7 +61,7 @@ Import a certificate by CommonName Running the function `$CertificateAvailable` with that name as parameter makes sure the certificate is available in the device's store: - $CertificateAvailable "ISRG Root X2"; + $CertificateAvailable "ISRG Root X2" "fetch"; If the certificate is actually available already nothing happens, and there is no output. Otherwise the certificate is downloaded and imported. From d002d1c0c04e90cd73e1b821e944c56321bfa1d8 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 3 Nov 2025 09:17:25 +0100 Subject: [PATCH 778/893] global-functions: $ScriptInstallUpdate: extra actions on 'not found' only --- global-functions.rsc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/global-functions.rsc b/global-functions.rsc index 2379f9b..eb837aa 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1309,6 +1309,10 @@ } } do={ $LogPrint warning $0 ("Failed fetching script '" . $ScriptVal->"name" . "': " . $Err); + :if ($Err != "Fetch failed with status 404") do={ + :error false; + } + :if ($ScriptVal->"source" = "#!rsc by RouterOS\n") do={ $LogPrint warning $0 ("Removing dummy. Typo on installation?"); /system/script/remove $Script; From cc5aea22b357cebb54741be1d71a99f0b28d8c3f Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 12:08:49 +0100 Subject: [PATCH 779/893] doc/mod/notification-matrix: define certificate use --- doc/mod/notification-matrix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/mod/notification-matrix.md b/doc/mod/notification-matrix.md index da6d6de..ad4cf4f 100644 --- a/doc/mod/notification-matrix.md +++ b/doc/mod/notification-matrix.md @@ -49,7 +49,7 @@ your server in device's certificate store. The example below is for `matrix.org`, which uses a trust chain from *Google Trust Services*. Run this to import the required certificate: - $CertificateAvailable "GTS Root R4"; + $CertificateAvailable "GTS Root R4" "fetch"; Replace the CA certificate name with what ever is needed for your server. You may want to find the From 8f6a38f2994a36742c6d200d74d4548bd9c2e356 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 17 Nov 2025 09:56:49 +0100 Subject: [PATCH 780/893] mod/notification-email: remove schedule with find... ... as a race condition could occur and the scheduler is already gone. --- mod/notification-email.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/notification-email.rsc b/mod/notification-email.rsc index 7c3a6ff..668daba 100644 --- a/mod/notification-email.rsc +++ b/mod/notification-email.rsc @@ -132,7 +132,7 @@ } :if ($AllDone = true && $QueueLen = [ :len $EmailQueue ]) do={ - /system/scheduler/remove $Scheduler; + /system/scheduler/remove [ find where name="_FlushEmailQueue" ]; :set EmailQueue; :return true; } From c6cc8b9a51c0f399c36823b33a6d282344f16416 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 22:19:44 +0100 Subject: [PATCH 781/893] README: move the QR code --- README.md | 2 +- README.d/upstream.png => general/qr-code.png | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename README.d/upstream.png => general/qr-code.png (100%) diff --git a/README.md b/README.md index b77538d..36408ec 100644 --- a/README.md +++ b/README.md @@ -404,7 +404,7 @@ immediately remove the link in question. Upstream -------- -[![upstream](README.d/upstream.png)](https://rsc.eworm.de/) +[![upstream](general/qr-code.png)](https://rsc.eworm.de/) URL: [GitHub.com](https://github.com/eworm-de/routeros-scripts#routeros-scripts) diff --git a/README.d/upstream.png b/general/qr-code.png similarity index 100% rename from README.d/upstream.png rename to general/qr-code.png From a2250a00e61edda3dadf7b253dc606713e036f56 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 23:19:15 +0100 Subject: [PATCH 782/893] README: add the upstream url verbatim --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 36408ec..3c69017 100644 --- a/README.md +++ b/README.md @@ -404,6 +404,8 @@ immediately remove the link in question. Upstream -------- +[rsc.eworm.de](https://rsc.eworm.de/) + [![upstream](general/qr-code.png)](https://rsc.eworm.de/) URL: From 97b4a41f238cbf6cb5417efa53a4ba7084356da1 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Thu, 13 Nov 2025 13:37:51 +0100 Subject: [PATCH 783/893] contrib/html: add empty lines... ... for easier rebasing. --- contrib/html.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contrib/html.sh b/contrib/html.sh index bbd8ba8..6942ecf 100755 --- a/contrib/html.sh +++ b/contrib/html.sh @@ -3,7 +3,9 @@ set -e sed "s|__TITLE__|$(head -n1 "${1}")|" < "${0}.d/head.html" + markdown -f toc,idanchor "${1}" | sed \ -e 's/href="\([-_\./[:alnum:]]*\)\.md"/href="\1.html"/g' \ -e '/| id="\L\1">|' + printf '' From d610bf3582664a1a8fb5943b53f388a046ce8e33 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Oct 2025 14:31:17 +0100 Subject: [PATCH 784/893] contrib/{logo-color,notification}: use a single style --- contrib/logo-color.d/style.css | 5 ----- contrib/logo-color.html | 2 +- contrib/notification.html | 4 ++-- {contrib/notification.d => general}/style.css | 3 ++- 4 files changed, 5 insertions(+), 9 deletions(-) delete mode 100644 contrib/logo-color.d/style.css rename {contrib/notification.d => general}/style.css (93%) diff --git a/contrib/logo-color.d/style.css b/contrib/logo-color.d/style.css deleted file mode 100644 index eb2ec6a..0000000 --- a/contrib/logo-color.d/style.css +++ /dev/null @@ -1,5 +0,0 @@ -body { - font-family: fira-sans, sans-serif; - font-size: 10pt; - background-color: transparent; -} diff --git a/contrib/logo-color.html b/contrib/logo-color.html index 17942ce..507445b 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -3,7 +3,7 @@ RouterOS-Scripts Logo Color Changer - + diff --git a/contrib/notification.html b/contrib/notification.html index 7875036..b7d6764 100644 --- a/contrib/notification.html +++ b/contrib/notification.html @@ -3,8 +3,8 @@ RouterOS-Scripts Notification Generator - - + + diff --git a/contrib/notification.d/style.css b/general/style.css similarity index 93% rename from contrib/notification.d/style.css rename to general/style.css index 648ea23..66d44f1 100644 --- a/contrib/notification.d/style.css +++ b/general/style.css @@ -1,7 +1,8 @@ +/* stylesheet for RouterOS Scripts */ body { + background-color: transparent; font-family: fira-sans, sans-serif; font-size: 10pt; - background-color: transparent; } div.notification { position: relative; From a2d6671cf0db887dd25a122ccbf88d0709c6fb02 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Oct 2025 14:46:01 +0100 Subject: [PATCH 785/893] contrib/html: include stylesheet via link --- Makefile | 2 +- contrib/html.sh | 7 ++++++- contrib/html.sh.d/head.html | 11 +---------- general/style.css | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index d8f2387..b799535 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ HTML = $(MARKDOWN:.md=.html) all: $(CAPSMAN) $(LOCAL) $(WIFI) $(HTML) checksums.json -%.html: %.md contrib/html.sh contrib/html.sh.d/head.html +%.html: %.md general/style.css contrib/html.sh contrib/html.sh.d/head.html contrib/html.sh $< > $@ %.capsman.rsc: %.template.rsc Makefile diff --git a/contrib/html.sh b/contrib/html.sh index 6942ecf..6a32b5d 100755 --- a/contrib/html.sh +++ b/contrib/html.sh @@ -2,7 +2,12 @@ set -e -sed "s|__TITLE__|$(head -n1 "${1}")|" < "${0}.d/head.html" +RELTO="$(dirname "${1}")" + +sed \ + -e "s|__TITLE__|$(head -n1 "${1}")|" \ + -e "s|__STYLE__|$(realpath --relative-to="${RELTO}" general/style.css)|" \ + < "${0}.d/head.html" markdown -f toc,idanchor "${1}" | sed \ -e 's/href="\([-_\./[:alnum:]]*\)\.md"/href="\1.html"/g' \ diff --git a/contrib/html.sh.d/head.html b/contrib/html.sh.d/head.html index 1b1dd03..50653ae 100644 --- a/contrib/html.sh.d/head.html +++ b/contrib/html.sh.d/head.html @@ -1,15 +1,6 @@ RouterOS Scripts :: __TITLE__ - + diff --git a/general/style.css b/general/style.css index 66d44f1..be67afa 100644 --- a/general/style.css +++ b/general/style.css @@ -4,6 +4,28 @@ body { font-family: fira-sans, sans-serif; font-size: 10pt; } +h2 { + border-bottom: 1px solid #ccc; + color: #000; +} +a { + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +blockquote { + border-left: 4px solid #ccc; + padding: 0 10px; + color: #777; +} +code { + margin: 0 2px; + padding: 2px 5px; + border: 1px solid #ccc; + background-color: #f8f8f8; + border-radius: 3px; +} div.notification { position: relative; float: right; @@ -31,6 +53,16 @@ p.hint { pre { font-family: fira-mono, monospace; white-space: pre-wrap; + background-color: #f8f8f8; + border: 1px solid #ccc; + overflow: auto; + padding: 6px 10px; + border-radius: 3px; +} +pre code { + margin: 0; + padding: 0; + border: 0; } span.link { color: #863600; From fae8dbd8ea2c9e5a38634c2db97dcfcb7e3f9693 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Nov 2025 12:51:34 +0100 Subject: [PATCH 786/893] contrib/html: add a margin on left and right... ... for windows in landscape (wider than high). Also make the notification float right for landscape only. --- general/style.css | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/general/style.css b/general/style.css index be67afa..a9ede5e 100644 --- a/general/style.css +++ b/general/style.css @@ -28,7 +28,7 @@ code { } div.notification { position: relative; - float: right; + float: none; width: 600px; border: 3px outset #6c5d53; /* border-radius: 5px; */ @@ -67,3 +67,12 @@ pre code { span.link { color: #863600; } +@media only screen and (orientation: landscape) { + body { + margin-left: 10vw; + margin-right: 10vw; + } + div.notification { + float: right; + } +} From 2d6fdc355e7b5f97fb421c00e5ccc78dd51fbe7a Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Mon, 10 Nov 2025 11:30:49 +0100 Subject: [PATCH 787/893] contrib/html: increase default line height --- general/style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/general/style.css b/general/style.css index a9ede5e..ad25c7c 100644 --- a/general/style.css +++ b/general/style.css @@ -3,6 +3,7 @@ body { background-color: transparent; font-family: fira-sans, sans-serif; font-size: 10pt; + line-height: 1.6; } h2 { border-bottom: 1px solid #ccc; From a0399216fcf21797284bd281546ac6b47ef7b037 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Oct 2025 14:55:00 +0100 Subject: [PATCH 788/893] contrib/html: link the logo with relative path --- contrib/html.sh | 1 + contrib/html.sh.d/head.html | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/contrib/html.sh b/contrib/html.sh index 6a32b5d..d4a1a90 100755 --- a/contrib/html.sh +++ b/contrib/html.sh @@ -7,6 +7,7 @@ RELTO="$(dirname "${1}")" sed \ -e "s|__TITLE__|$(head -n1 "${1}")|" \ -e "s|__STYLE__|$(realpath --relative-to="${RELTO}" general/style.css)|" \ + -e "s|__LOGO__|$(realpath --relative-to="${RELTO}" logo.png)|" \ < "${0}.d/head.html" markdown -f toc,idanchor "${1}" | sed \ diff --git a/contrib/html.sh.d/head.html b/contrib/html.sh.d/head.html index 50653ae..779e246 100644 --- a/contrib/html.sh.d/head.html +++ b/contrib/html.sh.d/head.html @@ -2,5 +2,5 @@ RouterOS Scripts :: __TITLE__ - + From 2e0787afd12178c363aff9346a7f331fe7d1b4e4 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Nov 2025 22:34:00 +0100 Subject: [PATCH 789/893] contrib/html: properly handle anchors --- contrib/html.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/html.sh b/contrib/html.sh index d4a1a90..603e606 100755 --- a/contrib/html.sh +++ b/contrib/html.sh @@ -11,7 +11,7 @@ sed \ < "${0}.d/head.html" markdown -f toc,idanchor "${1}" | sed \ - -e 's/href="\([-_\./[:alnum:]]*\)\.md"/href="\1.html"/g' \ + -e 's/href="\([-_\./[:alnum:]]*\)\.md\(#[-[:alnum:]]*\)\?"/href="\1.html\2"/g' \ -e '/| id="\L\1">|' printf '' From cbb282746fc3af91c8c872753a217c912ba307e6 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 11 Nov 2025 23:16:04 +0100 Subject: [PATCH 790/893] README: add a sub-section for code hosting --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 3c69017..59c695e 100644 --- a/README.md +++ b/README.md @@ -408,12 +408,11 @@ Upstream [![upstream](general/qr-code.png)](https://rsc.eworm.de/) -URL: -[GitHub.com](https://github.com/eworm-de/routeros-scripts#routeros-scripts) +### Code hosting -Mirror: -[eworm.de](https://git.eworm.de/cgit/routeros-scripts/about/) -[GitLab.com](https://gitlab.com/eworm-de/routeros-scripts#routeros-scripts) +* [git.eworm.de](https://git.eworm.de/cgit/routeros-scripts/about/) +* [GitHub.com](https://github.com/eworm-de/routeros-scripts#routeros-scripts) +* [GitLab.com](https://gitlab.com/eworm-de/routeros-scripts#routeros-scripts) --- [⬆️ Go back to top](#top) From 719b662b76a3ad85455c1113d6f9c57f40f3300e Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Fri, 7 Nov 2025 22:57:17 +0100 Subject: [PATCH 791/893] contrib/html: drop ampersand, comma, dash, exclamation mark, ... ... parentesis & tick mark from id/anchor --- contrib/html.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contrib/html.sh b/contrib/html.sh index 603e606..b1d2511 100755 --- a/contrib/html.sh +++ b/contrib/html.sh @@ -12,6 +12,7 @@ sed \ markdown -f toc,idanchor "${1}" | sed \ -e 's/href="\([-_\./[:alnum:]]*\)\.md\(#[-[:alnum:]]*\)\?"/href="\1.html\2"/g' \ - -e '/| id="\L\1">|' + -e '/| id="\L\1">|' \ + -e '/' From ceb6f2353ea92ddf50ccb6ffa11707e71dc7b61c Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Wed, 29 Oct 2025 15:19:32 +0100 Subject: [PATCH 792/893] contrib/*: unify html code --- contrib/html.sh.d/head.html | 4 ++-- contrib/logo-color.html | 17 +++++++---------- contrib/notification.html | 17 +++++++---------- doc/mod/notification-telegram.md | 2 +- 4 files changed, 17 insertions(+), 23 deletions(-) diff --git a/contrib/html.sh.d/head.html b/contrib/html.sh.d/head.html index 779e246..0ce3ff7 100644 --- a/contrib/html.sh.d/head.html +++ b/contrib/html.sh.d/head.html @@ -1,6 +1,6 @@ -RouterOS Scripts :: __TITLE__ - + +RouterOS Scripts :: __TITLE__ diff --git a/contrib/logo-color.html b/contrib/logo-color.html index 507445b..eb00492 100644 --- a/contrib/logo-color.html +++ b/contrib/logo-color.html @@ -1,14 +1,12 @@ - - - - -RouterOS-Scripts Logo Color Changer + + +RouterOS Scripts :: Logo Color Changer + - - + -