Añade pkgsync: sincronización de paquetes entre máquinas (mismo patrón que chezmoi)
Nuevo pkgsync/pkgsync.sh + servicios systemd --user (push al cerrar sesión, pull+diff+notifica al iniciar sesión, sin aplicar cambios solo) usando metapac como motor de diff/aplicación sobre los arrays de packages-common.sh. Lista de paquetes críticos protegidos de borrado automático, fichero de overrides local para divergencias entre máquinas, y comandos de introspección (diff/log/incoming/audit). De paso, grub/efibootmgr y los drivers gráficos pasan de estar hardcodeados en cada <de>/setup.sh a vivir en PACMAN_COMMON, para que pkgsync pueda declararlos y protegerlos.
This commit is contained in:
@@ -6,9 +6,10 @@ Dos variantes de escritorio: **GNOME** y **KDE Plasma**.
|
||||
|
||||
```
|
||||
arch-setup/
|
||||
├── gnome/ archinstall-config.json + setup.sh (GNOME, gdm)
|
||||
├── kde/ archinstall-config.json + setup.sh (KDE Plasma, sddm)
|
||||
├── shared/ packages-common.sh (paquetes comunes a ambos)
|
||||
├── gnome/ archinstall-config.json + setup.sh (GNOME, gdm)
|
||||
├── kde/ archinstall-config.json + setup.sh (KDE Plasma, sddm)
|
||||
├── shared/ packages-common.sh (paquetes comunes a ambos)
|
||||
├── pkgsync/ pkgsync.sh + systemd/ (sync de paquetes entre máquinas)
|
||||
└── README.md
|
||||
```
|
||||
|
||||
@@ -77,3 +78,106 @@ Remmina+FreeRDP, Apostrophe, guvcview, KVIrc, Zen Browser, VSCode, DavMail,
|
||||
Betterbird, OnlyOffice, Spotify, ungoogled-chromium, Karere, HelpWire (vía
|
||||
`.deb`→`debtap`). GNOME añade gnome-calculator/tweaks; KDE añade
|
||||
kcalc/ark/spectacle/kdeconnect/kinfocenter.
|
||||
|
||||
## pkgsync — sincronización de paquetes entre las dos máquinas
|
||||
|
||||
Mismo patrón que chezmoi para los dotfiles (`chezmoi-boot-sync.service` /
|
||||
`chezmoi-shutdown-sync.service` en el repo `arch-configs`), pero para qué
|
||||
paquetes hay instalados de verdad (pacman + AUR + flatpak). Fuente de verdad:
|
||||
los arrays `PACMAN_COMMON`/`AUR_COMMON`/`FLATPAK_COMMON` de
|
||||
`shared/packages-common.sh`. Motor de diff/aplicación:
|
||||
[metapac](https://github.com/ripytide/metapac) (AUR), con `paru` como backend
|
||||
para que cubra repos oficiales y AUR en una sola pasada.
|
||||
|
||||
```
|
||||
pkgsync/
|
||||
├── pkgsync.sh CLI: bootstrap/push/pull/diff/apply/log/incoming/audit
|
||||
└── systemd/
|
||||
├── pkgsync-push.service captura+sube al cerrar sesión/apagar
|
||||
└── pkgsync-pull.service trae+compara al iniciar sesión (nunca instala/desinstala)
|
||||
```
|
||||
|
||||
### Cómo funciona
|
||||
|
||||
- **`pkgsync push`** (dispara `pkgsync-push.service` al cerrar sesión, mismo
|
||||
truco `ExecStop` en unidad oneshot `RemainAfterExit` que usa
|
||||
`chezmoi-shutdown-sync.service`): captura el inventario real
|
||||
(`pacman -Qqen`/`pacman -Qqem`/`flatpak list`), parchea los tres arrays de
|
||||
`packages-common.sh` en un clon dedicado (`~/.local/share/arch-setup`) —
|
||||
añade lo nuevo, quita lo que ya no está instalado — y hace `git commit` +
|
||||
`push` best-effort con timeout, igual que chezmoi. El parcheo respeta los
|
||||
comentarios de agrupación existentes: lo nuevo se añade en un bloque
|
||||
marcador al final del array, listo para que lo reorganices a mano cuando
|
||||
quieras.
|
||||
- **`pkgsync pull`** (dispara `pkgsync-pull.service` al iniciar sesión): `git
|
||||
pull` best-effort con timeout (nunca bloquea el login), calcula el diff
|
||||
entre lo declarado y lo instalado, y **solo notifica** (notificación de
|
||||
escritorio + detalle en `~/.local/share/pkgsync.log`). No instala ni
|
||||
desinstala nada por sí solo.
|
||||
- **`pkgsync apply`** (manual, cuando tú decidas revisar el diff): corre
|
||||
`metapac sync` (instala lo que falte) y `metapac clean` (desinstala lo
|
||||
sobrante), **ambos con la confirmación interactiva nativa de metapac** —
|
||||
nunca se pasa `--no-confirm`, así que siempre ves y confirmas cada borrado
|
||||
antes de que ocurra.
|
||||
- **`pkgsync diff`**: igual que el cálculo de `pull` pero solo imprime, sin
|
||||
tocar git ni notificar.
|
||||
- **`pkgsync incoming`**: commits nuevos en `origin/main` aún no traídos
|
||||
(equivalente a `git log HEAD..origin/main`).
|
||||
- **`pkgsync log [--patch]`**: historial legible de cambios de paquetes
|
||||
(`git log` sobre `shared/packages-common.sh`).
|
||||
- **`pkgsync audit`**: paquetes instalados localmente que no están declarados
|
||||
en ningún array ni en el override local — drift no capturado. Nota: los
|
||||
paquetes específicos de KDE/GNOME hardcodeados en `<de>/setup.sh`
|
||||
(`plasma-desktop`, `sddm`, temas AUR, etc.) siempre van a aparecer aquí —
|
||||
no viven en los arrays por diseño, no es drift real.
|
||||
|
||||
### Paquetes críticos (nunca se borran automáticamente)
|
||||
|
||||
`pkgsync.sh` lleva una lista `CRITICAL_PACKAGES` hardcodeada (kernel,
|
||||
bootloader, drivers gráficos, red de rollback btrfs, y todo lo que sea
|
||||
soporte de hardware: CPU/energía, audio, bluetooth, red física, USB) que es
|
||||
independiente del array — sobrevive aunque el array se corrompa por error
|
||||
humano. Dos capas de protección: `push` nunca la quita del array aunque
|
||||
detecte que un paquete crítico no está instalado localmente (solo avisa en el
|
||||
log), y el group file que se genera para metapac siempre fuerza la unión con
|
||||
esta lista, así que `metapac clean` nunca puede verlos como "no declarados".
|
||||
La lista completa está al principio de `pkgsync.sh`.
|
||||
|
||||
### Overrides locales (divergencias legítimas entre máquinas)
|
||||
|
||||
`~/.config/metapac/groups/overrides.local.toml` — mismo formato de group file
|
||||
que usa metapac. No vive en ningún repo git (fuera de `arch-setup`, en
|
||||
`~/.config/metapac/`), así que ya queda fuera del control de versiones sin
|
||||
necesidad de nada más. `pkgsync` lo lee solo para no proponer esos paquetes
|
||||
como "nuevos" en `push` ni marcarlos como drift en `audit`; nunca lo escribe
|
||||
ni lo sobreescribe. `bootstrap` deja un scaffold comentado si no existe.
|
||||
|
||||
### Instalación
|
||||
|
||||
**Máquinas nuevas**: automático, `install_pkgsync()` (en
|
||||
`packages-common.sh`) se llama desde `<de>/setup.sh` justo después de
|
||||
`chezmoi init --apply`.
|
||||
|
||||
**Las dos máquinas ya instaladas** (retrofit, sin reinstalar):
|
||||
|
||||
```bash
|
||||
mkdir -p ~/.local/bin ~/.config/systemd/user
|
||||
git clone https://gitea.josevi.ovh/josevi/arch-setup.git ~/.local/share/arch-setup
|
||||
cp ~/.local/share/arch-setup/pkgsync/pkgsync.sh ~/.local/bin/ && chmod +x ~/.local/bin/pkgsync.sh
|
||||
cp ~/.local/share/arch-setup/pkgsync/systemd/*.service ~/.config/systemd/user/
|
||||
pkgsync.sh bootstrap
|
||||
systemctl --user enable --now pkgsync-push.service pkgsync-pull.service
|
||||
```
|
||||
|
||||
`loginctl enable-linger` ya está activo por el `run_once` de chezmoi, no hace
|
||||
falta repetirlo. Verifica una vez con `flatpak list
|
||||
--columns=installation,application` que tu instalación de Flatpak es
|
||||
`system` (si es `user`, cambia `FLATPAK_INSTALLATION` al principio de
|
||||
`pkgsync.sh`).
|
||||
|
||||
### Auto-instalar sin supervisión (opt-in, apagado por defecto)
|
||||
|
||||
`pkgsync pull` respeta la variable de entorno `PKGSYNC_AUTO_INSTALL=1`: si
|
||||
está activada, corre `metapac sync --no-confirm` justo después de calcular el
|
||||
diff (solo instala lo que falte). **Nunca** toca `metapac clean` — los
|
||||
borrados siguen requiriendo `pkgsync apply` manual, pase lo que pase.
|
||||
|
||||
Reference in New Issue
Block a user