{ config, lib, pkgs, options }: with lib; let cfg = config.services.prometheus.exporters.wireguard; in { port = 9586; extraOpts = { verbose = mkEnableOption "Verbose logging mode for prometheus-wireguard-exporter"; wireguardConfig = mkOption { type = with types; nullOr (either path str); default = null; description = '' Path to the Wireguard Config to add the peer's name to the stats of a peer. Please note that networking.wg-quick is required for this feature as networking.wireguard uses wg8 to set the peers up. ''; }; singleSubnetPerField = mkOption { type = types.bool; default = false; description = '' By default, all allowed IPs and subnets are comma-separated in the allowed_ips field. With this option enabled, a single IP and subnet will be listed in fields like allowed_ip_0, allowed_ip_1 and so on. ''; }; withRemoteIp = mkOption { type = types.bool; default = false; description = '' Whether or not the remote IP of a WireGuard peer should be exposed via prometheus. ''; }; }; serviceOpts = { path = [ pkgs.wireguard-tools ]; serviceConfig = { AmbientCapabilities = [ "CAP_NET_ADMIN" ]; ExecStart = '' ${pkgs.prometheus-wireguard-exporter}/bin/prometheus_wireguard_exporter \ -p ${toString cfg.port} \ ${optionalString cfg.verbose "-v"} \ ${optionalString cfg.singleSubnetPerField "-s"} \ ${optionalString cfg.withRemoteIp "-r"} \ ${optionalString (cfg.wireguardConfig != null) "-n ${cfg.wireguardConfig}"} ''; }; }; }