#!/bin/sh
# Установка обновления GO BULL на Linux (PLATFORM-LINUX.md §6 п.9).
# Запускает приложение через pkexec — система спрашивает пароль администратора:
#   pkexec /opt/gobull/bin/gobull-update deb <файл.deb> <sha256>        (deb)
#   pkexec /usr/share/gobull/bin/gobull-update rpm <файл.rpm> <sha256>  (rpm)
#
# Файл скачан и сверен с манифестом приложением от имени пользователя, но между
# той проверкой и установкой его мог подменить любой процесс этого пользователя.
# Поэтому здесь, уже от root, файл копируется в свой каталог 0700 и хэш
# сверяется ЗАНОВО по копии; ставится только пакет с именем gobull. Сам скрипт
# лежит в пакете (владелец root, 0755) — приложение запускает его, только
# проверив это (lib/service/app_update/linux_update.dart).
#
# Коды выхода: 0 — установлено; 2 — неверный вызов; 3 — нет файла;
# 4 — sha256 не совпал; 5 — пакет не gobull; 6 — ошибка менеджера пакетов.
set -u
PATH=/usr/sbin:/usr/bin:/sbin:/bin
export PATH

fail() { echo "gobull-update: $2" >&2; exit "$1"; }

[ "$(id -u)" = 0 ] || fail 2 "нужен root (запуск через pkexec)"
[ $# -eq 3 ] || fail 2 "вызов: gobull-update deb|rpm <файл> <sha256>"
kind=$1
src=$2
want=$3
case "$kind" in deb|rpm) ;; *) fail 2 "неизвестный тип пакета: $kind" ;; esac
case "$want" in "" | *[!0-9a-f]*) fail 2 "sha256 не hex" ;; esac
[ ${#want} -eq 64 ] || fail 2 "sha256 не 64 символа"
[ -f "$src" ] && [ ! -L "$src" ] || fail 3 "нет файла $src"

umask 077
work=$(mktemp -d /var/tmp/gobull-update.XXXXXX) || fail 6 "mktemp"
trap 'rm -rf "$work"' EXIT
pkg="$work/gobull.$kind"
cp -- "$src" "$pkg" || fail 3 "не скопировать $src"
got=$(sha256sum "$pkg" | cut -d' ' -f1)
[ "$got" = "$want" ] || fail 4 "sha256 не совпал (ждали $want, получили $got)"

if [ "$kind" = deb ]; then
  name=$(dpkg-deb -f "$pkg" Package 2>/dev/null)
  [ "$name" = gobull ] || fail 5 "пакет «$name», а не gobull"
  if command -v apt-get >/dev/null 2>&1; then
    # apt подтянет новые зависимости; lock-timeout — если рядом идёт
    # unattended-upgrades, подождать, а не упасть сразу.
    DEBIAN_FRONTEND=noninteractive apt-get install -y \
      -o DPkg::Lock::Timeout=120 "$pkg" || fail 6 "apt-get install"
  else
    dpkg -i "$pkg" || fail 6 "dpkg -i"
  fi
else
  name=$(rpm -qp --qf '%{NAME}' "$pkg" 2>/dev/null)
  [ "$name" = gobull ] || fail 5 "пакет «$name», а не gobull"
  if command -v dnf >/dev/null 2>&1; then
    dnf install -y "$pkg" || fail 6 "dnf install"
  else
    rpm -Uvh "$pkg" || fail 6 "rpm -Uvh"
  fi
fi
exit 0
