Files
proxmox/scripts/operator/start-stopped-lxc-scoped.sh
defiQUG dbd517b279 Sync workspace: config, docs, scripts, CI, operator rules, and submodule pointers.
- Update dbis_core, cross-chain-pmm-lps, explorer-monorepo, metamask-integration, pr-workspace/chains
- Omit embedded publish git dirs and empty placeholders from index

Made-with: Cursor
2026-04-12 06:12:20 -07:00

86 lines
2.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# Start specific stopped LXC containers on ONE Proxmox host — scoped, production-safe.
# Default: dry-run only. No host-wide "start everything" without explicit VMIDs.
#
# Usage:
# ./scripts/operator/start-stopped-lxc-scoped.sh --host 192.168.11.13 --vmid 2400 --vmid 2402
# ./scripts/operator/start-stopped-lxc-scoped.sh --host 192.168.11.13 --vmid 2400 --apply
#
# Env (optional):
# PROXMOX_OPS_APPLY=1 Same as --apply
# PROXMOX_OPS_ALLOWED_VMIDS="2400,2402" Refuse any --vmid not in this set
#
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# shellcheck source=../lib/proxmox-production-guard.sh
source "$SCRIPT_DIR/../lib/proxmox-production-guard.sh"
SSH_OPTS=( -o BatchMode=yes -o ConnectTimeout=20 -o StrictHostKeyChecking=no )
SSH_USER="${PROXMOX_SSH_USER:-root}"
HOST=""
declare -a VMIDS=()
APPLY=false
usage() {
sed -n '1,20p' "$0" | tail -n +2
echo ""
echo "Options:"
echo " --host IP|NAME Required. Single Proxmox node (no multi-host sweep)."
echo " --vmid N Required (repeatable). Only these CTs are considered."
echo " --apply Actually run pct start (otherwise print plan only)."
echo " -h, --help"
exit "${1:-0}"
}
while [[ $# -gt 0 ]]; do
case "$1" in
--host) HOST="${2:?}"; shift 2 ;;
--vmid) VMIDS+=("${2:?}"); shift 2 ;;
--apply) APPLY=true; shift ;;
-h|--help) usage 0 ;;
*) echo "Unknown arg: $1" >&2; usage 1 ;;
esac
done
[[ -n "$HOST" ]] || { echo "ERROR: --host required" >&2; usage 1; }
[[ "${#VMIDS[@]}" -gt 0 ]] || { echo "ERROR: at least one --vmid required (refusing host-wide start-all)" >&2; usage 1; }
if ! pguard_require_apply_flag "$APPLY"; then
MODE="DRY-RUN"
else
MODE="APPLY"
export PROXMOX_OPS_APPLY=1
fi
echo "=== start-stopped-lxc-scoped ($MODE) ==="
echo " host=$HOST user=$SSH_USER"
echo " vmids=${VMIDS[*]}"
for vmid in "${VMIDS[@]}"; do
pguard_vmid_allowed "$vmid" || exit 2
done
run_ssh() { ssh "${SSH_OPTS[@]}" "${SSH_USER}@${HOST}" "$@"; }
for vmid in "${VMIDS[@]}"; do
st="$(run_ssh "pct status $vmid 2>/dev/null | awk '/^status:/{print \$2}'" || echo "unknown")"
echo " VMID $vmid status: ${st:-unknown}"
if [[ "$st" != "stopped" ]]; then
echo " skip (not stopped)"
continue
fi
if [[ "$MODE" == "DRY-RUN" ]]; then
echo " [DRY-RUN] would: pct start $vmid"
continue
fi
run_ssh "pct start $vmid" && echo " ok: pct start $vmid" || echo " FAIL: pct start $vmid" >&2
done
if [[ "$MODE" == "DRY-RUN" ]]; then
echo ""
echo "No changes made. Re-run with --apply or PROXMOX_OPS_APPLY=1 to execute."
fi