# Usage: # ^nft --json list sets | nu --stdin api/netbird-nft-sets.nu # open --raw test-data/nft-sets.json | nu --stdin api/netbird-nft-sets.nu 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 for $s in $set_changes { let path = [$s.family $s.table $s.nft_name] | str join ' ' print $"flush set ($path)" print $"add element ($path) { ($s.new_elem | str join ', ') }" } } def main [] { $in | from json | get nftables | skip 1 | get set | find-changed-sets | generate-nft-commands }