sudo, nesta versão é necessário que conte com elas e que seja executado sem pedir senha.
Embora existam várias ferramentas para a gestão de sala de aula, propus-me criar uma nova que funcione com Linux Debian e distribuições derivadas. O objetivo é ter à disposição um ecrã a partir do qual possas ligar os computadores, tanto de forma individual como toda a turma, suspendê-los, bloqueá-los…

O Piztu está construído sobre Python e Ansible. O motor de automatização é o Ansible, que executa as ações sobre os computadores da sala através de SSH com autenticação por chave pública: um modelo sem agente em que os clientes só precisam de ter OpenSSH e sudo, enquanto cada operação (ligar, suspender, desligar, bloquear, enviar ou recolher trabalhos práticos) é lançada em paralelo como um playbook, com suporte de Wake-on-LAN para a ligação remota. Sobre esse motor, todo o lado servidor está escrito em Python: a interface web apoia-se em Flask e Flask-SocketIO (WebSockets em tempo real para o vúmetro de ruído, o progresso dos envios e um terminal SSH integrado no navegador), a aplicação de desktop em PyQt6, e um monitor de ruído autónomo captura o microfone com arecord para emitir avisos e bloqueios automáticos. A configuração centraliza-se num ficheiro YAML, os dados persistentes (posições dos computadores e limiar de ruído) são guardados em SQLite, a interface é multilingue (galego, castelhano, inglês e português) e o instalador gráfico está feito em Go com o framework Fyne.

Passos para a instalação
A primeira coisa a fazer é renomear os computadores da sala com um nome seguido do número do computador, por exemplo: tux01, tux02… Isto deverás fazê-lo editando os ficheiros /etc/hosts e /etc/hostname:


