#!/bin/sh
# Обновление агента Синичка: скачивает с сайта последние исходники, собирает,
# заменяет /usr/local/bin/sinichka-daemon, хук PHP и сам этот скрипт, перезапускает службу.
# /etc/sinichka/daemon.conf и systemd-юнит не трогает. Ставится install.sh.
#
#   sudo sinichka-daemon-update                 обновить (если версия не изменилась — без перезапуска)
#   sudo sinichka-daemon-update --force         заменить и перезапустить в любом случае
#   sudo sinichka-daemon-update --no-restart    не перезапускать службу
#   sudo sinichka-daemon-update -u <url сайта>  откуда качать (по умолчанию SINICHKA_SITE_URL из daemon.conf)

set -eu

CONF=/etc/sinichka/daemon.conf
BIN=/usr/local/bin/sinichka-daemon
HOOK=/usr/local/share/sinichka/sinichka.php
SELF=/usr/local/bin/sinichka-daemon-update
SERVICE=sinichka-daemon
DEFAULT_SITE_URL=https://sinichka.online

fail() { echo "Ошибка: $*" >&2; exit 1; }

usage() {
    echo "Использование: sinichka-daemon-update [--force] [--no-restart] [-u <url сайта>]"
}

SITE_URL=
FORCE=0
RESTART=1
while [ $# -gt 0 ]; do
    case "$1" in
        --force) FORCE=1 ;;
        --no-restart) RESTART=0 ;;
        -u) [ $# -ge 2 ] || fail "после -u нужен адрес сайта"; SITE_URL="$2"; shift ;;
        -h|--help) usage; exit 0 ;;
        *) usage >&2; exit 2 ;;
    esac
    shift
done

[ "$(id -u)" -eq 0 ] || fail "запустите от root: sudo sinichka-daemon-update"

if [ -z "$SITE_URL" ] && [ -f "$CONF" ]; then
    SITE_URL=$(sed -n 's/^SINICHKA_SITE_URL=//p' "$CONF" | tail -n 1)
fi
SITE_URL=${SITE_URL:-$DEFAULT_SITE_URL}
SITE_URL=${SITE_URL%/}

for cmd in curl tar make g++ cmp; do
    command -v "$cmd" >/dev/null 2>&1 || fail "не найден $cmd. Установите: apt install build-essential curl  или  dnf install gcc-c++ make curl tar diffutils"
done

TMP=$(mktemp -d)
trap 'rm -rf "$TMP"' EXIT

echo "==> Скачиваем агент с $SITE_URL"
curl -fsSL "$SITE_URL/download/daemon.tar.gz" | tar xz -C "$TMP" || fail "не удалось скачать $SITE_URL/download/daemon.tar.gz"

echo "==> Сборка"
make -s -C "$TMP" sinichka-daemon

# установка через временный файл и mv: замена атомарна и не мешает запущенному процессу
# (и этому скрипту, который sh дочитывает из старого файла)
CHANGED=0
put() { # put <источник> <назначение> <права>
    if [ "$FORCE" -eq 0 ] && [ -f "$2" ] && cmp -s "$1" "$2"; then
        return 0
    fi
    install -d -m 0755 "$(dirname "$2")"
    install -m "$3" "$1" "$2.new"
    mv -f "$2.new" "$2"
    echo "    обновлён $2"
    CHANGED=1
}

echo "==> Установка"
put "$TMP/sinichka-daemon" "$BIN" 0755
DAEMON_CHANGED=$CHANGED
[ -f "$TMP/php/sinichka.php" ] && put "$TMP/php/sinichka.php" "$HOOK" 0644
[ -f "$TMP/sinichka-daemon-update" ] && put "$TMP/sinichka-daemon-update" "$SELF" 0755

if [ "$CHANGED" -eq 0 ]; then
    echo "Установлена последняя версия, обновлять нечего"
    exit 0
fi

if [ "$DAEMON_CHANGED" -eq 0 ]; then
    echo "Агент не изменился, служба не перезапускается"
elif [ "$RESTART" -eq 1 ] && command -v systemctl >/dev/null 2>&1 && systemctl is-active --quiet "$SERVICE"; then
    echo "==> Перезапуск $SERVICE"
    systemctl restart "$SERVICE"
    sleep 1
    systemctl is-active --quiet "$SERVICE" || fail "служба не запустилась: journalctl -u $SERVICE -n 50"
else
    echo "Служба $SERVICE не перезапускалась (не запущена или --no-restart)"
fi

echo "Готово"
