diff --git a/Readme.md b/Readme.md index 11b971b..07e4242 100644 --- a/Readme.md +++ b/Readme.md @@ -32,8 +32,9 @@ omarchy_zsh_setup/ │ ├── 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 │ ├── davinci-resolve.sh # DaVinci Resolve (Intel Edition) -│ └── mouse_cursor.sh # Tema de cursor Bibata └── Readme.md ``` @@ -63,18 +64,10 @@ Selecciona las opciones que deseas instalar: ## 📋 Módulos Disponibles ### 1. 📦 Aplicaciones (`apps.sh`) -- Herramientas base (git, curl, wget, etc.) -- VS Code -- Cursor (desde AUR) -- VLC y plugins multimedia -- Herramientas de desarrollo -- Configuración de VLC como reproductor predeterminado +- Editores como VS Code y Cursor (desde AUR) ### 2. 🐚 Zsh (`zsh-config.sh`) -- Instalación de Zsh y plugins -- Descarga de configuración `.zshrc` desde GitHub -- Configuración como shell predeterminada -- Plugins: syntax-highlighting, autosuggestions +- Modifica `.bashrc` para lanzar Zsh automáticamente ### 3. 🐳 Docker (`docker.sh`) - Instalación de Docker y Docker Compose @@ -90,13 +83,15 @@ Selecciona las opciones que deseas instalar: ### 5. 🖨️ Impresoras (`printer.sh`) - Instalación de CUPS - Drivers comunes de impresora -- Configuración de servicios -- Interfaz web en http://localhost:631 -### 6. 🎬 DaVinci Resolve (`davinci-resolve.sh`) -- Instalación de DaVinci Resolve para Intel GPU -- Configuración de OpenCL -- Requiere ZIP de instalación en `~/Downloads` +### 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. + +### 8. 🎬 DaVinci Resolve (`davinci-resolve.sh`) - Configuración de librerías y wrapper ## 🔧 Ejecutar Módulos Individualmente @@ -160,12 +155,9 @@ cd omarchy_setup - intel-compute-runtime (OpenCL para Intel) ### 🐚 Zsh -- Shell Zsh con plugins (syntax-highlighting, autosuggestions) -- Configuración personalizada desde GitHub -- Configuración como shell predeterminada +- Modifica `.bashrc` para lanzar Zsh automáticamente ### 🐳 Docker -- Docker y Docker Compose - Portainer (interfaz web de gestión) - Usuario agregado al grupo docker - Servicios habilitados y configurados @@ -662,9 +654,9 @@ X) - Docker y Portainer (docker.sh) - ZeroTier (zerotier.sh) - Impresoras CUPS (printer.sh) + - Tema de Cursor (mouse_cursor.sh) - DaVinci Resolve (davinci-resolve.sh) -- 🔧 **Fácil de extender**: Agrega nuevos módulos fácilmente -- 🧹 **Limpieza**: Eliminado archivo duplicado davinci_resolve_intel.sh + - Gestor de Iconos (icon_manager.sh) ### v2.8.1 (2025-11-02) - Versión unificada con estética Catppuccin @@ -696,11 +688,7 @@ bash <(curl -fsSL https://raw.githubusercontent.com/marcogll/scripts_mg/main/oma ## 📝 Notas importantes -- **Módulos locales requeridos**: El script requiere que los módulos estén presentes localmente. Clona el repositorio completo. -- **Permisos sudo**: El script requiere permisos de sudo para instalar paquetes y configurar servicios. -- **Reinicio recomendado**: Después de instalar servicios (Docker, ZeroTier, CUPS), se recomienda reiniciar o al menos cerrar sesión para aplicar cambios de grupos. -- **Shell por defecto**: El módulo de Zsh verificará y cambiará el shell predeterminado si es necesario. -- **DaVinci Resolve**: Requiere el ZIP de instalación en `~/Downloads` antes de ejecutar el módulo. +- **Shell por defecto**: El módulo de Zsh modifica `.bashrc` para que las terminales nuevas usen Zsh. ## 🚀 Próximos Pasos diff --git a/modules/davinci-resolve.sh b/modules/davinci-resolve.sh index c9ba5be..e290e8b 100755 --- a/modules/davinci-resolve.sh +++ b/modules/davinci-resolve.sh @@ -6,6 +6,29 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "${SCRIPT_DIR}/common.sh" +# 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 percent=$((current * 100 / total)) + local completed_len=$((percent / 2)) + local bar="" + for ((i=0; i /dev/null + stop_spinner $? "Dependencias básicas instaladas." # Configurar OpenCL / Intel GPU log_info "Configurando runtime OpenCL de Intel y drivers de video..." @@ -39,15 +63,18 @@ install_davinci_resolve() { sudo pacman -Rns --noconfirm nvidia nvidia-utils nvidia-settings opencl-nvidia || true fi + start_spinner "Instalando headers del kernel (si es necesario)..." # Instalar headers del kernel si son necesarios KVER="$(uname -r)" if [[ ! -d "/usr/lib/modules/${KVER}/build" ]]; then log_info "Instalando headers de kernel..." - sudo pacman -S --needed --noconfirm linux-headers linux-zen-headers || true + sudo pacman -S --needed --noconfirm linux-headers linux-zen-headers &> /dev/null fi + stop_spinner $? "Headers del kernel verificados." # Instalar runtime OpenCL (compute runtime), desde AUR si es necesario if ! pacman -Qi intel-compute-runtime &>/dev/null; then + start_spinner "Instalando intel-compute-runtime desde AUR..." log_info "Instalando intel-compute-runtime (puede venir del AUR)..." AUR_HELPER=$(ensure_aur_helper) if [ "$AUR_HELPER" = "yay" ]; then @@ -67,10 +94,11 @@ install_davinci_resolve() { return 1 fi fi + stop_spinner $? "intel-compute-runtime instalado." fi + start_spinner "Instalando paquetes de video y OpenCL..." # Instalar otros paquetes Intel / VA-API / OpenCL - log_info "Instalando paquetes Intel / VA-API / OpenCL..." sudo pacman -S --needed --noconfirm \ intel-media-driver \ ocl-icd \ @@ -79,7 +107,8 @@ install_davinci_resolve() { glu \ gtk2 \ fuse2 \ - libva-utils libvdpau-va-gl || true + libva-utils libvdpau-va-gl &> /dev/null + stop_spinner $? "Paquetes de video instalados." # Asegurar el archivo ICD para OpenCL de Intel if [[ ! -f /etc/OpenCL/vendors/intel.icd ]]; then @@ -104,8 +133,7 @@ install_davinci_resolve() { log_info "Verificando soporte de decodificación VA-API para H264 / HEVC..." vainfo | grep -E "H264|HEVC" || true - # Extraer DaVinci Resolve - log_info "Extrayendo DaVinci Resolve del ZIP..." + start_spinner "Extrayendo DaVinci Resolve del ZIP (puede tardar)..." NEEDED_GB=10 FREE_KB=$(df --output=avail -k "${ZIP_DIR}" | tail -n1) FREE_GB=$((FREE_KB / 1024 / 1024)) @@ -116,7 +144,8 @@ install_davinci_resolve() { WORKDIR="$(mktemp -d -p "${ZIP_DIR}" .resolve-extract-XXXXXXXX)" trap 'rm -rf "${WORKDIR}"' EXIT - unzip -q "${RESOLVE_ZIP}" -d "${WORKDIR}" + unzip -q "${RESOLVE_ZIP}" -d "${WORKDIR}" + stop_spinner $? "ZIP extraído." RUN_FILE="$(find "${WORKDIR}" -maxdepth 2 -type f -name 'DaVinci_Resolve_*_Linux.run' | head -n1 || true)" if [[ -z "${RUN_FILE}" ]]; then @@ -125,8 +154,10 @@ install_davinci_resolve() { fi chmod +x "${RUN_FILE}" + start_spinner "Extrayendo AppImage..." EX_DIR="$(dirname "${RUN_FILE}")" ( cd "${EX_DIR}" && "./$(basename "${RUN_FILE}")" --appimage-extract >/dev/null ) + stop_spinner $? "AppImage extraído." APPDIR="${EX_DIR}/squashfs-root" if [[ ! -d "${APPDIR}" ]]; then @@ -149,8 +180,7 @@ install_davinci_resolve() { ln -sf /usr/lib/libgmodule-2.0.so.0 libs/libgmodule-2.0.so.0 popd >/dev/null - # Aplicar RPATH - log_info "Aplicando RPATH con patchelf..." + log_info "Aplicando RPATH con patchelf (esto puede tardar)..." RPATH_DIRS=( "libs" "libs/plugins/sqldrivers" @@ -167,17 +197,27 @@ install_davinci_resolve() { done RPATH_ABS+="\$ORIGIN" + # Usar barra de progreso para patchelf if command -v patchelf &>/dev/null; then - find "${APPDIR}" -type f -exec bash -c ' - file -b "$1" | grep -q ELF && sudo patchelf --set-rpath "'"${RPATH_ABS}"'" "$1" - ' _ {} \; || true + local files_to_patch + files_to_patch=$(find "${APPDIR}" -type f -exec file {} + | grep "ELF" | cut -d: -f1) + local total_files=$(echo "$files_to_patch" | wc -l) + local current_file=0 + + echo "$files_to_patch" | while read -r file; do + current_file=$((current_file + 1)) + show_progress "$total_files" "$current_file" "Aplicando RPATH..." + sudo patchelf --set-rpath "${RPATH_ABS}" "$file" &>/dev/null + done + log_success "RPATH aplicado a $total_files archivos." fi - # Instalar en /opt/resolve - log_info "Instalando DaVinci Resolve en /opt/resolve..." + start_spinner "Copiando archivos a /opt/resolve..." sudo rm -rf /opt/resolve sudo mkdir -p /opt/resolve sudo rsync -a --delete "${APPDIR}/" /opt/resolve/ + stop_spinner $? "Archivos copiados a /opt/resolve." + sudo mkdir -p /opt/resolve/.license # Enlazar libcrypt legado si es necesario @@ -230,4 +270,3 @@ EOF if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then install_davinci_resolve "$@" fi - diff --git a/modules/zsh-config.sh b/modules/zsh-config.sh index 03963da..0627acd 100755 --- a/modules/zsh-config.sh +++ b/modules/zsh-config.sh @@ -47,12 +47,14 @@ install_zsh() { # Instalar Zsh y plugins log_info "Instalando Zsh y complementos..." + # El spinner se inicia desde el script principal, aquí solo ejecutamos el comando sudo pacman -S --noconfirm --needed \ zsh zsh-completions zsh-syntax-highlighting zsh-autosuggestions || { log_error "Error al instalar Zsh" return 1 } + # No es necesario un spinner aquí, es muy rápido # Descargar configuración personalizada log_info "Descargando configuración de Zsh desde GitHub..." if curl -fsSL "${REPO_BASE}/.zshrc" -o ~/.zshrc; then diff --git a/omarchy-setup.sh b/omarchy-setup.sh index bf15ed0..4b1bbaf 100755 --- a/omarchy-setup.sh +++ b/omarchy-setup.sh @@ -3,7 +3,7 @@ # 🌀 Omarchy Setup Script — Configuración modular para Arch Linux # =============================================================== -set -uo pipefail +set -u # Directorio del script SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" @@ -31,6 +31,52 @@ source "${MODULES_DIR}/common.sh" log_info "Verificando permisos de los módulos..." chmod +x "${MODULES_DIR}"/*.sh 2>/dev/null || true +# --- Funciones de UI Mejorada (Spinner y Barra de Progreso) --- + +SPINNER_PID= + +# Inicia una animación de spinner en segundo plano +# Uso: start_spinner "Mensaje..." +start_spinner() { + ( + local chars="⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏" + while :; do + for (( i=0; i<${#chars}; i++ )); do + echo -ne "${CYAN}${chars:$i:1}${NC} $1\r" + sleep 0.1 + done + done + ) & + SPINNER_PID=$! + # Ocultar cursor + tput civis +} + +# Detiene el spinner y muestra un mensaje de finalización +# Uso: stop_spinner $? "Mensaje de éxito" "Mensaje de error" +stop_spinner() { + local exit_code=$1 + local success_msg=$2 + local error_msg=${3:-"Ocurrió un error"} + + if [[ -n "$SPINNER_PID" ]] && kill -0 "$SPINNER_PID" 2>/dev/null; then + kill "$SPINNER_PID" &>/dev/null + wait "$SPINNER_PID" &>/dev/null + fi + + # Limpiar la línea del spinner + echo -ne "\r\033[K" + + if [[ $exit_code -eq 0 ]]; then + log_success "$success_msg" + else + log_error "$error_msg" + fi + # Restaurar cursor + tput cnorm + SPINNER_PID= +} + # Función para mostrar el menú show_menu() { clear @@ -40,15 +86,16 @@ show_menu() { echo "" echo -e "${BOLD}Selecciona las opciones que deseas instalar:${NC}" echo "" - echo -e " ${GREEN}1)${NC} 📦 Instalar Aplicaciones (VS Code, Cursor, VLC, herramientas)" - echo -e " ${GREEN}2)${NC} 🐚 Configurar Zsh (shell, plugins, configuración personalizada)" + echo -e " ${GREEN}1)${NC} 📦 Instalar Aplicaciones (VS Code, VLC, drivers, etc.)" + echo -e " ${GREEN}2)${NC} 🐚 Configurar Zsh (shell, plugins, config)" echo -e " ${GREEN}3)${NC} 🐳 Instalar Docker y Portainer" echo -e " ${GREEN}4)${NC} 🌐 Instalar ZeroTier" echo -e " ${GREEN}5)${NC} 🖨️ Configurar Impresoras (CUPS)" echo -e " ${GREEN}6)${NC} 🖱️ Instalar Tema de Cursor (Bibata)" - echo -e " ${GREEN}7)${NC} 🎬 Instalar DaVinci Resolve (Intel Edition)" - echo -e " ${GREEN}8)${NC} 🔄 Actualizar Sistema" - echo -e " ${GREEN}9)${NC} 🧹 Limpiar Paquetes Huérfanos" + echo -e " ${GREEN}7)${NC} 🎨 Gestionar Temas de Iconos (Papirus, Tela, etc.)" + echo -e " ${GREEN}8)${NC} 🎬 Instalar DaVinci Resolve (Intel Edition)" + echo -e " ${GREEN}9)${NC} 🔄 Actualizar Sistema" + echo -e " ${GREEN}C)${NC} 🧹 Limpiar Paquetes Huérfanos" echo -e " ${GREEN}A)${NC} ✅ Instalar Todo (opciones 1-6)" echo -e " ${GREEN}0)${NC} 🚪 Salir" echo "" @@ -94,6 +141,9 @@ run_module() { "davinci-resolve") install_davinci_resolve ;; + "icon_manager") + bash "${module_file}" + ;; *) log_error "Función no definida para el módulo ${module_name}" return 1 @@ -148,6 +198,10 @@ main() { done 2>/dev/null) & # Bucle principal del menú + # Exportar funciones para que los submódulos las puedan usar + export -f start_spinner + export -f stop_spinner + while true; do show_menu read -r choice @@ -155,45 +209,59 @@ main() { case "${choice}" in 1) + start_spinner "Instalando aplicaciones..." run_module "apps" + stop_spinner $? "Módulo de aplicaciones finalizado." echo "" read -p "Presiona Enter para continuar..." ;; 2) + start_spinner "Configurando Zsh..." run_module "zsh-config" + stop_spinner $? "Configuración de Zsh finalizada." echo "" read -p "Presiona Enter para continuar..." ;; 3) + start_spinner "Instalando Docker..." run_module "docker" + stop_spinner $? "Instalación de Docker finalizada." echo "" read -p "Presiona Enter para continuar..." ;; 4) + start_spinner "Instalando ZeroTier..." run_module "zerotier" + stop_spinner $? "Instalación de ZeroTier finalizada." echo "" read -p "Presiona Enter para continuar..." ;; 5) + start_spinner "Configurando impresoras..." run_module "printer" + stop_spinner $? "Configuración de impresoras finalizada." echo "" read -p "Presiona Enter para continuar..." ;; 6) + start_spinner "Instalando tema de cursor..." run_module "mouse_cursor" + stop_spinner $? "Tema de cursor instalado." echo "" read -p "Presiona Enter para continuar..." ;; 7) - run_module "mouse_cursor" + # Este módulo es interactivo, no usamos spinner aquí + run_module "icon_manager" echo "" read -p "Presiona Enter para continuar..." ;; - 7) - log_warning "DaVinci Resolve requiere el ZIP de instalación en ~/Downloads" - echo -ne "${BOLD}¿Continuar con la instalación? [s/N]: ${NC}" + 8) + log_warning "DaVinci Resolve requiere el ZIP de instalación en ~/Downloads/" + echo -ne "${BOLD}¿Continuar con la instalación? [s/N]: ${NC} " read -r confirm if [[ "${confirm}" =~ ^[SsYy]$ ]]; then + # El spinner se maneja dentro del módulo de DaVinci run_module "davinci-resolve" else log_info "Instalación cancelada" @@ -201,18 +269,22 @@ main() { echo "" read -p "Presiona Enter para continuar..." ;; - 8) + 9) + start_spinner "Actualizando el sistema..." update_system + stop_spinner $? "Sistema actualizado." echo "" read -p "Presiona Enter para continuar..." ;; - 9) + C) + start_spinner "Limpiando paquetes huérfanos..." cleanup_orphans + stop_spinner $? "Limpieza finalizada." echo "" read -p "Presiona Enter para continuar..." ;; A) - echo -ne "${BOLD}¿Instalar todas las opciones (1-5)? [s/N]: ${NC}" + echo -ne "${BOLD}¿Instalar todas las opciones (1-6)? [s/N]: ${NC} " read -r confirm if [[ "${confirm}" =~ ^[Ss]$ ]]; then install_all