105 lines
2.1 KiB
Nix
105 lines
2.1 KiB
Nix
{ config, pkgs, lib, ... }:
|
|
|
|
with lib;
|
|
|
|
let
|
|
cfg = config.services.collectd;
|
|
|
|
conf = pkgs.writeText "collectd.conf" ''
|
|
BaseDir "${cfg.dataDir}"
|
|
AutoLoadPlugin ${boolToString cfg.autoLoadPlugin}
|
|
Hostname "${config.networking.hostName}"
|
|
|
|
LoadPlugin syslog
|
|
<Plugin "syslog">
|
|
LogLevel "info"
|
|
NotifyLevel "OKAY"
|
|
</Plugin>
|
|
|
|
${concatMapStrings (f: ''
|
|
Include "${f}"
|
|
'') cfg.include}
|
|
|
|
${cfg.extraConfig}
|
|
'';
|
|
|
|
in {
|
|
options.services.collectd = with types; {
|
|
enable = mkEnableOption "collectd agent";
|
|
|
|
package = mkOption {
|
|
default = pkgs.collectd;
|
|
defaultText = "pkgs.collectd";
|
|
description = ''
|
|
Which collectd package to use.
|
|
'';
|
|
type = package;
|
|
};
|
|
|
|
user = mkOption {
|
|
default = "collectd";
|
|
description = ''
|
|
User under which to run collectd.
|
|
'';
|
|
type = nullOr str;
|
|
};
|
|
|
|
dataDir = mkOption {
|
|
default = "/var/lib/collectd";
|
|
description = ''
|
|
Data directory for collectd agent.
|
|
'';
|
|
type = path;
|
|
};
|
|
|
|
autoLoadPlugin = mkOption {
|
|
default = false;
|
|
description = ''
|
|
Enable plugin autoloading.
|
|
'';
|
|
type = bool;
|
|
};
|
|
|
|
include = mkOption {
|
|
default = [];
|
|
description = ''
|
|
Additional paths to load config from.
|
|
'';
|
|
type = listOf str;
|
|
};
|
|
|
|
extraConfig = mkOption {
|
|
default = "";
|
|
description = ''
|
|
Extra configuration for collectd.
|
|
'';
|
|
type = lines;
|
|
};
|
|
|
|
};
|
|
|
|
config = mkIf cfg.enable {
|
|
systemd.services.collectd = {
|
|
description = "Collectd Monitoring Agent";
|
|
after = [ "network.target" ];
|
|
wantedBy = [ "multi-user.target" ];
|
|
|
|
serviceConfig = {
|
|
ExecStart = "${cfg.package}/sbin/collectd -C ${conf} -f";
|
|
User = cfg.user;
|
|
PermissionsStartOnly = true;
|
|
};
|
|
|
|
preStart = ''
|
|
mkdir -p "${cfg.dataDir}"
|
|
chmod 755 "${cfg.dataDir}"
|
|
chown -R ${cfg.user} "${cfg.dataDir}"
|
|
'';
|
|
};
|
|
|
|
users.users = optional (cfg.user == "collectd") {
|
|
name = "collectd";
|
|
};
|
|
};
|
|
}
|