use netbird-api.nu def mangle-name [prefix: string, name: string] { $prefix + ($name | str replace -ar '\s+' '_' | str replace -ar '\W' '') } def find-changed-sets [] { let sets = $in # nft_sets | rename --column { name: nft_name } let peers = netbird-api peers list | insert nft_name { mangle-name 'nbp_' $in.name | str downcase } | insert new_elem { [$in.ip] } let groups = netbird-api groups list | where peers != null | each { update peers { select id | join $peers id } } | insert nft_name { mangle-name 'nbg_' $in.name } # allow uppercase | insert new_elem { $in.peers.ip } let set_changes = [$peers, $groups] | flatten | join $sets nft_name | where { $in.new_elem != $in.elem } return $set_changes } def generate-nft-commands [] { # nft add talbe inet # ignore if table already exists # nft destroy table inet # ignore if table already removed let set_changes = $in $set_changes | each {|s| let path = [$s.family $s.table $s.nft_name] | str join ' ' [ $"flush set ($path)", $"add element ($path) { ($s.new_elem | str join ', ') }" ] } | flatten } def main [--test, --apply] { let commands = if $test { open --raw test-data/nft-sets.json } else { ^nft --json list sets } | from json | get nftables | skip 1 | get set | find-changed-sets | generate-nft-commands | str join "\n" if $apply { $commands | ^nft -f - } else { $commands } }