aboutsummaryrefslogtreecommitdiff
path: root/api/netbird-nft-sets.nu
diff options
context:
space:
mode:
Diffstat (limited to 'api/netbird-nft-sets.nu')
-rw-r--r--api/netbird-nft-sets.nu46
1 files changed, 46 insertions, 0 deletions
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 <name> # ignore if table already exists
+# nft destroy table inet <name> # 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
+}