Arquitectura Gráfica, Sesiones y Modo Kiosco

Sistema de Captura, Control PTZ y Medición en Pantalla (NA-SA Video Capture) sobre Debian 13

Debian 13 (Trixie) X11 / Xorg Single-Session LightDM + Slick Greeter Admin: XFCE 4 Operario: Openbox Kiosk

Este documento describe en detalle cómo está estructurado el sistema operativo Debian 13 para separar completamente el entorno de administración (usuario admin con escritorio completo XFCE 4) del entorno de operación en planta (usuario nasa en Modo Kiosco bloqueado sobre Openbox), cómo se construyó mediante scripts automatizados, cómo se protegen las grabaciones en /datos para que el operario no pueda borrar archivos y qué tecnologías intervienen en cada capa.

Sistema Base y Display
Debian 13 + Xorg
LightDM + Slick Greeter en español con filtro LD_PRELOAD en C y usuario nasa preseleccionado.
Sesión Administrador
admin -> XFCE 4
Escritorio completo, terminal, compilación CMake/C++, Thunar y control total (lectura/borrado) en /datos.
Sesión Operario (Kiosco)
nasa -> Openbox Kiosk
App nasa_video a pantalla completa sin bordes, auto-relanzamiento en 1 s y salida exclusiva vía F1 o Ctrl+Alt+Supr.
Resguardo de Grabaciones
/datos + Inotify Guard
Demonio nasa-datos-guard.service que pasa cada archivo cerrado a admin:nasa (0644) impidiendo borrados por nasa.
1

Arquitectura General del Sistema y Relación de Componentes

El sistema corre sobre una única sesión gráfica Xorg activa a la vez (allow-user-switching=false) para garantizar acceso exclusivo y directo al hardware de captura (Magewell PCIe), decodificación por hardware (NVIDIA NVDEC + CUDA Zero-Copy OpenGL) y bus serie (RS-485 Pelco-D). Al encender el equipo, LightDM presenta Slick Greeter y enruta a cada usuario hacia un entorno gráfico totalmente distinto según su rol:

CAPA 1: SISTEMA OPERATIVO BASE Y HARDWARE INDUSTRIAL Debian 13 (Trixie) Kernel Linux x86_64 + systemd + Xorg Server (Sin DPMS / Sin Suspensión) GPU NVIDIA CUDA + NVDEC Magewell SDK libMWCapture.so RS-485 Serial dialout / PTZ GESTOR DE SESIÓN: LightDM + Slick Greeter Personalizado • Preselección automática: nasa-greeter-setup fija last-user=nasa • Sesión única: allow-user-switching=false • Wrapper LD_PRELOAD: /usr/local/lib/slick-greeter-filter-a11y.so (Español + Oculta High Contrast/Screen Reader) • Asignación fija de sesión vía ~/.dmrc + /var/lib/AccountsService/users/{admin,nasa} Login: admin Login: nasa SESIÓN ADMINISTRADOR: Usuario "admin" (XFCE 4) Entorno: XFCE 4 Desktop (Session=xfce) Gestor xfwm4 (vblank_mode=xpresent) + Panel XFCE + Terminal Desarrollo y Despliegue (/home/admin/repos/nasa_video) Compilación CMake + deploy_kiosk.sh + prepare_kiosk_test.sh Gestión de Archivos (Thunar + Permisos Root/Admin) Dueño de /datos (Lectura, Escritura, Renombrado y Borrado total) SESIÓN OPERARIO: Usuario "nasa" (Modo Kiosco) Gestor: Openbox Bloqueado (/etc/xdg/nasa-video-kiosk/rc.xml) 1 escritorio, sin bordes, sin menú contextual, sin terminal ni explorador Lanzador Watchdog: /usr/local/bin/nasa-video-kiosk-session Ejecuta nasa_video con NASA_KIOSK_MODE=1 y auto-relanza en 1 s si cae Control de Salida: Tecla F1 (Menú Qt) / Ctrl+Alt+Supr (Panel GTK3) Únicas acciones fuera de la app: Cerrar sesión, Reiniciar y Apagar (Polkit) PUNTO DE ENCUENTRO: PARTICIÓN /datos/NA-SA_Video + SERVICIO GUARDIÁN (nasa-datos-guard.service) admin (Dueño admin:nasa): Lectura, Escritura y Borrado Total nasa (Grupo nasa): Graba Videos y Mediciones, Reproduce, NO PUEDE BORRAR Directorios 3775 (setgid + sticky bit) | Archivos cerrados pasan por inotify (IN_CLOSE_WRITE) a admin:nasa (0644)
Figura 1: Arquitectura general del sistema Debian 13 mostrando la bifurcación en LightDM hacia XFCE (admin) y Openbox Kiosk (nasa), y su convergencia controlada en la partición /datos.
2

