You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

214 lines
5.7 KiB

#!/usr/bin/env bash
#
# Unified installer: backvicibox + Custom (CSS/logos)
# - Ejecuta TODO desde un solo script interactivo
# - Se puede lanzar desde cualquier ruta: usa su propio directorio como base
#
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LOG_FILE="${SCRIPT_DIR}/unified_installer.log"
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
info() { echo -e "${GREEN}[INFO]${NC} $1" | tee -a "$LOG_FILE"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $1" | tee -a "$LOG_FILE"; }
error() { echo -e "${RED}[ERROR]${NC} $1" | tee -a "$LOG_FILE" >&2; }
need_root() {
if [[ "${EUID}" -ne 0 ]]; then
error "Ejecuta como root: sudo $0"
exit 1
fi
}
have_cmd() { command -v "$1" >/dev/null 2>&1; }
copy_tree() {
local src="$1"
local dst="$2"
mkdir -p "$dst"
if have_cmd rsync; then
rsync -a --delete "$src"/ "$dst"/
else
cp -a "$src"/. "$dst"/
fi
}
prompt_yn() {
local prompt="$1"
local default="${2:-Y}" # Y/N
local ans=""
while true; do
if [[ "$default" == "Y" ]]; then
read -r -p "${prompt} [Y/n]: " ans || true
ans="${ans:-Y}"
else
read -r -p "${prompt} [y/N]: " ans || true
ans="${ans:-N}"
fi
case "$ans" in
Y|y) return 0 ;;
N|n) return 1 ;;
*) echo "Responde Y o N." ;;
esac
done
}
prompt_text() {
local prompt="$1"
local default="${2:-}"
local ans=""
if [[ -n "$default" ]]; then
read -r -p "${prompt} [${default}]: " ans || true
ans="${ans:-$default}"
else
read -r -p "${prompt}: " ans || true
fi
printf '%s' "$ans"
}
print_menu() {
cat <<'EOF'
Selecciona qué quieres ejecutar (multi-selección permitida: ej. 1,3,4):
1) Stage assets (copiar Custom/backvicibox -> /home/backvicibox y Custom/installer custom -> HTDOCS/agc/css/installer)
2) Instalar backvicibox (ejecuta /home/backvicibox/install-vicibox.sh)
3) Custom: instalar CSS/logos (HTDOCS/agc/css/installer/install_custom_css.sh install)
4) Custom: status (HTDOCS/agc/css/installer/install_custom_css.sh status)
5) Custom: uninstall (HTDOCS/agc/css/installer/install_custom_css.sh uninstall)
6) Crear admin sapian (ejecuta /home/backvicibox/create-admin-sapian.sh)
7) Salir
EOF
}
parse_multiselect() {
# input: "1, 3 4" -> prints unique numbers one per line
local raw="$1"
raw="${raw//,/ }"
# shellcheck disable=SC2206
local parts=($raw)
for p in "${parts[@]}"; do
[[ "$p" =~ ^[0-9]+$ ]] || continue
echo "$p"
done | awk '!seen[$0]++'
}
require_paths() {
local back_src="${SCRIPT_DIR}/backvicibox"
local inst_custom_src="${SCRIPT_DIR}/installer custom"
[[ -d "$back_src" ]] || { error "No existe: ${back_src}"; exit 1; }
[[ -d "$inst_custom_src" ]] || { error "No existe: ${inst_custom_src}"; exit 1; }
}
do_stage() {
local htdocs="$1"
local back_src="${SCRIPT_DIR}/backvicibox"
local inst_custom_src="${SCRIPT_DIR}/installer custom"
local back_dst="/home/backvicibox"
local inst_dst="${htdocs}/agc/css/installer"
info "Staging assets..."
info " Origen backvicibox: ${back_src}"
info " Destino backvicibox: ${back_dst}"
info " Origen installer custom: ${inst_custom_src}"
info " Destino installer: ${inst_dst}"
copy_tree "$back_src" "$back_dst"
copy_tree "$inst_custom_src" "$inst_dst"
chmod +x "${back_dst}/"*.sh 2>/dev/null || true
chmod +x "${inst_dst}/install_custom_css.sh" 2>/dev/null || true
info "Stage completado."
}
do_backvicibox_install() {
local back_dst="/home/backvicibox"
local script="${back_dst}/install-vicibox.sh"
[[ -x "$script" ]] || { error "No ejecutable/no existe: ${script}. Ejecuta primero 'Stage assets'."; exit 1; }
info "Ejecutando backvicibox: ${script}"
( cd "$back_dst" && "$script" )
}
do_custom() {
local htdocs="$1"
local action="$2" # install|uninstall|status
local inst_dst="${htdocs}/agc/css/installer"
local script="${inst_dst}/install_custom_css.sh"
[[ -x "$script" ]] || { error "No ejecutable/no existe: ${script}. Ejecuta primero 'Stage assets'."; exit 1; }
info "Ejecutando Custom: HTDOCS=${htdocs} ${script} ${action}"
HTDOCS="$htdocs" "$script" "$action"
}
do_create_admin() {
local back_dst="/home/backvicibox"
local script="${back_dst}/create-admin-sapian.sh"
[[ -x "$script" ]] || { error "No ejecutable/no existe: ${script}. Ejecuta primero 'Stage assets'."; exit 1; }
info "Creando admin sapian: ${script}"
( cd "$back_dst" && "$script" )
}
main() {
need_root
require_paths
info "=========================================="
info "Unified Installer (backvicibox + Custom)"
info "Base: ${SCRIPT_DIR}"
info "Log: ${LOG_FILE}"
info "=========================================="
local htdocs
htdocs="$(prompt_text "Ruta HTDOCS (donde están vicidial/agc/VERM)" "/srv/www/htdocs")"
if [[ ! -d "$htdocs" ]]; then
error "HTDOCS no existe: ${htdocs}"
exit 1
fi
while true; do
print_menu
local sel
sel="$(prompt_text "Opción(es)" "1,2,3")"
local any=0
while read -r opt; do
any=1
case "$opt" in
1) do_stage "$htdocs" ;;
2) do_backvicibox_install ;;
3) do_custom "$htdocs" install ;;
4) do_custom "$htdocs" status ;;
5)
if prompt_yn "Confirmas desinstalar Custom (restaurará backups si existen)?" "N"; then
do_custom "$htdocs" uninstall
else
info "Uninstall cancelado."
fi
;;
6) do_create_admin ;;
7) info "Saliendo."; return 0 ;;
*) warn "Opción inválida: $opt" ;;
esac
done < <(parse_multiselect "$sel")
if [[ "$any" -eq 0 ]]; then
warn "No entendí la selección: '$sel'"
fi
echo ""
if ! prompt_yn "Quieres ejecutar otra acción?" "Y"; then
info "Listo."
return 0
fi
done
}
main "$@"