{ config, lib, pkgs, ... }: { # TODO: # - assert postfix is configured options.mj.base.unitstatus = with lib.types; { enable = lib.mkEnableOption "alert by email on unit failure"; email = lib.mkOption {type = str;}; units = lib.mkOption { type = listOf str; default = []; }; }; config = lib.mkIf config.mj.base.unitstatus.enable { systemd.services = { "unit-status-mail@" = let # https://northernlightlabs.se/2014-07-05/systemd-status-mail-on-unit-failure.html script = pkgs.writeShellScript "unit-status-mail" '' set -e MAILTO="${config.mj.base.unitstatus.email}" UNIT=$1 EXTRA="" for e in "''${@:2}"; do EXTRA+="$e"$'\n' done UNITSTATUS=$(${pkgs.systemd}/bin/systemctl status "$UNIT" || :) ${pkgs.postfix}/bin/sendmail $MAILTO <<EOF Subject:Status mail for unit: $UNIT Status report for unit: $UNIT $EXTRA $UNITSTATUS EOF echo -e "Status mail sent to: $MAILTO for unit: $UNIT" ''; in { description = "Send an email on unit failure"; serviceConfig = { Type = "simple"; ExecStart = ''${script} "%i" "Hostname: %H" "Machine ID: %m" "Boot ID: %b" ''; }; }; } // lib.genAttrs config.mj.base.unitstatus.units ( unit: { unitConfig = {OnFailure = "unit-status-mail@${unit}.service";}; } ); }; }