commit 9dd3cf23b4ce78820e1b65fedc6242a403b2cb15
parent 4e9227dff3d8bfd3cd7f82e99238acff7ceb2f2f
Author: Daniel Barlow <dan@telent.net>
Date: Fri, 8 Sep 2023 21:17:42 +0100
anoia.fs.mktree replaces mkdir
This uses lfs to make the tree in-process instead of
shelling out to the mkdir command
Diffstat:
3 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/pkgs/anoia/fs.fnl b/pkgs/anoia/fs.fnl
@@ -1,5 +1,17 @@
(local lfs (require :lfs))
+(fn directory? [pathname]
+ (= (lfs.symlinkattributes pathname :mode) "directory"))
+
+(fn mktree [pathname]
+ (if (or (= pathname "") (= pathname "/"))
+ (error (.. "can't mkdir " pathname)))
+
+ (or (directory? pathname)
+ (let [parent (string.gsub pathname "/[^/]+/?$" "")]
+ (or (directory? parent) (mktree parent))
+ (assert (lfs.mkdir pathname)))))
+
(fn rmtree [pathname]
(case (lfs.symlinkattributes pathname)
nil true
@@ -17,4 +29,4 @@
(error (.. "can't remove " pathname " of kind \"" unknown.mode "\""))))
-{ : rmtree }
+{ : mktree : rmtree }
diff --git a/pkgs/anoia/init.fnl b/pkgs/anoia/init.fnl
@@ -13,7 +13,4 @@
(fn system [s] (assert (os.execute s)))
-(fn mkdir [directory]
- (os.execute (.. "mkdir -p " directory)))
-
-{ : merge : split : file-exists? : system : mkdir }
+{ : merge : split : file-exists? : system }
diff --git a/pkgs/odhcp-script/odhcp6-script.fnl b/pkgs/odhcp-script/odhcp6-script.fnl
@@ -1,9 +1,9 @@
-(local { : split : merge : mkdir } (require :anoia))
+(local { : split : merge } (require :anoia))
(local { : view } (require :fennel))
-(local { : rmtree } (require :anoia.fs))
+(local { : mktree : rmtree } (require :anoia.fs))
(local state-directory (assert (os.getenv "SERVICE_STATE")))
-(mkdir state-directory)
+(mktree state-directory)
(fn write-value [name value]
(let [path (.. state-directory "/" name)]
@@ -29,11 +29,10 @@
keydir (.. prefix (-> address.address
(: :gsub "::$" "")
(: :gsub ":" "-")))]
- (mkdir (.. state-directory "/" keydir))
+ (mktree (.. state-directory "/" keydir))
(each [k v (pairs address)]
(write-value (.. keydir "/" k) v)))))
-
;; we remove state before updating to ensure that consumers don't get
;; a half-updated snapshot
(os.remove (.. state-directory "/state"))