sys-ctl-alm-{email,telegram}: unescape instance names before alerts

Use `systemd-escape --unescape` to restore human-readable unit identifiers in
Telegram and Email alerts. Also ensure Telegram messages are URL-encoded and
Email status checks try both raw and escaped forms for robustness.

Fixes issue where slashes were shown as dashes in notifications.

Context: see ChatGPT conversation
https://chatgpt.com/share/68a4c171-db08-800f-8399-7e07f237a441
This commit is contained in:
Kevin Veen-Birkenbach 2025-08-19 20:25:15 +02:00
parent 98e045196b
commit b90a2f6c87
No known key found for this signature in database
GPG Key ID: 44D8F11FD62F878E
2 changed files with 12 additions and 4 deletions

View File

@ -1,19 +1,23 @@
#!/bin/bash #!/bin/bash
set -u set -u
# Reverse systemd escaping for human-readable mail subject/body
friendly="$(systemd-escape --unescape "$1")"
# Try status with given arg; if empty, also try the escaped version
STATUS_OUT="$(systemctl status --full "$1" 2>/dev/null | head -n 30)" STATUS_OUT="$(systemctl status --full "$1" 2>/dev/null | head -n 30)"
if [ -z "$STATUS_OUT" ]; then if [ -z "$STATUS_OUT" ]; then
STATUS_OUT="(no matching systemd unit found for: $1)" esc="$(systemd-escape "$1")"
STATUS_OUT="$(systemctl status --full "$esc" 2>/dev/null | head -n 30)"
fi fi
/usr/bin/sendmail -t <<ERRMAIL /usr/bin/sendmail -t <<ERRMAIL
To: {{ users.administrator.email }} To: {{ users.administrator.email }}
From: systemd <{{ users['no-reply'].email }}> From: systemd <{{ users['no-reply'].email }}>
Subject: $1 Subject: ${friendly}
Content-Transfer-Encoding: 8bit Content-Transfer-Encoding: 8bit
Content-Type: text/plain; charset=UTF-8 Content-Type: text/plain; charset=UTF-8
A problem with the service $1 occurred: A problem with the service ${friendly} occurred:
$STATUS_OUT $STATUS_OUT

View File

@ -1,4 +1,8 @@
#!/bin/bash #!/bin/bash
set -u
# Make the instance text human readable again (reverse systemd escaping)
friendly="$(systemd-escape --unescape "$1")"
# determine host name: try hostname command, otherwise use $HOSTNAME # determine host name: try hostname command, otherwise use $HOSTNAME
if command -v hostname &>/dev/null; then if command -v hostname &>/dev/null; then
@ -11,4 +15,4 @@ fi
/usr/bin/curl -s -X POST \ /usr/bin/curl -s -X POST \
"https://api.telegram.org/bot{{ telegram_bot_token }}/sendMessage" \ "https://api.telegram.org/bot{{ telegram_bot_token }}/sendMessage" \
-d chat_id="{{ telegram_chat_id }}" \ -d chat_id="{{ telegram_chat_id }}" \
-d text="service $1 on ${host} failed" --data-urlencode text="service ${friendly} on ${host} failed"