Las Dos Sesiones: admin (Administrador) vs nasa (Operario)

Usuario: admin
Escritorio XFCE 4 Completo
  • Propósito: Administración del sistema, compilación y actualización del software, diagnóstico de hardware y gestión/depuración de grabaciones.
  • Sesión Fijada: Session=xfce en ~admin/.dmrc y en /var/lib/AccountsService/users/admin.
  • Entorno de Escritorio: XFCE 4 completo con gestor de ventanas xfwm4 (ajustado con vblank_mode=xpresent para evitar pantalla negra en NVIDIA).
  • Herramientas Disponibles: Terminal completa, compilador GCC/CMake, navegador de archivos Thunar con marcadores directos a /datos y /datos/NA-SA_Video.
  • Privilegios sobre /datos: Es el propietario (admin:nasa) de todas las carpetas y archivos. Puede leer, copiar, mover, renombrar y eliminar cualquier grabación o captura.
  • Flujo de Despliegue: Desde /home/admin/repos/nasa_video compila los cambios y los publica hacia el kiosco ejecutando deploy_kiosk.sh.
Usuario: nasa
Modo Kiosco (Openbox)
  • Propósito: Operación diaria en planta por parte de los operarios de Soldadura, Reparación y END sin acceso al sistema operativo subyacente.
  • Sesión Fijada: Session=nasa-video-kiosk en ~nasa/.dmrc y en /var/lib/AccountsService/users/nasa (con ícono .face de VENG).
  • Entorno Gráfico: Openbox dedicado sin paneles de escritorio, sin menú de aplicaciones de Debian, sin explorador de archivos y con un único escritorio virtual.
  • Comportamiento de nasa_video: Se inicia en pantalla completa sin bordes (NASA_KIOSK_MODE=1), oculta Archivo -> Salir y desactiva F11, Esc y Alt+F4.
  • Privilegios sobre /datos: Puede grabar nuevos videos, guardar capturas de medición en pantalla, crear subcarpetas y reproducir videos, pero no puede borrar ni sobreescribir archivos existentes.
  • Salida Controlada: Al presionar F1 (o Ctrl+Alt+Supr) accede únicamente a Cerrar sesión, Reiniciar o Apagar con confirmación.

Tabla Comparativa Técnica entre Sesiones

Característica / Parámetro Sesión admin (Administrador) Sesión nasa (Operario Kiosco)
Archivo de Sesión X11 /usr/share/xsessions/xfce.desktop /usr/share/xsessions/nasa-video-kiosk.desktop
Gestor de Ventanas (WM) xfwm4 (XFCE Window Manager) openbox con /etc/xdg/nasa-video-kiosk/rc.xml
Modo de Ventana de nasa_video Ventana normal redimensionable (1280x720) + F11 libre Pantalla completa forzada (showFullScreen() y <fullscreen>yes</fullscreen>)
Ejecutable Utilizado /home/admin/repos/nasa_video/build/nasa_video ~nasa/Applications/nasa_video/nasa_video (o .AppImage)
Supervisión de Proceso (Watchdog) No (ejecución manual bajo demanda) Sí: /usr/local/bin/nasa-video-kiosk-session (relanza en 1 s)
Permisos en /datos/NA-SA_Video Dueño admin: Lectura, Escritura, Modificación y Borrado Grupo nasa: Creación de nuevos archivos y lectura. Borrado bloqueado
Acceso a Terminal / Sistema Total (bash, sudo, apt, systemctl) Bloqueado (sin atajos a terminal, ni navegador, ni gestor de archivos)
Control de Energía (Apagar / Reiniciar) Menú de salida de XFCE / sudo systemctl Menú F1 (Qt) o Ctrl+Alt+Supr (GTK3) autorizado vía Polkit
3

