setup inicial do zion terminal cyberdeck de terminal para a orange pi cm4. comando zion com painel e subcomandos (status, saude, doctor, link, tailscale, ssh, modo...), motd, temas ice/amber/green, tmux e coleta de metricas. inclui install/uninstall.
jump to
@@ -0,0 +1,10 @@
+# dados locais / gerados (nao versionar) +opt/zion-terminal/logs/ +opt/zion-terminal/backups/ +opt/zion-terminal/config/ssh-favoritos.conf +opt/zion-terminal/config/tema.conf +opt/zion-terminal/config/build-info.conf +opt/zion-terminal/assets/tmux-resurrect/ +*.tmp +*.bak +*.bak.*
@@ -0,0 +1,98 @@
+# ZION TERMINAL + +Meu setup de terminal para uma Orange Pi CM4 usada como cyberdeck de +administração de infraestrutura. Não é um desktop: é um terminal dedicado a +acessar servidores por SSH, operar pela rede Tailscale, diagnosticar rede e +acompanhar os recursos da placa. Tudo em português, sem ambiente gráfico. + +Roda em Debian 12 (bookworm) na Orange Pi CM4 (RK3566), mas a maior parte é +bash puro e deve funcionar em qualquer Debian/Armbian recente. + +## Instalação + +```sh +git clone https://github.com/runawaydevil/zion-terminal.git +cd zion-terminal +./install.sh +``` + +O `install.sh` copia o projeto para `/opt/zion-terminal`, instala o comando +`zion` em `/usr/local/bin`, liga o MOTD e os aliases no shell, configura o tmux +e habilita o timer de coleta de métricas. Ele pede sudo quando precisa e pode +ser rodado de novo sem estragar nada. + +Depois abra uma sessão nova (ou `source ~/.bashrc`) e digite `zion`. + +## Comandos + +O comando central é `zion`. Sozinho abre o painel; com um subcomando executa uma +função direta. Todos aceitam `--help`. + +``` +zion painel interativo +zion status resumo rápido (CPU, RAM, disco, temperatura, rede) +zion saude saúde detalhada com estados OK/ATENÇÃO/CRÍTICO +zion doctor autoteste (POST) do sistema +zion link resumo de conectividade +zion rede diagnóstico de rede +zion tailscale estado e diagnóstico do Tailscale +zion radar latência dos peers (direto x DERP) +zion mapa topologia do tailnet +zion ssh servidores (lê ~/.ssh/config, com favoritos) +zion modo perfis: campo / manutencao / emergencia / normal +zion panico war-room em tmux +zion tmux sessão persistente +zion atualizar atualização segura (kernel fica em hold) +zion backup backup das configurações +zion qr QR de acesso para o celular +zion manual manual de campo offline +zion tema troca o tema (ice / amber / green) +zion matrix chuva digital +``` + +Aliases prontos: `zz zstatus znet ztail zssh zdoctor zlink zmodo ztemp ztmux`. + +## Estrutura + +``` +bin/zion comando principal (vai para /usr/local/bin) +opt/zion-terminal/ + bin/ subcomandos zion-* + lib/zion-ui.sh biblioteca de interface (cabeçalhos, caixas, estados) + config/ tema, prompt (bashrc-zion.sh), tmux, ssh + assets/ascii/ símbolo »Z» e a arte do logo + docs/ documentação +etc/profile.d/ MOTD e aliases no login +etc/systemd/system/ zion-collect (timer de métricas) +``` + +## Temas e personalização + +Três temas, trocáveis a quente com `zion tema ice|amber|green`. O tema vale para +o prompt, o MOTD, o painel e a barra do tmux. + +Para desligar coisas sem desinstalar: + +``` +touch ~/.zion-sem-prompt # volta ao prompt padrão do bash +touch ~/.zion-sem-motd # sem MOTD no login +touch ~/.zion-sem-tmux # sem auto-resume do tmux no console local +export ZION_NO_ANIM=1 # sem animações +export NO_COLOR=1 # sem cores +``` + +## O que não vai no repositório + +Dados locais ficam de fora (ver `.gitignore`): logs, backups, favoritos de SSH, +tema escolhido e o `tmux-resurrect` (clonado na instalação). O `~/.ssh/config` e +as chaves nunca entram aqui. + +## Desinstalação + +```sh +./uninstall.sh --dry-run # mostra o que seria removido +./uninstall.sh # remove de verdade +``` + +Restaura o MOTD, o prompt e o tmux anteriores e tira os ganchos do shell. +Preserva `~/.ssh/config`, chaves e backups.
@@ -0,0 +1,91 @@
+#!/usr/bin/env bash +# ===================================================================== +# ZION TERMINAL - Comando principal (dispatcher) +# Cyberdeck criado por Pablo Murad em 2026 +# --------------------------------------------------------------------- +# Uso: zion [subcomando] [opcoes] +# sem argumentos -> abre o painel (dashboard) +# ===================================================================== +export LC_ALL=C +ZION_DIR="/opt/zion-terminal" +BIN="$ZION_DIR/bin" +. "$BIN/zion-lib.sh" 2>/dev/null + +_ajuda() { + cat <<AJUDA +$(zc "$ZP" "ZION TERMINAL") — Cyberdeck criado por Pablo Murad em 2026 + +Uso: zion [subcomando] + + (vazio) Abre o painel interativo (dashboard) + status Resumo rapido do sistema + saude Saude: temperatura, carga, RAM, disco, servicos + rede Diagnostico de rede + tailscale Estado e diagnostico do Tailscale + ssh Menu de servidores SSH + logs Logs recentes (boot, ssh, tailscale, kernel, zion) + atualizar Atualiza o sistema com confirmacao + backup Backup das configuracoes do ZION + info Informacoes do ZION TERMINAL + tmux Cria ou anexa a sessao 'zion' + + -- Extras -- + doctor Autoteste completo (POST) verde/vermelho + radar Latencia dos peers Tailscale + mapa Topologia do tailnet em ASCII + panico War-room: paineis tmux de monitoramento + qr QR code do acesso (para o celular) + manual Manual de campo offline + anotar "nota" Adiciona nota ao logbook + servir [dir] Compartilha arquivos so no Tailscale + travar Trava o terminal (vlock) + observar HOST Monitora um host remoto via SSH + tema [ice|amber|green] Troca o tema de cores + matrix Chuva digital (Matrix) + + -- Energia -- + desligar Desliga o sistema (com confirmacao) + reiniciar Reinicia o sistema (com confirmacao) + + --help Esta ajuda +AJUDA +} + +_confirmar() { local p="$1"; read -r -p "$(printf '%b%s [s/N]:%b ' "$ZWARN" "$p" "$ZR")" r; [ "$r" = "s" ] || [ "$r" = "S" ]; } + +cmd="${1:-}"; [ $# -gt 0 ] && shift +case "$cmd" in + ""|painel|dashboard) exec "$BIN/zion-dashboard" ;; + status) exec "$BIN/zion-status" "$@" ;; + saude|health) exec "$BIN/zion-health" "$@" ;; + rede|net) exec "$BIN/zion-net" "$@" ;; + tailscale|ts) exec "$BIN/zion-tailscale" "$@" ;; + ssh) exec "$BIN/zion-ssh" "$@" ;; + logs) exec "$BIN/zion-logs" "$@" ;; + atualizar|update) exec "$BIN/zion-update" "$@" ;; + backup) exec "$BIN/zion-backup" "$@" ;; + info) exec "$BIN/zion-info" "$@" ;; + link) exec "$BIN/zion-link" "$@" ;; + modo) exec "$BIN/zion-modo" "$@" ;; + doctor) exec "$BIN/zion-doctor" "$@" ;; + radar) exec "$BIN/zion-radar" "$@" ;; + mapa|map) exec "$BIN/zion-map" "$@" ;; + panico|panic) exec "$BIN/zion-panic" "$@" ;; + qr) exec "$BIN/zion-qr" "$@" ;; + manual|book) exec "$BIN/zion-book" "$@" ;; + anotar|log) exec "$BIN/zion-log" "$@" ;; + servir|serve) exec "$BIN/zion-serve" "$@" ;; + travar|lock) exec "$BIN/zion-lock" "$@" ;; + observar|watch) exec "$BIN/zion-watch" "$@" ;; + tema|theme) exec "$BIN/zion-theme" "$@" ;; + matrix) exec "$BIN/zion-matrix" "$@" ;; + tmux) + if tmux has-session -t zion 2>/dev/null; then exec tmux attach -t zion + else exec tmux new-session -s zion; fi ;; + desligar) + _confirmar "Desligar o ZION TERMINAL agora?" && { echo "Sincronizando discos..."; sync; sudo systemctl poweroff; } || echo "Cancelado." ;; + reiniciar) + _confirmar "Reiniciar o ZION TERMINAL agora?" && { echo "Sincronizando discos..."; sync; sudo systemctl reboot; } || echo "Cancelado." ;; + -h|--help|ajuda) _ajuda ;; + *) printf '%bSubcomando desconhecido:%b %s\n\n' "$ZCRIT" "$ZR" "$cmd"; _ajuda; exit 2 ;; +esac
@@ -0,0 +1,3 @@
+# ZION TERMINAL - aliases e prompt para shells de login interativos +# Cyberdeck criado por Pablo Murad em 2026 +case $- in *i*) [ -r /opt/zion-terminal/config/bashrc-zion.sh ] && . /opt/zion-terminal/config/bashrc-zion.sh ;; esac
@@ -0,0 +1,8 @@
+# ZION TERMINAL - exibe o MOTD no login interativo +# Cyberdeck criado por Pablo Murad em 2026 +# Roda apenas quando ha terminal real (login SSH/console); nunca em +# scp/sftp/rsync ou comandos nao-interativos. Desative com: touch ~/.zion-sem-motd +if [ -t 0 ] && [ -t 1 ] && [ -z "${ZION_MOTD_MOSTRADO:-}" ] && [ ! -e "$HOME/.zion-sem-motd" ]; then + export ZION_MOTD_MOSTRADO=1 + [ -x /opt/zion-terminal/bin/zion-motd ] && /opt/zion-terminal/bin/zion-motd +fi
@@ -0,0 +1,10 @@
+[Unit] +Description=ZION TERMINAL - coleta de metricas (cache + ring-buffer) +Documentation=file:/opt/zion-terminal/docs/README.md +After=network-online.target tailscaled.service + +[Service] +Type=oneshot +Nice=10 +IOSchedulingClass=idle +ExecStart=/opt/zion-terminal/bin/zion-collect
@@ -0,0 +1,11 @@
+[Unit] +Description=ZION TERMINAL - agenda a coleta de metricas (a cada 60s) + +[Timer] +OnBootSec=25 +OnUnitActiveSec=60 +AccuracySec=5s +Unit=zion-collect.service + +[Install] +WantedBy=timers.target
@@ -0,0 +1,71 @@
+#!/usr/bin/env bash +# ZION TERMINAL - instalador +# Copia o projeto para /opt, /usr/local/bin, /etc e liga os ganchos do shell. +# Idempotente: pode rodar de novo sem quebrar nada. +set -euo pipefail + +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +USER_HOME="${HOME}" +ME="$(id -un)" + +say() { printf '\033[38;5;51m»Z»\033[0m %s\n' "$*"; } + +[ "$(id -u)" -eq 0 ] && { echo "Rode como usuario normal (o script chama sudo quando precisa)."; exit 1; } + +say "Instalando o ZION TERMINAL a partir de $DIR" + +# --- /opt (nao apaga logs/backups existentes) ---------------------- +sudo mkdir -p /opt/zion-terminal/{logs,backups} +sudo cp -a "$DIR/opt/zion-terminal/." /opt/zion-terminal/ +sudo chown "$ME:$ME" /opt/zion-terminal/logs /opt/zion-terminal/backups +sudo chmod 755 /opt/zion-terminal/bin/* /opt/zion-terminal/lib/*.sh 2>/dev/null || true + +# --- comando principal --------------------------------------------- +sudo install -m 755 "$DIR/bin/zion" /usr/local/bin/zion + +# --- ganchos de sistema -------------------------------------------- +sudo install -m 644 "$DIR"/etc/profile.d/*.sh /etc/profile.d/ +sudo install -m 644 "$DIR"/etc/systemd/system/zion-collect.* /etc/systemd/system/ + +# --- dados locais (nao versionados) -------------------------------- +[ -f /opt/zion-terminal/config/ssh-favoritos.conf ] || { sudo touch /opt/zion-terminal/config/ssh-favoritos.conf; sudo chown "$ME:$ME" /opt/zion-terminal/config/ssh-favoritos.conf; } +printf 'DATA_CONFIG=%s\n' "$(date '+%Y-%m-%d %H:%M %Z')" | sudo tee /opt/zion-terminal/config/build-info.conf >/dev/null + +# --- persistencia do tmux (resurrect) ------------------------------ +if [ ! -d /opt/zion-terminal/assets/tmux-resurrect ]; then + say "Clonando tmux-resurrect" + sudo git clone --depth 1 https://github.com/tmux-plugins/tmux-resurrect \ + /opt/zion-terminal/assets/tmux-resurrect >/dev/null 2>&1 || echo " (aviso: tmux-resurrect nao clonado)" +fi + +# --- ganchos no home ----------------------------------------------- +grep -q 'bashrc-zion.sh' "$USER_HOME/.bashrc" 2>/dev/null || \ + printf '\n# ZION TERMINAL\n[ -r /opt/zion-terminal/config/bashrc-zion.sh ] && . /opt/zion-terminal/config/bashrc-zion.sh\n' >> "$USER_HOME/.bashrc" + +# .tmux.conf aponta para a config versionada (fonte unica) +if [ ! -e "$USER_HOME/.tmux.conf" ] || ! grep -q 'zion-terminal' "$USER_HOME/.tmux.conf" 2>/dev/null; then + echo 'source-file /opt/zion-terminal/config/tmux.conf' > "$USER_HOME/.tmux.conf" +fi + +# auto-resume do tmux no console local (opcional, opt-out ~/.zion-sem-tmux) +if ! grep -q 'auto-resume' "$USER_HOME/.bash_profile" 2>/dev/null; then + cat >> "$USER_HOME/.bash_profile" <<'EOF' + +# ZION TERMINAL - auto-resume da sessao tmux (so console local; desative: touch ~/.zion-sem-tmux) +if [ -z "$SSH_CONNECTION" ] && [ -z "$TMUX" ] && [ -t 1 ] && [ ! -e "$HOME/.zion-sem-tmux" ] && command -v tmux >/dev/null; then + case "$(tty)" in /dev/tty[0-9]*) exec tmux new-session -A -s zion ;; esac +fi +[ -f "$HOME/.bashrc" ] && . "$HOME/.bashrc" +EOF +fi + +# --- servico de coleta --------------------------------------------- +sudo systemctl daemon-reload +sudo systemctl enable --now zion-collect.timer >/dev/null 2>&1 || true + +# --- tema do tmux --------------------------------------------------- +[ -f "$USER_HOME/.zion-tema" ] || echo 'ZION_TEMA=ice' > "$USER_HOME/.zion-tema" +/opt/zion-terminal/bin/zion-tmux-theme -q >/dev/null 2>&1 || true + +say "Pronto. Abra uma nova sessao ou rode: source ~/.bashrc" +say "Comandos: zion · zion doctor · zion --help"
@@ -0,0 +1,3 @@
+»»»»» +» Z » ZION TERMINAL +»»»»»
@@ -0,0 +1,6 @@
+>>----------------------------------------------------------<< + _______ ___ _ _ _____ ___ ___ __ __ ___ _ _ _ _ + |_ /_ _/ _ \| \| | |_ _| __| _ \ \/ |_ _| \| | /_\ | | + / / | | (_) | .` | | | | _|| / |\/| || || .` |/ _ \| |__ + /___|___\___/|_|\_| |_| |___|_|_\_| |_|___|_|\_/_/ \_\____| +>>----------------------------------------------------------<<
@@ -0,0 +1,6 @@
+»»──────────────────────────────────────────────────────────»» + _______ ___ _ _ _____ ___ ___ __ __ ___ _ _ _ _ + |_ /_ _/ _ \| \| | |_ _| __| _ \ \/ |_ _| \| | /_\ | | + / / | | (_) | .` | | | | _|| / |\/| || || .` |/ _ \| |__ + /___|___\___/|_|\_| |_| |___|_|_\_| |_|___|_|\_/_/ \_\____| +»»──────────────────────────────────────────────────────────»»
@@ -0,0 +1,3 @@
+»» ╺━┓╻┏━┓┏┓╻ ╺┳╸┏━╸┏━┓┏┳┓╻┏┓╻┏━┓╻ + ┏━┛┃┃ ┃┃┗┫ ┃ ┣╸ ┣┳┛┃┃┃┃┃┗┫┣━┫┃ + ┗━╸╹┗━┛╹ ╹ ╹ ┗━╸╹┗╸╹ ╹╹╹ ╹╹ ╹┗━╸
@@ -0,0 +1,58 @@
+#!/usr/bin/env bash +# ZION TERMINAL - Backup e restauracao das configuracoes +# Cyberdeck criado por Pablo Murad em 2026 +export LC_ALL=C +. /opt/zion-terminal/bin/zion-lib.sh 2>/dev/null +DEST=/opt/zion-terminal/backups + +uso() { +cat <<U +Uso: zion backup cria backup datado (.tar.gz) + zion backup --restaurar ARQ restaura de um backup (pede confirmacao) + zion backup --para PEER envia o ultimo backup via rsync para um peer Tailscale + zion backup --com-chaves inclui chaves SSH privadas (exige confirmacao) +Backups em: $DEST +Por padrao NAO inclui chaves privadas. +U +} + +criar() { + local ts inc tmp + ts=$(date +%Y%m%d-%H%M%S); tmp=$(mktemp -d) + inc=("opt/zion-terminal/bin" "opt/zion-terminal/config" "opt/zion-terminal/docs" + "opt/zion-terminal/assets/banner-wide.txt" "opt/zion-terminal/assets/banner-compact.txt" + "opt/zion-terminal/VERSION" "opt/zion-terminal/CREATOR" + "etc/profile.d/zzz-zion-motd.sh" "etc/profile.d/zzz-zion-aliases.sh" + "etc/systemd/system/zion-collect.service" "etc/systemd/system/zion-collect.timer") + [ -e "$HOME/.ssh/config" ] && inc+=("home/pablo/.ssh/config") + [ -e "$HOME/.tmux.conf" ] && inc+=("home/pablo/.tmux.conf") + [ -e "$HOME/.zion-tema" ] && inc+=("home/pablo/.zion-tema") + [ -e "$HOME/.bash_profile" ] && inc+=("home/pablo/.bash_profile") + if [ "$1" = "--com-chaves" ]; then + read -r -p "Incluir CHAVES PRIVADAS no backup? [s/N]: " k; [ "$k" = s ] && inc+=(home/pablo/.ssh/id_*) + fi + dpkg --get-selections > "$tmp/pacotes.txt" 2>/dev/null + local arq="$DEST/zion-backup-$ts.tar.gz" + if tar czf "$arq" --ignore-failed-read -C / "${inc[@]}" -C "$tmp" pacotes.txt 2>/dev/null; then + chmod 600 "$arq" + printf '%b Backup criado:%b %s (%s)\n' "$ZOK" "$ZR" "$arq" "$(du -h "$arq" | cut -f1)" + else + printf '%b Falha ao criar backup.%b\n' "$ZCRIT" "$ZR"; rm -f "$arq"; rm -rf "$tmp"; return 1 + fi + rm -rf "$tmp" +} + +case "${1:-}" in + ""|--com-chaves) criar "${1:-}" ;; + --restaurar) + arq="${2:-}"; [ -r "$arq" ] || { echo "Arquivo invalido: $arq"; exit 1; } + read -r -p "Restaurar $arq sobre o sistema atual? [s/N]: " r; [ "$r" = s ] || exit 0 + sudo tar xzf "$arq" -C / && echo "Restaurado. Revise e reinicie sessao se necessario." ;; + --para) + peer="${2:-}"; [ -z "$peer" ] && { echo "Informe o peer."; exit 1; } + ultimo=$(sudo ls -t "$DEST"/zion-backup-*.tar.gz 2>/dev/null | head -1) + [ -z "$ultimo" ] && { echo "Nenhum backup ainda. Rode 'zion backup' antes."; exit 1; } + echo "Enviando $ultimo -> $peer:~/"; rsync -av --progress "$ultimo" "$peer:~/" ;; + --help|-h) uso ;; + *) uso; exit 2 ;; +esac
@@ -0,0 +1,60 @@
+#!/usr/bin/env bash +# ZION TERMINAL - Manual de campo offline +# Cyberdeck criado por Pablo Murad em 2026 +export LC_ALL=C +. /opt/zion-terminal/bin/zion-lib.sh 2>/dev/null +[ "$1" = "--help" ] && { echo "Uso: zion manual [tmux|ssh|git|tailscale|zion] — abre um guia rapido offline."; exit 0; } +topico="${1:-}" + +manual() { +cat <<'MAN' +=================================================================== + ZION TERMINAL — MANUAL DE CAMPO + Cyberdeck criado por Pablo Murad em 2026 +=================================================================== + +[TMUX] + zion tmux anexa/cria a sessao 'zion' + Ctrl+B D desanexa (deixa rodando) + Ctrl+B " divide painel na horizontal + Ctrl+B % divide painel na vertical + Ctrl+B setas move entre paineis + Ctrl+B c / n / p nova janela / proxima / anterior + tmux ls lista sessoes + +[SSH] + ssh <alias> conecta (aliases em ~/.ssh/config) + zion ssh menu de servidores + Multiplexacao e keepalive ja configurados (reconexao rapida). + +[GIT] + git status / add -A / commit -m "..." basico + git log --oneline --graph --decorate historico visual + git pull --rebase / git push sincronizar + +[TAILSCALE] + tailscale status peers e estado + tailscale ping <host> testa direto vs DERP + zion radar / zion mapa visao do tailnet + tailscale ip -4 IP desta maquina + +[ZION] + zion painel zion status resumo + zion saude saude zion rede diagnostico de rede + zion doctor autoteste zion qr QR de acesso + zion panico war-room zion matrix chuva digital + zion anotar logbook zion tema troca cores + zion backup backup zion --help tudo + +=================================================================== +MAN +} + +case "$topico" in + tmux) manual | sed -n '/\[TMUX\]/,/\[SSH\]/p' ;; + ssh) manual | sed -n '/\[SSH\]/,/\[GIT\]/p' ;; + git) manual | sed -n '/\[GIT\]/,/\[TAILSCALE\]/p' ;; + tailscale) manual | sed -n '/\[TAILSCALE\]/,/\[ZION\]/p' ;; + zion) manual | sed -n '/\[ZION\]/,/====/p' ;; + *) if command -v less >/dev/null; then manual | less -R; else manual; fi ;; +esac
@@ -0,0 +1,26 @@
+#!/usr/bin/env bash +# ZION TERMINAL - Coletor de metricas (cache + ring-buffer) +# Cyberdeck criado por Pablo Murad em 2026 +# Executado por timer systemd (a cada 60s) e no boot. +export LC_ALL=C +. /opt/zion-terminal/bin/zion-lib.sh 2>/dev/null +mkdir -p /run/zion +CSV=/opt/zion-terminal/logs/metricas.csv +MAX=120 # ~2h a 60s + +# --- Metricas lentas -> cache (para MOTD/status rapidos) --- +if tailscale status >/dev/null 2>&1; then ts=conectado; else ts=parado; fi +if timeout 3 curl -fsS -o /dev/null --max-time 3 http://connectivitycheck.gstatic.com/generate_204 2>/dev/null; then net=disponivel; else net=indisponivel; fi +upd=$(apt list --upgradable 2>/dev/null | grep -vc Listing) +{ + echo "TS_ESTADO=$ts" + echo "INTERNET=$net" + echo "UPDATES=$upd" + echo "ATUALIZADO_EM=$(date '+%H:%M:%S')" +} > /run/zion/status 2>/dev/null + +# --- Ring-buffer para sparklines (timestamp,temp,cpu,rampct) --- +temp=$(zion_temp_c); cpu=$(zion_cpu_pct); ram=$(zion_ram_pct) +printf '%s,%s,%s,%s\n' "$(date +%s)" "$temp" "$cpu" "$ram" >> "$CSV" 2>/dev/null +# manter apenas as ultimas MAX linhas +if [ -f "$CSV" ]; then tail -n "$MAX" "$CSV" > "$CSV.tmp" 2>/dev/null && mv "$CSV.tmp" "$CSV"; fi
@@ -0,0 +1,110 @@
+#!/usr/bin/env bash +# ===================================================================== +# ZION TERMINAL - Painel principal (dashboard) +# Cyberdeck criado por Pablo Murad em 2026 +# Menu agrupado, consciente de largura, Ctrl+C limpo. +# ===================================================================== +export LC_ALL=C +ZION_DIR="/opt/zion-terminal"; BIN="$ZION_DIR/bin" +. "$BIN/zion-lib.sh" 2>/dev/null +trap 'tput cnorm 2>/dev/null; printf "%b" "$ZR"; echo; exit 0' INT TERM + +pausa() { printf '\n %bEnter para voltar…%b' "$ZGRY" "$ZR"; read -r _; } +ver=$(cat "$ZION_DIR/VERSION" 2>/dev/null) + +topo() { + clear 2>/dev/null + local cols; cols=$(ui_cols) + if [ "$cols" -ge 42 ] && [ -r "$ZION_DIR/assets/ascii/logo-compacta.txt" ]; then + printf '%b' "$ZP$ZB"; sed 's/^/ /' "$ZION_DIR/assets/ascii/logo-compacta.txt"; printf '%b' "$ZR" + else printf ' %b%s ZION TERMINAL%b\n' "$ZP$ZB" "$ZSYM" "$ZR"; fi + printf ' %bv%s%b · %btema %s%b · %b%s%b\n' "$ZDISC" "${ver:-?}" "$ZR" "$ZDISC" "${ZION_TEMA:-ice}" "$ZR" "$ZDISC" "$(date '+%d/%m %H:%M')" "$ZR" + "$BIN/zion-status" 2>/dev/null + ui_rule +} + +# item: "N|Rotulo" -> renderiza 1 ou 2 colunas conforme largura +grupo() { + local titulo="$1"; shift + printf ' %b%s%b\n' "$ZS$ZB" "$titulo" "$ZR" + local cols; cols=$(ui_cols); local dois=0; [ "$cols" -ge 74 ] && dois=1 + local i=0 n1 l1 n2 l2 + while [ $# -gt 0 ]; do + n1="${1%%|*}"; l1="${1#*|}"; shift + if [ "$dois" = 1 ] && [ $# -gt 0 ]; then + n2="${1%%|*}"; l2="${1#*|}"; shift + printf ' %b%2s%b %-26s %b%2s%b %s\n' "$ZA" "$n1" "$ZR" "$l1" "$ZA" "$n2" "$ZR" "$l2" + else + printf ' %b%2s%b %s\n' "$ZA" "$n1" "$ZR" "$l1" + fi + done +} + +menu() { + grupo "OPERACAO" "1|Estado do sistema" "2|Saude" "3|Doctor (autoteste)" "4|War-room (panico)" + grupo "CONECTIVIDADE" "5|Tailscale" "6|Radar de peers" "7|Mapa do tailnet" "8|SSH" "9|Rede" "10|DNS" "11|Link (resumo)" + grupo "MANUTENCAO" "12|Armazenamento" "13|Servicos" "14|Atualizacoes" "15|Backups" "16|Logs" + grupo "FERRAMENTAS" "17|Tmux" "18|Git e projetos" "19|Compartilhar arquivos" "20|QR de acesso" "21|Manual" "22|Logbook" + grupo "SISTEMA" "23|Modo de operacao" "24|Tema" "25|Travar" "26|Informacoes" "0|Sair para o shell" +} + +estado_sistema() { + topo; "$BIN/zion-health" 2>/dev/null + local csv="$ZION_DIR/logs/metricas.csv" + if [ -r "$csv" ]; then + ui_section "HISTORICO (ultimas amostras)" + printf ' %bTemp%b %b%s%b\n' "$ZDISC" "$ZR" "$ZP" "$(cut -d, -f2 "$csv" | tail -40 | zion_sparkline $(cat))" "$ZR" + printf ' %bCPU %b %b%s%b\n' "$ZDISC" "$ZR" "$ZP" "$(cut -d, -f3 "$csv" | tail -40 | zion_sparkline $(cat))" "$ZR" + printf ' %bRAM %b %b%s%b\n' "$ZDISC" "$ZR" "$ZP" "$(cut -d, -f4 "$csv" | tail -40 | zion_sparkline $(cat))" "$ZR" + fi + pausa +} +ferramentas_rede_dns() { + topo; ui_header "DIAGNOSTICO DNS" + for h in deb.debian.org google.com "$(hostname)"; do + printf ' %b%-22s%b %b\n' "$ZWHT" "$h" "$ZR" "$(getent hosts "$h" >/dev/null 2>&1 && ui_state ok || ui_state crit)" + done + ui_kv "Servidores" "$(grep -h ^nameserver /etc/resolv.conf | awk '{print $2}' | tr '\n' ' ')"; pausa +} +git_projetos() { + topo; ui_header "GIT E PROJETOS"; local found=0 + for d in "$HOME"/* "$HOME"/projetos/*; do [ -d "$d/.git" ] || continue; found=1 + ui_kv "$(basename "$d")" "$(git -C "$d" branch --show-current 2>/dev/null)"; done + [ "$found" = 0 ] && ui_info "Nenhum repositorio Git em ~"; pausa +} + +while true; do + topo; menu + ui_rule + printf ' %b%s zion»%b ' "$ZP$ZB" "$ZSYM" "$ZR"; read -r opt + case "$opt" in + 1) estado_sistema ;; + 2) topo; "$BIN/zion-health"; pausa ;; + 3) topo; "$BIN/zion-doctor"; pausa ;; + 4) "$BIN/zion-panic" ;; + 5) topo; "$BIN/zion-tailscale"; pausa ;; + 6) topo; "$BIN/zion-radar"; pausa ;; + 7) topo; "$BIN/zion-map"; pausa ;; + 8) topo; "$BIN/zion-ssh" ;; + 9) topo; "$BIN/zion-net"; pausa ;; + 10) ferramentas_rede_dns ;; + 11) topo; "$BIN/zion-link"; pausa ;; + 12) topo; ui_header "ARMAZENAMENTO"; df -h / /boot 2>/dev/null | sed 's/^/ /'; command -v ncdu >/dev/null && echo " (dica: ncdu /)"; pausa ;; + 13) topo; ui_header "SERVICOS"; ui_kv "Rodando" "$(systemctl list-units --type=service --state=running --no-legend | wc -l)"; ui_kv "Falhas" "$(zion_falhas)"; systemctl --failed --no-legend | sed 's/^/ /'; pausa ;; + 14) topo; "$BIN/zion-update"; pausa ;; + 15) topo; "$BIN/zion-backup"; pausa ;; + 16) topo; "$BIN/zion-logs" ;; + 17) exec zion tmux ;; + 18) git_projetos ;; + 19) topo; "$BIN/zion-serve" --help; ui_info "Rode: zion servir [dir]"; pausa ;; + 20) topo; "$BIN/zion-qr"; pausa ;; + 21) "$BIN/zion-book" ;; + 22) topo; "$BIN/zion-log" --ver ;; + 23) topo; "$BIN/zion-modo"; pausa ;; + 24) topo; "$BIN/zion-theme"; pausa ;; + 25) "$BIN/zion-lock" ;; + 26) topo; "$BIN/zion-info"; pausa ;; + 0|q|sair) clear 2>/dev/null; printf ' %b%s Terminal operacional. Ate logo.%b\n' "$ZP" "$ZSYM" "$ZR"; exit 0 ;; + *) ;; + esac +done
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash +# ZION TERMINAL - Autoteste (POST) +# Cyberdeck criado por Pablo Murad em 2026 +export LC_ALL=C +. /opt/zion-terminal/bin/zion-lib.sh 2>/dev/null +[ "$1" = "--help" ] && { echo "Uso: zion doctor — verifica subsistemas e mostra checklist OK/FALHA. Codigo de saida = nº de falhas."; exit 0; } + +falhas=0 +chk() { if [ "$2" -eq 0 ]; then printf ' %b[ OK ]%b %-26s %b%s%b\n' "$ZOK" "$ZR" "$1" "$ZGRY" "$3" "$ZR"; else printf ' %b[FALHA]%b %-26s %b%s%b\n' "$ZCRIT" "$ZR" "$1" "$ZWARN" "$3" "$ZR"; falhas=$((falhas+1)); fi; } + +ui_header "AUTOTESTE (POST)" +systemctl is-active ssh >/dev/null 2>&1; chk "Servico SSH ativo" $? "$(systemctl is-enabled ssh 2>/dev/null)" +systemctl is-active tailscaled >/dev/null 2>&1; chk "Servico Tailscale ativo" $? "$(systemctl is-enabled tailscaled 2>/dev/null)" +tailscale status >/dev/null 2>&1; chk "Tailscale conectado" $? "$(zion_ip_ts)" +getent hosts deb.debian.org >/dev/null 2>&1; chk "Resolucao DNS" $? "" +[ "$(zion_internet)" = disponivel ]; chk "Internet" $? "$(zion_internet)" +temp=$(zion_temp_c); [ "$temp" -lt 80 ]; chk "Temperatura < 80C" $? "${temp}C" +[ "$(zion_disco_pct)" -lt 90 ]; chk "Disco < 90%" $? "$(zion_disco_pct)%" +[ "$(zion_ram_pct)" -lt 90 ]; chk "RAM < 90%" $? "$(zion_ram_pct)%" +[ "$(zion_falhas)" -eq 0 ]; chk "Servicos sem falha" $? "$(zion_falhas) falhas" +[ -x /usr/local/bin/zion ]; chk "Comando 'zion' instalado" $? "" +[ -x /opt/zion-terminal/bin/zion-motd ]; chk "MOTD instalado" $? "" +[ -r /opt/zion-terminal/lib/zion-ui.sh ]; chk "Biblioteca de UI" $? "" +grep -q rotate /boot/orangepiEnv.txt 2>/dev/null; chk "Rotacao de tela" $? "paisagem" + +ui_rule +if [ "$falhas" -eq 0 ]; then printf ' %b%s TODOS OS SISTEMAS OPERACIONAIS%b\n' "$ZOK$ZB" "$ZSYM" "$ZR" +else printf ' %b%s %d VERIFICACAO(OES) COM FALHA%b\n' "$ZCRIT$ZB" "$ZSYM" "$falhas" "$ZR"; fi +exit "$falhas"
@@ -0,0 +1,46 @@
+#!/usr/bin/env bash +# ZION TERMINAL - Saude do sistema +# Cyberdeck criado por Pablo Murad em 2026 +export LC_ALL=C +. /opt/zion-terminal/bin/zion-lib.sh 2>/dev/null +[ "$1" = "--help" ] && { echo "Uso: zion saude — temperatura, ventoinha, frequencia, carga, RAM, swap, disco, erros, servicos, Tailscale e rede, com estados OK/ATENCAO/CRITICO."; exit 0; } + +# rotulo | valor | estado(ok/warn/crit/nd) | detalhe +linha() { printf ' %b%-14s%b %b%-18s%b %b %b%s%b\n' "$ZDISC" "$1" "$ZR" "$ZWHT" "$2" "$ZR" "$(ui_state "$3")" "$ZGRY" "${4:-}" "$ZR"; } + +ui_header "SAUDE DO SISTEMA" + +temp=$(zion_temp_c); tst=ok; [ "$temp" -ge 65 ] && tst=warn; [ "$temp" -ge 80 ] && tst=crit +linha "Temperatura" "${temp} C" "$tst" + +# Ventoinha (hwmon/pwm-fan) - dado real quando existe +fan=""; for h in /sys/class/hwmon/hwmon*; do [ -r "$h/name" ] && [ "$(cat "$h/name")" = pwm-fan ] && { for p in "$h"/pwm1 "$h"/fan1_input; do [ -r "$p" ] && fan="$fan $(basename "$p")=$(cat "$p")"; done; }; done +[ -n "$fan" ] && linha "Ventoinha" "$(echo $fan)" ok "PWM 0-255" || linha "Ventoinha" "sem controle expl." nd + +freq=$(( $(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq)/1000 )) +linha "CPU freq" "${freq} MHz" ok "governor: $(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor)" +cpu=$(zion_cpu_pct); cst=ok; [ "$cpu" -ge 75 ] && cst=warn; [ "$cpu" -ge 90 ] && cst=crit +linha "CPU uso" "${cpu} %" "$cst" + +carga=$(zion_load); nucleos=$(nproc) +cc=$(awk -v c="$carga" -v n="$nucleos" 'BEGIN{p=c/n*100; print (p>=90)?"crit":(p>=70)?"warn":"ok"}') +linha "Carga (1m)" "$carga" "$cc" "de $nucleos nucleos" + +rp=$(zion_ram_pct); rst=ok; [ "$rp" -ge 75 ] && rst=warn; [ "$rp" -ge 90 ] && rst=crit +linha "RAM" "$(zion_ram_str)" "$rst" "${rp}%" +swused=$(awk '/SwapTotal/{t=$2}/SwapFree/{f=$2}END{printf "%d",(t-f)/1024}' /proc/meminfo) +swtot=$(awk '/SwapTotal/{printf "%d",$2/1024}' /proc/meminfo) +linha "Swap (zram)" "${swused} / ${swtot} MB" ok + +dp=$(zion_disco_pct); dst=ok; [ "$dp" -ge 75 ] && dst=warn; [ "$dp" -ge 90 ] && dst=crit +linha "Disco /" "$(zion_disco)" "$dst" + +falhas=$(zion_falhas); linha "Servicos falha" "$falhas" "$([ "$falhas" -gt 0 ] && echo crit || echo ok)" +[ "$falhas" -gt 0 ] && systemctl --failed --no-legend | awk '{print " - "$1}' + +erros=$(journalctl -p err -b --no-pager 2>/dev/null | grep -c . || echo 0) +linha "Erros no boot" "$erros" "$([ "$erros" -gt 20 ] && echo warn || echo ok)" "journalctl -p err -b" + +ts=$(zion_ts_estado); linha "Tailscale" "$ts" "$([ "$ts" = conectado ] && echo ok || echo warn)" "$(zion_ip_ts)" +net=$(zion_internet); linha "Internet" "$net" "$([ "$net" = disponivel ] && echo ok || echo warn)" +ui_rule
@@ -0,0 +1,28 @@
+#!/usr/bin/env bash +# ZION TERMINAL - Informacoes do ambiente +# Cyberdeck criado por Pablo Murad em 2026 +export LC_ALL=C +ZION_DIR="/opt/zion-terminal" +. "$ZION_DIR/bin/zion-lib.sh" 2>/dev/null +[ "$1" = "--help" ] && { echo "Uso: zion info — identidade, hardware, versoes e local dos arquivos."; exit 0; } + +ver=$(cat "$ZION_DIR/VERSION" 2>/dev/null) +data=$(sed -n 's/^DATA_CONFIG=//p' "$ZION_DIR/config/build-info.conf" 2>/dev/null) +cols=$(ui_cols) +if [ "$cols" -ge 42 ] && [ -r "$ZION_DIR/assets/ascii/logo-compacta.txt" ]; then + printf '%b' "$ZP$ZB"; sed 's/^/ /' "$ZION_DIR/assets/ascii/logo-compacta.txt"; printf '%b\n' "$ZR" +else printf ' %b%s ZION TERMINAL%b\n' "$ZP$ZB" "$ZSYM" "$ZR"; fi +printf ' %bCyberdeck criado por Pablo Murad em 2026%b\n' "$ZA" "$ZR" +ui_rule +ui_kv "Hardware" "$(tr -d '\0' </proc/device-tree/model 2>/dev/null)" +ui_kv "Sistema" "$(. /etc/os-release; echo "$PRETTY_NAME")" +ui_kv "Kernel" "$(uname -r)" +ui_kv "Arquitetura" "$(uname -m)" +ui_kv "Hostname" "$(hostname)" +ui_kv "Versao ZION" "${ver:-?}" +ui_kv "Config em" "${data:-?}" +ui_kv "Tema" "${ZION_TEMA:-ice}" +ui_kv "Tailscale" "$(zion_ts_estado) ($(zion_ip_ts))" +ui_kv "Arquivos" "$ZION_DIR" +ui_rule +printf ' %bComandos: %bzion --help%b\n' "$ZGRY" "$ZA" "$ZR"
@@ -0,0 +1,127 @@
+#!/usr/bin/env bash +# ===================================================================== +# ZION TERMINAL - Biblioteca compartilhada +# Cyberdeck criado por Pablo Murad em 2026 +# --------------------------------------------------------------------- +# Funcoes de coleta de metricas, cores, sparklines e niveis de saude. +# Getters rapidos rodam ao vivo; getters lentos (internet, updates, +# peers) leem o cache /run/zion/status quando disponivel. +# ===================================================================== + +ZION_DIR="/opt/zion-terminal" +ZION_CACHE="/run/zion/status" +ZION_TEMA_FILE="$ZION_DIR/config/tema.sh" + +# Carrega o tema de cores +[ -r "$ZION_TEMA_FILE" ] && . "$ZION_TEMA_FILE" +[ -r "$ZION_DIR/lib/zion-ui.sh" ] && . "$ZION_DIR/lib/zion-ui.sh" + +# --- Utilidades de terminal --------------------------------------- +zion_cols() { local c; c="${COLUMNS:-}"; [ -z "$c" ] && c=$(tput cols 2>/dev/null); echo "${c:-80}"; } +zc() { # imprime com cor: zc "$ZP" "texto" + printf '%b%s%b' "$1" "$2" "$ZR" +} + +# --- Metricas rapidas (ao vivo) ----------------------------------- +zion_temp_c() { + local t=0 f + for f in /sys/class/thermal/thermal_zone0/temp; do + [ -r "$f" ] && t=$(cat "$f") && break + done + echo $(( t / 1000 )) +} + +zion_load() { awk '{print $1}' /proc/loadavg; } + +zion_cpu_pct() { # amostra rapida de ~0.25s + local a b i1 i2 t1 t2 + a=($(sed -n '1{s/cpu *//;p}' /proc/stat)); i1=${a[3]}; t1=0; for v in "${a[@]}"; do t1=$((t1+v)); done + sleep 0.25 + b=($(sed -n '1{s/cpu *//;p}' /proc/stat)); i2=${b[3]}; t2=0; for v in "${b[@]}"; do t2=$((t2+v)); done + local dt=$((t2-t1)) di=$((i2-i1)) + [ "$dt" -le 0 ] && { echo 0; return; } + echo $(( (100*(dt-di)) / dt )) +} + +zion_ram_used() { awk '/MemTotal/{t=$2}/MemAvailable/{a=$2}END{printf "%d",(t-a)/1024}' /proc/meminfo; } +zion_ram_total_mb() { awk '/MemTotal/{printf "%d",$2/1024}' /proc/meminfo; } +zion_ram_pct() { local u tm; u=$(zion_ram_used); tm=$(zion_ram_total_mb); [ "$tm" -gt 0 ] && echo $((100*u/tm)) || echo 0; } +zion_ram_str() { + local u tm; u=$(zion_ram_used); tm=$(zion_ram_total_mb) + if [ "$tm" -ge 1024 ]; then printf '%d MB / %d GB' "$u" $((tm/1024)); else printf '%d MB / %d MB' "$u" "$tm"; fi +} +zion_ram() { zion_ram_str; } # compatibilidade + +zion_disco() { + df -BG --output=used,size,pcent / 2>/dev/null | awk 'NR==2{gsub(/G/,"");printf "%s GB / %s GB (%s)",$1,$2,$3}' +} +zion_disco_pct() { df --output=pcent / 2>/dev/null | awk 'NR==2{gsub(/[ %]/,"");print}'; } + +zion_uptime() { + local s=$(cut -d. -f1 /proc/uptime) d h m + d=$((s/86400)); h=$(( (s%86400)/3600 )); m=$(( (s%3600)/60 )) + [ $d -gt 0 ] && printf '%dd %dh %dm' $d $h $m || { [ $h -gt 0 ] && printf '%dh %dm' $h $m || printf '%dm' $m; } +} + +zion_ip_local() { ip -4 -o addr show scope global 2>/dev/null | awk '$2!="tailscale0"{print $4}' | cut -d/ -f1 | head -1; } +zion_ip_ts() { tailscale ip -4 2>/dev/null | head -1; } + +zion_ssh_estado() { systemctl is-active ssh 2>/dev/null; } +zion_falhas() { systemctl --failed --no-legend 2>/dev/null | grep -c . ; } + +# --- Metricas lentas (cache-first) -------------------------------- +zion_cache_get() { # $1=chave -> valor do cache, ou vazio + [ -r "$ZION_CACHE" ] && sed -n "s/^$1=//p" "$ZION_CACHE" | head -1 +} + +zion_ts_estado() { + local v; v=$(zion_cache_get TS_ESTADO) + if [ -z "$v" ]; then + if tailscale status >/dev/null 2>&1; then v="conectado"; else v="parado"; fi + fi + echo "$v" +} + +zion_internet() { + local v; v=$(zion_cache_get INTERNET) + if [ -z "$v" ]; then + if timeout 2 curl -fsS -o /dev/null --max-time 2 http://connectivitycheck.gstatic.com/generate_204 2>/dev/null; then + v="disponivel"; else v="indisponivel"; fi + fi + echo "$v" +} + +zion_updates() { + local v; v=$(zion_cache_get UPDATES) + [ -z "$v" ] && v=$(apt list --upgradable 2>/dev/null | grep -vc Listing) + echo "${v:-0}" +} + +# --- Niveis de saude (cor por faixa) ------------------------------ +zion_nivel_temp() { # ecoa cor; define ZION_NIVEL=normal|atencao|critico + local t=$1 + if [ "$t" -ge 80 ]; then ZION_NIVEL=critico; printf '%b' "$ZCRIT" + elif [ "$t" -ge 65 ]; then ZION_NIVEL=atencao; printf '%b' "$ZWARN" + else ZION_NIVEL=normal; printf '%b' "$ZOK"; fi +} +zion_nivel_pct() { # $1=percentual -> cor + local p=$1 + if [ "$p" -ge 90 ]; then printf '%b' "$ZCRIT" + elif [ "$p" -ge 75 ]; then printf '%b' "$ZWARN" + else printf '%b' "$ZOK"; fi +} + +# --- Sparkline Unicode -------------------------------------------- +zion_sparkline() { # recebe numeros por stdin ou args -> ▁▂▃▄▅▆▇█ + local nums=("$@") chars=(▁ ▂ ▃ ▄ ▅ ▆ ▇ █) out="" min max n idx + [ ${#nums[@]} -eq 0 ] && read -r -a nums + [ ${#nums[@]} -eq 0 ] && { echo ""; return; } + min=${nums[0]}; max=${nums[0]} + for n in "${nums[@]}"; do [ "$n" -lt "$min" ] && min=$n; [ "$n" -gt "$max" ] && max=$n; done + local rng=$((max-min)); [ $rng -eq 0 ] && rng=1 + for n in "${nums[@]}"; do idx=$(( (n-min)*7/rng )); out+="${chars[$idx]}"; done + printf '%s' "$out" +} + +# --- Linha divisoria tematica ------------------------------------- +zion_regua() { local w=${1:-$(zion_cols)}; printf '%b' "$ZMUT"; printf '─%.0s' $(seq 1 "$w"); printf '%b\n' "$ZR"; }
@@ -0,0 +1,40 @@
+#!/usr/bin/env bash +# ZION TERMINAL - Link (conectividade resumida) +# Cyberdeck criado por Pablo Murad em 2026 +# Reutiliza os getters da lib (sem duplicar zion-rede/tailscale/radar). +export LC_ALL=C +. /opt/zion-terminal/bin/zion-lib.sh 2>/dev/null +[ "$1" = "--help" ] && { echo "Uso: zion link — visao unica de conectividade (interface, IPs, gateway, DNS, internet, Tailscale, peers, direto/DERP)."; exit 0; } + +ui_header "LINK — CONECTIVIDADE" + +dev=$(ip route show default | awk '{print $5; exit}') +tipo="Ethernet"; [ "${dev#wl}" != "$dev" ] && tipo="Wi-Fi" +ui_kv "Interface" "${dev:-—} ($tipo)" +if [ "$tipo" = "Wi-Fi" ] && command -v iw >/dev/null; then + ssid=$(iw dev "$dev" link 2>/dev/null | awk -F': ' '/SSID/{print $2}'); [ -n "$ssid" ] && ui_kv "SSID" "$ssid" +fi +ui_kv "IP local" "$(zion_ip_local)" +gw=$(ip route show default | awk '{print $3; exit}') +printf ' %b%-14s%b %b %b%s%b\n' "$ZDISC" "Gateway" "$ZR" "$([ -n "$gw" ] && ping -c1 -W1 "$gw" >/dev/null 2>&1 && ui_state ok || ui_state warn)" "$ZGRY" "${gw:-—}" "$ZR" +ui_kv "DNS" "$(grep -h ^nameserver /etc/resolv.conf 2>/dev/null | awk '{print $2}' | tr '\n' ' ')" +printf ' %b%-14s%b %b\n' "$ZDISC" "Internet" "$ZR" "$([ "$(zion_internet)" = disponivel ] && ui_state ok || ui_state off)" + +ui_section "TAILSCALE" +printf ' %b%-14s%b %b %b%s%b\n' "$ZDISC" "Estado" "$ZR" "$([ "$(zion_ts_estado)" = conectado ] && ui_state ok || ui_state off)" "$ZGRY" "$(zion_ip_ts)" "$ZR" +if command -v tailscale >/dev/null; then + on=$(tailscale status 2>/dev/null | awk '/^100\./ && !/offline/{c++} END{print c+0}') + tot=$(tailscale status 2>/dev/null | awk '/^100\./{c++} END{print c+0}') + ui_kv "Peers online" "$on de $tot" + magic=$(tailscale status --json 2>/dev/null | grep -o '"MagicDNSSuffix":"[^"]*"' | head -1 | cut -d'"' -f4) + [ -n "$magic" ] && ui_kv "MagicDNS" "$magic" + # testa 1 peer online + peer=$(tailscale status 2>/dev/null | awk -v self="$(hostname)" '/^100\./ && !/offline/ && $2!=self{print $2; exit}') + if [ -n "$peer" ]; then + res=$(timeout 5 tailscale ping -c1 --timeout 3s "$peer" 2>/dev/null | head -1) + via=DERP; echo "$res" | grep -q direct && via=direto + ms=$(echo "$res" | grep -o 'in [0-9]*ms' | grep -o '[0-9]*') + printf ' %b%-14s%b %b %b%s via %s%b\n' "$ZDISC" "Teste ($peer)" "$ZR" "$([ "$via" = direto ] && ui_state ok || ui_state warn)" "$ZGRY" "${ms:-?}ms" "$via" "$ZR" + fi +fi +ui_rule
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash +# ZION TERMINAL - Trava o terminal (campo) +# Cyberdeck criado por Pablo Murad em 2026 +. /opt/zion-terminal/bin/zion-lib.sh 2>/dev/null +[ "$1" = "--help" ] && { echo "Uso: zion travar — bloqueia o terminal atual (vlock). Desbloqueia com a sua senha."; exit 0; } +command -v vlock >/dev/null || { echo "vlock nao instalado."; exit 1; } +printf '%b ZION TERMINAL travado. Digite sua senha para desbloquear.%b\n' "$ZP" "$ZR" +exec vlock -c
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash +# ZION TERMINAL - Logbook de operacoes (notas de campo) +# Cyberdeck criado por Pablo Murad em 2026 +export LC_ALL=C +. /opt/zion-terminal/bin/zion-lib.sh 2>/dev/null +LOGB="$HOME/zion-logbook.md" +case "${1:-}" in + ""|--help|-h) + echo "Uso: zion anotar \"sua nota\" — adiciona nota datada ao logbook" + echo " zion anotar --ver — mostra o logbook" + echo "Arquivo: $LOGB" ;; + --ver|-v) + [ -r "$LOGB" ] && { command -v less >/dev/null && less -R "$LOGB" || cat "$LOGB"; } || echo "Logbook vazio ($LOGB)." ;; + *) + [ -f "$LOGB" ] || printf '# ZION TERMINAL — Logbook\nCyberdeck criado por Pablo Murad em 2026\n\n' > "$LOGB" + printf -- '- **%s** — %s\n' "$(date '+%Y-%m-%d %H:%M')" "$*" >> "$LOGB" + printf '%bNota registrada em %s%b\n' "$ZOK" "$LOGB" "$ZR" ;; +esac
@@ -0,0 +1,26 @@
+#!/usr/bin/env bash +# ZION TERMINAL - Acesso rapido a logs +# Cyberdeck criado por Pablo Murad em 2026 +export LC_ALL=C +. /opt/zion-terminal/bin/zion-lib.sh 2>/dev/null +alvo="${1:-}" +uso() { echo "Uso: zion logs [boot|ssh|tailscale|rede|kernel|falhas|zion]"; } +[ "$alvo" = "--help" ] && { uso; exit 0; } +J="journalctl --no-pager -n 60" +case "$alvo" in + boot) $J -b -p err ;; + ssh) $J -u ssh ;; + tailscale) $J -u tailscaled ;; + rede) $J -u NetworkManager ;; + kernel) $J -k ;; + falhas) systemctl --failed --no-legend; $J -p err -b ;; + zion) [ -d /opt/zion-terminal/logs ] && tail -n 60 /opt/zion-terminal/logs/*.log 2>/dev/null || echo "Sem logs do ZION ainda." ;; + ""|menu) + printf '%b LOGS — escolha:%b\n' "$ZP$ZB" "$ZR" + echo " 1) boot (erros) 2) ssh 3) tailscale 4) rede" + echo " 5) kernel 6) falhas 7) zion" + read -r -p " > " o + case "$o" in 1) exec "$0" boot;; 2) exec "$0" ssh;; 3) exec "$0" tailscale;; + 4) exec "$0" rede;; 5) exec "$0" kernel;; 6) exec "$0" falhas;; 7) exec "$0" zion;; *) echo "Cancelado.";; esac ;; + *) uso; exit 2 ;; +esac
@@ -0,0 +1,26 @@
+#!/usr/bin/env bash +# ZION TERMINAL - Topologia ASCII do tailnet +# Cyberdeck criado por Pablo Murad em 2026 +export LC_ALL=C +. /opt/zion-terminal/bin/zion-lib.sh 2>/dev/null +[ "$1" = "--help" ] && { echo "Uso: zion mapa — desenha o tailnet em arvore (peers online/offline, SO, exit nodes)."; exit 0; } +command -v tailscale >/dev/null || { echo "Tailscale nao instalado."; exit 1; } + +self=$(hostname) +printf '%b TAILNET — mapa%b\n' "$ZP$ZB" "$ZR"; zion_regua 50 +printf ' %b(%s)%b %b%s%b %s\n' "$ZA" "este" "$ZR" "$ZP$ZB" "$self" "$ZR" "$(zion_ip_ts)" +printf ' %b│%b\n' "$ZMUT" "$ZR" + +mapfile -t peers < <(tailscale status 2>/dev/null | awk '/^100\./ && $2!="'"$self"'"{print $0}') +n=${#peers[@]}; i=0 +for line in "${peers[@]}"; do + i=$((i+1)); ip=$(echo "$line" | awk '{print $1}'); name=$(echo "$line" | awk '{print $2}') + so=$(echo "$line" | awk '{print $4}'); rest=$(echo "$line" | grep -o 'offline') + [ "$i" -eq "$n" ] && ramo="└─" || ramo="├─" + if [ -n "$rest" ]; then cor=$ZMUT; st="offline"; else cor=$ZOK; st="online"; fi + printf ' %b%s%b %b%-16s%b %b%-8s%b %b%s%b\n' "$ZMUT" "$ramo" "$ZR" "$cor" "$name" "$ZR" "$ZGRY" "$so" "$ZR" "$cor" "$st" "$ZR" +done +zion_regua 50 +online=$(printf '%s\n' "${peers[@]}" | grep -vc offline) +printf ' %b%d peers · %d online · exit nodes: %s%b\n' "$ZGRY" "$n" "$online" \ + "$(tailscale status 2>/dev/null | grep -c 'offers exit node' 2>/dev/null || echo '?')" "$ZR"
@@ -0,0 +1,12 @@
+#!/usr/bin/env bash +# ZION TERMINAL - Chuva digital (Matrix) no tema atual +# Cyberdeck criado por Pablo Murad em 2026 +. /opt/zion-terminal/bin/zion-lib.sh 2>/dev/null +[ "$1" = "--help" ] && { echo "Uso: zion matrix — chuva digital estilo Matrix (q para sair)."; exit 0; } +command -v cmatrix >/dev/null || { echo "cmatrix nao instalado."; exit 1; } +case "${ZION_TEMA:-ice}" in + amber) cor=yellow ;; + green) cor=green ;; + *) cor=cyan ;; +esac +exec cmatrix -ab -u 4 -C "$cor"
@@ -0,0 +1,41 @@
+#!/usr/bin/env bash +# ZION TERMINAL - Perfis de operacao (composicoes de recursos existentes) +# Cyberdeck criado por Pablo Murad em 2026 +export LC_ALL=C +ZION_DIR="/opt/zion-terminal"; BIN="$ZION_DIR/bin" +. "$BIN/zion-lib.sh" 2>/dev/null +[ "$1" = "--help" ] && { echo "Uso: zion modo [normal|campo|manutencao|emergencia] — organiza ferramentas existentes por contexto. Sem argumento, mostra o menu."; exit 0; } + +modo="${1:-}" +[ -z "$modo" ] && { + ui_header "MODO DE OPERACAO" + ui_kv "campo" "conectividade, Tailscale, servidores favoritos" + ui_kv "manutencao" "backup sugerido, updates, doctor, falhas, logs" + ui_kv "emergencia" "war-room: recursos, gateway, Tailscale, logs" + ui_kv "normal" "abre o painel" + ui_rule + printf ' %bUse: zion modo <nome>%b\n' "$ZGRY" "$ZR"; exit 0 +} + +case "$modo" in + normal) exec "$BIN/zion-dashboard" ;; + campo) + ui_header "MODO CAMPO" + "$BIN/zion-link" + ui_section "SERVIDORES FAVORITOS" + "$BIN/zion-ssh" --favoritos 2>/dev/null || ui_info "Sem favoritos (zion ssh --favoritar <alias>)" + ui_rule; ui_info "Dica: 'zion tmux' para a sessao persistente." ;; + manutencao) + ui_header "MODO MANUTENCAO" + ui_section "AUTOTESTE"; "$BIN/zion-doctor" + ui_section "ATUALIZACOES"; ups=$(apt list --upgradable 2>/dev/null | grep -vc Listing); ui_kv "Pendentes" "$ups" + ui_section "SERVICOS EM FALHA"; systemctl --failed --no-legend | sed 's/^/ /' | grep . || ui_ok "nenhum" + ui_rule; ui_info "Backup: zion backup · Atualizar: zion atualizar (nao roda sozinho)" ;; + emergencia) + ui_header "MODO EMERGENCIA" + ui_info "Abrindo war-room (btop, logs, Tailscale, ping do gateway)…" + ui_kv "Gateway" "$(ip route show default | awk '{print $3; exit}')" + ui_kv "Tailscale" "$(zion_ip_ts)" + sleep 1; exec "$BIN/zion-panic" ;; + *) echo "Modo invalido: $modo (use campo|manutencao|emergencia|normal)"; exit 2 ;; +esac
@@ -0,0 +1,98 @@
+#!/usr/bin/env bash +# ===================================================================== +# ZION TERMINAL - MOTD (painel de inicializacao) +# Cyberdeck criado por Pablo Murad em 2026 +# --------------------------------------------------------------------- +# Blocos em caixas (SISTEMA/RECURSOS/LINKS) + boot-sequence com estados +# reais/cache. Consciente de largura e de terminais sem cor/UTF-8. +# Rapido (le cache /run/zion/status). Nao roda em scp/sftp/rsync. +# ===================================================================== +export LC_ALL=C +ZION_DIR="/opt/zion-terminal" +. "$ZION_DIR/bin/zion-lib.sh" 2>/dev/null + +cols=$(ui_cols) +anim=1; { [ -n "${ZION_NO_ANIM:-}" ] || [ ! -t 1 ] || [ "${TERM:-dumb}" = dumb ]; } && anim=0 +dumb=0; { [ "${TERM:-dumb}" = dumb ] || [ -n "${NO_COLOR:-}" ]; } && dumb=0 # cor controlada pelo tema + +# --- Boot-sequence com estados reais (<=1,5s) ---------------------- +if [ "$anim" = 1 ]; then + bs() { printf ' %b%-16s%b %b\n' "$ZDISC" "$1" "$ZR" "$(ui_state "$2")"; sleep 0.05; } + printf ' %b%s BOOT SEQUENCE%b\n' "$ZP$ZB" "$ZSYM" "$ZR" + # Nucleo: estamos rodando + bs "Nucleo" ok + # Armazenamento: root montado + uso + if mount | grep -q ' / '; then dp=$(zion_disco_pct); [ "$dp" -ge 90 ] && bs "Armazenamento" warn || bs "Armazenamento" ok; else bs "Armazenamento" crit; fi + # Rede: rota default + ip route show default 2>/dev/null | grep -q . && bs "Rede" ok || bs "Rede" warn + # Tailscale: cache + case "$(zion_cache_get TS_ESTADO)" in conectado) bs "Tailscale" ok;; parado) bs "Tailscale" warn;; *) bs "Tailscale" nd;; esac + # SSH + [ "$(systemctl is-active ssh 2>/dev/null)" = active ] && bs "SSH" ok || bs "SSH" warn + # Termico + t=$(zion_temp_c); if [ "$t" -ge 80 ]; then bs "Termico" crit; elif [ "$t" -ge 65 ]; then bs "Termico" warn; else bs "Termico" ok; fi + printf ' %bLINK ESTABELECIDO%b — %bBEM-VINDO, PABLO%b\n\n' "$ZOK$ZB" "$ZR" "$ZA" "$ZR" +fi + +# --- Logo por largura ---------------------------------------------- +logo() { + local f + if [ "${TERM:-dumb}" = dumb ]; then f="$ZION_DIR/assets/ascii/logo-completa-sem-cor.txt" + elif [ "$cols" -ge 64 ]; then f="$ZION_DIR/assets/ascii/logo-completa.txt" + elif [ "$cols" -ge 42 ]; then f="$ZION_DIR/assets/ascii/logo-media.txt" + else f="$ZION_DIR/assets/ascii/logo-compacta.txt"; fi + [ -r "$f" ] && { printf '%b' "$ZP$ZB"; sed 's/^/ /' "$f"; printf '%b' "$ZR"; } || printf ' %b%s ZION TERMINAL%b\n' "$ZP$ZB" "$ZSYM" "$ZR" +} +logo +printf ' %bCyberdeck criado por Pablo Murad em 2026%b\n\n' "$ZA" "$ZR" + +# --- Metricas ------------------------------------------------------ +W=$(( cols - 8 )); [ "$W" -gt 46 ] && W=46; [ "$W" -lt 26 ] && W=26 +so=$(. /etc/os-release; echo "Debian $VERSION_ID") +temp=$(zion_temp_c); tst=ok; [ "$temp" -ge 65 ] && tst=warn; [ "$temp" -ge 80 ] && tst=crit +tcor=$ZOK; [ "$tst" = warn ] && tcor=$ZWARN; [ "$tst" = crit ] && tcor=$ZCRIT +dp=$(zion_disco_pct); dcor=$(zion_nivel_pct "$dp") +rp=$(zion_ram_pct); rcor=$(zion_nivel_pct "$rp") +ts=$(zion_cache_get TS_ESTADO); [ -z "$ts" ] && ts=$(zion_ts_estado) +net=$(zion_cache_get INTERNET); [ -z "$net" ] && net=$(zion_internet) +falhas=$(zion_falhas) + +ui_box_top "SISTEMA" "$W" +ui_box_kv "Host" "$(hostname)" "$W" +ui_box_kv "Sistema" "$so" "$W" +ui_box_kv "Kernel" "$(uname -r | cut -d- -f1)" "$W" +ui_box_kv "Uptime" "$(zion_uptime)" "$W" +ui_box_bot "$W" + +ui_box_top "RECURSOS" "$W" +ui_box_kv "CPU" "$(zion_cpu_pct)%" "$W" +ui_box_kv "RAM" "$(zion_ram_str)" "$W" "$rcor" +ui_box_kv "Disco" "${dp}%" "$W" "$dcor" +ui_box_line "$(printf '%b%-11s%b %b%s C%b %b' "$ZDISC" "Temperatura" "$ZR" "$tcor" "$temp" "$ZR" "$(ui_state "$tst")")" "$W" +ui_box_bot "$W" + +# LINKS (mostra IP so quando cabe) +lanip=$(zion_ip_local); tsip=$(zion_ip_ts) +ipsuf() { [ "$W" -ge 38 ] && printf ' %s' "$1"; } +ui_box_top "LINKS" "$W" +ui_box_line "$(printf '%b%-11s%b %b%s' "$ZDISC" "LAN" "$ZR" "$([ -n "$lanip" ] && ui_state ok || ui_state off)" "$(ipsuf "${lanip:-—}")")" "$W" +ui_box_line "$(printf '%b%-11s%b %b' "$ZDISC" "Internet" "$ZR" "$([ "$net" = disponivel ] && ui_state ok || ui_state off)")" "$W" +ui_box_line "$(printf '%b%-11s%b %b%s' "$ZDISC" "Tailscale" "$ZR" "$([ "$ts" = conectado ] && ui_state ok || ui_state off)" "$(ipsuf "${tsip:-—}")")" "$W" +ui_box_line "$(printf '%b%-11s%b %b' "$ZDISC" "SSH" "$ZR" "$([ "$(systemctl is-active ssh 2>/dev/null)" = active ] && ui_state ok || ui_state warn)")" "$W" +ui_box_bot "$W" + +# --- Alertas (so quando houver) ------------------------------------ +alertas=() +[ "$falhas" -gt 0 ] && alertas+=("$falhas servico(s) com falha — veja: zion saude") +[ "$tst" = crit ] && alertas+=("temperatura critica: ${temp} C") +[ "$net" != disponivel ] && alertas+=("sem internet") +if [ ${#alertas[@]} -gt 0 ]; then + printf '\n'; for a in "${alertas[@]}"; do ui_warn "$a"; done +fi + +# --- Instrucao final ----------------------------------------------- +tag="Rede pronta. Terminal operacional." +printf '\n' +if [ "$anim" = 1 ]; then printf ' %b' "$ZP"; for ((i=0;i<${#tag};i++)); do printf '%s' "${tag:$i:1}"; sleep 0.005; done; printf '%b\n' "$ZR" +else printf ' %b%s%b\n' "$ZP" "$tag" "$ZR"; fi +printf ' %bDigite %b»Z» zion%b%b para abrir o painel.%b\n\n' "$ZGRY" "$ZA" "$ZR" "$ZGRY" "$ZR"
@@ -0,0 +1,33 @@
+#!/usr/bin/env bash +# ZION TERMINAL - Diagnostico de rede +# Cyberdeck criado por Pablo Murad em 2026 +export LC_ALL=C +. /opt/zion-terminal/bin/zion-lib.sh 2>/dev/null +[ "$1" = "--help" ] && { echo "Uso: zion rede [mtr] — interfaces, IPs, gateway, DNS, internet, Tailscale e (opcional) MTR."; exit 0; } + +ui_header "DIAGNOSTICO DE REDE" + +ui_section "INTERFACES" +ip -brief -4 addr | while read -r ifc st ip _; do + [ "$ifc" = lo ] && continue + printf ' %b%-12s%b %b %b%s%b\n' "$ZWHT" "$ifc" "$ZR" "$([ "$st" = UP ] && ui_state ok || ui_state off)" "$ZGRY" "$ip" "$ZR" +done + +ui_section "ROTA / GATEWAY" +gw=$(ip route show default | awk '{print $3; exit}'); dev=$(ip route show default | awk '{print $5; exit}') +ui_kv "Gateway" "${gw:-—} (via ${dev:-—})" +if [ -n "$gw" ] && ping -c1 -W1 "$gw" >/dev/null 2>&1; then printf ' %b%-14s%b %b\n' "$ZDISC" "Ping gateway" "$ZR" "$(ui_state ok)"; else printf ' %b%-14s%b %b\n' "$ZDISC" "Ping gateway" "$ZR" "$(ui_state warn)"; fi + +ui_section "DNS" +grep -h '^nameserver' /etc/resolv.conf 2>/dev/null | awk '{print $2}' | while read -r ns; do ui_kv "nameserver" "$ns"; done +printf ' %b%-14s%b %b\n' "$ZDISC" "Resolucao" "$ZR" "$(getent hosts deb.debian.org >/dev/null 2>&1 && ui_state ok || ui_state crit)" + +ui_section "CONECTIVIDADE" +printf ' %b%-14s%b %b\n' "$ZDISC" "Internet" "$ZR" "$([ "$(zion_internet)" = disponivel ] && ui_state ok || ui_state off)" +printf ' %b%-14s%b %b %b%s%b\n' "$ZDISC" "Tailscale" "$ZR" "$([ "$(zion_ts_estado)" = conectado ] && ui_state ok || ui_state off)" "$ZGRY" "$(zion_ip_ts)" "$ZR" + +if [ "${1:-}" = mtr ] || [ "${1:-}" = --mtr ]; then + ui_section "MTR -> 1.1.1.1" + ui_dep mtr && mtr -r -c3 1.1.1.1 2>/dev/null | sed 's/^/ /' +fi +ui_rule
@@ -0,0 +1,22 @@
+#!/usr/bin/env bash +# ZION TERMINAL - War-room: paineis tmux de monitoramento +# Cyberdeck criado por Pablo Murad em 2026 +export LC_ALL=C +. /opt/zion-terminal/bin/zion-lib.sh 2>/dev/null +[ "$1" = "--help" ] && { echo "Uso: zion panico — abre uma sessao tmux 'guerra' com 4 paineis: recursos (btop), logs, Tailscale e ping do gateway. Ctrl+B depois D para sair."; exit 0; } +command -v tmux >/dev/null || { echo "tmux nao instalado."; exit 1; } + +S=zion-panico +tmux has-session -t "$S" 2>/dev/null && exec tmux attach -t "$S" + +top_cmd="btop"; command -v btop >/dev/null || top_cmd="htop" +gw=$(ip route show default | awk '{print $3; exit}') + +tmux new-session -d -s "$S" -n guerra "$top_cmd" +tmux split-window -h -t "$S:0" "journalctl -f -p warning --no-hostname 2>/dev/null || journalctl -f" +tmux split-window -v -t "$S:0.1" "watch -t -n3 'tailscale status 2>/dev/null | head -20'" +tmux split-window -v -t "$S:0.0" "ping ${gw:-1.1.1.1}" +tmux select-layout -t "$S:0" tiled +tmux set-option -t "$S" status-style "bg=colour24,fg=colour231" 2>/dev/null +tmux set-option -t "$S" status-left " ZION PANICO " 2>/dev/null +exec tmux attach -t "$S"
@@ -0,0 +1,13 @@
+#!/usr/bin/env bash +# ZION TERMINAL - QR code de acesso (para o celular) +# Cyberdeck criado por Pablo Murad em 2026 +export LC_ALL=C +. /opt/zion-terminal/bin/zion-lib.sh 2>/dev/null +[ "$1" = "--help" ] && { echo "Uso: zion qr [texto] — gera QR no terminal. Sem argumento, gera o comando SSH via Tailscale para este host."; exit 0; } +command -v qrencode >/dev/null || { echo "qrencode nao instalado."; exit 1; } +user=$(whoami); ip=$(zion_ip_ts); host=$(hostname) +texto="${1:-ssh ${user}@${ip}}" +printf '%b ZION TERMINAL — QR de acesso%b\n' "$ZP$ZB" "$ZR" +printf ' %b%s%b\n\n' "$ZA" "$texto" "$ZR" +qrencode -t ANSIUTF8 -m 2 "$texto" +printf '\n %bEscaneie para copiar: %s%b\n' "$ZGRY" "$texto" "$ZR"
@@ -0,0 +1,27 @@
+#!/usr/bin/env bash +# ZION TERMINAL - Radar de latencia dos peers Tailscale +# Cyberdeck criado por Pablo Murad em 2026 +export LC_ALL=C +. /opt/zion-terminal/bin/zion-lib.sh 2>/dev/null +[ "$1" = "--help" ] && { echo "Uso: zion radar — mede a latencia (tailscale ping) de cada peer online e mostra direto/DERP com cores."; exit 0; } +command -v tailscale >/dev/null || { echo "Tailscale nao instalado."; exit 1; } + +printf '%b RADAR TAILSCALE — latencia dos peers%b\n' "$ZP$ZB" "$ZR"; zion_regua 54 +printf ' %b%-18s %-10s %-10s %s%b\n' "$ZMUT" "PEER" "VIA" "LATENCIA" "ESTADO" "$ZR" + +# peers online (linhas 100.x que nao sejam 'offline') +tailscale status 2>/dev/null | awk '/^100\./ && !/offline/ {print $1" "$2}' | while read -r pip pname; do + [ "$pname" = "$(hostname)" ] && continue + res=$(timeout 6 tailscale ping -c 1 --timeout 3s "$pname" 2>/dev/null | head -1) + if echo "$res" | grep -q "via DERP"; then + via="DERP"; ms=$(echo "$res" | grep -o 'in [0-9]*ms' | grep -o '[0-9]*'); cor=$ZWARN + elif echo "$res" | grep -q "direct"; then + via="direto"; ms=$(echo "$res" | grep -o 'in [0-9]*ms' | grep -o '[0-9]*'); cor=$ZOK + else + via="—"; ms=""; cor=$ZCRIT + fi + est=$([ -n "$ms" ] && echo "online" || echo "sem resposta") + printf ' %b%-18s%b %b%-10s %-10s %s%b\n' "$ZWHT" "$pname" "$ZR" "$cor" "$via" "${ms:+${ms}ms}" "$est" "$ZR" +done +zion_regua 54 +printf ' %bverde=direto amarelo=DERP vermelho=sem resposta%b\n' "$ZGRY" "$ZR"
@@ -0,0 +1,13 @@
+#!/usr/bin/env bash +# ZION TERMINAL - Compartilha arquivos SO na interface Tailscale +# Cyberdeck criado por Pablo Murad em 2026 +export LC_ALL=C +. /opt/zion-terminal/bin/zion-lib.sh 2>/dev/null +[ "$1" = "--help" ] && { echo "Uso: zion servir [diretorio] [porta] — servidor HTTP temporario ligado apenas ao IP do Tailscale (padrao porta 8099). Ctrl+C encerra."; exit 0; } +dir="${1:-$PWD}"; porta="${2:-8099}"; ip=$(zion_ip_ts) +[ -z "$ip" ] && { echo "Tailscale sem IP; abortando por seguranca."; exit 1; } +[ -d "$dir" ] || { echo "Diretorio inexistente: $dir"; exit 1; } +printf '%b ZION TERMINAL — compartilhando%b %s\n' "$ZP$ZB" "$ZR" "$dir" +printf ' %bAcesse pelo tailnet:%b http://%s:%s\n' "$ZA" "$ZR" "$ip" "$porta" +printf ' %b(ligado apenas a %s — nao exposto na LAN. Ctrl+C encerra.)%b\n\n' "$ZGRY" "$ip" "$ZR" +exec python3 -m http.server "$porta" --bind "$ip" --directory "$dir"
@@ -0,0 +1,65 @@
+#!/usr/bin/env bash +# ZION TERMINAL - Menu de servidores SSH (com favoritos) +# Cyberdeck criado por Pablo Murad em 2026 +export LC_ALL=C +. /opt/zion-terminal/bin/zion-lib.sh 2>/dev/null +CFG="$HOME/.ssh/config" +FAV="/opt/zion-terminal/config/ssh-favoritos.conf" + +[ "$1" = "--help" ] && { cat <<H +Uso: zion ssh menu de servidores (favoritos primeiro) + zion ssh --testar testa latencia de todos sem conectar + zion ssh --favoritos lista so os favoritos + zion ssh --favoritar <a> marca alias como favorito + zion ssh --desfavoritar <a> remove dos favoritos +Fonte dos hosts: ~/.ssh/config +H +exit 0; } + +mapfile -t hosts < <(awk 'tolower($1)=="host" && $2!~/[*?]/{for(i=2;i<=NF;i++)print $i}' "$CFG" 2>/dev/null) +existe() { local a; for a in "${hosts[@]}"; do [ "$a" = "$1" ] && return 0; done; return 1; } +is_fav() { [ -r "$FAV" ] && grep -qxF "$1" "$FAV"; } + +case "${1:-}" in + --favoritar) + [ -n "$2" ] || { echo "Informe o alias."; exit 2; } + existe "$2" || { ui_err "alias '$2' nao existe em ~/.ssh/config"; exit 1; } + is_fav "$2" && { ui_info "'$2' ja e favorito"; exit 0; } + echo "$2" >> "$FAV" 2>/dev/null || { ui_err "sem permissao para escrever em $FAV"; exit 1; } + ui_ok "'$2' adicionado aos favoritos"; exit 0 ;; + --desfavoritar) + [ -n "$2" ] || { echo "Informe o alias."; exit 2; } + [ -w "$FAV" ] && { grep -vxF "$2" "$FAV" > "$FAV.tmp" 2>/dev/null && mv "$FAV.tmp" "$FAV"; } + ui_ok "'$2' removido dos favoritos"; exit 0 ;; +esac + +if [ ${#hosts[@]} -eq 0 ]; then + ui_header "SERVIDORES SSH" + ui_info "Nenhum servidor em ~/.ssh/config." + printf ' Exemplo:\n %bHost meuserv\n HostName 100.x.y.z\n User pablo%b\n' "$ZGRY" "$ZR"; exit 0 +fi + +# ordena: favoritos primeiro +ordenados=(); for h in "${hosts[@]}"; do is_fav "$h" && ordenados+=("$h"); done +for h in "${hosts[@]}"; do is_fav "$h" || ordenados+=("$h"); done + +testar() { + local h hn lat + for h in "$@"; do + hn=$(ssh -G "$h" 2>/dev/null | awk '/^hostname /{print $2}') + lat=$(ping -c1 -W1 "$hn" 2>/dev/null | grep -o 'time=[0-9.]*' | cut -d= -f2) + printf ' %s%b%-16s%b %-22s %b\n' "$(is_fav "$h" && printf '%b★%b ' "$ZWARN" "$ZR" || printf ' ')" "$ZWHT" "$h" "$ZR" "$hn" "$([ -n "$lat" ] && printf '%b%sms%b' "$ZOK" "$lat" "$ZR" || ui_state off)" + done +} + +[ "$1" = "--testar" ] && { ui_header "SERVIDORES (teste)"; testar "${ordenados[@]}"; exit 0; } +[ "$1" = "--favoritos" ] && { ui_header "FAVORITOS"; f=0; for h in "${ordenados[@]}"; do is_fav "$h" && { printf ' %b★ %s%b\n' "$ZWARN" "$h" "$ZR"; f=1; }; done; [ "$f" = 0 ] && ui_info "Nenhum favorito ainda."; exit 0; } + +ui_header "SERVIDORES SSH" +i=0; for h in "${ordenados[@]}"; do i=$((i+1)); printf ' %b%2d)%b %s%s\n' "$ZA" "$i" "$ZR" "$(is_fav "$h" && printf '%b★%b ' "$ZWARN" "$ZR")" "$h"; done +printf ' %b 0)%b voltar\n' "$ZA" "$ZR" +read -r -p " Conectar em qual? " o +[ "$o" = 0 ] && exit 0 +[ "$o" -ge 1 ] 2>/dev/null && [ "$o" -le ${#ordenados[@]} ] || { echo "Opcao invalida."; exit 2; } +alvo="${ordenados[$((o-1))]}" +printf ' %bConectando em %s…%b\n' "$ZP" "$alvo" "$ZR"; exec ssh "$alvo"
@@ -0,0 +1,23 @@
+#!/usr/bin/env bash +# ZION TERMINAL - Resumo rapido do sistema +# Cyberdeck criado por Pablo Murad em 2026 +export LC_ALL=C +. /opt/zion-terminal/bin/zion-lib.sh 2>/dev/null +[ "$1" = "--help" ] && { echo "Uso: zion status — resumo rapido de CPU, RAM, disco, temp, rede, Tailscale, internet, servicos, uptime."; exit 0; } + +temp=$(zion_temp_c); ramused=$(zion_ram_used); rampct=$(zion_ram_pct); cpu=$(zion_cpu_pct) +ts=$(zion_ts_estado); net=$(zion_internet); falhas=$(zion_falhas) +ctemp=$(zion_nivel_temp "$temp"); cpct=$(zion_nivel_pct "$rampct") +cts=$([ "$ts" = conectado ] && printf '%b' "$ZOK" || printf '%b' "$ZWARN") +cnet=$([ "$net" = disponivel ] && printf '%b' "$ZOK" || printf '%b' "$ZWARN") +cfal=$([ "$falhas" -gt 0 ] && printf '%b' "$ZCRIT" || printf '%b' "$ZOK") + +printf '%b%s%b ' "$ZP$ZB" "${ZSYM:-»Z»}" "$ZR" +printf 'CPU %b%s%%%b ' "$(zion_nivel_pct "$cpu")" "$cpu" "$ZR" +printf 'RAM %b%s MB%b ' "$cpct" "$ramused" "$ZR" +printf 'Disco %b%s%%%b ' "$(zion_nivel_pct "$(zion_disco_pct)")" "$(zion_disco_pct)" "$ZR" +printf 'Temp %b%s°C%b ' "$ctemp" "$temp" "$ZR" +printf 'TS %b%s%b ' "$cts" "$ts" "$ZR" +printf 'Net %b%s%b ' "$cnet" "$net" "$ZR" +printf 'Falhas %b%s%b ' "$cfal" "$falhas" "$ZR" +printf 'Uptime %b%s%b\n' "$ZWHT" "$(zion_uptime)" "$ZR"
@@ -0,0 +1,36 @@
+#!/usr/bin/env bash +# ZION TERMINAL - Diagnostico do Tailscale +# Cyberdeck criado por Pablo Murad em 2026 +export LC_ALL=C +. /opt/zion-terminal/bin/zion-lib.sh 2>/dev/null +[ "$1" = "--help" ] && { echo "Uso: zion tailscale — estado, IP, MagicDNS, peers, direto/DERP, netcheck e recomendacoes."; exit 0; } +ui_dep tailscale || exit 1 + +ui_header "TAILSCALE" +ui_section "ESTADO" +printf ' %b%-14s%b %b\n' "$ZDISC" "Conexao" "$ZR" "$(tailscale status >/dev/null 2>&1 && ui_state ok || ui_state off)" +ui_kv "Versao" "$(tailscale version 2>/dev/null | head -1)" +ui_kv "IPv4" "$(tailscale ip -4 2>/dev/null | head -1)" +ui_kv "IPv6" "$(tailscale ip -6 2>/dev/null | head -1)" +ui_kv "Servico" "$(systemctl is-enabled tailscaled 2>/dev/null)/$(systemctl is-active tailscaled 2>/dev/null)" + +ui_section "PEERS" +online=$(tailscale status 2>/dev/null | awk '/^100\./ && !/offline/{c++} END{print c+0}') +total=$(tailscale status 2>/dev/null | awk '/^100\./{c++} END{print c+0}') +ui_kv "Online" "$online de $total" +tailscale status 2>/dev/null | awk '/^100\./{printf " %-16s %-10s %s\n",$2,$4,$5}' | head -10 + +ui_section "REDE (netcheck)" +nc=$(tailscale netcheck 2>/dev/null) +udp=$(echo "$nc" | awk -F': ' '/UDP/{print $2; exit}') +derp=$(echo "$nc" | grep -A20 "DERP latency" | grep -m1 "ms" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') +varies=$(echo "$nc" | awk -F': ' '/MappingVariesByDestIP/{print $2; exit}') +printf ' %b%-14s%b %b %s\n' "$ZDISC" "UDP" "$ZR" "$([ "$udp" = true ] && ui_state ok || ui_state warn)" "" +ui_kv "DERP proximo" "${derp:-?}" +printf ' %b%-14s%b %b %s\n' "$ZDISC" "NAT dificil" "$ZR" "$([ "$varies" = true ] && ui_state warn || ui_state ok)" "${varies:-?}" + +ui_section "RECOMENDACOES" +tailscale status 2>/dev/null | grep -q "advertising routes" && ui_info "Peers anunciam rotas — se precisar: tailscale set --accept-routes (nao aplicado)" +[ "$varies" = true ] && ui_info "NAT dificil: fora da LAN tende a DERP-SP (~19ms). Normal." +ui_info "Teste um peer: zion radar ou tailscale ping <host>" +ui_rule
@@ -0,0 +1,23 @@
+#!/usr/bin/env bash +# ZION TERMINAL - Troca o tema de cores (prompt/MOTD/painel/tmux/matrix) +# Cyberdeck criado por Pablo Murad em 2026 +export LC_ALL=C +. /opt/zion-terminal/bin/zion-lib.sh 2>/dev/null +t="${1:-}" +case "$t" in + ice|amber|green) + printf 'ZION_TEMA=%s\n' "$t" > "$HOME/.zion-tema" + # Regenera e recarrega o tema do tmux + /opt/zion-terminal/bin/zion-tmux-theme -q 2>/dev/null + ui_ok "Tema alterado para: $t" + ui_info "Prompt/MOTD/painel: vale em novas sessoes (ou: source ~/.bashrc)" + ui_info "tmux: aplicado agora, se houver sessao ativa" ;; + ""|--help|-h) + ui_header "TEMA" + ui_kv "Atual" "${ZION_TEMA:-ice}" + ui_kv "ice" "Ice DERP-blue (ciano/azul, padrao)" + ui_kv "amber" "Amber CRT (ambar retro)" + ui_kv "green" "Zion Green (verde fosforo)" + ui_rule; printf ' %bUso: zion tema [ice|amber|green]%b\n' "$ZGRY" "$ZR" ;; + *) ui_err "Tema invalido: $t (use ice, amber ou green)"; exit 2 ;; +esac
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash +# ZION TERMINAL - status-right do tmux (leve, sem chamadas lentas) +# Cyberdeck criado por Pablo Murad em 2026 +export LC_ALL=C +t=$(cat /sys/class/thermal/thermal_zone0/temp 2>/dev/null); t=$((t/1000)) +load=$(cut -d' ' -f1 /proc/loadavg) +ts=$(sed -n 's/^TS_ESTADO=//p' /run/zion/status 2>/dev/null) +case "$ts" in conectado) tsl="TS on";; parado) tsl="TS off";; *) tsl="TS ?";; esac +printf '%s · carga %s · %s°C · %s' "$tsl" "$load" "$t" "$(date '+%H:%M')"
@@ -0,0 +1,27 @@
+#!/usr/bin/env bash +# ZION TERMINAL - Gera o tema do tmux a partir do tema ativo do ZION +# Cyberdeck criado por Pablo Murad em 2026 +# Escreve ~/.tmux-zion-tema.conf e recarrega se houver servidor tmux. +export LC_ALL=C +[ -r "$HOME/.zion-tema" ] && . "$HOME/.zion-tema" 2>/dev/null +tema="${ZION_TEMA:-ice}" +case "$tema" in + amber) bg=94; fg=231; abg=172; afg=16; pa=214; pb=94 ;; + green) bg=22; fg=231; abg=34; afg=16; pa=46; pb=22 ;; + *) bg=24; fg=231; abg=39; afg=16; pa=51; pb=24 ;; +esac +OUT="$HOME/.tmux-zion-tema.conf" +cat > "$OUT" <<EOF +# ZION TERMINAL - tema tmux ($tema) - gerado automaticamente +set -g status-style "bg=colour$bg,fg=colour$fg" +set -g window-status-current-style "bg=colour$abg,fg=colour$afg,bold" +set -g pane-active-border-style "fg=colour$pa" +set -g pane-border-style "fg=colour$pb" +set -g message-style "bg=colour$abg,fg=colour$afg" +set -g status-left " #[bold]»Z»#[nobold] #S " +set -g status-left-length 24 +set -g status-right "#(/opt/zion-terminal/bin/zion-tmux-status) " +set -g status-right-length 60 +EOF +tmux source-file "$OUT" 2>/dev/null +[ "${1:-}" = "-q" ] || echo "tema tmux '$tema' aplicado ($OUT)"
@@ -0,0 +1,47 @@
+#!/usr/bin/env bash +# ZION TERMINAL - Remocao das personalizacoes (reversao) +# Cyberdeck criado por Pablo Murad em 2026 +# Uso: sudo zion-uninstall [--dry-run] +# Preserva: ~/.ssh/config, chaves, backups e /opt/zion-terminal/docs. +DRY=0; [ "$1" = "--dry-run" ] && DRY=1 +[ "$DRY" = 0 ] && [ "$(id -u)" -ne 0 ] && { echo "Rode como root: sudo $0"; exit 1; } +BK=/opt/zion-terminal/backups + +act() { if [ "$DRY" = 1 ]; then echo " [dry-run] $*"; else eval "$*"; fi; } +echo "== Remocao das personalizacoes do ZION TERMINAL ${DRY:+(simulacao)} ==" +[ "$DRY" = 1 ] && echo "(--dry-run: nada sera alterado)" + +echo "- Ganchos de shell (profile.d, .bashrc)" +act "rm -f /etc/profile.d/zzz-zion-motd.sh /etc/profile.d/zzz-zion-aliases.sh" +act "sed -i '/bashrc-zion.sh/d; /# ZION TERMINAL/d' /home/pablo/.bashrc" + +echo "- Prompt/tema do usuario" +act "rm -f /home/pablo/.tmux-zion-tema.conf" +# ~/.zion-tema e ~/.zion-sem-* sao preferencias do usuario: +act "rm -f /home/pablo/.zion-tema /home/pablo/.zion-sem-prompt /home/pablo/.zion-sem-motd /home/pablo/.zion-sem-tmux" + +echo "- Restaurar .bash_profile pre-ZION (se houver backup)" +last_bp=$(ls -t /home/pablo/.bash_profile.bak.* 2>/dev/null | tail -1) +[ -n "$last_bp" ] && act "cp -a '$last_bp' /home/pablo/.bash_profile" || echo " (sem backup de .bash_profile)" + +echo "- Comando principal e timer de coleta" +act "rm -f /usr/local/bin/zion" +act "systemctl disable --now zion-collect.timer" +act "rm -f /etc/systemd/system/zion-collect.timer /etc/systemd/system/zion-collect.service" +act "systemctl daemon-reload" + +echo "- Config do tmux do usuario (restaura se houver backup)" +act "rm -f /home/pablo/.tmux.conf" + +if [ "$DRY" = 0 ]; then + read -r -p "Reverter a rotacao da tela (remover fbcon=rotate)? [s/N]: " r + [ "$r" = s ] && sed -i 's/ fbcon=rotate:[0-9]//' /boot/orangepiEnv.txt && echo " rotacao revertida (efetivo no reboot)" +else + echo " [dry-run] (perguntaria sobre reverter fbcon=rotate em /boot/orangepiEnv.txt)" +fi + +echo +echo "PRESERVADOS: ~/.ssh/config, chaves SSH, $BK (backups), /opt/zion-terminal/docs, matrix.py" +echo "A pasta /opt/zion-terminal permanece (remova manualmente se desejar: sudo rm -rf /opt/zion-terminal)." +echo "MOTD antigo (pam_motd) segue desativado; para reativar edite /etc/pam.d/sshd e login." +[ "$DRY" = 1 ] && echo "== Fim da simulacao (nenhuma alteracao feita) =="
@@ -0,0 +1,26 @@
+#!/usr/bin/env bash +# ZION TERMINAL - Atualizacao segura do sistema +# Cyberdeck criado por Pablo Murad em 2026 +export LC_ALL=C +. /opt/zion-terminal/bin/zion-lib.sh 2>/dev/null +LOG=/opt/zion-terminal/logs/update.log +[ "$1" = "--help" ] && { echo "Uso: zion atualizar — atualiza indices, mostra o que sera atualizado, pede confirmacao e aplica (respeitando o hold do kernel). Registra em $LOG."; exit 0; } + +printf '%b ZION TERMINAL — Atualizacao%b\n' "$ZP$ZB" "$ZR"; zion_regua 50 +echo " Atualizando indices (apt update)..." +sudo apt-get update -qq 2>/dev/null + +mapfile -t ups < <(apt list --upgradable 2>/dev/null | grep -v Listing) +n=${#ups[@]} +if [ "$n" -eq 0 ]; then printf ' %bSistema ja atualizado. Nada a fazer.%b\n' "$ZOK" "$ZR"; exit 0; fi +printf ' %b%d pacote(s) a atualizar:%b\n' "$ZWARN" "$n" "$ZR" +printf ' • %s\n' "${ups[@]:0:20}" +[ "$n" -gt 20 ] && echo " ... e mais $((n-20))" +echo " (kernel/BSP em hold NAO serao tocados: $(apt-mark showhold | tr '\n' ' '))" +read -r -p "$(printf '%b Aplicar atualizacoes? [s/N]:%b ' "$ZWARN" "$ZR")" r +[ "$r" = s ] || [ "$r" = S ] || { echo " Cancelado."; exit 0; } + +echo " Aplicando..." +sudo DEBIAN_FRONTEND=noninteractive apt-get -y upgrade 2>&1 | tee -a "$LOG" | grep -iE "Setting up|Removing|newly" | sed 's/^/ /' +printf '[%s] update aplicado (%d pacotes)\n' "$(date '+%F %T')" "$n" >> "$LOG" +if [ -f /var/run/reboot-required ]; then printf ' %b● Reinicializacao recomendada.%b\n' "$ZWARN" "$ZR"; else printf ' %b● Concluido. Reboot nao necessario.%b\n' "$ZOK" "$ZR"; fi
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash +# ZION TERMINAL - Monitora um host remoto via SSH +# Cyberdeck criado por Pablo Murad em 2026 +export LC_ALL=C +. /opt/zion-terminal/bin/zion-lib.sh 2>/dev/null +host="${1:-}" +[ -z "$host" ] || [ "$host" = "--help" ] && { echo "Uso: zion observar <host> — mostra uptime/carga/memoria/disco do host remoto via SSH, atualizando a cada 5s (Ctrl+C sai)."; exit 0; } +printf '%b Observando %s (Ctrl+C para sair)%b\n' "$ZP$ZB" "$host" "$ZR"; sleep 1 +exec watch -t -n5 "ssh -o ConnectTimeout=8 -o BatchMode=yes '$host' 'echo HOST: \$(hostname); uptime; echo; free -h | head -2; echo; df -h / | tail -1' 2>&1"
@@ -0,0 +1,43 @@
+# ===================================================================== +# ZION TERMINAL - Ambiente interativo (aliases + prompt) +# Cyberdeck criado por Pablo Murad em 2026 +# Carregado pelo ~/.bashrc. Desative o prompt com: touch ~/.zion-sem-prompt +# ===================================================================== +case $- in *i*) ;; *) return ;; esac +[ -n "${ZION_BASHRC_LOADED:-}" ] && return; ZION_BASHRC_LOADED=1 + +. /opt/zion-terminal/config/tema.sh 2>/dev/null + +# --- Aliases do ZION --- +alias zz='zion' +alias zstatus='zion status'; alias znet='zion rede'; alias ztail='zion tailscale' +alias zssh='zion ssh'; alias zlogs='zion logs'; alias zupdate='zion atualizar' +alias ztemp='zion saude'; alias zdisco='df -h /'; alias zservicos='systemctl --failed' +alias ztmux='zion tmux'; alias zmatrix='zion matrix'; alias zdoctor='zion doctor' +alias zlink='zion link'; alias zmodo='zion modo' +alias ll='ls -alh --color=auto'; alias la='ls -A --color=auto' +command -v fdfind >/dev/null && alias fd='fdfind' +command -v batcat >/dev/null && alias bat='batcat' + +# --- Prompt autoral (segue o tema, mostra git-sujo/root/erro) -------- +_zion_prompt() { + local ec=$? + if [ -e "$HOME/.zion-sem-prompt" ]; then PS1='\u@\h:\w\$ '; return; fi + if [ "${TERM:-dumb}" = dumb ]; then PS1='zion> '; return; fi + local temp gcor branch gi ecd uc mark tema + temp=$(cat /sys/class/thermal/thermal_zone0/temp 2>/dev/null); temp=$((temp/1000)) + if [ "$temp" -ge 80 ]; then gcor="$ZCRIT" + elif [ "$temp" -ge 65 ]; then gcor="$ZWARN" + else gcor="$ZOK"; fi + branch=$(git symbolic-ref --short HEAD 2>/dev/null || git rev-parse --short HEAD 2>/dev/null) + if [ -n "$branch" ]; then + local mk cor + if git diff --quiet --ignore-submodules HEAD 2>/dev/null; then mk='✓'; cor="$ZOK"; else mk='✗'; cor="$ZWARN"; fi + gi=" \[$ZDISC\][\[$ZS\]${branch}\[$ZDISC\] \[$cor\]${mk}\[$ZDISC\]]\[$ZR\]" + fi + [ "$ec" -ne 0 ] && ecd=" \[$ZCRIT\]✗${ec}\[$ZR\]" + uc="$ZA"; mark='❯' + [ "$(id -u)" -eq 0 ] && { uc="$ZCRIT"; mark='#'; } + PS1="\[$ZP$ZB\]$ZSYM\[$ZR\] \[$uc\]ZION:\u\[$ZR\] \[$ZDISC\]\w\[$ZR\]${gi} \[$gcor\]${temp}°\[$ZR\]${ecd}\n\[$ZP\]${mark}\[$ZR\] " +} +if [ "${TERM:-dumb}" != dumb ]; then PROMPT_COMMAND=_zion_prompt; else PS1='zion> '; fi
@@ -0,0 +1,8 @@
+# ===================================================================== +# ZION TERMINAL - Servidores (referencia) +# Cyberdeck criado por Pablo Murad em 2026 +# --------------------------------------------------------------------- +# Os servidores do ZION sao lidos diretamente do seu ~/.ssh/config +# (comando: zion ssh). Configure-os la, um bloco "Host" por servidor. +# Este arquivo serve apenas como lembrete/documentacao. +# =====================================================================
@@ -0,0 +1,22 @@
+# ===================================================================== +# ZION TERMINAL - Configuracao do cliente SSH +# Cyberdeck criado por Pablo Murad em 2026 +# Valores conservadores: reconexao rapida + multiplexacao. Nada inseguro. +# Adicione seus servidores no final deste arquivo. +# ===================================================================== +Host * + ServerAliveInterval 30 + ServerAliveCountMax 3 + ConnectTimeout 10 + TCPKeepAlive yes + HashKnownHosts yes + AddKeysToAgent yes + ControlMaster auto + ControlPath ~/.ssh/cm-%r@%h:%p + ControlPersist 5m + +# --- Seus servidores (exemplo; remova o # e ajuste) ------------------ +# Host meuservidor +# HostName 100.x.y.z # IP do Tailscale ou DNS +# User pablo +# # IdentityFile ~/.ssh/id_ed25519
@@ -0,0 +1,52 @@
+#!/usr/bin/env bash +# ===================================================================== +# ZION TERMINAL - Tema de cores (paleta completa) +# Cyberdeck criado por Pablo Murad em 2026 +# --------------------------------------------------------------------- +# Paleta padrao: "ice" (Ice DERP-blue). Alternativas: "amber", "green". +# Persistencia: /opt/zion-terminal/config/tema.conf (sistema) e depois +# ~/.zion-tema (override do usuario; escrito por 'zion tema'). +# Respeita NO_COLOR, TERM=dumb e ausencia de TTY (escape: ZION_FORCE_COLOR=1). +# --------------------------------------------------------------------- +# Variaveis exportadas (uma paleta completa): +# ZP primaria ZS secundaria ZA acento ZMUT neutra/apagada +# ZBRD borda ZDISC discreto ZOK sucesso ZWARN atencao +# ZCRIT critico ZWHT texto forte ZGRY texto fraco ZR reset ZB bold ZDIM dim +# ===================================================================== + +[ -r /opt/zion-terminal/config/tema.conf ] && . /opt/zion-terminal/config/tema.conf 2>/dev/null +[ -r "$HOME/.zion-tema" ] && . "$HOME/.zion-tema" 2>/dev/null +ZION_TEMA="${ZION_TEMA:-ice}" + +zion_tem_cor() { + [ -n "${NO_COLOR:-}" ] && return 1 + [ "${TERM:-dumb}" = "dumb" ] && return 1 + [ -t 1 ] || [ "${ZION_FORCE_COLOR:-0}" = "1" ] || return 1 + return 0 +} + +if zion_tem_cor; then + ZR='\033[0m'; ZB='\033[1m'; ZDIM='\033[2m' + case "$ZION_TEMA" in + amber) # Amber CRT + ZP='\033[38;5;214m'; ZS='\033[38;5;172m'; ZA='\033[38;5;223m' + ZMUT='\033[38;5;94m'; ZBRD='\033[38;5;130m'; ZDISC='\033[38;5;180m' ;; + green) # Zion Green (fosforo) + ZP='\033[38;5;46m'; ZS='\033[38;5;34m'; ZA='\033[38;5;120m' + ZMUT='\033[38;5;28m'; ZBRD='\033[38;5;22m'; ZDISC='\033[38;5;108m' ;; + *) # ice (Ice DERP-blue) - padrao + ZP='\033[38;5;51m'; ZS='\033[38;5;39m'; ZA='\033[38;5;123m' + ZMUT='\033[38;5;66m'; ZBRD='\033[38;5;24m'; ZDISC='\033[38;5;110m' ;; + esac + # Semaforo de saude (consistente entre temas) + ZOK='\033[38;5;42m'; ZWARN='\033[38;5;220m'; ZCRIT='\033[38;5;196m' + ZWHT='\033[38;5;255m'; ZGRY='\033[38;5;245m' +else + ZR=''; ZB=''; ZDIM=''; ZP=''; ZS=''; ZA=''; ZMUT=''; ZBRD=''; ZDISC='' + ZOK=''; ZWARN=''; ZCRIT=''; ZWHT=''; ZGRY='' +fi + +# Simbolo oficial (ASCII em TERM=dumb) +if [ "${TERM:-dumb}" = dumb ] || [ -n "${ZION_ASCII:-}" ]; then ZSYM='>>Z>>'; else ZSYM='»Z»'; fi + +export ZION_TEMA
@@ -0,0 +1,36 @@
+# ===================================================================== +# ZION TERMINAL - Configuracao do tmux (cyberdeck) +# Cyberdeck criado por Pablo Murad em 2026 · Prefixo: Ctrl+B +# ===================================================================== +set -g default-terminal "tmux-256color" +set -ga terminal-overrides ",*256col*:Tc" +set -g mouse on +set -g history-limit 50000 +setw -g mode-keys vi +set -g base-index 1 +setw -g pane-base-index 1 +set -sg escape-time 10 +set -g renumber-windows on +set -g status-interval 10 + +# Divisoes intuitivas +bind | split-window -h +bind - split-window -v + +# --- Tema (segue 'zion tema'): gerado em ~/.tmux-zion-tema.conf ------ +# Fallback (tema ice) caso o arquivo ainda nao exista: +set -g status-style "bg=colour24,fg=colour231" +set -g status-left " #[bold]»Z»#[nobold] #S " +set -g status-left-length 24 +set -g status-right "#(/opt/zion-terminal/bin/zion-tmux-status) " +set -g status-right-length 60 +set -g window-status-current-style "bg=colour39,fg=colour16,bold" +set -g pane-active-border-style "fg=colour51" +set -g pane-border-style "fg=colour24" +set -g message-style "bg=colour39,fg=colour16" +if-shell "test -f ~/.tmux-zion-tema.conf" "source-file ~/.tmux-zion-tema.conf" + +# --- Persistencia de sessoes (tmux-resurrect) ----------------------- +if-shell "test -f /opt/zion-terminal/assets/tmux-resurrect/resurrect.tmux" \ + "run-shell /opt/zion-terminal/assets/tmux-resurrect/resurrect.tmux" +# Salvar: Ctrl+B Ctrl+S · Restaurar: Ctrl+B Ctrl+R
@@ -0,0 +1,71 @@
+# ZION TERMINAL + +Cyberdeck criado por Pablo Murad em 2026. + +Terminal portátil dedicado à administração de infraestrutura, construído sobre uma +**Orange Pi CM4** (Rockchip RK3566, Debian 12). Não é um desktop de uso geral: é um +**field terminal** — rápido, enxuto, confiável e com identidade própria. + +## Objetivo + +Acessar servidores por SSH, administrar a rede Tailscale, diagnosticar rede, +acompanhar CPU/RAM/disco/temperatura, executar manutenção, usar Git e manter +sessões persistentes — tudo em terminal, em português, com baixo consumo. + +## Hardware + +- Orange Pi CM4 — Rockchip RK3566, 4× Cortex-A55 @1.8GHz, 8 GB RAM, arm64. +- Tela local 400×1280 (girada para paisagem via `fbcon=rotate:1`). +- Rede: Ethernet + Tailscale (VPN essencial). Wi-Fi desligado. + +## Comandos principais + +| Comando | O que faz | +|---------|-----------| +| `zion` | Abre o painel (dashboard) | +| `zion status` | Resumo rápido (CPU/RAM/disco/temp/rede/Tailscale) | +| `zion saude` | Saúde detalhada com níveis normal/atenção/crítico | +| `zion rede` | Diagnóstico de rede | +| `zion tailscale` | Estado e diagnóstico do Tailscale | +| `zion ssh` | Menu de servidores (lê `~/.ssh/config`) | +| `zion doctor` | Autoteste (POST) verde/vermelho | +| `zion radar` / `zion mapa` | Latência dos peers / topologia do tailnet | +| `zion panico` | War-room: painéis tmux de monitoramento | +| `zion qr` | QR code de acesso para o celular | +| `zion manual` | Manual de campo offline | +| `zion anotar "nota"` | Logbook de operações | +| `zion servir [dir]` | Compartilha arquivos só no Tailscale | +| `zion travar` | Trava o terminal (vlock) | +| `zion observar HOST` | Monitora um host remoto via SSH | +| `zion tema [ice/amber/green]` | Troca o tema de cores | +| `zion matrix` | Chuva digital (Matrix) | +| `zion atualizar` / `zion backup` / `zion logs` / `zion info` | Manutenção | +| `zion desligar` / `zion reiniciar` | Energia (com confirmação) | + +Aliases: `zz zstatus znet ztail zssh zlogs zupdate ztemp zdisco zservicos ztmux zmatrix zdoctor`. + +Digite `zion --help` para a lista completa. + +## Estrutura + +``` +/opt/zion-terminal/ +├── bin/ comandos e biblioteca (zion-*, zion-lib.sh) +├── config/ tema, ssh_config, tmux.conf, bashrc-zion.sh +├── assets/ banners ASCII, tmux-resurrect +├── docs/ esta documentação +├── logs/ logs do ZION + metricas.csv (ring-buffer) +├── backups/ backups datados +└── VERSION / CREATOR +``` + +## Manutenção, backup e recuperação + +- Atualizar: `zion atualizar` (kernel/BSP ficam em *hold*, não são tocados). +- Backup: `zion backup` (sem chaves privadas por padrão) → `/opt/zion-terminal/backups/`. +- Restaurar: `zion backup --restaurar <arquivo>`. +- Remover tudo: `sudo /opt/zion-terminal/bin/zion-uninstall` (restaura MOTD/PAM/shell). + +Veja também: `comandos.md`, `tailscale.md`, `ssh.md`, `tmux.md`, `motd.md`, +`backup.md`, `restauracao.md`, `seguranca.md`, `solucao-de-problemas.md`, +`otimizacoes-boot.md`, `alteracoes-realizadas.md`, `relatorio-final.md`.
@@ -0,0 +1,31 @@
+# Alterações realizadas (ZION TERMINAL) + +## Identidade e idioma +- Locale pt_BR.UTF-8 gerado; LANG=pt_BR.UTF-8, LC_TIME/LC_MONETARY=pt_BR (LC_MESSAGES=en_US p/ diagnósticos estáveis). +- Timezone America/Sao_Paulo. +- Tela girada para paisagem: `fbcon=rotate:1` em /boot/orangepiEnv.txt. + +## MOTD +- Desativado o MOTD antigo (pam_motd comentado, scripts vendor sem +x). +- Novo MOTD via /etc/profile.d/zzz-zion-motd.sh → /opt/zion-terminal/bin/zion-motd. + +## Comandos +- /usr/local/bin/zion + 27 subcomandos em /opt/zion-terminal/bin/. +- Aliases e prompt via /opt/zion-terminal/config/bashrc-zion.sh (ligado no ~/.bashrc) + e /etc/profile.d/zzz-zion-aliases.sh. + +## SSH e tmux +- ~/.ssh/config novo (keepalive + multiplexação). +- ~/.tmux.conf (tema Ice, mouse, history 50k, tmux-resurrect). +- Auto-resume tmux no console local (~/.bash_profile). + +## systemd +- zion-collect.service + zion-collect.timer (60s) — cache do MOTD + ring-buffer. + +## Pacotes +- Instalados: btop mtr-tiny nmap tcpdump traceroute ncdu tree fd-find whois ethtool iotop nload cmatrix qrencode vlock. + +## Outras +- Matrix Rain automático no boot (tela local) DESATIVADO a pedido (matrix.py preservado). +- Backups datados em /opt/zion-terminal/backups/. +- Reversão: /opt/zion-terminal/bin/zion-uninstall.
@@ -0,0 +1,60 @@
+================================================================== + ZION TERMINAL - AUDITORIA INICIAL + Cyberdeck criado por Pablo Murad em 2026 + Gerado em: 2026-07-31 15:56:21 UTC +================================================================== + +### SISTEMA +Modelo........: Rockchip RK3566 Orange Pi CM4 Board +Distribuicao..: Debian GNU/Linux 12 (bookworm) +Kernel........: 5.10.160-rockchip-rk356x +Arquitetura...: aarch64 +Hostname......: zion +Usuario.......: pablo (shell: /bin/bash) +Locale........: LANG=en_US.UTF-8 +Timezone......: Etc/UTC + +### CPU / MEMORIA +CPU...........: Cortex-A55 x4 +Governor......: ondemand +Freq atual....: 1800 MHz + total used free shared buff/cache available + Mem: 7.5Gi 611Mi 5.4Gi 3.2Mi 1.6Gi 6.9Gi + Swap: 3.8Gi 0B 3.8Gi +swappiness....: 100 + +### TEMPERATURA + soc-thermal: 64C + gpu-thermal: 62C + +### ARMAZENAMENTO + Filesystem Size Used Avail Use% Mounted on + /dev/mmcblk1p2 232G 3.1G 226G 2% / + +### REDE + lo UNKNOWN 127.0.0.1/8 + end1 UP 192.168.50.110/24 + tailscale0 UNKNOWN 100.82.23.90/32 + rota: default via 192.168.50.1 dev end1 proto dhcp src 192.168.50.110 metric 100 + DNS.: 100.100.100.100 fd7a:115c:a1e0::53 + +### TAILSCALE + versao: 1.98.10 + IPv4..: 100.82.23.90 + estado: 100.82.23.90 zion pablo@ linux - + +### SERVICOS + rodando: 15 + falhas.: 0 + ssh=enabled tailscaled=enabled chrony=enabled + +### BOOT (baseline antes do ZION) + Startup finished in 6.906s (kernel) + 13.407s (userspace) = 20.314s + graphical.target reached after 13.338s in userspace. + +### PACOTES + atualizaveis: 0 + em hold.....: linux-dtb-legacy-rockchip-rk356x linux-image-legacy-rockchip-rk356x linux-u-boot-orangepicm4-legacy orangepi-bsp-cli-orangepicm4 orangepi-firmware wiringpi + +================================================================== +Fim da auditoria inicial.
@@ -0,0 +1,19 @@
+# Auditoria visual (estado antes do refinamento) + +Levantamento read-only que embasou a Fase 2. Principais achados: + +- Biblioteca só em `bin/zion-lib.sh` (sem `lib/`); faltavam cabeçalho padrão, + estados rotulados, caixas, formatação de bytes/duração, confirmar, timeout, log. +- Helpers duplicados: `sec()`+`ok()` idênticos em `zion-net` e `zion-tailscale`; + `linha()`/`p()`/`chk()`/`lbl()` reimplementados em 4–5 scripts. +- Réguas de largura fixa (50/54/66/40), nenhuma via `zion_cols`; sem fallback <60 col. +- Estado só por cor (exceto `zion-doctor`) → ilegível em `TERM=dumb`/`NO_COLOR`. +- Tema sem cor de borda/discreto; persistência divergente (tema.conf vs ~/.zion-tema). +- tmux com cores fixas fora do tema; `zion-tmux-status` monocromático. +- Prompt sem git-sujo, sem indicador de root, sem tema, sem opt-out. +- Dashboard com menu plano 1–15 (sem grupos). +- SSH sem favoritos; `ssh-favoritos.conf` inexistente. +- Bateria: hardware não expõe telemetria (só ventoinha/térmico). +- Desinstalador sem `--dry-run`. + +Todos esses pontos foram tratados na Fase 2 (ver `refinamento-visual.md`).
@@ -0,0 +1,11 @@
+# Backup e recuperação + +- `zion backup` — cria `/opt/zion-terminal/backups/zion-backup-DATA.tar.gz` + (bin, config, docs, assets, motd, ssh/tmux config, lista de pacotes, units). + **Não inclui chaves privadas** por padrão. +- `zion backup --com-chaves` — inclui chaves SSH privadas (exige confirmação; + arquivo salvo com permissão 600). +- `zion backup --restaurar <arquivo>` — restaura (pede confirmação). +- `zion backup --para <peer>` — envia o último backup a um peer Tailscale via rsync. + +Remoção total do ZION: `sudo /opt/zion-terminal/bin/zion-uninstall`.
@@ -0,0 +1,26 @@
+# Bateria e energia + +## Situação neste hardware (Orange Pi CM4) + +Auditoria de `/sys/class/power_supply/`, `hwmon` e I2C confirmou: + +- **Não há telemetria de bateria/UPS/USB-C** — `/sys/class/power_supply/` está vazio + (o CM4 não possui PMIC de bateria exposto). `i2c-tools` não está instalado. +- Sensores de hardware presentes: **2 zonas térmicas** + **ventoinha PWM** (`hwmon/pwm-fan`). + Nenhum sensor de tensão/corrente. + +Por isso o ZION **não inventa** dados de bateria. Onde faria sentido, mostra: +`Bateria: telemetria indisponível`. O `zion saude` expõe o estado real da **ventoinha** +(PWM), quando legível. + +## Como adicionar telemetria real no futuro + +Para medir energia de verdade, adicione hardware por I²C e habilite `i2c-tools`: + +- **INA219/INA226** (medidor de tensão/corrente) no barramento I²C. +- Um **UPS HAT** com controlador I²C (vários expõem capacidade/tensão em `/sys` ou via lib). + +Depois de instalar (`sudo apt install i2c-tools`, `i2cdetect -y <bus>`), a leitura pode +ser integrada a `zion status`, `zion saude`, ao MOTD e ao `zion modo campo`. + +Nunca controle carregamento/GPIO sem identificar o hardware com certeza.
@@ -0,0 +1,33 @@
+# Comandos do ZION TERMINAL + +Todos os comandos aceitam `--help` e retornam código de saída apropriado. + +## Núcleo +- `zion` — painel interativo (dashboard). +- `zion status` — resumo em uma linha. +- `zion saude` — temperatura, freq, carga, RAM, swap, disco, erros, serviços, rede. +- `zion rede [mtr]` — interfaces, IPs, gateway, DNS, internet, Tailscale. +- `zion tailscale` — estado, peers, netcheck (UDP/DERP/NAT), recomendações. +- `zion ssh [--testar]` — menu de servidores (lê `~/.ssh/config`). +- `zion logs [alvo]` — boot/ssh/tailscale/rede/kernel/falhas/zion. +- `zion atualizar` — update seguro (respeita hold do kernel). +- `zion backup [--restaurar|--para|--com-chaves]` — backup/restauração. +- `zion info` — identidade, hardware, versões. +- `zion tmux` — cria/anexa a sessão `zion`. + +## Extras +- `zion doctor` — autoteste POST (código de saída = nº de falhas). +- `zion radar` — latência dos peers (direto/DERP). +- `zion mapa` — topologia do tailnet. +- `zion panico` — war-room tmux (btop, logs, tailscale, ping). +- `zion qr [texto]` — QR no terminal. +- `zion manual [tópico]` — guia offline (tmux/ssh/git/tailscale/zion). +- `zion anotar "nota" | --ver` — logbook (`~/zion-logbook.md`). +- `zion servir [dir] [porta]` — HTTP só na interface Tailscale. +- `zion travar` — vlock. +- `zion observar HOST` — monitor remoto via SSH. +- `zion tema [ice|amber|green]` — troca cores. +- `zion matrix` — chuva digital. + +## Energia +- `zion desligar` / `zion reiniciar` — com confirmação.
@@ -0,0 +1,51 @@
+# ZION TERMINAL — Identidade visual + +Cyberdeck criado por Pablo Murad em 2026. + +## Símbolo oficial: »Z» (Uplink Chevrons) + +O símbolo do ZION são **chevrons de uplink** (`»`) enquadrando o **Z** de ZION. +Significado: um **link sendo estabelecido** — sinal fluindo para frente, transmissão, +conexão de campo. É a assinatura visual do equipamento em toda parte. + +### Variantes (em `/opt/zion-terminal/assets/ascii/`) + +| Arquivo | Uso | +|---|---| +| `simbolo-minimo.txt` → `»Z»` | inline: prompts, cabeçalhos, status bar do tmux, rodapés | +| `simbolo-compacto.txt` (3 linhas) | emblema isolado, telas muito estreitas | +| `logo-completa.txt` | MOTD/painel em ≥64 colunas (figlet emoldurado por chevrons) | +| `logo-media.txt` | 60–79 colunas (toilet future) | +| `logo-compacta.txt` | <60 colunas (símbolo + nome) | +| `logo-completa-sem-cor.txt` | `TERM=dumb` / sem UTF-8 (ASCII puro, `>>` no lugar de `»`) | + +Regra: use **um** logo por tela (topo), e o símbolo mínimo `»Z»` como assinatura +inline. Não repita o crédito em toda tela — só em MOTD, painel, `zion info`, manual e +documentação. + +## Cores por tema + +Cada tema define uma paleta completa (`config/tema.sh`): principal (`ZP`), secundária +(`ZS`), acento (`ZA`), neutra (`ZMUT`), **borda** (`ZBRD`), **discreto** (`ZDISC`), +sucesso (`ZOK`), atenção (`ZWARN`), crítico (`ZCRIT`), texto forte/fraco (`ZWHT`/`ZGRY`). + +| Tema | Principal | Secundária | Borda | Espírito | +|---|---|---|---|---| +| **ice** (padrão) | ciano 51 | azul 39 | azul-frio 24 | rede/telemetria | +| **amber** | âmbar 214 | laranja 172 | bronze 130 | CRT retrô | +| **green** | verde 46 | verde 34 | verde-escuro 22 | terminal fósforo | + +O semáforo (OK/ATENÇÃO/CRÍTICO) é consistente entre temas (verde/amarelo/vermelho), +mas **sempre** acompanhado de rótulo textual (acessível sem cor). + +## Espaçamento e largura + +- Todas as telas usam **2 espaços de recuo** à esquerda. +- Largura via `ui_w` (dinâmica, com teto), nunca fixa. Réguas com `ui_rule`. +- Estados via `ui_state` (rótulo + cor). Caixas via `ui_box_top/line/kv/bot`. + +## Fallback sem cor + +Com `NO_COLOR`, `TERM=dumb` ou sem TTY, todas as variáveis de cor viram vazio e o +logo cai para `logo-completa-sem-cor.txt`. O layout permanece legível: os estados são +distinguíveis pelo texto (OK, ATENÇÃO, CRÍTICO, OFFLINE, N/D).
@@ -0,0 +1,16 @@
+# MOTD do ZION + +Exibido no **login interativo** (SSH e console) via `/etc/profile.d/zzz-zion-motd.sh`, +que chama `/opt/zion-terminal/bin/zion-motd`. Não roda em scp/sftp/rsync nem em +`TERM=dumb` (animações desligadas nesse caso). + +- Arte ASCII **ZION TERMINAL** — versão larga (≥74 col) e compacta (<74 col). +- Crédito: "Cyberdeck criado por Pablo Murad em 2026". +- Estado real: host, SO, kernel, uptime, temp, CPU, RAM, disco, IPs, Tailscale, + internet, carga, updates, serviços em falha, SSH. Lê cache (`/run/zion/status`) + para login rápido. +- Boot-sequence + tagline com efeito máquina de escrever (só em terminal colorido). +- Desative o MOTD com `touch ~/.zion-sem-motd`; desative animações com + `export ZION_NO_ANIM=1`. + +O `pam_motd` continua desativado (o MOTD antigo da fabricante não aparece mais).
@@ -0,0 +1,16 @@
+# Otimizações de boot e serviços + +Feitas nesta máquina (todas reversíveis): +- Serviços desativados: smartmontools, iperf3, rpcbind, haveged, dnsmasq, bluetooth, + wpa_supplicant, vnstat, sysstat, containerd, openvpn, unattended-upgrades, + usbdevice (ADB), packagekit, orangepi-hardware-monitor. Reative com + `sudo systemctl enable --now <serviço>`. +- Timers mascarados (picos de CPU/IO): apt-daily, apt-daily-upgrade, man-db, + dpkg-db-backup. Reative com `sudo systemctl unmask <timer>`. +- Mantidos: SSH, Tailscale, NetworkManager, chrony (NTP), cron, journald, + fstrim, logrotate, zram, ramlog. +- Kernel/BSP em `apt-mark hold` (anti-brick). Governor: ondemand. Swappiness: 100 + (recomendado com zram). + +Novo serviço do ZION: `zion-collect.timer` (coleta leve a cada 60s; Nice=10, +IO idle). Desative com `sudo systemctl disable --now zion-collect.timer`.
@@ -0,0 +1,30 @@
+# Refinamento visual (Fase 2) + +Cyberdeck criado por Pablo Murad em 2026. + +## Decisões +- Símbolo oficial **»Z»** (Uplink Chevrons). Arte revisada em 3 larguras + fallback dumb. +- Biblioteca de UI única em `/opt/zion-terminal/lib/zion-ui.sh` (cabeçalho, seções, + caixas, estados rotulados OK/ATENÇÃO/CRÍTICO/OFFLINE/N/D, kv, confirmar, bytes, duração). +- Temas como paletas completas (principal/secundária/borda/discreto/semáforo) para + prompt, MOTD, painel, tmux e cabeçalhos. + +## Arquivos alterados/criados +- Novo: `lib/zion-ui.sh`, `assets/ascii/*`, `bin/zion-link`, `bin/zion-modo`, + `bin/zion-tmux-theme`, docs de identidade/bateria/refinamento. +- Reescritos p/ a lib: `zion-motd` (caixas SISTEMA/RECURSOS/LINKS + boot-sequence real), + `zion-dashboard` (menu agrupado), `zion-health/doctor/net/tailscale/info/ssh/status`, + `config/tema.sh`, `config/bashrc-zion.sh` (prompt autoral), `config/tmux.conf`. + +## Novos opt-outs +- `~/.zion-sem-prompt` (desliga o prompt do ZION) — reative removendo o arquivo. +- Já existentes: `~/.zion-sem-motd`, `~/.zion-sem-tmux`, `ZION_NO_ANIM=1`, `NO_COLOR=1`. + +## Como desfazer +`sudo /opt/zion-terminal/bin/zion-uninstall` (use `--dry-run` para simular). + +## Limitações +- Rotação da tela pode exigir flip `fbcon=rotate:1`↔`:3` (só tela local). +- Bateria: sem telemetria de hardware (ver `bateria-e-energia.md`). +- Migração à lib priorizou as telas principais; scripts menores (radar/map/logs/qr) + mantêm estilo próprio compatível.
@@ -0,0 +1,106 @@
+# ZION TERMINAL — Relatório final + +Cyberdeck criado por Pablo Murad em 2026 · Orange Pi CM4 · Debian 12 + +## 1. Resumo do que foi feito +Transformei o `zion` num cyberdeck de terminal com identidade própria: sistema em +português (pt_BR/São Paulo), tela girada para paisagem, MOTD com arte ASCII e +crédito, comando `zion` (dashboard + 27 subcomandos), tema Ice DERP-blue, SSH e tmux +otimizados (com persistência), telemetria leve, ferramentas de campo e documentação. +Tudo reversível; SSH e Tailscale preservados. + +## 2. Estado inicial +Debian 12, kernel 5.10.160, locale en_US, TZ UTC, MOTD da fabricante, sem `~/.ssh/config`, +tela retrato 400×1280, boot 20,3s, RAM ~600 MB, 0 falhas. + +## 3. Estado final +pt_BR.UTF-8 / America/Sao_Paulo, MOTD ZION, dashboard `zion`, tema Ice, tela girada +(paisagem), telemetria via timer, 0 unidades em falha, `zion doctor` sem falhas, +RAM ~620 MB, disco 2%. + +## 4. Arquivos criados (principais) +- `/opt/zion-terminal/` (bin/, config/, docs/, assets/, logs/, backups/, VERSION, CREATOR) +- `/usr/local/bin/zion` (dispatcher) + 27 `zion-*` em `bin/` +- `/etc/profile.d/zzz-zion-motd.sh`, `/etc/profile.d/zzz-zion-aliases.sh` +- `/etc/systemd/system/zion-collect.{service,timer}` +- `~/.ssh/config`, `~/.tmux.conf`, ligação em `~/.bashrc` e `~/.bash_profile` + +## 5. Arquivos modificados +`/etc/default/locale`, timezone, `/boot/orangepiEnv.txt` (fbcon=rotate:1), +`~/.bashrc`, `~/.bash_profile` (auto-resume + Matrix desativado). + +## 6. Backups criados +Em `/opt/zion-terminal/backups/`: cópias datadas de PAM, console-setup, locale, +sshd_config, bash_profile, orangepiEnv.txt + `zion-backup-*.tar.gz` (configs do ZION). + +## 7. Pacotes instalados +btop, mtr-tiny, nmap, tcpdump, traceroute, ncdu, tree, fd-find, whois, ethtool, +iotop, nload, cmatrix, qrencode, vlock (+ deps). ~35 MB. + +## 8. Serviços habilitados +ssh, tailscaled, chrony, NetworkManager, cron, journald, fstrim, logrotate, +**zion-collect.timer** (novo, coleta leve a cada 60s). + +## 9. Serviços desabilitados +smartmontools, iperf3, rpcbind, haveged, dnsmasq, bluetooth, wpa_supplicant, vnstat, +sysstat, containerd, openvpn, unattended-upgrades, usbdevice (ADB), packagekit, +orangepi-hardware-monitor; timers apt-daily/man-db/dpkg-db-backup mascarados. + +## 10. Otimizações +Locale/TZ pt_BR; tela em paisagem; MOTD/status com cache (login rápido); ring-buffer +de métricas; kernel/BSP em hold; governor ondemand; zram/swappiness mantidos. + +## 11. Mudanças no SSH +`~/.ssh/config` novo com keepalive + multiplexação (conservador, nada inseguro). +Chaves não alteradas; nenhuma chave exibida. Backups do sshd_config guardados. + +## 12. Mudanças no Tailscale +Nenhuma alteração de configuração/login. Apenas diagnóstico (`zion tailscale`, +`zion radar`, `zion mapa`). Serviço confirmado habilitado no boot. + +## 13. Mudanças na rede +Sem firewall (a pedido). WiFi desligado; Ethernet preferencial; DNS via MagicDNS. + +## 14. Comandos do ZION +`zion` (+ status, saude, rede, tailscale, ssh, logs, atualizar, backup, info, tmux, +doctor, radar, mapa, panico, qr, manual, anotar, servir, travar, observar, tema, +matrix, desligar, reiniciar). Aliases: zz, zstatus, znet, ztail, zssh, zlogs, +zupdate, ztemp, zdisco, zservicos, ztmux, zmatrix, zdoctor. + +## 15. Resultados dos testes +`zion doctor` = 0 falhas; 0 unidades em falha; MOTD renderiza (largo/compacto/dumb); +dashboard abre e sai limpo; backup gera tar de 32K; status/saude/rede/tailscale/ +radar/mapa/qr/info OK; tema/locale/rotação aplicados. + +## 16. Boot +Antes: 20,3s (kernel 6,9 + userspace 13,4). Após reboot, revalidar com +`systemd-analyze` (esperado semelhante ou melhor; serviços ociosos removidos). + +## 17. RAM +Antes ~600 MB; depois ~620 MB (overhead do ZION desprezível; timer Nice=10/IO idle). + +## 18. Temperatura +64–67 °C em operação normal (sem throttling; limite de alerta 65, crítico 80). + +## 19. Riscos restantes +- Rotação de tela pode precisar de flip `:1`↔`:3` (só tela local; SSH intacto). +- NAT hard limita conexão direta do Tailscale fora da LAN (tende a DERP-SP ~19ms). +- Porta ADB 5555 já fechada; sem firewall (por opção) — acesso só LAN + Tailscale. + +## 20. Recuperação +Backups datados + `sudo /opt/zion-terminal/bin/zion-uninstall`. Console serial +`ttyFIQ0` disponível. Reverter rotação: remover `fbcon=rotate:1` do orangepiEnv.txt. + +## 21. Como remover completamente +`sudo /opt/zion-terminal/bin/zion-uninstall` (remove ganchos, restaura shell/MOTD, +opção de reverter rotação) e, se desejar, `sudo rm -rf /opt/zion-terminal`. + +--- + +## Checklist pós-reboot (rodar após reconectar) +1. `zion doctor` — deve dar "TODOS OS SISTEMAS OPERACIONAIS". +2. Login SSH mostra o MOTD do ZION. +3. `systemctl --failed` vazio; `systemctl is-active tailscaled ssh` = active. +4. Tela local: se estiver invertida, trocar `fbcon=rotate:1`→`:3` no + `/boot/orangepiEnv.txt` e reiniciar. +5. Console local anexa automaticamente à sessão tmux `zion`.
@@ -0,0 +1,49 @@
+# ZION TERMINAL — Relatório do refinamento visual (Fase 2) + +Cyberdeck criado por Pablo Murad em 2026 · Orange Pi CM4 · Debian 12 + +1. **Resumo** — Transformei o cyberdeck de "tecnicamente completo mas cru" em um + equipamento com identidade coerente: símbolo »Z», biblioteca de UI única, MOTD/ + painel/prompt/tmux redesenhados, temas completos, novos comandos (link, modo, + favoritos) — preservando todas as funcionalidades e mantendo tudo reversível. +2. **Problemas visuais encontrados** — helpers duplicados, réguas fixas, estado só + por cor, tema sem borda/discreto, tmux fora do tema, prompt sem root/git-sujo, + menu plano. (ver `auditoria-visual.md`). +3. **Identidade criada** — símbolo »Z» (Uplink Chevrons) + arte em 3 larguras. +4. **Significado do símbolo** — chevrons de uplink = link sendo estabelecido; o Z de ZION. +5. **Arte ASCII** — `assets/ascii/` (mínimo, compacto, logo completa/média/compacta, + fallback sem cor). Revisada à mão, não figlet cru. +6. **MOTD** — blocos em caixas (SISTEMA/RECURSOS/LINKS), boot-sequence com estados + reais (OK/ATENÇÃO/FALHA/N/D), alertas condicionais, logo por largura, cache rápido. +7. **Painel** — menu agrupado (OPERAÇÃO/CONECTIVIDADE/MANUTENÇÃO/FERRAMENTAS/SISTEMA), + 2 colunas em telas largas, topo com logo+versão+tema+hora+status. +8. **Prompt** — autoral, segue o tema, mostra git limpo/sujo (✓/✗), root (#), código + de erro, temperatura; opt-out `~/.zion-sem-prompt`. +9. **tmux** — barra segue `zion tema` (gerador `zion-tmux-theme`), símbolo »Z», TS/carga/temp/hora. +10. **Temas** — ice/amber/green como paletas completas (borda + discreto dedicados); persistem. +11. **Novos comandos** — `zion link` (conectividade resumida), `zion modo`. +12. **Novos modos** — normal/campo/manutencao/emergencia (composições, sem duplicar lógica). +13. **Favoritos SSH** — `--favoritos/--favoritar/--desfavoritar`, ★ primeiro; valida alias. +14. **Bateria** — hardware não expõe telemetria (CM4); mostra "indisponível"; ventoinha + (PWM) real no `zion saude`. Ver `bateria-e-energia.md`. +15. **Arquivos criados** — `lib/zion-ui.sh`, `assets/ascii/*`, `bin/zion-link|zion-modo| + zion-tmux-theme`, docs (identidade/bateria/auditoria/refinamento/este relatório). +16. **Arquivos modificados** — zion-motd/dashboard/health/doctor/net/tailscale/info/ssh/ + status/theme/tmux-status, config/tema.sh, config/bashrc-zion.sh, config/tmux.conf, uninstall. +17. **Backups** — `backups/refinamento-visual-<data>/` (20 arquivos originais). +18. **Medições** — MOTD ~0,65s, status ~0,4s, painel ~0,46s; RAM ~574 MB; boot inalterado; + sem daemon visual; 1 timer (coleta 60s). +19. **Testes** — doctor 0 falhas; 0 unidades em falha; MOTD 40/50/80 col + dumb + no-color; + non-interactive sem MOTD; login com MOTD; temas ice/amber/green; prompt git limpo/sujo; + favoritos; uninstall --dry-run. +20. **Limitações** — rotação pode exigir flip :1↔:3; migração à lib priorizou telas + principais (radar/map/logs/qr mantêm estilo compatível); bateria sem hardware. +21. **Como desfazer** — `sudo /opt/zion-terminal/bin/zion-uninstall` (+`--dry-run`). +22. **Recomendações futuras** — migrar radar/map/logs à lib; UPS/INA219 via I²C para + energia real; SSID no `zion link` quando em Wi-Fi. + +## Checklist pós-reboot +1. `zion doctor` → TODOS OS SISTEMAS OPERACIONAIS. +2. Login mostra o novo MOTD com caixas e »Z». +3. `zion` abre o painel agrupado; `zion link`, `zion modo`, `zion tema amber` funcionam. +4. Tela local em paisagem (flip :1↔:3 se invertida).
@@ -0,0 +1,15 @@
+# Restauração / desfazer + +Backups datados dos arquivos de sistema em `/opt/zion-terminal/backups/` +(PAM, console-setup, locale, sshd_config, bash_profile, orangepiEnv.txt). + +Para desfazer TODAS as personalizações do ZION: +``` +sudo /opt/zion-terminal/bin/zion-uninstall +``` +Isso: remove `/etc/profile.d/zzz-zion-*.sh`, restaura `~/.bashrc`/`~/.bash_profile` +dos backups, reverte a rotação de tela (opcional) e remove `/usr/local/bin/zion`. +A pasta `/opt/zion-terminal` é preservada (remova manualmente se desejar). + +Reverter só a rotação da tela: edite `/boot/orangepiEnv.txt` e remova +`fbcon=rotate:1` de `extraargs` (ou troque `:1` por `:3` se ficou invertida).
@@ -0,0 +1,11 @@
+# Segurança + +- **Sem firewall** (decisão do proprietário). Portas expostas: apenas SSH (22) + + Tailscale. Serviços de rede ociosos foram removidos (rpcbind, dnsmasq, ADB, etc.). +- SSH: sem login root por senha, sem senha vazia, verificação de host mantida. + Chaves existentes preservadas; nenhuma chave privada é exibida ou incluída em + backup por padrão. +- MOTD/dashboard/logs não exibem segredos (senhas, tokens, chaves). +- Atualizações de segurança do Debian habilitadas (`bookworm-security`). +- `zion serve` liga o HTTP **apenas** ao IP do Tailscale (não à LAN). +- Recuperação: console serial `ttyFIQ0` ativo.
@@ -0,0 +1,13 @@
+# Solução de problemas + +- **Tela local invertida** após girar: edite `/boot/orangepiEnv.txt`, troque + `fbcon=rotate:1` por `fbcon=rotate:3` e reinicie. SSH nunca é afetado. +- **MOTD não aparece**: confirme `/etc/profile.d/zzz-zion-motd.sh` e que o login é + interativo com terminal. Remova `~/.zion-sem-motd` se existir. +- **Sem cores**: terminal com `TERM=dumb` ou `NO_COLOR` desativa cores (proposital). +- **Prompt sem git/temp**: shell não-interativo ou `TERM=dumb`. +- **`zion` não encontrado**: `/usr/local/bin` no PATH? Reabra a sessão. +- **Tailscale mostra DERP**: normal fora da LAN (NAT hard). Veja `tailscale.md`. +- **Login trava no console**: o auto-resume do tmux pode ser desativado com + `touch ~/.zion-sem-tmux`. +- **Atualização não mexe no kernel**: correto — kernel/BSP em hold.
@@ -0,0 +1,18 @@
+# SSH no ZION + +Cliente configurado em `~/.ssh/config` (perm 600) com valores conservadores: +- `ServerAliveInterval 30`, `ServerAliveCountMax 3`, `ConnectTimeout 10`, + `TCPKeepAlive yes`, `HashKnownHosts yes`, `AddKeysToAgent yes`. +- Multiplexação: `ControlMaster auto`, `ControlPath ~/.ssh/cm-%r@%h:%p`, + `ControlPersist 5m` (reconexão instantânea a hosts já abertos). + +Nada inseguro: sem `StrictHostKeyChecking=no`, sem senha vazia, sem root por senha. +Chaves existentes não foram alteradas. Backups em `/opt/zion-terminal/backups/`. + +Adicione servidores no fim do `~/.ssh/config`: +``` +Host meuserv + HostName 100.x.y.z # IP Tailscale ou DNS + User pablo +``` +Depois use `zion ssh` para listar/testar/conectar.
@@ -0,0 +1,15 @@
+# Tailscale no ZION + +O Tailscale já estava instalado e autenticado — **não foi reinstalado nem foi +refeito o login**. Apenas inspeção e diagnóstico seguro. + +- Versão: 1.98.10. Serviço `tailscaled` habilitado no boot. +- IP: veja `zion tailscale` (mostra IPv4/IPv6, MagicDNS, peers, netcheck). +- Rede: UDP OK; DERP mais próximo **São Paulo (~19ms)**; IP público (sem CGNAT); + **NAT "hard"** (MappingVariesByDestIP) → conexão direta é fácil na LAN; fora dela + tende a usar DERP. Isso é característica da rede, não um defeito. +- Aviso conhecido: há peers anunciando rotas com `--accept-routes=false`. Se você + precisar acessar essas sub-redes, avalie `tailscale set --accept-routes` + (NÃO aplicado automaticamente, pois muda o roteamento). + +Diagnóstico: `zion tailscale`, `zion radar`, `zion mapa`, `tailscale ping <host>`.
@@ -0,0 +1,9 @@
+# tmux no ZION + +- Config em `~/.tmux.conf` (tema Ice, mouse on, history 50k, base-index 1). +- Divisões: `|` (horizontal) e `-` (vertical). Prefixo padrão: `Ctrl+B`. +- Status bar: `ZION <sessão>` à esquerda; carga/temperatura/hora à direita. +- Sessão padrão: `zion` (`zion tmux` cria/anexa). +- Persistência: **tmux-resurrect** (`Ctrl+B Ctrl+S` salva, `Ctrl+B Ctrl+R` restaura). +- Auto-resume: no **console local** (tty), o login anexa automaticamente à sessão + `zion`. Desative com `touch ~/.zion-sem-tmux`. Nunca ocorre por SSH/scp/rsync.
@@ -0,0 +1,89 @@
+#!/usr/bin/env bash +# ===================================================================== +# ZION TERMINAL - Biblioteca de interface (UI) +# Cyberdeck criado por Pablo Murad em 2026 +# --------------------------------------------------------------------- +# Fonte unica de cabecalhos, secoes, caixas, estados rotulados e +# formatacao. Estados SEMPRE tem rotulo textual (acessivel sem cor). +# Simbolo oficial: >>Z>> (Uplink Chevrons) +# ===================================================================== +ZION_DIR="/opt/zion-terminal" +[ -z "${ZR+x}" ] && . "$ZION_DIR/config/tema.sh" 2>/dev/null + +# --- Conjunto de caracteres (UTF-8 x ASCII para TERM=dumb) --------- +if [ "${TERM:-dumb}" = dumb ] || [ -n "${ZION_ASCII:-}" ]; then + UIH='-'; UIV='|'; UITL='+'; UITR='+'; UIBL='+'; UIBR='+'; ZSYM='>>Z>>' +else + UIH='─'; UIV='│'; UITL='┌'; UITR='┐'; UIBL='└'; UIBR='┘'; ZSYM='»Z»' +fi + +# --- Largura ------------------------------------------------------- +ui_cols() { local c="${COLUMNS:-}"; [ -z "$c" ] && c=$(tput cols 2>/dev/null); echo "${c:-80}"; } +ui_w() { local c max; c=$(ui_cols); max="${1:-60}"; [ "$c" -lt "$((max+4))" ] && echo "$((c-4))" || echo "$max"; } +ui_strip() { printf '%s' "$1" | sed 's/\x1b\[[0-9;]*m//g'; } +ui_vlen() { local s; s=$(ui_strip "$1"); echo "${#s}"; } +ui_repeat() { local ch="$1" n="$2" i; for ((i=0;i<n;i++)); do printf '%s' "$ch"; done; } + +# --- Simbolo oficial (ZSYM definido no bloco de charset acima) ----- +ui_sym() { printf '%b%s%b' "$ZP$ZB" "$ZSYM" "$ZR"; } + +# --- Cabecalho / secao / regua ------------------------------------ +ui_header() { # $1 = titulo da tela + printf ' %b%s%b %b%s%b\n' "$ZP$ZB" "$ZSYM" "$ZR" "$ZA$ZB" "$1" "$ZR" + ui_rule +} +ui_section() { printf '\n %b%s%b\n' "$ZS$ZB" "$1" "$ZR"; } +ui_rule() { local w; w=$(ui_w "${1:-60}"); printf ' %b' "$ZBRD"; ui_repeat "$UIH" "$w"; printf '%b\n' "$ZR"; } + +# --- Par rotulo/valor --------------------------------------------- +ui_kv() { # $1 rotulo $2 valor [$3 cor-do-valor] + printf ' %b%-14s%b %b%s%b\n' "$ZDISC" "$1" "$ZR" "${3:-$ZWHT}" "$2" "$ZR" +} + +# --- Estados (rotulo textual + cor) ------------------------------- +ui_state() { # ok|warn|crit|off|nd -> imprime rotulo colorido (largura fixa 8) + case "$1" in + ok) printf '%b%-8s%b' "$ZOK" "OK" "$ZR" ;; + warn) printf '%b%-8s%b' "$ZWARN" "ATENCAO" "$ZR" ;; + crit) printf '%b%-8s%b' "$ZCRIT" "CRITICO" "$ZR" ;; + off) printf '%b%-8s%b' "$ZMUT" "OFFLINE" "$ZR" ;; + nd) printf '%b%-8s%b' "$ZGRY" "N/D" "$ZR" ;; + *) printf '%-8s' "$1" ;; + esac +} +ui_ok() { printf ' %b[ OK ]%b %s\n' "$ZOK" "$ZR" "$1"; } +ui_warn() { printf ' %b[ ! ]%b %s\n' "$ZWARN" "$ZR" "$1"; } +ui_err() { printf ' %b[FALHA]%b %s\n' "$ZCRIT" "$ZR" "$1"; } +ui_info() { printf ' %b•%b %s\n' "$ZDISC" "$ZR" "$1"; } + +# --- Caixas com bordas (alinhamento consciente de ANSI) ----------- +ui_box_top() { # $1 titulo $2 largura-interna + local t="$1" w="${2:-40}" fill; fill=$(( w - ${#t} - 1 )) + [ "$fill" -lt 0 ] && fill=0 + printf ' %b%s%s %b%s%b%b ' "$ZBRD" "$UITL" "$UIH" "$ZS$ZB" "$t" "$ZR" "$ZBRD"; ui_repeat "$UIH" "$fill"; printf '%s%b\n' "$UITR" "$ZR" +} +ui_box_line() { # $1 conteudo(com cor) $2 largura-interna (trunca se exceder) + local c="$1" w="${2:-40}" vis pad; vis=$(ui_vlen "$c"); pad=$(( w - vis )) + if [ "$pad" -lt 0 ]; then c=$(ui_strip "$c"); c="${c:0:$((w-1))}~"; pad=$(( w - ${#c} )); fi + [ "$pad" -lt 0 ] && pad=0 + printf ' %b%s%b %s%*s %b%s%b\n' "$ZBRD" "$UIV" "$ZR" "$c" "$pad" "" "$ZBRD" "$UIV" "$ZR" +} +ui_box_kv() { # $1 rotulo $2 valor $3 largura-interna [$4 cor-valor] + local r="$1" v="$2" w="${3:-40}" vc="${4:-$ZWHT}" + ui_box_line "$(printf '%b%-11s%b %b%s%b' "$ZDISC" "$r" "$ZR" "$vc" "$v" "$ZR")" "$w" +} +ui_box_bot() { local w="${1:-40}"; printf ' %b%s' "$ZBRD" "$UIBL"; ui_repeat "$UIH" "$((w+2))"; printf '%s%b\n' "$UIBR" "$ZR"; } + +# --- Confirmacao / dependencia / timeout / log -------------------- +ui_confirm() { local r; read -r -p "$(printf ' %b%s [s/N]:%b ' "$ZWARN" "$1" "$ZR")" r; [ "$r" = s ] || [ "$r" = S ]; } +ui_dep() { command -v "$1" >/dev/null 2>&1 && return 0; ui_err "dependencia ausente: $1"; return 1; } +ui_timeout() { local t="$1"; shift; timeout "$t" "$@"; } +ui_log() { local f="$ZION_DIR/logs/${ZION_LOGNAME:-zion}.log"; printf '[%s] %s\n' "$(date '+%F %T')" "$*" >> "$f" 2>/dev/null; } + +# --- Formatacao ---------------------------------------------------- +ui_bytes() { numfmt --to=iec --suffix=B "${1:-0}" 2>/dev/null | sed 's/\.0//' || printf '%sB' "${1:-0}"; } +ui_dur() { # segundos -> "2d 3h 4m" + local s="${1:-0}" d h m; d=$((s/86400)); h=$(((s%86400)/3600)); m=$(((s%3600)/60)) + if [ "$d" -gt 0 ]; then printf '%dd %dh %dm' "$d" "$h" "$m" + elif [ "$h" -gt 0 ]; then printf '%dh %dm' "$h" "$m"; else printf '%dm' "$m"; fi +}
@@ -0,0 +1,10 @@
+#!/usr/bin/env bash +# ZION TERMINAL - desinstalador (wrapper) +# Usa o desinstalador instalado, que restaura MOTD/prompt/tmux e remove os ganchos. +# Preserva ~/.ssh/config, chaves, backups e docs. +# ./uninstall.sh remove +# ./uninstall.sh --dry-run simula (nao altera nada) +set -e +BIN=/opt/zion-terminal/bin/zion-uninstall +[ -x "$BIN" ] || { echo "ZION nao esta instalado (faltou $BIN)."; exit 1; } +if [ "${1:-}" = "--dry-run" ]; then exec "$BIN" --dry-run; else exec sudo "$BIN"; fi