From 5590fea16e6e14de9084cdad7f0804d2bef74279 Mon Sep 17 00:00:00 2001 From: Raito Bezarius Date: Sat, 7 Sep 2024 20:26:40 +0200 Subject: [PATCH] feat(ifwait): add ifbridgeable script This enable to wait for bridgeability of a WLAN interface via `iwinfo`. Signed-off-by: Raito Bezarius --- pkgs/anoia/Makefile | 2 +- pkgs/anoia/default.nix | 3 ++- pkgs/anoia/wlan.fnl | 8 ++++++++ pkgs/ifwait/default.nix | 5 ++++- pkgs/ifwait/ifbridgeable.fnl | 30 ++++++++++++++++++++++++++++++ 5 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 pkgs/anoia/wlan.fnl create mode 100644 pkgs/ifwait/ifbridgeable.fnl diff --git a/pkgs/anoia/Makefile b/pkgs/anoia/Makefile index f68e596..1c1a406 100644 --- a/pkgs/anoia/Makefile +++ b/pkgs/anoia/Makefile @@ -1,5 +1,5 @@ -default: fs.lua init.lua nl.lua svc.lua net/constants.lua +default: wlan.lua fs.lua init.lua nl.lua svc.lua net/constants.lua test: ln -s . anoia diff --git a/pkgs/anoia/default.nix b/pkgs/anoia/default.nix index b981f48..3488e66 100644 --- a/pkgs/anoia/default.nix +++ b/pkgs/anoia/default.nix @@ -4,6 +4,7 @@ , linotify , lua , lualinux +, iwinfo , cpio }: let pname = "anoia"; @@ -12,7 +13,7 @@ in stdenv.mkDerivation { version = "0.1"; src = ./.; nativeBuildInputs = [ fennel cpio ]; - buildInputs = with lua.pkgs; [ linotify lualinux ]; + buildInputs = with lua.pkgs; [ linotify lualinux iwinfo ]; outputs = [ "out" "dev" ]; doCheck = true; diff --git a/pkgs/anoia/wlan.fnl b/pkgs/anoia/wlan.fnl new file mode 100644 index 0000000..39eeeb6 --- /dev/null +++ b/pkgs/anoia/wlan.fnl @@ -0,0 +1,8 @@ +(local { : nl80211 } (require :iwinfo)) + +(fn is-bridgeable [ifname] + (let [mode (nl80211.mode ifname)] + (or (= mode "Master") (= mode "Master (VLAN)")) +)) + +{ : is-bridgeable } diff --git a/pkgs/ifwait/default.nix b/pkgs/ifwait/default.nix index 19f76d0..b99eb54 100644 --- a/pkgs/ifwait/default.nix +++ b/pkgs/ifwait/default.nix @@ -1,11 +1,14 @@ { lua , netlink-lua +, lualinux +, iwinfo , writeFennelScript , runCommand , anoia }: runCommand "ifwait" {} '' mkdir -p $out/bin - cp -p ${writeFennelScript "ifwait" [anoia netlink-lua] ./ifwait.fnl} $out/bin/ifwait + cp -p ${writeFennelScript "ifwait" [ anoia netlink-lua ] ./ifwait.fnl} $out/bin/ifwait + cp -p ${writeFennelScript "ifbridgeable" [ anoia lualinux iwinfo ] ./ifbridgeable.fnl} $out/bin/ifbridgeable '' diff --git a/pkgs/ifwait/ifbridgeable.fnl b/pkgs/ifwait/ifbridgeable.fnl new file mode 100644 index 0000000..3ddfd4b --- /dev/null +++ b/pkgs/ifwait/ifbridgeable.fnl @@ -0,0 +1,30 @@ +(local wlan (require :anoia.wlan)) +(local { : assoc } (require :anoia)) +(local { : msleep } (require :lualinux)) + +(fn parse-args [args] + (match args + ["-v" & rest] (assoc (parse-args rest) :verbose true) + [linkname] {:link linkname} + _ nil)) + +(fn run [args poll-fn] + (let [parameters + (assert (parse-args args) + (.. "Usage: ifbridgeable [-v] ifname"))] + (when parameters.verbose + (print (.. "ifbridgeable: waiting for " + parameters.link " to be bridgeable"))) + + (while (not (poll-fn parameters.link)) + (when parameters.verbose + (print (.. "ifbridgeable: waiting for " parameters.link " to be bridgeable"))) + (msleep 500) + ) + ) +) + +(when (not (= (. arg 0) "test")) + (run arg wlan.is-bridgeable)) + +{ : run }