summary refs log tree commit diff
path: root/nixos
diff options
context:
space:
mode:
authorJoachim F <joachifm@users.noreply.github.com>2016-10-10 16:06:39 +0200
committerGitHub <noreply@github.com>2016-10-10 16:06:39 +0200
commit1997761725ab101fc7bd60a9b7c02ba88613d03e (patch)
tree2cd2faa451da9df29fbefcc0179c75a10f42b5a2 /nixos
parenta98d782896b9e04108056a470f8152351f6c7190 (diff)
parent74558c88fb52683952e42793b76716dfb7f5b148 (diff)
downloadnixpkgs-1997761725ab101fc7bd60a9b7c02ba88613d03e.tar
nixpkgs-1997761725ab101fc7bd60a9b7c02ba88613d03e.tar.gz
nixpkgs-1997761725ab101fc7bd60a9b7c02ba88613d03e.tar.bz2
nixpkgs-1997761725ab101fc7bd60a9b7c02ba88613d03e.tar.lz
nixpkgs-1997761725ab101fc7bd60a9b7c02ba88613d03e.tar.xz
nixpkgs-1997761725ab101fc7bd60a9b7c02ba88613d03e.tar.zst
nixpkgs-1997761725ab101fc7bd60a9b7c02ba88613d03e.zip
Merge pull request #19367 from cransom/smokeping-fix
smokeping module: fix missing js, broken alerts
Diffstat (limited to 'nixos')
-rw-r--r--nixos/modules/services/networking/smokeping.nix103
-rw-r--r--nixos/tests/smokeping.nix4
2 files changed, 76 insertions, 31 deletions
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");
   '';
 })