feat: Enhance Omarchy setup script with retry logic and logging improvements

- Updated the installation menu to include DaVinci Resolve in the "Install All" option.
- Added a new function `run_module_with_retry` to retry failed module executions.
- Integrated retry logic into the installation process for background tasks.
- Improved logging messages for better clarity during installation.
- Created a dedicated logs directory to store installation logs and updated the log file path.
- Added a .gitignore file to exclude the logs directory from version control.
This commit is contained in:
Marco Gallegos
2025-11-15 15:28:54 -06:00
parent 380b354340
commit 26eb8f5774
8 changed files with 59 additions and 261 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
# Ignorar el directorio de logs generado por el script
logs/

View File

@@ -57,12 +57,14 @@ Selecciona las opciones que deseas instalar:
6) 🖱️ Instalar Tema de Cursor (Bibata) 6) 🖱️ Instalar Tema de Cursor (Bibata)
7) 🎨 Gestionar Temas de Iconos (Papirus, Tela, etc.) 7) 🎨 Gestionar Temas de Iconos (Papirus, Tela, etc.)
8) 🎬 Instalar DaVinci Resolve (Intel Edition) 8) 🎬 Instalar DaVinci Resolve (Intel Edition)
A) ✅ Instalar Todo (opciones 1, 2, 3, 4, 5, 6) A) ✅ Instalar Todo (opciones 1, 2, 3, 4, 5, 6, 8)
F) 💾 Formatear un Disco (FAT32, exFAT, NTFS, ext4) F) 💾 Formatear un Disco (FAT32, exFAT, NTFS, ext4)
H) 🎨 Instalar Configuración de Hyprland H) 🎨 Instalar Configuración de Hyprland
0) 🚪 Salir 0) 🚪 Salir
``` ```
> **Nota:** La opción `A) Instalar Todo` ejecuta los módulos 1, 2, 3, 4, 5, 6 y 8. Antes de usarla asegúrate de haber descargado manualmente el instalador de DaVinci Resolve (ZIP) en `~/Downloads/`.
## 📋 Módulos Disponibles ## 📋 Módulos Disponibles
### 1. 📦 Aplicaciones (`apps.sh`) ### 1. 📦 Aplicaciones (`apps.sh`)
@@ -407,7 +409,7 @@ $HOME/
│ ├── zsh-autosuggestions/ │ ├── zsh-autosuggestions/
│ └── zsh-syntax-highlighting/ │ └── zsh-syntax-highlighting/
├── .poshthemes/ # Temas Oh My Posh ├── .poshthemes/ # Temas Oh My Posh
│ └── catppuccin.omp.json # Tema Catppuccin Frappe │ └── catppuccin_frappe.omp.json # Tema Catppuccin Frappe
├── .zsh_functions/ # Funciones personalizadas (directorio creado) ├── .zsh_functions/ # Funciones personalizadas (directorio creado)
├── Videos/YouTube/ # Descargas de yt-dlp ├── Videos/YouTube/ # Descargas de yt-dlp
│ ├── Music/ # Audios MP3 │ ├── Music/ # Audios MP3
@@ -526,7 +528,7 @@ which oh-my-posh
oh-my-posh version oh-my-posh version
# Verificar que el tema existe # Verificar que el tema existe
ls ~/.poshthemes/catppuccin.omp.json ls ~/.poshthemes/catppuccin_frappe.omp.json
# Verificar que tienes una Nerd Font instalada # Verificar que tienes una Nerd Font instalada
# (El script NO instala fuentes automáticamente) # (El script NO instala fuentes automáticamente)

View File

