liminix

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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  }