From 5c82b320fdd8b2dab3adbae8a6a84442f54d8af5 Mon Sep 17 00:00:00 2001 From: stornic56 <71296607+stornic56@users.noreply.github.com> Date: Tue, 29 Sep 2026 12:05:17 -0500 Subject: [PATCH] feat: menu CLI minimalista (pure-bash, cero dependencias) - core/menu.sh: show_menu() con navegacion ANSI pura (read -sn1 + clear via printf ANSI), flechas up/down + Enter, atajo numerico 1-5/0, q/ESC salir, guard EOF - main.sh: menu como entrada por defecto (los flags --yes/--no-gpu la bypassan); despacho sin logica de negocio (MODE: full/neo/openvino + subcomandos doctor/uninstall) - Control de flujo: MODE!=openvino salta NEO; MODE=neo finaliza tras NEO (sin abrir OpenVINO) - Verificado: tecla 4 -> doctor completo, q/ESC/EOF -> salida limpia, opcion 2 sin root -> error de privilegios --- core/menu.sh | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++ main.sh | 34 +++++++++++++++++++++++++++- 2 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 core/menu.sh diff --git a/core/menu.sh b/core/menu.sh new file mode 100644 index 0000000..6f74e71 --- /dev/null +++ b/core/menu.sh @@ -0,0 +1,62 @@ +#!/bin/bash +# ------------------------------------------------------------------------------ +# Menu minimalista pure-bash (cero dependencias externas: ANSI + read -sn1). +# Navegacion: flechas up/down + Enter, teclas numericas como atajo, q/ESC salir. +# Devuelve: 0=salir, 1=instalacion completa, 2=solo NEO, 3=solo OpenVINO, +# 4=doctor, 5=desinstalar +# Requiere: common.sh ya sourceado (print_*), no necesita root para navegar. +# ------------------------------------------------------------------------------ + +MENU_OPTS=("Instalacion completa" "Solo drivers NEO" "Solo OpenVINO Runtime" "Verificar instalacion (doctor)" "Desinstalar" "Salir") + +show_menu() { + local sel=0 + local n=${#MENU_OPTS[@]} + local key rest i opt pad + while true; do + printf '\033[2J\033[H' + echo "" + echo "┌──────────────────────────────────────────────┐" + echo "│ OpenVINO Simple Installer 2026.4 │" + echo "└──────────────────────────────────────────────┘" + echo "" + i=0 + for opt in "${MENU_OPTS[@]}"; do + pad=$(( 36 - ${#opt} )) + if [ "$i" -eq "$sel" ]; then + printf '│ \033[1;34m▸ %s. %s\033[0m%*s│\n' "$((i+1))" "$opt" "$pad" "" + else + printf '│ %s. %s%*s│\n' "$((i+1))" "$opt" "$pad" "" + fi + i=$((i+1)) + done + echo "└──────────────────────────────────────────────┘" + echo "" + echo " Flechas + Enter · numero + Enter · q/ESC salir" + if ! read -rsn1 key; then + print_error "Sin entrada disponible." + return 0 + fi + if [ "$key" = $'\x1b' ]; then + rest="" + read -rsn2 -t 0.001 rest || true + case "$rest" in + '[A') sel=$(( (sel - 1 + n) % n )) ;; + '[B') sel=$(( (sel + 1) % n )) ;; + *) return 0 ;; # ESC sin flecha: salir + esac + elif [ "$key" = "" ]; then + # Enter: seleccionar la opcion marcada + [ "$sel" -eq $((n-1)) ] && return 0 + return $((sel+1)) + elif [[ "$key" =~ ^[0-9]$ ]]; then + # Atajo numerico: 1..5 seleccionan, 0 sale + [ "$key" = "0" ] && return 0 + if [ "$key" -ge 1 ] && [ "$key" -le $((n-1)) ]; then + return "$key" + fi + elif [ "$key" = "q" ]; then + return 0 + fi + done +} diff --git a/main.sh b/main.sh index b634865..2449407 100755 --- a/main.sh +++ b/main.sh @@ -53,6 +53,33 @@ while [ $# -gt 0 ]; do shift done +# Menu (Pure-bash ANSI, cero dependencias): la entrada por defecto; los flags la bypassan +MODE="full" +if [ "$ASSUME_YES" != true ] && [ "$FORCE_NO_GPU" != true ]; then + source "$CORE_DIR/menu.sh" + sel=0 + show_menu || sel=$? + case "$sel" in + 0) + print_step "Hasta pronto." + exit 0 + ;; + 1) : ;; + 2) MODE="neo" ;; + 3) MODE="openvino" ;; + 4) + source "$CORE_DIR/doctor.sh" + run_doctor_checks + exit 0 + ;; + 5) + source "$CORE_DIR/uninstall.sh" + run_uninstall + exit 0 + ;; + esac +fi + # privileges if [ "$EUID" -ne 0 ]; then echo "ERROR: This script must be run as root. Use:" @@ -141,7 +168,7 @@ fi # ------------------------------------------------------------------------------ # 3. Install NEO (only if there is a GPU) # ------------------------------------------------------------------------------ -if [ "$GPU_PRESENT" = true ]; then +if [ "$MODE" != "openvino" ] && [ "$GPU_PRESENT" = true ]; then print_step "3. Installing GPU drivers (Intel Compute Runtime NEO)..." case "$OS_ID" in debian) @@ -158,6 +185,11 @@ else print_step "3. Skipping NEO driver installation (no Intel GPU)." fi +if [ "$MODE" = "neo" ]; then + print_step "Instalacion NEO finalizada." + exit 0 +fi + # ------------------------------------------------------------------------------ # 4. Download OpenVINO Runtime # ------------------------------------------------------------------------------