liminix

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

acquire-wan-address.fnl (1203B)


      1 (local { : system } (require :anoia))
      2 (local svc (require :anoia.svc))
      3 
      4 ;; acquire-delegated-prefix has very similar code: we'd like to move
      5 ;; this to anoia.svc when we see what the general form would look like
      6 
      7 (fn changes [old-addresses new-addresses]
      8   (let [added {}
      9         deleted {}]
     10     (each [n address (pairs new-addresses)]
     11       (if (not (. old-addresses n))
     12           (table.insert added address)))
     13     (each [n address (pairs old-addresses)]
     14       (if (not (. new-addresses n))
     15           (table.insert deleted address)))
     16     (values added deleted)))
     17 
     18 (fn update-addresses [wan-device addresses new-addresses]
     19   (let [(added deleted) (changes addresses new-addresses)]
     20     (each [_ p (ipairs added)]
     21       (system
     22        (.. "ip address add " p.address "/" p.len " dev " wan-device)))
     23     (each [_ p (ipairs deleted)]
     24       (system
     25        (.. "ip address del " p.address "/" p.len " dev " wan-device)))
     26     new-addresses))
     27 
     28 (fn run []
     29   (let [[state-directory wan-device] arg
     30         dir (svc.open state-directory)]
     31     (accumulate [addresses []
     32                  v (dir:events)]
     33       (update-addresses wan-device addresses (v:output "address")))))
     34 
     35 { : update-addresses : changes : run }