#!/usr/bin/env bash # =========================================================================== # FOSFENO :: lib.sh - funciones comunes para los scripts de instalacion # Se carga con: source "$(dirname "$0")/scripts/lib.sh" # =========================================================================== # --- Colores (se desactivan si la salida no es un terminal) ---------------- if [ -t 1 ]; then C_RED=$'\e[31m'; C_GRN=$'\e[32m'; C_YEL=$'\e[33m' C_CYA=$'\e[36m'; C_BLD=$'\e[1m'; C_RST=$'\e[0m' else C_RED=''; C_GRN=''; C_YEL=''; C_CYA=''; C_BLD=''; C_RST='' fi # --- Logging ---------------------------------------------------------------- log_step() { printf '\n%s==> %s%s\n' "$C_CYA$C_BLD" "$*" "$C_RST"; } log_ok() { printf ' %s[ OK ]%s %s\n' "$C_GRN" "$C_RST" "$*"; } log_warn() { printf ' %s[ !! ]%s %s\n' "$C_YEL" "$C_RST" "$*"; } log_fail() { printf ' %s[ XX ]%s %s\n' "$C_RED" "$C_RST" "$*"; } log_info() { printf ' %s-%s %s\n' "$C_CYA" "$C_RST" "$*"; } # Contador global de errores no fatales FOSFENO_WARNINGS=0 warn() { log_warn "$*"; FOSFENO_WARNINGS=$((FOSFENO_WARNINGS + 1)); } # --- Versiones -------------------------------------------------------------- # ver_of "salida cualquiera v1.2.3 bla" -> "1.2.3" ver_of() { printf '%s' "$1" | grep -oE '[0-9]+(\.[0-9]+){1,2}' | head -n1; } # ver_ge "1.2.3" "1.2.0" -> exit 0 si $1 >= $2 ver_ge() { [ "$1" = "$2" ] && return 0 local menor menor=$(printf '%s\n%s\n' "$1" "$2" | sort -V | head -n1) [ "$menor" = "$2" ] } # require_version # Comprueba que un comando existe y cumple la version minima. require_version() { local nombre="$1" cmd="$2" minima="$3" salida actual if ! command -v "${cmd%% *}" >/dev/null 2>&1; then log_fail "$nombre no esta instalado" return 1 fi salida=$($cmd 2>&1 | head -n3) actual=$(ver_of "$salida") if [ -z "$actual" ]; then warn "$nombre instalado pero no se pudo leer la version" return 0 fi if ver_ge "$actual" "$minima"; then log_ok "$nombre $actual (minimo $minima)" return 0 else log_fail "$nombre $actual es anterior al minimo requerido $minima" return 1 fi } # --- Hardware --------------------------------------------------------------- pi_model() { if [ -r /proc/device-tree/model ]; then tr -d '\0' < /proc/device-tree/model else echo "desconocido" fi } # --- Utilidades ------------------------------------------------------------- need_cmd() { command -v "$1" >/dev/null 2>&1; }