fix: daily report без локального Telegram при fallback SAC (2.1.6-SAC)
Суточные report.daily.* уходят только в SAC/spool; SAC_TIMEOUT_SEC=45; приоритет report.* в sac_flush_spool, до 50 файлов за цикл. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+62
-12
@@ -51,8 +51,8 @@ sac_check_health() {
|
||||
return 0
|
||||
fi
|
||||
code="$(curl -sS -o /dev/null -w '%{http_code}' \
|
||||
--connect-timeout "${SAC_TIMEOUT_SEC:-12}" \
|
||||
--max-time "${SAC_TIMEOUT_SEC:-12}" \
|
||||
--connect-timeout "${SAC_TIMEOUT_SEC:-45}" \
|
||||
--max-time "${SAC_TIMEOUT_SEC:-45}" \
|
||||
"${base}/health" || echo 000)"
|
||||
[ "$code" = "200" ]
|
||||
}
|
||||
@@ -152,8 +152,8 @@ sac_post_payload() {
|
||||
-H "Authorization: Bearer ${SAC_API_KEY}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Idempotency-Key: ${event_id}" \
|
||||
--connect-timeout "${SAC_TIMEOUT_SEC:-12}" \
|
||||
--max-time "${SAC_TIMEOUT_SEC:-12}" \
|
||||
--connect-timeout "${SAC_TIMEOUT_SEC:-45}" \
|
||||
--max-time "${SAC_TIMEOUT_SEC:-45}" \
|
||||
-d @"$tmp" 2>/dev/null || echo 000)"
|
||||
rm -f "$tmp"
|
||||
|
||||
@@ -170,9 +170,36 @@ sac_post_payload() {
|
||||
return 1
|
||||
}
|
||||
|
||||
# Список spool: report.daily.* первыми (старые раньше), затем остальное.
|
||||
sac_flush_spool_list_files() {
|
||||
local dir="${1:-}"
|
||||
[ -n "$dir" ] && [ -d "$dir" ] || return 0
|
||||
SPOOL_DIR="$dir" python3 <<'PY'
|
||||
import glob
|
||||
import json
|
||||
import os
|
||||
|
||||
dir_path = os.environ.get("SPOOL_DIR", "")
|
||||
daily, other = [], []
|
||||
for path in glob.glob(os.path.join(dir_path, "*.json")):
|
||||
event_type = ""
|
||||
try:
|
||||
with open(path, encoding="utf-8") as handle:
|
||||
event_type = json.load(handle).get("type", "") or ""
|
||||
except Exception:
|
||||
pass
|
||||
mtime = os.path.getmtime(path)
|
||||
bucket = daily if event_type in ("report.daily.ssh", "report.daily.rdp") else other
|
||||
bucket.append((mtime, path))
|
||||
for bucket in (daily, other):
|
||||
for _, path in sorted(bucket):
|
||||
print(path)
|
||||
PY
|
||||
}
|
||||
|
||||
# Повторная отправка файлов из SAC_SPOOL_DIR (до max_files за вызов).
|
||||
sac_flush_spool() {
|
||||
local mode max_files="${1:-20}"
|
||||
local mode max_files="${1:-${SAC_SPOOL_FLUSH_MAX_FILES:-50}}"
|
||||
mode="$(sac_normalize_mode "${UseSAC:-off}")"
|
||||
case "$mode" in
|
||||
off) return 0 ;;
|
||||
@@ -184,17 +211,14 @@ sac_flush_spool() {
|
||||
local dir="${SAC_SPOOL_DIR:-/var/lib/ssh-monitor/sac-spool}"
|
||||
[ -d "$dir" ] || return 0
|
||||
|
||||
local f count=0
|
||||
shopt -s nullglob
|
||||
for f in "$dir"/*.json; do
|
||||
[ -f "$f" ] || continue
|
||||
local f count=0 payload
|
||||
while IFS= read -r f; do
|
||||
[ -n "$f" ] && [ -f "$f" ] || continue
|
||||
count=$((count + 1))
|
||||
[ "$count" -gt "$max_files" ] && break
|
||||
local payload
|
||||
payload="$(cat "$f")"
|
||||
sac_post_payload "$payload" || true
|
||||
done
|
||||
shopt -u nullglob
|
||||
done < <(sac_flush_spool_list_files "$dir")
|
||||
return 0
|
||||
}
|
||||
|
||||
@@ -333,6 +357,13 @@ sac_is_heartbeat_only_event() {
|
||||
[ "${1:-}" = "agent.heartbeat" ]
|
||||
}
|
||||
|
||||
sac_is_daily_report_event() {
|
||||
case "${1:-}" in
|
||||
report.daily.ssh|report.daily.rdp) return 0 ;;
|
||||
*) return 1 ;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Добавляет generated_by / telegram_via в JSON details для ingest.
|
||||
sac_merge_notify_details() {
|
||||
local details_json="${1:-}"
|
||||
@@ -393,6 +424,25 @@ notify_or_sac() {
|
||||
esac
|
||||
fi
|
||||
|
||||
# Суточный отчёт — только SAC/spool; при сбое ingest не дублировать в локальный Telegram.
|
||||
if sac_is_daily_report_event "$event_type"; then
|
||||
case "$mode" in
|
||||
off)
|
||||
return 0
|
||||
;;
|
||||
exclusive|dual|fallback)
|
||||
if sac_send_event "$event_type" "$severity" "$title" "$summary" "$details_json"; then
|
||||
return 0
|
||||
fi
|
||||
write_log "WARN: daily report не принят SAC — остаётся в spool (локальный Telegram пропущен)"
|
||||
return 1
|
||||
;;
|
||||
*)
|
||||
return 0
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
case "$mode" in
|
||||
off)
|
||||
notify_send "$telegram_message"
|
||||
|
||||
Reference in New Issue
Block a user