Primera version. Cinco motores (projectM, Butterchurn, Hydra, Shaders GLSL y mezclador VJ con camara y video), panel de control web, deteccion de BPM propia, pantalla de conexion con codigo QR, instalador robusto para Raspberry Pi 4 y 5 y documentacion completa en docs/. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
71 lines
2.5 KiB
Bash
Executable file
71 lines
2.5 KiB
Bash
Executable file
#!/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 <nombre> <comando --version> <version_minima>
|
|
# 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; }
|