#!/usr/bin/env bash # Instalación + configuración de Arch con GNOME en UN comando desde el USB live. # # ./gnome/setup.sh # # Dos fases en el mismo fichero (ponytail: una sola fuente de verdad por DE, # en vez de duplicar la lógica en un bootstrap + un post-install): # - SETUP_PHASE=host -> corre archinstall y se re-lanza dentro del chroot # - SETUP_PHASE=chroot -> instala paquetes/tema/chezmoi en el sistema nuevo set -euo pipefail REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" DE="gnome" SETUP_PHASE="${SETUP_PHASE:-host}" GITEA="https://gitea.josevi.ovh/josevi" # --------------------------------------------------------------------------- # FASE 1 (USB live): archinstall + chroot # --------------------------------------------------------------------------- if [[ "$SETUP_PHASE" == "host" ]]; then [[ $EUID -eq 0 ]] || { echo "Ejecuta como root desde el live ISO."; exit 1; } read -rp "Usuario a crear: " INSTALL_USER read -rsp "Token de Gitea (repo arch-configs privado, Enter si es público): " GITEA_TOKEN; echo read -rp "Nombre para git [$INSTALL_USER]: " GIT_NAME; GIT_NAME="${GIT_NAME:-$INSTALL_USER}" read -rp "Email para git [josevisw@gmail.com]: " GIT_EMAIL; GIT_EMAIL="${GIT_EMAIL:-josevisw@gmail.com}" echo ">> Generando disk_config dimensionado a los discos reales..." # archinstall 4.x quitó "Percent": el layout se calcula aquí (ver shared/gen-disk-config.py) python3 "$REPO_DIR/shared/gen-disk-config.py" "$REPO_DIR/$DE/archinstall-config.json" >/tmp/archinstall-merged.json echo ">> Lanzando archinstall (instala base + GNOME en /mnt)..." archinstall --config /tmp/archinstall-merged.json --silent echo ">> Copiando arch-setup al sistema nuevo y entrando en chroot..." cp -r "$REPO_DIR" /mnt/root/arch-setup arch-chroot /mnt env \ SETUP_PHASE=chroot INSTALL_USER="$INSTALL_USER" GITEA_TOKEN="$GITEA_TOKEN" \ GIT_NAME="$GIT_NAME" GIT_EMAIL="$GIT_EMAIL" \ bash "/root/arch-setup/$DE/setup.sh" echo ">> Listo. Quita el USB y reinicia: reboot" exit 0 fi # --------------------------------------------------------------------------- # FASE 2 (dentro del chroot) # --------------------------------------------------------------------------- : "${INSTALL_USER:?falta INSTALL_USER}" source "$(dirname "${BASH_SOURCE[0]}")/../shared/packages-common.sh" echo ">> Creando usuario $INSTALL_USER..." id "$INSTALL_USER" &>/dev/null || useradd -m -G wheel -s /bin/zsh "$INSTALL_USER" echo "Contraseña para $INSTALL_USER:"; passwd "$INSTALL_USER" # wheel con sudo; NOPASSWD temporal para que paru/makepkg no se cuelguen echo '%wheel ALL=(ALL:ALL) ALL' >/etc/sudoers.d/10-wheel echo "$INSTALL_USER ALL=(ALL) NOPASSWD: ALL" >/etc/sudoers.d/99-setup-nopasswd echo ">> GNOME mínimo + apps oficiales (pacman)..." # GNOME curado en vez del grupo 'gnome' completo (que mete Maps, Weather, Music, # Tour, Web/Epiphany, Contacts, Rygel...). archinstall solo instala la base; # el escritorio y los drivers gráficos open-source los ponemos aquí. install_pacman "${PACMAN_COMMON[@]}" \ gnome-shell gdm gnome-control-center gnome-session gnome-keyring \ xdg-desktop-portal-gnome xdg-user-dirs-gtk gvfs \ nautilus gnome-console gnome-text-editor gnome-calculator loupe \ gnome-tweaks gnome-themes-extra gnome-shell-extension-appindicator \ gnome-backgrounds power-profiles-daemon \ mesa vulkan-icd-loader vulkan-radeon vulkan-intel intel-media-driver echo ">> Bootloader (GRUB)..." install_bootloader echo ">> Bootstrapeando paru y paquetes AUR..." bootstrap_paru install_aur "${AUR_COMMON[@]}" \ catppuccin-gtk-theme-mocha \ gnome-shell-extension-dash-to-dock \ gnome-shell-extension-caffeine \ gnome-shell-extension-blur-my-shell \ gnome-shell-extension-clipboard-indicator \ gnome-shell-extension-vitals install_helpwire install_claude_code echo ">> Servicios..." systemctl enable gdm systemctl enable NetworkManager systemctl enable bluetooth systemctl enable "syncthing@$INSTALL_USER.service" systemctl enable tailscaled systemctl enable power-profiles-daemon systemctl enable cpupower # --- Aspecto: se aplica en el PRIMER login gráfico ------------------------ # ponytail: dconf/gsettings necesitan sesión D-Bus, que no existe en chroot. # Un oneshot de autostart lo aplica al primer login y se autodesactiva. USER_HOME="/home/$INSTALL_USER" install -d -o "$INSTALL_USER" -g "$INSTALL_USER" "$USER_HOME/.local/bin" "$USER_HOME/.config/autostart" cat >"$USER_HOME/.local/bin/firstboot-theme.sh" <<'EOS' #!/usr/bin/env bash set -e # Teclado: US internacional con teclas muertas gsettings set org.gnome.desktop.input-sources sources "[('xkb', 'us+intl')]" gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark' gsettings set org.gnome.desktop.interface gtk-theme 'catppuccin-mocha-blue-standard+default' gsettings set org.gnome.desktop.interface icon-theme 'Papirus-Dark' gsettings set org.gnome.desktop.interface font-name 'JetBrainsMono Nerd Font 11' gsettings set org.gnome.desktop.interface monospace-font-name 'JetBrainsMono Nerd Font Mono 12' for e in \ dash-to-dock@micxgx.gmail.com \ appindicatorsupport@rgcjonas.gmail.com \ blur-my-shell@aunetx \ caffeine@patapon.info \ clipboard-indicator@tudmotu.com \ Vitals@CoreCoding.com ; do gnome-extensions enable "$e" 2>/dev/null || true done # Dock estilo macOS abajo D=org.gnome.shell.extensions.dash-to-dock gsettings set $D dock-position 'BOTTOM' 2>/dev/null || true gsettings set $D extend-height false 2>/dev/null || true gsettings set $D dock-fixed false 2>/dev/null || true # autodesactivarse rm -f "$HOME/.config/autostart/firstboot-theme.desktop" EOS chmod +x "$USER_HOME/.local/bin/firstboot-theme.sh" cat >"$USER_HOME/.config/autostart/firstboot-theme.desktop" <> chezmoi init --apply (repo arch-configs)..." REMOTE="$GITEA/arch-configs.git" [[ -n "${GITEA_TOKEN:-}" ]] && REMOTE="https://$INSTALL_USER:$GITEA_TOKEN@gitea.josevi.ovh/josevi/arch-configs.git" as_user "export GIT_NAME='$GIT_NAME' GIT_EMAIL='$GIT_EMAIL'; \ chezmoi init --apply '$REMOTE'" # quitar el NOPASSWD temporal rm -f /etc/sudoers.d/99-setup-nopasswd echo ">> Configuración de GNOME completada."