Cómo se Generó el Modo Kiosco (Componentes y Construcción)

El modo kiosco no depende de extensiones frágiles de navegador ni de bloquear un escritorio pesado, sino que se construyó combinando cinco piezas de ingeniería a nivel de sistema e interfaz orquestadas íntegramente por el script prepare_kiosk_test.sh y el código C++ de MainWindow.cpp:

Componente Generado Ruta en el Sistema Qué hace exactamente y cómo funciona
1. Definición de Sesión XSession /usr/share/xsessions/nasa-video-kiosk.desktop Registra la sesión NASA Video Kiosk en LightDM. Ejecuta openbox --sm-disable --config-file /etc/xdg/nasa-video-kiosk/rc.xml --startup /usr/local/bin/nasa-video-kiosk-session.
2. Reglas de Ventanas y Teclado Openbox /etc/xdg/nasa-video-kiosk/rc.xml
/etc/xdg/nasa-video-kiosk/menu.xml
Fija 1 solo escritorio, márgenes 0, elimina el menú raíz de clic derecho, habilita únicamente Alt+Tab (para alternar con el Panel Virtual de controlador o el Reproductor) y Ctrl+Alt+Supr. Fuerza <decor>no</decor> y <fullscreen>yes</fullscreen> en NA-SA Video Capture*, y coloca en capa superior (<layer>above</layer>) los diálogos secundarios.
3. Script Lanzador y Watchdog /usr/local/bin/nasa-video-kiosk-session Exporta NASA_KIOSK_MODE=1, desactiva DPMS/salvapantallas con xset, pinta el fondo X11 en azul oscuro (#051a30) y ejecuta un bucle infinito que inicia el binario o AppImage en ~nasa/Applications/. Si el proceso termina y no existe el archivo bandera nasa-kiosk-stopping-<uid>, lo vuelve a lanzar en 1 segundo.
4. Adaptación Nativa en la App Qt6 src/ui/MainWindow.cpp
src/main.cpp
Detecta NASA_KIOSK_MODE=1 o USER=nasa. Abre la ventana en showFullScreen(), ignora closeEvent (bloquea Alt+F4), desactiva F11 y Esc, oculta Archivo -> Salir y lo reemplaza por Cerrar sesión..., Reiniciar... y Apagar.... Además, captura la tecla F1 (y XF86HomePage) para desplegar instantáneamente el menú Sistema.
5. Panel de Sesión GTK3 / XFCE UI /usr/local/bin/nasa-video-kiosk-panel Script en Python 3 con PyGObject (GTK 3 + GdkX11) y libxfce4ui-2. Despliega un menú en la esquina superior derecha y cuadros de diálogo nativos de XFCE con cuenta regresiva de 30 segundos para Reiniciar, Apagar o Cerrar sesión cuando se invoca con Ctrl+Alt+Supr.
6. Regla Polkit de Energía /etc/polkit-1/rules.d/60-nasa-kiosk-power.rules Autoriza explícitamente al usuario sin privilegios nasa a ejecutar las acciones D-Bus org.freedesktop.login1.power-off y org.freedesktop.login1.reboot sin pedir contraseña de administrador.
7. Filtro C para Slick Greeter /usr/local/lib/slick-greeter-filter-a11y.so
/usr/sbin/slick-greeter
Generado por deploy_filter_a11y.sh. Usa dpkg-divert y LD_PRELOAD para interceptar funciones GTK en la pantalla de login, forzando el idioma español (traduce Quit... a Salir...) y ocultando del menú de accesibilidad el Lector de pantalla y Contraste alto, dejando solo el Teclado en pantalla.
8. Bloqueo de Suspensión y Blanking /etc/X11/xorg.conf.d/10-nasa-no-blanking.conf
/etc/systemd/sleep.conf.d/nasa-no-sleep.conf
/etc/systemd/logind.conf.d/nasa-no-idle.conf
Desactiva por completo el apagado de monitor (DPMS), el protector de pantalla, light-locker y los estados de suspensión/hibernación tanto en Xorg como en systemd y xfce4-power-manager.
4

Gráfico: Ciclo de Vida del Kiosco, Watchdog y Salida con F1 / Ctrl+Alt+Supr

Uno de los puntos clave del diseño es cómo distinguir entre un cierre inesperado (que debe recuperarse automáticamente en 1 segundo sin intervención del operario) y una salida autorizada (Cerrar sesión, Reiniciar o Apagar). Esto se resuelve mediante un archivo bandera en memoria (/run/user/<uid>/nasa-kiosk-stopping-<uid>) que tanto la ventana principal Qt6 como el panel GTK3 escriben justo antes de ordenar el cierre:

1. Login "nasa" openbox --sm-disable Carga rc.xml y lanza nasa-video-kiosk-session 2. Bucle Watchdog export NASA_KIOSK_MODE=1 xset s off s noblank -dpms while [ ! -e "$STOP_FLAG" ] Lanza Binario o AppImage 3. App nasa_video Activa • Pantalla Completa sin bordes • Captura, PTZ, Grabación y Medición • Diálogos hijos en layer "above" Alt+F4 / F11 / Esc bloqueados ¿Cierre inesperado? (Sin STOP_FLAG) sleep 1 -> Auto-relanza en 1 seg 4. Acción de Salida Tecla F1 (Menú Qt) o bien Ctrl+Alt+Supr (GTK3) Diálogo de Confirmación 5. Señalización Limpia (STOP_FLAG) Crea /run/user/UID/nasa-kiosk-stopping-UID • Cerrar sesión: openbox --exit + loginctl • Reiniciar: systemctl reboot -i (vía Polkit) • Apagar: systemctl poweroff -i (vía Polkit) 6. Retorno Inmediato a LightDM El bucle Watchdog detecta STOP_FLAG, finaliza Openbox sin timeouts y vuelve a Slick Greeter (o apaga/reinicia el equipo)
Figura 2: Flujo del supervisor (Watchdog) diferenciando un cierre accidental (auto-relanzamiento en 1 s) de una acción de salida confirmada por el operario.
5

Gráfico: Relación entre nasa y admin en /datos (Protección Anti-Borrado)

Un requerimiento crítico del sistema es que el usuario nasa pueda grabar nuevos videos (.mp4), guardar imágenes de mediciones (.png) y crear carpetas dentro de /datos/NA-SA_Video/<Perfil>, pero que bajo ninguna circunstancia pueda borrar ni sobreescribir archivos ya generados (ni siquiera desde el cuadro de diálogo de selección de archivos de Qt). Al mismo tiempo, el usuario admin debe tener permisos totales desde XFCE.

¿Cómo se resolvió técnicamente? Combinando permisos UNIX avanzados en los directorios (modo 3775 = setgid 2000 + sticky bit 1000 con dueño admin:nasa) junto con el demonio en tiempo real /usr/local/bin/nasa-datos-guard (ejecutado por systemd como root), el cual escucha eventos inotify del kernel Linux.
1. Grabación en Curso (nasa) Directorio padre tiene modo 3775 drwxrwsr-t (admin:nasa) nasa tiene permiso de escritura grupal, crea el archivo .mp4 / .png y escribe 2. Cierre del Archivo (Kernel) Al detener la grabación o guardar la captura, el descriptor se cierra y Linux emite IN_CLOSE_WRITE (o IN_MOVED_TO / IN_CREATE) 3. nasa-datos-guard.service Demonio Python3 + ctypes inotify aplica instantáneamente: chown admin:nasa archivo chmod 0644 (-rw-r--r--) 4. Archivo Blindado Dueño: admin:nasa Modo: 0644 Sticky Bit (+t) en carpeta impide borrar a no-dueños Efecto en Sesión "nasa" (Operario) • Puede reproducir todos los videos desde el Reproductor integrado. • Puede seguir creando carpetas y nuevas grabaciones sin límite. • PROHIBIDO borrar, renombrar o pisar archivos cerrados (EACCES/EPERM). Efecto en Sesión "admin" (XFCE / Thunar) • Es el propietario directo (admin) de las carpetas (3775) y archivos (0644). • Ve la partición "Datos" y "Grabaciones NASA" en el panel lateral de Thunar. • Permiso total para organizar, exportar a USB o eliminar grabaciones antiguas.
Figura 3: Mecanismo de protección automática "Write-Only / No-Delete" sobre /datos mediante el servicio systemd nasa-datos-guard.
6

Stack de Tecnologías Utilizadas en el Proyecto

Sistema Operativo & Display

Debian 13 (Trixie) + X11 / Xorg

Base Linux estable de 64 bits ejecutando servidor gráfico Xorg en modo de sesión única (allow-user-switching=false) con flags BlankTime 0 y DPMS false.

Gestor de Inicio de Sesión

LightDM + Slick Greeter + C Hook

Pantalla de login personalizada con imagen de fondo institucional, script de preselección de usuario (nasa) y biblioteca en C (slick-greeter-filter-a11y.so) inyectada vía LD_PRELOAD.

Escritorio Administrador

XFCE 4 + Thunar + xfconf

Entorno de escritorio ligero y completo para la cuenta admin, configurado con vblank_mode=xpresent en xfwm4 y montaje visible de /datos vía x-gvfs-show.

Gestor de Ventanas Kiosco

Openbox 3.4 (Modo Aislado)

Gestor de ventanas minimalista para la cuenta nasa, configurado mediante /etc/xdg/nasa-video-kiosk/rc.xml sin bordes de ventana ni menús de sistema.

Aplicación Principal

C++17 + Qt 6 + CMake

Interfaz gráfica nativa (Qt6::Widgets, Qt6::OpenGLWidgets, Qt6::Multimedia, Qt6::SerialPort) con traducción oficial al español (qtbase_es.qm) y estilos styles.qss.

Video & Aceleración GPU

Magewell SDK + FFmpeg NVDEC + CUDA

Captura industrial de baja latencia con libMWCapture.so, decodificación de video por hardware NVIDIA (NVDEC) e interoperabilidad Zero-Copy CUDA-OpenGL.

Visión Artificial & Control

OpenCV + RS-485 (Pelco-D / PTZ)

Módulo de calibración con patrón damero y medición geométrica en pantalla sobre fotogramas en vivo, más panel virtual de controlador serie RS-485.

Servicios de Kiosco & Seguridad

Python 3 + PyGObject (GTK3) + Inotify + Polkit

Panel de salida con diálogos nativos libxfce4ui-2, demonio guardián de archivos con inotify sobre libc.so.6 y reglas polkit-1 para apagado/reinicio sin root.

7

Scripts de Generación, Despliegue y Diagnóstico

1. Compilar y Desplegar Cambios al Modo Kiosco (deploy_kiosk.sh)

Desde la sesión admin, este comando compila el proyecto en C++ y actualiza automáticamente el binario, las librerías, las reglas de Openbox, los permisos de /datos y la sesión del usuario nasa:

bash - Compilación y despliegue directo al kiosco
/home/admin/repos/nasa_video/deploy_kiosk.sh

2. Verificar el Estado Integral del Kiosco (prepare_kiosk_test.sh --check)

Permite comprobar en cualquier momento la cuenta nasa, qué binario o AppImage está activo, el estado de Openbox, Slick Greeter, el servicio guardián nasa-datos-guard.service y las últimas líneas del log ~nasa/.local/state/nasa-video/kiosk.log:

bash - Diagnóstico de configuración
sudo /home/admin/repos/nasa_video/prepare_kiosk_test.sh --check

3. Configurar o Reinstalar la Sesión Kiosco Manualmente

El script maestro admite instalar tanto el binario compilado actual como un paquete autónomo .AppImage (generado con build_appimage.sh), además de configurar Slick Greeter y su filtro de accesibilidad en español:

bash - Aprovisionamiento completo del kiosco y greeter
# Instalar el binario compilado y configurar toda la sesión kiosco para nasa
sudo /home/admin/repos/nasa_video/prepare_kiosk_test.sh --setup /home/admin/repos/nasa_video/build/nasa_video

# Instalar y configurar Slick Greeter en LightDM con fondo corporativo
sudo /home/admin/repos/nasa_video/prepare_kiosk_test.sh --install-greeter

# Compilar e inyectar el filtro de idioma español y accesibilidad para Slick Greeter
/home/admin/repos/nasa_video/deploy_filter_a11y.sh

4. Script de Emergencia / Restauración de Sesiones (restore_greeter.sh)

Si por alguna prueba manual se alteraran las sesiones por defecto de LightDM o AccountsService, este script restaura nasa al modo kiosco (nasa-video-kiosk) y admin a su escritorio xfce:

bash - Restauración de sesiones
sudo /home/admin/repos/nasa_video/restore_greeter.sh