#!/usr/bin/env bash # Host setup shared by first install and updates. set -euo pipefail cd "$(dirname "$0")" DEPLOY="$(pwd -P)" ENSURE=0 case "${1:-}" in --ensure) ENSURE=1 ;; '') ;; *) echo "Usage: bash install-management.sh [--ensure]" >&2; exit 1 ;; esac # The active worker owns this process tree (systemd KillMode=control-group). # Restarting it here would kill the update. It refreshes itself after success. if [ "$ENSURE" = 1 ] && [ -n "${PIPU_UPDATE_SOURCE:-}" ]; then systemctl is-active --quiet pipu-management.service || { echo 'The management worker must stay active during its own update' >&2 exit 1 } echo '→ агент управления продолжает обновление; новая копия применится после завершения' exit 0 fi DATA="${PIPU_DATA:-$(sed -n 's/^PIPU_DATA=//p' .env)}" DATA="${DATA:-/srv/pipu}" if [ "$(id -u)" -ne 0 ]; then command -v sudo >/dev/null || { echo 'Для настройки агента запустите обновление с правами root (sudo)' >&2; exit 1; } echo '→ для настройки системного сервиса агента нужны права sudo' exec sudo -- env "PIPU_DATA=$DATA" bash "$DEPLOY/install-management.sh" "$@" fi command -v python3 >/dev/null || { echo 'Install python3 (>=3.10) first' >&2; exit 1; } python3 -c 'import sys; assert sys.version_info >= (3, 10), "Python >=3.10 required"' [ -d /etc/systemd/system ] || { echo 'systemd is required for server management' >&2; exit 1; } RESTART=0 mkdir -p "$DATA/management" /var/lib/pipu-management /usr/local/lib/pipu chown 65532:65532 "$DATA/management" chmod 700 "$DATA/management" /var/lib/pipu-management # Copy outside the checkout: switching revisions must not replace a running worker. if ! cmp -s server-agent.py /usr/local/lib/pipu/server-agent.py; then install -m 700 server-agent.py /usr/local/lib/pipu/server-agent.py.new mv -f /usr/local/lib/pipu/server-agent.py.new /usr/local/lib/pipu/server-agent.py RESTART=1 fi touch config.local chmod 600 config.local if [ -n "${SUDO_USER:-}" ]; then chown "$SUDO_USER" config.local; fi # systemd quoted arguments escape backslashes, quotes and specifiers. quote_unit() { printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g; s/%/%%/g'; } DEPLOY_UNIT="$(quote_unit "$DEPLOY")" MAILBOX_UNIT="$(quote_unit "$DATA/management")" UNIT_TMP="$(mktemp)" trap 'rm -f "$UNIT_TMP"' EXIT cat > "$UNIT_TMP" <