Compare commits

...

7 commits

Author SHA1 Message Date
Christian Hesse
b3c2b67461 global-functions: $ScriptLock: increase interval with wait time
Inspired by: https://github.com/eworm-de/routeros-scripts/issues/95#issuecomment-2773513467
2025-04-08 16:06:55 +02:00
Miquel Bonastre
a36daed8be INITIAL-COMMANDS: add status output 2025-04-08 16:06:55 +02:00
Miquel Bonastre
20ae1250fb INITIAL-COMMANDS: support installation from custom server
Closes: https://github.com/eworm-de/routeros-scripts/pull/96
2025-04-08 16:06:49 +02:00
Christian Hesse
31180ae33a global-functions: $CertificateNameByCN: return false without match...
... and return true on success.
2025-04-08 14:46:44 +02:00
Christian Hesse
7de9c64776 global-functions: $CertificateNameByCN: pick the first match only 2025-04-08 09:13:59 +02:00
Christian Hesse
c67f598dea global-functions: $CertificateNameByCN: support matching by fingerprint and name 2025-04-08 09:13:59 +02:00
Christian Hesse
89c0ad5e91 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.
2025-04-08 09:13:59 +02:00
2 changed files with 36 additions and 16 deletions

View file

@ -17,23 +17,33 @@ 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";
:put "Importing certificate...";
/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;
: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 ("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");
};
: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 "ISRG Root X2";
$CertificateNameByCN $CertFingerprint;
};
Then continue setup with

View file

@ -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 ] }) \
@ -203,12 +203,17 @@
# 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) ]->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)
@ -1387,8 +1392,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 +1482,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 +1505,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 +1523,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;
}