Modo portatil: ejecutar FOSFENO en un portatil Linux

Anade 'bash install.sh --laptop' y el lanzador './fosfeno' para correr FOSFENO en portatiles Debian/Ubuntu/Mint sin Raspberry Pi: puerto 8080, sin arranque automatico ni cambios en el sistema. El servidor admite las variables FOSFENO_PORT y FOSFENO_NO_KIOSK. Nueva documentacion en docs/portatil.md.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
hacklab 2026-05-22 14:39:34 +02:00
parent 30a09fdee6
commit 3c1c631895
7 changed files with 250 additions and 53 deletions

View file

@ -2,7 +2,8 @@
# ===========================================================================
# FOSFENO :: instalador para Raspberry Pi OS Bookworm (Raspberry Pi 4 y 5)
#
# Uso: bash install.sh # instala todo (incluido projectM)
# Uso: bash install.sh # Raspberry Pi: instala todo
# bash install.sh --laptop # portatil Linux (Debian/Ubuntu/Mint)
# bash install.sh --no-projectm # omite la compilacion de projectM
# bash install.sh --check # solo comprueba el sistema, no instala
# ===========================================================================
@ -13,10 +14,12 @@ source "$DIR/scripts/lib.sh"
MODE="install"
SKIP_PM="no"
LAPTOP="no"
for arg in "$@"; do
case "$arg" in
--no-projectm) SKIP_PM="yes" ;;
--check) MODE="check" ;;
--laptop) LAPTOP="yes" ;;
*) echo "Opcion desconocida: $arg"; exit 1 ;;
esac
done
@ -34,32 +37,34 @@ printf '%s\n' "===================================================$C_RST"
# ---------------------------------------------------------------------------
# 1. Comprobacion del hardware y del sistema operativo
# ---------------------------------------------------------------------------
log_step "[1/9] Comprobando hardware y sistema operativo"
MODELO="$(pi_model)"
log_info "Modelo detectado: $MODELO"
case "$MODELO" in
*"Raspberry Pi 5"*) log_ok "Raspberry Pi 5 (soportada)" ;;
*"Raspberry Pi 4"*) log_ok "Raspberry Pi 4 (soportada)" ;;
*"Raspberry Pi"*) warn "Raspberry Pi distinta de 4/5: puede funcionar pero sin garantias" ;;
*) warn "No parece una Raspberry Pi: continuando bajo tu responsabilidad" ;;
esac
log_step "[1/9] Comprobando el sistema"
if [ -r /etc/os-release ]; then
. /etc/os-release
log_info "Sistema: ${PRETTY_NAME:-desconocido}"
if [ "${VERSION_CODENAME:-}" = "bookworm" ]; then
log_ok "Raspberry Pi OS Bookworm"
else
fi
if [ "$LAPTOP" = "yes" ]; then
log_ok "Modo portatil (Linux de escritorio)"
if ! need_cmd apt-get; then
log_fail "El modo --laptop usa apt (Debian, Ubuntu o Mint)."
log_fail "Tu sistema no tiene apt; este instalador no sirve aqui."
exit 1
fi
else
MODELO="$(pi_model)"
log_info "Modelo detectado: $MODELO"
case "$MODELO" in
*"Raspberry Pi 5"*) log_ok "Raspberry Pi 5 (soportada)" ;;
*"Raspberry Pi 4"*) log_ok "Raspberry Pi 4 (soportada)" ;;
*"Raspberry Pi"*) warn "Raspberry Pi distinta de 4/5: puede funcionar pero sin garantias" ;;
*) warn "No parece una Raspberry Pi. Si es un portatil, usa: bash install.sh --laptop" ;;
esac
if [ "${VERSION_CODENAME:-}" != "bookworm" ]; then
warn "Se recomienda Raspberry Pi OS Bookworm (detectado: ${VERSION_CODENAME:-?})"
fi
fi
ARCH="$(uname -m)"
log_info "Arquitectura: $ARCH"
[ "$ARCH" = "aarch64" ] && log_ok "Sistema de 64 bits" \
|| warn "Se recomienda Raspberry Pi OS de 64 bits para mejor rendimiento"
# ---------------------------------------------------------------------------
# Modo --check: solo verifica lo que ya esta instalado y termina
# ---------------------------------------------------------------------------
@ -222,43 +227,55 @@ log_info "Copia tus clips .mp4 en: $DIR/data/videos/"
# ---------------------------------------------------------------------------
# 8. Arranque automatico y permisos
# ---------------------------------------------------------------------------
log_step "[8/9] Configurando arranque automatico y permisos"
chmod +x "$DIR/scripts/"*.sh "$DIR/install.sh" "$DIR/uninstall.sh"
mkdir -p "$HOME/.config/autostart"
if sed "s#__DIR__#$DIR#g" "$DIR/scripts/fosfeno-autostart.desktop" \
> "$HOME/.config/autostart/fosfeno.desktop"; then
log_ok "Arranque automatico configurado (~/.config/autostart/fosfeno.desktop)"
fi
log_step "[8/9] Arranque automatico y permisos"
chmod +x "$DIR/scripts/"*.sh "$DIR/install.sh" "$DIR/uninstall.sh" 2>/dev/null
[ -f "$DIR/fosfeno" ] && chmod +x "$DIR/fosfeno"
# Nombre de red fijo: deja el panel accesible en http://<hostname>.local/
HOSTNAME_WANT="$(python3 -c "import json;print(json.load(open('$DIR/config.json')).get('network',{}).get('hostname','fosfeno'))" 2>/dev/null || echo fosfeno)"
if [ "$(hostname)" != "$HOSTNAME_WANT" ]; then
sudo hostnamectl set-hostname "$HOSTNAME_WANT" 2>/dev/null || true
if grep -q "^127.0.1.1" /etc/hosts; then
sudo sed -i "s/^127.0.1.1.*/127.0.1.1\t$HOSTNAME_WANT/" /etc/hosts
else
echo -e "127.0.1.1\t$HOSTNAME_WANT" | sudo tee -a /etc/hosts >/dev/null
HOSTNAME_WANT="$(hostname)"
if [ "$LAPTOP" = "yes" ]; then
log_info "Modo portatil: sin arranque automatico ni cambios en el sistema."
log_info "FOSFENO se lanza a mano con ./fosfeno cuando quieras usarlo."
else
mkdir -p "$HOME/.config/autostart"
if sed "s#__DIR__#$DIR#g" "$DIR/scripts/fosfeno-autostart.desktop" \
> "$HOME/.config/autostart/fosfeno.desktop"; then
log_ok "Arranque automatico configurado (~/.config/autostart/fosfeno.desktop)"
fi
log_ok "Nombre de red puesto a '$HOSTNAME_WANT' (panel en http://$HOSTNAME_WANT.local/)"
else
log_ok "Nombre de red: $HOSTNAME_WANT"
fi
if echo "$USER ALL=(ALL) NOPASSWD: /sbin/reboot, /sbin/poweroff" \
| sudo tee /etc/sudoers.d/fosfeno >/dev/null \
&& sudo chmod 440 /etc/sudoers.d/fosfeno; then
log_ok "Permisos de reinicio/apagado configurados"
# Nombre de red fijo: deja el panel accesible en http://<hostname>.local/
HOSTNAME_WANT="$(python3 -c "import json;print(json.load(open('$DIR/config.json')).get('network',{}).get('hostname','fosfeno'))" 2>/dev/null || echo fosfeno)"
if [ "$(hostname)" != "$HOSTNAME_WANT" ]; then
sudo hostnamectl set-hostname "$HOSTNAME_WANT" 2>/dev/null || true
if grep -q "^127.0.1.1" /etc/hosts; then
sudo sed -i "s/^127.0.1.1.*/127.0.1.1\t$HOSTNAME_WANT/" /etc/hosts
else
echo -e "127.0.1.1\t$HOSTNAME_WANT" | sudo tee -a /etc/hosts >/dev/null
fi
log_ok "Nombre de red puesto a '$HOSTNAME_WANT' (panel en http://$HOSTNAME_WANT.local/)"
else
log_ok "Nombre de red: $HOSTNAME_WANT"
fi
if echo "$USER ALL=(ALL) NOPASSWD: /sbin/reboot, /sbin/poweroff" \
| sudo tee /etc/sudoers.d/fosfeno >/dev/null \
&& sudo chmod 440 /etc/sudoers.d/fosfeno; then
log_ok "Permisos de reinicio/apagado configurados"
fi
fi
# ---------------------------------------------------------------------------
# 9. Permiso para el puerto 80
# 9. Acceso de red
# ---------------------------------------------------------------------------
log_step "[9/9] Permitiendo a Python escuchar en el puerto 80"
PYBIN="$(readlink -f "$DIR/.venv/bin/python3")"
if sudo setcap 'cap_net_bind_service=+ep' "$PYBIN" 2>/dev/null; then
log_ok "Puerto 80 habilitado"
log_step "[9/9] Acceso de red"
if [ "$LAPTOP" = "yes" ]; then
log_info "Modo portatil: el panel usara el puerto 8080, no hace falta nada mas."
else
warn "no se pudo habilitar el puerto 80; cambia 'server.port' a 8080 en config.json"
PYBIN="$(readlink -f "$DIR/.venv/bin/python3")"
if sudo setcap 'cap_net_bind_service=+ep' "$PYBIN" 2>/dev/null; then
log_ok "Puerto 80 habilitado"
else
warn "no se pudo habilitar el puerto 80; cambia 'server.port' a 8080 en config.json"
fi
fi
# ---------------------------------------------------------------------------
@ -271,6 +288,22 @@ else
log_warn "FOSFENO instalado con $FOSFENO_WARNINGS aviso(s) (revisa arriba)."
fi
printf '%s\n' "===================================================$C_RST"
if [ "$LAPTOP" = "yes" ]; then
cat <<EOF
FOSFENO instalado en modo portatil.
Para arrancarlo, desde esta carpeta:
./fosfeno
Se abrira el panel de control en el navegador y una ventana aparte con
las visuales (arrastrala al proyector y pulsa F11 para pantalla completa).
Para cerrarlo todo, pulsa Ctrl+C en la terminal.
Para comprobar el sistema sin reinstalar:
bash install.sh --check
EOF
else
cat <<EOF
Siguientes pasos:
@ -288,3 +321,4 @@ cat <<EOF
Para volver a comprobar el sistema sin reinstalar:
bash install.sh --check
EOF
fi