bootstrap: Rewrite in Nu

This commit is contained in:
Lorenz Leutgeb
2026-04-28 23:48:51 +02:00
parent 4bb9d9b854
commit b8db72c470
5 changed files with 46 additions and 39 deletions
+1
View File
@@ -164,6 +164,7 @@
self.checks.${system}.pre-commit.enabledPackages
++ (with pkgs; [
dnscontrol
nushell
]);
};
+9 -7
View File
@@ -1,12 +1,14 @@
select json_object(a1.node, json_group_array (a2.value))
select
node,
substr(value, 0, instr(value, ':')) as host,
substr(value, instr(value, ':') + 1) as port
from
addresses a1
inner join addresses a2 using (node)
addresses
where
a1.banned = false and
a1.type != 'onion' and
unixepoch() - (a1.last_success / 1000) < (60 * 60 * 24 * 7)
banned = false and
type == 'dns' and
unixepoch() - (last_success / 1000) < (60 * 60 * 24 * 7)
group by a1.node
order by node
+11 -10
View File
@@ -8,22 +8,23 @@
services.radicle-bootstrap = {
serviceConfig.Type = "oneshot";
script = ''
cat "${./addresses.sql}" | sqlite3 "/var/lib/radicle/node/node.db" | \
jq --slurp add | \
jq \
--raw-output \
--arg serviceName "_radicle-node.tcp" \
--from-file "${./zone.jq}" \
> "/etc/knot/dns-sd.zone"
nu ${./zone.nu} \
--db "/var/lib/radicle/node/node.db" \
--query ${./addresses.sql} \
--zone "/etc/knot/dns-sd.zone"
knotc -b zone-reload "bootstrap.radicle.network"
'';
after = ["systemd-resolved.service"];
wants = ["knot.service"];
requires = ["knot.service"];
requires = [
"knot.service"
"systemd-resolved.service"
];
path = with pkgs; [
jq
sqlite
knot-dns
nushell
config.systemd.package
];
};
timers.radicle-bootstrap = {
-22
View File
@@ -1,22 +0,0 @@
to_entries
| .[]
| .key as $nid
| "_radicle-node._tcp" as $serviceName
| "\($nid).\($serviceName)" as $name
| [
"\($serviceName) PTR \($name)",
"\($name) TXT \"nid=\($nid)\"",
"\($name) TXT \"version=1\"",
"\($name) TXT \"network=main\"",
(.value
| unique
| to_entries[]
| .key as $weight
| (.value | capture("(?<host>[^:]+):(?<port>[0-9]+)"))
| "\($nid).\($serviceName) SRV 0 \($weight) \(.port) \(.host)."),
""
]
| .[]
+25
View File
@@ -0,0 +1,25 @@
#! /usr/bin/env nu
def main [
--db: path # Path of node database to query
--query: path # Path of query to run against database
--zone: path # Path of the zone file to (over)write
] {
open $db |
query db $"(open $query)" |
where {|row|
(^resolvectl query --cname=false $row.host | complete).exit_code == 0
} |
each {|row|
let serviceName = "_radicle-node._tcp"
let name = $"($row.node).($serviceName)"
$"
($serviceName) PTR ($name)
($name) TXT \"nid=($row.node)\"
($name) TXT \"version=1\"
($name) TXT \"network=main\"
($name) SRV 0 1 ($row.port) ($row.host)."
} |
str join "\n" |
save -f $zone
}