ifwait.fnl (2107B)
1 (local nl (require :anoia.nl)) 2 (local { : assoc : system } (require :anoia)) 3 4 ; (local { : view} (require :fennel)) 5 6 (fn parse-args [args] 7 (match args 8 ["-v" & rest] (assoc (parse-args rest) :verbose true) 9 ["-t" timeout & rest] (assoc (parse-args rest) :timeout (tonumber timeout)) 10 ["-s" service & rest] (assoc (parse-args rest) :service service) 11 [linkname "up"] {:link linkname :expecting "up"} 12 [linkname "running"] {:link linkname :expecting "running"} 13 [linkname "present"] {:link linkname :expecting "present"} 14 [linkname nil] {:link linkname :expecting "present"} 15 _ nil)) 16 17 (fn event-matches? [params v] 18 (let [got 19 (match v 20 ;; - up: Reflects the administrative state of the interface (IFF_UP) 21 ;; - running: Reflects the operational state (IFF_RUNNING). 22 {:event "newlink" :name params.link :up :yes :running :yes} 23 {:present true :up true :running true} 24 25 {:event "newlink" :name params.link :up :yes} 26 {:present :true :up true} 27 28 {:event "newlink" :name params.link} 29 {:present true } 30 31 _ 32 {})] 33 (not (not (. got params.expecting))))) 34 35 (var up :unknown) 36 (fn toggle-service [service wanted?] 37 (when (not (= up wanted?)) 38 (set up 39 (if wanted? 40 (pcall system (.. "s6-rc -b -u change " service)) 41 (not (pcall system (.. "s6-rc -b -d change " service))))) 42 )) 43 44 (fn run [args event-fn] 45 (set up :unknown) 46 (let [parameters 47 (assert (parse-args args) 48 (.. "Usage: ifwait [-v] ifname [present|up|running]"))] 49 (when parameters.verbose 50 (print (.. "ifwait: waiting for " 51 parameters.link " to be " parameters.expecting))) 52 53 (if parameters.service 54 (each [e (event-fn)] 55 (if (= e.name parameters.link) 56 (toggle-service parameters.service (event-matches? parameters e)))) 57 (each [e (event-fn) 58 &until (event-matches? parameters e)] 59 true)))) 60 61 (when (not (= (. arg 0) "test")) 62 (run arg #(nl.events {:link true}))) 63 64 { : run }