summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregor Kleen <gkleen@yggdrasil.li>2025-10-16 08:54:47 +0200
committerGregor Kleen <gkleen@yggdrasil.li>2025-10-16 08:54:47 +0200
commit38e371ebe3006fd42ec07892c439872581632b8f (patch)
tree60cc2117e09b33dd79e6acbd8f409fedf4766a29
parent41efa2ab074e43021fea33ce03c36f60b24cffa9 (diff)
downloadnixos-38e371ebe3006fd42ec07892c439872581632b8f.tar
nixos-38e371ebe3006fd42ec07892c439872581632b8f.tar.gz
nixos-38e371ebe3006fd42ec07892c439872581632b8f.tar.bz2
nixos-38e371ebe3006fd42ec07892c439872581632b8f.tar.xz
nixos-38e371ebe3006fd42ec07892c439872581632b8f.zip
...
-rw-r--r--hosts/vidhar/default.nix2
-rw-r--r--hosts/vidhar/network/default.nix2
-rw-r--r--hosts/vidhar/network/pppoe.nix4
-rw-r--r--hosts/vidhar/prometheus/default.nix52
-rw-r--r--hosts/vidhar/prometheus/zte_dsl01.mgmt.yggdrasil26
-rw-r--r--overlays/nftables-prometheus-exporter/nftables-prometheus-exporter.py22
-rw-r--r--overlays/zte-prometheus-exporter/default.nix2
7 files changed, 93 insertions, 17 deletions
diff --git a/hosts/vidhar/default.nix b/hosts/vidhar/default.nix
index 547572c6..1c60ed22 100644
--- a/hosts/vidhar/default.nix
+++ b/hosts/vidhar/default.nix
@@ -157,8 +157,6 @@ with lib;
157 recommendedProxySettings = true; 157 recommendedProxySettings = true;
158 recommendedTlsSettings = true; 158 recommendedTlsSettings = true;
159 commonHttpConfig = '' 159 commonHttpConfig = ''
160 ssl_ecdh_curve X25519:prime256v1:secp521r1:secp384r1;
161
162 log_format main 160 log_format main
163 '$remote_addr "$remote_user" ' 161 '$remote_addr "$remote_user" '
164 '"$host" "$request" $status $bytes_sent ' 162 '"$host" "$request" $status $bytes_sent '
diff --git a/hosts/vidhar/network/default.nix b/hosts/vidhar/network/default.nix
index 5245972d..6fcef9d8 100644
--- a/hosts/vidhar/network/default.nix
+++ b/hosts/vidhar/network/default.nix
@@ -1,4 +1,4 @@
1{ pkgs, lib, ... }: 1{ pkgs, lib, config, ... }:
2 2
3with lib; 3with lib;
4 4
diff --git a/hosts/vidhar/network/pppoe.nix b/hosts/vidhar/network/pppoe.nix
index da64b353..ff70cc0f 100644
--- a/hosts/vidhar/network/pppoe.nix
+++ b/hosts/vidhar/network/pppoe.nix
@@ -70,8 +70,8 @@ in {
70 70
71 tc qdisc add dev "${pppInterface}" handle ffff: ingress 71 tc qdisc add dev "${pppInterface}" handle ffff: ingress
72 tc filter add dev "${pppInterface}" parent ffff: basic action ctinfo dscp 0x0000003f 0x00000040 action mirred egress redirect dev "ifb4${pppInterface}" 72 tc filter add dev "${pppInterface}" parent ffff: basic action ctinfo dscp 0x0000003f 0x00000040 action mirred egress redirect dev "ifb4${pppInterface}"
73 tc qdisc replace dev "ifb4${pppInterface}" root cake memlimit 128Mb overhead 35 mpu 74 regional diffserv4 bandwidth ${toString (builtins.floor (159 * 0.95))}mbit 73 tc qdisc replace dev "ifb4${pppInterface}" root cake memlimit 128Mb overhead 35 mpu 74 regional diffserv4 bandwidth ${toString (builtins.floor (177968 * 0.95))}kbit
74 tc qdisc replace dev "${pppInterface}" root cake memlimit 128Mb overhead 35 mpu 74 regional nat diffserv4 wash bandwidth ${toString (builtins.floor (36 * 0.95))}mbit 74 tc qdisc replace dev "${pppInterface}" root cake memlimit 128Mb overhead 35 mpu 74 regional nat diffserv4 wash bandwidth ${toString (builtins.floor (41216 * 0.95))}kbit
75 ''; 75 '';
76 }; 76 };
77 in "${app}/bin/${app.meta.mainProgram}"; 77 in "${app}/bin/${app.meta.mainProgram}";
diff --git a/hosts/vidhar/prometheus/default.nix b/hosts/vidhar/prometheus/default.nix
index 094f9f7a..005af680 100644
--- a/hosts/vidhar/prometheus/default.nix
+++ b/hosts/vidhar/prometheus/default.nix
@@ -145,6 +145,17 @@ in {
145 ]; 145 ];
146 scrape_interval = "15s"; 146 scrape_interval = "15s";
147 } 147 }
148 { job_name = "zte";
149 static_configs = [
150 { targets = ["localhost:9900"]; }
151 ];
152 relabel_configs = [
153 { replacement = "dsl01";
154 target_label = "instance";
155 }
156 ];
157 scrape_interval = "15s";
158 }
148 { job_name = "unbound"; 159 { job_name = "unbound";
149 static_configs = [ 160 static_configs = [
150 { targets = ["localhost:${toString config.services.prometheus.exporters.unbound.port}"]; } 161 { targets = ["localhost:${toString config.services.prometheus.exporters.unbound.port}"]; }
@@ -425,6 +436,47 @@ in {
425 }; 436 };
426 }; 437 };
427 438
439 systemd.services."prometheus-zte-exporter@dsl01.mgmt.yggdrasil" = {
440 wantedBy = [ "multi-user.target" ];
441 after = [ "network.target" ];
442 serviceConfig = {
443 Restart = "always";
444 PrivateTmp = true;
445 WorkingDirectory = "/tmp";
446 DynamicUser = true;
447 CapabilityBoundingSet = [""];
448 DeviceAllow = [""];
449 LockPersonality = true;
450 MemoryDenyWriteExecute = true;
451 NoNewPrivileges = true;
452 PrivateDevices = true;
453 ProtectClock = true;
454 ProtectControlGroups = true;
455 ProtectHome = true;
456 ProtectHostname = true;
457 ProtectKernelLogs = true;
458 ProtectKernelModules = true;
459 ProtectKernelTunables = true;
460 ProtectSystem = "strict";
461 RemoveIPC = true;
462 RestrictAddressFamilies = [ "AF_INET" "AF_INET6" ];
463 RestrictNamespaces = true;
464 RestrictRealtime = true;
465 RestrictSUIDSGID = true;
466 SystemCallArchitectures = "native";
467 UMask = "0077";
468
469 Type = "simple";
470 ExecStart = "${pkgs.zte-prometheus-exporter}/bin/zte-prometheus-exporter";
471 Environment = "ZTE_BASEURL=http://%I ZTE_HOSTNAME=localhost ZTE_PORT=9900";
472 EnvironmentFile = config.sops.secrets."zte_dsl01.mgmt.yggdrasil".path;
473 };
474 };
475 sops.secrets."zte_dsl01.mgmt.yggdrasil" = {
476 format = "binary";
477 sopsFile = ./zte_dsl01.mgmt.yggdrasil;
478 };
479
428 services.nginx = { 480 services.nginx = {
429 upstreams.prometheus = { 481 upstreams.prometheus = {
430 servers = { "localhost:${toString config.services.prometheus.port}" = {}; }; 482 servers = { "localhost:${toString config.services.prometheus.port}" = {}; };
diff --git a/hosts/vidhar/prometheus/zte_dsl01.mgmt.yggdrasil b/hosts/vidhar/prometheus/zte_dsl01.mgmt.yggdrasil
new file mode 100644
index 00000000..1c9c1fe0
--- /dev/null
+++ b/hosts/vidhar/prometheus/zte_dsl01.mgmt.yggdrasil
@@ -0,0 +1,26 @@
1{
2 "data": "ENC[AES256_GCM,data:nAsn7dhfDr0+V1cJjpqWn/kJQt2zGjlfQKi3n5speroJkL3IvMG/9fsTaXJQZSi2gPlrN8GbxKQ=,iv:9g0V3xRBC+sa/JPP2bUZMfg//VuKT5qI7ua9iU4QRCg=,tag:fzwih9OHUBLmx8dxL4BjGg==,type:str]",
3 "sops": {
4 "kms": null,
5 "gcp_kms": null,
6 "azure_kv": null,
7 "hc_vault": null,
8 "age": [
9 {
10 "recipient": "age1qffdqvy9arld9zd5a5cylt0n98xhcns5shxhrhwjq5g4qa844ejselaa4l",
11 "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBIaEE3bUFBY0xKSDUrVnc2\nbFpjSkNOSm56amJTNjdXcTljdDNRREhITm1NCjZrOUEwNFpxN2FmTVV5T2xCbENk\nMEFmVzlPZ29CTlJ4dVNCRUsyRFFseXcKLS0tIEhscVZ4VUVsaG9OUnBIRFE4WXA2\ncGFnbWpNMlNIQzFLc1Ryc1Z3NUl1bVUKi9zYBlF2vslGKu4GP368ApbvuxjZnQpF\nuOujXSNoEps21wY6xUENm+CbYbgaJjSgmb5c1IjAmnubVI4JVY9OyQ==\n-----END AGE ENCRYPTED FILE-----\n"
12 }
13 ],
14 "lastmodified": "2021-12-31T15:00:33Z",
15 "mac": "ENC[AES256_GCM,data:sw2NVXHLibbuOChgScLhSTjGZBjSoHpzIuRqfCW0eL3DwhL5CekG6T/oYu06KjNmxVjxwb3OmqECSU0TUvPn9ySOWwMSoBfyJpDoTHnZ+YOjOH351IOAMBNcBDJse7aLGRWW5YXKLDfmp8Dhg2hlMhCmkVwAquQjPhfmAdJfj64=,iv:wgM/BlRU2XJSGj7KvAo1WRamecffUDnFvv2+4twtsQY=,tag:0mXblJtTGMTvxndedws94A==,type:str]",
16 "pgp": [
17 {
18 "created_at": "2023-01-30T10:58:49Z",
19 "enc": "-----BEGIN PGP MESSAGE-----\n\nhF4DXxoViZlp6dISAQdAcwl1Blp3J5wgpRJKbYI1G1yEZrRYeYuoDtYUh3ToMAQw\nd92/bIJJR5Ml91eDym9uBN0fFRRy72r6FOx4qZT7S4DhmuA84qCbASjF8bKSclc0\n0l4BBXvDS5Dz1Q7iYc+LxZjHASV1v73A+MaeCFvG/pjmHzF0z0EzBiAJD4ZWGcP0\nX2dDbjl+n9VFrvmeLRxQNh4XZW43iTXdRjwHDgm16zhd9X6VOVhr5UkC4Nyjq2Ar\n=4ZEa\n-----END PGP MESSAGE-----\n",
20 "fp": "30D3453B8CD02FE2A3E7C78C0FB536FB87AE8F51"
21 }
22 ],
23 "unencrypted_suffix": "_unencrypted",
24 "version": "3.7.1"
25 }
26} \ No newline at end of file
diff --git a/overlays/nftables-prometheus-exporter/nftables-prometheus-exporter.py b/overlays/nftables-prometheus-exporter/nftables-prometheus-exporter.py
index 484228c8..60ef4670 100644
--- a/overlays/nftables-prometheus-exporter/nftables-prometheus-exporter.py
+++ b/overlays/nftables-prometheus-exporter/nftables-prometheus-exporter.py
@@ -42,7 +42,7 @@ class NFTMetrics:
42 cls._instance = cls.__new__(cls) 42 cls._instance = cls.__new__(cls)
43 cls._instance.attrs = None 43 cls._instance.attrs = None
44 return cls._instance 44 return cls._instance
45 45
46 46
47 def __init__(self): 47 def __init__(self):
48 raise RuntimeError('Call instance() instead') 48 raise RuntimeError('Call instance() instead')
@@ -62,7 +62,7 @@ class NFTMetrics:
62 raise RuntimeError(f'nftables json schema v{version} is not supported') 62 raise RuntimeError(f'nftables json schema v{version} is not supported')
63 queries[query_name] = data['nftables'][1:] 63 queries[query_name] = data['nftables'][1:]
64 64
65 65
66 def extract_query(query_name, type_name): 66 def extract_query(query_name, type_name):
67 return [ 67 return [
68 item[type_name] 68 item[type_name]
@@ -98,21 +98,21 @@ class NFTMetrics:
98 metrics += _format_prom_metrics('nftables_counter_packets_count', 'counter', counter_packets) 98 metrics += _format_prom_metrics('nftables_counter_packets_count', 'counter', counter_packets)
99 99
100 map_counts = [] 100 map_counts = []
101 for meter in self.attrs['maps']: 101 for item in self.attrs['maps']:
102 labels = { k: v for k, v in counter.items() if k not in set(['elem']) } 102 labels = { k: v for k, v in counter.items() if k not in set(['elem']) }
103 map_counts += [(labels, len(meter['elem']))] 103 map_counts += [(labels, len(item['elem']) if 'elem' in item else 0)]
104 metrics += _format_prom_metrics('nftables_map_elem_count', 'gauge', map_counts) 104 metrics += _format_prom_metrics('nftables_map_elem_count', 'gauge', map_counts)
105 105
106 meter_counts = [] 106 meter_counts = []
107 for meter in self.attrs['meters']: 107 for item in self.attrs['meters']:
108 labels = { k: v for k, v in counter.items() if k not in set(['elem']) } 108 labels = { k: v for k, v in counter.items() if k not in set(['elem']) }
109 meter_counts += [(labels, len(meter['elem']))] 109 item_counts += [(labels, len(item['elem']) if 'elem' in item else 0)]
110 metrics += _format_prom_metrics('nftables_meter_elem_count', 'gauge', meter_counts) 110 metrics += _format_prom_metrics('nftables_meter_elem_count', 'gauge', meter_counts)
111 111
112 set_counts = [] 112 set_counts = []
113 for meter in self.attrs['sets']: 113 for item in self.attrs['sets']:
114 labels = { k: v for k, v in counter.items() if k not in set(['elem']) } 114 labels = { k: v for k, v in counter.items() if k not in set(['elem']) }
115 set_counts += [(labels, len(meter['elem']))] 115 set_counts += [(labels, len(item['elem']) if 'elem' in item else 0)]
116 metrics += _format_prom_metrics('nftables_set_elem_count', 'gauge', set_counts) 116 metrics += _format_prom_metrics('nftables_set_elem_count', 'gauge', set_counts)
117 117
118 return metrics.encode('utf-8') 118 return metrics.encode('utf-8')
@@ -120,7 +120,7 @@ class NFTMetrics:
120class NFTMetricsServer(BaseHTTPRequestHandler): 120class NFTMetricsServer(BaseHTTPRequestHandler):
121 def log_message(self, format, *args): 121 def log_message(self, format, *args):
122 pass 122 pass
123 123
124 def do_GET(self): 124 def do_GET(self):
125 nft_metrics = NFTMetrics.instance() 125 nft_metrics = NFTMetrics.instance()
126 nft_metrics.update() 126 nft_metrics.update()
@@ -138,7 +138,7 @@ class NFTMetricsServer(BaseHTTPRequestHandler):
138 self.send_response(200) 138 self.send_response(200)
139 self.send_header("Content-type", "text/plain") 139 self.send_header("Content-type", "text/plain")
140 self.end_headers() 140 self.end_headers()
141 141
142 self.wfile.write(nft_metrics.prometheus()) 142 self.wfile.write(nft_metrics.prometheus())
143 case _: 143 case _:
144 self.send_response(404) 144 self.send_response(404)
diff --git a/overlays/zte-prometheus-exporter/default.nix b/overlays/zte-prometheus-exporter/default.nix
index cd4207cd..6295567d 100644
--- a/overlays/zte-prometheus-exporter/default.nix
+++ b/overlays/zte-prometheus-exporter/default.nix
@@ -1,7 +1,7 @@
1{ final, prev, ... }: 1{ final, prev, ... }:
2let 2let
3 packageOverrides = final.callPackage ./python-packages.nix {}; 3 packageOverrides = final.callPackage ./python-packages.nix {};
4 inpPython = final.python310.override { inherit packageOverrides; }; 4 inpPython = final.python3.override { inherit packageOverrides; };
5 python = inpPython.withPackages (ps: with ps; [pytimeparse requests]); 5 python = inpPython.withPackages (ps: with ps; [pytimeparse requests]);
6in { 6in {
7 zte-prometheus-exporter = prev.stdenv.mkDerivation rec { 7 zte-prometheus-exporter = prev.stdenv.mkDerivation rec {