From b042516ee976ac099cd02e69ee0b9be4e0661a97 Mon Sep 17 00:00:00 2001 From: stornic56 <71296607+stornic56@users.noreply.github.com> Date: Mon, 28 Sep 2026 23:42:12 -0500 Subject: [PATCH] feat: subcomando doctor (verificacion post-instalacion) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - core/doctor.sh: run_doctor_checks() — symlink estable, version.txt, clinfo, vainfo, grupos render/video; salida con print_*, exit code = numero de checks con fallo - clinfo/vainfo con patron captura-then-parse (clinfo tiene salida enorme: grep -q SIGPIPE-mata la pipe y reportaba falso negativo bajo pipefail — verificado en sistema real con plataforma OpenCL detectada) - main.sh: dispatch del subcomando ANTES del root check (el doctor es verificacion de usuario, sin root) — requiere el reorden routes/source antes de privilegios (resuelve la causa raiz de O2; el cambio cosmico echo->print_error queda para fase siguiente) --- core/doctor.sh | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++ main.sh | 23 ++++++++++++----- 2 files changed, 86 insertions(+), 7 deletions(-) create mode 100644 core/doctor.sh diff --git a/core/doctor.sh b/core/doctor.sh new file mode 100644 index 0000000..84b49a7 --- /dev/null +++ b/core/doctor.sh @@ -0,0 +1,70 @@ +#!/bin/bash +# ------------------------------------------------------------------------------ +# doctor: verificacion post-instalacion (sin root requerido). +# Sourced por main.sh (subcomando doctor) y por el menu. +# Salida con print_* de common.sh; exit code = numero de checks con fallo. +# ------------------------------------------------------------------------------ + +run_doctor_checks() { + print_step "Doctor: verificando la instalacion de OpenVINO..." + local fails=0 + + # 1. Symlink estable + if [ -L /opt/intel/openvino_2026 ]; then + print_substep "Symlink OK: /opt/intel/openvino_2026 -> $(readlink /opt/intel/openvino_2026)" + else + print_error "Falta el symlink /opt/intel/openvino_2026 (¿la instalacion no se realizo?)" + fails=$((fails+1)) + fi + + # 2. Version instalada + if [ -f /opt/intel/openvino_2026/runtime/version.txt ]; then + print_substep "Version instalada: $(cat /opt/intel/openvino_2026/runtime/version.txt)" + else + print_error "No se encontro runtime/version.txt" + fails=$((fails+1)) + fi + + # 3. OpenCL (clinfo) + if command -v clinfo >/dev/null 2>&1; then + CLINFO_OUT=$(clinfo 2>/dev/null || true) # clinfo exits !=0 when no devices + if [[ "${CLINFO_OUT^^}" == *"DEVICE NAME"* ]]; then + print_substep "OpenCL OK (dispositivo detectado)" + else + print_warning "clinfo no detecta dispositivo (¿falta el driver NEO o los grupos render/video?)" + fails=$((fails+1)) + fi + else + print_warning "clinfo no esta instalado" + fails=$((fails+1)) + fi + + # 4. VAAPI (vainfo) + if command -v vainfo >/dev/null 2>&1; then + VAINFO_OUT=$(vainfo 2>/dev/null || true) + if [[ "${VAINFO_OUT^^}" == *"DRIVER VERSION"* ]]; then + print_substep "VAAPI OK (driver cargado)" + else + print_warning "vainfo no carga driver (¿falta intel-media-va-driver?)" + fails=$((fails+1)) + fi + else + print_warning "vainfo no esta instalado" + fails=$((fails+1)) + fi + + # 5. Grupos render/video + if id -Gn 2>/dev/null | grep -qw render && id -Gn 2>/dev/null | grep -qw video; then + print_substep "Grupos OK: el usuario esta en render y video" + else + print_warning "El usuario NO esta en los grupos render/video (reinicia la sesion tras instalar)" + fails=$((fails+1)) + fi + + if [ "$fails" -eq 0 ]; then + print_substep "Doctor: TODO OK" + else + print_warning "Doctor: $fails check(s) con avisos o fallos" + fi + return "$fails" +} diff --git a/main.sh b/main.sh index 3f62ca2..93904c6 100755 --- a/main.sh +++ b/main.sh @@ -7,13 +7,6 @@ set -euo pipefail # It supports Debian 13, Ubuntu 22.04/24.04/26.04, and Fedora (latest stable versions). # ------------------------------------------------------------------------------ -# privileges -if [ "$EUID" -ne 0 ]; then - echo "ERROR: This script must be run as root. Use:" - echo " sudo bash $0" - exit 1 -fi - # routes SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" CORE_DIR="$SCRIPT_DIR/core" @@ -22,6 +15,22 @@ MODULES_DIR="$SCRIPT_DIR/modules" # print source "$CORE_DIR/common.sh" +# Subcommands (before the root check: doctor is a post-install user verification) +case "${1:-}" in + doctor) + source "$CORE_DIR/doctor.sh" + run_doctor_checks + exit 0 + ;; +esac + +# privileges +if [ "$EUID" -ne 0 ]; then + echo "ERROR: This script must be run as root. Use:" + echo " sudo bash $0" + exit 1 +fi + print_step "=============================================" print_step " OpenVINO 2026 - SimpleInstaller" print_step "============================================="