prvng_core/shlib/setup-wizard-tty.sh

121 lines
4.0 KiB
Bash
Executable File

#!/usr/bin/env bash
# Bash wrapper for TypeDialog setup wizard
# Handles TTY input and generates Nickel config for Nushell consumption
set -euo pipefail
# Configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)"
FORM_PATH="${PROJECT_ROOT}/provisioning/.typedialog/core/forms/setup-wizard.toml"
OUTPUT_CONFIG="${PROJECT_ROOT}/provisioning/.typedialog/core/generated/setup-wizard-result.ncl"
OUTPUT_JSON="${PROJECT_ROOT}/provisioning/.typedialog/core/generated/setup-wizard-result.json"
BACKEND="${TYPEDIALOG_BACKEND:-tui}"
# Ensure generated directory exists
mkdir -p "$(dirname "${OUTPUT_CONFIG}")"
# Default config template
DEFAULT_CONFIG="${PROJECT_ROOT}/provisioning/.typedialog/core/generated/setup-wizard-defaults.ncl"
# Function to create default config
create_default_config() {
local config_path="${1:-${HOME}/.config/provisioning}"
local cpu_count="${2:-4}"
local memory_gb="${3:-8}"
cat > "${DEFAULT_CONFIG}" <<EOF
{
system_config = {
config_path = "${config_path}",
use_defaults = true,
},
deployment_mode = "docker-compose",
providers = {
upcloud = false,
aws = false,
hetzner = false,
local = true,
},
resources = {
cpu_count = ${cpu_count},
memory_gb = ${memory_gb},
},
security = {
enable_mfa = true,
enable_audit = true,
require_approval_for_destructive = true,
},
workspace = {
create_workspace = true,
name = "default",
description = "Default workspace",
},
}
EOF
}
# Function to check if typedialog is available
check_typedialog() {
if ! command -v typedialog &> /dev/null; then
echo "ERROR: TypeDialog is not installed" >&2
echo "Please install TypeDialog first: https://github.com/tweag/typedialog" >&2
return 1
fi
return 0
}
# Main execution
main() {
echo "╔═══════════════════════════════════════════════════════════════╗"
echo "║ PROVISIONING SYSTEM SETUP WIZARD ║"
echo "║ (TypeDialog - Bash Wrapper) ║"
echo "╚═══════════════════════════════════════════════════════════════╝"
echo ""
# Check TypeDialog availability
if ! check_typedialog; then
exit 1
fi
# Detect system defaults
local default_config_path="${HOME}/.config/provisioning"
local default_cpu_count=$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo "4")
local default_memory_gb=$(($(free -g 2>/dev/null | awk '/^Mem:/{print $2}' || sysctl -n hw.memsize 2>/dev/null | awk '{print int($1/1024/1024/1024)}' || echo "8")))
# Create default config
create_default_config "${default_config_path}" "${default_cpu_count}" "${default_memory_gb}"
echo "Running TypeDialog setup wizard (backend: ${BACKEND})..."
echo ""
# Run TypeDialog nickel-roundtrip
if typedialog nickel-roundtrip "${DEFAULT_CONFIG}" "${FORM_PATH}" \
--output "${OUTPUT_CONFIG}" \
--backend "${BACKEND}"; then
echo ""
echo "✅ Configuration saved to: ${OUTPUT_CONFIG}"
# Export to JSON for easy consumption
if command -v nickel &> /dev/null; then
if nickel export --format json "${OUTPUT_CONFIG}" > "${OUTPUT_JSON}"; then
echo "✅ JSON export saved to: ${OUTPUT_JSON}"
echo ""
echo "You can now use this configuration in Nushell scripts:"
echo " let config = (open ${OUTPUT_JSON} | from json)"
else
echo "⚠️ Warning: Failed to export to JSON" >&2
fi
fi
exit 0
else
echo "❌ TypeDialog wizard failed or was cancelled" >&2
exit 1
fi
}
# Run main
main "$@"