{ config, lib, pkgs, options, ... }: let cfg = config.services.prometheus.exporters.collectd; inherit (lib) mkOption mkEnableOption types optionalString concatStringsSep escapeShellArg ; in { port = 9103; extraOpts = { collectdBinary = { enable = mkEnableOption "collectd binary protocol receiver"; authFile = mkOption { default = null; type = types.nullOr types.path; description = "File mapping user names to pre-shared keys (passwords)."; }; port = mkOption { type = types.port; default = 25826; description = "Network address on which to accept collectd binary network packets."; }; listenAddress = mkOption { type = types.str; default = "0.0.0.0"; description = '' Address to listen on for binary network packets. ''; }; securityLevel = mkOption { type = types.enum [ "None" "Sign" "Encrypt" ]; default = "None"; description = '' Minimum required security level for accepted packets. ''; }; }; logFormat = mkOption { type = types.enum [ "logfmt" "json" ]; default = "logfmt"; example = "json"; description = '' Set the log format. ''; }; logLevel = mkOption { type = types.enum [ "debug" "info" "warn" "error" "fatal" ]; default = "info"; description = '' Only log messages with the given severity or above. ''; }; }; serviceOpts = let collectSettingsArgs = optionalString (cfg.collectdBinary.enable) '' --collectd.listen-address ${cfg.collectdBinary.listenAddress}:${toString cfg.collectdBinary.port} \ --collectd.security-level ${cfg.collectdBinary.securityLevel} \ ''; in { serviceConfig = { ExecStart = '' ${pkgs.prometheus-collectd-exporter}/bin/collectd_exporter \ --log.format ${escapeShellArg cfg.logFormat} \ --log.level ${cfg.logLevel} \ --web.listen-address ${cfg.listenAddress}:${toString cfg.port} \ ${collectSettingsArgs} \ ${concatStringsSep " \\\n " cfg.extraFlags} ''; }; }; }