aboutsummaryrefslogtreecommitdiff
path: root/api/update-netbird-nftables.nu
diff options
context:
space:
mode:
authorSupremist <sergkarv@gmail.com>2026-07-09 18:23:11 +0300
committerSupremist <sergkarv@gmail.com>2026-07-09 18:23:11 +0300
commite3012776a657e7a1d84f6c77f57a7730480597ca (patch)
tree1b3c51de8497679e5df6e0ede36b23eecf05d18c /api/update-netbird-nftables.nu
parentf0aaa78ab5c49d3a6c702cc58e8b4983855c836e (diff)
downloadnetbird-e3012776a657e7a1d84f6c77f57a7730480597ca.tar.xz
netbird-e3012776a657e7a1d84f6c77f57a7730480597ca.zip
Update netbird ips in nft sets on monitor events
Diffstat (limited to 'api/update-netbird-nftables.nu')
-rw-r--r--api/update-netbird-nftables.nu54
1 files changed, 54 insertions, 0 deletions
diff --git a/api/update-netbird-nftables.nu b/api/update-netbird-nftables.nu
new file mode 100644
index 0000000..95b9e02
--- /dev/null
+++ b/api/update-netbird-nftables.nu
@@ -0,0 +1,54 @@
+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
+ $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
+ }
+}