2023-07-20 06:58:47 +03:00
|
|
|
{
|
|
|
|
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;};
|
2023-07-20 09:31:26 +03:00
|
|
|
units = lib.mkOption {type = listOf str;};
|
2023-07-20 06:58:47 +03:00
|
|
|
};
|
|
|
|
|
2023-07-20 09:31:26 +03:00
|
|
|
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
|
2023-07-20 06:58:47 +03:00
|
|
|
|
2023-07-20 09:31:26 +03:00
|
|
|
Status report for unit: $UNIT
|
|
|
|
$EXTRA
|
2023-07-20 06:58:47 +03:00
|
|
|
|
2023-07-20 09:31:26 +03:00
|
|
|
$UNITSTATUS
|
|
|
|
EOF
|
2023-07-20 06:58:47 +03:00
|
|
|
|
2023-07-20 09:31:26 +03:00
|
|
|
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" '';
|
|
|
|
};
|
2023-07-20 06:58:47 +03:00
|
|
|
};
|
2023-07-20 09:31:26 +03:00
|
|
|
}
|
|
|
|
// lib.genAttrs config.mj.base.unitstatus.units (
|
|
|
|
unit: {
|
|
|
|
unitConfig = {OnFailure = "unit-status-mail@${unit}.service";};
|
|
|
|
}
|
|
|
|
);
|
|
|
|
};
|
2023-07-20 06:58:47 +03:00
|
|
|
}
|