Files
scripts_mg/omarchy_zsh_setup/omarchy-setup.sh
Marco Gallegos aad23b356c Upgrade Omarchy setup script to version 2.8.1
Updated the Omarchy setup script to version 2.8.1, enhancing features and refining the installation process for Zsh and related utilities. Added logging, improved error handling, and included optional modules for ZeroTier and GNOME Keyring configuration.
2025-11-02 10:35:16 -06:00

304 lines
12 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# =============================================================================
# Omarchy Setup Script v2.8.1 (Omarchy-MG Fusión)
# Autor: Marco G. / 2025
# Descripción:
# Script unificado que combina la estética Catppuccin de la v2.8 con la
# robustez, interactividad y el conjunto completo de características de la v2.3.
# Instala un entorno Zsh completo, utilidades de desarrollo, Docker,
# TeamViewer, ZeroTier y configura GNOME Keyring y SSH.
# =============================================================================
set -euo pipefail
# =============================================================================
# COLORES Y CONFIGURACIÓN GLOBAL (Catppuccin Palette)
# =============================================================================
FLAMINGO="\e[38;5;245m"
MAUVE="\e[38;5;140m"
PEACH="\e[38;5;215m"
GREEN="\e[38;5;121m"
TEAL="\e[38;5;80m"
YELLOW="\e[38;5;229m"
RED="\e[38;5;203m"
BLUE="\e[38;5;75m"
RESET="\e[0m"
TOTAL_STEPS=12
CURRENT_STEP=0
NEEDS_REBOOT=false
LOG_FILE="$HOME/omarchy-setup.log"
ERROR_LOG="$HOME/omarchy-errors.log"
# =============================================================================
# LOGGING, UI Y FUNCIONES AUXILIARES
# =============================================================================
setup_logging() {
: > "$LOG_FILE"
: > "$ERROR_LOG"
exec > >(tee -a "$LOG_FILE")
exec 2> >(tee -a "$ERROR_LOG" >&2)
echo "==================================================================="
echo "OMARCHY SETUP v2.8.1 - $(date '+%Y-%m-%d %H:%M:%S')"
echo "==================================================================="
}
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"; }
log_error() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $1" >&2; }
print_header() {
clear
echo -e "${MAUVE}╔════════════════════════════════════════════════════════════════╗${RESET}"
echo -e "${MAUVE}${RESET} ${PEACH}OMARCHY SETUP v2.8.1 - Edición Fusión${RESET} ${MAUVE}${RESET}"
echo -e "${MAUVE}╚════════════════════════════════════════════════════════════════╝${RESET}"
echo ""
echo -e "${TEAL}Logs:${RESET} $LOG_FILE"
echo -e "${RED}Errores:${RESET} $ERROR_LOG"
echo ""
}
progress_bar() {
local step=$1
local total=$2
local text=$3
local percent=$((step * 100 / total))
local completed=$((step * 40 / total))
local remaining=$((40 - completed))
printf "\r${BLUE}["
printf "%${completed}s" | tr ' ' '█'
printf "%${remaining}s" | tr ' ' '░'
printf "]${RESET} ${percent}%% - ${text}"
}
step() { CURRENT_STEP=$((CURRENT_STEP + 1)); echo -e "\n${YELLOW}→ [${CURRENT_STEP}/${TOTAL_STEPS}] $1${RESET}"; progress_bar $CURRENT_STEP $TOTAL_STEPS "$1"; sleep 0.3; }
success() { echo -e "\n${GREEN}$1${RESET}"; log "SUCCESS: $1"; }
warning() { echo -e "\n${PEACH}$1${RESET}"; log "WARNING: $1"; }
error() { echo -e "\n${RED}$1${RESET}"; log_error "$1"; }
info() { echo -e "${TEAL} $1${RESET}"; log "INFO: $1"; }
ask_yes_no() {
local prompt="$1"
local default="${2:-y}"
[[ "$default" == "y" ]] && prompt+=" [Y/n]: " || prompt+=" [y/N]: "
while true; do
read -p "$(echo -e ${YELLOW}$prompt${RESET})" response
response=${response:-$default}
case $response in
[Yy]*) log "USER: $prompt -> YES"; return 0;;
[Nn]*) log "USER: $prompt -> NO"; return 1;;
*) echo "Por favor responde sí (y) o no (n).";;
esac
done
}
check_installed() { pacman -Q "$1" &> /dev/null; }
# =============================================================================
# FUNCIONES PRINCIPALES DE INSTALACIÓN
# =============================================================================
check_requirements() {
step "Verificando requerimientos del sistema"
if [ "$EUID" -eq 0 ]; then error "No ejecutes este script como root."; exit 1; fi
if ! command -v pacman &> /dev/null; then error "Este script es solo para Arch Linux."; exit 1; fi
if ! ping -c 1 archlinux.org &>/dev/null; then error "Sin conexión a Internet. Abortando."; exit 1; fi
success "Requerimientos verificados."
}
install_packages() {
step "Instalando paquetes base y utilidades"
local packages=(
git curl wget unzip tar base-devel zsh zsh-completions eza bat zoxide nano
python-pip python-virtualenv nodejs npm go docker docker-compose
teamviewer audacity inkscape oh-my-posh yt-dlp ffmpeg playerctl
brightnessctl pamixer lsof net-tools gnome-keyring libsecret seahorse
fastfetch htop btop tree p7zip unrar
)
info "Actualizando base de datos de paquetes..."
sudo pacman -Sy --noconfirm
local to_install=()
for pkg in "${packages[@]}"; do
! check_installed "$pkg" && to_install+=("$pkg")
done
if [ ${#to_install[@]} -gt 0 ]; then
info "Instalando ${#to_install[@]} paquetes nuevos..."
sudo pacman -S --noconfirm --needed "${to_install[@]}"
fi
if ! command -v speedtest &>/dev/null; then
sudo pip install --break-system-packages speedtest-cli || true
fi
success "Paquetes base instalados."
}
install_yay() {
step "Instalando 'yay' (AUR helper)"
if command -v yay &> /dev/null; then success "yay ya está instalado."; return; fi
info "Clonando y compilando yay desde AUR..."
(
cd /tmp
rm -rf yay
git clone https://aur.archlinux.org/yay.git --quiet
cd yay
makepkg -si --noconfirm --nocheck
)
if command -v yay &> /dev/null; then success "yay instalado correctamente."; else error "Fallo al instalar yay."; exit 1; fi
}
setup_docker() {
step "Configurando Docker y permisos de usuario"
sudo systemctl enable --now docker.service
sudo usermod -aG docker "$USER"
success "Docker configurado. Recuerda cerrar y volver a iniciar sesión."
}
install_ohmyzsh() {
step "Instalando Oh My Zsh y plugins"
if [ -d "$HOME/.oh-my-zsh" ]; then info "Oh My Zsh ya está instalado."; else
RUNZSH=no CHSH=no KEEP_ZSHRC=yes sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
fi
local ZSH_CUSTOM="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}"
mkdir -p "$ZSH_CUSTOM/plugins"
git clone https://github.com/zsh-users/zsh-autosuggestions.git "$ZSH_CUSTOM/plugins/zsh-autosuggestions" 2>/dev/null || true
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git "$ZSH_CUSTOM/plugins/zsh-syntax-highlighting" 2>/dev/null || true
success "Oh My Zsh y plugins listos."
}
install_zshrc_and_posh_theme() {
step "Aplicando configuración .zshrc y tema Catppuccin"
local ZSHRC_URL="https://raw.githubusercontent.com/marcogll/scripts_mg/main/omarchy_zsh_setup/.zshrc"
local DEST="$HOME/.zshrc"
if [ -f "$DEST" ]; then
cp "$DEST" "${DEST}.backup.$(date +%Y%m%d_%H%M%S)"
info "Backup del .zshrc existente creado."
fi
if curl -fsSL "$ZSHRC_URL" -o "$DEST"; then
info "Nuevo .zshrc instalado desde GitHub."
else
error "Fallo al descargar .zshrc. Abortando."
exit 1
fi
mkdir -p ~/.poshthemes
wget https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/catppuccin_frappe.omp.json -O ~/.poshthemes/catppuccin.omp.json -q
info "Tema Catppuccin Frappe descargado."
chsh -s "$(which zsh)" "$USER" || true
success "Zsh configurado como shell por defecto."
}
setup_teamviewer() {
step "Configurando TeamViewer"
sudo systemctl enable --now teamviewerd.service
success "Servicio de TeamViewer habilitado y activo."
NEEDS_REBOOT=true
}
install_fonts() {
step "Instalando Nerd Fonts para la terminal"
local FONTS_DIR="$HOME/.local/share/fonts"
mkdir -p "$FONTS_DIR"
if [ ! -f "$FONTS_DIR/JetBrainsMonoNerdFont-Regular.ttf" ]; then
info "Descargando JetBrains Mono Nerd Font..."
curl -fsSL -o "$FONTS_DIR/JetBrainsMonoNerdFont-Regular.ttf" \
"https://github.com/ryanoasis/nerd-fonts/raw/master/patched-fonts/JetBrainsMono/Regular/complete/JetBrains%20Mono%20Nerd%20Font%20Complete.ttf"
fc-cache -f
fi
success "Nerd Fonts instaladas."
}
install_zerotier() {
step "Configurando ZeroTier One"
if ! command -v zerotier-cli &> /dev/null; then
yay -S --noconfirm zerotier-one
fi
sudo systemctl enable --now zerotier-one.service
NEEDS_REBOOT=true
if ask_yes_no "¿Deseas unirte a una red ZeroTier ahora?" "y"; then
read -p "$(echo -e ${YELLOW}Ingresa el Network ID: ${RESET})" ZEROTIER_NETWORK
if [ -n "$ZEROTIER_NETWORK" ]; then
info "Enviando solicitud para unirse a la red..."
sudo zerotier-cli join "$ZEROTIER_NETWORK"
warning "Recuerda autorizar este equipo en my.zerotier.com"
fi
fi
success "ZeroTier configurado."
}
configure_gnome_keyring() {
step "Configurando GNOME Keyring (almacén de contraseñas)"
if ask_yes_no "¿Configurar GNOME Keyring para guardar claves de Git/SSH?" "y"; then
info "Configurando PAM para auto-desbloqueo..."
if ! grep -q "pam_gnome_keyring" /etc/pam.d/login 2>/dev/null; then
echo "auth optional pam_gnome_keyring.so" | sudo tee -a /etc/pam.d/login > /dev/null
echo "session optional pam_gnome_keyring.so auto_start" | sudo tee -a /etc/pam.d/login > /dev/null
fi
eval "$(gnome-keyring-daemon --start --components=pkcs11,secrets,ssh 2>/dev/null)"
export SSH_AUTH_SOCK
success "GNOME Keyring configurado."
fi
}
configure_ssh() {
step "Configurando claves SSH con el agente"
if ask_yes_no "¿Buscar y añadir claves SSH existentes al agente?" "y"; then
mkdir -p ~/.ssh && chmod 700 ~/.ssh
local ssh_keys=()
for key in ~/.ssh/*; do
if [ -f "$key" ] && ! [[ "$key" =~ \.pub$|known_hosts|authorized_keys|config|agent ]]; then
ssh-keygen -l -f "$key" &>/dev/null && ssh_keys+=("$key")
fi
done
if [ ${#ssh_keys[@]} -eq 0 ]; then
warning "No se encontraron claves SSH. Genera una con 'ssh-keygen'."
return
fi
info "Se encontraron ${#ssh_keys[@]} claves. Intentando añadirlas..."
eval "$(gnome-keyring-daemon --start --components=ssh 2>/dev/null)"
export SSH_AUTH_SOCK
for key_path in "${ssh_keys[@]}"; do
ssh-add "$key_path" < /dev/null && info "Clave '$(basename "$key_path")' añadida."
done
success "Claves SSH añadidas al agente."
fi
}
final_message() {
progress_bar $TOTAL_STEPS $TOTAL_STEPS "COMPLETADO"
echo -e "\n\n${GREEN}╔════════════════════════════════════════════════════════════════╗${RESET}"
echo -e "${GREEN}${RESET} ${PEACH}CONFIGURACIÓN FINALIZADA${RESET} ${GREEN}${RESET}"
echo -e "${GREEN}╚════════════════════════════════════════════════════════════════╝${RESET}\n"
if $NEEDS_REBOOT; then
echo -e "${RED}⚠ REINICIO REQUERIDO para aplicar todos los cambios (TeamViewer, ZeroTier, etc.).${RESET}\n"
fi
echo -e "${TEAL}Próximos pasos:${RESET}"
echo " 1. ${YELLOW}CIERRA Y VUELVE A ABRIR LA TERMINAL${RESET} o reinicia tu sesión para usar Zsh."
echo " 2. La primera vez que uses una clave SSH, se te pedirá la contraseña para guardarla en el Keyring."
echo " 3. Comandos para verificar: 'docker ps', 'teamviewer info', 'speedtest', 'zsh'."
echo -e "\n${MAUVE}🚀 ¡Listo para usar Omarchy con la paleta Catppuccin!${RESET}"
}
# =============================================================================
# EJECUCIÓN PRINCIPAL
# =============================================================================
main() {
setup_logging
print_header
check_requirements
install_packages
install_yay
setup_docker
install_ohmyzsh
install_zshrc_and_posh_theme
setup_teamviewer
install_fonts
# Módulos opcionales
install_zerotier
configure_gnome_keyring
configure_ssh
final_message
}
main "$@"