
AÃnda que hai varias ferramentas para a xestión de aula, propúxenme facer unha nova que funcione con Linux Debian e distribucións derivadas. O obxectivo é ter á disposición unha pantalla desde a cal poidas acender equipos, tanto de forma individual como toda a clase, adormecelos, bloquealos…

Piztu está construÃdo sobre Python e Ansible. O motor de automatización é Ansible, que executa as accións sobre os equipos da aula a través de SSH con autenticación por clave pública: un modelo sen axente no que os clientes só precisan ter OpenSSH e sudo, mentres cada operación (acender, durmir, apagar, bloquear, enviar ou recoller prácticas) se lanza en paralelo como un playbook, con soporte de Wake-on-LAN para o acendido remoto. Sobre ese motor, todo o lado servidor está escrito en Python: a interface web apóiase en Flask e Flask-SocketIO (WebSockets en tempo real para o vúmetro de ruÃdo, o progreso dos envÃos e unha terminal SSH integrada no navegador), a aplicación de escritorio en PyQt6, e un monitor de ruÃdo autónomo captura o micrófono con arecord para emitir avisos e bloqueos automáticos. A configuración centralÃzase nun ficheiro YAML, os datos persistentes (posicións dos equipos e limiar de ruÃdo) gárdanse en SQLite, a interface é multilingüe (galego, castelán, inglés e portugués) e o instalador gráfico está feito en Go co framework Fyne.

Pasos para a instalación
O primeiro a facer é renomear os equipos da aula cun nome seguido do número de equipo, por exemplo: tux01, tux02… Isto deberás facelo editando os ficheiros /etc/hosts e /etc/hostname:


