Zabbix: логировать stdout+stderr zabbix_sender; успех при failed: 0 в ответе

This commit is contained in:
ssh-monitor
2026-04-14 11:06:11 +10:00
parent 190add949d
commit 7e83dc6a83
+31 -24
View File
@@ -7,7 +7,7 @@ IFS=$'\n\t'
# ============================================ # ============================================
CONFIG_FILE="/etc/ssh-monitor.conf" CONFIG_FILE="/etc/ssh-monitor.conf"
SSH_MONITOR_VERSION="0.9.5.4" SSH_MONITOR_VERSION="0.9.5.5"
TELEGRAM_BOT_TOKEN="" TELEGRAM_BOT_TOKEN=""
TELEGRAM_CHAT_ID="" TELEGRAM_CHAT_ID=""
@@ -593,6 +593,29 @@ PY
return 1 return 1
} }
# Одна порция входного файла для zabbix_sender -i. Весь вывод (stdout+stderr) уходит в zlog:
# ответ сервера обычно в stdout; при ненулевом exit всё равно считаем успехом, если в тексте есть failed: 0;
_sshmon_zbx_send_file() {
local input_path="$1"
local log_tag="$2"
local zlog="$3"
[ -n "${ZABBIX_SERVER:-}" ] && [ -n "${ZABBIX_HOST_NAME:-}" ] || return 1
: >"$zlog"
if zabbix_sender -z "$ZABBIX_SERVER" -s "$ZABBIX_HOST_NAME" -i "$input_path" >"$zlog" 2>&1; then
return 0
fi
local zrc=$?
if grep -Eq 'failed:[[:space:]]*0[[:space:]]*;' "$zlog" 2>/dev/null; then
return 0
fi
if [ -s "$zlog" ]; then
write_log "WARN: zabbix_sender ${log_tag}: exit ${zrc}, $(tr '\n\r' ' ' <"$zlog")"
else
write_log "WARN: zabbix_sender ${log_tag}: exit ${zrc}, вывод пуст (проверьте zabbix_sender в PATH, сеть до ${ZABBIX_SERVER} и права на ${input_path})"
fi
return 1
}
send_zabbix_trapper() { send_zabbix_trapper() {
local message="${1:-}" local message="${1:-}"
[ -n "$message" ] || return 1 [ -n "$message" ] || return 1
@@ -613,52 +636,36 @@ send_zabbix_trapper() {
ZABBIX_EVENT_SEQ=$((ZABBIX_EVENT_SEQ + 1)) ZABBIX_EVENT_SEQ=$((ZABBIX_EVENT_SEQ + 1))
local tmp tmp2 zerr alert_rc seq_rc local tmp tmp2 zlog alert_rc seq_rc
tmp="$(mktemp "${TMPDIR:-/tmp}/ssh-monitor.zbx.al.XXXXXX" 2>/dev/null)" || return 1 tmp="$(mktemp "${TMPDIR:-/tmp}/ssh-monitor.zbx.al.XXXXXX" 2>/dev/null)" || return 1
tmp2="$(mktemp "${TMPDIR:-/tmp}/ssh-monitor.zbx.sq.XXXXXX" 2>/dev/null)" || { tmp2="$(mktemp "${TMPDIR:-/tmp}/ssh-monitor.zbx.sq.XXXXXX" 2>/dev/null)" || {
rm -f "$tmp" rm -f "$tmp"
return 1 return 1
} }
zerr="$(mktemp "${TMPDIR:-/tmp}/ssh-monitor.zbx.err.XXXXXX" 2>/dev/null)" || { zlog="$(mktemp "${TMPDIR:-/tmp}/ssh-monitor.zbx.log.XXXXXX" 2>/dev/null)" || {
rm -f "$tmp" "$tmp2" rm -f "$tmp" "$tmp2"
return 1 return 1
} }
printf '%s\t%s\n' "$key_al" "$one_line" >"$tmp" || { printf '%s\t%s\n' "$key_al" "$one_line" >"$tmp" || {
rm -f "$tmp" "$tmp2" "$zerr" rm -f "$tmp" "$tmp2" "$zlog"
return 1 return 1
} }
printf '%s\t%s\n' "$key_sq" "$ZABBIX_EVENT_SEQ" >"$tmp2" || { printf '%s\t%s\n' "$key_sq" "$ZABBIX_EVENT_SEQ" >"$tmp2" || {
rm -f "$tmp" "$tmp2" "$zerr" rm -f "$tmp" "$tmp2" "$zlog"
return 1 return 1
} }
alert_rc=1 alert_rc=1
seq_rc=1 seq_rc=1
local rc if _sshmon_zbx_send_file "$tmp" "alert (${key_al})" "$zlog"; then
if zabbix_sender -z "$ZABBIX_SERVER" -s "$ZABBIX_HOST_NAME" -i "$tmp" 2>"$zerr"; then
alert_rc=0 alert_rc=0
else
rc=$?
if [ -s "$zerr" ]; then
write_log "WARN: zabbix_sender alert (${key_al}): $(tr '\n\r' ' ' <"$zerr") (exit ${rc})"
else
write_log "WARN: zabbix_sender alert (${key_al}): stderr пуст, exit ${rc}"
fi fi
fi if _sshmon_zbx_send_file "$tmp2" "seq (${key_sq})" "$zlog"; then
: >"$zerr"
if zabbix_sender -z "$ZABBIX_SERVER" -s "$ZABBIX_HOST_NAME" -i "$tmp2" 2>"$zerr"; then
seq_rc=0 seq_rc=0
else
rc=$?
if [ -s "$zerr" ]; then
write_log "WARN: zabbix_sender seq (${key_sq}): $(tr '\n\r' ' ' <"$zerr") (exit ${rc})"
else
write_log "WARN: zabbix_sender seq (${key_sq}): stderr пуст, exit ${rc}"
fi
fi fi
rm -f "$tmp" "$tmp2" "$zerr" rm -f "$tmp" "$tmp2" "$zlog"
# Раньше один файл с двумя строками: при failed по seq весь пакет считался неуспешным. # Раньше один файл с двумя строками: при failed по seq весь пакет считался неуспешным.
# Текст оповещения — основной результат; seq нужен для триггеров по изменению. # Текст оповещения — основной результат; seq нужен для триггеров по изменению.