ifwait.fnl (1575B)
1 (local netlink (require :netlink)) 2 (local sock (netlink.socket)) 3 4 ; (local { : view} (require :fennel)) 5 6 (fn assoc [tbl k v] 7 (tset tbl k v) 8 tbl) 9 10 (fn parse-args [args] 11 (match args 12 ["-v" & rest] (assoc (parse-args rest) :verbose true) 13 ["-t" timeout & rest] (assoc (parse-args rest) :timeout (tonumber timeout)) 14 [linkname "up"] {:link linkname :expecting "up"} 15 [linkname "running"] {:link linkname :expecting "running"} 16 [linkname "present"] {:link linkname :expecting "present"} 17 [linkname nil] {:link linkname :expecting "present"} 18 _ nil)) 19 20 (local parameters 21 (or 22 (parse-args arg) 23 (assert false (.. "Usage: " (. arg 0) " [-v] ifname [present|up|running]")))) 24 25 (fn run-events [evs] 26 (each [_ v (ipairs evs)] 27 (let [got 28 (match v 29 ;; - up: Reflects the administrative state of the interface (IFF_UP) 30 ;; - running: Reflects the operational state (IFF_RUNNING). 31 {:event "newlink" :name parameters.link :up :yes :running :yes} 32 {:present true :up true :running true} 33 34 {:event "newlink" :name parameters.link :up :yes} 35 {:present :true :up true} 36 37 {:event "newlink" :name parameters.link} 38 {:present true } 39 40 _ 41 {})] 42 (when (. got parameters.expecting) 43 (os.exit 0))))) 44 45 46 (when parameters.verbose 47 (print (.. (. arg 0) ": waiting for " 48 parameters.link " to be " parameters.expecting))) 49 50 (run-events (sock:query {:link true})) 51 52 (while (sock:poll) (run-events (sock:event)))