diff options
| author | Gregor Kleen <gkleen@yggdrasil.li> | 2025-10-16 08:54:47 +0200 |
|---|---|---|
| committer | Gregor Kleen <gkleen@yggdrasil.li> | 2025-10-16 08:54:47 +0200 |
| commit | 38e371ebe3006fd42ec07892c439872581632b8f (patch) | |
| tree | 60cc2117e09b33dd79e6acbd8f409fedf4766a29 | |
| parent | 41efa2ab074e43021fea33ce03c36f60b24cffa9 (diff) | |
| download | nixos-38e371ebe3006fd42ec07892c439872581632b8f.tar nixos-38e371ebe3006fd42ec07892c439872581632b8f.tar.gz nixos-38e371ebe3006fd42ec07892c439872581632b8f.tar.bz2 nixos-38e371ebe3006fd42ec07892c439872581632b8f.tar.xz nixos-38e371ebe3006fd42ec07892c439872581632b8f.zip | |
...
| -rw-r--r-- | hosts/vidhar/default.nix | 2 | ||||
| -rw-r--r-- | hosts/vidhar/network/default.nix | 2 | ||||
| -rw-r--r-- | hosts/vidhar/network/pppoe.nix | 4 | ||||
| -rw-r--r-- | hosts/vidhar/prometheus/default.nix | 52 | ||||
| -rw-r--r-- | hosts/vidhar/prometheus/zte_dsl01.mgmt.yggdrasil | 26 | ||||
| -rw-r--r-- | overlays/nftables-prometheus-exporter/nftables-prometheus-exporter.py | 22 | ||||
| -rw-r--r-- | overlays/zte-prometheus-exporter/default.nix | 2 |
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 | ||
| 3 | with lib; | 3 | with 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: | |||
| 120 | class NFTMetricsServer(BaseHTTPRequestHandler): | 120 | class 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, ... }: |
| 2 | let | 2 | let |
| 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]); |
| 6 | in { | 6 | in { |
| 7 | zte-prometheus-exporter = prev.stdenv.mkDerivation rec { | 7 | zte-prometheus-exporter = prev.stdenv.mkDerivation rec { |
