commit 12e25722fabff654ddff44b5a04b14a8e0d26e1f
parent 09fe21260e80730a48af36983bc09980504733f6
Author: Daniel Barlow <dan@telent.net>
Date: Fri, 8 Sep 2023 20:47:01 +0100
odhcp-script: delete stale dirs from previous runs
This requires adding LFS as a dependency because native Lua has
no way to iterate a directory, but it seems to be Not Huge and
hopefully we'll have other uses for it
Diffstat:
3 files changed, 28 insertions(+), 2 deletions(-)
diff --git a/pkgs/fennelrepl/default.nix b/pkgs/fennelrepl/default.nix
@@ -14,6 +14,7 @@ let packages = [
linotify
anoia
fennel
+ lua.pkgs.luafilesystem
];
join = ps: builtins.concatStringsSep ";" ps;
luapath = join (builtins.map (f:
diff --git a/pkgs/odhcp-script/odhcp6-script.fnl b/pkgs/odhcp-script/odhcp6-script.fnl
@@ -1,8 +1,25 @@
(local { : split : merge : mkdir } (require :anoia))
(local { : view } (require :fennel))
+(local lfs (require :lfs))
+
+(fn rmtree [pathname]
+ (case (lfs.symlinkattributes pathname)
+ nil true
+ {:mode "directory"}
+ (do
+ (each [f (lfs.dir pathname)]
+ (when (not (or (= f ".") (= f "..")))
+ (rmtree ( .. pathname "/" f)))
+ (lfs.rmdir pathname)))
+ {:mode "file"}
+ (os.remove pathname)
+ {:mode "link"}
+ (os.remove pathname)
+ unknown
+ (error (.. "can't remove " pathname " of kind \"" unknown.mode "\""))))
-(local state-directory (assert (os.getenv "SERVICE_STATE")))
+(local state-directory (assert (os.getenv "SERVICE_STATE")))
(mkdir state-directory)
(fn write-value [name value]
@@ -13,7 +30,6 @@
(fn write-value-from-env [name]
(write-value name (os.getenv (string.upper name))))
-
(fn parse-address [str]
(fn parse-extra [s]
(let [out {}]
@@ -39,6 +55,10 @@
;; a half-updated snapshot
(os.remove (.. state-directory "/state"))
+;; remove parsed addresses/prefixes from any previous run
+(rmtree (.. state-directory "/prefix"))
+(rmtree (.. state-directory "/address"))
+
(let [wanted
[
:addresses
diff --git a/pkgs/odhcp-script/test.sh b/pkgs/odhcp-script/test.sh
@@ -9,6 +9,11 @@ cleanup(){
trap 'exit 1' INT HUP QUIT TERM ALRM USR1
trap 'cleanup' EXIT
+# call the script twice with different state, to test that it cleans
+# out old values when it runs again
+
+(set -a; . ./test.env ; ADDRESSES=2001:80:111:111:0:fff:123:567/128,3600,7200 SERVICE_STATE=$statedir fennelrepl odhcp6-script.fnl ppp0 bound) 10>&1
+
(set -a; . ./test.env ; SERVICE_STATE=$statedir fennelrepl odhcp6-script.fnl ppp0 bound) 10>&1
(cd $statedir && find . -type f | xargs grep '' | sort) > actual