#!/bin/bash
# Самопроверка A4, F1, P2 на вашем компьютере с Linux (РЕД ОС, «Альт»; x86-64 и aarch64, в том числе Байкал-М).
#
#   sudo bash proverka-linux.sh ПАКЕТ.rpm ДОКУМЕНТ
#
# ПАКЕТ.rpm — пакет A4, F1 или P2 с https://dl.plantype.ru/ под ваш процессор (uname -m).
# ДОКУМЕНТ  — любой свой файл: .docx для A4, .xlsx для F1, .pptx для P2 (или образцы с tech.plantype.ru/proverka/).
#
# Что делает: ставит пакет менеджером пакетов системы (зависимости — из её репозиториев), проверяет, что всем
# программам пакета хватает библиотек, запускает программу с документом на отдельном виртуальном экране
# (ваш рабочий стол не трогается), через 60 секунд снимает экран, закрывает программу и удаляет пакет.
# Программа во время проверки отрезана от сети: она никуда ничего не отправляет.
# Итог — папка proverka-ДАТА рядом со скриптом: report.txt, снимок shot.png, журнал программы app.log.
# Пришлите папку архивом на partner@a4-office.ru — добавим вашу систему в таблицу на tech.plantype.ru/linux.html.
set -uo pipefail
PKGFILE="$(readlink -f "${1:?укажите пакет .rpm}")"; DOC="$(readlink -f "${2:?укажите документ}")"
WAIT="${WAIT:-60}"
[ "$(id -u)" = 0 ] || { echo "запустите через sudo (нужно для установки пакета)"; exit 1; }
OUT="$(dirname "$(readlink -f "$0")")/proverka-$(date +%Y%m%d-%H%M%S)"; mkdir -p "$OUT"
REPORT="$OUT/report.txt"
say() { echo "$1: $2" | tee -a "$REPORT"; }
fail() { say "ИТОГ" "НЕ ПРОШЛО — $1"; echo "Папка с результатом: $OUT"; exit 1; }

say "дата" "$(date -Iseconds)"
say "система" "$(. /etc/os-release; echo "$PRETTY_NAME")"
say "ядро" "$(uname -r)"
say "процессор" "$(uname -m); $(grep -m1 -E 'model name|CPU part' /proc/cpuinfo | sed 's/.*: //')"
say "пакет" "$(basename "$PKGFILE") sha256=$(sha256sum "$PKGFILE" | cut -d' ' -f1)"

if command -v dnf >/dev/null; then INSTALL="dnf install -y"; REMOVE="dnf remove -y"; EXTRA="xorg-x11-server-Xvfb ImageMagick"
elif command -v apt-get >/dev/null; then INSTALL="apt-get install -y"; REMOVE="apt-get remove -y"; EXTRA="xorg-xvfb ImageMagick-tools"
else fail "нет dnf и apt-get"; fi
for p in Xvfb import convert; do command -v $p >/dev/null || { $INSTALL $EXTRA >>"$OUT/install.log" 2>&1; break; }; done
command -v Xvfb >/dev/null && command -v import >/dev/null || fail "не поставились Xvfb и ImageMagick ($EXTRA)"

PKG=$(rpm -qp --qf '%{NAME}' "$PKGFILE" 2>/dev/null) || fail "это не пакет rpm"
$INSTALL "$PKGFILE" >>"$OUT/install.log" 2>&1 || fail "установка не прошла (см. install.log)"
say "установка" "успешно: $(rpm -q "$PKG")"

DESKTOP=$(rpm -ql "$PKG" | grep '\.desktop$' | head -1)
BIN=$(grep -m1 '^Exec=' "$DESKTOP" | sed 's/^Exec=//; s/ %.*//; s/"//g')
case "$BIN" in /*) ;; *) BIN=$(command -v "$BIN") ;; esac
[ -x "$BIN" ] || fail "нет исполняемого файла $BIN"
MISSING=""
while IFS= read -r -d '' f; do
  [ "$(head -c4 "$f" | od -An -c | tr -d ' \n')" = "177ELF" ] || continue
  BAD=$(ldd "$f" 2>&1 | grep 'not found' || true); [ -z "$BAD" ] || MISSING="$MISSING $f: $BAD;"
done < <(find "$(dirname "$BIN")" -type f -perm -u+x -print0)
[ -z "$MISSING" ] || fail "не хватает библиотек:$MISSING"
say "библиотеки" "все найдены"

D=:$((90 + RANDOM % 9))
Xvfb $D -screen 0 1920x1080x24 -nolisten tcp >/dev/null 2>&1 & X=$!
PROFILE=$(mktemp -d); sleep 2
offline() {
  if command -v unshare >/dev/null && unshare -n sh -c 'ip link set lo up' 2>/dev/null; then
    unshare -n -- sh -c 'ip link set lo up && exec "$0" "$@"' "$@"
  else "$@"; fi
}
set -m  # своя группа процессов: закрываем только запущенную здесь программу, не чужие окна
DISPLAY=$D ELECTRON_ENABLE_LOGGING=1 XDG_CONFIG_HOME="$PROFILE" LANG=ru_RU.UTF-8 LANGUAGE=ru:en \
  offline "$BIN" --no-sandbox --lang=ru "$DOC" >"$OUT/app.log" 2>&1 & A=$!; disown $A
sleep "$WAIT"
ALIVE=yes; kill -0 $A 2>/dev/null || ALIVE=no
DISPLAY=$D import -window root "$OUT/shot.png" 2>/dev/null
COLORS=$(convert "$OUT/shot.png" -format %k info: 2>/dev/null || echo 0)
kill -- -$A 2>/dev/null; sleep 3; kill -9 -- -$A 2>/dev/null; set +m; kill $X 2>/dev/null; rm -rf "$PROFILE"
[ $ALIVE = yes ] || fail "программа завершилась сама (см. app.log)"
grep -qE "Uncaught|Cannot find module|is not a function" "$OUT/app.log" && fail "ошибка в журнале программы (см. app.log)"
[ "$COLORS" -ge 64 ] || fail "окно пустое (на снимке $COLORS цветов)"
say "запуск" "успешно: открыт $(basename "$DOC"), программа работала $WAIT с, на снимке $COLORS цветов"

$REMOVE "$PKG" >>"$OUT/install.log" 2>&1 || fail "удаление не прошло"
rpm -q "$PKG" >/dev/null 2>&1 && fail "пакет не удалился"
say "удаление" "успешно"
say "ИТОГ" "ПРОШЛО"
echo "Папка с результатом: $OUT — пришлите её архивом на partner@a4-office.ru"
