From 12e25722fabff654ddff44b5a04b14a8e0d26e1f Mon Sep 17 00:00:00 2001 From: Daniel Barlow Date: Fri, 8 Sep 2023 20:47:01 +0100 Subject: [PATCH] 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 --- pkgs/fennelrepl/default.nix | 1 + pkgs/odhcp-script/odhcp6-script.fnl | 24 ++++++++++++++++++++++-- pkgs/odhcp-script/test.sh | 5 +++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/pkgs/fennelrepl/default.nix b/pkgs/fennelrepl/default.nix index 24749b2..ba8a5e3 100644 --- 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 index 10c7231..0e18ce3 100644 --- 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"))) - (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 index c6fbbd9..d464742 100755 --- 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