Também deves instalar o openssh-server nos clientes, para que a partir do servidor se possa aceder a eles:
$ sudo apt update $ sudo apt install openssh-server
De seguida, edita o ficheiro de configuração do serviço SSH, descomentando ou alterando estas linhas:
$ sudo nano /etc/ssh/sshd_config
Port 22 PermitRootLogin yes PubkeyAuthentication yes PasswordAuthentication yes
E por último também deves atribuir permissões de sudo ao utilizador por omissão nos clientes:
$ su root # visudo
e adicionas:
usuario ALL=(ALL) NOPASSWD:ALL
No caso do servidor, deveremos contar com o Python 3 instalado.
Funcionalidades da aplicação Piztu
a. Gestão de energia
- Ligar a sala — liga os computadores pela rede mediante Wake-on-LAN (pacotes mágicos), sem necessidade de lhes tocar fisicamente.
- Suspender a sala — suspende os computadores para poupar energia, mantendo-os prontos para retomar.
- Desligar a sala — desliga de forma ordenada todos os computadores (com confirmação prévia para evitar erros).
Podem aplicar-se a toda a sala de uma vez ou a um computador concreto a partir do seu cartão no mapa.
b. Bloqueio e controlo da turma
- Bloqueio — bloqueia os ecrãs de todos os computadores (ou dos selecionados) para captar a atenção dos alunos num dado momento.
- Libertar — desbloqueia os computadores. Inclui verificação automática com novas tentativas para garantir que nenhum ficou bloqueado.
c. Terminal SSH
- SSH — abre um terminal remoto para qualquer computador diretamente a partir da interface (integrado no navegador com xterm.js, ou na GUI de desktop), para administração ou diagnóstico sem sair do lugar.
d. Controlo de ruído
- Monitor de ruído — vigia o microfone da sala e calcula a média móvel dos últimos 30 s. Se ultrapassar o limiar fixado pelo professor, avisa nos ecrãs dos alunos; se o ruído persistir mais 30 s, bloqueia automaticamente os computadores. O limiar regula-se com um controlo deslizante.
e. Envio e recolha de trabalhos práticos
- Enviar trabalho — distribui ficheiros pelos computadores (arrastar e largar), a todos ou a uma seleção manual.
- Modo anticópias — envia ficheiros diferentes aos computadores pares e ímpares (classificados pelo número do seu nome), útil para evitar cópias em exames.
- Recolher trabalhos — descarrega por SFTP a pasta de trabalhos de cada computador para o servidor.
- Explorador de ficheiros — consulta os trabalhos recolhidos de cada computador e descarrega-os individualmente ou em ZIP.
- Limpar pasta — apaga o conteúdo da pasta de trabalhos nos computadores selecionados.
f. Mapa interativo da sala
- Representa cada computador como um cartão com um indicador de estado (online/desligado) e um badge com os ficheiros recolhidos. Os cartões arrastam-se para reproduzir a disposição física real da sala (guarda-se automaticamente).
g. Outras
- Interface multilingue (galego, castelhano, inglês, português).
- Sobre o Piztu — informação de autoria, versão, contacto e licença.
Configurar computadores e instalar programas com Ansible
Toda a ação do Piztu sobre os computadores é, por baixo, um playbook do Ansible. Isso significa que podes configurar os computadores da sala e instalar programas em todos de uma vez apenas escrevendo (ou reutilizando) um playbook. Não é preciso tocar em cada computador: o Ansible liga-se por SSH e faz o trabalho em paralelo.
As três peças
1. O ficheiro hosts (inventário)
Define que computadores formam a sala. Cada linha é um computador, agrupado sob [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 privilégios com sudo ansible_become_method=sudo ansible_python_interpreter=/usr/bin/python3
[aula]é o grupo a que apontam os playbooks (hosts: aula).- O
mac=é usado pelo Wake-on-LAN para ligar. [aula:vars]aplica variáveis comuns a todos (aqui, sudo automático).
2. A pasta playbooks/
Cada .yaml é uma ação. Já vêm vários: acenderAula, bloqueoTotal, visualstudiocode, instalar_lamp… Para adicionar uma nova capacidade, basta criar um playbook aqui.
3. O mapeamento em config.yaml
Os nomes lógicos que a interface usa resolvem-se em ficheiros reais em:
ansible: grupo_aula: "aula" playbooks: acender: "acenderAula" bloqueo: "bloqueoTotal" # adiciona aqui o teu: nome_lógico: "nome_do_ficheiro_sem_extensão"
Como executar um playbook
Manualmente (toda a sala):
$ ansible-playbook -i hosts playbooks/visualstudiocode.yaml
Só nalguns computadores (com --limit):
$ ansible-playbook -i hosts playbooks/visualstudiocode.yaml --limit tux01.local,tux02.local
Exemplos
Exemplo 1 — Instalar um programa simples (GIMP) em toda a sala
--- - name: Instalar o GIMP em toda a sala hosts: aula become: yes tasks: - name: Instalar o pacote gimp apt: name: gimp state: present update_cache: yes
Exemplo 2 — Instalar vários pacotes de uma vez
--- - name: Ferramentas de programação hosts: aula become: yes tasks: - name: Instalar pacotes apt: name: - python3-pip - git - build-essential state: present update_cache: yes
Exemplo 3 — Instalar a partir de um repositório externo (VS Code, já incluído)
--- - name: Instalar o Visual Studio Code hosts: aula become: yes tasks: - name: Importar a chave GPG da Microsoft apt_key: url: https://packages.microsoft.com/keys/microsoft.asc state: present - name: Adicionar o repositório apt_repository: repo: "deb [arch=amd64] https://packages.microsoft.com/repos/code stable main" state: present - name: Instalar o code apt: { name: code, state: present, update_cache: yes }
Exemplo 4 — Configurar os computadores (copiar um ficheiro de configuração)
--- - name: Distribuir um fundo de ecrã comum hosts: aula become: yes tasks: - name: Copiar a imagem para o computador copy: src: /opt/piztu/recursos/fondo.png dest: /usr/share/backgrounds/aula.png mode: "0644"
Exemplo 5 — Alterar uma opção do sistema (ativar o NumLock, já incluído)
--- - name: Ativar o NumLock no arranque hosts: aula become: yes tasks: - name: Instalar o numlockx apt: { name: numlockx, state: present } - name: Ativar o NumLock command: numlockx on
Exemplo 6 — Desinstalar um programa
--- - name: Remover jogos hosts: aula become: yes tasks: - name: Eliminar o gnome-mines apt: name: gnome-mines state: absent
Integrar um playbook novo na interface do Piztu
- Guarda o teu
.yamlemplaybooks/(ex.:playbooks/instalar_gimp.yaml). - Dá-lhe um nome lógico em
config.yaml:ansible: playbooks: instalar_gimp: "instalar_gimp"
- Chama-o a partir da interface com o evento
executar_comando(açãoinstalar_gimp), e o Piztu lança-o contra todo o grupoaulaautomaticamente.
Também o podes executar sempre à mão com
ansible-playbook -i hosts playbooks/..., sem passar pela interface.
