Configurador de escritorio para equipos de Beebit
  • Go 83.2%
  • Shell 16.8%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Valentín Pedrosa 132a375c32
All checks were successful
build / release v0.1.0 (push) Successful in 5s
build / build linux/arm64 (push) Successful in 20s
build / build linux/amd64 (push) Successful in 1m43s
build / vet & test (push) Successful in 2m19s
build / release dev (push) Has been skipped
chore(deps): tidy go.mod and add shared component test helpers
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RnxFu4YRd8qX88Hp3YCLwP
2026-08-28 12:09:49 +02:00
.claude/skills docs(specs): add Spec Kit constitution and specs for Go CLI migration, Ubuntu 26.04, VirtualBox and autoinstall 2026-08-28 11:47:12 +02:00
.github/workflows ci: Forgejo Actions build/test/release workflow; docs: README, specs marked implemented 2026-08-28 12:09:38 +02:00
.specify docs(specs): add Spec Kit constitution and specs for Go CLI migration, Ubuntu 26.04, VirtualBox and autoinstall 2026-08-28 11:47:12 +02:00
cmd feat(cli): cobra commands (status, install, autoinstall, version) and Bubble Tea TUI 2026-08-28 12:09:38 +02:00
internal chore(deps): tidy go.mod and add shared component test helpers 2026-08-28 12:09:49 +02:00
legacy docs(specs): add Spec Kit constitution and specs for Go CLI migration, Ubuntu 26.04, VirtualBox and autoinstall 2026-08-28 11:47:12 +02:00
specs ci: Forgejo Actions build/test/release workflow; docs: README, specs marked implemented 2026-08-28 12:09:38 +02:00
.air.toml feat(core): add sys, profile, components API and engine foundation 2026-08-28 11:51:19 +02:00
.gitignore docs(specs): add Spec Kit constitution and specs for Go CLI migration, Ubuntu 26.04, VirtualBox and autoinstall 2026-08-28 11:47:12 +02:00
go.mod chore(deps): tidy go.mod and add shared component test helpers 2026-08-28 12:09:49 +02:00
go.sum chore(deps): tidy go.mod and add shared component test helpers 2026-08-28 12:09:49 +02:00
main.go feat(cli): cobra commands (status, install, autoinstall, version) and Bubble Tea TUI 2026-08-28 12:09:38 +02:00
main_test.go feat(cli): cobra commands (status, install, autoinstall, version) and Bubble Tea TUI 2026-08-28 12:09:38 +02:00
README.md ci: Forgejo Actions build/test/release workflow; docs: README, specs marked implemented 2026-08-28 12:09:38 +02:00

desktop-configurator

Herramienta (Go + cobra + Bubble Tea) que configura los equipos de escritorio de la empresa con Ubuntu Desktop 24.0426.04. Sustituye a los tres scripts manuales download.sh, install.sh y policies.sh, que se conservan en legacy/ como referencia hasta validar el binario en un equipo real.

Un único binario estático que audita el equipo (qué está instalado y qué falta) y lo converge al estado deseado. Todo es idempotente: se puede ejecutar tantas veces como haga falta y, si ya está todo, no toca nada.

Instalación

Descarga el binario de la última release de Forgejo:

wget https://git.devbeebit.com/beebit/desktop-configurator/releases/download/v0.1.0/desktop-configurator-linux-amd64 -O desktop-configurator
chmod +x desktop-configurator
sudo ./desktop-configurator

Uso

Interfaz de terminal (TUI)

sudo desktop-configurator

Muestra la lista de componentes con su estado ( instalado · falta · parcial · no aplica) y permite instalar lo que falte. Teclas:

Tecla Acción
/ · j / k mover
espacio marcar / desmarcar el componente
a marcar todo lo que falta
n desmarcar todo
enter / i instalar la selección
r refrescar el estado
q salir

En el perfil escritorio pregunta el nombre del usuario limitado y su contraseña inicial antes de aplicar (la contraseña nunca se imprime ni se guarda).

Línea de comandos

sudo desktop-configurator status                    # solo consulta, no cambia nada
sudo desktop-configurator install --yes --user maria
sudo desktop-configurator install --yes --user maria --virtualbox
sudo desktop-configurator install --yes --user maria --only fonts,swap,packages
sudo desktop-configurator install --yes --user maria --password-file /root/pass.txt
sudo desktop-configurator install --yes --user maria --dry-run   # imprime comandos y ficheros
desktop-configurator version

--dry-run no requiere root: imprime cada comando externo y cada escritura de fichero sin ejecutar nada. Toda la salida se añade además a out.log, junto al binario.

Perfil sistema

sudo desktop-configurator --system            # TUI en perfil sistema
sudo desktop-configurator install --yes --system

