provisioning-outreach/presentations/rust-laspalmas-250926/setup/install.sh

454 lines
13 KiB
Bash
Raw Permalink Normal View History

#!/bin/bash
# Setup rápido para asistentes - Rust Meetup 2025
# Instala ambiente demo del sistema de provisioning
set -euo pipefail
# Colores para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Variables de configuración
DEMO_DIR="$HOME/provisioning-demo"
REPO_URL="https://github.com/JesusPerezLorenzo/provisioning.git"
NUSHELL_VERSION="0.105.2"
KCL_VERSION="0.11.2"
log() {
echo -e "${GREEN}[$(date +'%H:%M:%S')]${NC} $1"
}
warn() {
echo -e "${YELLOW}[$(date +'%H:%M:%S')] WARN:${NC} $1"
}
error() {
echo -e "${RED}[$(date +'%H:%M:%S')] ERROR:${NC} $1"
exit 1
}
banner() {
echo -e "${BLUE}"
echo "╔══════════════════════════════════════════════════════════════╗"
echo "║ Cloud Native Provisioning Demo ║"
echo "║ Rust Meetup 2025 ║"
echo "╚══════════════════════════════════════════════════════════════╝"
echo -e "${NC}"
}
check_requirements() {
log "Verificando requisitos del sistema..."
# Check OS
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
OS="linux"
elif [[ "$OSTYPE" == "darwin"* ]]; then
OS="macos"
elif [[ "$OSTYPE" == "msys" ]]; then
OS="windows"
warn "Windows detectado. Se recomienda usar WSL2."
else
error "Sistema operativo no soportado: $OSTYPE"
fi
log "Sistema operativo detectado: $OS"
# Check architecture
ARCH=$(uname -m)
case $ARCH in
x86_64)
RUST_TARGET="x86_64-unknown-linux-gnu"
;;
aarch64|arm64)
RUST_TARGET="aarch64-unknown-linux-gnu"
;;
*)
warn "Arquitectura $ARCH puede no estar completamente soportada"
RUST_TARGET="x86_64-unknown-linux-gnu"
;;
esac
log "Arquitectura detectada: $ARCH$RUST_TARGET"
# Check available space
AVAILABLE_SPACE=$(df -h . | awk 'NR==2 {print $4}' | sed 's/[^0-9]//g')
if [[ $AVAILABLE_SPACE -lt 2000 ]]; then
warn "Espacio disponible bajo. Se recomiendan al menos 2GB libres."
fi
# Check required tools
log "Verificando herramientas requeridas..."
if ! command -v git &> /dev/null; then
error "Git no encontrado. Por favor instalar git primero."
fi
if ! command -v curl &> /dev/null; then
error "curl no encontrado. Por favor instalar curl primero."
fi
log "✅ Requisitos básicos satisfechos"
}
install_rust() {
if command -v rustc &> /dev/null; then
local rust_version=$(rustc --version | cut -d' ' -f2)
log "Rust ya instalado: v$rust_version"
return 0
fi
log "Instalando Rust..."
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source ~/.cargo/env
# Add cross-compilation target
rustup target add "$RUST_TARGET"
log "✅ Rust instalado correctamente"
}
install_nushell() {
if command -v nu &> /dev/null; then
local nu_version=$(nu --version | head -n1 | cut -d' ' -f2)
log "Nushell ya instalado: v$nu_version"
return 0
fi
log "Instalando Nushell $NUSHELL_VERSION..."
case $OS in
"linux")
if [[ $ARCH == "x86_64" ]]; then
NUSHELL_URL="https://github.com/nushell/nushell/releases/download/$NUSHELL_VERSION/nu-$NUSHELL_VERSION-x86_64-linux-gnu.tar.gz"
elif [[ $ARCH == "aarch64" ]]; then
NUSHELL_URL="https://github.com/nushell/nushell/releases/download/$NUSHELL_VERSION/nu-$NUSHELL_VERSION-aarch64-linux-gnu.tar.gz"
fi
;;
"macos")
if [[ $ARCH == "x86_64" ]]; then
NUSHELL_URL="https://github.com/nushell/nushell/releases/download/$NUSHELL_VERSION/nu-$NUSHELL_VERSION-x86_64-apple-darwin.tar.gz"
elif [[ $ARCH == "arm64" ]]; then
NUSHELL_URL="https://github.com/nushell/nushell/releases/download/$NUSHELL_VERSION/nu-$NUSHELL_VERSION-aarch64-apple-darwin.tar.gz"
fi
;;
esac
# Download and install
TMP_DIR=$(mktemp -d)
cd "$TMP_DIR"
curl -L "$NUSHELL_URL" | tar xz
# Find the extracted directory
NU_DIR=$(find . -name "nu-$NUSHELL_VERSION-*" -type d | head -n1)
# Install to user local bin
mkdir -p "$HOME/.local/bin"
cp "$NU_DIR/nu" "$HOME/.local/bin/"
# Add to PATH if not already there
if [[ ":$PATH:" != *":$HOME/.local/bin:"* ]]; then
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc 2>/dev/null || true
export PATH="$HOME/.local/bin:$PATH"
fi
cd - > /dev/null
rm -rf "$TMP_DIR"
log "✅ Nushell $NUSHELL_VERSION instalado"
}
install_kcl() {
if command -v kcl &> /dev/null; then
local kcl_version=$(kcl --version | cut -d' ' -f3)
log "KCL ya instalado: v$kcl_version"
return 0
fi
log "Instalando KCL $KCL_VERSION..."
case $OS in
"linux")
KCL_URL="https://github.com/kcl-lang/kcl/releases/download/v$KCL_VERSION/kcl-v$KCL_VERSION-linux-amd64.tar.gz"
;;
"macos")
if [[ $ARCH == "arm64" ]]; then
KCL_URL="https://github.com/kcl-lang/kcl/releases/download/v$KCL_VERSION/kcl-v$KCL_VERSION-darwin-arm64.tar.gz"
else
KCL_URL="https://github.com/kcl-lang/kcl/releases/download/v$KCL_VERSION/kcl-v$KCL_VERSION-darwin-amd64.tar.gz"
fi
;;
esac
TMP_DIR=$(mktemp -d)
cd "$TMP_DIR"
curl -L "$KCL_URL" | tar xz
mkdir -p "$HOME/.local/bin"
cp bin/kcl* "$HOME/.local/bin/"
cd - > /dev/null
rm -rf "$TMP_DIR"
log "✅ KCL $KCL_VERSION instalado"
}
install_docker() {
if command -v docker &> /dev/null; then
log "Docker ya instalado"
return 0
fi
log "Instalando Docker..."
case $OS in
"linux")
# Install Docker using official script
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
# Add user to docker group
sudo usermod -aG docker "$USER"
# Start Docker service
sudo systemctl start docker
sudo systemctl enable docker
rm get-docker.sh
;;
"macos")
warn "Por favor instalar Docker Desktop desde: https://www.docker.com/products/docker-desktop"
warn "Presiona Enter cuando Docker esté instalado y funcionando..."
read -r
;;
esac
log "✅ Docker configurado"
}
setup_demo_environment() {
log "Configurando ambiente demo..."
# Create demo directory
mkdir -p "$DEMO_DIR"
cd "$DEMO_DIR"
# Clone repository
if [[ ! -d "provisioning" ]]; then
log "Clonando repositorio..."
git clone "$REPO_URL" provisioning
else
log "Repositorio ya existe, actualizando..."
cd provisioning
git pull origin main
cd ..
fi
cd provisioning
# Setup environment variables
log "Configurando variables de entorno..."
cat > "$DEMO_DIR/demo-env.sh" << EOF
#!/bin/bash
# Demo environment configuration
export DEMO_DIR="$DEMO_DIR"
export PROVISIONING_PATH="\$DEMO_DIR/provisioning"
export PROVISIONING_DEMO=true
# Add tools to PATH
export PATH="\$HOME/.local/bin:\$PATH"
# Demo-specific settings
export PROVISIONING_INFRA_PATH="\$DEMO_DIR/infra"
export PROVISIONING_OUT="human"
export PROVISIONING_DEBUG=false
echo "🎯 Ambiente demo configurado"
echo "📁 Demo directory: \$DEMO_DIR"
echo "🛠️ Provisioning path: \$PROVISIONING_PATH"
echo ""
echo "Para usar el sistema:"
echo " cd \$PROVISIONING_PATH"
echo " ./core/nulib/provisioning help"
echo ""
echo "Para las demos de la charla:"
echo " cd \$PROVISIONING_PATH/talks/rust-meetup-2025/demos"
echo " nu 01-basic-provisioning.nu"
EOF
chmod +x "$DEMO_DIR/demo-env.sh"
# Create infrastructure directory
mkdir -p "$DEMO_DIR/infra"
log "✅ Ambiente demo configurado en $DEMO_DIR"
}
setup_nushell_plugins() {
log "Configurando plugins de Nushell..."
# Install nu_plugin_tera if available
if command -v cargo &> /dev/null; then
log "Instalando nu_plugin_tera..."
cargo install nu_plugin_tera || warn "No se pudo instalar nu_plugin_tera"
# Register plugin
if command -v nu_plugin_tera &> /dev/null; then
nu -c "plugin add ~/.cargo/bin/nu_plugin_tera; plugin use tera" || warn "No se pudo registrar nu_plugin_tera"
fi
fi
log "✅ Plugins configurados"
}
setup_mcp_demo() {
log "Configurando demo MCP..."
cd "$DEMO_DIR/provisioning"
# Install Python dependencies for MCP server
if command -v python3 &> /dev/null && command -v pip3 &> /dev/null; then
cd mcp
pip3 install -r requirements.txt --user || warn "No se pudieron instalar dependencias MCP"
cd ..
else
warn "Python3/pip3 no encontrado. Demo MCP limitada."
fi
# Create sample MCP configuration
mkdir -p "$HOME/.config/claude" 2>/dev/null || true
cat > "$DEMO_DIR/claude-desktop-config-sample.json" << EOF
{
"mcpServers": {
"provisioning": {
"command": "python3",
"args": ["$DEMO_DIR/provisioning/mcp/server.py"],
"env": {
"PROVISIONING_PATH": "$DEMO_DIR/provisioning",
"PROVISIONING_DEMO": "true"
}
}
}
}
EOF
log "✅ Demo MCP configurado"
log "📄 Configuración Claude Desktop: $DEMO_DIR/claude-desktop-config-sample.json"
}
setup_docker_demo() {
log "Configurando ambiente Docker para demos..."
cd "$DEMO_DIR/provisioning/talks/rust-meetup-2025/setup"
# Start demo services
if command -v docker &> /dev/null && docker info &> /dev/null; then
log "Iniciando servicios demo..."
docker-compose up -d || warn "No se pudieron iniciar servicios Docker"
else
warn "Docker no disponible. Algunas demos serán limitadas."
fi
log "✅ Servicios Docker configurados"
}
verify_installation() {
log "Verificando instalación..."
cd "$DEMO_DIR"
source demo-env.sh
# Test basic tools
ERRORS=0
if ! command -v nu &> /dev/null; then
error "❌ Nushell no encontrado"
((ERRORS++))
else
log "✅ Nushell: $(nu --version | head -n1)"
fi
if ! command -v kcl &> /dev/null; then
error "❌ KCL no encontrado"
((ERRORS++))
else
log "✅ KCL: $(kcl --version)"
fi
if [[ ! -d "$DEMO_DIR/provisioning" ]]; then
error "❌ Repositorio no clonado"
((ERRORS++))
else
log "✅ Repositorio provisioning disponible"
fi
# Test provisioning system
cd "$DEMO_DIR/provisioning"
if nu -c "use core/nulib/lib_provisioning *; print 'Provisioning library loaded successfully'" &> /dev/null; then
log "✅ Sistema provisioning funcional"
else
warn "⚠️ Sistema provisioning con problemas - algunas demos pueden fallar"
fi
if [[ $ERRORS -eq 0 ]]; then
log "🎉 Instalación completada exitosamente!"
else
warn "⚠️ Instalación completada con $ERRORS errores"
fi
}
show_next_steps() {
echo ""
echo -e "${BLUE}🎯 Próximos pasos:${NC}"
echo ""
echo "1. Cargar ambiente demo:"
echo " source $DEMO_DIR/demo-env.sh"
echo ""
echo "2. Explorar el sistema:"
echo " cd $DEMO_DIR/provisioning"
echo " ./core/nulib/provisioning help"
echo ""
echo "3. Ejecutar demos de la charla:"
echo " cd talks/rust-meetup-2025/demos"
echo " nu 01-basic-provisioning.nu"
echo " nu 02-mcp-ai-demo.nu"
echo " nu 03-cosmian-kms.nu"
echo " ./04-cross-compile.sh"
echo ""
echo "4. Ver la presentación:"
echo " cd talks/rust-meetup-2025"
echo " npm install && npm run dev"
echo ""
echo -e "${GREEN}🦀 ¡Disfruta explorando Cloud Native Provisioning!${NC}"
}
main() {
banner
log "Iniciando setup del ambiente demo..."
check_requirements
install_rust
install_nushell
install_kcl
install_docker
setup_demo_environment
setup_nushell_plugins
setup_mcp_demo
setup_docker_demo
verify_installation
show_next_steps
log "🎉 Setup completado!"
}
# Execute main function
main "$@"