From 1579330864c98f4526cf5e0f0ea7204ad25f87a3 Mon Sep 17 00:00:00 2001 From: Christian Hesse Date: Tue, 13 Dec 2022 15:30:24 +0100 Subject: global-functions: $MkDir: create directories recursively --- global-functions | 44 ++++++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 14 deletions(-) (limited to 'global-functions') diff --git a/global-functions b/global-functions index f0048dd..9ff6bd5 100644 --- a/global-functions +++ b/global-functions @@ -521,6 +521,7 @@ :set MkDir do={ :local Path [ :tostr $1 ]; + :global CharacterReplace; :global CleanFilePath; :global GetRandom20CharAlNum; :global LogPrintExit2; @@ -536,22 +537,37 @@ :return true; } - :if ([ :len [ /file/find where name=$Path ] ] = 1) do={ - $LogPrintExit2 warning $0 ("The path '" . $Path . "' exists, but is not a directory.") false; - :return false; - } + :local Error false; + :local PathNext ""; + :foreach Dir in=[ :toarray [ $CharacterReplace $Path "/" "," ] ] do={ + :local Continue false; + :set PathNext [ $CleanFilePath ($PathNext . "/" . $Dir) ]; - :local Return true; - :local Name ($Path . "-" . [ $GetRandom20CharAlNum 6 ]); - :do { - /ip/smb/share/add disabled=yes directory=$Path name=$Name; - $WaitForFile $Path; - } on-error={ - $LogPrintExit2 warning $0 ("Making directory '" . $Path . "' failed!") false; - :set Return false; + :if ([ :len [ /file/find where name=$PathNext type="directory" ] ] = 1) do={ + :set Continue true; + } + + :if ($Continue = false && [ :len [ /file/find where name=$PathNext ] ] = 1) do={ + $LogPrintExit2 warning $0 ("The path '" . $PathNext . "' exists, but is not a directory.") false; + :return false; + } + + :if ($Continue = false) do={ + :local Name ($PathNext . "-" . [ $GetRandom20CharAlNum 6 ]); + :do { + /ip/smb/share/add disabled=yes directory=$PathNext name=$Name; + $WaitForFile $PathNext; + } on-error={ + $LogPrintExit2 warning $0 ("Making directory '" . $PathNext . "' failed!") false; + :set Error true; + } + /ip/smb/share/remove [ find where name=$Name ]; + :if ($Error = true) do={ + :return false; + } + } } - /ip/smb/share/remove [ find where name=$Name ]; - :return $Return; + :return true; } # prepare NotificationFunctions array -- cgit v1.2.3-54-g00ecf