diff --git a/Readme.md b/Readme.md index 8eb2e63..a70b914 100644 --- a/Readme.md +++ b/Readme.md @@ -1,165 +1,539 @@ -# 🚀 Omarchy Setup Script +# 🚀 Omarchy Setup Script v3.0.0 Script de instalación y configuración **modular** para **Arch Linux / Omarchy** con menú interactivo. ## 🎯 Características Principales -- **✅ Estructura Modular**: Scripts independientes para cada componente. -- **🎨 Menú Interactivo**: Selecciona qué instalar según tus necesidades. -- **🌀 Progreso Limpio**: Las tareas en background muestran el estado sin invadir los prompts. -- **🔐 Sesión Sudo Persistente**: Reutiliza la contraseña durante toda la ejecución. -- **🔧 Fácil de Extender**: Agrega nuevos módulos fácilmente. +- **✅ Estructura Modular**: Scripts independientes para cada componente +- **🎨 Menú Interactivo**: Selecciona qué instalar según tus necesidades +- **🌀 Progreso Limpio**: Las tareas en background muestran el estado sin invadir los prompts interactivos +- **🔐 Sesión Sudo Persistente**: Reutiliza la contraseña durante toda la ejecución para evitar interrupciones +- **🔧 Fácil de Extender**: Agrega nuevos módulos fácilmente ## ⚡ Instalación rápida ```bash +# Clonar el repositorio +git clone https://github.com/marcogll/omarchy_setup.git +cd omarchy_setup + +# Ejecutar el script maestro +./omarchy-setup.sh +``` + +## 📦 Estructura Modular + +``` +omarchy_zsh_setup/ +├── omarchy-setup.sh # Script maestro con menú interactivo +├── modules/ +│ ├── common.sh # Funciones comunes (colores, logging, etc.) +│ ├── apps.sh # Instalación de aplicaciones +│ ├── zsh-config.sh # Configuración de Zsh +│ ├── docker.sh # Docker y Portainer +│ ├── zerotier.sh # ZeroTier VPN +│ ├── printer.sh # Configuración de impresoras (CUPS) +│ ├── mouse_cursor.sh # Tema de cursor Bibata +│ ├── icon_manager.sh # Gestor de temas de iconos +│ ├── ssh-keyring.sh # Sincronización de claves SSH con GNOME Keyring +│ ├── davinci-resolve.sh # DaVinci Resolve (Intel Edition) +└── Readme.md +``` + +## 🎮 Uso del Menú Interactivo + +Al ejecutar `./omarchy-setup.sh`, verás un menú con las siguientes opciones: + +``` +╔════════════════════════════════════════════════════════════╗ +║ 🌀 Omarchy Setup Script — Configuración Modular ║ +╚════════════════════════════════════════════════════════════╝ + +Selecciona las opciones que deseas instalar: + + 1) 📦 Instalar Aplicaciones (VS Code, VLC, drivers, etc.) + 2) 🐚 Configurar Zsh (shell, plugins, config) + 3) 🐳 Instalar Docker y Portainer + 4) 🌐 Instalar ZeroTier VPN + 5) 🖨️ Configurar Impresoras (CUPS) + 6) 🖱️ Instalar Tema de Cursor (Bibata) + 7) 🎨 Gestionar Temas de Iconos (Papirus, Tela, etc.) + K) 🔐 Sincronizar claves SSH con GNOME Keyring + F) 💾 Habilitar Formatos FAT/exFAT/NTFS/ext4 + H) 🎨 Instalar Configuración de Hyprland + R) 🎬 Instalar DaVinci Resolve (Intel Edition) + A) ✅ Instalar Todo (opciones 1, 2, K, 3, 4, 5, 6, 7, F, H) + 0) 🚪 Salir +``` + +> ℹ️ **Nota:** La opción `A) Instalar Todo` ejecuta los módulos 1, 2, K, 3, 4, 5, 6, 7, F y H. DaVinci Resolve (`R`) no se incluye aquí; instálalo manualmente cuando ya tengas el ZIP en `~/Downloads/`. + +> 🌀 **Progreso limpio:** Los módulos en background informan su avance sin animaciones invasivas; toda la salida detallada se imprime limpia y se escribe en `./logs/`. + +## 📋 Módulos Disponibles + +### 1. 📦 Aplicaciones (`apps.sh`) +- Editores como VS Code y Cursor (desde AUR) +- Configura GNOME Keyring como agente de contraseñas y SSH, iniciando el daemon y exportando `SSH_AUTH_SOCK` +- Detecta claves privadas en `~/.ssh` y las registra automáticamente con `ssh-add` +- Instala y habilita servicios complementarios (keyd, logiops, TeamViewer, etc.) + +### 2. 🐚 Zsh (`zsh-config.sh`) +- Instala Oh My Zsh y Oh My Posh (Catppuccin Frappe) con autocompletado +- Clona/actualiza plugins externos como `zsh-autosuggestions` y `zsh-syntax-highlighting` (con fallback al sistema) +- Modifica `.bashrc` para lanzar Zsh automáticamente + +### 3. 🐳 Docker (`docker.sh`) +- Instalación de Docker y Docker Compose +- Configuración de servicios +- Instalación de Portainer +- Agregar usuario al grupo docker + +### 4. 🌐 ZeroTier (`zerotier.sh`) +- Instalación de ZeroTier One +- Configuración de servicio +- Instrucciones para unirse a redes + +### 5. 🖨️ Impresoras (`printer.sh`) +- Instalación de CUPS +- Drivers comunes de impresora + +### 6. 🖱️ Tema de Cursor (`mouse_cursor.sh`) +- Instala el tema de cursor `Bibata-Modern-Ice`. +- Configura el cursor para Hyprland y aplicaciones GTK. + +### 7. 🎨 Gestor de Iconos (`icon_manager.sh`) +- Menú interactivo para instalar y cambiar entre temas de iconos como Papirus, Tela y Candy. + +### K. 🔐 Sincronizar Claves SSH (`ssh-keyring.sh`) +- Inicia/activa GNOME Keyring para componentes `ssh` y `secrets` +- Exporta `SSH_AUTH_SOCK` y registra claves desde `~/.ssh` usando `ssh-add` +- Evita duplicados mediante fingerprints y muestra un resumen al finalizar + +### F. 💾 Soporte de Formatos (`disk-format.sh`) +- Instala utilidades para FAT32, exFAT, NTFS y ext4 +- Añade herramientas gráficas (GParted, GNOME Disks) para formateo manual + +### R. 🎬 DaVinci Resolve (`davinci-resolve.sh`) +- Configuración de librerías y wrapper + +## 🔧 Ejecutar Módulos Individualmente + +Cada módulo puede ejecutarse de forma independiente: + +```bash +# Instalar solo aplicaciones +./modules/apps.sh + +# Configurar solo Zsh +./modules/zsh-config.sh + +# Sincronizar claves SSH con GNOME Keyring +./modules/ssh-keyring.sh + +# Instalar Docker +./modules/docker.sh +``` + +## 🌐 Instalación desde URL + +**Nota**: El script requiere que los módulos estén presentes localmente. Se recomienda clonar el repositorio completo. + +```bash +# Clonar el repositorio git clone https://github.com/marcogll/omarchy_setup.git cd omarchy_setup ./omarchy-setup.sh ``` -## 📂 Estructura del Repositorio +--- -``` -omarchy_setup/ -├── omarchy-setup.sh # Script principal con el menú interactivo. -├── modules/ # Directorio con todos los módulos de instalación. -│ ├── common.sh # Funciones compartidas por todos los módulos. -│ ├── apps.sh # Instalación de aplicaciones y herramientas. -│ ├── zsh-config.sh # Configuración de Zsh, Oh My Zsh y Oh My Posh. -│ └── ... # Otros módulos. -└── hypr_config/ # Configuración de Hyprland (copiada por el módulo). +## ✨ Características de los Módulos + +### 📦 Aplicaciones +- **Herramientas base**: git, curl, wget, base-devel, stow +- **Editores**: + - VS Code (desde AUR: visual-studio-code-bin) + - Cursor (desde AUR: cursor-bin) +- **Multimedia**: + - VLC con todos los plugins (vlc-plugins-all) + - Audacity (editor de audio) + - Inkscape (editor gráfico vectorial) + - ffmpeg, gstreamer con plugins + - yt-dlp (descarga de videos) +- **Red y transferencia**: + - FileZilla (cliente FTP) + - Telegram Desktop + - scrcpy (control Android desde PC) +- **Utilidades**: neofetch, htop, fastfetch, btop, vim, nano, tmux +- **Seguridad y sincronización**: + - GNOME Keyring + libsecret + Seahorse + - Configuración automática del agente SSH y carga de claves en `~/.ssh` + - openssh, rsync +- Recomendado cerrar sesión tras la instalación para que las variables de entorno del keyring se apliquen a nuevas terminales +- **Flatpak**: Sistema de paquetes universal +- **Drivers Intel Iris Xe**: + - Mesa y Vulkan (gráficos 3D) + - Intel Media Driver (aceleración de video VA-API) + - OpenCL (Intel Compute Runtime desde AUR) + - Codecs y herramientas de hardware acceleration +- **Desde AUR**: + - keyd (remapeo de teclado) + - fragments (cliente BitTorrent) + - logiops (driver Logitech) + - ltunify (Logitech Unifying Receiver) + - TeamViewer (acceso remoto, con daemon habilitado) + - intel-compute-runtime (OpenCL para Intel) + +### 🐚 Zsh +- Oh My Zsh + Oh My Posh (tema Catppuccin Frappe) +- Plugins externos gestionados automáticamente (`zsh-autosuggestions`, `zsh-syntax-highlighting`) +- Genera el archivo de autocompletado `_oh-my-posh` en `~/.local/share/zsh/site-functions` +- Modifica `.bashrc` para lanzar Zsh automáticamente + +### 🔐 GNOME Keyring SSH +- Arranca el daemon de GNOME Keyring con componentes de `ssh` y `secrets` +- Garantiza que `SSH_AUTH_SOCK` apunte al socket del keyring (persistido en `~/.config/environment.d`) +- Busca claves privadas en `~/.ssh` (excluyendo `.pub` y certificados) y las registra con `ssh-add` +- Evita añadir claves duplicadas y muestra cómo verificar con `ssh-add -l` + +### 🐳 Docker +- Portainer (interfaz web de gestión) +- Usuario agregado al grupo docker +- Servicios habilitados y configurados + +### 🌐 ZeroTier +- ZeroTier One VPN +- Servicio configurado y habilitado +- Instrucciones para unirse a redes + +### 🖨️ Impresoras +- CUPS (Common Unix Printing System) +- Drivers comunes de impresora +- Interfaz web en http://localhost:631 +- Soporte para impresoras de red + +### 🎬 DaVinci Resolve +- Instalación para Intel GPU +- Configuración de OpenCL +- Ajuste de librerías del sistema +- Wrapper para ejecución + +--- + +## 📦 Paquetes instalados + +
+Ver lista completa (click para expandir) + +### Sistema Base +- **zsh**, **zsh-completions** +- **oh-my-posh-bin** (desde AUR) +- **git**, **curl**, **wget** +- **yay** (AUR helper, compilado desde AUR) + +### Desarrollo +- **python**, **python-pip**, **python-virtualenv** +- **nodejs**, **npm** +- **go** (Golang) +- **docker**, **docker-compose** +- **base-devel** (herramientas de compilación) + +### Utilidades de Terminal +- **eza** (ls mejorado) +- **bat** (cat mejorado) +- **zoxide** (cd inteligente) +- **fastfetch** (info del sistema) +- **htop**, **btop** (monitores del sistema) +- **tree** (visualización de directorios) + +### Multimedia y Control +- **yt-dlp**, **ffmpeg** +- **playerctl**, **brightnessctl**, **pamixer** +- **audacity**, **inkscape** + +### Red y Seguridad +- **zerotier-one** (desde AUR) +- **gnome-keyring**, **libsecret**, **seahorse** +- **lsof**, **net-tools** +- **teamviewer** + +### Utilidades del Sistema +- **nano**, **unzip**, **tar** +- **p7zip**, **unrar** + +### Instalaciones Adicionales +- **speedtest-cli** (vía pip) + +
+ +--- + +## 🎯 Durante la instalación + +El script ejecuta los siguientes pasos: + +1. **Verificación de requerimientos** (root, Arch Linux, conexión a Internet) +2. **Instalación de paquetes base** desde repositorios oficiales +3. **Instalación de yay** desde AUR (si no está instalado) +4. **Configuración de Docker** (servicio y permisos de usuario) +5. **Instalación de Oh My Zsh y plugins** +6. **Configuración de .zshrc y tema Catppuccin** desde GitHub +7. **Configuración de TeamViewer** (servicio) +8. **Instalación de ZeroTier One** desde AUR (opcional) +9. **Configuración de GNOME Keyring** (opcional) +10. **Configuración de claves SSH** (opcional) + +### Preguntas interactivas: + +- **ZeroTier Network ID**: Si deseas unirte a una red ZeroTier (opcional) +- **GNOME Keyring**: Si deseas configurar el almacén de contraseñas +- **Claves SSH**: Si deseas añadir claves SSH existentes al agente + +--- + +## 🔑 GNOME Keyring + +El keyring guarda contraseñas de forma segura: +- **Git** (credential helper) +- **SSH keys** (almacenadas de forma segura) +- **Aplicaciones GNOME** + +### Configuración automática: + +El script configura automáticamente: +- PAM para auto-desbloqueo del keyring +- Inicio automático de gnome-keyring-daemon +- Integración con SSH agent + +### Comandos útiles: + +```bash +# Abrir gestor de contraseñas +seahorse + +# Ver estado del keyring +gnome-keyring-daemon --version + +# Comandos de ZeroTier (aliases en .zshrc) +zt # Alias de sudo zerotier-cli +ztstatus # Ver redes conectadas (listnetworks) +ztinfo # Info del nodo (info) ``` --- -## 📋 Módulos Disponibles +## ⚙️ Configuración incluida -A continuación se describe cada uno de los módulos que puedes instalar. +### Aliases de Arch Linux +```bash +pacu # Actualizar sistema +paci # Instalar paquete +pacr # Remover paquete +pacs # Buscar paquete +yayu # Actualizar AUR +yayi # Instalar desde AUR +``` -### 1. Aplicaciones (`apps.sh`) +### Git shortcuts +```bash +gs # git status +ga # git add +gc # git commit +gcm "msg" # git commit -m +gp # git push +gl # git pull +gco # git checkout +gcb # git checkout -b +glog # git log gráfico +gac "msg" # add + commit +``` -Este módulo instala un conjunto de aplicaciones y herramientas esenciales para un entorno de desarrollo y de escritorio completo. +### Docker +```bash +dc # docker compose +d # docker +dps # docker ps -a +di # docker images +dex sh # docker exec -it +dlog # docker logs -f +``` -- **Qué instala:** - - **Herramientas de sistema:** `git`, `curl`, `htop`, `fastfetch`, `stow`, `gnome-keyring`. - - **Editores de código:** Visual Studio Code (`visual-studio-code-bin`) y Cursor (`cursor-bin`) desde AUR. - - **Multimedia:** VLC, Audacity, Inkscape y `yt-dlp`. - - **Red:** FileZilla, Telegram y `speedtest-cli`. - - **Drivers de Intel:** Soporte completo para gráficos **Intel Iris Xe**, incluyendo Mesa, Vulkan, VA-API para aceleración de video y OpenCL. - - **Utilidades de AUR:** `keyd` (remapeo de teclado), `logiops` (configuración de ratones Logitech), `teamviewer`. +### Python +```bash +py # python +venv create # Crear .venv +venv on # Activar +venv off # Desactivar +pir # pip install -r requirements.txt +pipf # pip freeze > requirements.txt +``` -- **Cómo funciona:** - - Instala paquetes desde los repositorios oficiales y AUR. - - Configura **GNOME Keyring** para actuar como agente de SSH, cargando automáticamente las claves que encuentre en `~/.ssh`. - - Habilita los servicios necesarios para `keyd`, `logiops` y `teamviewer`. +### yt-dlp +```bash +ytm # Descargar audio MP3 320kbps +ytm "lofi beats" # Buscar y descargar +ytv # Descargar video MP4 (calidad por defecto) +ytv 1080 # Descargar video en 1080p +ytv 720 # Descargar video en 720p +ytls # Listar últimos descargas +``` -### 2. Zsh (`zsh-config.sh`) +Descargas en: `~/Videos/YouTube/{Music,Videos}/` -Transforma la terminal con Zsh, Oh My Zsh y Oh My Posh, junto con una configuración personalizada que incluye aliases y funciones útiles. +### NPM +```bash +nrs # npm run start +nrd # npm run dev +nrb # npm run build +nrt # npm run test +ni # npm install +nid # npm install --save-dev +nig # npm install -g +``` -- **Qué instala:** - - `zsh` y plugins como `zsh-syntax-highlighting` y `zsh-autosuggestions`. - - **Oh My Zsh** para la gestión de la configuración de Zsh. - - **Oh My Posh** como motor para el prompt, con el tema **Catppuccin Frappe**. - - Herramientas de terminal como `zoxide` para una navegación rápida. +### Utilidades +```bash +mkcd # mkdir + cd +extract # Extraer cualquier archivo +killport # Matar proceso en puerto +serve [port] # Servidor HTTP (default 8000) +clima # Ver clima Saltillo +``` -- **Cómo funciona:** - - Instala todas las dependencias y clona los repositorios necesarios. - - Reemplaza tu `~/.zshrc` con una versión preconfigurada (creando una copia de seguridad). - - Cambia tu shell por defecto a Zsh. +--- -> **¡Importante!** Después de instalar este módulo, necesitarás instalar una **Nerd Font** para que el prompt se vea bien. El script te recomendará instalar la fuente **Meslo** con el comando: `oh-my-posh font install meslo`. +## 🌐 ZeroTier Network ID -### 3. Docker (`docker.sh`) +Tu Network ID tiene formato: `a0cbf4b62a1234567` (16 caracteres hex) -Instala y configura Docker para la gestión de contenedores. +### Dónde encontrarlo: +1. Ve a https://my.zerotier.com +2. Selecciona tu red +3. Copia el Network ID -- **Qué instala:** - - `docker` y `docker-compose`. - - (Opcional) **Portainer**, una interfaz web para gestionar Docker. +### Después de la instalación: +1. Ve a tu panel de ZeroTier +2. Busca el nuevo dispositivo +3. **Autorízalo** marcando el checkbox -- **Cómo funciona:** - - Habilita el servicio de Docker. - - Añade tu usuario al grupo `docker`, lo que te permite ejecutar comandos de Docker sin `sudo` (requiere reiniciar sesión). - - Te pregunta si quieres instalar Portainer. +### Comandos útiles: +```bash +# Ver redes +ztstatus -### 4. ZeroTier (`zerotier.sh`) +# Unirse a red +sudo zerotier-cli join -Instala el cliente de ZeroTier, una herramienta para crear redes virtuales seguras. +# Salir de red +sudo zerotier-cli leave -- **Qué instala:** - - El paquete `zerotier-one`. +# Info del nodo +ztinfo +``` -- **Cómo funciona:** - - Habilita el servicio de ZeroTier. - - Te ofrece unirte a una red de ZeroTier de forma interactiva después de la instalación. +--- -### 5. Impresoras (`printer.sh`) +## 📂 Estructura creada -Instala y configura el sistema de impresión CUPS. +``` +$HOME/ +├── .zshrc # Configuración de Zsh (descargado desde GitHub) +├── .zshrc.local # Config local (opcional, no creado automáticamente) +├── .oh-my-zsh/ # Oh My Zsh +│ └── custom/plugins/ # Plugins adicionales +│ ├── zsh-autosuggestions/ +│ └── zsh-syntax-highlighting/ +├── .poshthemes/ # Temas Oh My Posh +│ └── catppuccin_frappe.omp.json # Tema Catppuccin Frappe +├── .zsh_functions/ # Funciones personalizadas (directorio creado) +├── Videos/YouTube/ # Descargas de yt-dlp +│ ├── Music/ # Audios MP3 +│ └── Videos/ # Videos MP4 +├── .ssh/ # Claves SSH (si existen) +└── omarchy-setup.log # Log de instalación +``` -- **Qué instala:** - - `cups`, `cups-pdf` y filtros de impresión. - - Drivers de impresión genéricos (`gutenprint`, `foomatic-db`). - - Drivers para impresoras **Epson** desde AUR. - - `avahi` para la detección de impresoras en red. +--- -- **Cómo funciona:** - - Habilita los servicios de `cups` y `avahi`. - - Añade tu usuario al grupo `lp` para que puedas administrar impresoras (requiere reiniciar sesión). +## 🔄 Después de la instalación -### 6. Tema de Cursor (`mouse_cursor.sh`) +### 1. Reiniciar sesión o terminal (IMPORTANTE) -Instala un tema de cursor personalizado y lo configura para Hyprland y aplicaciones GTK. +**⚠️ REINICIO REQUERIDO** si se instalaron servicios como TeamViewer o ZeroTier. -- **Qué instala:** - - El tema de cursor **Bibata-Modern-Ice**. +```bash +# Cerrar y volver a abrir la terminal para usar Zsh +# O cerrar sesión y volver a entrar para aplicar: +# - Cambio de shell a Zsh +# - Grupos (docker) +# - Permisos del sistema +``` -- **Cómo funciona:** - - Descarga el tema y lo instala en `~/.icons`. - - Modifica los ficheros de configuración de Hyprland (`envs.conf`) y GTK (`gsettings`). +### 2. Verificar instalación -### 7. Gestor de Iconos (`icon_manager.sh`) +```bash +# Ver versión de Zsh +zsh --version -Un menú interactivo para instalar y cambiar entre diferentes temas de iconos. +# Ver tema Oh My Posh +oh-my-posh version -- **Qué instala (a elección):** - - **Tela** (variante Nord). - - **Papirus** (estándar o con colores Catppuccin). - - **Candy Icons**. +# Verificar Docker +docker ps -- **Cómo funciona:** - - Clona los repositorios de los temas de iconos desde GitHub. - - Modifica la configuración de Hyprland (`autostart.conf`) para que el tema sea persistente. +# Ver ZeroTier (si se configuró) +ztstatus -### 8. Sincronizar Claves SSH (`ssh-keyring.sh`) +# Ver TeamViewer (si se instaló) +teamviewer info -Añade tus claves SSH existentes al agente de GNOME Keyring para que no tengas que escribir tu passphrase repetidamente. +# Actualizar sistema +pacu +``` -- **Cómo funciona:** - - Inicia el `gnome-keyring-daemon`. - - Busca claves privadas en `~/.ssh` y las añade al agente usando `ssh-add`. - - Evita añadir claves que ya estén cargadas. +### 3. Configuraciones opcionales -### 9. Soporte de Formatos (`disk-format.sh`) +```bash +# Crear archivo de configuración local +nano ~/.zshrc.local -Instala herramientas para poder leer, escribir y formatear particiones con los sistemas de archivos más comunes. +# Ejemplo de contenido: +export OPENAI_API_KEY="sk-..." +export GITHUB_TOKEN="ghp_..." +alias miproyecto="cd ~/Projects/mi-app && code ." +``` -- **Qué instala:** - - `dosfstools` (para FAT), `exfatprogs` (para exFAT) y `ntfs-3g` (para NTFS). - - Herramientas gráficas como **GParted** y **GNOME Disks**. +--- -### 10. DaVinci Resolve (`davinci-resolve.sh`) +## 🛠️ Solución de problemas -Un instalador especializado para DaVinci Resolve, enfocado en sistemas con GPUs de Intel. +### Docker no funciona sin sudo -> **Nota:** Este módulo es complejo y requiere que hayas descargado previamente el fichero ZIP de DaVinci Resolve desde la web de Blackmagic y lo hayas colocado en tu carpeta de `~/Downloads`. +```bash +# Verificar que estás en el grupo docker +groups # Debe incluir 'docker' -- **Cómo funciona:** - - Instala todas las dependencias necesarias, incluyendo librerías de `ocl-icd` y `intel-compute-runtime`. - - Extrae el instalador, aplica parches a las librerías con `patchelf` y lo copia todo a `/opt/resolve`. - - Crea un script "wrapper" y un acceso directo en el menú de aplicaciones para lanzar el programa con la configuración correcta. +# Si no aparece, reinicia sesión o ejecuta: +newgrp docker + +# Verificar acceso +docker ps +``` + +### Git sigue pidiendo contraseña + +```bash +# Verificar credential helper +git config --global credential.helper + +# Debe ser: libsecret + +# Si no, configurar: +git config --global credential.helper libsecret + +# Abrir Seahorse y verificar keyring +seahorse # Verificar que el keyring está corriendo pgrep -u "$USER" gnome-keyring-daemon @@ -201,7 +575,8 @@ Después de instalar la fuente, **debes configurar tu emulador de terminal** par # Verificar que oh-my-posh está instalado which oh-my-posh -Instala una configuración personalizada para el gestor de ventanas Hyprland. +# Verificar que el tema existe +ls ~/.poshthemes/catppuccin_frappe.omp.json # Listar fuentes para confirmar que Meslo está instalada fc-list | grep -i "meslo" @@ -221,16 +596,160 @@ chsh -s $(which zsh) --- -## 🔧 Extender el Script +## 📚 Recursos -Añadir un nuevo módulo es sencillo: +- **Arch Wiki**: https://wiki.archlinux.org/ +- **Oh My Zsh**: https://ohmyz.sh/ +- **Oh My Posh**: https://ohmyposh.dev/ +- **Catppuccin Theme**: https://github.com/catppuccin/catppuccin +- **ZeroTier**: https://www.zerotier.com/ +- **yt-dlp**: https://github.com/yt-dlp/yt-dlp +- **Nerd Fonts**: https://www.nerdfonts.com/ (requerido para iconos del prompt) +- **yay AUR Helper**: https://github.com/Jguer/yay -1. **Crea tu script** en la carpeta `modules/` (ej. `mi-modulo.sh`). Asegúrate de que tenga una función principal. -2. **Añádelo al menú** en `omarchy-setup.sh`, dentro del array `MODULES`. Sigue el formato: `"tecla"="nombre-fichero;nombre-funcion;Descripción;tipo"`. - - `tipo` puede ser `bg` (para tareas en segundo plano) o `fg` (para tareas interactivas). +--- + +## 🆘 Soporte + +Si encuentras problemas: + +1. Revisa los mensajes de error durante la instalación +2. Verifica que cerraste sesión después de instalar (para aplicar grupos) +3. Comprueba que los grupos se aplicaron: `groups` +4. Verifica que los módulos están presentes: `ls modules/` +5. Ejecuta módulos individualmente para aislar problemas +6. Abre un issue en: https://github.com/marcogll/scripts_mg/issues + +### Verificar Instalación de Módulos + +```bash +# Verificar que todos los módulos existen +ls -la modules/ + +# Ejecutar un módulo individual para debug +bash -x modules/apps.sh +``` + +--- + +## 🔧 Agregar Nuevos Módulos + +Para agregar un nuevo módulo: + +1. Crea un archivo en `modules/nombre-modulo.sh`: + +```bash +#!/usr/bin/env bash +# =============================================================== +# nombre-modulo.sh - Descripción del módulo +# =============================================================== + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +source "${SCRIPT_DIR}/common.sh" + +install_nombre_modulo() { + log_step "Instalación de Nombre Módulo" + + # Tu código aquí + log_info "Instalando paquetes..." + sudo pacman -S --noconfirm --needed paquete1 paquete2 || { + log_error "Error al instalar paquetes" + return 1 + } + + log_success "Módulo instalado correctamente" + return 0 +} + +# Ejecutar si se llama directamente +if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then + install_nombre_modulo "$@" +fi +``` + +2. Agrega el módulo al menú en `omarchy-setup.sh`: + +Dentro del script `omarchy-setup.sh`, localiza el array asociativo `MODULES` y añade una nueva línea. + +```bash +# --- Definición de Módulos --- +# Clave: Opción del menú +# Valor: "Nombre del Fichero;Función Principal;Descripción;Tipo (bg/fg)" +declare -A MODULES +MODULES=( + ["1"]="apps;run_module_main;📦 Instalar Aplicaciones;bg" + # ... otros módulos ... + ["N"]="nombre-modulo;install_nombre_modulo;🚀 Mi Nuevo Módulo;fg" +) +``` + +- **Clave (`"N"`):** La tecla que el usuario presionará en el menú. +- **Valor:** Una cadena de texto con 4 partes separadas por punto y coma (`;`): + 1. `nombre-modulo`: El nombre del fichero `.sh` sin la extensión. + 2. `install_nombre_modulo`: La función dentro de ese fichero que se debe ejecutar. + 3. `🚀 Mi Nuevo Módulo`: La descripción que aparecerá en el menú. + 4. `fg` o `bg`: `fg` (foreground) para scripts interactivos, `bg` (background) para tareas que pueden usar un spinner. + +3. Si quieres incluirlo en la opción "Instalar Todo", añade la clave del menú (en este caso, `"N"`) al array `INSTALL_ALL_CHOICES`. + +--- + +## 📝 Changelog + +### v3.0.0 (2025-01-XX) +- ✨ **Nueva estructura modular**: Scripts independientes para cada componente +- 🎨 **Menú interactivo**: Selecciona qué instalar según tus necesidades +- 🎨 **Interfaz mejorada**: Colores y mensajes claros durante la instalación +- 📦 **Módulos disponibles**: + - Aplicaciones (apps.sh) + - Zsh (zsh-config.sh) + - Docker y Portainer (docker.sh) + - ZeroTier (zerotier.sh) + - Impresoras CUPS (printer.sh) + - Tema de Cursor (mouse_cursor.sh) + - DaVinci Resolve (davinci-resolve.sh) + - Gestor de Iconos (icon_manager.sh) + +### v2.8.1 (2025-11-02) +- Versión unificada con estética Catppuccin +- Instalación mejorada de paquetes con manejo de errores robusto +- **oh-my-posh** instalado desde AUR automáticamente +- Configuración `.zshrc` descargada desde GitHub --- ## 📄 Licencia -Este proyecto está bajo la Licencia MIT. +MIT License - Libre de usar y modificar + +--- + +## 👤 Autor + +**Marco** +- GitHub: [@marcogll](https://github.com/marcogll) +- Repo: [scripts_mg](https://github.com/marcogll/scripts_mg) + +--- + + +```bash +# Instalar en una línea +bash <(curl -fsSL https://raw.githubusercontent.com/marcogll/scripts_mg/main/omarchy_zsh_setup/omarchy-setup.sh) +``` + +## 📝 Notas importantes + +- **Shell por defecto**: El módulo de Zsh modifica `.bashrc` para que las terminales nuevas usen Zsh. + +## 🚀 Próximos Pasos + +1. Ejecuta `./omarchy-setup.sh` para ver el menú interactivo +2. Selecciona los módulos que deseas instalar +3. Revisa los mensajes durante la instalación +4. Reinicia o cierra sesión después de instalar servicios +5. Disfruta de tu configuración personalizada + +--- + +🚀 **¡Disfruta tu nuevo setup modular de Omarchy!** diff --git a/modules/apps.sh b/modules/apps.sh index 9014896..1832aa4 100755 --- a/modules/apps.sh +++ b/modules/apps.sh @@ -19,19 +19,36 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "${SCRIPT_DIR}/common.sh" +# --------------------------------------------------------------- +# ensure_homebrew_env() +# --------------------------------------------------------------- +# Asegura que el entorno de Homebrew esté configurado correctamente. +# +# Esta función realiza dos tareas principales: +# 1. Carga Homebrew en la sesión de shell actual para que el comando `brew` +# esté disponible inmediatamente después de la instalación. +# 2. Añade la línea de inicialización de Homebrew a los ficheros de +# perfil del usuario (`.profile` y `.zprofile`) para que `brew` +# esté disponible en futuras sesiones de terminal. +# +# Parámetros: +# $1 - Ruta al ejecutable de brew. +# --------------------------------------------------------------- ensure_homebrew_env() { local brew_bin="$1" if [[ ! -x "$brew_bin" ]]; then return 1 fi - # Eval shellenv so el resto del módulo pueda usar brew sin reiniciar la shell. + # Evalúa `shellenv` para que el resto del módulo pueda usar `brew` + # sin necesidad de reiniciar la shell. eval "$("$brew_bin" shellenv)" || return 1 local shell_snippet='eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' local -a appended=() local -a rc_targets=("${HOME}/.profile") + # Si el usuario utiliza Zsh, añade también la configuración a .zprofile. if [[ -n "${SHELL:-}" && "$(basename "${SHELL}")" == "zsh" ]]; then rc_targets+=("${HOME}/.zprofile") fi @@ -55,6 +72,16 @@ ensure_homebrew_env() { return 0 } +# --------------------------------------------------------------- +# install_homebrew() +# --------------------------------------------------------------- +# Instala Homebrew (conocido como Linuxbrew en Linux). +# +# Comprueba si Homebrew ya está instalado. Si no lo está, descarga y +# ejecuta el script de instalación oficial de forma no interactiva. +# Después de la instalación, llama a `ensure_homebrew_env` para +# configurar el entorno de shell. +# --------------------------------------------------------------- install_homebrew() { log_step "Instalación de Homebrew (Linuxbrew)" @@ -80,6 +107,31 @@ install_homebrew() { fi } +# --------------------------------------------------------------- +# install_nvm() +# --------------------------------------------------------------- +# Instala NVM (Node Version Manager). +# +# Descarga y ejecuta el script de instalación oficial de NVM. +# --------------------------------------------------------------- +install_nvm() { + log_step "Instalación de NVM (Node Version Manager)" + + if [[ -d "${HOME}/.nvm" ]]; then + log_success "NVM ya está instalado." + return 0 + fi + + log_info "Instalando NVM..." + if curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash; then + log_success "NVM instalado correctamente." + log_info "Para usar NVM, reinicia tu terminal o ejecuta: source ~/.nvm/nvm.sh" + else + log_error "Falló la instalación de NVM." + return 1 + fi +} + # --------------------------------------------------------------- # run_module_main() # --------------------------------------------------------------- @@ -98,6 +150,10 @@ run_module_main() { vim nano tmux xdg-utils xdg-user-dirs stow gnome-keyring libsecret seahorse openssh rsync ) + # Paquetes para desarrollo de software. + local PACMAN_DEV=( + python python-pip nodejs npm uv + ) # Paquetes para reproducción y edición multimedia. local PACMAN_MULTIMEDIA=( vlc vlc-plugins-all libdvdcss audacity inkscape @@ -138,7 +194,15 @@ run_module_main() { return 1 } - # Instalar Homebrew si no está presente. + log_info "Instalando herramientas de desarrollo..." + sudo pacman -S --noconfirm --needed "${PACMAN_DEV[@]}" || { + log_warning "Algunas herramientas de desarrollo no se pudieron instalar" + } + + # Instalar NVM + install_nvm + + # Instalar Homebrew install_homebrew log_info "Instalando aplicaciones multimedia..." @@ -249,51 +313,7 @@ EOF fi log_info "Vuelve a iniciar sesión para que las variables de entorno del keyring se apliquen." - # Busca claves SSH en ~/.ssh y las añade al agente de GNOME Keyring. - if command_exists ssh-add; then - local ssh_dir="${HOME}/.ssh" - if [[ -d "$ssh_dir" ]]; then - # Encuentra todas las claves privadas válidas. - mapfile -t ssh_private_keys < <( - find "$ssh_dir" -maxdepth 1 -type f -perm -u=r \ - ! -name "*.pub" ! -name "*-cert.pub" ! -name "known_hosts" \ - ! -name "known_hosts.*" ! -name "authorized_keys" ! -name "config" \ - ! -name "*.old" ! -name "agent" ! -name "*.bak" 2>/dev/null - ) - if [[ ${#ssh_private_keys[@]} -gt 0 ]]; then - log_info "Agregando claves SSH detectadas al keyring (se solicitará la passphrase si aplica)..." - for key_path in "${ssh_private_keys[@]}"; do - if [[ ! -r "$key_path" ]]; then - log_warning "No se puede leer la clave $(basename "$key_path"); revísala manualmente." - continue - fi - # Intenta añadir la clave al agente. - if ssh-keygen -y -f "$key_path" >/dev/null 2>&1; then - log_info "Registrando clave $(basename "$key_path")..." - local spinner_was_active=0 - if [[ ${SPINNER_ACTIVE:-0} -eq 1 ]]; then spinner_was_active=1; fi - if declare -F pause_spinner >/dev/null; then pause_spinner; fi - - if SSH_AUTH_SOCK="$SSH_AUTH_SOCK" ssh-add "$key_path"; then - log_success "Clave $(basename "$key_path") añadida al keyring." - else - log_warning "No se pudo añadir la clave $(basename "$key_path")." - fi - - if (( spinner_was_active )) && declare -F resume_spinner >/dev/null; then resume_spinner; fi - else - log_warning "La clave $(basename "$key_path") parece inválida. Se omite." - fi - done - else - log_info "No se encontraron claves privadas SSH en ${ssh_dir}." - fi - else - log_info "No se detectó el directorio ~/.ssh; omitiendo carga de claves." - fi - else - log_warning "ssh-add no está disponible; no se pueden registrar claves en el keyring." - fi + log_info "La sincronización de claves SSH se realizará por separado con el módulo 'K' después de reiniciar la sesión." # Habilita los servicios de las aplicaciones instaladas. if command_exists keyd; then diff --git a/modules/common.sh b/modules/common.sh index 006b4b9..e1a0a4b 100755 --- a/modules/common.sh +++ b/modules/common.sh @@ -1,85 +1,53 @@ #!/usr/bin/env bash # =============================================================== -# common.sh - Funciones y variables comunes para los módulos -# =============================================================== -# -# Este script define un conjunto de funciones y variables de utilidad -# que son compartidas por todos los módulos de instalación. El objetivo -# es estandarizar tareas comunes como mostrar mensajes, manejar -# paquetes, crear copias de seguridad y gestionar el helper de AUR. -# -# No debe ser ejecutado directamente, sino incluido (`source`) por -# otros scripts. -# +# common.sh - Funciones comunes para los módulos # =============================================================== -# --- Definición de Colores --- -# Se definen códigos de escape ANSI para dar formato y color a la -# salida en la terminal, mejorando la legibilidad. +# Colores para output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' MAGENTA='\033[0;35m' CYAN='\033[0;36m' -NC='\033[0m' # No Color (resetea el formato) +NC='\033[0m' # No Color BOLD='\033[1m' -# --- Funciones de Logging --- -# Proporcionan una manera estandarizada de mostrar mensajes al -# usuario, con diferentes niveles de severidad (info, éxito, -# advertencia, error) y formato. - -# Función interna para limpiar la línea del spinner si está activo. +# Funciones de logging _maybe_clear_spinner() { if declare -F spinner_clear_line >/dev/null; then spinner_clear_line fi } -# Muestra un mensaje informativo. log_info() { _maybe_clear_spinner echo -e "${BLUE}▶${NC} ${BOLD}$1${NC}" } -# Muestra un mensaje de éxito. log_success() { _maybe_clear_spinner echo -e "${GREEN}✓${NC} ${GREEN}$1${NC}" } -# Muestra un mensaje de advertencia. log_warning() { _maybe_clear_spinner echo -e "${YELLOW}⚠${NC} ${YELLOW}$1${NC}" } -# Muestra un mensaje de error. log_error() { _maybe_clear_spinner echo -e "${RED}✗${NC} ${RED}$1${NC}" } -# Muestra un separador visual para marcar el inicio de un paso importante. log_step() { echo -e "\n${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${CYAN}${BOLD} $1${NC}" echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n" } -# --- Funciones de Utilidad --- - -# --------------------------------------------------------------- -# backup_file(path) -# --------------------------------------------------------------- -# Crea una copia de seguridad de un archivo o directorio existente. -# Añade una marca de tiempo al nombre del backup para evitar -# sobrescribir copias anteriores. -# -# Parámetros: -# $1 - Ruta al archivo o directorio a respaldar. -# --------------------------------------------------------------- +# Función para crear una copia de seguridad de un archivo o directorio +# Uso: backup_file "/ruta/al/archivo" backup_file() { local path_to_backup="$1" if [[ -e "$path_to_backup" ]]; then @@ -96,29 +64,17 @@ backup_file() { return 0 } -# --------------------------------------------------------------- -# command_exists(command) -# --------------------------------------------------------------- -# Verifica si un comando está disponible en el PATH del sistema. -# -# Parámetros: -# $1 - Nombre del comando a verificar. -# --------------------------------------------------------------- +# Función para verificar si un comando existe command_exists() { command -v "$1" >/dev/null 2>&1 } -# --------------------------------------------------------------- -# check_and_install_pkg(package_name) -# --------------------------------------------------------------- -# Comprueba si un paquete ya está instalado con pacman. Si no lo -# está, intenta instalarlo. -# -# Parámetros: -# $1 - Nombre del paquete a instalar. -# --------------------------------------------------------------- +# Función para verificar e instalar un paquete con pacman +# Uso: check_and_install_pkg "nombre-del-paquete" check_and_install_pkg() { local pkg_name="$1" + # pacman -T es una forma de verificar sin instalar, pero no funciona bien con grupos. + # pacman -Q es más fiable para paquetes individuales. if ! pacman -Q "$pkg_name" &>/dev/null; then log_info "Instalando ${pkg_name}..." if sudo pacman -S --noconfirm --needed "$pkg_name"; then @@ -133,13 +89,8 @@ check_and_install_pkg() { return 0 } -# --------------------------------------------------------------- -# ensure_aur_helper() -# --------------------------------------------------------------- -# Asegura que un helper de AUR (yay o paru) esté instalado. -# Si no encuentra ninguno, procede a instalar `yay-bin` desde AUR. -# Devuelve el nombre del helper encontrado o instalado. -# --------------------------------------------------------------- + +# Función para instalar helper AUR si no existe ensure_aur_helper() { if command_exists yay; then echo "yay" @@ -149,7 +100,6 @@ ensure_aur_helper() { return 0 else log_warning "No se detectó yay ni paru. Instalando yay..." - # Instala `yay-bin` para evitar compilarlo desde cero, lo que es más rápido. cd /tmp git clone https://aur.archlinux.org/yay-bin.git cd yay-bin @@ -159,17 +109,6 @@ ensure_aur_helper() { fi } -# --------------------------------------------------------------- -# aur_install_packages(packages...) -# --------------------------------------------------------------- -# Instala una lista de paquetes desde el AUR. -# -# Utiliza el helper de AUR (yay o paru) que encuentre o instale. -# Pasa los flags necesarios para una instalación no interactiva. -# -# Parámetros: -# $@ - Lista de nombres de paquetes de AUR a instalar. -# --------------------------------------------------------------- aur_install_packages() { local packages=("$@") if [[ ${#packages[@]} -eq 0 ]]; then @@ -216,12 +155,7 @@ aur_install_packages() { return $status } -# --------------------------------------------------------------- -# update_system() -# --------------------------------------------------------------- -# Sincroniza los repositorios y actualiza todos los paquetes del -# sistema usando `pacman`. -# --------------------------------------------------------------- +# Función para actualizar sistema update_system() { log_step "Actualizando sistema" log_info "Sincronizando repositorios y actualizando paquetes..." @@ -229,16 +163,10 @@ update_system() { log_success "Sistema actualizado" } -# --------------------------------------------------------------- -# cleanup_orphans() -# --------------------------------------------------------------- -# Elimina paquetes que fueron instalados como dependencias pero -# que ya no son requeridos por ningún paquete. -# --------------------------------------------------------------- +# Función para limpiar paquetes huérfanos cleanup_orphans() { log_step "Limpieza de paquetes huérfanos" log_info "Buscando paquetes huérfanos..." - # El `|| true` evita que el script falle si no se encuentran huérfanos. sudo pacman -Rns $(pacman -Qtdq) --noconfirm 2>/dev/null || true log_success "Limpieza completada" } diff --git a/modules/davinci-resolve.sh b/modules/davinci-resolve.sh index b18f695..94e35c8 100755 --- a/modules/davinci-resolve.sh +++ b/modules/davinci-resolve.sh @@ -2,64 +2,43 @@ # =============================================================== # davinci-resolve.sh - Instalador de DaVinci Resolve (Intel Edition) # =============================================================== -# -# Este módulo automatiza la instalación y configuración de DaVinci -# Resolve en Arch Linux, con un enfoque específico en sistemas que -# utilizan GPUs de Intel. El proceso es complejo y requiere la -# instalación de múltiples dependencias, la configuración de -# librerías y la creación de un script "wrapper" para asegurar que -# la aplicación se ejecute con el entorno correcto. -# -# =============================================================== SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "${SCRIPT_DIR}/common.sh" # --- Definición de Dependencias --- -# Paquetes de los repositorios oficiales de Arch necesarios para Resolve. +# Paquetes de los repositorios oficiales de Arch PACMAN_DEPS=( - # Herramientas básicas para la instalación. + # Herramientas básicas unzip patchelf libarchive xdg-user-dirs desktop-file-utils file rsync - # Dependencias directas de Resolve. + # Dependencias de Resolve libpng libtiff libcurl ocl-icd libxcrypt-compat ffmpeg glu gtk2 fuse2 - # Dependencias de Qt5, usadas por la interfaz de Resolve. + # Dependencias de Qt qt5-base qt5-svg qt5-x11extras - # Drivers y herramientas de Intel para aceleración por hardware. + # Drivers y herramientas Intel intel-media-driver libva-utils libvdpau-va-gl clinfo ) -# Paquetes del AUR. +# Paquetes del AUR AUR_DEPS=( - # Runtime de OpenCL para GPUs de Intel. Esencial para el renderizado. - "intel-compute-runtime" + "intel-compute-runtime" # Runtime OpenCL para GPUs Intel ) -# --- Definición de Rutas --- +# Directorio de descargas y nombre del ejecutable DOWNLOADS_DIR="${HOME}/Downloads" INSTALL_DIR="/opt/resolve" WRAPPER_PATH="/usr/local/bin/resolve-intel" -# --------------------------------------------------------------- -# show_progress(total_items, current_item, message, last_percent) -# --------------------------------------------------------------- -# Muestra una barra de progreso simple en la terminal. -# Está diseñada para ser llamada en un bucle y actualiza la línea -# solo cuando el porcentaje cambia para ser más eficiente. -# -# Parámetros: -# $1 - Número total de ítems a procesar. -# $2 - Ítem actual que se está procesando. -# $3 - Mensaje a mostrar junto a la barra. -# $4 - (Opcional) El último porcentaje mostrado. -# --------------------------------------------------------------- +# Función para mostrar una barra de progreso +# Uso: show_progress TOTAL_ITEMS CURRENT_ITEM "Mensaje" show_progress() { local total=$1 local current=$2 local msg=$3 - local last_percent=${4:-"-1"} + local last_percent=${4:-"-1"} # Nuevo: Almacena el último porcentaje mostrado local percent=$((current * 100 / total)) - # Solo actualiza si el porcentaje ha cambiado. + # Solo actualizar la barra si el porcentaje ha cambiado if [[ "$percent" -gt "$last_percent" ]]; then local completed_len=$((percent / 2)) local bar="" @@ -67,28 +46,25 @@ show_progress() { local empty_len=$((50 - completed_len)) for ((i=0; i/dev/null; then log_warning "Se detectaron paquetes de NVIDIA. Resolve para Intel puede tener conflictos." read -p "¿Deseas intentar desinstalar los paquetes de NVIDIA? [s/N]: " confirm @@ -127,41 +103,43 @@ install_davinci_resolve() { # --- 2. Instalación de Dependencias --- log_info "Instalando dependencias necesarias..." - # Instala los headers del kernel si son necesarios. + # Instalar headers del kernel correspondiente local KERNEL_VERSION KERNEL_VERSION=$(uname -r) local KERNEL_PKG + # Extrae el nombre base del kernel (ej. 'linux', 'linux-zen', 'linux-lts') KERNEL_PKG=$(pacman -Qo "/boot/vmlinuz-${KERNEL_VERSION%%-*}" | awk '{print $1}') if [[ -n "$KERNEL_PKG" && ! -d "/usr/lib/modules/${KERNEL_VERSION}/build" ]]; then log_info "Instalando headers para el kernel actual (${KERNEL_PKG}-headers)..." sudo pacman -S --needed --noconfirm "${KERNEL_PKG}-headers" || log_warning "No se pudieron instalar los headers del kernel." fi - # Instala dependencias desde los repositorios oficiales. + # Instalar dependencias de Pacman start_spinner "Instalando dependencias de Pacman..." sudo pacman -S --needed --noconfirm "${PACMAN_DEPS[@]}" &> /dev/null stop_spinner $? "Dependencias de Pacman instaladas." - # Instala dependencias desde AUR. + # Instalar dependencias de AUR start_spinner "Instalando dependencias de AUR..." if aur_install_packages "${AUR_DEPS[@]}"; then stop_spinner 0 "Dependencias de AUR instaladas." else stop_spinner 1 "Falló la instalación de dependencias de AUR." + log_error "No se pudieron instalar paquetes como 'intel-compute-runtime' desde AUR." return 1 fi # --- 3. Configuración del Entorno --- log_info "Configurando el entorno para OpenCL..." - # Asegura que el fichero de configuración de OpenCL para Intel exista. + # Asegurar el archivo ICD para OpenCL de Intel if [[ ! -f /etc/OpenCL/vendors/intel.icd ]]; then log_info "Creando vendor file de OpenCL para Intel..." sudo mkdir -p /etc/OpenCL/vendors echo "/usr/lib/intel-opencl/libigdrcl.so" | sudo tee /etc/OpenCL/vendors/intel.icd >/dev/null fi - # Algunas aplicaciones antiguas esperan los certificados en /etc/pki/tls. + # Crear enlace /etc/pki/tls si es necesario if [[ ! -e /etc/pki/tls ]]; then log_info "Creando enlace /etc/pki/tls → /etc/ssl" sudo mkdir -p /etc/pki @@ -170,9 +148,10 @@ install_davinci_resolve() { sudo ldconfig || true - # Verifica que OpenCL y VA-API estén funcionando. + # Verificaciones log_info "Verificando OpenCL instalado..." clinfo | grep -E "Platform Name|Device Name" || true + log_info "Verificando soporte de decodificación VA-API para H264 / HEVC..." vainfo | grep -E "H264|HEVC" || true @@ -184,10 +163,12 @@ install_davinci_resolve() { unzip -q "${RESOLVE_ZIP}" -d "${WORKDIR}" stop_spinner $? "ZIP extraído." - # El ZIP contiene un archivo .run, que a su vez contiene un AppImage. local RUN_FILE RUN_FILE="$(find "${WORKDIR}" -maxdepth 2 -type f -name 'DaVinci_Resolve_*_Linux.run' -print -quit)" - if [[ -z "${RUN_FILE}" ]]; then log_error "No se encontró el archivo .run dentro del ZIP."; return 1; fi + if [[ -z "${RUN_FILE}" ]]; then + log_error "No se encontró el archivo .run dentro del ZIP." + return 1 + fi chmod +x "${RUN_FILE}" start_spinner "Extrayendo AppImage..." @@ -197,13 +178,18 @@ install_davinci_resolve() { stop_spinner $? "AppImage extraído." local APPDIR="${EX_DIR}/squashfs-root" - if [[ ! -d "${APPDIR}" ]]; then log_error "No se extrajo correctamente la carpeta squashfs-root."; return 1; fi + if [[ ! -d "${APPDIR}" ]]; then + log_error "No se extrajo correctamente la carpeta squashfs-root." + return 1 + fi chmod -R u+rwX,go+rX,go-w "${APPDIR}" - if [[ ! -x "${APPDIR}/bin/resolve" ]]; then log_error "El binario resolve no existe o está vacío."; return 1; fi + if [[ ! -x "${APPDIR}/bin/resolve" ]]; then + log_error "El binario resolve no existe o está vacío." + return 1 + fi - # Resolve incluye sus propias versiones de librerías que pueden ser incompatibles. - # Se reemplazan por enlaces a las versiones del sistema. + # Reemplazar librerías glib/gio/gmodule log_info "Ajustando bibliotecas glib/gio/gmodule para usar las del sistema..." pushd "${APPDIR}" >/dev/null rm -f libs/libglib-2.0.so.0 libs/libgio-2.0.so.0 libs/libgmodule-2.0.so.0 || true @@ -214,16 +200,25 @@ install_davinci_resolve() { # --- 5. Aplicar Patches y Copiar Archivos --- log_info "Aplicando RPATH con patchelf (esto puede tardar)..." - # Se modifica el RPATH de los binarios de Resolve para que busquen las librerías - # dentro de su propio directorio de instalación (/opt/resolve). - RPATH_DIRS=("libs" "libs/plugins/sqldrivers" "libs/plugins/xcbglintegrations" "libs/plugins/imageformats" "libs/plugins/platforms" "libs/Fusion" "plugins" "bin") + RPATH_DIRS=( + "libs" + "libs/plugins/sqldrivers" + "libs/plugins/xcbglintegrations" + "libs/plugins/imageformats" + "libs/plugins/platforms" + "libs/Fusion" + "plugins" + "bin" + ) RPATH_ABS="" for p in "${RPATH_DIRS[@]}"; do RPATH_ABS+="${INSTALL_DIR}/${p}:" done RPATH_ABS+="\$ORIGIN" + # Usar barra de progreso para patchelf if ! command_exists patchelf; then + log_warning "El comando 'patchelf' no está instalado. Es necesario para ajustar las librerías." start_spinner "Instalando patchelf..." sudo pacman -S --noconfirm --needed patchelf &> /dev/null stop_spinner $? "patchelf instalado." @@ -244,7 +239,6 @@ install_davinci_resolve() { log_success "RPATH aplicado a $total_files archivos." fi - # Copia los archivos de la aplicación a /opt/resolve. start_spinner "Copiando archivos a /opt/resolve..." sudo rm -rf "${INSTALL_DIR}" sudo mkdir -p "${INSTALL_DIR}" @@ -253,15 +247,15 @@ install_davinci_resolve() { sudo mkdir -p "${INSTALL_DIR}/.license" - # Enlaza libcrypt.so.1 si es necesario. + # Enlazar libcrypt legado si es necesario sudo ldconfig || true if [[ -e /usr/lib/libcrypt.so.1 ]]; then sudo ln -sf /usr/lib/libcrypt.so.1 "${INSTALL_DIR}/libs/libcrypt.so.1" fi # --- 6. Crear Wrapper y Acceso Directo --- + # Crear wrapper + acceso en escritorio log_info "Creando wrapper y acceso para DaVinci Resolve..." - # Se crea un script que establece variables de entorno necesarias antes de ejecutar Resolve. cat << EOF | sudo tee "${WRAPPER_PATH}" >/dev/null #!/usr/bin/env bash set -euo pipefail @@ -274,7 +268,6 @@ EOF sudo chmod +x "${WRAPPER_PATH}" - # Crea un archivo .desktop para que la aplicación aparezca en el menú de aplicaciones. mkdir -p "${HOME}/.local/share/applications" cat > "${HOME}/.local/share/applications/davinci-resolve-wrapper.desktop" << EOF [Desktop Entry] @@ -295,11 +288,12 @@ EOF log_success "DaVinci Resolve (Intel Edition) instalado en ${INSTALL_DIR}" log_info "Usa '${WRAPPER_PATH##*/}' para lanzar la aplicación" + log_info "Para verificar OpenCL: clinfo | grep -E 'Platform Name|Device Name'" return 0 } -# Ejecutar si se llama directamente al script. +# Ejecutar si se llama directamente if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then install_davinci_resolve "$@" fi diff --git a/modules/disk-format.sh b/modules/disk-format.sh index f5fecfe..3e73a41 100755 --- a/modules/disk-format.sh +++ b/modules/disk-format.sh @@ -3,32 +3,20 @@ set -euo pipefail # =============================================================== # disk-format.sh - Soporte para FAT32 / exFAT / NTFS / ext4 # =============================================================== -# -# Este módulo instala las herramientas necesarias para trabajar -# con los sistemas de archivos más comunes, como FAT32, exFAT, -# NTFS y ext4. Además de las utilidades de línea de comandos, -# también instala herramientas gráficas como GParted y GNOME Disks -# para facilitar la gestión de discos y particiones. -# -# =============================================================== SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "${SCRIPT_DIR}/common.sh" run_module_main() { - log_step "Habilitar soporte para sistemas de archivos" + log_step "Habilitar sistemas de archivos (FAT32 / exFAT / NTFS / ext4)" - # --- Definición de Paquetes --- - # Se instalarán las siguientes herramientas: - # - dosfstools: Para crear y verificar sistemas de archivos FAT. - # - exfatprogs: Para sistemas de archivos exFAT. - # - ntfs-3g: Driver de código abierto para leer y escribir en NTFS. - # - e2fsprogs: Utilidades para el sistema de archivos ext2/3/4. - # - gparted: Editor de particiones gráfico. - # - gnome-disk-utility: Herramienta de discos de GNOME. local pkgs=( - dosfstools exfatprogs ntfs-3g e2fsprogs - gparted gnome-disk-utility + dosfstools + exfatprogs + ntfs-3g + e2fsprogs + gparted + gnome-disk-utility ) local failed=false @@ -42,18 +30,18 @@ run_module_main() { log_warning "Algunos paquetes no se pudieron instalar. Revisa los mensajes anteriores." fi - log_success "Soporte para sistemas de archivos comunes habilitado." + log_success "Soporte de sistemas de archivos habilitado." echo "" - log_info "Para formatear discos desde la terminal, puedes usar:" + log_info "Formatea manualmente con las utilidades instaladas:" echo " • FAT32 : sudo mkfs.fat -F32 /dev/sdXn" echo " • exFAT : sudo mkfs.exfat /dev/sdXn" echo " • NTFS : sudo mkfs.ntfs -f /dev/sdXn" echo " • ext4 : sudo mkfs.ext4 -F /dev/sdXn" - log_info "También puedes usar 'gparted' o 'gnome-disks' para una gestión gráfica." + log_info "Alternativamente puedes usar GParted o GNOME Disks para un asistente gráfico." return 0 } -# Ejecutar si se llama directamente al script. +# Ejecutar si se llama directamente if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then run_module_main "$@" fi diff --git a/modules/docker.sh b/modules/docker.sh index ceb0f26..c45db61 100755 --- a/modules/docker.sh +++ b/modules/docker.sh @@ -2,96 +2,70 @@ # =============================================================== # docker.sh - Configuración de Docker y Portainer # =============================================================== -# -# Este módulo se encarga de la instalación y configuración de Docker -# y, opcionalmente, de Portainer, una interfaz web para gestionar -# contenedores. -# -# Funciones principales: -# - Instala Docker y Docker Compose desde los repositorios oficiales. -# - Habilita e inicia los servicios de Docker. -# - Agrega el usuario actual al grupo `docker` para permitir la -# ejecución de comandos de Docker sin `sudo`. -# - Ofrece la opción de instalar Portainer. -# -# =============================================================== SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "${SCRIPT_DIR}/common.sh" -# --------------------------------------------------------------- -# install_docker() -# --------------------------------------------------------------- -# Orquesta la instalación y configuración de Docker y Portainer. -# --------------------------------------------------------------- install_docker() { log_step "Configuración de Docker y Portainer" - # --- 1. Instalación de Docker --- + # Instalar Docker log_info "Instalando Docker y Docker Compose..." - if ! sudo pacman -S --noconfirm --needed docker docker-compose; then - log_error "No se pudo instalar Docker. Abortando." + sudo pacman -S --noconfirm --needed \ + docker docker-compose || { + log_error "Error al instalar Docker" return 1 - fi + } - # --- 2. Configuración del Servicio de Docker --- - log_info "Habilitando e iniciando los servicios de Docker..." - # Habilita los servicios para que se inicien automáticamente con el sistema. + # Habilitar y iniciar Docker + log_info "Habilitando servicio de Docker..." sudo systemctl enable docker.service sudo systemctl enable containerd.service - # Inicia los servicios en la sesión actual. sudo systemctl start docker.service - # --- 3. Configuración de Permisos de Usuario --- - # Agrega el usuario actual al grupo `docker` para evitar tener que usar `sudo`. + # Agregar usuario al grupo docker (si no está ya) if ! groups "$USER" | grep -q docker; then - log_info "Agregando al usuario '$USER' al grupo 'docker'..." - if ! sudo usermod -aG docker "$USER"; then - log_error "No se pudo agregar el usuario al grupo 'docker'." - # No es un error fatal, así que solo se muestra una advertencia. - else - log_warning "Para que los cambios de grupo surtan efecto, debes cerrar sesión y volver a iniciarla." - fi + log_info "Agregando usuario al grupo docker..." + sudo usermod -aG docker "$USER" + log_warning "Necesitarás cerrar sesión y volver a iniciar para usar Docker sin sudo" fi - # --- 4. Instalación Opcional de Portainer --- echo "" read -p "¿Deseas instalar Portainer (interfaz web para Docker)? [S/n]: " confirm_portainer if [[ ! "${confirm_portainer}" =~ ^[Nn]$ ]]; then - log_info "Instalando Portainer..." + log_info "Configurando Portainer..." - # Comprueba si el contenedor de Portainer ya existe para evitar errores. + # Verificar si Portainer ya está corriendo if sudo docker ps -a --format '{{.Names}}' | grep -q "^portainer$"; then - log_info "El contenedor de Portainer ya existe. Se detendrá y eliminará para volver a crearlo." - sudo docker stop portainer >/dev/null 2>&1 || true - sudo docker rm portainer >/dev/null 2>&1 || true + log_info "Portainer ya existe. Reiniciando contenedor..." + sudo docker stop portainer 2>/dev/null || true + sudo docker rm portainer 2>/dev/null || true fi - # Crea un volumen de Docker para persistir los datos de Portainer. - sudo docker volume create portainer_data >/dev/null 2>&1 || true + # Crear volumen y contenedor de Portainer + sudo docker volume create portainer_data 2>/dev/null || true - # Ejecuta el contenedor de Portainer. if sudo docker run -d -p 8000:8000 -p 9443:9443 \ --name portainer \ --restart=always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ portainer/portainer-ce:latest; then - log_success "Portainer se ha instalado y está corriendo." - log_info "Puedes acceder a la interfaz web en: https://localhost:9443" + log_success "Portainer instalado y ejecutándose" + log_info "Accede a Portainer en: https://localhost:9443" else - log_error "No se pudo instalar Portainer." - # No se devuelve un error aquí porque la instalación de Docker fue exitosa. + log_error "Error al instalar Portainer" + # No retornamos error, Docker ya está instalado. fi else log_info "Se omitió la instalación de Portainer." fi - log_success "La configuración de Docker ha finalizado." + log_success "Configuración de Docker completada." return 0 } -# Ejecutar si se llama directamente al script. +# Ejecutar si se llama directamente if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then install_docker "$@" fi diff --git a/modules/hyprland-config.sh b/modules/hyprland-config.sh index c84df9b..d90caa7 100755 --- a/modules/hyprland-config.sh +++ b/modules/hyprland-config.sh @@ -2,69 +2,55 @@ # =============================================================== # hyprland-config.sh - Instala la configuración personalizada de Hyprland # =============================================================== -# -# Este módulo se encarga de instalar una configuración personalizada -# para el gestor de ventanas Hyprland. -# -# Funciones principales: -# - Realiza una copia de seguridad de la configuración existente de -# Hyprland en ~/.config/hypr. -# - Copia la nueva configuración desde la carpeta `hypr_config` -# del repositorio a ~/.config/hypr. -# - Establece un tema de iconos por defecto, utilizando para ello -# funciones del módulo `icon_manager.sh`. -# -# =============================================================== SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "${SCRIPT_DIR}/common.sh" -# Se carga el módulo `icon_manager.sh` para poder utilizar su -# función `set_default_icon_theme`. +# Cargar el gestor de iconos para usar sus funciones source "${SCRIPT_DIR}/icon_manager.sh" run_module_main() { - log_step "Instalación de la Configuración de Hyprland" + log_step "Instalación de Configuración de Hyprland" - # --- 1. Copia de Archivos de Configuración --- - # La configuración que se va a instalar debe estar en una carpeta - # llamada `hypr_config` en la raíz del repositorio. + # --- 1. Copiar archivos de configuración --- + # La configuración de Hyprland debe estar en una carpeta 'hypr_config' en la raíz del repo local source_dir="${SCRIPT_DIR}/../hypr_config" local dest_dir="$HOME/.config/hypr" if [[ ! -d "$source_dir" ]]; then - log_error "No se encontró el directorio de configuración 'hypr_config'." - log_info "Asegúrate de que la carpeta con tu configuración de Hyprland exista en la raíz del repositorio." + log_error "No se encontró el directorio de configuración 'hypr_config' en la raíz del repositorio." + log_info "Asegúrate de que la carpeta con tu configuración se llame 'hypr_config'." return 1 fi - # Se crea una copia de seguridad de la configuración existente antes de sobrescribirla. - # Se utiliza la función `backup_file` definida en `common.sh`. - if ! backup_file "$dest_dir"; then - return 1 + # Crear copia de seguridad si ya existe una configuración + if [[ -d "$dest_dir" ]]; then + local backup_dir="${dest_dir}.bak_$(date +%F_%T)" + log_warning "Configuración de Hyprland existente encontrada." + log_info "Creando copia de seguridad en: ${backup_dir}" + if mv "$dest_dir" "$backup_dir"; then + log_success "Copia de seguridad creada." + else + log_error "No se pudo crear la copia de seguridad. Abortando." + return 1 + fi fi log_info "Copiando la configuración de Hyprland a ${dest_dir}..." - # Se usa `rsync` para una copia eficiente que muestra el progreso. - if ! rsync -a --info=progress2 "$source_dir/" "$dest_dir/"; then - log_error "No se pudo copiar la configuración de Hyprland." - return 1 - fi + # Usamos rsync para una copia eficiente + rsync -a --info=progress2 "$source_dir/" "$dest_dir/" - # --- 2. Establecimiento del Tema de Iconos --- + # --- 2. Establecer el tema de iconos por defecto --- log_info "Estableciendo el tema de iconos por defecto (Tela Nord)..." - # Llama a una función del módulo `icon_manager.sh`. - if ! set_default_icon_theme; then - log_warning "No se pudo establecer el tema de iconos por defecto." - # No es un error fatal, la configuración principal ya se copió. - fi + # Llamamos a la función específica de icon_manager.sh + set_default_icon_theme - log_success "La configuración de Hyprland se ha instalado correctamente." - log_warning "Para que los cambios se apliquen, por favor, cierra sesión y vuelve a iniciarla." + log_success "Configuración de Hyprland instalada correctamente." + log_warning "Por favor, cierra sesión y vuelve a iniciarla para aplicar los cambios." return 0 } -# Ejecutar si se llama directamente al script. +# Ejecutar si se llama directamente if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then run_module_main "$@" -fi +fi \ No newline at end of file diff --git a/modules/icon_manager.sh b/modules/icon_manager.sh index 84cf93f..01bcdba 100755 --- a/modules/icon_manager.sh +++ b/modules/icon_manager.sh @@ -1,62 +1,31 @@ #!/usr/bin/env bash -# =============================================================== -# icon_manager.sh - Gestor de Temas de Iconos para Hyprland -# =============================================================== +# icon_manager.sh (v2) # -# Este módulo proporciona una interfaz interactiva para instalar y -# cambiar entre diferentes temas de iconos. Está diseñado para -# integrarse con Hyprland, modificando su fichero de autostart -# para asegurar que la configuración del tema de iconos sea persistente -# entre sesiones. +# Un script de gestión para instalar y cambiar entre diferentes temas de iconos +# en un entorno Hyprland/Omarchy. Incluye temas base y personalizaciones. # -# Dependencias: git, gsettings (parte de glib2). -# -# =============================================================== set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "${SCRIPT_DIR}/common.sh" # --- Variables Globales --- -# Ruta al fichero de autostart de Hyprland donde se guardará la configuración. AUTOSTART_FILE="$HOME/.config/hypr/autostart.conf" -# Directorio estándar para iconos instalados por el usuario. ICON_DIR_USER="$HOME/.local/share/icons" # --- Funciones de Utilidad --- -# --------------------------------------------------------------- -# check_deps() -# --------------------------------------------------------------- -# Verifica que las dependencias necesarias (git y gsettings) -# estén instaladas en el sistema. -# --------------------------------------------------------------- +# Función para verificar dependencias check_deps() { if ! command_exists git; then - log_error "El comando 'git' no está instalado. Por favor, instálalo para continuar (ej. sudo pacman -S git)." - return 1 - fi - if ! command_exists gsettings; then - log_error "El comando 'gsettings' no está instalado. Es parte de 'glib2' y es esencial." + log_error "git no está instalado. Por favor, instálalo para continuar (ej. sudo pacman -S git)." return 1 fi return 0 } -# --------------------------------------------------------------- -# apply_theme(theme_name) -# --------------------------------------------------------------- -# Aplica un tema de iconos y lo hace persistente. -# -# Esta función realiza dos acciones: -# 1. Modifica el fichero de autostart de Hyprland (`autostart.conf`) -# para que el tema se cargue automáticamente en cada inicio de sesión. -# 2. Aplica el tema en la sesión actual usando `gsettings` para -# que el cambio sea visible de inmediato. -# -# Parámetros: -# $1 - Nombre exacto del tema de iconos a aplicar. -# --------------------------------------------------------------- +# Función para aplicar la configuración de forma persistente +# Argumento 1: Nombre del tema de iconos (ej. 'Tela-nord-dark') apply_theme() { local theme_name="$1" log_info "Aplicando el tema de iconos '$theme_name'..." @@ -64,10 +33,10 @@ apply_theme() { mkdir -p "$(dirname "$AUTOSTART_FILE")" touch "$AUTOSTART_FILE" - # Elimina configuraciones anteriores del tema de iconos para evitar duplicados. + # Eliminar cualquier configuración de icon-theme anterior para evitar conflictos sed -i '/exec-once = gsettings set org.gnome.desktop.interface icon-theme/d' "$AUTOSTART_FILE" - # Añade un bloque de configuración si no existe. + # Añadir el bloque de configuración si no existe if ! grep -Fq "CONFIGURACIÓN DE TEMA DE ICONOS" "$AUTOSTART_FILE"; then echo -e "\n# -----------------------------------------------------" >> "$AUTOSTART_FILE" echo "# CONFIGURACIÓN DE TEMA DE ICONOS" >> "$AUTOSTART_FILE" @@ -76,18 +45,18 @@ apply_theme() { echo "exec-once = sleep 1" >> "$AUTOSTART_FILE" fi - # Añade el comando para establecer el tema seleccionado. + # Añadir el comando gsettings para el tema seleccionado echo "exec-once = gsettings set org.gnome.desktop.interface icon-theme '$theme_name'" >> "$AUTOSTART_FILE" - # Aplica el tema en la sesión actual. + # Aplicar el tema en la sesión actual para un efecto inmediato gsettings set org.gnome.desktop.interface icon-theme "$theme_name" - log_success "¡Tema configurado! Se aplicó en la sesión actual y se guardó en $AUTOSTART_FILE." + log_success "¡Tema configurado! Se aplicó en la sesión actual y se guardó en $AUTOSTART_FILE" } # --- Funciones de Instalación de Temas --- -# Asegura que el tema base de Papirus esté instalado, ya que otros temas lo usan como base. +# Función auxiliar para asegurar que el tema base Papirus esté instalado ensure_papirus_installed() { local temp_dir="$1" if [[ ! -d "$ICON_DIR_USER/Papirus-Dark" ]]; then @@ -99,16 +68,19 @@ ensure_papirus_installed() { fi } -# Instala el tema 'Tela-nord-dark', que se usa como predeterminado en la configuración de Hyprland. +# Función para instalar y aplicar el tema Tela Nord (usado como default) +# Argumento 1 (opcional): Directorio temporal a utilizar. set_default_icon_theme() { local theme_name="Tela-nord-dark" - local temp_dir_param="${1:-}" - log_step "Gestionando el tema de iconos por defecto '$theme_name'" + local temp_dir_param="${1:-}" # Aceptar directorio temporal como parámetro + log_info "Gestionando el tema de iconos por defecto '$theme_name'..." if [[ -d "$ICON_DIR_USER/$theme_name" ]]; then log_info "El tema '$theme_name' ya está instalado." else log_info "Instalando el tema '$theme_name'..." + # Si no se pasa un directorio, crear uno propio y limpiarlo. + # Si se pasa, usarlo sin limpiarlo (la función llamadora se encarga). local temp_dir="${temp_dir_param}" [[ -z "$temp_dir" ]] && temp_dir=$(mktemp -d) @@ -120,23 +92,22 @@ set_default_icon_theme() { apply_theme "$theme_name" } -# Instala la versión estándar del tema Papirus. install_papirus_standard() { local theme_name="Papirus-Dark" local temp_dir="$1" - log_step "Gestionando Papirus Icons (Estándar)" + echo "--- Gestionando Papirus Icons (Estándar) ---" ensure_papirus_installed "$temp_dir" + # Si el usuario quiere el Papirus estándar, restauramos los colores por si acaso if command_exists papirus-folders; then papirus-folders --default --theme "$theme_name" fi apply_theme "$theme_name" } -# Instala el tema Candy. install_candy() { local theme_name="Candy" local temp_dir="$1" - log_step "Gestionando Candy Icons" + echo "--- Gestionando Candy Icons ---" if [[ -d "$ICON_DIR_USER/$theme_name" ]]; then log_info "El tema ya está instalado." else @@ -147,23 +118,24 @@ install_candy() { apply_theme "$theme_name" } -# Instala el tema Papirus con colores de la paleta Catppuccin. install_papirus_catppuccin() { local theme_name="Papirus-Dark" local catppuccin_flavor="mocha" local temp_dir="$1" - log_step "Gestionando Papirus Icons con colores Catppuccin ($catppuccin_flavor)" + echo "--- Gestionando Papirus Icons con colores Catppuccin ($catppuccin_flavor) ---" ensure_papirus_installed "$temp_dir" + # 2. Descargar y ejecutar el script de personalización log_info "Descargando y aplicando el colorizador Catppuccin..." git clone --depth 1 https://github.com/catppuccin/papirus-folders.git "$temp_dir/papirus-folders-catppuccin" chmod +x "$temp_dir/papirus-folders-catppuccin/papirus-folders" - # Ejecuta el script para cambiar el color de las carpetas. + # Ejecutar el script para cambiar el color de las carpetas "$temp_dir/papirus-folders-catppuccin/papirus-folders" -C "catppuccin-${catppuccin_flavor}" --theme "$theme_name" + # 3. Aplicar el tema (el nombre sigue siendo Papirus-Dark, pero los iconos han cambiado) apply_theme "$theme_name" } @@ -195,6 +167,7 @@ run_module_main() { echo read -p "Tu elección: " choice + # Limpiar el directorio temporal para la nueva operación rm -rf -- "$temp_dir"/* case $choice in @@ -216,7 +189,6 @@ run_module_main() { return 0 } -# Ejecutar si se llama directamente al script. if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then run_module_main "$@" -fi +fi \ No newline at end of file diff --git a/modules/mouse_cursor.sh b/modules/mouse_cursor.sh index d8769a5..976cf3f 100755 --- a/modules/mouse_cursor.sh +++ b/modules/mouse_cursor.sh @@ -2,123 +2,75 @@ # =============================================================== # mouse_cursor.sh - Instala y configura el tema de cursor Bibata # =============================================================== -# -# Este módulo automatiza la descarga, instalación y configuración -# del tema de cursor "Bibata-Modern-Ice". -# -# Funciones principales: -# - Descarga el tema de cursor desde su repositorio de GitHub. -# - Lo instala en el directorio ~/.icons del usuario. -# - Configura el cursor para Hyprland, modificando el fichero -# `~/.config/hypr/envs.conf`. -# - Configura el cursor para aplicaciones GTK a través de `gsettings`. -# -# Dependencias: curl, tar, gsettings (parte de glib2). -# -# =============================================================== SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "${SCRIPT_DIR}/common.sh" -# --------------------------------------------------------------- -# check_cursor_deps() -# --------------------------------------------------------------- -# Verifica que las dependencias necesarias para este módulo estén -# instaladas. -# --------------------------------------------------------------- -check_cursor_deps() { - local missing_deps=0 - for cmd in curl tar gsettings; do - if ! command_exists "$cmd"; then - log_error "El comando '$cmd' es necesario pero no está instalado." - ((missing_deps++)) - fi - done - return $missing_deps -} - -# --------------------------------------------------------------- -# install_mouse_cursor() -# --------------------------------------------------------------- -# Orquesta todo el proceso de instalación y configuración del cursor. -# --------------------------------------------------------------- install_mouse_cursor() { log_step "Instalación del Tema de Cursor (Bibata-Modern-Ice)" - if ! check_cursor_deps; then - return 1 - fi - - # --- Variables de Configuración --- + # --- Variables --- local CURSOR_THEME='Bibata-Modern-Ice' local CURSOR_SIZE=24 - local HYPR_CONFIG_DIR="$HOME/.config/hypr" - local ENVS_FILE="${HYPR_CONFIG_DIR}/envs.conf" + local ENVS_FILE="$HOME/.config/hypr/envs.conf" + local AUTOSTART_FILE="$HOME/.config/hypr/autostart.conf" local DOWNLOAD_URL="https://github.com/ful1e5/Bibata_Cursor/releases/download/v2.0.7/Bibata-Modern-Ice.tar.xz" local ARCHIVE_NAME="Bibata-Modern-Ice.tar.xz" - # --- 1. Descarga e Instalación --- + # --- Paso 1 y 2: Descargar, Extraer e Instalar --- log_info "Descargando e instalando el tema de cursor..." local TEMP_DIR TEMP_DIR=$(mktemp -d -p "/tmp" cursor_setup_XXXXXX) trap 'rm -rf "${TEMP_DIR}"' EXIT # Limpieza automática al salir - if ! curl -sL "$DOWNLOAD_URL" -o "${TEMP_DIR}/${ARCHIVE_NAME}"; then + if curl -sL "$DOWNLOAD_URL" -o "${TEMP_DIR}/${ARCHIVE_NAME}"; then + tar -xJf "${TEMP_DIR}/${ARCHIVE_NAME}" -C "${TEMP_DIR}" + mkdir -p "$HOME/.icons" + # Asegurar una instalación limpia eliminando la versión anterior si existe + if [ -d "${TEMP_DIR}/${CURSOR_THEME}" ]; then + rm -rf "$HOME/.icons/${CURSOR_THEME}" # Eliminar destino para evitar conflictos + if mv "${TEMP_DIR}/${CURSOR_THEME}" "$HOME/.icons/"; then + log_success "Tema de cursor instalado en ~/.icons/" + else + log_error "No se pudo mover el tema del cursor a ~/.icons/" + return 1 + fi + else + log_error "El directorio del tema '${CURSOR_THEME}' no se encontró en el archivo." + return 1 + fi + else log_error "No se pudo descargar el tema de cursor desde $DOWNLOAD_URL" return 1 fi - tar -xJf "${TEMP_DIR}/${ARCHIVE_NAME}" -C "${TEMP_DIR}" - mkdir -p "$HOME/.icons" - - # Asegura una instalación limpia eliminando la versión anterior si existe. - if [[ -d "${TEMP_DIR}/${CURSOR_THEME}" ]]; then - rm -rf "$HOME/.icons/${CURSOR_THEME}" - if ! mv "${TEMP_DIR}/${CURSOR_THEME}" "$HOME/.icons/"; then - log_error "No se pudo mover el tema del cursor a ~/.icons/" - return 1 + # --- Paso 3: Configurar variables de entorno para Hyprland --- + if [ -f "$ENVS_FILE" ]; then + log_info "Configurando variables de entorno en $ENVS_FILE..." + if ! grep -q "HYPRCURSOR_THEME,${CURSOR_THEME}" "$ENVS_FILE"; then + echo -e "\n# Custom Cursor Theme" >> "$ENVS_FILE" + echo "env = HYPRCURSOR_THEME,$CURSOR_THEME" >> "$ENVS_FILE" + echo "env = HYPRCURSOR_SIZE,$CURSOR_SIZE" >> "$ENVS_FILE" + echo "env = XCURSOR_THEME,$CURSOR_THEME" >> "$ENVS_FILE" + echo "env = XCURSOR_SIZE,$CURSOR_SIZE" >> "$ENVS_FILE" + log_success "Variables de cursor añadidas a Hyprland." + else + log_info "Las variables de cursor para Hyprland ya parecen estar configuradas." fi - log_success "Tema de cursor instalado en ~/.icons/" - else - log_error "El directorio del tema '${CURSOR_THEME}' no se encontró en el archivo descargado." - return 1 fi - # --- 2. Configuración para Hyprland --- - log_info "Configurando el cursor para Hyprland..." - mkdir -p "$HYPR_CONFIG_DIR" - touch "$ENVS_FILE" - - # Elimina configuraciones de cursor anteriores para evitar duplicados. - sed -i '/^env = HYPRCURSOR_THEME/d' "$ENVS_FILE" - sed -i '/^env = HYPRCURSOR_SIZE/d' "$ENVS_FILE" - sed -i '/^env = XCURSOR_THEME/d' "$ENVS_FILE" - sed -i '/^env = XCURSOR_SIZE/d' "$ENVS_FILE" - - # Añade las nuevas variables de entorno. - echo -e "\n# Configuración del Tema de Cursor (gestionado por Omarchy Setup)" >> "$ENVS_FILE" - echo "env = HYPRCURSOR_THEME,$CURSOR_THEME" >> "$ENVS_FILE" - echo "env = HYPRCURSOR_SIZE,$CURSOR_SIZE" >> "$ENVS_FILE" - echo "env = XCURSOR_THEME,$CURSOR_THEME" >> "$ENVS_FILE" - echo "env = XCURSOR_SIZE,$CURSOR_SIZE" >> "$ENVS_FILE" - log_success "Variables de entorno para el cursor añadidas a $ENVS_FILE." - - # --- 3. Configuración para Aplicaciones GTK --- + # --- Paso 4: Configurar GTK --- log_info "Configurando el cursor para aplicaciones GTK..." - if gsettings set org.gnome.desktop.interface cursor-theme "$CURSOR_THEME" && \ - gsettings set org.gnome.desktop.interface cursor-size "$CURSOR_SIZE"; then - log_success "Configuración de GSettings para GTK aplicada correctamente." - else - log_error "No se pudo aplicar la configuración de GSettings para GTK." - return 1 - fi + gsettings set org.gnome.desktop.interface cursor-theme "$CURSOR_THEME" + gsettings set org.gnome.desktop.interface cursor-size "$CURSOR_SIZE" + log_success "Configuración de GSettings aplicada." - log_success "La configuración del cursor ha finalizado." - log_warning "Para que todos los cambios surtan efecto, por favor, cierra sesión y vuelve a iniciarla." + log_success "¡Configuración del cursor completada!" + log_warning "Por favor, cierra sesión y vuelve a iniciarla para aplicar los cambios." return 0 } -# Ejecutar si se llama directamente al script. +# Ejecutar si se llama directamente if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then install_mouse_cursor "$@" -fi +fi \ No newline at end of file diff --git a/modules/printer.sh b/modules/printer.sh index 519eff2..97fd24d 100755 --- a/modules/printer.sh +++ b/modules/printer.sh @@ -2,19 +2,6 @@ # =============================================================== # printer.sh - Configuración de impresoras (CUPS) # =============================================================== -# -# Este módulo instala y configura el sistema de impresión CUPS -# (Common Unix Printing System) en Arch Linux. -# -# Funciones principales: -# - Instala CUPS, filtros de impresión y drivers genéricos. -# - Instala Avahi para la detección automática de impresoras en red. -# - Instala drivers específicos para impresoras Epson desde AUR. -# - Habilita y arranca los servicios de CUPS y Avahi. -# - Añade al usuario al grupo `lp` para permitir la administración -# de impresoras. -# -# =============================================================== SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "${SCRIPT_DIR}/common.sh" @@ -24,65 +11,65 @@ install_printer() { local target_user="${SUDO_USER:-$USER}" - # --- 1. Instalación de Paquetes Base --- - log_info "Instalando CUPS y paquetes base de impresión..." - # Paquetes: - # - cups, cups-pdf, cups-filters: El núcleo de CUPS. - # - ghostscript, gsfonts: Para interpretar PostScript. - # - gutenprint, foomatic-*: Drivers de impresión genéricos. - # - system-config-printer: Herramienta gráfica de configuración. - # - avahi, nss-mdns: Para descubrir impresoras en la red. + log_info "Instalando CUPS y paquetes base..." local base_pkgs=( - cups cups-pdf cups-filters ghostscript gsfonts gutenprint + cups cups-pdf cups-filters + ghostscript gsfonts + gutenprint foomatic-db-engine foomatic-db foomatic-db-ppds foomatic-db-nonfree foomatic-db-nonfree-ppds - system-config-printer avahi nss-mdns + system-config-printer + avahi nss-mdns ) - - if ! sudo pacman -S --noconfirm --needed "${base_pkgs[@]}"; then - log_warning "Algunos paquetes base de impresión no pudieron instalarse. El servicio podría no funcionar." + local pkg_failed=false + for pkg in "${base_pkgs[@]}"; do + if ! check_and_install_pkg "$pkg"; then + pkg_failed=true + fi + done + if [[ "$pkg_failed" == true ]]; then + log_warning "Algunos paquetes base no pudieron instalarse. Revisa los mensajes anteriores." fi - # --- 2. Instalación de Drivers de AUR --- - log_info "Instalando drivers para impresoras Epson (desde AUR)..." - # Drivers específicos para modelos de inyección de tinta de Epson. + log_info "Instalando drivers para Epson (ESC/P-R)..." local aur_drivers=("epson-inkjet-printer-escpr" "epson-inkjet-printer-escpr2" "epson-printer-utility") if ! aur_install_packages "${aur_drivers[@]}"; then - log_warning "No se pudieron instalar todos los drivers de Epson desde AUR. Revisa los mensajes de error." + log_warning "No se pudieron instalar todos los drivers de Epson de forma automática. Revisa 'epson-inkjet-printer-escpr2' y 'epson-printer-utility' manualmente." fi - # --- 3. Habilitación de Servicios --- - log_info "Habilitando y arrancando los servicios de impresión..." + log_info "Verificando servicios de impresión..." local services=("cups.service" "avahi-daemon.service") for svc in "${services[@]}"; do - if ! sudo systemctl is-enabled "$svc" &>/dev/null; then + if sudo systemctl is-enabled "$svc" &>/dev/null; then + log_info "${svc} ya está habilitado." + else sudo systemctl enable "$svc" - log_success "Servicio ${svc} habilitado." + log_success "${svc} habilitado." fi - if ! sudo systemctl is-active "$svc" &>/dev/null; then + + if sudo systemctl is-active "$svc" &>/dev/null; then + log_info "${svc} ya está en ejecución." + else sudo systemctl start "$svc" - log_success "Servicio ${svc} iniciado." + log_success "${svc} iniciado." fi done - # --- 4. Configuración de Permisos de Usuario --- - # El usuario debe pertenecer al grupo `lp` para administrar impresoras. if ! id -nG "$target_user" | grep -qw lp; then - log_info "Agregando al usuario '${target_user}' al grupo 'lp' para administrar impresoras..." + log_info "Agregando usuario ${target_user} al grupo lp..." sudo usermod -aG lp "$target_user" - log_warning "Para que este cambio de grupo tenga efecto, es necesario cerrar sesión y volver a iniciarla." else - log_info "El usuario '${target_user}' ya pertenece al grupo 'lp'." + log_info "El usuario ${target_user} ya pertenece al grupo lp." fi - log_success "La configuración de CUPS ha finalizado." - log_info "Puedes añadir y gestionar tus impresoras desde la interfaz web de CUPS en http://localhost:631" - log_info "o utilizando la herramienta gráfica 'system-config-printer'." + log_success "Dependencias de impresión instaladas." + log_info "Añade tu impresora Epson L4150 desde http://localhost:631 o con 'system-config-printer'." + log_info "El módulo no configura impresoras automáticamente; solo deja listas las dependencias." return 0 } -# Ejecutar si se llama directamente al script. +# Ejecutar si se llama directamente if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then install_printer "$@" fi diff --git a/modules/ssh-keyring.sh b/modules/ssh-keyring.sh index 04b72eb..063c5c4 100755 --- a/modules/ssh-keyring.sh +++ b/modules/ssh-keyring.sh @@ -2,37 +2,10 @@ # =============================================================== # ssh-keyring.sh - Sincronizar claves SSH con GNOME Keyring # =============================================================== -# -# Este módulo se encarga de encontrar todas las claves SSH privadas -# en el directorio ~/.ssh del usuario y añadirlas al agente de -# GNOME Keyring. Esto permite que las claves estén disponibles -# para autenticación sin necesidad de introducir la passphrase -# cada vez, ya que el keyring las gestiona de forma segura. -# -# Funciones principales: -# - Inicia el daemon de GNOME Keyring con los componentes de -# SSH y secretos. -# - Configura la variable de entorno SSH_AUTH_SOCK para que -# apunten al socket del keyring. -# - Detecta claves ya cargadas para evitar añadirlas de nuevo. -# -# Dependencias: gnome-keyring, openssh. -# -# =============================================================== SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "${SCRIPT_DIR}/common.sh" -# --------------------------------------------------------------- -# _derive_fingerprint(key_path) -# --------------------------------------------------------------- -# Obtiene el "fingerprint" (huella digital) de una clave SSH. -# Esto se usa para identificar de forma única cada clave y así -# evitar añadir al agente claves que ya han sido cargadas. -# -# Parámetros: -# $1 - Ruta a la clave SSH privada. -# --------------------------------------------------------------- _derive_fingerprint() { local key_path="$1" local pub_path="${key_path}.pub" @@ -46,72 +19,73 @@ _derive_fingerprint() { echo "$fingerprint" } -# --------------------------------------------------------------- -# sync_ssh_keyring() -# --------------------------------------------------------------- -# Función principal que orquesta la sincronización de claves. -# --------------------------------------------------------------- sync_ssh_keyring() { log_step "Sincronizar claves SSH con GNOME Keyring" - # --- 1. Verificación de Dependencias --- if ! command_exists gnome-keyring-daemon; then - log_error "El comando 'gnome-keyring-daemon' no está instalado. Ejecuta primero el módulo de aplicaciones." - return 1 - fi - if ! command_exists ssh-add; then - log_error "El comando 'ssh-add' (de openssh) no está disponible. Instala primero el módulo de aplicaciones." + log_error "gnome-keyring-daemon no está instalado. Ejecuta primero el módulo de aplicaciones." + return 1 + fi + + if ! command_exists ssh-add; then + log_error "ssh-add no está disponible (openssh). Instala el módulo de aplicaciones antes." return 1 fi - # --- 2. Configuración del Entorno de GNOME Keyring --- - # Asegura que la variable SSH_AUTH_SOCK apunte al socket correcto. mkdir -p "${HOME}/.config/environment.d" cat <<'EOF' > "${HOME}/.config/environment.d/10-gnome-keyring.conf" SSH_AUTH_SOCK=/run/user/$UID/keyring/ssh EOF - # Inicia el daemon de GNOME Keyring si no está ya en ejecución. local keyring_eval="" if keyring_eval="$(gnome-keyring-daemon --start --components=ssh,secrets 2>/dev/null)"; then eval "$keyring_eval" - log_success "El daemon de GNOME Keyring se ha iniciado." + log_success "GNOME Keyring iniciado." else - log_info "El daemon de GNOME Keyring ya estaba en ejecución." + log_info "GNOME Keyring ya estaba en ejecución." fi - # Exporta la variable SSH_AUTH_SOCK para la sesión actual. local keyring_socket="${SSH_AUTH_SOCK:-/run/user/$UID/keyring/ssh}" if [[ ! -S "$keyring_socket" ]]; then - log_error "No se encontró el socket de GNOME Keyring. El componente SSH podría no estar activo." - return 1 + log_warning "No se encontró el socket de GNOME Keyring en ${keyring_socket}." + if [[ -S "/run/user/$UID/keyring/ssh" ]]; then + keyring_socket="/run/user/$UID/keyring/ssh" + else + log_error "GNOME Keyring no expone el componente SSH. Revisa tu sesión." + return 1 + fi fi export SSH_AUTH_SOCK="$keyring_socket" - # --- 3. Búsqueda y Filtrado de Claves SSH --- local ssh_dir="${HOME}/.ssh" if [[ ! -d "$ssh_dir" ]]; then - log_warning "El directorio ${ssh_dir} no existe. No hay claves para agregar." + log_warning "No existe el directorio ${ssh_dir}. No hay claves para agregar." return 0 fi - # Encuentra todas las claves privadas en ~/.ssh, excluyendo ficheros públicos y de configuración. mapfile -t ssh_private_keys < <( find "$ssh_dir" -maxdepth 1 -type f -perm -u=r \ - ! -name "*.pub" ! -name "*-cert.pub" ! -name "known_hosts" \ - ! -name "known_hosts.*" ! -name "authorized_keys" ! -name "config" \ - ! -name "*.old" ! -name "agent" ! -name "*.bak" 2>/dev/null | sort + ! -name "*.pub" \ + ! -name "*-cert.pub" \ + ! -name "known_hosts" \ + ! -name "known_hosts.*" \ + ! -name "authorized_keys" \ + ! -name "config" \ + ! -name "*.old" \ + ! -name "agent" \ + ! -name "*.bak" \ + 2>/dev/null | sort ) if [[ ${#ssh_private_keys[@]} -eq 0 ]]; then - log_info "No se encontraron claves privadas en ${ssh_dir}." + log_warning "No se encontraron claves privadas SSH en ${ssh_dir}." return 0 fi - # --- 4. Sincronización de Claves --- - # Obtiene los fingerprints de las claves que ya están cargadas en el agente. local existing_fingerprints="" if output=$(SSH_AUTH_SOCK="$SSH_AUTH_SOCK" ssh-add -l 2>/dev/null); then existing_fingerprints="$(awk '{print $2}' <<<"$output")" + else + existing_fingerprints="" fi local added=0 @@ -119,40 +93,37 @@ EOF local fingerprint fingerprint="$(_derive_fingerprint "$key_path")" if [[ -z "$fingerprint" ]] && ! ssh-keygen -y -f "$key_path" >/dev/null 2>&1; then - log_warning "El archivo $(basename "$key_path") no parece una clave privada válida y será omitido." + log_warning "El archivo $(basename "$key_path") no parece una clave privada válida. Se omite." continue fi - # Si la clave ya está en el agente, la omite. if [[ -n "$fingerprint" ]] && grep -Fq "$fingerprint" <<<"$existing_fingerprints"; then - log_info "La clave $(basename "$key_path") ya está registrada en el keyring." + log_info "Clave $(basename "$key_path") ya está registrada en el keyring." continue fi - # Intenta añadir la clave. Se pedirá la passphrase si está protegida. - log_info "Añadiendo la clave $(basename "$key_path") al keyring..." + log_info "Añadiendo clave $(basename "$key_path") al keyring..." if SSH_AUTH_SOCK="$SSH_AUTH_SOCK" ssh-add "$key_path"; then - log_success "La clave $(basename "$key_path") se ha añadido correctamente." + log_success "Clave $(basename "$key_path") añadida correctamente." added=$((added + 1)) if [[ -n "$fingerprint" ]]; then existing_fingerprints+=$'\n'"$fingerprint" fi else - log_warning "No se pudo añadir la clave $(basename "$key_path"). Es posible que la passphrase sea incorrecta." + log_warning "No se pudo añadir la clave $(basename "$key_path")." fi done if [[ $added -gt 0 ]]; then - log_success "Se han sincronizado ${added} claves SSH con GNOME Keyring." + log_success "Claves SSH sincronizadas con GNOME Keyring." else - log_info "Todas las claves SSH ya estaban sincronizadas. No se añadieron nuevas claves." + log_info "No se añadieron nuevas claves SSH." fi - log_info "Para verificar las claves cargadas, puedes ejecutar: ssh-add -l" + log_info "Para verificar, ejecuta: ssh-add -l" return 0 } -# Ejecutar si se llama directamente al script. if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then sync_ssh_keyring "$@" fi diff --git a/modules/zerotier.sh b/modules/zerotier.sh index c1b8a0b..fa4c8ee 100755 --- a/modules/zerotier.sh +++ b/modules/zerotier.sh @@ -2,18 +2,6 @@ # =============================================================== # zerotier.sh - Configuración de ZeroTier # =============================================================== -# -# Este módulo se encarga de la instalación y configuración de -# ZeroTier One, un servicio de red virtual que permite conectar -# dispositivos de forma segura a través de internet. -# -# Funciones principales: -# - Instala el paquete `zerotier-one` desde los repositorios. -# - Habilita e inicia el servicio de ZeroTier. -# - Ofrece una opción interactiva para que el usuario pueda unirse -# a una red de ZeroTier inmediatamente después de la instalación. -# -# =============================================================== SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "${SCRIPT_DIR}/common.sh" @@ -21,51 +9,46 @@ source "${SCRIPT_DIR}/common.sh" install_zerotier() { log_step "Configuración de ZeroTier" - # --- 1. Instalación de ZeroTier --- - log_info "Instalando ZeroTier One..." - if ! aur_install_packages "zerotier-one"; then - log_error "No se pudo instalar ZeroTier One. Abortando." + # Instalar ZeroTier + log_info "Instalando ZeroTier..." + sudo pacman -S --noconfirm --needed zerotier-one || { + log_error "Error al instalar ZeroTier" return 1 - fi + } - # --- 2. Habilitación del Servicio --- - log_info "Habilitando e iniciando el servicio de ZeroTier..." - # `enable --now` habilita el servicio para que arranque con el sistema - # y lo inicia inmediatamente en la sesión actual. - if ! sudo systemctl enable --now zerotier-one.service; then - log_error "No se pudo iniciar el servicio de ZeroTier." - return 1 - fi + # Habilitar y iniciar servicio + log_info "Habilitando servicio de ZeroTier..." + sudo systemctl enable zerotier-one.service + sudo systemctl start zerotier-one.service - log_success "ZeroTier se ha instalado y el servicio está en ejecución." - log_info "Tu ID de nodo de ZeroTier es: $(sudo zerotier-cli info | awk '{print $3}')" + log_success "ZeroTier instalado y servicio iniciado." + log_info "Tu ID de ZeroTier es: $(sudo zerotier-cli info | awk '{print $3}')" echo "" - # --- 3. Unirse a una Red (Opcional) --- read -p "¿Deseas unirte a una red de ZeroTier ahora? [s/N]: " confirm if [[ "${confirm}" =~ ^[SsYy]$ ]]; then read -p "Introduce el ID de la red de ZeroTier: " network_id if [[ -n "$network_id" ]]; then - log_info "Enviando solicitud para unirse a la red ${network_id}..." + log_info "Uniéndote a la red ${network_id}..." if sudo zerotier-cli join "$network_id"; then - log_success "Solicitud enviada correctamente." - log_warning "Recuerda que debes autorizar este dispositivo en el panel de control de tu red ZeroTier." + log_success "Solicitud enviada para unirse a la red ${network_id}." + log_warning "Recuerda autorizar este dispositivo en el panel de control de ZeroTier." else - log_error "No se pudo enviar la solicitud para unirse a la red ${network_id}." + log_error "No se pudo unir a la red ${network_id}." fi else log_warning "No se introdujo ningún ID de red. Operación cancelada." fi else - log_info "Se omitió la unión a una red." - log_info "Para unirte a una red más tarde, puedes ejecutar el comando:" + log_info "Operación omitida." + log_info "Para unirte a una red más tarde, ejecuta:" log_info "sudo zerotier-cli join " fi return 0 } -# Ejecutar si se llama directamente al script. +# Ejecutar si se llama directamente if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then install_zerotier "$@" fi diff --git a/modules/zsh-config.sh b/modules/zsh-config.sh index c048ada..7dadc58 100755 --- a/modules/zsh-config.sh +++ b/modules/zsh-config.sh @@ -1,20 +1,9 @@ #!/usr/bin/env bash -# =============================================================== -# zsh-config.sh - Configuración completa de Zsh -# =============================================================== # -# Este módulo se encarga de transformar la experiencia de la terminal -# mediante la instalación y configuración de Zsh, Oh My Zsh y Oh My Posh. +# Módulo para configurar Zsh, Oh My Zsh, Oh My Posh y dependencias. # -# Funciones principales: -# - Instala Zsh y un conjunto de herramientas de terminal útiles. -# - Instala y configura Oh My Posh, incluyendo un tema personalizado. -# - Instala Oh My Zsh y gestiona sus plugins. -# - Descarga y aplica un fichero .zshrc preconfigurado. -# - Cambia el shell por defecto del usuario a Zsh. -# -# =============================================================== +# Asegurarse de que las funciones comunes están cargadas SCRIPT_DIR_MODULE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT_DIR_ROOT="$(cd "${SCRIPT_DIR_MODULE}/.." && pwd)" if [[ -f "${SCRIPT_DIR_MODULE}/common.sh" ]]; then @@ -39,35 +28,38 @@ zsh_download_with_timeout() { install_zsh() { log_step "Configuración Completa de Zsh" - # Determina el usuario y el directorio home de destino, manejando el caso de `sudo`. local target_user="${SUDO_USER:-$USER}" - local target_home + local target_home="$HOME" if [[ -n "${SUDO_USER:-}" ]]; then target_home="$(getent passwd "$target_user" 2>/dev/null | cut -d: -f6)" + if [[ -z "$target_home" ]]; then + target_home="$(eval echo "~${target_user}")" + fi fi target_home="${target_home:-$HOME}" - # --- 1. Instalación de Paquetes --- - log_info "Instalando Zsh y herramientas de terminal..." - # Paquetes: - # - zsh y plugins: El shell y sus complementos básicos. - # - zoxide, fastfetch, yt-dlp: Herramientas que mejoran la productividad - # y están integradas en el .zshrc personalizado. + # --- 1. Instalar paquetes necesarios desde Pacman --- + log_info "Instalando Zsh y herramientas esenciales..." local pkgs=( - git zsh zsh-completions zsh-syntax-highlighting zsh-autosuggestions - zoxide fastfetch yt-dlp unrar p7zip lsof + git + zsh + zsh-completions + zsh-syntax-highlighting + zsh-autosuggestions + zoxide # Navegación inteligente + fastfetch # Información del sistema + yt-dlp # Descarga de videos/audio + unrar p7zip lsof # Dependencias para funciones en .zshrc ) - if ! sudo pacman -S --noconfirm --needed "${pkgs[@]}"; then - log_warning "Algunos paquetes de Zsh no pudieron instalarse." - fi + for pkg in "${pkgs[@]}"; do + check_and_install_pkg "$pkg" + done - # Instala Oh My Posh, con fallback a AUR y luego al script oficial si es necesario. + # Instalar Oh My Posh con fallback a AUR si es necesario if ! command_exists oh-my-posh; then log_info "Instalando Oh My Posh..." - if sudo pacman -S --noconfirm --needed oh-my-posh 2>/dev/null; then - log_success "Oh My Posh instalado desde los repositorios oficiales." - elif aur_install_packages "oh-my-posh-bin"; then - log_success "Oh My Posh instalado desde AUR." + if command_exists pacman && sudo pacman -S --noconfirm --needed oh-my-posh 2>/dev/null; then + log_success "Oh My Posh instalado desde pacman." else log_warning "Pacman no pudo instalar oh-my-posh. Intentando con un helper AUR..." if aur_install_packages "oh-my-posh-bin"; then @@ -97,7 +89,7 @@ install_zsh() { log_info "Oh My Posh ya está instalado." fi - # --- 2. Instalación de Oh My Zsh --- + # --- 2. Instalar Oh My Zsh (si no existe) --- local target_ohmyzsh_dir="${target_home}/.oh-my-zsh" if [[ ! -d "$target_ohmyzsh_dir" ]]; then log_info "Instalando Oh My Zsh..." @@ -124,48 +116,79 @@ install_zsh() { log_info "Oh My Zsh ya está instalado." fi - # --- 3. Gestión de Plugins de Oh My Zsh --- - # Asegura que los plugins de autocompletado y resaltado de sintaxis estén clonados. + # Asegurar plugins personalizados de Oh My Zsh (zsh-autosuggestions, zsh-syntax-highlighting) + local zsh_custom="${target_ohmyzsh_dir}/custom" + local zsh_custom_plugins="${zsh_custom}/plugins" + mkdir -p "$zsh_custom_plugins" + ensure_omz_plugin() { - local name="$1" repo="$2" - local plugin_path="${target_home}/.oh-my-zsh/custom/plugins/${name}" + local name="$1" + local repo="$2" + local plugin_path="${zsh_custom_plugins}/${name}" + if [[ -d "${plugin_path}/.git" ]]; then - log_info "Actualizando el plugin de Oh My Zsh: ${name}..." + log_info "Actualizando plugin ${name}..." git -C "$plugin_path" pull --ff-only >/dev/null 2>&1 || true - elif [[ ! -d "$plugin_path" ]]; then - log_info "Clonando el plugin de Oh My Zsh: ${name}..." - git clone --depth 1 "$repo" "$plugin_path" >/dev/null 2>&1 + elif [[ -d "$plugin_path" ]]; then + log_info "Plugin ${name} ya existe." + else + log_info "Clonando plugin ${name}..." + if git clone --depth 1 "$repo" "$plugin_path" >/dev/null 2>&1; then + log_success "Plugin ${name} instalado." + else + log_warning "No se pudo clonar ${name}. Se usará la versión de los paquetes del sistema." + fi fi } + ensure_omz_plugin "zsh-autosuggestions" "https://github.com/zsh-users/zsh-autosuggestions.git" ensure_omz_plugin "zsh-syntax-highlighting" "https://github.com/zsh-users/zsh-syntax-highlighting.git" - # --- 4. Configuración del .zshrc --- - log_info "Configurando el fichero .zshrc..." + # --- 3. Descargar y configurar el .zshrc personalizado --- + log_info "Actualizando configuración .zshrc..." + local repo_zshrc_path="${SCRIPT_DIR_ROOT}/.zshrc" local tmp_download="${target_home}/.zshrc.omarchy-tmp" local source_file="" if zsh_download_with_timeout "${REPO_BASE}/.zshrc" "$tmp_download" && [[ -s "$tmp_download" ]]; then source_file="$tmp_download" - # Si falla, usa la copia local que viene con el script. - elif [[ -f "${SCRIPT_DIR_ROOT}/.zshrc" ]]; then - log_warning "No se pudo descargar .zshrc. Se usará la copia local." - source_file="${SCRIPT_DIR_ROOT}/.zshrc" + log_success "Configuración .zshrc descargada desde el repositorio remoto." else - log_error "No se pudo obtener el fichero .zshrc."; return 1 + rm -f "$tmp_download" + if [[ -f "$repo_zshrc_path" ]]; then + log_warning "No se pudo descargar .zshrc. Usando la copia local del repositorio." + source_file="$repo_zshrc_path" + else + log_error "No se pudo obtener la configuración .zshrc (sin red y sin copia local)." + return 1 + fi fi - # Crea una copia de seguridad y reemplaza el .zshrc existente. - backup_file "${target_home}/.zshrc" || { rm -f "$tmp_download"; return 1; } - if ! cp "$source_file" "${target_home}/.zshrc"; then - log_error "No se pudo actualizar el fichero .zshrc."; rm -f "$tmp_download"; return 1 - fi - rm -f "$tmp_download" - log_success ".zshrc actualizado correctamente." - # --- 5. Configuración del Tema de Oh My Posh --- - log_info "Configurando el tema de Oh My Posh (Catppuccin Frappe)..." + # Crear copia de seguridad antes de sobrescribir + backup_file "${target_home}/.zshrc" || { rm -f "$tmp_download"; return 1; } + + if [[ "$source_file" == "$tmp_download" ]]; then + if mv "$tmp_download" "${target_home}/.zshrc"; then + log_success "Archivo .zshrc actualizado." + else + rm -f "$tmp_download" + log_error "No se pudo mover el archivo .zshrc descargado." + return 1 + fi + else + if cp "$source_file" "${target_home}/.zshrc"; then + log_success "Archivo .zshrc actualizado desde la copia local." + else + log_error "No se pudo copiar la configuración .zshrc local." + return 1 + fi + fi + + # --- 4. Descargar el tema de Oh My Posh --- + log_info "Configurando tema de Oh My Posh (Catppuccin Frappe)..." local posh_themes_dir="${target_home}/.poshthemes" local theme_file="$posh_themes_dir/catppuccin_frappe.omp.json" + local posh_theme_local="${SCRIPT_DIR_ROOT}/themes/catppuccin_frappe.omp.json" mkdir -p "$posh_themes_dir" if zsh_download_with_timeout "https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/catppuccin_frappe.omp.json" "$theme_file"; then @@ -181,43 +204,59 @@ install_zsh() { log_error "No se pudo copiar la versión local del tema Catppuccin." fi else - log_error "No se pudo obtener el tema de Oh My Posh." + log_error "No se pudo descargar el tema de Oh My Posh y no hay copia local disponible." + # No retornamos error, el .zshrc tiene un fallback fi fi - # Genera el fichero de autocompletado para Zsh. + if command_exists oh-my-posh; then local omp_completion_dir="${target_home}/.local/share/zsh/site-functions" mkdir -p "$omp_completion_dir" - oh-my-posh completion zsh > "${omp_completion_dir}/_oh-my-posh" 2>/dev/null || true - fi - log_success "Tema de Oh My Posh configurado." - - # --- 6. Cambio de Shell por Defecto --- - local current_shell; current_shell="$(getent passwd "$target_user" 2>/dev/null | cut -d: -f7)" - if [[ "$(basename "$current_shell")" != "zsh" ]]; then - log_info "Cambiando el shell por defecto a Zsh para el usuario '$target_user'..." - if ! sudo chsh -s "$(command -v zsh)" "$target_user"; then - log_error "No se pudo cambiar el shell automáticamente." - else - log_success "Shell cambiado a Zsh. El cambio será efectivo en el próximo inicio de sesión." + if oh-my-posh completion zsh > "${omp_completion_dir}/_oh-my-posh" 2>/dev/null; then + log_success "Autocompletado de Oh My Posh actualizado." fi fi - # --- 7. Configuración de .bashrc --- - # Añade una línea a .bashrc para que las terminales que se abran con Bash - # ejecuten Zsh automáticamente. - local bashrc_zsh_loader='if [ -t 1 ]; then exec zsh; fi' - if [[ -f "${target_home}/.bashrc" ]] && ! grep -q "exec zsh" "${target_home}/.bashrc"; then - echo -e "\n# Iniciar Zsh automáticamente\n$bashrc_zsh_loader" >> "${target_home}/.bashrc" + # --- 5. Cambiar el shell por defecto a Zsh para el usuario actual --- + local current_shell + current_shell="$(getent passwd "$target_user" 2>/dev/null | cut -d: -f7)" + current_shell="${current_shell:-$SHELL}" + if [[ "$(basename "$current_shell")" != "zsh" ]]; then + log_info "Cambiando el shell por defecto a Zsh..." + local zsh_path + zsh_path="$(command -v zsh)" + if [[ -z "$zsh_path" ]]; then + log_error "No se encontró la ruta de Zsh. Aborta el cambio de shell." + elif sudo -n chsh -s "$zsh_path" "$target_user"; then + log_success "Shell cambiado a Zsh. El cambio será efectivo en el próximo inicio de sesión." + else + log_error "No se pudo cambiar el shell automáticamente. Ejecuta 'sudo chsh -s \"$zsh_path\" $target_user' manualmente." + fi + else + log_info "Zsh ya es el shell por defecto." fi - # --- 8. Mensaje Final --- + # --- 6. Configurar .bashrc para lanzar Zsh (para sesiones no interactivas) --- + local bashrc_zsh_loader=' +# Launch Zsh +if [ -t 1 ]; then + exec zsh +fi' + if [[ -f "${target_home}/.bashrc" ]] && ! grep -q "exec zsh" "${target_home}/.bashrc"; then + log_info "Configurando .bashrc para iniciar Zsh automáticamente..." + echo "$bashrc_zsh_loader" >> "${target_home}/.bashrc" + else + log_info ".bashrc ya está configurado para lanzar Zsh." + fi + + # --- 7. Mensaje final --- echo "" - log_warning "¡ACCIÓN REQUERIDA! Para que los iconos del prompt se vean bien:" - log_info "1. Instala una 'Nerd Font'. La recomendada es Meslo." - log_info " Puedes hacerlo con el comando: oh-my-posh font install meslo" - log_info "2. Configura tu aplicación de terminal para que use la fuente 'MesloLGS NF'." - log_info "3. Cierra y vuelve a abrir la terminal para aplicar todos los cambios." + log_warning "¡IMPORTANTE! Para que los iconos se vean bien, debes configurar tu terminal:" + log_info "1. Abre las Preferencias de tu terminal." + log_info "2. Ve a la sección de Perfil -> Apariencia/Texto." + log_info "3. Cambia la fuente a una 'Nerd Font' (ej: FiraCode Nerd Font, MesloLGS NF)." + log_info "4. Cierra y vuelve a abrir la terminal para ver todos los cambios." + log_warning "Recuerda instalar manualmente una Nerd Font; el script no instala fuentes." return 0 } diff --git a/omarchy-setup.sh b/omarchy-setup.sh index 725326f..77ed478 100755 --- a/omarchy-setup.sh +++ b/omarchy-setup.sh @@ -131,6 +131,7 @@ MODULES=( ["5"]="printer;install_printer;🖨️ Configurar Impresoras (CUPS);bg" ["6"]="mouse_cursor;install_mouse_cursor;🖱️ Instalar Tema de Cursor (Bibata);bg" ["7"]="icon_manager;run_module_main;🎨 Gestionar Temas de Iconos (Papirus, Tela, etc.);fg" + ["7D"]="icon_manager;set_default_icon_theme;🎨 Instalar Tema de Iconos por Defecto;bg" ["K"]="ssh-keyring;sync_ssh_keyring;🔐 Sincronizar claves SSH con GNOME Keyring;fg" ["F"]="disk-format;run_module_main;💾 Habilitar Formatos FAT/exFAT/NTFS/ext4;bg" ["R"]="davinci-resolve;install_davinci_resolve;🎬 Instalar DaVinci Resolve (Intel Edition);fg" @@ -144,12 +145,19 @@ EXCLUDED_FROM_ALL=("R") get_install_all_choices() { local choices=() for key in $(printf '%s\n' "${!MODULES[@]}" | sort -V); do - # Verificar si la clave no está en el array de exclusión - if ! [[ " ${EXCLUDED_FROM_ALL[*]} " =~ " ${key} " ]]; then + # Excluir módulos no deseados y el módulo interactivo de iconos + if [[ " ${EXCLUDED_FROM_ALL[*]} " =~ " ${key} " || "$key" == "7" ]]; then + continue + fi + # Si el módulo 7D existe, añadirlo en lugar del 7 + if [[ "$key" == "7D" ]]; then + choices+=("7D") + elif [[ ! "$key" =~ D$ ]]; then # Evitar añadir otros módulos 'D' choices+=("$key") fi done - echo "${choices[@]}" + # Asegurarse de que el orden sea consistente + printf '%s\n' "${choices[@]}" | sort -V | xargs } # Módulos a incluir en la opción "Instalar Todo" @@ -164,12 +172,14 @@ show_menu() { echo "" echo -e "${BOLD}Selecciona las opciones que deseas instalar:${NC}" echo "" - # Generar menú dinámicamente - for key in "${!MODULES[@]}"; do + # Generar menú dinámicamente, excluyendo los módulos "D" (Default) + for key in $(printf '%s\n' "${!MODULES[@]}" | sort -V); do + if [[ "$key" =~ D$ ]]; then + continue + fi IFS=';' read -r _ _ description _ <<< "${MODULES[$key]}" - # Asegurarse de que las claves numéricas se ordenen correctamente echo -e " ${GREEN}${key})${NC} ${description}" - done | sort -V + done local install_all_keys=$(IFS=,; echo "${INSTALL_ALL_CHOICES[*]}") echo -e " ${GREEN}A)${NC} ✅ Instalar Todo (${install_all_keys//,/, }) (excluye DaVinci)" @@ -307,10 +317,18 @@ install_all() { done if [[ ${#failed[@]} -eq 0 ]]; then - log_success "Todas las instalaciones se completaron correctamente" + log_success "Todas las instalaciones se completaron correctamente." else log_warning "Algunos módulos fallaron: ${failed[*]}" fi + + echo "" + log_step "Pasos Finales Recomendados" + log_info "Para completar la configuración, por favor, sigue estos pasos:" + echo "1. ${BOLD}Cierra sesión y vuelve a iniciarla.${NC} Esto es crucial para que se activen servicios como Docker y GNOME Keyring." + echo "2. ${BOLD}Abre una nueva terminal y ejecuta este script de nuevo.${NC}" + echo "3. ${BOLD}Selecciona la opción 'K'${NC} para sincronizar tus claves SSH con el agente de GNOME Keyring." + echo "" } # Función principal