#!/bin/bash
# Проверка backend3/logs модуля «Системные журналы» (alterator-logs) на снимке журнала
B=/usr/lib/alterator/backend3/logs
F=/tmp/att-frozen.json
journalctl --system -n9998 --no-pager --output json --output-fields MESSAGE,_PID,_HOSTNAME,SYSLOG_IDENTIFIER,PRIORITY > $F
source <(sed -n '/^log_colors=/p;/^journald_log_format()/,/^)/p' $B)
fmt() { jq -r '.__REALTIME_TIMESTAMP, ._HOSTNAME, ._PID, .MESSAGE, .SYSLOG_IDENTIFIER, .PRIORITY' | journald_log_format; }
strip() { sed -e 's/<[^>]*>//g' -e 's/^ *//'; }
echo "# rpm -q alterator-logs: $(rpm -q alterator-logs)"
echo "# Снимок: journalctl --system -n9998 ... (как в backend3/logs:194-195), строк: $(wc -l < $F)"
echo
echo "== 1. Нет SYSLOG_IDENTIFIER или _PID -> «null» в выводе модуля =="
for sel in '.SYSLOG_IDENTIFIER==null and ._PID=="893"' '.SYSLOG_IDENTIFIER=="kernel"' '.SYSLOG_IDENTIFIER=="systemd-sysv-generator"'; do
n=$(jq -r "select($sel) | input_line_number" $F | tail -1)
echo "-- строка $n снимка, вывод модуля (journald_log_format):"
sed -n "${n}p" $F | fmt | strip | cut -c1-200
ts=$(sed -n "${n}p" $F | jq -r .__REALTIME_TIMESTAMP)
echo "-- то же сообщение в journalctl -o short:"
journalctl --system -o short --no-pager --since "@$((ts/1000000))" --until "@$((ts/1000000+1))" | grep -F "$(sed -n "${n}p" $F | jq -r '.MESSAGE|tostring|.[0:40]')" | head -1 | cut -c1-200
echo
done
echo "== 2. Страница содержит size+1 строк, граничная строка повторяется =="
echo "Код: stop=\$((start+size)) (logs:231), sed -n -e \"\$start,\$stop p\" (logs:166)"
for start in 1 101; do
stop=$((start+100))
cnt=$(sed -n -e "$start,$stop p" -e "$stop q" $F | wc -l)
echo "start=$start size=100 -> stop=$stop, строк на странице: $cnt (подпись «Строки $start-$stop»)"
done
a=$(sed -n -e "1,101 p" -e "101 q" $F | tail -1 | md5sum | cut -c1-12)
b=$(sed -n -e "101,201 p" -e "201 q" $F | head -1 | md5sum | cut -c1-12)
echo "md5 последней строки стр. 1: $a; md5 первой строки стр. 2: $b -> $( [ "$a" = "$b" ] && echo 'одна и та же запись' || echo 'разные')"
echo "Реальный бэкенд (alterator-cmdline), «Первая страница», 100 строк:"
alterator-cmdline -l /logs action read name journald size 100 first 1 2>/dev/null | grep -E '^(start|size):'
echo "записей в text: $(alterator-cmdline -l /logs action read name journald size 100 first 1 2>/dev/null | grep -o '
' | wc -l)"
echo
echo "== 3. Смена «Показывать» 20 -> 100 на последней странице: start не пересчитывается =="
echo "Код: logs:207-209 меняет только size; stop обрезается до total."
out=$(alterator-cmdline -l /logs action read name journald start 9980 size 20 new_size 100 2>/dev/null)
echo "$out" | grep -E '^(start|size):'
echo "записей в text: $(echo "$out" | grep -o '
' | wc -l) (ожидалось 100: строки 9899-9998)"
echo
echo "== 4. Многострочный MESSAGE обрывает страницу =="
n=$(jq -r 'select(._PID=="178131" and (.MESSAGE|tostring|test("\n"))) | input_line_number' $F | tail -1)
echo "Запись $n: alterator-manager, MESSAGE из нескольких строк:"
sed -n "${n}p" $F | jq -r '.MESSAGE' | sed 's/^/ /'
start=$((n-10)); stop=$((start+20))
echo "Страница start=$start stop=$stop (21 запись в снимке) через journald_log_format:"
sed -n "${start},${stop}p" $F | fmt > /tmp/att-page.html 2>/tmp/att-page.err
echo "выведено записей: $(grep -c '
' /tmp/att-page.html) из $((stop-start+1))"
echo "stderr: $(cat /tmp/att-page.err)"
echo "Причина: jq печатает MESSAGE в несколько строк, read -r (logs:140-145) сдвигается,"
echo "priority получает строку текста, \${log_colors[\$priority]} даёт ошибку арифметики,"
echo "подоболочка journald_log_format завершается, остаток страницы теряется."
rm -f /tmp/att-frozen.json /tmp/att-page.html /tmp/att-page.err