replace waitup with more generally useful ifwait
* wait for $interface present before ip link set up dev * wait for wlan0 running before adding to bridge
This commit is contained in:
1
pkgs/ifwait/.#README
Symbolic link
1
pkgs/ifwait/.#README
Symbolic link
@@ -0,0 +1 @@
|
||||
dan@noetbook.911352349782478447
|
32
pkgs/ifwait/default.nix
Normal file
32
pkgs/ifwait/default.nix
Normal file
@@ -0,0 +1,32 @@
|
||||
{
|
||||
lua5_3
|
||||
, netlink-lua
|
||||
, stdenv
|
||||
, makeWrapper
|
||||
}:
|
||||
let
|
||||
lua = lua5_3;
|
||||
netlink = netlink-lua.override {inherit lua;};
|
||||
fennel = lua.pkgs.fennel;
|
||||
in stdenv.mkDerivation rec {
|
||||
pname = "ifwait";
|
||||
version = "1";
|
||||
phases = [ "installPhase" ];
|
||||
|
||||
buildInputs = [ lua netlink ];
|
||||
nativeBuildInputs = [ makeWrapper fennel ];
|
||||
|
||||
LUA_CPATH = "${netlink}/lib/lua/${lua.luaversion}/\?.so"; # for nix-shell
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out/bin $out/lib
|
||||
fennel --compile ${./ifwait.fnl} > $out/lib/${pname}.lua
|
||||
|
||||
makeWrapper ${lua}/bin/lua $out/bin/${pname} \
|
||||
--prefix LUA_CPATH ";" ${netlink}/lib/lua/${lua.luaversion}/\?.so \
|
||||
--add-flags $out/lib/${pname}.lua
|
||||
'';
|
||||
}
|
||||
|
||||
# to use fennel.view,
|
||||
# --prefix LUA_PATH ";" ${fennel}/share/lua/5.2/\?.lua \
|
52
pkgs/ifwait/ifwait.fnl
Normal file
52
pkgs/ifwait/ifwait.fnl
Normal file
@@ -0,0 +1,52 @@
|
||||
(local netlink (require :netlink))
|
||||
(local sock (netlink.socket))
|
||||
|
||||
; (local { : view} (require :fennel))
|
||||
|
||||
(fn assoc [tbl k v]
|
||||
(tset tbl k v)
|
||||
tbl)
|
||||
|
||||
(fn parse-args [args]
|
||||
(match args
|
||||
["-v" & rest] (assoc (parse-args rest) :verbose true)
|
||||
["-t" timeout & rest] (assoc (parse-args rest) :timeout (tonumber timeout))
|
||||
[linkname "up"] {:link linkname :expecting "up"}
|
||||
[linkname "running"] {:link linkname :expecting "running"}
|
||||
[linkname "present"] {:link linkname :expecting "present"}
|
||||
[linkname nil] {:link linkname :expecting "present"}
|
||||
_ nil))
|
||||
|
||||
(local parameters
|
||||
(or
|
||||
(parse-args arg)
|
||||
(assert false (.. "Usage: " (. arg 0) " [-v] ifname [present|up|running]"))))
|
||||
|
||||
(fn run-events [evs]
|
||||
(each [_ v (ipairs evs)]
|
||||
(let [got
|
||||
(match v
|
||||
;; - up: Reflects the administrative state of the interface (IFF_UP)
|
||||
;; - running: Reflects the operational state (IFF_RUNNING).
|
||||
{:event "newlink" :name parameters.link :up :yes :running :yes}
|
||||
{:present true :up true :running true}
|
||||
|
||||
{:event "newlink" :name parameters.link :up :yes}
|
||||
{:present :true :up true}
|
||||
|
||||
{:event "newlink" :name parameters.link}
|
||||
{:present true }
|
||||
|
||||
_
|
||||
{})]
|
||||
(when (. got parameters.expecting)
|
||||
(os.exit 0)))))
|
||||
|
||||
|
||||
(when parameters.verbose
|
||||
(print (.. (. arg 0) ": waiting for "
|
||||
parameters.link " to be " parameters.expecting)))
|
||||
|
||||
(run-events (sock:query {:link true}))
|
||||
|
||||
(while (sock:poll) (run-events (sock:event)))
|
38
pkgs/ifwait/waitup.fnl
Normal file
38
pkgs/ifwait/waitup.fnl
Normal file
@@ -0,0 +1,38 @@
|
||||
(local netlink (require :netlink))
|
||||
(local sock (netlink.socket))
|
||||
|
||||
(when (< (# arg) 2)
|
||||
(print "usage: waitup ifname fd")
|
||||
(os.exit 1))
|
||||
|
||||
(local ifname (. arg 1))
|
||||
(local fd (tonumber (. arg 2)))
|
||||
(local stream (io.open (.. "/proc/self/fd/" fd) "w"))
|
||||
|
||||
(fn notify-ready []
|
||||
(when (= "file" (io.type stream))
|
||||
(stream:write "\n")
|
||||
(stream:close))
|
||||
(print (.. (. arg 0) ": received netlink operstate up for " ifname)))
|
||||
|
||||
|
||||
(fn run-events [evs]
|
||||
(each [_ v (ipairs evs)]
|
||||
(print :event v.event v.name)
|
||||
|
||||
(match v
|
||||
;; - up: Reflects the administrative state of the interface (IFF_UP)
|
||||
;; - running: Reflects the operational state (IFF_RUNNING).
|
||||
{:event "newlink" :name ifname :up :yes :running :yes}
|
||||
(notify-ready)
|
||||
|
||||
{:event "newlink" :name ifname :up :no}
|
||||
(os.exit 0))))
|
||||
|
||||
(run-events (sock:query {:link true}))
|
||||
|
||||
(print (.. (. arg 0) ": waiting for netlink NEWLINK " ifname))
|
||||
|
||||
(while (sock:poll)
|
||||
(let [ev (sock:event)]
|
||||
(run-events ev)))
|
Reference in New Issue
Block a user