195 lines
4.6 KiB
Bash
195 lines
4.6 KiB
Bash
|
|
#!/usr/bin/env bash
|
||
|
|
# Common functions and utilities for DBIS Core deployment scripts
|
||
|
|
|
||
|
|
# Don't use set -euo pipefail here as this is a library file
|
||
|
|
set +euo pipefail
|
||
|
|
|
||
|
|
# Color codes
|
||
|
|
RED='\033[0;31m'
|
||
|
|
GREEN='\033[0;32m'
|
||
|
|
YELLOW='\033[1;33m'
|
||
|
|
BLUE='\033[0;34m'
|
||
|
|
NC='\033[0m' # No Color
|
||
|
|
|
||
|
|
# Logging functions
|
||
|
|
log_info() {
|
||
|
|
echo -e "${BLUE}[INFO]${NC} $1" >&2
|
||
|
|
}
|
||
|
|
|
||
|
|
log_success() {
|
||
|
|
echo -e "${GREEN}[✓]${NC} $1" >&2
|
||
|
|
}
|
||
|
|
|
||
|
|
log_warn() {
|
||
|
|
echo -e "${YELLOW}[WARNING]${NC} $1" >&2
|
||
|
|
}
|
||
|
|
|
||
|
|
log_error() {
|
||
|
|
echo -e "${RED}[ERROR]${NC} $1" >&2
|
||
|
|
}
|
||
|
|
|
||
|
|
log_debug() {
|
||
|
|
if [[ "${DEBUG:-}" == "1" ]] || [[ "${DBIS_DEBUG:-}" == "1" ]]; then
|
||
|
|
echo -e "${BLUE}[DEBUG]${NC} $1" >&2
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
# Error handling
|
||
|
|
error_exit() {
|
||
|
|
log_error "$1"
|
||
|
|
exit 1
|
||
|
|
}
|
||
|
|
|
||
|
|
# Check if command exists
|
||
|
|
command_exists() {
|
||
|
|
command -v "$1" >/dev/null 2>&1
|
||
|
|
}
|
||
|
|
|
||
|
|
# Check if running as root (for Proxmox host operations)
|
||
|
|
check_root() {
|
||
|
|
if [[ $EUID -ne 0 ]]; then
|
||
|
|
error_exit "This script must be run as root for Proxmox host operations"
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
# Get script directory
|
||
|
|
get_script_dir() {
|
||
|
|
local depth=1
|
||
|
|
local script_dir
|
||
|
|
|
||
|
|
while [[ $depth -lt 10 ]]; do
|
||
|
|
if [[ -n "${BASH_SOURCE[$depth]:-}" ]]; then
|
||
|
|
script_dir="$(cd "$(dirname "${BASH_SOURCE[$depth]}")" && pwd)"
|
||
|
|
if [[ "$(basename "$script_dir")" != "lib" ]] && [[ "$(basename "$script_dir")" != "utils" ]]; then
|
||
|
|
echo "$script_dir"
|
||
|
|
return 0
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
depth=$((depth + 1))
|
||
|
|
done
|
||
|
|
|
||
|
|
cd "$(dirname "${BASH_SOURCE[0]}")" && pwd
|
||
|
|
}
|
||
|
|
|
||
|
|
# Get project root
|
||
|
|
get_project_root() {
|
||
|
|
local script_dir
|
||
|
|
script_dir="$(get_script_dir)"
|
||
|
|
|
||
|
|
# Navigate to proxmox project root
|
||
|
|
if [[ "$script_dir" == */dbis_core/scripts/* ]]; then
|
||
|
|
echo "$(cd "$script_dir/../../.." && pwd)"
|
||
|
|
elif [[ "$script_dir" == */dbis_core/* ]]; then
|
||
|
|
echo "$(cd "$script_dir/../.." && pwd)"
|
||
|
|
else
|
||
|
|
echo "$(cd "$script_dir/.." && pwd)"
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
# Load configuration
|
||
|
|
load_config() {
|
||
|
|
local project_root
|
||
|
|
project_root="$(get_project_root)"
|
||
|
|
|
||
|
|
# Load main Proxmox config
|
||
|
|
if [[ -f "${project_root}/smom-dbis-138-proxmox/config/proxmox.conf" ]]; then
|
||
|
|
source "${project_root}/smom-dbis-138-proxmox/config/proxmox.conf" 2>/dev/null || true
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Load DBIS Core config
|
||
|
|
if [[ -f "${project_root}/dbis_core/config/dbis-core-proxmox.conf" ]]; then
|
||
|
|
source "${project_root}/dbis_core/config/dbis-core-proxmox.conf" 2>/dev/null || true
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Load .env file if exists
|
||
|
|
if [[ -f "${HOME}/.env" ]]; then
|
||
|
|
set -a
|
||
|
|
source <(grep -E "^PROXMOX_" "${HOME}/.env" 2>/dev/null | sed 's/^/export /' || true)
|
||
|
|
set +a
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
# Wait for container to be ready
|
||
|
|
wait_for_container() {
|
||
|
|
local vmid="$1"
|
||
|
|
local max_wait=60
|
||
|
|
local waited=0
|
||
|
|
|
||
|
|
while ! pct exec "$vmid" -- true 2>/dev/null && [[ $waited -lt $max_wait ]]; do
|
||
|
|
sleep 2
|
||
|
|
waited=$((waited + 2))
|
||
|
|
done
|
||
|
|
|
||
|
|
if ! pct exec "$vmid" -- true 2>/dev/null; then
|
||
|
|
log_error "Container $vmid not ready after ${max_wait}s"
|
||
|
|
return 1
|
||
|
|
fi
|
||
|
|
return 0
|
||
|
|
}
|
||
|
|
|
||
|
|
# Start container and wait
|
||
|
|
start_container_and_wait() {
|
||
|
|
local vmid="$1"
|
||
|
|
|
||
|
|
if ! pct start "$vmid" 2>/dev/null; then
|
||
|
|
log_warn "Container $vmid may already be running"
|
||
|
|
fi
|
||
|
|
|
||
|
|
wait_for_container "$vmid"
|
||
|
|
}
|
||
|
|
|
||
|
|
# Verify container is ready for file operations
|
||
|
|
verify_container_ready() {
|
||
|
|
local vmid="$1"
|
||
|
|
local max_attempts=10
|
||
|
|
local attempt=0
|
||
|
|
|
||
|
|
while [[ $attempt -lt $max_attempts ]]; do
|
||
|
|
if pct exec "$vmid" -- test -d /root 2>/dev/null; then
|
||
|
|
return 0
|
||
|
|
fi
|
||
|
|
sleep 1
|
||
|
|
attempt=$((attempt + 1))
|
||
|
|
done
|
||
|
|
|
||
|
|
return 1
|
||
|
|
}
|
||
|
|
|
||
|
|
# Check if container exists
|
||
|
|
container_exists() {
|
||
|
|
local vmid="$1"
|
||
|
|
pct list | grep -q "^\s*$vmid\s"
|
||
|
|
}
|
||
|
|
|
||
|
|
# Get container IP address
|
||
|
|
get_container_ip() {
|
||
|
|
local vmid="$1"
|
||
|
|
pct config "$vmid" | grep -E "^net0:" | sed -E 's/.*ip=([^,]+).*/\1/' | head -1
|
||
|
|
}
|
||
|
|
|
||
|
|
# Set container static IP
|
||
|
|
set_container_ip() {
|
||
|
|
local vmid="$1"
|
||
|
|
local ip_address="$2"
|
||
|
|
local gateway="${3:-192.168.11.1}"
|
||
|
|
|
||
|
|
pct set "$vmid" --net0 "bridge=${PROXMOX_BRIDGE:-vmbr0},name=eth0,ip=${ip_address}/24,gw=${gateway},type=veth" 2>/dev/null || {
|
||
|
|
log_warn "Failed to set static IP for container $vmid"
|
||
|
|
return 1
|
||
|
|
}
|
||
|
|
return 0
|
||
|
|
}
|
||
|
|
|
||
|
|
# Ensure OS template exists
|
||
|
|
ensure_os_template() {
|
||
|
|
local template="${1:-${CONTAINER_OS_TEMPLATE:-local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst}}"
|
||
|
|
|
||
|
|
if pvesm list local | grep -q "$(basename "$template")"; then
|
||
|
|
return 0
|
||
|
|
fi
|
||
|
|
|
||
|
|
log_warn "OS template not found: $template"
|
||
|
|
return 1
|
||
|
|
}
|
||
|
|
|