Piztu. Gestão da sala de informática

Atenção: Embora na próxima versão do piztu o usuário de cada computador da sala de aula não precise de permissões de sudo, nesta versão é necessário que conte com elas e que seja executado sem pedir senha.

⬇ Descarregar Piztu

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

  1. Guarda o teu .yaml em playbooks/ (ex.: playbooks/instalar_gimp.yaml).
  2. Dá-lhe um nome lógico em config.yaml:
    ansible:
      playbooks:
        instalar_gimp: "instalar_gimp"
  3. Chama-o a partir da interface com o evento executar_comando (ação instalar_gimp), e o Piztu lança-o contra todo o grupo aula automaticamente.

Também o podes executar sempre à mão com ansible-playbook -i hosts playbooks/..., sem passar pela interface.

Scroll to Top