(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)))