Tamén debes instalar openssh-server nos clientes, para que desde o servidor se poida acceder a eles:
$ sudo apt update $ sudo apt install openssh-server
A continuación edita o ficheiro de configuración do servizo SSH, descomentando ou cambiando estas liñas:
$ sudo nano /etc/ssh/sshd_config
Port 22 PermitRootLogin yes PubkeyAuthentication yes PasswordAuthentication yes
$ $ sudo systemctl restart ssh
E por último tamén debes asignarlle permisos de sudo ao usuario por defecto nos clientes:
$ su root # visudo
e engades:
usuario ALL=(ALL) NOPASSWD:ALL
No caso do servidor, deberemos contar con Python 3 instalado.
Utilidades do aplicativo Piztu
a. Xestión de enerxÃa
- Acender aula — acende os equipos por rede mediante Wake-on-LAN (paquetes máxicos), sen necesidade de tocalos fisicamente.
- Durmir aula — suspende os equipos para aforrar enerxÃa manténdoos listos para retomar.
- Apagar aula — apaga de forma ordenada todos os equipos (con confirmación previa para evitar erros).
Pódense aplicar a toda a aula á vez ou a un equipo concreto dende a súa tarxeta no mapa.
b. Bloqueo e control da clase
- Bloqueo — bloquea as pantallas de todos os equipos (ou dos seleccionados) para captar a atención do alumnado nun momento dado.
- Liberar — desbloquea os equipos. Inclúe verificación automática con reintentos para asegurarse de que ningún quedou bloqueado.
c. Terminal SSH
- SSH — abre unha terminal remota contra calquera equipo directamente dende a interface (integrada no navegador con xterm.js, ou na GUI de escritorio), para administración ou diagnóstico sen levantarse.
d. Control de ruÃdo
- Monitor de ruÃdo — vixÃa o micrófono da aula e calcula a media móbil dos últimos 30 s. Se supera o limiar fixado polo profesor, avisa nas pantallas dos alumnos; se o ruÃdo persiste outros 30 s, bloquea automaticamente os equipos. O limiar regúlase cun control deslizante.
e. EnvÃo e recollida de prácticas
- Enviar práctica — distribúe ficheiros aos equipos (arrastrando e soltando), a todos ou a unha selección manual.
- Modo anticópias — envÃa ficheiros distintos aos equipos pares e impares (clasificados polo número do seu nome), útil para evitar copias en exames.
- Recoller traballos — descarga por SFTP o cartafol de prácticas de cada equipo ao servidor.
- Explorador de ficheiros — consulta os traballos recollidos de cada equipo e descárgaos individualmente ou en ZIP.
- Limpar cartafol — borra o contido da carpeta de prácticas nos equipos seleccionados.
f. Mapa interactivo da aula
- Representa cada equipo como unha tarxeta cun indicador de estado (en liña/desconectado) e un badge cos ficheiros recollidos. As tarxetas arrástranse para reproducir a disposición fÃsica real da aula (gárdase automaticamente).
g. Outras
- Interface multilingüe (galego, castelán, inglés, portugués).
- Sobre Piztu — información de autorÃa, versión, contacto e licenza.
Configurar equipos e instalar programas con Ansible
Toda acción de Piztu sobre os equipos é, por debaixo, un playbook de Ansible. Iso significa que podes configurar os equipos da aula e instalar programas en todos á vez con só escribir (ou reutilizar) un playbook. Non fai falta tocar cada equipo: Ansible conéctase por SSH e fai o traballo en paralelo.
As tres pezas
1. O ficheiro hosts (inventario)
Define que equipos forman a aula. Cada liña é un equipo, agrupado baixo [aula]:
[aula] tux01.local mac=c4:34:6b:7a:a1:a8 tux02.local mac=00:23:24:9c:fa:cd ... [aula:vars] ansible_become=yes # eleva privilexios con sudo ansible_become_method=sudo ansible_python_interpreter=/usr/bin/python3
[aula]é o grupo ao que apuntan os playbooks (hosts: aula).- O
mac=úsao o Wake-on-LAN para acender. [aula:vars]aplica variables comúns a todos (aquÃ, sudo automático).
2. O cartafol playbooks/
Cada .yaml é unha acción. Xa veñen varios: acenderAula, bloqueoTotal, visualstudiocode, instalar_lamp… Para engadir unha nova capacidade, abonda con crear un playbook aquÃ.
3. O mapeo en config.yaml
Os nomes lóxicos que usa a interface resólvense a ficheiros reais en:
ansible: grupo_aula: "aula" playbooks: acender: "acenderAula" bloqueo: "bloqueoTotal" # engade aquà o teu: nome_lóxico: "nome_do_ficheiro_sen_extensión"
Como executar un playbook
Manualmente (toda a aula):
$ ansible-playbook -i hosts playbooks/visualstudiocode.yaml
Só nalgúns equipos (con --limit):
$ ansible-playbook -i hosts playbooks/visualstudiocode.yaml --limit tux01.local,tux02.local
Exemplos
Exemplo 1 — Instalar un programa simple (GIMP) en toda a aula
--- - name: Instalar GIMP en toda a aula hosts: aula become: yes tasks: - name: Instalar o paquete gimp apt: name: gimp state: present update_cache: yes
Exemplo 2 — Instalar varios paquetes á vez
--- - name: Ferramentas de programación hosts: aula become: yes tasks: - name: Instalar paquetes apt: name: - python3-pip - git - build-essential state: present update_cache: yes
Exemplo 3 — Instalar dende un repositorio externo (VS Code, xa incluÃdo)
--- - name: Instalar Visual Studio Code hosts: aula become: yes tasks: - name: Importar a chave GPG de Microsoft apt_key: url: https://packages.microsoft.com/keys/microsoft.asc state: present - name: Engadir o repositorio apt_repository: repo: "deb [arch=amd64] https://packages.microsoft.com/repos/code stable main" state: present - name: Instalar code apt: { name: code, state: present, update_cache: yes }
Exemplo 4 — Configurar os equipos (copiar un ficheiro de configuración)
--- - name: DistribuÃr un fondo de pantalla común hosts: aula become: yes tasks: - name: Copiar a imaxe ao equipo copy: src: /opt/piztu/recursos/fondo.png dest: /usr/share/backgrounds/aula.png mode: "0644"
Exemplo 5 — Cambiar unha opción do sistema (activar NumLock, xa incluÃdo)
--- - name: Activar NumLock no arranque hosts: aula become: yes tasks: - name: Instalar numlockx apt: { name: numlockx, state: present } - name: Activar NumLock command: numlockx on
Exemplo 6 — Desinstalar un programa
--- - name: Quitar xogos hosts: aula become: yes tasks: - name: Eliminar gnome-mines apt: name: gnome-mines state: absent
Integrar un playbook novo na interface de Piztu
- Garda o teu
.yamlenplaybooks/(ex.:playbooks/instalar_gimp.yaml). - Dálle un nome lóxico en
config.yaml:ansible: playbooks: instalar_gimp: "instalar_gimp"
- Chámao dende a interface co evento
executar_comando(accióninstalar_gimp), e Piztu lánzao contra todo o grupoaulaautomaticamente.
Tamén o podes executar sempre a man con
ansible-playbook -i hosts playbooks/..., sen pasar pola interface.
