liminix

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

acquire-delegated-prefix.fnl (2036B)


      1 (local { : merge : split : file-exists? : system } (require :anoia))
      2 (local svc (require :anoia.svc))
      3 
      4 (fn parse-prefix [str]
      5   (fn parse-extra [s]
      6     (let [out {}]
      7       (each [name val (string.gmatch s ",(.-)=([^,]+)")]
      8         (tset out name val))
      9       out))
     10   (let [(prefix len preferred valid extra)
     11         (string.match str "(.-)::/(%d+),(%d+),(%d+)(.*)$")]
     12     (merge {: prefix : len : preferred : valid} (parse-extra extra))))
     13 
     14 
     15 ;; Format: <prefix>/<length>,preferred,valid[,excluded=<excluded-prefix>/<length>][,class=<prefix class #>]
     16 
     17 ;;(parse-prefix "2001:8b0:de3a:40dc::/64,7198,7198")
     18 ;;(parse-prefix "2001:8b0:de3a:1001::/64,7198,7188,excluded=1/2,thi=10")
     19 
     20 
     21 (local bound-states
     22        { :bound true
     23          :rebound true
     24          :informed true
     25          :updated true
     26          :ra-updated true
     27          })
     28 
     29 ; (local { : view } (require :fennel))
     30 
     31 (fn changes [old-prefixes new-prefixes]
     32   (let [added {}
     33         deleted {}
     34         old-set (collect [_ v (ipairs old-prefixes)] (values v true))
     35         new-set (collect [_ v (ipairs new-prefixes)] (values v true))]
     36     (each [_ prefix (ipairs new-prefixes)]
     37       (if (not (. old-set prefix))
     38           (table.insert added (parse-prefix prefix))))
     39     (each [_ prefix (ipairs old-prefixes)]
     40       (if (not (. new-set prefix))
     41           (table.insert deleted (parse-prefix prefix))))
     42     (values added deleted)))
     43 
     44 (let [[state-directory lan-device] arg
     45       dir (svc.open state-directory)]
     46   (var prefixes [])
     47   (while true
     48     (while (not (dir:ready?)) (dir:wait))
     49     (if (. bound-states (dir:output "state"))
     50         (let [new-prefixes (split " " (dir:output "/prefixes"))
     51               (added deleted) (changes prefixes new-prefixes)]
     52           (each [_ p (ipairs added)]
     53             (system
     54              (.. "ip address add " p.prefix "::1/" p.len " dev " lan-device)))
     55           (each [_ p (ipairs deleted)]
     56             (system
     57              (.. "ip address del " p.prefix "::1/" p.len " dev " lan-device)))
     58     	  (set prefixes new-prefixes)))
     59     (dir:wait)))