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 }