@@ -13,13 +13,13 @@ run_module_main() {
log_step "Instalación de Configuración de Hyprland" log_step "Instalación de Configuración de Hyprland"
# --- 1. Copiar archivos de configuración --- # --- 1. Copiar archivos de configuración ---
# La configuración de Hyprland debe estar en una carpeta 'hypr' en la raíz del repo # La configuración de Hyprland debe estar en una carpeta 'hypr_config' en la raíz del repo
local source_dir="${SCRIPT_DIR}/../hypr" local source_dir="${SCRIPT_DIR}/../hypr_config"
local dest_dir="$HOME/.config/hypr" local dest_dir="$HOME/.config/hypr"
if [[ ! -d "$source_dir" ]]; then if [[ ! -d "$source_dir" ]]; then
log_error "No se encontró el directorio de configuración 'hypr' 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'." log_info "Asegúrate de que la carpeta con tu configuración se llame 'hypr_config'."
return 1 return 1
fi fi

View File

@@ -26,7 +26,6 @@ install_zsh() {
zoxide # Navegación inteligente zoxide # Navegación inteligente
fastfetch # Información del sistema fastfetch # Información del sistema
yt-dlp # Descarga de videos/audio yt-dlp # Descarga de videos/audio
nerd-fonts # Paquete de fuentes con iconos
unrar p7zip lsof # Dependencias para funciones en .zshrc unrar p7zip lsof # Dependencias para funciones en .zshrc
) )
for pkg in "${pkgs[@]}"; do for pkg in "${pkgs[@]}"; do
@@ -105,6 +104,7 @@ fi'
log_info "2. Ve a la sección de Perfil -> Apariencia/Texto." 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 "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_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 return 0
} }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,69 +0,0 @@
╔════════════════════════════════════════════════════════════╗
║ 🌀 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.)
8) 🎬 Instalar DaVinci Resolve (Intel Edition)
F) 💾 Formatear un Disco (FAT32, exFAT, NTFS, ext4)
H) 🎨 Instalar Configuración de Hyprland
A) ✅ Instalar Todo (opciones 1, 2, 3, 4, 5, 6)
0) 🚪 Salir
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Selecciona opción: ⠋ Ejecutando: Configurar Zsh (shell, plugins, config)...
[?25l
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 Configuración Completa de Zsh
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
▶ Instalando Zsh y herramientas esenciales...
▶ zsh ya está instalado.
▶ zsh-completions ya está instalado.
▶ zsh-syntax-highlighting ya está instalado.
▶ zsh-autosuggestions ya está instalado.
▶ Instalando oh-my-posh...
error: failed to init transaction (unable to lock database)
error: could not lock database: File exists
if you're sure a package manager is not already
running, you can remove /var/lib/pacman/db.lck
⚠ No se pudo instalar oh-my-posh.
▶ zoxide ya está instalado.
⠙ Ejecutando: Configurar Zsh (shell, plugins, config)...
▶ fastfetch ya está instalado.
▶ yt-dlp ya está instalado.
▶ Instalando nerd-fonts...
error: failed to init transaction (unable to lock database)
error: could not lock database: File exists
if you're sure a package manager is not already
running, you can remove /var/lib/pacman/db.lck
⚠ No se pudo instalar nerd-fonts.
▶ Instalando unrar...
⠹ Ejecutando: Configurar Zsh (shell, plugins, config)...
error: failed to init transaction (unable to lock database)
error: could not lock database: File exists
if you're sure a package manager is not already
running, you can remove /var/lib/pacman/db.lck
⚠ No se pudo instalar unrar.
▶ Instalando p7zip...
error: failed to init transaction (unable to lock database)
error: could not lock database: File exists
if you're sure a package manager is not already
running, you can remove /var/lib/pacman/db.lck
⚠ No se pudo instalar p7zip.
▶ lsof ya está instalado.
▶ Oh My Zsh ya está instalado.
▶ Descargando configuración .zshrc desde el repositorio...
⚠ Se encontró un archivo existente en '/home/marco/.zshrc'.
▶ Creando copia de seguridad en: /home/marco/.zshrc.bak_2025-11-15_12:14:32
✓ Copia de seguridad creada.
⠸ Ejecutando: Configurar Zsh (shell, plugins, config)...
✓ Archivo .zshrc actualizado.
▶ Configurando tema de Oh My Posh (Catppuccin Frappe)...

View File

@@ -115,7 +115,7 @@ show_menu() {
echo -e " ${GREEN}${key})${NC} ${description}" echo -e " ${GREEN}${key})${NC} ${description}"
done | sort -V done | sort -V
echo -e " ${GREEN}A)${NC} ✅ Instalar Todo (opciones 1, 2, 3, 4, 5, 6)" echo -e " ${GREEN}A)${NC} ✅ Instalar Todo (opciones 1, 2, 3, 4, 5, 6, 8)"
echo -e " ${GREEN}0)${NC} 🚪 Salir" echo -e " ${GREEN}0)${NC} 🚪 Salir"
echo "" echo ""
echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
@@ -154,6 +154,34 @@ run_module() {
return $? return $?
} }
# Función para ejecutar un módulo con lógica de reintento
# Intenta ejecutar un módulo. Si falla, lo reintenta una vez más.
# Devuelve 0 si tiene éxito en cualquier intento, 1 si falla en ambos.
run_module_with_retry() {
local choice=$1
local max_intentos=2
local intento_actual=1
while [ $intento_actual -le $max_intentos ]; do
run_module "$choice"
local estado_salida=$?
if [ $estado_salida -eq 0 ]; then
return 0 # Éxito, salimos de la función
fi
log_warning "El módulo falló en el intento $intento_actual (código: $estado_salida)."
if [ $intento_actual -lt $max_intentos ]; then
log_info "Reintentando en 3 segundos..."
sleep 3
fi
((intento_actual++))
done
log_error "El módulo falló después de $max_intentos intentos."
return 1 # Falla definitiva
}
# Función para instalar todo # Función para instalar todo
install_all() { install_all() {
log_step "Instalación Completa de Omarchy" log_step "Instalación Completa de Omarchy"
@@ -170,13 +198,13 @@ install_all() {
# Ejecutar con spinner para tareas de fondo (bg) # Ejecutar con spinner para tareas de fondo (bg)
if [[ "$type" == "bg" ]]; then if [[ "$type" == "bg" ]]; then
start_spinner "Ejecutando: ${description#* }..." start_spinner "Ejecutando: ${description#* }..."
if run_module "${choice}"; then if run_module_with_retry "${choice}"; then
stop_spinner 0 "Módulo '${description}' finalizado." stop_spinner 0 "Módulo '${description}' finalizado."
else else
stop_spinner 1 "Error en el módulo '${description}'." stop_spinner 1 "Error en el módulo '${description}'."
failed+=("${module_file}") failed+=("${module_file}")
fi fi
else # Ejecutar sin spinner para tareas interactivas (fg) else # Ejecutar sin spinner para tareas interactivas (fg) y sin reintento
if ! run_module "${choice}"; then if ! run_module "${choice}"; then
log_error "Error en el módulo '${description}'." log_error "Error en el módulo '${description}'."
failed+=("${module_file}") failed+=("${module_file}")
@@ -212,10 +240,11 @@ main() {
fi fi
# Mantener sudo activo en background # Mantener sudo activo en background
local parent_pid=$$
(while true; do (while true; do
sudo -n true sudo -n true
sleep 60 sleep 60
kill -0 "$$" || exit kill -0 "$parent_pid" || exit
done 2>/dev/null) & done 2>/dev/null) &
# Bucle principal del menú # Bucle principal del menú
@@ -245,10 +274,14 @@ main() {
if [[ "$type" == "bg" ]]; then if [[ "$type" == "bg" ]]; then
spinner_msg="${description#* }..." # "Instalar Apps..." spinner_msg="${description#* }..." # "Instalar Apps..."
start_spinner "Ejecutando: ${spinner_msg}" start_spinner "${spinner_msg}"
run_module "$choice" if run_module_with_retry "$choice"; then
stop_spinner $? "Módulo '${description}' finalizado." stop_spinner 0 "Módulo '${description}' finalizado."
else
stop_spinner 1 "Error en el módulo '${description}'."
fi
else # 'fg' else # 'fg'
log_info "Ejecutando módulo interactivo: ${description}"
run_module "$choice" run_module "$choice"
fi fi
@@ -256,10 +289,9 @@ main() {
read -p "Presiona Enter para continuar..." read -p "Presiona Enter para continuar..."
elif [[ "$choice" == "A" ]]; then elif [[ "$choice" == "A" ]]; then
echo -ne "${BOLD}¿Instalar todas las opciones (1, 2, 3, 4, 5, 6)? [s/N]: ${NC} " log_warning "La opción 'Instalar Todo' ejecutará los módulos: 1, 2, 3, 4, 5, 6 y 8."
log_warning "NOTA: La opción 'Instalar Todo' incluye DaVinci Resolve, que requiere" log_warning "DaVinci Resolve requiere que el ZIP de instalación esté en ~/Downloads/."
log_warning "que hayas descargado el archivo ZIP manualmente en tu carpeta ~/Downloads/." echo -ne "${BOLD}¿Confirmas que deseas instalar todas las opciones ahora? [s/N]: ${NC}"
echo -ne "${BOLD}¿Confirmas que has hecho esto y deseas continuar? [s/N]: ${NC} "
read -r confirm read -r confirm
if [[ "${confirm}" =~ ^[SsYy]$ ]]; then if [[ "${confirm}" =~ ^[SsYy]$ ]]; then
install_all install_all
@@ -281,8 +313,10 @@ main() {
# Ejecutar función principal # Ejecutar función principal
# --- Redirección de logs --- # --- Redirección de logs ---
# Crear el directorio de logs si no existe
mkdir -p "${SCRIPT_DIR}/logs"
# Crear un nombre de archivo de log con la fecha y hora # Crear un nombre de archivo de log con la fecha y hora
LOG_FILE="${SCRIPT_DIR}/omarchy-setup-$(date +%F_%H-%M-%S).log" LOG_FILE="${SCRIPT_DIR}/logs/omarchy-setup-$(date +%F_%H-%M-%S).log"
# Ejecutar la función principal y redirigir toda la salida (stdout y stderr) # Ejecutar la función principal y redirigir toda la salida (stdout y stderr)
# al archivo de log, mientras también se muestra en la terminal. # al archivo de log, mientras también se muestra en la terminal.