0
0
Fork 0
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:
symphorien+git@xlumurb.eu 2019-12-26 12:00:00 +00:00 committed by Symphorien Gibol
parent fa28c7750a
commit be25e45fc8
2 changed files with 71 additions and 49 deletions

View file

@ -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 {

View file

@ -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";