From cbc405a4862b206ec021c277b9cba807f96eed83 Mon Sep 17 00:00:00 2001 From: stornic56 <71296607+stornic56@users.noreply.github.com> Date: Thu, 8 Oct 2026 15:16:33 -0500 Subject: [PATCH] fix An issue with the verification and extraction of the .tgz file was resolved. --- core/common.sh | 15 +++-- core/doctor.sh | 71 +++++++++++++++++++++ core/menu.sh | 62 +++++++++++++++++++ core/neo_apt.sh | 75 +++++++++++++++++++++++ core/openvino_logic.sh | 45 +++++++++++--- core/uninstall.sh | 57 +++++++++++++++++ main.sh | 132 ++++++++++++++++++++++++++++++++-------- modules/setup_debian.sh | 38 +----------- modules/setup_ubuntu.sh | 39 +----------- 9 files changed, 425 insertions(+), 109 deletions(-) create mode 100644 core/doctor.sh create mode 100644 core/menu.sh create mode 100644 core/neo_apt.sh create mode 100644 core/uninstall.sh diff --git a/core/common.sh b/core/common.sh index 7e3094b..b75212b 100644 --- a/core/common.sh +++ b/core/common.sh @@ -1,9 +1,16 @@ #!/bin/bash # ------------------------------------------------------------------------------ # Common printing functions for all installer scripts. +# Dual output: colores ANSI a stdout + texto plano (sin codigos) a $LOG_FILE. +# El log es AUXILIAR: su fallo de escritura no debe abortar la operacion +# (p. ej. log root-owned + doctor sin root) — por eso el append va guardado. # ------------------------------------------------------------------------------ -print_step() { echo -e "\n\033[1;34m>>>\033[0m \033[1m$1\033[0m"; } -print_substep() { echo -e "\033[1;32m =>\033[0m $1"; } -print_warning() { echo -e "\033[1;33m [AVISO]\033[0m $1"; } -print_error() { echo -e "\033[1;31m [ERROR]\033[0m $1"; } +LOG_FILE="${LOG_FILE:-install.log}" + +_log_plain() { printf '%s\n' "$1" >> "$LOG_FILE" 2>/dev/null || true; } + +print_step() { echo -e "\n\033[1;34m>>>\033[0m \033[1m$1\033[0m"; _log_plain ""; _log_plain ">>> $1"; } +print_substep() { echo -e "\033[1;32m =>\033[0m $1"; _log_plain " => $1"; } +print_warning() { echo -e "\033[1;33m [WARNING]\033[0m $1"; _log_plain " [WARNING] $1"; } +print_error() { echo -e "\033[1;31m [ERROR]\033[0m $1"; _log_plain " [ERROR] $1"; } diff --git a/core/doctor.sh b/core/doctor.sh new file mode 100644 index 0000000..eafe901 --- /dev/null +++ b/core/doctor.sh @@ -0,0 +1,71 @@ +#!/bin/bash +# ------------------------------------------------------------------------------ +# doctor: post-installation verification (no root required). +# Sourced by main.sh (doctor subcommand) and by the menu. +# Output with print_* from common.sh; exit code = number of failed checks. +# ------------------------------------------------------------------------------ + +run_doctor_checks() { + print_step "Doctor: verifying OpenVINO installation..." + local fails=0 + + # 1. Stable symlink + if [ -L /opt/intel/openvino_2026 ]; then + print_substep "Symlink OK: /opt/intel/openvino_2026 -> $(readlink /opt/intel/openvino_2026)" + else + print_error "Missing symlink /opt/intel/openvino_2026 (was the installation performed?)" + fails=$((fails+1)) + fi + + # 2. Installed version + if [ -f /opt/intel/openvino_2026/runtime/version.txt ]; then + print_substep "Installed version: $(cat /opt/intel/openvino_2026/runtime/version.txt)" + else + print_error "runtime/version.txt not found" + fails=$((fails+1)) + fi + + # 3. OpenCL (clinfo) — capture first (clinfo output is large; grep -q would + # SIGPIPE-kill the pipe and report a false negative under pipefail) + 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 (device detected)" + else + print_warning "clinfo does not detect a device (missing NEO driver or render/video groups?)" + fails=$((fails+1)) + fi + else + print_warning "clinfo is not installed" + fails=$((fails+1)) + fi + + # 4. VAAPI (vainfo) — same capture-first pattern (consistency + latent SIGPIPE) + 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 loaded)" + else + print_warning "vainfo does not load a driver (missing intel-media-va-driver?)" + fails=$((fails+1)) + fi + else + print_warning "vainfo is not installed" + fails=$((fails+1)) + fi + + # 5. render/video groups + if id -Gn 2>/dev/null | grep -qw render && id -Gn 2>/dev/null | grep -qw video; then + print_substep "Groups OK: user is in render and video" + else + print_warning "User is NOT in the render/video groups (restart your session after installing)" + fails=$((fails+1)) + fi + + if [ "$fails" -eq 0 ]; then + print_substep "Doctor: ALL OK" + else + print_warning "Doctor: $fails check(s) with warnings or failures" + fi + return "$fails" +} diff --git a/core/menu.sh b/core/menu.sh new file mode 100644 index 0000000..c73a2ea --- /dev/null +++ b/core/menu.sh @@ -0,0 +1,62 @@ +#!/bin/bash +# ------------------------------------------------------------------------------ +# Minimalist pure-bash menu (zero external dependencies: ANSI + read -sn1). +# Navigation: up/down arrows + Enter, number keys as a shortcut, q/ESC exit. +# Returns: 0=exit, 1=full installation, 2=NEO only, 3=OpenVINO only, +# 4=doctor, 5=uninstall +# Requires: common.sh already sourced (print_*), no root needed to navigate. +# ------------------------------------------------------------------------------ + +MENU_OPTS=("Full installation" "NEO drivers only" "OpenVINO Runtime only" "Verify installation (doctor)" "Uninstall" "Exit") + +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=$(( 38 - ${#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 " Arrows + Enter · number + Enter · q/ESC exit" + if ! read -rsn1 key; then + print_error "No input available." + 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/core/neo_apt.sh b/core/neo_apt.sh new file mode 100644 index 0000000..27b15ce --- /dev/null +++ b/core/neo_apt.sh @@ -0,0 +1,75 @@ +#!/bin/bash +# ------------------------------------------------------------------------------ +# Shared NEO block: version variables, SHA256 hashes, download with +# verification and install via apt. Sourced by the setup_*.sh modules. +# +# The next version update changes ONLY the 4 variables here +# (+ the NEO_HASHES values if the hashes change). +# Requires: common.sh already sourced (uses print_*), CWD = TEMP_DIR when +# calling install_neo_packages. +# ------------------------------------------------------------------------------ + +# --- Versions (pinned; no auto-detection) --- +IGC_TAG="v2.41.5" # release tag in intel/intel-graphics-compiler +IGC_BUILD="22716" # IGC package build: 2.41.5+22716 +IGC_VERSION="${IGC_TAG#v}" # derived: 2.41.5 +NEO_VERSION="26.35.39758.10" # release in intel/compute-runtime +GMM_VERSION="22.10.0" # libigdgmm12 (stable across releases) + +# --- SHA256 hashes by package name (values change with each version) --- +declare -A NEO_HASHES=( + ["intel-igc-core-2"]="0a6e64a663ae65a0fa02d6912ae3b6b37cf85b90c21cc423fd9fef70aaf4f628" + ["intel-igc-opencl-2"]="779e1b9e88098eb25711e9a8f67c2752665bad22f134aa40ed5649f6e1b87058" + ["intel-ocloc"]="c64bff586edf2bd9b49f3e4c9c2be25e05c43466e4dafa2a2c3948d498c736b7" + ["intel-opencl-icd"]="61712caaddeba3d38e4f79e2a0fb23fea25596ca2d72c3144c6eea2331ec4301" + ["libigdgmm12"]="6031a63d6e8a12ce61c14efc15f2c8e727061286e3820b8594e6d00615e04d54" + ["libze-intel-gpu1"]="c19a641b953d55aebbf1d51bec364a84bf629f985e02fbbe6dc70224c0e88470" +) + +# --- Package filename by family --- +neo_pkg_filename() { + case "$1" in + intel-igc-core-2|intel-igc-opencl-2) + echo "${1}_${IGC_VERSION}+${IGC_BUILD}_amd64.deb" ;; + libigdgmm12) + echo "${1}_${GMM_VERSION}_amd64.deb" ;; + *) + echo "${1}_${NEO_VERSION}-0_amd64.deb" ;; + esac +} + +# --- Download URL by family --- +neo_pkg_url() { + case "$1" in + intel-igc-core-2|intel-igc-opencl-2) + echo "https://github.com/intel/intel-graphics-compiler/releases/download/${IGC_TAG}/$(neo_pkg_filename "$1")" ;; + *) + echo "https://github.com/intel/compute-runtime/releases/download/${NEO_VERSION}/$(neo_pkg_filename "$1")" ;; + esac +} + +# --- Download with SHA256 verification --- +download_and_verify() { + local url="$1" + local filename="$2" + local expected="$3" + wget -q --show-progress "$url" -O "$filename" + local actual + actual=$(sha256sum "$filename" | awk '{print $1}') + if [ "$actual" != "$expected" ]; then + print_error "SHA256 mismatch for $filename" + exit 1 + fi +} + +# --- Download + verify + install of the 6 production packages --- +install_neo_packages() { + local pkg f + for pkg in intel-igc-core-2 intel-igc-opencl-2 intel-ocloc libigdgmm12 libze-intel-gpu1 intel-opencl-icd; do + f="$(neo_pkg_filename "$pkg")" + download_and_verify "$(neo_pkg_url "$pkg")" "$f" "${NEO_HASHES[$pkg]}" + done + + print_substep "Installing deb packages..." + apt-get install -y ./*.deb +} diff --git a/core/openvino_logic.sh b/core/openvino_logic.sh index ca0e278..bddee21 100644 --- a/core/openvino_logic.sh +++ b/core/openvino_logic.sh @@ -6,10 +6,40 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "$SCRIPT_DIR/common.sh" if [ $# -lt 2 ]; then - print_error "Usage: $0 | $0 --install " + print_error "Usage: $0 | $0 --extract | $0 --install " exit 1 fi +if [ "$1" = "--extract" ]; then + FILENAME="$2" + if [ ! -f "$FILENAME" ]; then + print_error " $FILENAME could not be found to extract." + exit 1 + fi + + # Known before tar (enables partial-extraction cleanup on abort) + DIRNAME="${FILENAME%.tgz}" + # Cleanup ONLY on abort: the trap is set before tar and DISARMED on success — + # otherwise the EXIT trap deletes the just-extracted folder on 'exit 0' and + # the deps step (and the later --install) find nothing. + trap 'rm -rf "$DIRNAME"' EXIT + + print_substep "Unzipping $FILENAME..." + if ! tar -xf "$FILENAME"; then + print_error "Extraction of $FILENAME failed." + exit 1 # trap fires: partial extraction is cleaned up + fi + trap - EXIT # success: keep the extracted folder for the deps and install steps + + # fallback if the extracted folder name differs from the tarball name + if [ ! -d "$DIRNAME" ]; then + TAR_LIST=$(tar -tf "$FILENAME") + DIRNAME="${TAR_LIST%%$'\n'*}" # first entry (no pipe, no SIGPIPE) + DIRNAME="${DIRNAME%%/*}" + fi + exit 0 +fi + if [ "$1" = "--install" ]; then FILENAME="$2" if [ ! -f "$FILENAME" ]; then @@ -30,9 +60,9 @@ if [ "$1" = "--install" ]; then INSTALL_DIR="/opt/intel/openvino_$(echo "$VERSION_FULL" | cut -d. -f1-3)" # Replace policy (updates): remove ANY previous 2026 install and the previous symlink. - # Known limitation: the previous install is deleted BEFORE extracting; if the tar - # failed afterwards, the system would be left without OpenVINO. Acceptable because - # the SHA256 was already verified during the download step. + # Known limitation: the previous install is deleted BEFORE moving the new one; if the + # mv failed afterwards, the system would be left without OpenVINO. Acceptable because + # the extraction and its SHA256 verification already succeeded in the --extract step. if ls -d /opt/intel/openvino_2026.* >/dev/null 2>&1; then print_warning "An existing OpenVINO installation was found. Replacing it..." fi @@ -40,10 +70,7 @@ if [ "$1" = "--install" ]; then rm -rf /opt/intel/openvino_2026.* # ANY previous 2026 install mkdir -p /opt/intel - DIRNAME="${FILENAME%.tgz}" # known before tar (enables trap cleanup) - trap 'rm -rf "$DIRNAME"' EXIT - print_substep "Unzipping $FILENAME..." - tar -xf "$FILENAME" + DIRNAME="${FILENAME%.tgz}" if [ ! -d "$DIRNAME" ]; then # guess the real name @@ -51,7 +78,7 @@ if [ "$1" = "--install" ]; then DIRNAME="${TAR_LIST%%$'\n'*}" # first entry (no pipe, no SIGPIPE) DIRNAME="${DIRNAME%%/*}" fi - print_substep "Moving $DIRNAME a $INSTALL_DIR..." + print_substep "Moving $DIRNAME to $INSTALL_DIR..." mv "$DIRNAME" "$INSTALL_DIR" print_substep "Create symbolic link /opt/intel/openvino_2026..." diff --git a/core/uninstall.sh b/core/uninstall.sh new file mode 100644 index 0000000..dc1692b --- /dev/null +++ b/core/uninstall.sh @@ -0,0 +1,57 @@ +#!/bin/bash +# ------------------------------------------------------------------------------ +# uninstall: removes OpenVINO Runtime (and optionally the NEO drivers). +# Sourced by main.sh (uninstall subcommand). Requires root to operate. +# Arguments: --purge-drivers (dpkg -r of the 6 NEO packages), --yes (no prompt). +# ------------------------------------------------------------------------------ + +run_uninstall() { + local PURGE_DRIVERS=false + local ASSUME_YES=false + while [ $# -gt 0 ]; do + case "$1" in + --purge-drivers) PURGE_DRIVERS=true ;; + --yes) ASSUME_YES=true ;; + *) break ;; + esac + shift + done + + if [ "$EUID" -ne 0 ]; then + print_error "uninstall requires root. Use: sudo bash main.sh uninstall [--purge-drivers] [--yes]" + exit 1 + fi + + print_step "Uninstall: removing OpenVINO Runtime..." + + # Mandatory confirmation (skipped with --yes) + if [ "$ASSUME_YES" != true ]; then + read -r -p "This will remove /opt/intel/openvino_2026* (all 2026 installations). Continue? [y/n]: " response || { + print_error "No input available. Uninstall cancelled." + exit 1 + } + case "$response" in + [yY]*) ;; + *) + print_error "Uninstall cancelled by the user." + exit 0 + ;; + esac + fi + + # Runtime: symlink OR real directory + any 2026 installation + # (rm -rf does not follow symlinks — covers both cases) + rm -rf /opt/intel/openvino_2026 + rm -rf /opt/intel/openvino_2026.* + print_substep "OpenVINO Runtime removed (/opt/intel/openvino_2026*)" + + # NEO drivers (optional, best-effort with a warning) + if [ "$PURGE_DRIVERS" = true ]; then + print_substep "Purging NEO drivers (dpkg -r)..." + if ! dpkg -r intel-opencl-icd intel-ocloc libigdgmm12 libze-intel-gpu1 intel-igc-core-2 intel-igc-opencl-2 2>/dev/null; then + print_warning "Some NEO packages were not installed (on Fedora: dnf remove intel-compute-runtime)" + fi + fi + + print_substep "Uninstall completed." +} diff --git a/main.sh b/main.sh index 745dd50..52432ec 100644 --- a/main.sh +++ b/main.sh @@ -7,6 +7,79 @@ set -euo pipefail # It supports Debian 13, Ubuntu 22.04/24.04/26.04, and Fedora (latest stable versions). # ------------------------------------------------------------------------------ +# routes +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +CORE_DIR="$SCRIPT_DIR/core" +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) + shift + source "$CORE_DIR/doctor.sh" + run_doctor_checks + exit 0 + ;; + uninstall) + shift + source "$CORE_DIR/uninstall.sh" + run_uninstall "$@" + exit 0 + ;; +esac + +# Option parsing (before the root check: parsing needs no privileges) +ASSUME_YES=false +FORCE_NO_GPU=false +while [ $# -gt 0 ]; do + case "$1" in + --yes) ASSUME_YES=true ;; + --no-gpu) FORCE_NO_GPU=true ;; + --help | -h) + echo "Usage: sudo bash main.sh [--yes] [--no-gpu] [doctor]" + echo " --yes non-interactive: assume 'yes' at the GPU-absent prompt" + echo " --no-gpu skip NEO drivers without prompting" + echo " doctor post-install verification (no root required)" + exit 0 + ;; + *) + print_error "Unknown option: $1 (use --help)" + exit 1 + ;; + esac + 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 "See you soon." + 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:" @@ -14,15 +87,6 @@ if [ "$EUID" -ne 0 ]; then exit 1 fi -# routes -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -CORE_DIR="$SCRIPT_DIR/core" -MODULES_DIR="$SCRIPT_DIR/modules" -DEPS_DIR="$SCRIPT_DIR/deps" - -# print -source "$CORE_DIR/common.sh" - print_step "=============================================" print_step " OpenVINO 2026 - SimpleInstaller" print_step "=============================================" @@ -82,23 +146,29 @@ if [ -n "$GPU_LINE" ]; then else print_warning "No Intel GPU was detected." GPU_PRESENT=false - read -r -p "Do you want to continue the installation WITHOUT GPU support? [y/n]: " response || { - print_error "No interactive input available (stdin closed). Installation cancelled." - exit 1 - } - case "$response" in - [yY]*) ;; - *) - print_error "Installation cancelled by the user." - exit 0 - ;; - esac + if [ "$FORCE_NO_GPU" = true ]; then + print_substep "--no-gpu set: skipping NEO driver installation." + elif [ "$ASSUME_YES" = true ]; then + print_substep "--yes set: continuing WITHOUT GPU support." + else + read -r -p "Do you want to continue the installation WITHOUT GPU support? [y/n]: " response || { + print_error "No interactive input available (stdin closed). Installation cancelled." + exit 1 + } + case "$response" in + [yY]*) ;; + *) + print_error "Installation cancelled by the user." + exit 0 + ;; + esac + fi 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) @@ -115,6 +185,11 @@ else print_step "3. Skipping NEO driver installation (no Intel GPU)." fi +if [ "$MODE" = "neo" ]; then + print_step "NEO installation finished." + exit 0 +fi + # ------------------------------------------------------------------------------ # 4. Download OpenVINO Runtime # ------------------------------------------------------------------------------ @@ -132,10 +207,19 @@ bash "$CORE_DIR/openvino_logic.sh" "$URL" "$FILENAME" print_step "5. Integrity verification completed." # ------------------------------------------------------------------------------ -# 6. Install system dependencies for OpenVINO # ------------------------------------------------------------------------------ -print_step "6. Installing system dependencies (Python, cmake, etc.)..." -bash "$DEPS_DIR/install_openvino_dependencies.sh" -y +# 6. Extract the tarball and install system dependencies from it (official flow) +# ------------------------------------------------------------------------------ +print_step "6. Extracting tarball and installing system dependencies..." +bash "$CORE_DIR/openvino_logic.sh" --extract "$FILENAME" + +DEPS_SCRIPT="${FILENAME%.tgz}/install_dependencies/install_openvino_dependencies.sh" +if [ ! -f "$DEPS_SCRIPT" ]; then + print_error "Unexpected tarball layout: install_dependencies/ not found in the extracted folder." + exit 1 +fi +print_substep "Installing system dependencies from the tarball..." +bash "$DEPS_SCRIPT" -y # ------------------------------------------------------------------------------ # 7. Install OpenVINO diff --git a/modules/setup_debian.sh b/modules/setup_debian.sh index 98d97b7..04b2d11 100644 --- a/modules/setup_debian.sh +++ b/modules/setup_debian.sh @@ -4,6 +4,7 @@ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "$SCRIPT_DIR/../core/common.sh" +source "$SCRIPT_DIR/../core/neo_apt.sh" print_step "Debian Module – Drivers and Multimedia" @@ -44,42 +45,7 @@ cd "$TEMP_DIR" trap 'rm -rf "$TEMP_DIR"' EXIT # Hashes SHA256 -declare -A NEO_HASHES=( - ["intel-igc-core-2_2.41.5+22716_amd64.deb"]="0a6e64a663ae65a0fa02d6912ae3b6b37cf85b90c21cc423fd9fef70aaf4f628" - ["intel-igc-opencl-2_2.41.5+22716_amd64.deb"]="779e1b9e88098eb25711e9a8f67c2752665bad22f134aa40ed5649f6e1b87058" - ["intel-ocloc_26.35.39758.10-0_amd64.deb"]="c64bff586edf2bd9b49f3e4c9c2be25e05c43466e4dafa2a2c3948d498c736b7" - ["intel-opencl-icd_26.35.39758.10-0_amd64.deb"]="61712caaddeba3d38e4f79e2a0fb23fea25596ca2d72c3144c6eea2331ec4301" - ["libigdgmm12_22.10.0_amd64.deb"]="6031a63d6e8a12ce61c14efc15f2c8e727061286e3820b8594e6d00615e04d54" - ["libze-intel-gpu1_26.35.39758.10-0_amd64.deb"]="c19a641b953d55aebbf1d51bec364a84bf629f985e02fbbe6dc70224c0e88470" -) - -download_and_verify() { - local url="$1" - local filename="$2" - local expected="$3" - wget -q --show-progress "$url" -O "$filename" - actual=$(sha256sum "$filename" | awk '{print $1}') - if [ "$actual" != "$expected" ]; then - print_error "SHA256 mismatch para $filename" - exit 1 - fi -} - -download_and_verify "https://github.com/intel/intel-graphics-compiler/releases/download/v2.41.5/intel-igc-core-2_2.41.5+22716_amd64.deb" \ - "intel-igc-core-2_2.41.5+22716_amd64.deb" "${NEO_HASHES["intel-igc-core-2_2.41.5+22716_amd64.deb"]}" -download_and_verify "https://github.com/intel/intel-graphics-compiler/releases/download/v2.41.5/intel-igc-opencl-2_2.41.5+22716_amd64.deb" \ - "intel-igc-opencl-2_2.41.5+22716_amd64.deb" "${NEO_HASHES["intel-igc-opencl-2_2.41.5+22716_amd64.deb"]}" -download_and_verify "https://github.com/intel/compute-runtime/releases/download/26.35.39758.10/intel-ocloc_26.35.39758.10-0_amd64.deb" \ - "intel-ocloc_26.35.39758.10-0_amd64.deb" "${NEO_HASHES["intel-ocloc_26.35.39758.10-0_amd64.deb"]}" -download_and_verify "https://github.com/intel/compute-runtime/releases/download/26.35.39758.10/intel-opencl-icd_26.35.39758.10-0_amd64.deb" \ - "intel-opencl-icd_26.35.39758.10-0_amd64.deb" "${NEO_HASHES["intel-opencl-icd_26.35.39758.10-0_amd64.deb"]}" -download_and_verify "https://github.com/intel/compute-runtime/releases/download/26.35.39758.10/libigdgmm12_22.10.0_amd64.deb" \ - "libigdgmm12_22.10.0_amd64.deb" "${NEO_HASHES["libigdgmm12_22.10.0_amd64.deb"]}" -download_and_verify "https://github.com/intel/compute-runtime/releases/download/26.35.39758.10/libze-intel-gpu1_26.35.39758.10-0_amd64.deb" \ - "libze-intel-gpu1_26.35.39758.10-0_amd64.deb" "${NEO_HASHES["libze-intel-gpu1_26.35.39758.10-0_amd64.deb"]}" - -print_substep "Instalando paquetes deb..." -apt-get install -y ./*.deb +install_neo_packages cd / rm -rf "$TEMP_DIR" diff --git a/modules/setup_ubuntu.sh b/modules/setup_ubuntu.sh index 614a279..3905b55 100644 --- a/modules/setup_ubuntu.sh +++ b/modules/setup_ubuntu.sh @@ -3,6 +3,7 @@ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "$SCRIPT_DIR/../core/common.sh" +source "$SCRIPT_DIR/../core/neo_apt.sh" print_step "Ubuntu Module – Drivers and Multimedia" @@ -32,47 +33,13 @@ TEMP_DIR=$(mktemp -d) cd "$TEMP_DIR" trap 'rm -rf "$TEMP_DIR"' EXIT -declare -A NEO_HASHES=( - ["intel-igc-core-2_2.41.5+22716_amd64.deb"]="0a6e64a663ae65a0fa02d6912ae3b6b37cf85b90c21cc423fd9fef70aaf4f628" - ["intel-igc-opencl-2_2.41.5+22716_amd64.deb"]="779e1b9e88098eb25711e9a8f67c2752665bad22f134aa40ed5649f6e1b87058" - ["intel-ocloc_26.35.39758.10-0_amd64.deb"]="c64bff586edf2bd9b49f3e4c9c2be25e05c43466e4dafa2a2c3948d498c736b7" - ["intel-opencl-icd_26.35.39758.10-0_amd64.deb"]="61712caaddeba3d38e4f79e2a0fb23fea25596ca2d72c3144c6eea2331ec4301" - ["libigdgmm12_22.10.0_amd64.deb"]="6031a63d6e8a12ce61c14efc15f2c8e727061286e3820b8594e6d00615e04d54" - ["libze-intel-gpu1_26.35.39758.10-0_amd64.deb"]="c19a641b953d55aebbf1d51bec364a84bf629f985e02fbbe6dc70224c0e88470" -) - -download_and_verify() { - local url="$1" - local filename="$2" - local expected="$3" - wget -q --show-progress "$url" -O "$filename" - actual=$(sha256sum "$filename" | awk '{print $1}') - if [ "$actual" != "$expected" ]; then - print_error "SHA256 mismatch para $filename" - exit 1 - fi -} - -download_and_verify "https://github.com/intel/intel-graphics-compiler/releases/download/v2.41.5/intel-igc-core-2_2.41.5+22716_amd64.deb" \ - "intel-igc-core-2_2.41.5+22716_amd64.deb" "${NEO_HASHES["intel-igc-core-2_2.41.5+22716_amd64.deb"]}" -download_and_verify "https://github.com/intel/intel-graphics-compiler/releases/download/v2.41.5/intel-igc-opencl-2_2.41.5+22716_amd64.deb" \ - "intel-igc-opencl-2_2.41.5+22716_amd64.deb" "${NEO_HASHES["intel-igc-opencl-2_2.41.5+22716_amd64.deb"]}" -download_and_verify "https://github.com/intel/compute-runtime/releases/download/26.35.39758.10/intel-ocloc_26.35.39758.10-0_amd64.deb" \ - "intel-ocloc_26.35.39758.10-0_amd64.deb" "${NEO_HASHES["intel-ocloc_26.35.39758.10-0_amd64.deb"]}" -download_and_verify "https://github.com/intel/compute-runtime/releases/download/26.35.39758.10/intel-opencl-icd_26.35.39758.10-0_amd64.deb" \ - "intel-opencl-icd_26.35.39758.10-0_amd64.deb" "${NEO_HASHES["intel-opencl-icd_26.35.39758.10-0_amd64.deb"]}" -download_and_verify "https://github.com/intel/compute-runtime/releases/download/26.35.39758.10/libigdgmm12_22.10.0_amd64.deb" \ - "libigdgmm12_22.10.0_amd64.deb" "${NEO_HASHES["libigdgmm12_22.10.0_amd64.deb"]}" -download_and_verify "https://github.com/intel/compute-runtime/releases/download/26.35.39758.10/libze-intel-gpu1_26.35.39758.10-0_amd64.deb" \ - "libze-intel-gpu1_26.35.39758.10-0_amd64.deb" "${NEO_HASHES["libze-intel-gpu1_26.35.39758.10-0_amd64.deb"]}" - -apt-get install -y ./*.deb +install_neo_packages cd / rm -rf "$TEMP_DIR" # ---- 4. add user ---- -print_substep "Añadiendo usuario a grupos render y video..." +print_substep "Adding user to render and video groups..." if [ -n "${SUDO_USER:-}" ]; then usermod -a -G render,video "$SUDO_USER" else