#!/usr/bin/env bash set -euo pipefail stpRoot="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" export stpRoot source "$stpRoot/lib/log.sh" source "$stpRoot/lib/utils.sh" export verbose="${verbose:-false}" selectedModule="" skipModules=() readModuleOrder() { grep -v '^\s*#' "$stpRoot/config/modules" | grep -v '^\s*$' } usage() { cat < Ejecutar solo este módulo (ej: packages) -s, --skip Saltear módulo, puede repetirse -v, --verbose Salida detallada -l, --list Listar módulos en orden de ejecución -h, --help Mostrar esta ayuda Ejemplos: stp.sh # Ejecutar todos los módulos stp.sh -m packages # Solo instalar paquetes stp.sh -s video -s audio # Saltear video y audio EOF } listModules() { echo "Módulos (en orden de ejecución):" while IFS= read -r name; do local modulePath="$stpRoot/modules/${name}.sh" if [[ -f "$modulePath" ]]; then printf " %s\n" "$name" else printf " %s (⚠ no encontrado: modules/%s.sh)\n" "$name" "$name" fi done < <(readModuleOrder) } shouldSkip() { local moduleName="$1" for skip in "${skipModules[@]:-}"; do [[ "$moduleName" == "$skip" ]] && return 0 done return 1 } runModule() { local moduleName="$1" local modulePath="$stpRoot/modules/${moduleName}.sh" if [[ ! -f "$modulePath" ]]; then log::error "Módulo no encontrado: modules/${moduleName}.sh" return 1 fi if shouldSkip "$moduleName"; then log::warn "Salteando: $moduleName" return 0 fi log::step "$moduleName" if ! bash "$modulePath"; then log::error "Falló el módulo: $moduleName (ver $stpLogFile)" return 1 fi } while [[ $# -gt 0 ]]; do case "$1" in -m|--module) selectedModule="$2"; shift 2 ;; -s|--skip) skipModules+=("$2"); shift 2 ;; -v|--verbose) verbose=true; shift ;; -l|--list) listModules; exit 0 ;; -h|--help) usage; exit 0 ;; *) log::error "Opción desconocida: $1"; usage; exit 1 ;; esac done printf '\n' log::step "Sistema de Transferencia Personal" log::info "Log: $stpLogFile" printf '\n' util::requireSudo if [[ -n "$selectedModule" ]]; then if [[ ! -f "$stpRoot/modules/${selectedModule}.sh" ]]; then log::error "Módulo no encontrado: $selectedModule" listModules exit 1 fi runModule "$selectedModule" else while IFS= read -r moduleName; do runModule "$moduleName" printf '\n' done < <(readModuleOrder) fi printf '\n' log::ok "STP completado. Log completo en: $stpLogFile"