- Go 83.2%
- Shell 16.8%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
All checks were successful
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RnxFu4YRd8qX88Hp3YCLwP |
||
| .claude/skills | ||
| .github/workflows | ||
| .specify | ||
| cmd | ||
| internal | ||
| legacy | ||
| specs | ||
| .air.toml | ||
| .gitignore | ||
| go.mod | ||
| go.sum | ||
| main.go | ||
| main_test.go | ||
| README.md | ||
desktop-configurator
Herramienta (Go + cobra + Bubble Tea) que configura los equipos de escritorio de la empresa
con Ubuntu Desktop 24.04–26.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:
- descargan el binario a
/usr/local/bin/desktop-configurator; - escriben la unidad
/etc/systemd/system/desktop-configurator-firstboot.service(Type=oneshot,After=network-online.target,Restart=on-failure) que ejecutadesktop-configurator install --yes …con los flags del perfil elegido; - 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.yamlen 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 unmeta-datavacío, y añade a la línea de comandos del kernel:autoinstall ds=nocloud;s=http://servidor/ruta/(con
nocloud-neten 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-rarsustituyen ap7zip-full+p7zip-rar,libfuse2t64alibfuse2y se prefierehardinfo2sobrehardinfo. 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 publiquedists/<codename>/y, si no, se usa el codename de la LTS anterior (noblepararesolute) avisando con⚠. - PAM sin
sedsobre/etc/pam.d/common-*: se escribe/etc/security/pwquality.confy/etc/security/faillock.confy se habilitan los perfiles conpam-auth-update. - El script diario pasa a llamarse
/etc/cron.daily/autoupdate, sin extensión.sh(run-partsignora los ficheros con punto). - Todo subproceso corre con
DEBIAN_FRONTEND=noninteractive,NEEDRESTART_MODE=ayNEEDRESTART_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 (001–004)
.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.md → plan.md →
tasks.md → implementación. Commits con Conventional Commits.
Licencia
Copyright 2025–2026 Beebit Solutions SLU.