superguardado: reboot resiliente - comando reboot/servicios en bot + tunel autossh como servicio systemd + lecciones 32-35
This commit is contained in:
@@ -86,3 +86,14 @@
|
|||||||
|
|
||||||
31. **stdout de tv-api en systemd está buffered**: Los `print()` de tv_api no salen en `journalctl` hasta flush. Para ver el resultado del casting, usar un proceso limpio o logear a archivo.
|
31. **stdout de tv-api en systemd está buffered**: Los `print()` de tv_api no salen en `journalctl` hasta flush. Para ver el resultado del casting, usar un proceso limpio o logear a archivo.
|
||||||
|
|
||||||
|
### Reboot resiliente (02 agosto noche)
|
||||||
|
|
||||||
|
32. **El túnel autossh debe ser servicio systemd, no proceso manual**: El autossh corría como proceso manual y NO se reiniciaba al reboot → la Pi quedaba inaccesible desde fuera. Convertido a `/etc/systemd/system/autossh-tunel.service` (enabled). Comando real del túnel: `autossh -M 0 -N -o ServerAliveInterval=30 ... -R 2222:localhost:22 -R 8600:localhost:8600 root@VPS`.
|
||||||
|
|
||||||
|
33. **Sintaxis de opciones de autossh**: Debe ser `-o ServerAliveInterval=30` (con `=`). Con espacio (`-o ServerAliveInterval 30`) ssh falla con `no argument after keyword serveraliveinterval` y entra en bucle de restart. Cuando hay 2 túneles compitiendo da `remote port forwarding failed for listen port 2222` — limpiar TODOS los procesos (`pkill -9 -f autossh` y `pkill -9 -f "ssh.*-R"`) antes de relanzar el servicio.
|
||||||
|
|
||||||
|
34. **Comandos Telegram para operar la Pi**: Añadidos `/servicios` (estado pi-bot, tv-api, autossh-tunel + túnel) y `/reboot` → `/confirmar-reboot` (reinicia la Pi con doble confirmación desde Telegram). Probado con reboot real: tras 1 min la Pi vuelve y todos los servicios + túnel operan solos.
|
||||||
|
|
||||||
|
35. **Tras un reboot real se valida todo**: pi-bot, tv-api y autossh-tunel están `enabled` (arrancan solos). El bot conserva el offset en `bot.offset` así que no reprocesa nada. La TV, el túnel y el acceso remoto quedan operativos sin intervención manual.
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -162,8 +162,26 @@ def procesar(texto, chat_id):
|
|||||||
"<b>alarma <mensaje></b> — secuencia completa (sirena x3)\n"
|
"<b>alarma <mensaje></b> — secuencia completa (sirena x3)\n"
|
||||||
"<b>youtube <URL></b> — reproduce YouTube y apaga al terminar\n"
|
"<b>youtube <URL></b> — reproduce YouTube y apaga al terminar\n"
|
||||||
"<b>panorama</b> — fotos de las cámaras\n"
|
"<b>panorama</b> — fotos de las cámaras\n"
|
||||||
"<b>limpieza</b> — limpia procesos atascados de la Pi",
|
"<b>limpieza</b> — limpia procesos atascados de la Pi\n"
|
||||||
|
"<b>reboot</b> — reinicia la Pi (necesita confirmar con /confirmar-reboot)\n"
|
||||||
|
"<b>servicios</b> — estado de los servicios del sistema",
|
||||||
chat_id)
|
chat_id)
|
||||||
|
elif t in ("servicios", "/servicios"):
|
||||||
|
estado_svc = sh("systemctl is-active pi-bot tv-api autossh-tunel")
|
||||||
|
nombres = "pi-bot\ntv-api\nautossh-tunel"
|
||||||
|
activos = estado_svc.strip().splitlines()
|
||||||
|
lineas = []
|
||||||
|
for n, e in zip(["pi-bot", "tv-api", "autossh-tunel"], activos):
|
||||||
|
icono = "✅" if e == "active" else "❌"
|
||||||
|
lineas.append(f"{icono} {n}: {e}")
|
||||||
|
envio = "\n".join(lineas)
|
||||||
|
enviar(f"📦 Servicios:\n{envio}\n\n🔌 Túnel VPS: {'OK' if activos and activos[2]=='active' else 'caído'}", chat_id)
|
||||||
|
elif t == "reboot" or t == "/reboot":
|
||||||
|
enviar("⚠️ Para reiniciar la Pi responde <b>/confirmar-reboot</b> en 30 segundos.", chat_id)
|
||||||
|
elif t == "confirmar-reboot" or t == "/confirmar-reboot":
|
||||||
|
enviar("🔄 Reiniciando la Pi... volveré en un momento.", chat_id)
|
||||||
|
log("REBOOT solicitado")
|
||||||
|
sh("echo 'raspberry' | sudo -S reboot")
|
||||||
|
|
||||||
|
|
||||||
def monitor_temperatura():
|
def monitor_temperatura():
|
||||||
|
|||||||
Reference in New Issue
Block a user