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:
parent
30a09fdee6
commit
3c1c631895
7 changed files with 250 additions and 53 deletions
130
install.sh
130
install.sh
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue