From ba9e4bb19424866e77b97513e75141155bd5bcbf Mon Sep 17 00:00:00 2001 From: Supremist Date: Mon, 6 Jul 2026 19:34:48 +0300 Subject: Generate nft commands for changed netbird peers/groups --- api/netbird-nft-sets.nu | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 api/netbird-nft-sets.nu (limited to 'api/netbird-nft-sets.nu') diff --git a/api/netbird-nft-sets.nu b/api/netbird-nft-sets.nu new file mode 100644 index 0000000..2187aa6 --- /dev/null +++ b/api/netbird-nft-sets.nu @@ -0,0 +1,46 @@ +# 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 +} -- cgit v1.2.3