Metadata-Version: 2.4
Name: vcanonici-autoinstall
Version: 2.0.0
Summary: Provisionamento interativo, tipado e retomável de máquinas Ubuntu
Author: Vinicius Canonici
License-Expression: MIT
Project-URL: Documentation, https://pypi.org/project/vcanonici-autoinstall/
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Operating System :: POSIX :: Linux
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: System :: Installation/Setup
Requires-Python: >=3.12
Description-Content-Type: text/markdown
License-File: LICENSE
License-File: REALTEK-NOTICE.md
Requires-Dist: rich<15,>=13.9
Provides-Extra: dev
Requires-Dist: build>=1.2.2; extra == "dev"
Requires-Dist: coverage[toml]>=7.6; extra == "dev"
Requires-Dist: mypy>=1.13; extra == "dev"
Requires-Dist: pip-audit>=2.7; extra == "dev"
Requires-Dist: pytest>=8.3; extra == "dev"
Requires-Dist: pytest-cov>=6; extra == "dev"
Requires-Dist: ruff>=0.8; extra == "dev"
Requires-Dist: twine>=6; extra == "dev"
Dynamic: license-file

# VCanonici Autoinstall 2.0

Provisionamento interativo e retomável para **Ubuntu 24.04 Desktop amd64 recém-instalado**.
A distribuição pública única é `vcanonici-autoinstall`; o tipo faz parte da CLI:
`autoinstall --t workstation`.

> A versão 2.0.0 não é um autoinstall do instalador Ubuntu/NoCloud. Ela configura a
> workstation depois do primeiro login de um usuário comum membro de `sudo`.

## Instalação

Copie o bloco inteiro no Terminal da máquina. Ele pede `sudo` uma vez, mantém o ticket
apenas enquanto estiver ativo e substitui qualquer runtime antigo pela versão mais
recente já publicada no PyPI. Se o download ou a instalação falhar, o runtime anterior
é restaurado e a CLI não é executada:

<!-- bootstrap-start -->
```bash
#!/bin/sh
(
set -eu

PACKAGE="vcanonici-autoinstall"
BASE="$HOME/.local/share/vcanonici-autoinstall"
RUNTIME="$BASE/workstation"
BACKUP="$BASE/workstation.backup"
runtime_ready=0
keepalive_pid=""

# shellcheck disable=SC2317,SC2329  # Invoked indirectly by the EXIT trap.
cleanup() {
    exit_code=$?
    trap - EXIT HUP INT TERM
    if [ "$runtime_ready" -ne 1 ]; then
        rm -rf -- "$RUNTIME"
        if [ -d "$BACKUP" ]; then
            mv -- "$BACKUP" "$RUNTIME"
        fi
    fi
    if [ -n "$keepalive_pid" ]; then
        kill "$keepalive_pid" 2>/dev/null || true
    fi
    sudo -k
    exit "$exit_code"
}
trap cleanup EXIT
trap 'exit 130' HUP INT TERM

mkdir -p -- "$BASE"
if [ -d "$BACKUP" ]; then
    if [ -f "$RUNTIME/.autoinstall-ready" ]; then
        rm -rf -- "$BACKUP"
    else
        rm -rf -- "$RUNTIME"
        mv -- "$BACKUP" "$RUNTIME"
    fi
fi

sudo -v
while true; do
    sudo -n true
    sleep 50
done &
keepalive_pid=$!

sudo systemctl unmask packagekit.service >/dev/null 2>&1 || true
sudo apt-get -o Acquire::Retries=5 -o DPkg::Lock::Timeout=300 update
sudo apt-get -o Acquire::Retries=5 -o DPkg::Lock::Timeout=300 -y install python3-venv

if [ -d "$RUNTIME" ]; then
    mv -- "$RUNTIME" "$BACKUP"
fi
python3 -m venv "$RUNTIME"
"$RUNTIME/bin/python" -m pip install --no-cache-dir --upgrade pip
"$RUNTIME/bin/python" -m pip install --no-cache-dir --upgrade "$PACKAGE"
installed_version=$("$RUNTIME/bin/python" -c \
    'from importlib.metadata import version; print(version("vcanonici-autoinstall"))')
test -n "$installed_version"
test -x "$RUNTIME/bin/autoinstall"
touch "$RUNTIME/.autoinstall-ready"
runtime_ready=1

rm -rf -- "$BACKUP"
find "$BASE" -mindepth 1 -maxdepth 1 -type d -name 'workstation-*' \
    -exec rm -rf -- {} +

printf 'VCanonici Autoinstall %s instalado em %s\n' "$installed_version" "$RUNTIME"
"$RUNTIME/bin/autoinstall" --t workstation install
)
```
<!-- bootstrap-end -->

