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)))