nixos/global/fs/zfs/alert.nix
2025-01-13 11:52:09 +08:00

128 lines
2.9 KiB
Nix

{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.global.fs.zfs.alert;
backend = {
text = pkgs.writeShellScript "telegram-text" ''
set -e
source ${cfg.secret}
${pkgs.curl}/bin/curl -sG \
--data-urlencode "chat_id=$CHATID" \
--data-urlencode "text=$ALERT" \
$CURL_EXTRA_ARGS \
"https://api.telegram.org/bot$APIKEY/sendMessage"
'';
image = pkgs.writeShellScript "telegram-image" ''
set -e
source ${cfg.secret}
${pkgs.curl}/bin/curl -sG \
-F "chat_id=$CHATID" \
-F "caption=$ALERT" \
-F "photo=@-" \
$CURL_EXTRA_ARGS \
"https://api.telegram.org/bot$APIKEY/sendPhoto"
'';
};
zedAlert = pkgs.writeShellScript "zed-alert" ''
set -e
export BODY="$(cat)"
# add tag
ALERT="$1 #zfs"
export ALERT
echo -e "$BODY" | \
${pkgs.imagemagick}/bin/convert \
-size 1500x2000 xc:black \
-font "${pkgs.freefont_ttf}/share/fonts/truetype/FreeMono.ttf" \
-pointsize 16 \
-fill white -annotate +15+80 "@-" \
-trim -bordercolor "#000" \
-border 32 +repage \
png:- | \
${backend.image}
'';
mdadmAlert = pkgs.writeShellScript "mdadm-alert" ''
set -e
EVENT="$1"
ARRAY="$2"
DEVICE="$3"
# fallback alert
ALERT="$EVENT | $ARRAY | $DEVICE"
case $EVENT in
DegradedArray)
ALERT="Array $ARRAY is in a degraded state"
;;
DeviceDisappeared)
ALERT="Array $ARRAY disappeared"
;;
Fail)
ALERT="Array $ARRAY encountered failure of component $DEVICE"
;;
FailSpare)
ALERT="Array $ARRAY encountered failure of spare component $DEVICE during rebuild"
;;
MoveSpare)
ALERT="Spare $DEVICE moved to array $ARRAY"
;;
NewArray)
ALERT="Array $ARRAY appeared"
;;
Rebuild??)
ALERT="Array $ARRAY rebuild is now $(echo $EVENT | ${pkgs.sedutil}/bin/sed 's/Rebuild//')% complete"
;;
RebuildFinished)
ALERT="Rebuild of array $ARRAY has concluded"
;;
RebuildStarted)
ALERT="Rebuild of array $ARRAY has started"
;;
SpareActive)
ALERT="Spare $DEVICE activated in array $ARRAY"
;;
SparesMissing)
ALERT="Array $ARRAY missing one or more spares"
;;
TestMessage)
ALERT="Test message generated for array $ARRAY"
;;
esac
# add tag
ALERT="$ALERT #swraid"
export ALERT
exec ${backend.text}
'';
in
mkIf (cfg.secret != null) {
services.zfs.zed = mkIf cfg.zed {
settings = {
ZED_EMAIL_ADDR = [ "root" ];
ZED_EMAIL_PROG = toString zedAlert;
ZED_EMAIL_OPTS = "'@SUBJECT@'";
ZED_NOTIFY_INTERVAL_SECS = 3600;
ZED_NOTIFY_VERBOSE = false;
ZED_USE_ENCLOSURE_LEDS = true;
ZED_SCRUB_AFTER_RESILVER = false;
};
};
global.fs.zfs.split.mdProg = mkIf cfg.swraid (toString mdadmAlert);
}