fennel: extract some common functions into a shareable module

This commit is contained in:
Daniel Barlow 2023-07-05 20:23:27 +01:00
parent c3bb33c9ce
commit 2de4d7a8f9
7 changed files with 60 additions and 21 deletions

View file

@ -1,12 +1,5 @@
(local inotify (require :inotify)) (local inotify (require :inotify))
(local { : merge : split : file-exists? : system } (require :anoia))
(fn merge [table1 table2]
(collect [k v (pairs table2) &into table1]
k v))
(fn split [sep string]
(icollect [v (string.gmatch string (.. "([^" sep "]+)"))]
v))
(fn parse-prefix [str] (fn parse-prefix [str]
(fn parse-extra [s] (fn parse-extra [s]
@ -24,12 +17,6 @@
;;(parse-prefix "2001:8b0:de3a:40dc::/64,7198,7198") ;;(parse-prefix "2001:8b0:de3a:40dc::/64,7198,7198")
;;(parse-prefix "2001:8b0:de3a:1001::/64,7198,7188,excluded=1/2,thi=10") ;;(parse-prefix "2001:8b0:de3a:1001::/64,7198,7188,excluded=1/2,thi=10")
(fn file-exists? [name]
(match (io.open name :r)
f (do (f:close) true)
_ false))
(fn read-line [name] (fn read-line [name]
(with-open [f (assert (io.open name :r) (.. "can't open file " name))] (with-open [f (assert (io.open name :r) (.. "can't open file " name))]
(f:read "*l"))) (f:read "*l")))
@ -80,9 +67,6 @@
(table.insert deleted (parse-prefix prefix)))) (table.insert deleted (parse-prefix prefix))))
(values added deleted))) (values added deleted)))
;;(fn execute [s] (do (print s) true))
(fn execute [s] (assert (os.execute s)))
(let [[state-directory lan-device] arg (let [[state-directory lan-device] arg
dir (watch-directory state-directory)] dir (watch-directory state-directory)]
(var prefixes []) (var prefixes [])
@ -92,10 +76,10 @@
(let [new-prefixes (split " " (dir:read-line "/prefixes")) (let [new-prefixes (split " " (dir:read-line "/prefixes"))
(added deleted) (changes prefixes new-prefixes)] (added deleted) (changes prefixes new-prefixes)]
(each [_ p (ipairs added)] (each [_ p (ipairs added)]
(execute (system
(.. "ip address add " p.prefix "::1/" p.len " dev " lan-device))) (.. "ip address add " p.prefix "::1/" p.len " dev " lan-device)))
(each [_ p (ipairs deleted)] (each [_ p (ipairs deleted)]
(execute (system
(.. "ip address del " p.prefix "::1/" p.len " dev " lan-device))) (.. "ip address del " p.prefix "::1/" p.len " dev " lan-device)))
(set prefixes new-prefixes))) (set prefixes new-prefixes)))
(dir:wait-events))) (dir:wait-events)))

View file

@ -1,7 +1,8 @@
{ {
writeFennelScript writeFennelScript
, linotify , linotify
, anoia
}: }:
writeFennelScript "acquire-delegated-prefix" writeFennelScript "acquire-delegated-prefix"
[ linotify ] [ linotify anoia ]
./acquire-delegated-prefix.fnl ./acquire-delegated-prefix.fnl

14
pkgs/anoia/README Normal file
View file

@ -0,0 +1,14 @@
In Terry Pratchett's Discworld novels, Anoi is a minor goddess of Things That Stick In Drawers
> Often, but not uniquely, a ladle, but sometimes a metal spatula or,
> rarely, a mechanical egg-whisk that nobody in the house admits to
> ever buying. The desperate mad rattling and cries of How can it
> close on the damn thing but not open with it? Who bought this? Do we
> ever use it? is as praise unto Anoia. She also eats corkscrews.
This is a library of miscellaneous Fennel code used in Liminix that is
shared between various scripts but doesn't really fit together. It is
not a public stable interface - while any Liminix code is welcome to
use it, it's suject to reshuffle, rearrangement, refactor or rejection
without notice.

19
pkgs/anoia/default.nix Normal file
View file

@ -0,0 +1,19 @@
{
fennel
, stdenv
, lua
}:
let pname = "anoia";
in stdenv.mkDerivation {
inherit pname;
version = "0.1";
src = ./.;
nativeBuildInputs = [ fennel ];
buildPhase = ''
fennel --compile init.fnl > init.lua
'';
installPhase = ''
mkdir -p "$out/share/lua/${lua.luaversion}/${pname}"
cp *.lua "$out/share/lua/${lua.luaversion}/${pname}"
'';
}

16
pkgs/anoia/init.fnl Normal file
View file

@ -0,0 +1,16 @@
(fn merge [table1 table2]
(collect [k v (pairs table2) &into table1]
k v))
(fn split [sep string]
(icollect [v (string.gmatch string (.. "([^" sep "]+)"))]
v))
(fn file-exists? [name]
(match (io.open name :r)
f (do (f:close) true)
_ false))
(fn system [s] (assert (os.execute s)))
{ : merge : split : file-exists? : system }

View file

@ -58,4 +58,5 @@
odhcp-script = callPackage ./odhcp-script {}; odhcp-script = callPackage ./odhcp-script {};
fennel = callPackage ./fennel {}; fennel = callPackage ./fennel {};
fennelrepl = callPackage ./fennelrepl {}; fennelrepl = callPackage ./fennelrepl {};
anoia = callPackage ./anoia {};
} }

View file

@ -6,7 +6,11 @@
}: }:
name : packages : source : name : packages : source :
let let
luapath = builtins.map (f: "${f}/share/lua/${lua.luaversion}/?.lua;") packages; luapath = builtins.map
(f:
"${f}/share/lua/${lua.luaversion}/?.lua;" +
"${f}/share/lua/${lua.luaversion}/?/init.lua;")
packages;
luacpath = builtins.map (f: "${f}/lib/lua/${lua.luaversion}/?.so;") packages; luacpath = builtins.map (f: "${f}/lib/lua/${lua.luaversion}/?.so;") packages;
in stdenv.mkDerivation { in stdenv.mkDerivation {
inherit name; inherit name;