]> git.immae.eu Git - perso/Immae/Config/Nix.git/blobdiff - modules/private/monitoring/default.nix
Add e-mail checks monitoring
[perso/Immae/Config/Nix.git] / modules / private / monitoring / default.nix
index e1357a75544a73ebc8c55e56f46b32b63af1bd3a..a7013af68cc6f4d6aedf7fdae8014c511e7de262 100644 (file)
@@ -1,6 +1,16 @@
 { config, pkgs, lib, name, nodes, ... }:
 let
   cfg = config.myServices.monitoring;
+  send_mails = pkgs.runCommand "send_mails" {
+    buildInputs = [ pkgs.makeWrapper ];
+  } ''
+    mkdir -p $out/bin
+    cp ${./send_mails} $out/bin/send_mails
+    patchShebangs $out
+    wrapProgram $out/bin/send_mails --prefix PATH : ${lib.makeBinPath [
+      pkgs.mailutils
+    ]}
+    '';
   myplugins = pkgs.runCommand "buildplugins" {
     buildInputs = [ pkgs.makeWrapper pkgs.perl ];
   } ''
@@ -29,6 +39,11 @@ let
     wrapProgram $out/check_openldap_replication --prefix PATH : ${lib.makeBinPath [
       pkgs.gnugrep pkgs.gnused pkgs.coreutils pkgs.openldap
     ]}
+    wrapProgram $out/check_emails --prefix PATH : ${lib.makeBinPath [
+      pkgs.openssh send_mails
+    ]} --prefix PERL5LIB : ${pkgs.perlPackages.makePerlPath [
+      pkgs.perlPackages.TimeDate
+    ]}
     wrapProgram $out/check_ftp_database --prefix PATH : ${lib.makeBinPath [
       pkgs.lftp
     ]}
@@ -67,11 +82,6 @@ let
     };
   };
   masterPassiveObjects = let
-    otherPassiveObjects = map
-      (n: (pkgs.callPackage (./. + "/objects_" + n + ".nix") {}))
-      [ "caldance-1" "ulminfo-fr" "immae-eu" "phare" "tiboqorl-fr" ];
-    otherPassiveServices = lib.flatten (map (h: h.service or []) otherPassiveObjects);
-    otherPassiveHosts = (map (h: h.host)) otherPassiveObjects;
     passiveNodes = lib.attrsets.filterAttrs (n: _: builtins.elem n ["backup-2" "eldiron"]) nodes;
     toPassiveServices = map (s: s.passiveInfo.filter s // s.passiveInfo);
     passiveServices = lib.flatten (lib.attrsets.mapAttrsToList
@@ -79,12 +89,37 @@ let
       passiveNodes
       );
   in {
-    service = passiveServices ++ otherPassiveServices;
+    service = passiveServices;
     host = lib.lists.foldr
       (a: b: a//b)
       {}
-      (otherPassiveHosts ++ lib.attrsets.mapAttrsToList (_: h: h.config.myServices.monitoring.hosts) passiveNodes);
+      (lib.attrsets.mapAttrsToList (_: h: h.config.myServices.monitoring.hosts) passiveNodes);
   };
+  emailCheck = host: hostFQDN: let
+    allCfg = config.myEnv.monitoring.email_check;
+    cfg = allCfg."${host}";
+    reverseTargets = builtins.attrNames (lib.attrsets.filterAttrs (k: v: builtins.elem host v.targets) allCfg);
+    to_email = cfg': host':
+      let sep = if lib.strings.hasInfix "+" cfg'.mail_address then "_" else "+";
+      in "${cfg'.mail_address}${sep}${host'}@${cfg'.mail_domain}";
+    mails_to_send = builtins.concatStringsSep "," (map (n: to_email allCfg."${n}" host) cfg.targets);
+    mails_to_receive = builtins.concatStringsSep "," (map (n: "${to_email cfg n}:${n}") reverseTargets);
+    command = if cfg.local
+    then
+      [ "check_emails_local" "/var/lib/naemon/checks/email" mails_to_send mails_to_receive ]
+    else
+      [ "check_emails" cfg.login cfg.port mails_to_send mails_to_receive ];
+  in
+    {
+      service_description = "${hostFQDN} email service is active";
+      use = "mail-service";
+      host_name = hostFQDN;
+      servicegroups = "webstatus-email";
+      check_command = command;
+    };
+  otherObjects = map
+    (n: (pkgs.callPackage (./. + "/objects_" + n + ".nix") { inherit emailCheck; }))
+    [ "caldance-1" "ulminfo-fr" "immae-eu" "phare" "tiboqorl-fr" ];
   masterObjects = pkgs.callPackage ./objects_master.nix { inherit config; };
   commonObjects = pkgs.callPackage ./objects_common.nix ({
     master = cfg.master;
@@ -99,7 +134,7 @@ let
       lib.attrsets.optionalAttrs
         (builtins.pathExists specific_file)
         (pkgs.callPackage specific_file {
-          inherit config;
+          inherit config emailCheck;
           hostFQDN = config.hostEnv.fqdn;
           hostName = name;
         });
@@ -228,7 +263,8 @@ in
       objectDefs = toObjects commonObjects
         + toObjects hostObjects
         + lib.optionalString cfg.master (toObjects masterObjects)
-        + lib.optionalString cfg.master (toObjects masterPassiveObjects);
+        + lib.optionalString cfg.master (toObjects masterPassiveObjects)
+        + lib.optionalString cfg.master (builtins.concatStringsSep "\n" (map toObjects otherObjects));
     };
   };
 }