Кнопка обновления обновляет всё, а не только бинарник
pzmanager-admin update больше не повторяет логику установки: он забирает из релиза get.sh (сверив sha256) и отдаёт работу ему. Поэтому обновление из панели теперь приводит в порядок и скрипты установки, и systemd-юнит — раньше они застывали на версии первой установки, а вместе с ними терялась, например, локальная копия установщика для удаления. Работа уходит в разовый юнит через systemd-run. Иначе она не пережила бы сама себя: панель вызывает скрипт через sudo, тот живёт в cgroup её юнита, и остановка службы установщиком убила бы его на середине. Команда restart по той же причине получила --no-block. Установщик стал понятнее в двух местах, о которые легко споткнуться: - повторная установка той же сборки больше не роняет игровой сервер — если sha256 бинарника совпал, служба не останавливается вовсе; - после обновления он явно пишет, что запускает службу, и проверяет, что она поднялась. Раньше systemctl start отрабатывал молча, и по выводу нельзя было понять, работает панель или нет. Службу, остановленную не установщиком, он по-прежнему не поднимает самовольно. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+54
-5
@@ -205,17 +205,29 @@ EOF
|
||||
chmod 0640 "$CONFIG"
|
||||
fi
|
||||
|
||||
# Если ставим ровно то же самое, что уже лежит, службу трогать незачем: её
|
||||
# остановка кладёт и игровой сервер, а повторный запуск установщика — обычное
|
||||
# дело (например, чтобы обновить скрипты).
|
||||
SAME_BINARY=0
|
||||
if [[ "$MODE" == "update" ]] &&
|
||||
[[ "$(sha256sum "$BINARY" | cut -d' ' -f1)" == "$(sha256sum "$TARGET_BINARY" | cut -d' ' -f1)" ]]; then
|
||||
SAME_BINARY=1
|
||||
echo "==> Бинарник не изменился — службу не останавливаю"
|
||||
fi
|
||||
|
||||
# Останавливаем сервис перед заменой бинарника: менеджер должен корректно
|
||||
# завершить игровой сервер, а не быть подменённым на ходу.
|
||||
RESTART_AFTER=0
|
||||
if [[ "$MODE" == "update" ]] && systemctl is-active --quiet pzmanager; then
|
||||
if [[ "$MODE" == "update" && "$SAME_BINARY" == "0" ]] && systemctl is-active --quiet pzmanager; then
|
||||
echo "==> Останавливаю pzmanager (игровой сервер завершится штатно)"
|
||||
systemctl stop pzmanager
|
||||
RESTART_AFTER=1
|
||||
fi
|
||||
|
||||
echo "==> Копирую бинарник в $TARGET_BINARY"
|
||||
install -m 0755 "$BINARY" "$TARGET_BINARY"
|
||||
if [[ "$SAME_BINARY" == "0" ]]; then
|
||||
echo "==> Копирую бинарник в $TARGET_BINARY"
|
||||
install -m 0755 "$BINARY" "$TARGET_BINARY"
|
||||
fi
|
||||
|
||||
# Панель работает от непривилегированного пользователя и не может ни заменить
|
||||
# бинарник, ни дёрнуть systemctl. Даём ей ровно одну команду через sudo.
|
||||
@@ -223,6 +235,8 @@ if [[ -f "$ADMIN_SRC" ]] && command -v sudo >/dev/null 2>&1; then
|
||||
echo "==> Ставлю $ADMIN_BINARY и правило sudo"
|
||||
sed -e "s|@PZ_REPO@|${PZ_REPO}|" \
|
||||
-e "s|@PZ_BINARY@|${TARGET_BINARY}|" \
|
||||
-e "s|@PZ_HOME@|${PZ_HOME}|" \
|
||||
-e "s|@PZ_USER@|${PZ_USER}|" \
|
||||
"$ADMIN_SRC" > "$ADMIN_BINARY"
|
||||
chown root:root "$ADMIN_BINARY"
|
||||
chmod 0755 "$ADMIN_BINARY"
|
||||
@@ -256,10 +270,25 @@ sed -e "s|/opt/pzmanager|${PZ_HOME}|g" \
|
||||
systemctl daemon-reload
|
||||
systemctl enable --quiet pzmanager
|
||||
|
||||
# wait_active ждёт, пока служба поднимется, и говорит, чем всё кончилось:
|
||||
# молчаливый systemctl start оставлял пользователя гадать, работает ли панель.
|
||||
wait_active() {
|
||||
local i
|
||||
for i in $(seq 1 15); do
|
||||
if systemctl is-active --quiet pzmanager; then
|
||||
return 0
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
if [[ "$MODE" == "update" ]]; then
|
||||
if [[ "$RESTART_AFTER" == "1" ]]; then
|
||||
echo "==> Запускаю pzmanager"
|
||||
systemctl start pzmanager
|
||||
fi
|
||||
|
||||
echo
|
||||
if [[ "$OLD_VERSION" == "$NEW_VERSION" ]]; then
|
||||
echo "Переустановлена версия ${NEW_VERSION}."
|
||||
@@ -267,8 +296,22 @@ if [[ "$MODE" == "update" ]]; then
|
||||
echo "Обновлено: ${OLD_VERSION} -> ${NEW_VERSION}."
|
||||
fi
|
||||
echo "Конфиг, миры и учётные записи не тронуты."
|
||||
|
||||
LISTEN_NOW="$(grep -E '^listen:' "$CONFIG" | head -1 | awk '{print $2}')"
|
||||
echo "Панель слушает ${LISTEN_NOW:-?}."
|
||||
if [[ "$RESTART_AFTER" == "1" ]]; then
|
||||
if wait_active; then
|
||||
echo "Панель работает и слушает ${LISTEN_NOW:-?}."
|
||||
else
|
||||
echo "!! Служба не поднялась. Посмотрите, что случилось:" >&2
|
||||
echo " journalctl -u pzmanager -n 40 --no-pager" >&2
|
||||
exit 1
|
||||
fi
|
||||
elif systemctl is-active --quiet pzmanager; then
|
||||
echo "Панель работает и слушает ${LISTEN_NOW:-?}."
|
||||
else
|
||||
# Службу останавливали не мы — значит и поднимать её самовольно не стоит.
|
||||
echo "Служба сейчас остановлена. Запустить: systemctl start pzmanager"
|
||||
fi
|
||||
exit 0
|
||||
fi
|
||||
|
||||
@@ -290,7 +333,13 @@ for _ in $(seq 1 20); do
|
||||
done
|
||||
|
||||
echo
|
||||
echo "Готово. Панель запущена и слушает ${PZ_LISTEN}."
|
||||
if wait_active; then
|
||||
echo "Готово. Панель запущена и слушает ${PZ_LISTEN}."
|
||||
else
|
||||
echo "!! Служба не поднялась. Посмотрите, что случилось:" >&2
|
||||
echo " journalctl -u pzmanager -n 40 --no-pager" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo
|
||||
if [[ "$PZ_LISTEN" == 127.0.0.1:* || "$PZ_LISTEN" == localhost:* ]]; then
|
||||
echo "Панель доступна только с самой машины. Пробросьте порт:"
|
||||
|
||||
Reference in New Issue
Block a user