Se Python e pip já estiverem disponíveis em um ambiente gravável, também funciona:

```bash
python -m pip install vcanonici-autoinstall
autoinstall --t workstation
```

No Ubuntu limpo, prefira o bootstrap acima: ele cria um venv isolado. A CLI roda como
usuário comum e eleva somente comandos que alteram o sistema.

## Comandos

```text
autoinstall --t workstation install [--dry-run] [--yes] [--no-reboot]
autoinstall --t workstation resume [--yes] [--no-reboot]
autoinstall --t workstation status
autoinstall --t workstation report
autoinstall --t workstation support-bundle
autoinstall --t workstation cleanup
autoinstall --version
```

- `--dry-run` faz detecção, perguntas e plano sem downloads ou alterações.
- `install` descarta estado, cache e autostart temporários anteriores e começa uma
  execução nova; use `resume` quando quiser continuar uma execução interrompida.
- `resume` recupera módulos interrompidos e executa as verificações pós-boot.
- `support-bundle` cria um `.tar.zst` local; nada é enviado.
- `cleanup` remove runtime temporário, estado, caches e autostart. Aplicativos,
  `lan-ssh`, relatório, logs e bundle são preservados.

Exit codes: `0` sucesso, `2` parcial, `10` ambiente não suportado, `20` pausado e
retomável, `30` falha crítica da CLI.

## Segurança operacional

- Suporte exclusivo a Ubuntu 24.04 Desktop amd64, GNOME e usuário comum em `sudo`.
- Estado atômico `0600` em `~/.local/state/vcanonici-autoinstall/workstation/state.json`.
- Cada comando, stdout e stderr aparece em tempo real no terminal e é gravado literalmente
  em `~/.local/state/vcanonici-autoinstall/workstation/runs/<runId>/`; os dados permanecem locais e
  devem ser protegidos como dados sensíveis da máquina.
- Nenhuma telemetria, upload, credencial de aplicativo ou chave PyPI.
- APT usa canais estáveis assinados. Discord, Telegram, Windscribe, Codex e Unsloth usam URLs,
  tamanhos e SHA-256 congelados no manifesto; ausência ou divergência pausa por padrão.
- SSH termina fechado, inclusive `ssh.socket`. `sudo lan-ssh up` abre a porta 22 somente
  para a sub-rede da rota padrão e persiste até `sudo lan-ssh down`; `--interface` escolhe
  outra interface.
- O grupo Docker equivale a acesso root.
- Atualizações automáticas de segurança do Ubuntu permanecem habilitadas.

Os blobs Realtek do MA530 têm autorização de redistribuição, checksums fixos e licença
separada em [REALTEK-NOTICE.md](REALTEK-NOTICE.md). O instalador nunca substitui o
`btusb` assinado do Ubuntu e não usa DKMS.

## Desenvolvimento

```bash
python3.12 -m venv .venv
. .venv/bin/activate
python -m pip install -e '.[dev]'
ruff check .
mypy src tests
pytest
python -m build
SOURCE_DATE_EPOCH=1784073600 python scripts/normalize_sdist.py dist/*.tar.gz
twine check dist/*
python scripts/inspect_distribution.py dist/*
shellcheck bootstrap.sh src/vcanonici_autoinstall_workstation/assets/lan-ssh
```

A arquitetura e o fluxo operacional estão em [docs/architecture.md](docs/architecture.md).
A publicação sem tokens está descrita em [docs/publishing.md](docs/publishing.md).

## Limites de aceitação

CI e testes simulam APT, systemd, GNOME, downloads e retomada. Antes de declarar a
2.0.0 estável, valide numa VM Ubuntu 24.04 sem GPU e depois na máquina-alvo com RTX,
MA530 e múltiplos monitores. Preserve o bundle dessa execução como evidência.
