aboutsummaryrefslogtreecommitdiffstats
path: root/global-functions.rsc
diff options
context:
space:
mode:
Diffstat (limited to 'global-functions.rsc')
-rw-r--r--global-functions.rsc97
1 files changed, 62 insertions, 35 deletions
diff --git a/global-functions.rsc b/global-functions.rsc
index 447d6e9..47a69c4 100644
--- a/global-functions.rsc
+++ b/global-functions.rsc
@@ -4,7 +4,7 @@
# Michael Gisbers <michael@gisbers.de>
# 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/
@@ -12,7 +12,7 @@
:local ScriptName [ :jobname ];
# expected configuration version
-:global ExpectedConfigVersion 129;
+:global ExpectedConfigVersion 131;
# global variables not to be changed by user
:global GlobalFunctionsReady false;
@@ -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={
@@ -135,6 +140,7 @@
:global ScriptUpdatesBaseUrl;
:global ScriptUpdatesUrlSuffix;
+ :global CertificateAvailable;
:global CertificateNameByCN;
:global CleanName;
:global FetchUserAgentStr;
@@ -143,23 +149,47 @@
$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 . "'!");
+ $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 ];
+
+ :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 ];
+ }
:return true;
}
@@ -294,11 +324,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
@@ -334,7 +360,7 @@
:return true;
}
- :if ([ $CertificateAvailable "R3" ] = false) do={
+ :if ([ $CertificateAvailable "ISRG Root X1" ] = false) do={
$LogPrint error $0 ("Downloading required certificate failed.");
:return false;
}
@@ -373,6 +399,7 @@
: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 ];
}
@@ -509,7 +536,7 @@
}
:do {
- :if ([ $CertificateAvailable "GTS CA 1P5" ] = false) do={
+ :if ([ $CertificateAvailable "GTS Root R4" ] = false) do={
$LogPrint warning $0 ("Downloading required certificate failed.");
:error false;
}
@@ -810,7 +837,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;
}
@@ -889,11 +921,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
@@ -984,6 +1012,7 @@
:global IDonate;
:global NoNewsAndChangesNotification;
:global ScriptUpdatesBaseUrl;
+ :global ScriptUpdatesCRLF;
:global ScriptUpdatesUrlSuffix;
:global CertificateAvailable;
@@ -999,7 +1028,7 @@
:global SymbolForNotification;
:global ValidateSyntax;
- :if ([ $CertificateAvailable "E1" ] = false) do={
+ :if ([ $CertificateAvailable "ISRG Root X2" ] = false) do={
$LogPrint warning $0 ("Downloading certificate failed, trying without.");
}
@@ -1036,7 +1065,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={
@@ -1050,13 +1079,15 @@
}
: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={
: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;
}
@@ -1414,12 +1445,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
@@ -1470,7 +1496,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 . ",") ];
}
@@ -1481,6 +1507,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); }