liminix

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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:
Mpkgs/fennelrepl/default.nix | 1+
Mpkgs/odhcp-script/odhcp6-script.fnl | 24++++++++++++++++++++++--
Mpkgs/odhcp-script/test.sh | 5+++++
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