commit 515b244e357f76df3adcc5bac44186f926fcc38d
parent e90c55a82bafe6d3ec8a5e5afd8b71c911732ed7
Author: Pablo Murad <pablo@pablomurad.com>
Date: Sat, 21 Mar 2026 20:37:02 -0300
fixed a lot of stuff
Diffstat:
2 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/tools/docs/USER_EXPERIENCE.md b/tools/docs/USER_EXPERIENCE.md
@@ -8,7 +8,7 @@ Visão para **quem entra no servidor** pela primeira vez (e para quem documenta
- logótipo **RUNV** (mesmo desenho UTF-8 da landing) **só nesse bloco** em verde;
- tagline `.club — um computador para compartilhar` (sem estatísticas no MOTD; o comando **`runv-status`** existe mas **não** é listado aqui e só o utilizador **`pmurad-admin`** pode executá-lo);
- **Comandos úteis** em lista, com nome a verde e descrição a cinza (ANSI), alinhada ao texto do `runv-help`;
- - grelha **3×3** com os **primeiros campos** das **9** sessões mais recentes de **`last`** (wtmp; ignora linhas `reboot` / `wtmp`). Em **Debian 13+**, o binário **`last`** vem do pacote **`wtmpdb`** (o `tools.py` instala-o). O fragmento tenta **`/usr/bin/last`** se o PATH de `update-motd.d` não incluir `last`. Se aparecer *sem registos recentes em wtmp*, o ficheiro de logins ainda não tem entradas (ex.: sem logins SSH registados).
+ - secção **Últimos usuários online**: grelha **3×3** com até **9 nomes únicos** (fonte: **`last`** / wtmp; ordem = atividade recente; cada utilizador só aparece **uma** vez; ignora linhas `reboot` / `wtmp`). Em **Debian 13+**, o binário **`last`** vem do pacote **`wtmpdb`** (o `tools.py` instala-o). O fragmento tenta **`/usr/bin/last`** se o PATH de `update-motd.d` não incluir `last`. Se aparecer *sem registos recentes em wtmp*, o ficheiro de logins ainda não tem entradas (ex.: sem logins SSH registados).
- linha final: **digite `runv-help` para começar**.
2. **Prompt da shell** — Depende do shell padrão (geralmente Bash no Debian). O que o usuário **herda** da home vem do **`/etc/skel`** no momento em que a conta foi criada.
diff --git a/tools/motd/60-runv b/tools/motd/60-runv
@@ -27,7 +27,8 @@ print_runv_art() {
RUNV_ART
}
-# Últimas 9 sessões em last(1) → grelha 3×3 (primeiro campo = utilizador)
+# MOTD: "Últimos usuários online" — até 9 nomes únicos (last(1)) → grelha 3×3
+# Cada nome aparece só uma vez: ordem = mais recente primeiro (primeira ocorrência em last).
# update-motd.d costuma ter PATH mínimo: tentar /usr/bin/last e /bin/last.
print_last_sessions_3x3() {
LAST_CMD=$(command -v last 2>/dev/null) || LAST_CMD=
@@ -39,11 +40,18 @@ print_last_sessions_3x3() {
fi
tf=$(mktemp -t runvmotd.XXXXXX 2>/dev/null) || tf=/tmp/runvmotd.$$
trap 'rm -f "$tf"' EXIT HUP INT
- # Ignora reboot, wtmp e linhas vazias; até 9 utilizadores (sessões recentes)
- "$LAST_CMD" -n 200 2>/dev/null | awk '
+ # Ignora reboot, wtmp e linhas vazias; até 9 nomes distintos (mais recentes primeiro)
+ "$LAST_CMD" -n 500 2>/dev/null | awk '
/^reboot/ || /^wtmp/ || /^$/ { next }
NF < 1 { next }
- { print $1; if (++n >= 9) exit }
+ {
+ u = $1
+ if (!(u in seen)) {
+ seen[u] = 1
+ print u
+ if (++n >= 9) exit
+ }
+ }
' > "$tf" || true
if ! [ -s "$tf" ]; then
@@ -53,7 +61,7 @@ print_last_sessions_3x3() {
return
fi
- printf '\n%bÚltimas sessões%b %b(9 entradas recentes de last)%b\n' "${B}" "${R}" "${D}" "${R}"
+ printf '\n%bÚltimos usuários online%b %b(até 9 nomes únicos, por atividade recente)%b\n' "${B}" "${R}" "${D}" "${R}"
row=1
while [ "$row" -le 3 ]; do
read -r c1 || c1=''