Para equipos del propio equipo de sistemas: no crea un usuario limitado, sino que configura el usuario que ha lanzado el sudo (SUDO_USER), y omite las políticas que solo tienen sentido para un usuario restringido: bloqueo de almacenamiento USB, bloqueo del Centro de control y cambio de propietario de ~/.config/dconf. Las políticas de organización (bloqueo de pantalla, calidad e historial de contraseñas, bloqueo tras fallos de login, banner y logo de GDM, caducidad de contraseña) sí se aplican.

Con --system --user NOMBRE se configura a ese usuario, que debe existir ya (no se crea). Si no hay SUDO_USER y no se indica --user, la herramienta se niega a configurar root.

Autoinstalación de Ubuntu

Genera un fichero de autoinstalación (#cloud-config con la sección autoinstall:) para el instalador de Ubuntu Desktop 24.04/26.04 (subiquity):

desktop-configurator autoinstall \
  --user maria --hostname pc-maria \
  --admin-password-hash "$(mkpasswd -m sha-512)" \
  -o autoinstall.yaml

# perfil sistema, con VirtualBox
desktop-configurator autoinstall --system --virtualbox -o autoinstall.yaml

Flags: --user, --hostname, --system, --virtualbox, --admin-user (por defecto beebit), --admin-password-hash, --binary-url, -o/--output.

El fichero incluye idioma es_ES.UTF-8, teclado es, zona horaria Europe/Madrid, identidad del administrador, disco con LVM, actualizaciones de seguridad, códecs y drivers, los paquetes mínimos (curl, ca-certificates, git, zsh) y tres late-commands que:

  1. descargan el binario a /usr/local/bin/desktop-configurator;
  2. escriben la unidad /etc/systemd/system/desktop-configurator-firstboot.service (Type=oneshot, After=network-online.target, Restart=on-failure) que ejecuta desktop-configurator install --yes … con los flags del perfil elegido;
  3. la habilitan.

En el primer arranque con red la unidad instala y configura todo el equipo y después se deshabilita sola. Necesita conexión a internet: si no la hay, la unidad reintenta (Restart=on-failure, cada 60 s) y vuelve a intentarlo en el siguiente arranque hasta que termina bien.

Si no pasas --admin-password-hash, el campo identity.password queda con un marcador y el fichero lleva en la cabecera las instrucciones para generarlo:

sudo apt install whois && mkpasswd -m sha-512
openssl passwd -6                      # alternativa sin instalar nada

La contraseña del usuario limitado no se puede incrustar: se pide en el primer inicio de sesión.

Cómo usar el fichero en la instalación

Ubuntu Desktop 24.04 y posteriores admiten dos vías:

  • Desde el propio medio: copia el fichero como autoinstall.yaml en la raíz del ISO/USB. El instalador lo detecta y arranca en modo desatendido.

  • Por red (nocloud): publica un directorio con user-data (el contenido del fichero generado) y un meta-data vacío, y añade a la línea de comandos del kernel:

    autoinstall ds=nocloud;s=http://servidor/ruta/
    

    (con nocloud-net en versiones antiguas; ojo con la / final, es obligatoria).

Recuerda subir la release del binario antes de provisionar equipos: la URL que se escribe en el late-command apunta al asset desktop-configurator-linux-amd64 de la release del tag.

Componentes

id título qué hace
fonts Fuentes MesloLGS NF descarga las 4 variantes a /usr/share/fonts/truetype/meslo y refresca la caché
user Usuario limitado crea el usuario con useradd -m -s /bin/zsh y su contraseña (no aplica en perfil sistema)
alias Alias update añade el alias en .bashrc/.zshrc de root, admin y usuario
update Actualización del sistema apt update && upgrade && autoremove && autoclean
autoupdate Actualización diaria script /etc/cron.daily/autoupdate (0755)
swap Swap 8 GB crea /swapfile, mkswap, swapon y la línea de fstab
packages Paquetes base instala los paquetes base resueltos según la versión de Ubuntu
zsh Zsh + oh-my-zsh + p10k chsh, clona oh-my-zsh, powerlevel10k y plugins, parchea .zshrc
chrome Google Chrome descarga e instala el .deb oficial
snaps Snaps code, postman, acrordrdc, webstorm, ngrok, android-studio
node NVM + Node LTS instala nvm como usuario y nvm install --lts
flutter Flutter SDK descarga el último stable a ~/Descargas
anydesk AnyDesk tarball, política polkit, unidad systemd habilitada
docker Docker Engine repositorio deb822, instalación y uidmap
docker-rootless Docker rootless (usuario) DOCKER_HOST en .zshrc y script de primer inicio de sesión
wallpaper Fondo de escritorio descarga ~/Imágenes/bg.png y lo aplica en el primer inicio
screen-lock Bloqueo de pantalla dconf local.d + lock, dconf update, permisos del Centro de control
usb-block Bloqueo USB storage blacklist usb_storage en modprobe.d (no aplica en perfil sistema)
pam-password Calidad e historial de contraseñas libpam-pwquality, pwquality.conf, perfil pwhistory
pam-faillock Bloqueo tras 5 fallos faillock.conf y perfiles PAM vía pam-auth-update
gdm Pantalla de login banner, sin lista de usuarios y logo corporativo
password-expiry Caducidad de contraseña chage -M 90 -I 30 -W 14
virtualbox VirtualBox (opcional) repositorio de Oracle, virtualbox-7.2 + guest additions, grupo vboxusers, vboxconfig

Los componentes que necesitan la sesión gráfica del usuario (fondo de escritorio, Docker rootless) se aplazan al primer inicio de sesión mediante scripts en ~/.config/desktop-configurator/firstlogin.d/ y una entrada de autoarranque que se borra sola cuando ya no queda nada pendiente.

virtualbox es opcional: no se instala salvo que se pida con --virtualbox o se marque en la TUI. Si ya está instalado, se muestra en cualquier caso.

Ubuntu 26.04

La herramienta lee /etc/os-release y adapta lo que cambió entre 24.04 (noble) y 26.04 (resolute):

  • Nombres de paquetes: en 26.04 7zip + 7zip-rar sustituyen a p7zip-full + p7zip-rar, libfuse2t64 a libfuse2 y se prefiere hardinfo2 sobre hardinfo. Los paquetes opcionales sin candidato (libgtkglext1) se omiten con en lugar de fallar. Un paquete instalado con el nombre alternativo cuenta como instalado.
  • Repositorios de terceros (Docker, VirtualBox) en formato deb822 (/etc/apt/sources.list.d/*.sources) con la clave en /etc/apt/keyrings. Se comprueba por HTTP que el proveedor publique dists/<codename>/ y, si no, se usa el codename de la LTS anterior (noble para resolute) avisando con .
  • PAM sin sed sobre /etc/pam.d/common-*: se escribe /etc/security/pwquality.conf y /etc/security/faillock.conf y se habilitan los perfiles con pam-auth-update.
  • El script diario pasa a llamarse /etc/cron.daily/autoupdate, sin extensión .sh (run-parts ignora los ficheros con punto).
  • Todo subproceso corre con DEBIAN_FRONTEND=noninteractive, NEEDRESTART_MODE=a y NEEDRESTART_SUSPEND=1: nunca se queda esperando una respuesta en la terminal.

Ver specs/002-ubuntu-2604/.

Desarrollo

go build -o desktop-configurator .
go test ./... -cover        # FS en memoria (afero) + runner falso, sin root
air                         # live reload: recompila y ejecuta `status --dry-run --user demo`

Estructura:

main.go                  entrada (tee a out.log)
cmd/                     comandos cobra: raíz (TUI), status, install, autoinstall, version
internal/sys/            Context, Runner (real / dry-run / falso), os-release, usuarios, ficheros
internal/profile/        Profile (modo escritorio o sistema, usuarios, virtualbox, versión de SO)
internal/components/     un fichero por componente (Check + Apply) y sus tests
internal/engine/         orden de componentes, comprobación de root, resumen
internal/tui/            modelo de Bubble Tea (lista + panel de salida + prompts)
internal/autoinstall/    generador del autoinstall.yaml (spec 004)
legacy/                  scripts bash originales (referencia)
specs/                   especificaciones Spec Kit (001004)
.specify/                constitución y plantillas de Spec Kit

CI (Forgejo Actions)

.github/workflows/build.yml ejecuta gofmt/go vet/go test y construye binarios estáticos desktop-configurator-linux-{amd64,arm64} como artefactos (un zip por binario; la API de artefactos siempre comprime) en cada push a main/dev, en PRs y manualmente.

En los tags v* además crea una Release en Forgejo con los binarios (y sus .sha256) como assets descargables directamente, y el binario reporta la versión del tag.

Para publicar: git tag -a vX.Y.Z -m "vX.Y.Z" && git push origin vX.Y.Z. Corre en el runner con etiqueta go (imagen con el toolchain de Go ya instalado, sin setup-go) y solo usa actions/checkout, actions/cache (módulos y caché de build) y actions/upload-artifact, que Forgejo (≥ 7) resuelve desde github.com.

Este proyecto sigue Spec Kit: spec.mdplan.mdtasks.md → implementación. Commits con Conventional Commits.

Licencia

Copyright 20252026 Beebit Solutions SLU.