mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-07-13 21:50:33 +03:00
nagios: various improvements
* structured config for main config file allows to launch nagios in debug mode without having to write the whole config file by hand * build time syntax check * all options have types, one more example * I find it misleading that the main nagios config file is linked in /etc but that if you change the link in /etc/ and restart nagios, it has no effect. Have nagios use /etc/nagios.cfg * fix paths in example nagios config files, which allows to reuse it: services.nagios.objectDefs = (map (x: "${pkgs.nagios}/etc/objects/${x}.cfg") [ "templates" "timeperiods" "commands" ]) ++ [ ./main.cfg ] * for the above reason, add mailutils to default plugins Co-Authored-By: Aaron Andersen <aaron@fosslib.net>
This commit is contained in:
parent
fa28c7750a
commit
be25e45fc8
2 changed files with 71 additions and 49 deletions
|
@ -17,32 +17,39 @@ let
|
||||||
preferLocalBuild = true;
|
preferLocalBuild = true;
|
||||||
} "mkdir -p $out; ln -s $nagiosObjectDefs $out/";
|
} "mkdir -p $out; ln -s $nagiosObjectDefs $out/";
|
||||||
|
|
||||||
nagiosCfgFile = pkgs.writeText "nagios.cfg"
|
nagiosCfgFile = let
|
||||||
''
|
default = {
|
||||||
# Paths for state and logs.
|
log_file="${nagiosLogDir}/current";
|
||||||
log_file=${nagiosLogDir}/current
|
log_archive_path="${nagiosLogDir}/archive";
|
||||||
log_archive_path=${nagiosLogDir}/archive
|
status_file="${nagiosState}/status.dat";
|
||||||
status_file=${nagiosState}/status.dat
|
object_cache_file="${nagiosState}/objects.cache";
|
||||||
object_cache_file=${nagiosState}/objects.cache
|
temp_file="${nagiosState}/nagios.tmp";
|
||||||
temp_file=${nagiosState}/nagios.tmp
|
lock_file="/run/nagios.lock";
|
||||||
lock_file=/run/nagios.lock # Not used I think.
|
state_retention_file="${nagiosState}/retention.dat";
|
||||||
state_retention_file=${nagiosState}/retention.dat
|
query_socket="${nagiosState}/nagios.qh";
|
||||||
query_socket=${nagiosState}/nagios.qh
|
check_result_path="${nagiosState}";
|
||||||
check_result_path=${nagiosState}
|
command_file="${nagiosState}/nagios.cmd";
|
||||||
command_file=${nagiosState}/nagios.cmd
|
cfg_dir="${nagiosObjectDefsDir}";
|
||||||
|
nagios_user="nagios";
|
||||||
# Configuration files.
|
nagios_group="nagios";
|
||||||
#resource_file=resource.cfg
|
illegal_macro_output_chars="`~$&|'\"<>";
|
||||||
cfg_dir=${nagiosObjectDefsDir}
|
retain_state_information="1";
|
||||||
|
};
|
||||||
# Uid/gid that the daemon runs under.
|
lines = mapAttrsToList (key: value: "${key}=${value}") (default // cfg.extraConfig);
|
||||||
nagios_user=nagios
|
content = concatStringsSep "\n" lines;
|
||||||
nagios_group=nagios
|
file = pkgs.writeText "nagios.cfg" content;
|
||||||
|
validated = pkgs.runCommand "nagios-checked.cfg" {preferLocalBuild=true;} ''
|
||||||
# Misc. options.
|
cp ${file} nagios.cfg
|
||||||
illegal_macro_output_chars=`~$&|'"<>
|
# nagios checks the existence of /var/lib/nagios, but
|
||||||
retain_state_information=1
|
# it does not exists in the build sandbox, so we fake it
|
||||||
''; # "
|
mkdir lib
|
||||||
|
lib=$(readlink -f lib)
|
||||||
|
sed -i s@=${nagiosState}@=$lib@ nagios.cfg
|
||||||
|
${pkgs.nagios}/bin/nagios -v nagios.cfg && cp ${file} $out
|
||||||
|
'';
|
||||||
|
defaultCfgFile = if cfg.validateConfig then validated else file;
|
||||||
|
in
|
||||||
|
if cfg.mainConfigFile == null then defaultCfgFile else cfg.mainConfigFile;
|
||||||
|
|
||||||
# Plain configuration for the Nagios web-interface with no
|
# Plain configuration for the Nagios web-interface with no
|
||||||
# authentication.
|
# authentication.
|
||||||
|
@ -77,16 +84,11 @@ in
|
||||||
(mkRemovedOptionModule [ "services" "nagios" "urlPath" ] "The urlPath option has been removed as it is hard coded to /nagios in the nagios package.")
|
(mkRemovedOptionModule [ "services" "nagios" "urlPath" ] "The urlPath option has been removed as it is hard coded to /nagios in the nagios package.")
|
||||||
];
|
];
|
||||||
|
|
||||||
|
meta.maintainers = with lib.maintainers; [ symphorien ];
|
||||||
|
|
||||||
options = {
|
options = {
|
||||||
services.nagios = {
|
services.nagios = {
|
||||||
enable = mkOption {
|
enable = mkEnableOption "<link xlink:href='http://www.nagios.org/'>Nagios</link> to monitor your system or network.";
|
||||||
default = false;
|
|
||||||
description = "
|
|
||||||
Whether to use <link
|
|
||||||
xlink:href='http://www.nagios.org/'>Nagios</link> to monitor
|
|
||||||
your system or network.
|
|
||||||
";
|
|
||||||
};
|
|
||||||
|
|
||||||
objectDefs = mkOption {
|
objectDefs = mkOption {
|
||||||
description = "
|
description = "
|
||||||
|
@ -94,12 +96,14 @@ in
|
||||||
the hosts, host groups, services and contacts for the
|
the hosts, host groups, services and contacts for the
|
||||||
network that you want Nagios to monitor.
|
network that you want Nagios to monitor.
|
||||||
";
|
";
|
||||||
|
type = types.listOf types.path;
|
||||||
|
example = literalExample "[ ./objects.cfg ]";
|
||||||
};
|
};
|
||||||
|
|
||||||
plugins = mkOption {
|
plugins = mkOption {
|
||||||
type = types.listOf types.package;
|
type = types.listOf types.package;
|
||||||
default = [pkgs.nagiosPluginsOfficial pkgs.ssmtp];
|
default = with pkgs; [ nagiosPluginsOfficial ssmtp mailutils ];
|
||||||
defaultText = "[pkgs.nagiosPluginsOfficial pkgs.ssmtp]";
|
defaultText = "[pkgs.nagiosPluginsOfficial pkgs.ssmtp pkgs.mailutils]";
|
||||||
description = "
|
description = "
|
||||||
Packages to be added to the Nagios <envar>PATH</envar>.
|
Packages to be added to the Nagios <envar>PATH</envar>.
|
||||||
Typically used to add plugins, but can be anything.
|
Typically used to add plugins, but can be anything.
|
||||||
|
@ -107,14 +111,29 @@ in
|
||||||
};
|
};
|
||||||
|
|
||||||
mainConfigFile = mkOption {
|
mainConfigFile = mkOption {
|
||||||
type = types.package;
|
type = types.nullOr types.package;
|
||||||
default = nagiosCfgFile;
|
default = null;
|
||||||
defaultText = "nagiosCfgFile";
|
|
||||||
description = "
|
description = "
|
||||||
Derivation for the main configuration file of Nagios.
|
If non-null, overrides the main configuration file of Nagios.
|
||||||
";
|
";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extraConfig = mkOption {
|
||||||
|
type = types.attrsOf types.str;
|
||||||
|
example = {
|
||||||
|
debug_level = "-1";
|
||||||
|
debug_file = "/var/log/nagios/debug.log";
|
||||||
|
};
|
||||||
|
default = {};
|
||||||
|
description = "Configuration to add to /etc/nagios.cfg";
|
||||||
|
};
|
||||||
|
|
||||||
|
validateConfig = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = pkgs.stdenv.hostPlatform == pkgs.stdenv.buildPlatform;
|
||||||
|
description = "if true, the syntax of the nagios configuration file is checked at build time";
|
||||||
|
};
|
||||||
|
|
||||||
cgiConfigFile = mkOption {
|
cgiConfigFile = mkOption {
|
||||||
type = types.package;
|
type = types.package;
|
||||||
default = nagiosCGICfgFile;
|
default = nagiosCGICfgFile;
|
||||||
|
@ -126,6 +145,7 @@ in
|
||||||
};
|
};
|
||||||
|
|
||||||
enableWebInterface = mkOption {
|
enableWebInterface = mkOption {
|
||||||
|
type = types.bool;
|
||||||
default = false;
|
default = false;
|
||||||
description = "
|
description = "
|
||||||
Whether to enable the Nagios web interface. You should also
|
Whether to enable the Nagios web interface. You should also
|
||||||
|
@ -165,7 +185,7 @@ in
|
||||||
# This isn't needed, it's just so that the user can type "nagiostats
|
# This isn't needed, it's just so that the user can type "nagiostats
|
||||||
# -c /etc/nagios.cfg".
|
# -c /etc/nagios.cfg".
|
||||||
environment.etc = [
|
environment.etc = [
|
||||||
{ source = cfg.mainConfigFile;
|
{ source = nagiosCfgFile;
|
||||||
target = "nagios.cfg";
|
target = "nagios.cfg";
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
@ -173,7 +193,7 @@ in
|
||||||
environment.systemPackages = [ pkgs.nagios ];
|
environment.systemPackages = [ pkgs.nagios ];
|
||||||
systemd.services.nagios = {
|
systemd.services.nagios = {
|
||||||
description = "Nagios monitoring daemon";
|
description = "Nagios monitoring daemon";
|
||||||
path = [ pkgs.nagios ];
|
path = [ pkgs.nagios ] ++ cfg.plugins;
|
||||||
wantedBy = [ "multi-user.target" ];
|
wantedBy = [ "multi-user.target" ];
|
||||||
after = [ "network.target" ];
|
after = [ "network.target" ];
|
||||||
|
|
||||||
|
@ -184,14 +204,9 @@ in
|
||||||
RestartSec = 2;
|
RestartSec = 2;
|
||||||
LogsDirectory = "nagios";
|
LogsDirectory = "nagios";
|
||||||
StateDirectory = "nagios";
|
StateDirectory = "nagios";
|
||||||
|
ExecStart = "${pkgs.nagios}/bin/nagios /etc/nagios.cfg";
|
||||||
|
X-ReloadIfChanged = nagiosCfgFile;
|
||||||
};
|
};
|
||||||
|
|
||||||
script = ''
|
|
||||||
for i in ${toString cfg.plugins}; do
|
|
||||||
export PATH=$i/bin:$i/sbin:$i/libexec:$PATH
|
|
||||||
done
|
|
||||||
exec ${pkgs.nagios}/bin/nagios ${cfg.mainConfigFile}
|
|
||||||
'';
|
|
||||||
};
|
};
|
||||||
|
|
||||||
services.httpd.virtualHosts = optionalAttrs cfg.enableWebInterface {
|
services.httpd.virtualHosts = optionalAttrs cfg.enableWebInterface {
|
||||||
|
|
|
@ -20,6 +20,13 @@ stdenv.mkDerivation rec {
|
||||||
substituteInPlace Makefile --replace '$(MAKE) install-basic' ""
|
substituteInPlace Makefile --replace '$(MAKE) install-basic' ""
|
||||||
'';
|
'';
|
||||||
installTargets = "install install-config";
|
installTargets = "install install-config";
|
||||||
|
postInstall = ''
|
||||||
|
# don't make default files use hardcoded paths to commands
|
||||||
|
sed -i 's@command_line *[^ ]*/\([^/]*\) @command_line \1 @' $out/etc/objects/commands.cfg
|
||||||
|
sed -i 's@/usr/bin/@@g' $out/etc/objects/commands.cfg
|
||||||
|
sed -i 's@/bin/@@g' $out/etc/objects/commands.cfg
|
||||||
|
'';
|
||||||
|
|
||||||
|
|
||||||
meta = {
|
meta = {
|
||||||
description = "A host, service and network monitoring program";
|
description = "A host, service and network monitoring program";
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue