aboutsummaryrefslogtreecommitdiffstats
path: root/mod/ssh-keys-import.rsc
diff options
context:
space:
mode:
Diffstat (limited to 'mod/ssh-keys-import.rsc')
-rw-r--r--mod/ssh-keys-import.rsc43
1 files changed, 24 insertions, 19 deletions
diff --git a/mod/ssh-keys-import.rsc b/mod/ssh-keys-import.rsc
index d6b3b3f..8bea64e 100644
--- a/mod/ssh-keys-import.rsc
+++ b/mod/ssh-keys-import.rsc
@@ -1,24 +1,25 @@
#!rsc by RouterOS
# RouterOS script: mod/ssh-keys-import
-# Copyright (c) 2020-2024 Christian Hesse <mail@eworm.de>
-# https://git.eworm.de/cgit/routeros-scripts/about/COPYING.md
+# Copyright (c) 2020-2025 Christian Hesse <mail@eworm.de>
+# https://rsc.eworm.de/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
+# https://rsc.eworm.de/doc/mod/ssh-keys-import.md
:global SSHKeysImport;
:global SSHKeysImportFile;
# import single key passed as string
-:set SSHKeysImport do={
+:set SSHKeysImport do={ :onerror Err {
:local Key [ :tostr $1 ];
:local User [ :tostr $2 ];
:global GetRandom20CharAlNum;
:global LogPrint;
:global MkDir;
+ :global RmDir;
:global WaitForFile;
:if ([ :len $Key ] = 0 || [ :len $User ] = 0) do={
@@ -39,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;
@@ -54,24 +57,27 @@
/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 . "'.");
- /file/remove "tmpfs/ssh-keys-import";
- } on-error={
- $LogPrint warning $0 ("Failed importing key.");
- /file/remove "tmpfs/ssh-keys-import";
+ $RmDir "tmpfs/ssh-keys-import";
+ } do={
+ $LogPrint warning $0 ("Failed importing key: " . $Err);
+ $RmDir "tmpfs/ssh-keys-import";
:return false;
}
-}
+} do={
+ :global ExitError; $ExitError false $0 $Err;
+} }
# import keys from a file
-:set SSHKeysImportFile do={
+:set SSHKeysImportFile do={ :onerror Err {
:local FileName [ :tostr $1 ];
:local User [ :tostr $2 ];
:global EitherOr;
+ :global FileExists;
:global LogPrint;
:global ParseKeyValueStore;
:global SSHKeysImport;
@@ -81,8 +87,7 @@
:return false;
}
- :local File [ /file/find where name=$FileName ];
- :if ([ :len $File ] = 0) do={
+ :if ([ $FileExists $FileName ] = false) do={
$LogPrint warning $0 ("File '" . $FileName . "' does not exist.");
:return false;
}
@@ -91,9 +96,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;
@@ -106,4 +109,6 @@
$LogPrint warning $0 ("SSH key of type '" . $KeyVal->0 . "' is not supported.");
}
}
-}
+} do={
+ :global ExitError; $ExitError false $0 $Err;
+} }