config

NixOS config
Log | Files | Refs | README | LICENSE

default.nix (1595B) - Raw


      1 {
      2   config,
      3   lib,
      4   pkgs,
      5   ...
      6 }:
      7 {
      8   # TODO:
      9   # - assert postfix is configured
     10   options.mj.base.unitstatus = with lib.types; {
     11     enable = lib.mkEnableOption "alert by email on unit failure";
     12     email = lib.mkOption { type = str; };
     13     units = lib.mkOption {
     14       type = listOf str;
     15       default = [ ];
     16     };
     17   };
     18 
     19   config = lib.mkIf config.mj.base.unitstatus.enable {
     20     systemd.services = {
     21       "unit-status-mail@" =
     22         let
     23           # https://northernlightlabs.se/2014-07-05/systemd-status-mail-on-unit-failure.html
     24           script = pkgs.writeShellScript "unit-status-mail" ''
     25             set -e
     26             MAILTO="${config.mj.base.unitstatus.email}"
     27             UNIT=$1
     28             EXTRA=""
     29             for e in "''${@:2}"; do
     30               EXTRA+="$e"$'\n'
     31             done
     32             UNITSTATUS=$(${pkgs.systemd}/bin/systemctl status -l -n 1000 "$UNIT" || :)
     33             ${pkgs.postfix}/bin/sendmail $MAILTO <<EOF
     34             Subject:Status mail for unit: $UNIT
     35 
     36             Status report for unit: $UNIT
     37             $EXTRA
     38 
     39             $UNITSTATUS
     40             EOF
     41 
     42             echo -e "Status mail sent to: $MAILTO for unit: $UNIT"
     43           '';
     44         in
     45         {
     46           description = "Send an email on unit failure";
     47           serviceConfig = {
     48             Type = "simple";
     49             ExecStart = ''${script} "%i" "Hostname: %H" "Machine ID: %m" "Boot ID: %b" '';
     50           };
     51         };
     52     }
     53     // lib.genAttrs config.mj.base.unitstatus.units (unit: {
     54       unitConfig = {
     55         OnFailure = "unit-status-mail@${unit}.service";
     56       };
     57     });
     58   };
     59 }