Обновление панели из интерфейса и режим обновления в установщике
Установщик стал идемпотентным: на уже настроенной машине он определяет установленную версию, останавливает службу, меняет бинарник и поднимает её обратно, не трогая конфиг, миры и учётные записи. Зависимости при обновлении не переустанавливаются — это лишние минуты apt. Кнопки «Обновить» и «Перезапустить панель» появились на вкладке «Настройки» вместе с текущей версией и описанием нового релиза. Панель работает от непривилегированного пользователя и не может ни заменить свой бинарник в /usr/local/bin, ни дёрнуть systemctl. Вместо того чтобы расширять её права, установщик кладёт root-скрипт pzmanager-admin и разрешает сервисному пользователю через sudoers ровно эту одну команду. Скрипт сверяет sha256 скачанного бинарника с checksums.txt релиза. Если правила sudo нет, кнопки не будет — панель покажет команду для терминала. Перед обновлением и перезапуском игровой сервер останавливается штатным quit: иначе его погасил бы systemd уже в момент рестарта, и ожидание растянулось бы на таймаут остановки. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+23
-3
@@ -81,7 +81,11 @@ download() {
|
||||
local name="$1" url required="${2:-required}"
|
||||
url="$(asset_url "$name")"
|
||||
if [[ -z "$url" ]]; then
|
||||
[[ "$required" == "optional" ]] && return 1
|
||||
# Явный if, а не "&& return": при set -e короткая форма для обязательного
|
||||
# файла вернула бы 1 и уронила скрипт молча, не дойдя до die.
|
||||
if [[ "$required" == "optional" ]]; then
|
||||
return 1
|
||||
fi
|
||||
die "в релизе ${TAG} нет файла ${name}"
|
||||
fi
|
||||
curl -fsSL -o "$name" "$url" || die "не удалось скачать ${name}"
|
||||
@@ -91,15 +95,31 @@ download "$BIN_NAME"
|
||||
download install.sh
|
||||
download pzmanager.service
|
||||
|
||||
# Скрипт привилегированных действий появился не сразу: со старым релизом
|
||||
# ставим без него, панель просто не покажет кнопку обновления.
|
||||
FILES=("$BIN_NAME" install.sh pzmanager.service)
|
||||
if download pzmanager-admin.sh optional; then
|
||||
FILES+=(pzmanager-admin.sh)
|
||||
fi
|
||||
|
||||
# Контрольные суммы обязательны: бинарник ставится с правами root.
|
||||
download checksums.txt
|
||||
echo "==> Проверяю контрольные суммы"
|
||||
grep -E " (${BIN_NAME}|install\.sh|pzmanager\.service)\$" checksums.txt > expected.txt \
|
||||
|| die "в checksums.txt нет нужных строк"
|
||||
: > expected.txt
|
||||
for name in "${FILES[@]}"; do
|
||||
# Сравниваем имя целиком через awk: в grep точка из "install.sh" совпала бы
|
||||
# с любым символом и подтянула чужую строку.
|
||||
awk -v name="$name" '$NF == name' checksums.txt >> expected.txt
|
||||
grep -q -F -- "$name" expected.txt \
|
||||
|| die "в checksums.txt нет строки для ${name}"
|
||||
done
|
||||
sha256sum -c expected.txt || die "контрольные суммы не сошлись — файлы повреждены"
|
||||
|
||||
mkdir -p deploy
|
||||
mv install.sh pzmanager.service deploy/
|
||||
if [[ -f pzmanager-admin.sh ]]; then
|
||||
mv pzmanager-admin.sh deploy/
|
||||
fi
|
||||
mv "$BIN_NAME" pzmanager
|
||||
chmod +x pzmanager deploy/install.sh
|
||||
|
||||
|
||||
Reference in New Issue
Block a user