#!/usr/bin/env bash # Push all deployment templates and scripts to Proxmox VE hosts. # Required for infra deployment: Besu configs, scripts, lib, config; optionally trigger OS template download on each host. # # Usage: ./scripts/push-templates-to-proxmox.sh [--download-templates] [--dry-run] # --download-templates After pushing files, run pveam download on each host for Debian 12 + Ubuntu 22.04 # --dry-run Print what would be copied and to which hosts; do not push. # # Requires: SSH access to Proxmox hosts (config/ip-addresses.conf: ML110, R630_01, R630_02). # Run from project root. set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" cd "$PROJECT_ROOT" source "${PROJECT_ROOT}/config/ip-addresses.conf" 2>/dev/null || true export LC_ALL=C export LANG=C REMOTE_DIR="/opt/smom-dbis-138-proxmox" USER="${PROXMOX_USER:-root}" DOWNLOAD_TEMPLATES=false DRY_RUN=false for a in "$@"; do [[ "$a" == "--download-templates" ]] && DOWNLOAD_TEMPLATES=true [[ "$a" == "--dry-run" ]] && DRY_RUN=true done # All Proxmox hosts (deployment targets) HOSTS=( "${PROXMOX_HOST_ML110:-192.168.11.10}" "${PROXMOX_HOST_R630_01:-192.168.11.11}" "${PROXMOX_HOST_R630_02:-192.168.11.12}" ) # --- Templates and files to push (paths relative to PROJECT_ROOT) --- # 1) LXC OS templates (downloaded on host via pveam, not pushed as files) # Required names: debian-12-standard_12.12-1_amd64.tar.zst, ubuntu-22.04-standard_22.04-1_amd64.tar.zst # Optional: alpine-3.22-default_* for NPMplus. Use --download-templates to run pveam on each host. # 2) Besu config templates (used by deploy-besu-nodes, copy-configs-to-vm) BESU_CONFIGS=( smom-dbis-138-proxmox/templates/besu-configs/config-validator.toml smom-dbis-138-proxmox/templates/besu-configs/config-sentry.toml smom-dbis-138-proxmox/templates/besu-configs/config-rpc-core.toml smom-dbis-138-proxmox/templates/besu-configs/config-rpc.toml smom-dbis-138-proxmox/templates/besu-configs/config-rpc-4.toml ) BESU_TEMPLATE_DIR="smom-dbis-138-proxmox/templates" DOCKER_COMPOSE_TEMPLATE="smom-dbis-138-proxmox/templates/docker-compose-besu-temp.yml" # 3) Config (proxmox.conf, genesis, network – example or real) CONFIG_ITEMS=( smom-dbis-138-proxmox/config/proxmox.conf smom-dbis-138-proxmox/config/proxmox.conf.example smom-dbis-138-proxmox/config/genesis.json smom-dbis-138-proxmox/config/network.conf smom-dbis-138-proxmox/config/network.conf.example ) # 4) Scripts and lib (entire trees) SMOM_SCRIPTS_DIR="smom-dbis-138-proxmox/scripts" SMOM_LIB_DIR="smom-dbis-138-proxmox/lib" SMOM_INSTALL_DIR="smom-dbis-138-proxmox/install" log_info() { echo "[INFO] $1"; } log_ok() { echo "[✓] $1"; } log_warn() { echo "[⚠] $1"; } log_err() { echo "[✗] $1"; } run_ssh() { local host="$1" shift if [[ "$DRY_RUN" == true ]]; then echo " [DRY-RUN] ssh $USER@$host $*" return 0 fi ssh -o ConnectTimeout=10 -o BatchMode=yes "$USER@$host" "$@" } run_scp() { local src="$1" local dest="$2" if [[ "$DRY_RUN" == true ]]; then echo " [DRY-RUN] scp $src -> $dest" return 0 fi scp -q "$src" "$dest" } push_to_host() { local host="$1" log_info "Pushing to $USER@$host:$REMOTE_DIR ..." run_ssh "$host" "mkdir -p $REMOTE_DIR/templates/besu-configs $REMOTE_DIR/config $REMOTE_DIR/scripts/deployment $REMOTE_DIR/scripts/validation $REMOTE_DIR/scripts/network $REMOTE_DIR/scripts/manage $REMOTE_DIR/scripts/migration $REMOTE_DIR/scripts/health $REMOTE_DIR/scripts/upgrade $REMOTE_DIR/lib $REMOTE_DIR/install" for f in "${BESU_CONFIGS[@]}"; do [[ -f "$f" ]] || continue run_scp "$f" "$USER@$host:$REMOTE_DIR/templates/besu-configs/" done [[ -f "$DOCKER_COMPOSE_TEMPLATE" ]] && run_scp "$DOCKER_COMPOSE_TEMPLATE" "$USER@$host:$REMOTE_DIR/templates/" for f in "${CONFIG_ITEMS[@]}"; do [[ -f "$f" ]] || continue run_scp "$f" "$USER@$host:$REMOTE_DIR/config/" done if [[ -d "$SMOM_SCRIPTS_DIR" ]]; then if [[ "$DRY_RUN" == true ]]; then echo " [DRY-RUN] scp -r $SMOM_SCRIPTS_DIR -> $host:$REMOTE_DIR/" else scp -rq "$SMOM_SCRIPTS_DIR" "$USER@$host:$REMOTE_DIR/" 2>/dev/null || true fi fi if [[ -d "$SMOM_LIB_DIR" ]]; then for f in "$SMOM_LIB_DIR"/*.sh; do [[ -f "$f" ]] || continue run_scp "$f" "$USER@$host:$REMOTE_DIR/lib/" done fi if [[ -d "$SMOM_INSTALL_DIR" ]]; then for f in "$SMOM_INSTALL_DIR"/*.sh; do [[ -f "$f" ]] || continue run_scp "$f" "$USER@$host:$REMOTE_DIR/install/" done fi run_ssh "$host" "find $REMOTE_DIR/scripts $REMOTE_DIR/lib $REMOTE_DIR/install -name '*.sh' -exec chmod +x {} \\; 2>/dev/null; true" log_ok "Pushed to $host" } download_os_templates_on_host() { local host="$1" log_info "Downloading OS templates on $host (pveam)..." run_ssh "$host" "command -v pveam >/dev/null 2>&1 || { echo 'pveam not found'; exit 1; } for t in debian-12-standard_12.12-1_amd64.tar.zst ubuntu-22.04-standard_22.04-1_amd64.tar.zst; do pveam list local | grep -q \"\$t\" && echo \"\$t already present\" || { pveam available | grep -q \"\$t\" && pveam download local \"\$t\" || echo \"\$t not available\"; } done" log_ok "OS template check/download done on $host" } # --- Main --- echo "" echo "Push deployment templates to Proxmox VE hosts" echo "Hosts: ${HOSTS[*]}" echo "Remote: $REMOTE_DIR" [[ "$DRY_RUN" == true ]] && echo "DRY-RUN: no changes will be made" [[ "$DOWNLOAD_TEMPLATES" == true ]] && echo "Will run pveam download on each host after push" echo "" FAILED=() for h in "${HOSTS[@]}"; do if ! ssh -o BatchMode=yes -o ConnectTimeout=5 "$USER@$h" "exit" 2>/dev/null; then log_warn "Cannot SSH to $h (skip). Run from a host with SSH access to Proxmox." FAILED+=("$h") continue fi push_to_host "$h" if [[ "$DOWNLOAD_TEMPLATES" == true ]]; then download_os_templates_on_host "$h" || true fi done if [[ ${#FAILED[@]} -gt 0 ]]; then log_warn "Skipped hosts (no SSH): ${FAILED[*]}" exit 1 fi echo "" log_ok "Done. Templates and scripts are on all reachable Proxmox hosts under $REMOTE_DIR" echo "To download LXC OS templates on each host, run: $0 --download-templates" echo ""