diff --git a/infra/server-b/s56/deploy-local-recording.sh b/infra/server-b/s56/deploy-local-recording.sh new file mode 100644 index 0000000..a2954fd --- /dev/null +++ b/infra/server-b/s56/deploy-local-recording.sh @@ -0,0 +1,98 @@ +#!/usr/bin/env bash +set -Eeuo pipefail + +commit=${1:?commit is required} +archive=${2:?archive path is required} +expected_sha=${3:?archive sha256 is required} +stamp=$(date -u +%Y%m%dT%H%M%SZ) +backup=/var/backups/lisglosips-s56/$stamp +old=$(readlink -f /opt/lisglosips/current) +new=/opt/lisglosips/releases/s56-b-consolidation-$stamp + +echo "phase=verify-upload" +test "$(sha256sum "$archive" | awk '{print $1}')" = "$expected_sha" +test -d "$old" +test ! -e "$new" + +echo "phase=data-backup" +systemctl start lisglosips-backup.service +if systemctl --quiet is-failed lisglosips-backup.service; then + systemctl status --no-pager lisglosips-backup.service + exit 1 +fi +find /data/backups/mysql -mindepth 1 -maxdepth 1 -type d | sort | tail -1 +find /data/backups/redis -mindepth 1 -maxdepth 1 -type d | sort | tail -1 + +echo "phase=config-backup" +install -d -m 0700 "$backup" +cp -a /etc/lisglosips/recording-worker.env "$backup/recording-worker.env" +cp -a /etc/systemd/system/lisglosips@recording-worker.service.d/10-s28-recording.conf "$backup/10-s28-recording.conf" +printf '%s\n' "$old" > "$backup/previous-release" +[ ! -e /usr/local/sbin/lisglosips-recording-finalize ] || cp -a /usr/local/sbin/lisglosips-recording-finalize "$backup/finalizer.previous" +[ ! -e /etc/systemd/system/lisglosips-recording-finalize.service ] || cp -a /etc/systemd/system/lisglosips-recording-finalize.service "$backup/finalizer-service.previous" +[ ! -e /etc/systemd/system/lisglosips-recording-finalize.timer ] || cp -a /etc/systemd/system/lisglosips-recording-finalize.timer "$backup/finalizer-timer.previous" + +changed=0 +rollback() { + rc=$? + if [ "$changed" -eq 1 ]; then + echo "phase=rollback rc=$rc" + systemctl disable --now lisglosips-recording-finalize.timer 2>/dev/null || true + cp -a "$backup/recording-worker.env" /etc/lisglosips/recording-worker.env + cp -a "$backup/10-s28-recording.conf" /etc/systemd/system/lisglosips@recording-worker.service.d/10-s28-recording.conf + ln -sfn "$old" /opt/lisglosips/current + systemctl daemon-reload + systemctl restart lisglosips@recording-worker || true + fi + exit "$rc" +} +trap rollback ERR + +echo "phase=stage-release" +cp -a --reflink=auto "$old" "$new" +tar -xzf "$archive" -C "$new" +printf '%s\n' "$commit" > "$new/.deployed-commit" +printf '%s\n' "$old" > "$new/.delta-base-release" +chown -R root:lisglosips "$new/apps/worker-recording/dist" "$new/infra/server-b/s56" +chmod -R u=rwX,g=rX,o= "$new/apps/worker-recording/dist" "$new/infra/server-b/s56" +chmod 0755 "$new/infra/server-b/s56/scripts/lisglosips-recording-finalize" + +echo "phase=install-local-recording" +install -o root -g root -m 0755 "$new/infra/server-b/s56/scripts/lisglosips-recording-finalize" /usr/local/sbin/lisglosips-recording-finalize +install -o root -g root -m 0644 "$new/infra/server-b/s56/systemd/lisglosips-recording-finalize.service" /etc/systemd/system/lisglosips-recording-finalize.service +install -o root -g root -m 0644 "$new/infra/server-b/s56/systemd/lisglosips-recording-finalize.timer" /etc/systemd/system/lisglosips-recording-finalize.timer +install -o root -g root -m 0644 "$new/infra/server-b/s56/systemd/10-local-recording.conf" /etc/systemd/system/lisglosips@recording-worker.service.d/10-s28-recording.conf + +tmp_env=$(mktemp) +grep -Ev '^(RECORDING_SOURCE_MODE|RECORDING_LOCAL_READY_DIR|RECORDING_REMOTE_HOST|RECORDING_SSH_CONFIG|RECORDING_REMOTE_READY_DIR)=' /etc/lisglosips/recording-worker.env > "$tmp_env" +printf '%s\n' 'RECORDING_SOURCE_MODE=local' 'RECORDING_LOCAL_READY_DIR=/dev/shm/voip_rec/ready' >> "$tmp_env" +install -o root -g lisglosips -m 0640 "$tmp_env" /etc/lisglosips/recording-worker.env +rm -f "$tmp_env" +install -d -o rtpengine -g rtpengine -m 0750 /dev/shm/voip_rec /dev/shm/voip_rec/incoming /dev/shm/voip_rec/ready /dev/shm/voip_rec/failed + +changed=1 +systemctl daemon-reload +systemctl enable --now lisglosips-recording-finalize.timer +systemctl start lisglosips-recording-finalize.service +ln -sfn "$new" /opt/lisglosips/current +systemctl restart lisglosips@recording-worker +sleep 12 + +echo "phase=verify" +test "$(readlink -f /opt/lisglosips/current)" = "$new" +test "$(cat /opt/lisglosips/current/.deployed-commit)" = "$commit" +test "$(systemctl is-active lisglosips-recording-finalize.timer)" = active +test "$(systemctl is-active rtpengine-recording-daemon)" = active +test "$(systemctl is-active lisglosips@recording-worker)" = active +/opt/lisglosips/current/infra/server-b/s30/lisglosips-release-preflight.sh +journalctl -u lisglosips@recording-worker --since "@$(( $(date +%s) - 60 ))" --no-pager | tail -30 +echo "ENV_MODE" +grep -E '^(RECORDING_SOURCE_MODE|RECORDING_LOCAL_READY_DIR|RECORDING_LOCAL_ROOT|RECORDING_DELETE_SOURCE_AFTER_COPY)=' /etc/lisglosips/recording-worker.env +echo "PROCESS_CHECK" +worker_pid=$(systemctl show -p MainPID --value lisglosips@recording-worker) +ps -o pid,ppid,comm,args --forest -g "$(ps -o sid= -p "$worker_pid" | tr -d ' ')" || true +pgrep -a ssh || true +printf 'BACKUP=%s\nRELEASE=%s\nCOMMIT=%s\n' "$backup" "$new" "$commit" + +changed=0 +trap - ERR