summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregor Kleen <gkleen@yggdrasil.li>2025-11-22 13:59:13 +0100
committerGregor Kleen <gkleen@yggdrasil.li>2025-11-22 13:59:13 +0100
commit3fcc1a7f1ea8acd7236eb632268fa8e382b2e270 (patch)
tree8a53b327b103f9e06528235c711571ba4589a532
parent4c46e82769847177f6582447f027a56f9b555fd0 (diff)
downloadnixos-3fcc1a7f1ea8acd7236eb632268fa8e382b2e270.tar
nixos-3fcc1a7f1ea8acd7236eb632268fa8e382b2e270.tar.gz
nixos-3fcc1a7f1ea8acd7236eb632268fa8e382b2e270.tar.bz2
nixos-3fcc1a7f1ea8acd7236eb632268fa8e382b2e270.tar.xz
nixos-3fcc1a7f1ea8acd7236eb632268fa8e382b2e270.zip
...
-rw-r--r--hosts/vidhar/network/pppoe.nix141
-rw-r--r--hosts/vidhar/prometheus/default.nix9
2 files changed, 69 insertions, 81 deletions
diff --git a/hosts/vidhar/network/pppoe.nix b/hosts/vidhar/network/pppoe.nix
index d17be349..7cdf3cb6 100644
--- a/hosts/vidhar/network/pppoe.nix
+++ b/hosts/vidhar/network/pppoe.nix
@@ -4,48 +4,6 @@ with lib;
4 4
5let 5let
6 pppInterface = config.networking.pppInterface; 6 pppInterface = config.networking.pppInterface;
7
8 corerad-deprecated = pkgs.writers.writeBashBin "corerad-deprecated" ''
9 exec -- ${lib.getExe' config.systemd.package "systemd-run"} \
10 --unit=corerad-deprecated@$(${lib.getExe' config.systemd.package "systemd-escape"} $1) \
11 --property=AmbientCapabilities="CAP_NET_ADMIN CAP_NET_RAW" \
12 --property=CapabilityBoundingSet="CAP_NET_ADMIN CAP_NET_RAW" \
13 --property=DynamicUser=yes \
14 --property=LimitNOFILE=1048576 \
15 --property=LimitNPROC=512 \
16 --property=NotifyAccess=main \
17 --property=Type=notify \
18 --property=RuntimeMaxSec=4h \
19 ${pkgs.writers.writeBash "corerad-deprecated" ''
20 exec -- ${lib.getExe pkgs.corerad} -c=<(${pkgs.writers.writePython3 "corerad-config" {
21 libraries = with pkgs.python3Packages; [ toml ];
22 flakeIgnore = [ "E124" "E121" ];
23 } ''
24 import toml
25 import sys
26 import re
27
28 match = re.fullmatch(r'(?P<interface>[^/]+)/(?P<prefix>.+)', sys.argv[1])
29
30 toml.dump({
31 "interfaces": [
32 {
33 "name": match.group("interface"),
34 "advertise": True,
35 "prefix": [
36 {
37 "prefix": match.group("prefix"),
38 "preferred_lifetime": "1s",
39 "valid_lifetime": "14400s",
40 "deprecated": True,
41 },
42 ],
43 },
44 ],
45 }, sys.stdout)
46 ''} $@)
47 ''} $@
48 '';
49in { 7in {
50 options = { 8 options = {
51 networking.pppInterface = mkOption { 9 networking.pppInterface = mkOption {
@@ -148,33 +106,6 @@ in {
148 }; 106 };
149 }; 107 };
150 108
151 services.corerad = {
152 enable = true;
153 settings = {
154 interfaces = [
155 { name = pppInterface;
156 monitor = true;
157 verbose = true;
158 }
159 { name = "lan";
160 advertise = true;
161 verbose = true;
162 prefix = [{ prefix = "::/64"; }];
163 route = [{ prefix = "::/0"; }];
164 rdnss = [{ servers = ["::"]; }];
165 dnssl = [{ domain_names = ["yggdrasil"]; }];
166 # other_config = true;
167 }
168 ];
169
170 debug = {
171 address = "localhost:9430";
172 prometheus = true;
173 };
174 };
175 };
176 environment.systemPackages = [ corerad-deprecated ];
177
178 services.ndppd = { 109 services.ndppd = {
179 enable = true; 110 enable = true;
180 proxies = { 111 proxies = {
@@ -273,14 +204,78 @@ in {
273 RestartSec = "5"; 204 RestartSec = "5";
274 }; 205 };
275 }; 206 };
276 systemd.services.corerad = { 207 systemd.services.radvd = {
277 wantedBy = [ "dhcpcd.service" ]; 208 wantedBy = [ "dhcpcd.service" "multi-user.target" ];
278 bindsTo = [ "dhcpcd.service" ]; 209 bindsTo = [ "dhcpcd.service" ];
279 after = [ "dhcpcd.service" ]; 210 after = [ "dhcpcd.service" "network.target" ];
280 211
281 serviceConfig = { 212 serviceConfig = {
282 Restart = lib.mkForce "always"; 213 Restart = "always";
283 RestartSec = "5"; 214 RestartSec = "5";
215 DynamicUser = true;
216 AmbientCapabilities = ["CAP_NET_ADMIN" "CAP_NET_RAW"];
217 CapabilityBoundingSet = ["CAP_NET_ADMIN" "CAP_NET_RAW"];
218 RuntimeDirectory = "radvd";
219 PIDFile = "$RUNTIME_DIRECTORY/radvd.pid";
220 ExecStart = pkgs.writers.writePython3 "radvd-genconfig" {
221 libraries = with pkgs.python3Packages; [ jinja2 ];
222 doCheck = false;
223 } ''
224 import os
225 from tempfile import NamedTemporaryFile
226 import subprocess
227 import json
228 import jinja2
229 from pathlib import Path
230 from ipaddress import IPv6Network
231
232
233 def network_address(value, prefixlen):
234 return IPv6Network(value + "/" + str(prefixlen), strict=False).network_address
235
236
237 with subprocess.Popen(["${lib.getExe' pkgs.iproute2 "ip"}", "-j", "addr", "show", "dev", "lan"], stdout=subprocess.PIPE) as proc:
238 addresses = json.load(proc.stdout)
239
240 global_addresses = [ addr for addr in addresses[0]["addr_info"] if addr["family"] == "inet6" and addr["scope"] == "global" ]
241
242 if not global_addresses:
243 sys.exit(1)
244
245 with NamedTemporaryFile(mode='w', dir=os.environ["RUNTIME_DIRECTORY"], prefix="radvd.", suffix=".conf", delete=False) as fh:
246 config_file = fh.name
247 env = jinja2.Environment(
248 loader = jinja2.FileSystemLoader("${pkgs.writeTextDir "radvd.conf.jinja2" ''
249 interface lan {
250 IgnoreIfMissing off;
251 AdvSendAdvert on;
252 MaxRtrAdvInterval 240;
253 {% for addr in addrs %}
254 prefix {{addr["local"] | network_address(addr["prefixlen"])}}/{{addr["prefixlen"]}} {
255 AdvValidLifetime 86400;
256 AdvPreferredLifetime 300;
257 DeprecatePrefix on;
258 };
259 route {{addr["local"] | network_address(56)}}/56 {
260 AdvRouteLifetime 300;
261 RemoveRoute on;
262 };
263 RDNSS {{addr["local"]}} {
264 AdvRDNSSLifetime 300;
265 };
266 {%- endfor %}
267 DNSSL yggdrasil {};
268 };
269 ''}"),
270 autoescape = False,
271 )
272 env.filters["network_address"] = network_address
273 env.get_template("radvd.conf.jinja2").stream({
274 "addrs": global_addresses,
275 }).dump(fh)
276
277 os.execv("${lib.getExe pkgs.radvd}", ["radvd", "-n", "-p", str(Path(os.environ["RUNTIME_DIRECTORY"]) / "radvd.pid"), "-d", "1", "-C", config_file])
278 '';
284 }; 279 };
285 }; 280 };
286 281
diff --git a/hosts/vidhar/prometheus/default.nix b/hosts/vidhar/prometheus/default.nix
index 125fd568..69992115 100644
--- a/hosts/vidhar/prometheus/default.nix
+++ b/hosts/vidhar/prometheus/default.nix
@@ -64,7 +64,7 @@ in {
64 systemd = { 64 systemd = {
65 enable = true; 65 enable = true;
66 extraFlags = [ 66 extraFlags = [
67 "--systemd.collector.unit-include=(dhcpcd|pppd-telekom|corerad|ndppd)\.service" 67 "--systemd.collector.unit-include=(dhcpcd|pppd-telekom|radvd|ndppd)\.service"
68 "--systemd.collector.enable-restart-count" 68 "--systemd.collector.enable-restart-count"
69 "--systemd.collector.enable-ip-accounting" 69 "--systemd.collector.enable-ip-accounting"
70 ]; 70 ];
@@ -170,13 +170,6 @@ in {
170 relabel_configs = relabelHosts; 170 relabel_configs = relabelHosts;
171 scrape_interval = "1s"; 171 scrape_interval = "1s";
172 } 172 }
173 { job_name = "corerad";
174 static_configs = [
175 { targets = ["localhost:9430"]; }
176 ];
177 relabel_configs = relabelHosts;
178 scrape_interval = "1s";
179 }
180 { job_name = "nftables"; 173 { job_name = "nftables";
181 static_configs = [ 174 static_configs = [
182 { targets = ["localhost:9901"]; } 175 { targets = ["localhost:9901"]; }