diff --git a/nixos/modules/services/networking/smokeping.nix b/nixos/modules/services/networking/smokeping.nix index f7a5926dc64..cc373ae892a 100644 --- a/nixos/modules/services/networking/smokeping.nix +++ b/nixos/modules/services/networking/smokeping.nix @@ -6,31 +6,39 @@ let cfg = config.services.smokeping; smokepingHome = "/var/lib/smokeping"; smokepingPidDir = "/run"; - configFile = '' - *** General *** - owner = ${cfg.owner} - contact = ${cfg.ownerEmail} - mailhost = ${cfg.mailHost} - #sendmail = /var/setuid-wrappers/sendmail - imgcache = ${smokepingHome}/cache - imgurl = http://${cfg.hostName}:${builtins.toString cfg.port}/cache - datadir = ${smokepingHome}/data - piddir = ${smokepingPidDir} - cgiurl = http://${cfg.hostName}:${builtins.toString cfg.port}/smokeping.cgi - smokemail = ${cfg.smokeMailTemplate} - *** Presentation *** - template = ${cfg.presentationTemplate} - ${cfg.presentationConfig} - #*** Alerts *** - #${cfg.alertConfig} - *** Database *** - ${cfg.databaseConfig} - *** Probes *** - ${cfg.probeConfig} - *** Targets *** - ${cfg.targetConfig} - ${cfg.extraConfig} - ''; + configFile = + if cfg.config == null + then + '' + *** General *** + owner = ${cfg.owner} + contact = ${cfg.ownerEmail} + ${lib.optionalString (cfg.mailHost != "") "mailhost = ${cfg.mailHost}"} + ${lib.optionalString (cfg.sendmail != null) "sendmail = ${cfg.sendmail}"} + imgcache = ${smokepingHome}/cache + imgurl = http://${cfg.hostName}:${builtins.toString cfg.port}/cache + datadir = ${smokepingHome}/data + pagedir = ${smokepingHome}/cache + piddir = ${smokepingPidDir} + cgiurl = http://${cfg.hostName}:${builtins.toString cfg.port}/smokeping.cgi + linkstyle = ${cfg.linkStyle} + smokemail = ${cfg.smokeMailTemplate} + *** Presentation *** + template = ${cfg.presentationTemplate} + ${cfg.presentationConfig} + *** Alerts *** + ${cfg.alertConfig} + *** Database *** + ${cfg.databaseConfig} + *** Probes *** + ${cfg.probeConfig} + *** Targets *** + ${cfg.targetConfig} + ${cfg.extraConfig} + '' + else + cfg.config; + configPath = pkgs.writeText "smokeping.conf" configFile; cgiHome = pkgs.writeScript "smokeping.fcgi" '' #!${pkgs.bash}/bin/bash @@ -59,8 +67,15 @@ in }; mailHost = mkOption { type = types.string; - default = "127.0.0.1"; - description = "Use this SMTP server rather than localhost"; + default = ""; + example = "localhost"; + description = "Use this SMTP server to send alerts"; + }; + sendmail = mkOption { + type = types.nullOr types.path; + default = null; + example = "/var/setuid-wrappers/sendmail"; + description = "Use this sendmail compatible script to deliver alerts"; }; smokeMailTemplate = mkOption { type = types.string; @@ -71,6 +86,7 @@ in package = mkOption { type = types.package; default = pkgs.smokeping; + defaultText = "pkgs.smokeping"; description = "Specify a custom smokeping package"; }; owner = mkOption { @@ -85,6 +101,12 @@ in example = "somewhere.example.com"; description = "DNS name for the urls generated in the cgi."; }; + linkStyle = mkOption { + type = types.enum ["original" "absolute" "relative"]; + default = "relative"; + example = "absolute"; + description = "DNS name for the urls generated in the cgi."; + }; port = mkOption { type = types.int; default = 8081; @@ -132,7 +154,10 @@ in }; alertConfig = mkOption { type = types.string; - default = ""; + default = '' + to = root@localhost + from = smokeping@localhost + ''; example = literalExample '' to = alertee@address.somewhere from = smokealert@company.xy @@ -223,12 +248,26 @@ in default = ""; description = "Any additional customization not already included."; }; + config = mkOption { + type = types.nullOr types.string; + default = null; + description = "Full smokeping config supplied by the user. Overrides " + + "and replaces any other configuration supplied."; + }; }; }; config = mkIf cfg.enable { + assertions = [ + { + assertion = !(cfg.sendmail != null && cfg.mailHost != ""); + message = "services.smokeping: sendmail and Mailhost cannot both be enabled."; + } + ]; + security.setuidPrograms = [ "fping" ]; + environment.systemPackages = [ pkgs.fping ]; users.extraUsers = singleton { name = cfg.user; isNormalUser = false; @@ -243,9 +282,12 @@ in serviceConfig.PermissionsStartOnly = true; preStart = '' mkdir -m 0755 -p ${smokepingHome}/cache ${smokepingHome}/data + rm -f ${smokepingHome}/cropper + ln -s ${cfg.package}/htdocs/cropper ${smokepingHome}/cropper chown -R ${cfg.user} ${smokepingHome} cp ${cgiHome} ${smokepingHome}/smokeping.fcgi ${cfg.package}/bin/smokeping --check --config=${configPath} + ${cfg.package}/bin/smokeping --static --config=${configPath} ''; script = ''${cfg.package}/bin/smokeping --config=${configPath} --nodaemon''; }; @@ -253,8 +295,9 @@ in wantedBy = [ "multi-user.target"]; requires = [ "smokeping.service"]; partOf = [ "smokeping.service"]; - path = with pkgs; [ bash rrdtool smokeping ]; - script = ''${pkgs.thttpd}/bin/thttpd -u ${cfg.user} -c "**.fcgi" -d ${smokepingHome} -p ${builtins.toString cfg.port} -D''; + path = with pkgs; [ bash rrdtool smokeping thttpd ]; + script = ''thttpd -u ${cfg.user} -c "**.fcgi" -d ${smokepingHome} -p ${builtins.toString cfg.port} -D -nos''; + serviceConfig.Restart = "always"; }; }; } diff --git a/nixos/tests/smokeping.nix b/nixos/tests/smokeping.nix index 324f83147e0..9de3030417f 100644 --- a/nixos/tests/smokeping.nix +++ b/nixos/tests/smokeping.nix @@ -11,9 +11,10 @@ import ./make-test.nix ({ pkgs, ...} : { services.smokeping = { enable = true; port = 8081; + mailHost = "127.0.0.2"; probeConfig = '' + FPing - binary = ${pkgs.fping}/bin/fping + binary = /var/setuid-wrappers/fping offset = 0% ''; }; @@ -27,5 +28,6 @@ import ./make-test.nix ({ pkgs, ...} : { $sm->waitForFile("/var/lib/smokeping/data/Local/LocalMachine.rrd"); $sm->succeed("curl -s -f localhost:8081/smokeping.fcgi?target=Local"); $sm->succeed("ls /var/lib/smokeping/cache/Local/LocalMachine_mini.png"); + $sm->succeed("ls /var/lib/smokeping/cache/index.html"); ''; })