Compare commits
	
		
			No commits in common. "4a372209d9f80096ae8284f717521a4bee7f5b08" and "a715b3be6e9f7294fc2b77e4db69e4afafdd5bb6" have entirely different histories.
		
	
	
		
			4a372209d9
			...
			a715b3be6e
		
	
		
					 28 changed files with 153 additions and 1313 deletions
				
			
		
							
								
								
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							|  | @ -14,11 +14,6 @@ | ||||||
| !inventory/ | !inventory/ | ||||||
| !sops/ | !sops/ | ||||||
| !projects/ | !projects/ | ||||||
| !data/ |  | ||||||
| 
 |  | ||||||
| # Excluir el contenido de data pero mantener la carpeta |  | ||||||
| data/* |  | ||||||
| !data/.gitkeep |  | ||||||
| 
 | 
 | ||||||
| # Permitir el seguimiento de archivos específicos | # Permitir el seguimiento de archivos específicos | ||||||
| # !archivo1.txt | # !archivo1.txt | ||||||
|  |  | ||||||
							
								
								
									
										77
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										77
									
								
								README.md
									
									
									
									
									
								
							|  | @ -1,16 +1,16 @@ | ||||||
| # MRDevs Tools | # MRDevs Tools | ||||||
| 
 | 
 | ||||||
| <center> | <p align="center"> | ||||||
|  |   <img src="https://img.shields.io/badge/License-AGPL--3.0-blue.svg" alt="License: AGPL-3.0"> | ||||||
|  |   <img src="https://img.shields.io/badge/version-1.3.1-green.svg" alt="Version: 1.3.1"> | ||||||
|  | </p> | ||||||
| 
 | 
 | ||||||
|  | <p align="center"> | ||||||
|  |   <img src="https://img.shields.io/badge/Shell-80%25-yellow.svg" alt="Shell: 80%"> | ||||||
| 
 |   <img src="https://img.shields.io/badge/Python-5%25-blue.svg" alt="Python: 5%"> | ||||||
|  |   <img src="https://img.shields.io/badge/Bash_Lib-13%25-orange.svg" alt="Bash Lib: 13%"> | ||||||
|  |   <img src="https://img.shields.io/badge/Config-2%25-lightgrey.svg" alt="Config: 2%"> | ||||||
|  | </p> | ||||||
|  |  | ||||||
| 
 |  | ||||||
| </center> |  | ||||||
| 
 | 
 | ||||||
| ## 📋 Descripción | ## 📋 Descripción | ||||||
| 
 | 
 | ||||||
|  | @ -95,10 +95,6 @@ MRDevs Tools utiliza una estructura organizada que separa el código (en ~/devs) | ||||||
| | Comando | Descripción | | | Comando | Descripción | | ||||||
| |---------|-------------| | |---------|-------------| | ||||||
| | `bin/helix_install.sh` | Instala Helix Editor con soporte multiplataforma (apt, snap, pacman, etc.) | | | `bin/helix_install.sh` | Instala Helix Editor con soporte multiplataforma (apt, snap, pacman, etc.) | | ||||||
| | `bin/vscode_install.sh` | Instala Visual Studio Code con detección automática del SO y sus métodos de instalación | |  | ||||||
| | `bin/vscode_install.sh -u` | Desinstala Visual Studio Code del sistema | |  | ||||||
| | `bin/zettlr_install.sh` | Instala Zettlr Markdown Editor con detección automática del SO | |  | ||||||
| | `bin/zettlr_install.sh -u` | Desinstala Zettlr Markdown Editor del sistema | |  | ||||||
| 
 | 
 | ||||||
| ### Herramientas para Control de Versiones | ### Herramientas para Control de Versiones | ||||||
| 
 | 
 | ||||||
|  | @ -145,7 +141,7 @@ El directorio `$HOME/devs` sirve como área principal de desarrollo donde se ges | ||||||
| 
 | 
 | ||||||
| Para agregar temporalmente los comandos de la plataforma al PATH: | Para agregar temporalmente los comandos de la plataforma al PATH: | ||||||
| ```bash | ```bash | ||||||
| source ~/devs/bin/devset.sh | source ~/devs/bin/path_add.sh | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| Este script detecta automáticamente la ubicación correcta del directorio bin y lo agrega al PATH solo para la sesión actual (no es persistente). | Este script detecta automáticamente la ubicación correcta del directorio bin y lo agrega al PATH solo para la sesión actual (no es persistente). | ||||||
|  | @ -284,9 +280,7 @@ Proveedores soportados por defecto: Anthropic Claude, OpenAI ChatGPT, Google Gem | ||||||
| 
 | 
 | ||||||
| La configuración de proyectos se almacena en `bin/config/projects.dat`, donde se encuentra el nombre de la carpeta de proyectos utilizada por el sistema. | La configuración de proyectos se almacena en `bin/config/projects.dat`, donde se encuentra el nombre de la carpeta de proyectos utilizada por el sistema. | ||||||
| 
 | 
 | ||||||
| ### Instalación de Editores de Código | ### Instalación de Helix Editor | ||||||
| 
 |  | ||||||
| #### Helix Editor |  | ||||||
| 
 | 
 | ||||||
| Helix es un editor de código moderno similar a Vim/Neovim pero con una curva de aprendizaje más amigable: | Helix es un editor de código moderno similar a Vim/Neovim pero con una curva de aprendizaje más amigable: | ||||||
| 
 | 
 | ||||||
|  | @ -301,51 +295,6 @@ El script detecta automáticamente tu sistema operativo y utiliza el método de | ||||||
| - En Fedora: Instala a través de dnf | - En Fedora: Instala a través de dnf | ||||||
| - En otros sistemas: Descarga e instala desde el tarball oficial | - En otros sistemas: Descarga e instala desde el tarball oficial | ||||||
| 
 | 
 | ||||||
| #### Visual Studio Code |  | ||||||
| 
 |  | ||||||
| Visual Studio Code es un editor de código potente y extensible con amplio soporte para múltiples lenguajes: |  | ||||||
| 
 |  | ||||||
| ```bash |  | ||||||
| # Instalación automatizada |  | ||||||
| bin/vscode_install.sh |  | ||||||
| 
 |  | ||||||
| # Desinstalación |  | ||||||
| bin/vscode_install.sh -u |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| El script ofrece una instalación optimizada para cada plataforma: |  | ||||||
| - En Ubuntu/Debian: Configura el repositorio oficial de Microsoft y utiliza apt |  | ||||||
| - En Red Hat/Fedora: Configura el repositorio RPM y utiliza dnf |  | ||||||
| - En Arch Linux: Instala desde AUR o repositorios oficiales |  | ||||||
| - En macOS: Utiliza Homebrew para la instalación |  | ||||||
| - En FreeBSD: Instala mediante el gestor de paquetes pkg |  | ||||||
| 
 |  | ||||||
| #### Zettlr Markdown Editor |  | ||||||
| 
 |  | ||||||
| Zettlr es un potente editor Markdown centrado en académicos e investigadores, con funcionalidades avanzadas: |  | ||||||
| 
 |  | ||||||
| ```bash |  | ||||||
| # Instalación automatizada |  | ||||||
| bin/zettlr_install.sh |  | ||||||
| 
 |  | ||||||
| # Desinstalación |  | ||||||
| bin/zettlr_install.sh -u |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| El script proporciona una instalación especializada para cada plataforma: |  | ||||||
| - En Ubuntu/Debian: Descarga e instala el paquete .deb oficial |  | ||||||
| - En Red Hat/Fedora: Descarga e instala el paquete .rpm oficial |  | ||||||
| - En Arch Linux: Instala desde AUR con ayuda de yay |  | ||||||
| - En macOS: Utiliza Homebrew para instalación |  | ||||||
| - En FreeBSD: Configuración manual con AppImage (no hay soporte oficial) |  | ||||||
| 
 |  | ||||||
| Características del instalador: |  | ||||||
| - Obtiene automáticamente la última versión disponible desde GitHub |  | ||||||
| - Solicita permisos de administrador cuando son necesarios |  | ||||||
| - Utiliza interfaz gráfica para confirmación y línea de comandos para instalación |  | ||||||
| - Limpia archivos de configuración residuales durante la desinstalación |  | ||||||
| - Proporciona información detallada sobre las características de Zettlr |  | ||||||
| 
 |  | ||||||
| ### Herramientas para Control de Versiones | ### Herramientas para Control de Versiones | ||||||
| 
 | 
 | ||||||
| MRDevs Tools incluye scripts para simplificar la instalación de CLIs para diferentes plataformas Git: | MRDevs Tools incluye scripts para simplificar la instalación de CLIs para diferentes plataformas Git: | ||||||
|  | @ -509,7 +458,7 @@ bin/rate_update.py --type python | ||||||
| bin/rate_update.py --init | bin/rate_update.py --init | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| Las tarifas se almacenan en archivos individuales dentro de `data/rates/` (directorio sin tracking en git) y pueden ser utilizadas por otras herramientas. | Las tarifas se almacenan en archivos individuales dentro de `bin/config/rates/` y pueden ser utilizadas por otras herramientas. | ||||||
| 
 | 
 | ||||||
| #### Estimación de Costos con COCOMO | #### Estimación de Costos con COCOMO | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -149,23 +149,11 @@ install() { | ||||||
| 	  os_pkgs_install $SQLITE_PACKAGE | 	  os_pkgs_install $SQLITE_PACKAGE | ||||||
| 	fi | 	fi | ||||||
| 
 | 
 | ||||||
| 	# Install full Python package even if basic Python is already installed | 	# Install python from OS Packages | ||||||
| 	command_installed python3-full | 	command_installed $PYTHON_PACKAGE | ||||||
| 	if [ $? -ne 0 ] | 	if [ $? -ne 0 ] | ||||||
| 	then | 	then | ||||||
| 	  # Si python3-full no está instalado, instalarlo |  | ||||||
| 	  python3_install | 	  python3_install | ||||||
| 	else |  | ||||||
| 	  # Si ya está python3 básico pero queremos asegurar que python3-full esté instalado |  | ||||||
| 	  command_installed $PYTHON_PACKAGE |  | ||||||
| 	  if [ $? -eq 0 ] |  | ||||||
| 	  then |  | ||||||
| 	    echo "Asegurando instalación completa de Python..." |  | ||||||
| 	    if [ -f /etc/debian_version ] || [ -f /etc/os-release ]; then |  | ||||||
| 	      apt update |  | ||||||
| 	      apt install -y python3-full |  | ||||||
| 	    fi |  | ||||||
| 	  fi |  | ||||||
| 	fi | 	fi | ||||||
| 	 | 	 | ||||||
| 	# Verificar si pip está instalado, instalarlo si es necesario | 	# Verificar si pip está instalado, instalarlo si es necesario | ||||||
|  | @ -175,13 +163,6 @@ install() { | ||||||
| 	  pip_install | 	  pip_install | ||||||
| 	fi | 	fi | ||||||
| 
 | 
 | ||||||
| 	# Verificar si pipx está instalado, instalarlo si es necesario |  | ||||||
| 	command_installed pipx |  | ||||||
| 	if [ $? -ne 0 ] |  | ||||||
| 	then |  | ||||||
| 	  pipx_install |  | ||||||
| 	fi |  | ||||||
| 
 |  | ||||||
| 	# Install mozilla sops from OS Packages | 	# Install mozilla sops from OS Packages | ||||||
| 	command_installed $SOPS_PACKAGE | 	command_installed $SOPS_PACKAGE | ||||||
| 	if [ $? -ne 0 ] | 	if [ $? -ne 0 ] | ||||||
|  |  | ||||||
|  | @ -34,7 +34,7 @@ SHOW_RESULTS = True | ||||||
| # Directorio base del proyecto | # Directorio base del proyecto | ||||||
| BASE_DIR = Path(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) | BASE_DIR = Path(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) | ||||||
| CONFIG_DIR = BASE_DIR / 'bin' / 'config' | CONFIG_DIR = BASE_DIR / 'bin' / 'config' | ||||||
| RATES_DIR = BASE_DIR / 'data' / 'rates'  # Ubicación para archivos de tarifas | RATES_DIR = CONFIG_DIR / 'rates'  # Ubicación para archivos de tarifas | ||||||
| 
 | 
 | ||||||
| # Constantes para el modelo COCOMO básico | # Constantes para el modelo COCOMO básico | ||||||
| COCOMO_MODELS = { | COCOMO_MODELS = { | ||||||
|  | @ -210,8 +210,7 @@ def estimate_cocomo(loc, model_type='organic', cost_per_pm=5000, programmer_type | ||||||
|     # Redondear valores para presentación |     # Redondear valores para presentación | ||||||
|     effort_pm = round(effort_pm, 2) |     effort_pm = round(effort_pm, 2) | ||||||
|     dev_time = round(dev_time, 2) |     dev_time = round(dev_time, 2) | ||||||
|     # Redondear personal promedio al entero próximo (ceil) |     avg_staff = round(avg_staff, 2) | ||||||
|     avg_staff = ceil(avg_staff) |  | ||||||
|     hourly_rate = round(hourly_rate, 2) |     hourly_rate = round(hourly_rate, 2) | ||||||
|     total_cost = round(total_cost, 2) |     total_cost = round(total_cost, 2) | ||||||
|      |      | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								bin/config/rates/backend.rate
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								bin/config/rates/backend.rate
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | 57.73 | ||||||
							
								
								
									
										1
									
								
								bin/config/rates/bash.rate
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								bin/config/rates/bash.rate
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | 23.64 | ||||||
							
								
								
									
										1
									
								
								bin/config/rates/cloud.rate
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								bin/config/rates/cloud.rate
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | 51.00 | ||||||
							
								
								
									
										1
									
								
								bin/config/rates/data.rate
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								bin/config/rates/data.rate
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | 56.81 | ||||||
							
								
								
									
										1
									
								
								bin/config/rates/devops.rate
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								bin/config/rates/devops.rate
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | 59.11 | ||||||
							
								
								
									
										1
									
								
								bin/config/rates/dotnet.rate
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								bin/config/rates/dotnet.rate
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | 49.00 | ||||||
							
								
								
									
										1
									
								
								bin/config/rates/frontend.rate
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								bin/config/rates/frontend.rate
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | 41.00 | ||||||
							
								
								
									
										1
									
								
								bin/config/rates/fullstack.rate
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								bin/config/rates/fullstack.rate
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | 88.66 | ||||||
							
								
								
									
										1
									
								
								bin/config/rates/java.rate
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								bin/config/rates/java.rate
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | 49.00 | ||||||
							
								
								
									
										1
									
								
								bin/config/rates/ml.rate
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								bin/config/rates/ml.rate
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | 49.00 | ||||||
							
								
								
									
										1
									
								
								bin/config/rates/mobile.rate
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								bin/config/rates/mobile.rate
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | 47.00 | ||||||
							
								
								
									
										1
									
								
								bin/config/rates/odoo.rate
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								bin/config/rates/odoo.rate
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | 20.00 | ||||||
							
								
								
									
										1
									
								
								bin/config/rates/php.rate
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								bin/config/rates/php.rate
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | 49.00 | ||||||
							
								
								
									
										1
									
								
								bin/config/rates/python.rate
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								bin/config/rates/python.rate
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | 49.00 | ||||||
							
								
								
									
										1
									
								
								bin/config/rates/ruby.rate
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								bin/config/rates/ruby.rate
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | 31.00 | ||||||
							
								
								
									
										91
									
								
								bin/fix_haos_paths.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										91
									
								
								bin/fix_haos_paths.sh
									
									
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,91 @@ | ||||||
|  | #!/bin/bash | ||||||
|  | #Script     	: fix_haos_paths.sh | ||||||
|  | #Apps			: MRDEVS TOOLS | ||||||
|  | #Description	: Corrige rutas en contenedores HAOS existentes y crea estructura correcta | ||||||
|  | #Author			: Cortana Rosero One <cortana@rosero.one> | ||||||
|  | #Created		: 2025/04/02 12:00:00 | ||||||
|  | #Modified		: 2025/04/02 12:00:00 | ||||||
|  | #Version		: 1.0.0 | ||||||
|  | #============================================================================== | ||||||
|  | # Derechos de Autor [2025] [Mauro Rosero P. <mauro@rosero.one>] | ||||||
|  | #============================================================================== | ||||||
|  | # Este programa es software libre: usted puede redistribuirlo y/o modificarlo | ||||||
|  | # bajo los términos de la Licencia Pública Affero General de GNU tal como | ||||||
|  | # lo publica la Free Software Foundation, ya sea la versión 3 de la licencia, | ||||||
|  | # o (a su elección) cualquier versión posterior. | ||||||
|  | # | ||||||
|  | # Este programa se distribuye con la esperanza de que sea útil, | ||||||
|  | # pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de | ||||||
|  | # COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte la | ||||||
|  | # Licencia Pública Affero General de GNU para obtener más detalles. | ||||||
|  | # | ||||||
|  | # Debería haber recibido una copia de la Licencia Pública Affero General | ||||||
|  | # junto con este programa. Si no la recibió, consulte <https://www.gnu.org/licenses/>. | ||||||
|  | # [Generated] Created by Claude Code (claude-3-7-sonnet-20250219) | ||||||
|  | 
 | ||||||
|  | echo "=== Corrigiendo rutas de Home Assistant ===" | ||||||
|  | 
 | ||||||
|  | # Configuración de contenedores | ||||||
|  | HA_CORE_CONTAINER_NAME="homeassistant" | ||||||
|  | HA_OS_CONTAINER_NAME="haos" | ||||||
|  | 
 | ||||||
|  | # Asegurar que estamos en un directorio de proyecto | ||||||
|  | if [[ ! "$PWD" == *"/projects/"* ]]; then | ||||||
|  |     echo "ADVERTENCIA: No parece estar en un directorio de proyecto." | ||||||
|  |     echo "Este script debe ejecutarse desde la carpeta del proyecto (ej: /home/mrosero/devs/projects/ha-home)" | ||||||
|  |     read -p "¿Desea continuar de todos modos? (s/n): " CONTINUE | ||||||
|  |     if [[ ! "$CONTINUE" =~ ^[Ss]$ ]]; then | ||||||
|  |         echo "Operación cancelada." | ||||||
|  |         exit 1 | ||||||
|  |     fi | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | # Crear estructura de directorios correcta | ||||||
|  | echo "Creando estructura de directorios correcta en $PWD/ha" | ||||||
|  | mkdir -p "$PWD/ha/config" "$PWD/ha/media" "$PWD/ha/ssl" "$PWD/ha/share" | ||||||
|  | chmod -R 755 "$PWD/ha" | ||||||
|  | 
 | ||||||
|  | # Verificar y detener contenedores si están ejecutándose | ||||||
|  | for CONTAINER in $HA_CORE_CONTAINER_NAME $HA_OS_CONTAINER_NAME; do | ||||||
|  |     if podman container exists $CONTAINER; then | ||||||
|  |         echo "Deteniendo contenedor $CONTAINER..." | ||||||
|  |         podman stop $CONTAINER | ||||||
|  |          | ||||||
|  |         echo "Eliminando contenedor $CONTAINER (los datos persistirán)..." | ||||||
|  |         podman rm $CONTAINER | ||||||
|  |     fi | ||||||
|  | done | ||||||
|  | 
 | ||||||
|  | # Verificar si existe la estructura antigua | ||||||
|  | OLD_PATH="/home/mrosero/devs/homeassistant" | ||||||
|  | if [ -d "$OLD_PATH" ]; then | ||||||
|  |     echo "Se encontró estructura antigua en $OLD_PATH" | ||||||
|  |      | ||||||
|  |     # Migrar datos si es necesario | ||||||
|  |     if [ -d "$OLD_PATH/config" ] && [ "$(ls -A "$OLD_PATH/config" 2>/dev/null)" ]; then | ||||||
|  |         echo "Migrando datos de configuración..." | ||||||
|  |         cp -r "$OLD_PATH/config/"* "$PWD/ha/config/" | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     if [ -d "$OLD_PATH/media" ] && [ "$(ls -A "$OLD_PATH/media" 2>/dev/null)" ]; then | ||||||
|  |         echo "Migrando datos de media..." | ||||||
|  |         cp -r "$OLD_PATH/media/"* "$PWD/ha/media/" | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     if [ -d "$OLD_PATH/ssl" ] && [ "$(ls -A "$OLD_PATH/ssl" 2>/dev/null)" ]; then | ||||||
|  |         echo "Migrando certificados SSL..." | ||||||
|  |         cp -r "$OLD_PATH/ssl/"* "$PWD/ha/ssl/" | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     if [ -d "$OLD_PATH/share" ] && [ "$(ls -A "$OLD_PATH/share" 2>/dev/null)" ]; then | ||||||
|  |         echo "Migrando datos compartidos..." | ||||||
|  |         cp -r "$OLD_PATH/share/"* "$PWD/ha/share/" | ||||||
|  |     fi | ||||||
|  |      | ||||||
|  |     echo "Respaldando estructura antigua a ${OLD_PATH}_backup..." | ||||||
|  |     mv "$OLD_PATH" "${OLD_PATH}_backup" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | echo "=== Operación completada ===" | ||||||
|  | echo "Ahora puede iniciar Home Assistant con:" | ||||||
|  | echo "../../bin/haos.sh start" | ||||||
|  | @ -104,7 +104,7 @@ function python3_install() { | ||||||
|   elif [ -f /etc/debian_version ] || [ -f /etc/os-release ]; then |   elif [ -f /etc/debian_version ] || [ -f /etc/os-release ]; then | ||||||
|       # En sistemas Debian y derivados, instalamos o actualizamos Python a través de apt |       # En sistemas Debian y derivados, instalamos o actualizamos Python a través de apt | ||||||
|       apt update |       apt update | ||||||
|       apt install -y python3-full |       apt install -y python3 | ||||||
|   elif [ -f /etc/redhat-release ]; then |   elif [ -f /etc/redhat-release ]; then | ||||||
|       # En sistemas Red Hat, instalamos o actualizamos Python a través de yum |       # En sistemas Red Hat, instalamos o actualizamos Python a través de yum | ||||||
|       dnf install -y python3 |       dnf install -y python3 | ||||||
|  | @ -142,7 +142,7 @@ function python3_update() { | ||||||
|   elif [ -f /etc/debian_version ] || [ -f /etc/os-release ]; then |   elif [ -f /etc/debian_version ] || [ -f /etc/os-release ]; then | ||||||
|       # En sistemas Debian y derivados |       # En sistemas Debian y derivados | ||||||
|       apt update |       apt update | ||||||
|       apt install --only-upgrade -y python3-full |       apt install --only-upgrade -y python3 | ||||||
|   elif [ -f /etc/redhat-release ]; then |   elif [ -f /etc/redhat-release ]; then | ||||||
|       # En sistemas Red Hat |       # En sistemas Red Hat | ||||||
|       dnf upgrade -y python3 |       dnf upgrade -y python3 | ||||||
|  | @ -190,30 +190,6 @@ function pip_install() { | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| # Install pipx package |  | ||||||
| function pipx_install() { |  | ||||||
|   echo "Instalando pipx..." |  | ||||||
|    |  | ||||||
|   # Verificar si pip está instalado |  | ||||||
|   command_installed pip3 |  | ||||||
|   if [ $? -ne 0 ]; then |  | ||||||
|     # Si pip no está instalado, llamamos a la función de instalación |  | ||||||
|     pip_install |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   if [ "$(uname)" == "Darwin" ]; then |  | ||||||
|     # En macOS, instalamos pipx a través de Homebrew |  | ||||||
|     brew install pipx |  | ||||||
|     pipx ensurepath |  | ||||||
|   else |  | ||||||
|     # En otros sistemas, instalamos pipx a través de pip |  | ||||||
|     python3 -m pip install --user pipx |  | ||||||
|     python3 -m pipx ensurepath |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   echo "pipx instalado correctamente." |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Update pip package | # Update pip package | ||||||
| function pip_update() { | function pip_update() { | ||||||
| 
 | 
 | ||||||
|  | @ -260,31 +236,6 @@ function pip_update() { | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| # Update pipx package |  | ||||||
| function pipx_update() { |  | ||||||
|   echo "Actualizando pipx..." |  | ||||||
|    |  | ||||||
|   # Verificar si pipx está instalado |  | ||||||
|   command_installed pipx |  | ||||||
|   if [ $? -ne 0 ]; then |  | ||||||
|     # Si pipx no está instalado, llamamos a la función de instalación |  | ||||||
|     pipx_install |  | ||||||
|     return $? |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   # Actualizar pipx según el sistema operativo |  | ||||||
|   if [ "$(uname)" == "Darwin" ]; then |  | ||||||
|     # En macOS, actualizamos pipx a través de Homebrew |  | ||||||
|     brew upgrade pipx |  | ||||||
|   else |  | ||||||
|     # En otros sistemas, actualizamos pipx a través de pip |  | ||||||
|     python3 -m pip install --user --upgrade pipx |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   echo "pipx actualizado correctamente." |  | ||||||
|   return 0 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Install mozilla sops package on os system supported | # Install mozilla sops package on os system supported | ||||||
| function sops_install() { | function sops_install() { | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -168,15 +168,3 @@ hx_009="¿Desea instalar Helix Editor?" | ||||||
| hx_010="Instalación en progreso..." | hx_010="Instalación en progreso..." | ||||||
| hx_011="Se requiere acceso root para instalar Helix." | hx_011="Se requiere acceso root para instalar Helix." | ||||||
| hx_012="Creando directorio de destino..." | hx_012="Creando directorio de destino..." | ||||||
| 
 |  | ||||||
| zl_001="Instalador de Zettlr Markdown Editor" |  | ||||||
| zl_002="Este script instalará Zettlr Markdown Editor. Soporta Arch Linux, Debian/Ubuntu, Fedora, FreeBSD y macOS (Homebrew)." |  | ||||||
| zl_003="Descargando la última versión de Zettlr..." |  | ||||||
| zl_004="Instalando Zettlr..." |  | ||||||
| zl_005="Configurando Zettlr..." |  | ||||||
| zl_006="Zettlr instalado exitosamente." |  | ||||||
| zl_007="Versión de Zettlr instalada:" |  | ||||||
| zl_008="Zettlr no se instaló correctamente." |  | ||||||
| zl_009="¿Desea instalar Zettlr Markdown Editor?" |  | ||||||
| zl_010="Instalación en progreso..." |  | ||||||
| zl_011="Se requiere acceso root para instalar Zettlr." |  | ||||||
|  |  | ||||||
|  | @ -1,11 +1,11 @@ | ||||||
| #!/bin/bash | #!/bin/bash | ||||||
| #Script     	: devset.sh  | #Script     	: path_add.sh  | ||||||
| #Apps		: MRDEVS TOOLS | #Apps		: MRDEVS TOOLS | ||||||
| #Description	: Add bin directory to PATH (non-persistent) | #Description	: Add bin directory to PATH (non-persistent) | ||||||
| #Author		: Cortana Rosero One <cortana@rosero.one> | #Author		: Cortana Rosero One <cortana@rosero.one> | ||||||
| #Generated	: Created by Claude Code (claude-3-7-sonnet-20250219) | #Generated	: Created by Claude Code (claude-3-7-sonnet-20250219) | ||||||
| #Created	: 2025/04/01 21:00:00 | #Created	: 2025/04/01 21:00:00 | ||||||
| #Modified	: 2025/04/04 21:00:00 | #Modified	: 2025/04/01 21:00:00 | ||||||
| #Version	: 1.3.1 | #Version	: 1.3.1 | ||||||
| #Use Notes	: Source this script to add bin directory to PATH | #Use Notes	: Source this script to add bin directory to PATH | ||||||
| #============================================================================== | #============================================================================== | ||||||
|  | @ -42,18 +42,14 @@ function add_to_path() { | ||||||
|      |      | ||||||
|     if ! path_contains "$bin_path"; then |     if ! path_contains "$bin_path"; then | ||||||
|         export PATH="$bin_path:$PATH" |         export PATH="$bin_path:$PATH" | ||||||
|         echo "✅ ${head_success}: '$bin_path' ${head_002}" |         echo "✅ Ruta '$bin_path' agregada al PATH" | ||||||
|  |     else | ||||||
|  |         echo "ℹ️ La ruta '$bin_path' ya está en el PATH" | ||||||
|     fi |     fi | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| # Cargar mensajes en español |  | ||||||
| if [ -f "$SCRIPT_DIR/msg/head.es" ]; then |  | ||||||
|     source "$SCRIPT_DIR/msg/head.es" |  | ||||||
| fi |  | ||||||
| 
 |  | ||||||
| # Agregar la ruta bin al PATH | # Agregar la ruta bin al PATH | ||||||
| add_to_path "$BIN_DIR" | add_to_path "$BIN_DIR" | ||||||
| 
 | 
 | ||||||
| echo "✨ ${head_success}: ${head_000} ${head_002} ${head_version} $(cat "$SCRIPT_DIR/config/version")" | echo "✨ Los comandos de desarrollo están disponibles en esta sesión" | ||||||
| echo "📂 ${head_info}: Directorio de comandos '$BIN_DIR' agregado al PATH (no persistente)" | echo "💡 Uso: source ${BIN_DIR}/path_add.sh" | ||||||
| echo "💡 Uso: source ${BIN_DIR}/devset.sh" |  | ||||||
|  | @ -85,7 +85,7 @@ def check_install_pycountry(): | ||||||
| # Directorio base del proyecto | # Directorio base del proyecto | ||||||
| BASE_DIR = Path(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) | BASE_DIR = Path(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) | ||||||
| CONFIG_DIR = BASE_DIR / 'bin' / 'config' | CONFIG_DIR = BASE_DIR / 'bin' / 'config' | ||||||
| RATES_DIR = BASE_DIR / 'data' / 'rates'  # Nueva ubicación para archivos de tarifas | RATES_DIR = CONFIG_DIR / 'rates'  # Nueva ubicación para archivos de tarifas | ||||||
| 
 | 
 | ||||||
| # Archivos de configuración para la API de Perplexity | # Archivos de configuración para la API de Perplexity | ||||||
| MODEL_CONFIG_FILE = CONFIG_DIR / 'rate_model.ai' | MODEL_CONFIG_FILE = CONFIG_DIR / 'rate_model.ai' | ||||||
|  | @ -157,20 +157,12 @@ def get_perplexity_api_key(): | ||||||
|     # Si seguimos sin tener API key, mostrar error y salir |     # Si seguimos sin tener API key, mostrar error y salir | ||||||
|     if not api_key: |     if not api_key: | ||||||
|         logger.error("No se encontró la clave API de Perplexity.") |         logger.error("No se encontró la clave API de Perplexity.") | ||||||
|         logger.error("Se usarán valores predeterminados para las tarifas.") |         logger.error("Opciones para configurarla:") | ||||||
|         logger.error("Para obtener tarifas más precisas, configure la API key de Perplexity:") |  | ||||||
|         logger.error("1. Establecer la variable de entorno PERPLEXITY_API_KEY") |         logger.error("1. Establecer la variable de entorno PERPLEXITY_API_KEY") | ||||||
|         logger.error("2. Crear un archivo ~/.perplexity/api_key con la clave") |         logger.error("2. Crear un archivo ~/.perplexity/api_key con la clave") | ||||||
|         logger.error("3. Crear un archivo ~/.config/perplexity/api_key con la clave") |         logger.error("3. Crear un archivo ~/.config/perplexity/api_key con la clave") | ||||||
|         logger.error("4. Crear un archivo bin/config/perplexity_api_key en el directorio del proyecto") |         logger.error("4. Crear un archivo bin/config/perplexity_api_key en el directorio del proyecto") | ||||||
|          |         sys.exit(1) | ||||||
|         if SHOW_RESULTS: |  | ||||||
|             print("\nADVERTENCIA: No se encontró la clave API de Perplexity.") |  | ||||||
|             print("Se usarán valores predeterminados para las tarifas.") |  | ||||||
|             print("Para obtener tarifas más precisas, configure la API key visitando:") |  | ||||||
|             print("https://docs.perplexity.ai/docs/getting-started") |  | ||||||
|          |  | ||||||
|         return None |  | ||||||
|          |          | ||||||
|     # Validar formato básico de la API key |     # Validar formato básico de la API key | ||||||
|     if not api_key.startswith('pplx-'): |     if not api_key.startswith('pplx-'): | ||||||
|  | @ -471,8 +463,10 @@ def update_single_rate(programmer_type): | ||||||
|      |      | ||||||
|     # Verificar disponibilidad de la API |     # Verificar disponibilidad de la API | ||||||
|     api_available = True |     api_available = True | ||||||
|     api_key = get_perplexity_api_key() |     try: | ||||||
|     if api_key is None: |         # Intentar obtener la clave API (si falla, saltará una excepción) | ||||||
|  |         get_perplexity_api_key() | ||||||
|  |     except: | ||||||
|         api_available = False |         api_available = False | ||||||
|         logger.warning("API de Perplexity no disponible. Se usarán valores predeterminados.") |         logger.warning("API de Perplexity no disponible. Se usarán valores predeterminados.") | ||||||
|      |      | ||||||
|  | @ -672,8 +666,10 @@ def update_rate_files(force_update=False): | ||||||
|      |      | ||||||
|     # Verificar disponibilidad de la API |     # Verificar disponibilidad de la API | ||||||
|     api_available = True |     api_available = True | ||||||
|     api_key = get_perplexity_api_key() |     try: | ||||||
|     if api_key is None: |         # Intentar obtener la clave API (si falla, saltará una excepción) | ||||||
|  |         get_perplexity_api_key() | ||||||
|  |     except: | ||||||
|         api_available = False |         api_available = False | ||||||
|         logger.warning("API de Perplexity no disponible. Se usarán valores predeterminados.") |         logger.warning("API de Perplexity no disponible. Se usarán valores predeterminados.") | ||||||
|      |      | ||||||
|  |  | ||||||
|  | @ -100,7 +100,7 @@ update_python_and_pip() { | ||||||
|     elif [ -f /etc/debian_version ] || [ -f /etc/os-release ]; then |     elif [ -f /etc/debian_version ] || [ -f /etc/os-release ]; then | ||||||
|         # En sistemas Debian y derivados |         # En sistemas Debian y derivados | ||||||
|         apt update |         apt update | ||||||
|         apt install --only-upgrade -y python3-full |         apt install --only-upgrade -y python3 | ||||||
|     elif [ -f /etc/redhat-release ]; then |     elif [ -f /etc/redhat-release ]; then | ||||||
|         # En sistemas Red Hat |         # En sistemas Red Hat | ||||||
|         dnf upgrade -y python3 |         dnf upgrade -y python3 | ||||||
|  | @ -156,25 +156,10 @@ update_python_and_pip() { | ||||||
|    |    | ||||||
|   echo -e "\n${head_info}: Actualizando Python y pip..." |   echo -e "\n${head_info}: Actualizando Python y pip..." | ||||||
|    |    | ||||||
|   # Update Python - asegurándonos de que python3-full esté instalado |   # Update Python | ||||||
|   command_installed python3-full |  | ||||||
|   PYTHON_FULL_INSTALLED=$? |  | ||||||
|    |  | ||||||
|   command_installed python3 |   command_installed python3 | ||||||
|   PYTHON_BASIC_INSTALLED=$? |   if [ $? -eq 0 ]; then | ||||||
|    |  | ||||||
|   if [ $PYTHON_FULL_INSTALLED -eq 0 ]; then |  | ||||||
|     # Si python3-full está instalado, actualízalo |  | ||||||
|     python3_update |     python3_update | ||||||
|   elif [ $PYTHON_BASIC_INSTALLED -eq 0 ]; then |  | ||||||
|     # Si solo python3 básico está instalado, instala la versión completa |  | ||||||
|     echo -e "\n${head_info}: Actualizando a la versión completa de Python..." |  | ||||||
|     if [ -f /etc/debian_version ] || [ -f /etc/os-release ]; then |  | ||||||
|       apt update |  | ||||||
|       apt install -y python3-full |  | ||||||
|     else |  | ||||||
|       python3_update |  | ||||||
|     fi |  | ||||||
|   else |   else | ||||||
|     echo -e "\n${head_error}: Python3 no está instalado. Ejecute bin/bootstrap.sh primero." |     echo -e "\n${head_error}: Python3 no está instalado. Ejecute bin/bootstrap.sh primero." | ||||||
|   fi |   fi | ||||||
|  | @ -188,55 +173,29 @@ update_python_and_pip() { | ||||||
|     echo -e "Esta dependencia es necesaria para varias herramientas del sistema." |     echo -e "Esta dependencia es necesaria para varias herramientas del sistema." | ||||||
|   fi |   fi | ||||||
|    |    | ||||||
|   # Update pipx separately |   echo -e "\n${head_info}: Actualización de Python y pip completada." | ||||||
|   command_installed pipx |  | ||||||
|   if [ $? -eq 0 ]; then |  | ||||||
|     # Función interna para actualizar pipx |  | ||||||
|     function pipx_update_internal() { |  | ||||||
|       echo "Actualizando pipx..." |  | ||||||
|        |  | ||||||
|       if [ "$(uname)" == "Darwin" ]; then |  | ||||||
|         # En macOS, actualizamos pipx a través de Homebrew |  | ||||||
|         brew upgrade pipx |  | ||||||
|       else |  | ||||||
|         # En otros sistemas, actualizamos pipx a través de pip |  | ||||||
|         python3 -m pip install --user --upgrade pipx |  | ||||||
|       fi |  | ||||||
|        |  | ||||||
|       echo "pipx actualizado correctamente." |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     pipx_update_internal |  | ||||||
|   else |  | ||||||
|     echo -e "\n${head_error}: pipx no está instalado. Ejecute bin/bootstrap.sh primero." |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   echo -e "\n${head_info}: Actualización de Python, pip y pipx completada." |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| # Verificar si Python, pip o pipx están instalados y si se necesitan actualizar | # Verificar si Python o pip están instalados y si se necesitan actualizar | ||||||
| command_installed python3 | command_installed python3 | ||||||
| PYTHON_INSTALLED=$? | PYTHON_INSTALLED=$? | ||||||
| 
 | 
 | ||||||
| command_installed pip3 | command_installed pip3 | ||||||
| PIP_INSTALLED=$? | PIP_INSTALLED=$? | ||||||
| 
 | 
 | ||||||
| command_installed pipx |  | ||||||
| PIPX_INSTALLED=$? |  | ||||||
| 
 |  | ||||||
| # Si cualquiera de ellos está instalado, necesitamos actualizar con privilegios de superusuario | # Si cualquiera de ellos está instalado, necesitamos actualizar con privilegios de superusuario | ||||||
| if [ $PYTHON_INSTALLED -eq 0 ] || [ $PIP_INSTALLED -eq 0 ] || [ $PIPX_INSTALLED -eq 0 ]; then | if [ $PYTHON_INSTALLED -eq 0 ] || [ $PIP_INSTALLED -eq 0 ]; then | ||||||
|   # Ejecutar la actualización de Python, pip y pipx con sudo |   # Ejecutar la actualización de Python y pip con sudo | ||||||
|   echo -e "\n${head_info}: Se necesitan privilegios de administrador para actualizar Python, pip y pipx..." |   echo -e "\n${head_info}: Se necesitan privilegios de administrador para actualizar Python y pip..." | ||||||
|    |    | ||||||
|   # Exportar todas las funciones necesarias para que estén disponibles en el subproceso sudo |   # Exportar todas las funciones necesarias para que estén disponibles en el subproceso sudo | ||||||
|   # Esto incluye command_installed y otras funciones de base.lib que se necesitan |   # Esto incluye command_installed y otras funciones de base.lib que se necesitan | ||||||
|   sudo bash -c "$(declare -f command_installed; declare -f update_python_and_pip); update_python_and_pip $SCRIPT_DIR $BIN_LIBS $BIN_MESG $BIN_LANG" |   sudo bash -c "$(declare -f command_installed; declare -f update_python_and_pip); update_python_and_pip $SCRIPT_DIR $BIN_LIBS $BIN_MESG $BIN_LANG" | ||||||
|   if [ $? -ne 0 ]; then |   if [ $? -ne 0 ]; then | ||||||
|     echo -e "\n${head_error}: No se pudo actualizar Python, pip y pipx. Verifique sus privilegios." |     echo -e "\n${head_error}: No se pudo actualizar Python y pip. Verifique sus privilegios." | ||||||
|   fi |   fi | ||||||
| else | else | ||||||
|   echo -e "\n${head_info}: No se detectaron Python, pip ni pipx instalados. No hay actualizaciones que realizar." |   echo -e "\n${head_info}: No se detectaron Python ni pip instalados. No hay actualizaciones que realizar." | ||||||
|   echo -e "Para instalar estas dependencias, ejecute bin/bootstrap.sh primero." |   echo -e "Para instalar estas dependencias, ejecute bin/bootstrap.sh primero." | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,472 +0,0 @@ | ||||||
| #!/bin/bash |  | ||||||
| #Script     	: vscode_install.sh |  | ||||||
| #Apps		: MRDEVS TOOLS |  | ||||||
| #Description	: Instala Visual Studio Code con soporte multiplataforma |  | ||||||
| #Author		: Cortana Rosero One <cortana@rosero.one> |  | ||||||
| #Generated	: Created by Claude Code (claude-3-7-sonnet-20250219) |  | ||||||
| #Created	: 2025/04/04 10:00:00 |  | ||||||
| #Modified	: 2025/04/04 10:00:00 |  | ||||||
| #Version	: 1.3.1 |  | ||||||
| #Use Notes	: Ejecutar sin parámetros para instalación interactiva |  | ||||||
| #		  -u para desinstalar |  | ||||||
| #============================================================================== |  | ||||||
| # Derechos de Autor 2025 Mauro Rosero P. <mauro@rosero.one> |  | ||||||
| #============================================================================== |  | ||||||
| # Este programa es software libre: usted puede redistribuirlo y/o modificarlo |  | ||||||
| # bajo los términos de la Licencia Pública Affero General de GNU tal como |  | ||||||
| # lo publica la Free Software Foundation, ya sea la versión 3 de la licencia, |  | ||||||
| # o (a su elección) cualquier versión posterior. |  | ||||||
| # |  | ||||||
| # Este programa se distribuye con la esperanza de que sea útil, |  | ||||||
| # pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de |  | ||||||
| # COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte la |  | ||||||
| # Licencia Pública Affero General de GNU para obtener más detalles. |  | ||||||
| # |  | ||||||
| # Debería haber recibido una copia de la Licencia Pública Affero General |  | ||||||
| # junto con este programa. Si no la recibió, consulte <https://www.gnu.org/licenses/>. |  | ||||||
| 
 |  | ||||||
| # Configuración inicial |  | ||||||
| SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |  | ||||||
| BIN_BASE="bin" |  | ||||||
| BIN_LIBS="lib" |  | ||||||
| BIN_MESG="msg" |  | ||||||
| BIN_LANG="head.es" |  | ||||||
| BIN_CFGS="config" |  | ||||||
| 
 |  | ||||||
| # Leer DEVSPATH desde el archivo de configuración o usar "devs" por defecto |  | ||||||
| if [ -f "$SCRIPT_DIR/$BIN_CFGS/devspath.dat" ]; then |  | ||||||
|   DEVSPATH=$(cat "$SCRIPT_DIR/$BIN_CFGS/devspath.dat") |  | ||||||
| else |  | ||||||
|   DEVSPATH="devs" |  | ||||||
| fi |  | ||||||
| 
 |  | ||||||
| # Cargar bibliotecas comunes |  | ||||||
| if [ -f "$SCRIPT_DIR/$BIN_LIBS/base.lib" ]; then |  | ||||||
|   source "$SCRIPT_DIR/$BIN_LIBS/base.lib" |  | ||||||
| else |  | ||||||
|   echo "Error: No se encontró la biblioteca base.lib" |  | ||||||
|   exit 1 |  | ||||||
| fi |  | ||||||
| 
 |  | ||||||
| # Cargar mensajes en español |  | ||||||
| if [ -f "$SCRIPT_DIR/$BIN_MESG/$BIN_LANG" ]; then |  | ||||||
|   source "$SCRIPT_DIR/$BIN_MESG/$BIN_LANG" |  | ||||||
| else |  | ||||||
|   echo "Error: No se encontraron los archivos de mensajes" |  | ||||||
|   exit 1 |  | ||||||
| fi |  | ||||||
| 
 |  | ||||||
| # Verificar si se está solicitando la desinstalación |  | ||||||
| UNINSTALL=0 |  | ||||||
| if [ "$1" = "-u" ]; then |  | ||||||
|   UNINSTALL=1 |  | ||||||
| fi |  | ||||||
| 
 |  | ||||||
| # Función para detectar el sistema operativo |  | ||||||
| detect_os() { |  | ||||||
|   if [ -f /etc/os-release ]; then |  | ||||||
|     . /etc/os-release |  | ||||||
|     OS=$NAME |  | ||||||
|     VER=$VERSION_ID |  | ||||||
|   elif [ -f /etc/lsb-release ]; then |  | ||||||
|     . /etc/lsb-release |  | ||||||
|     OS=$DISTRIB_ID |  | ||||||
|     VER=$DISTRIB_RELEASE |  | ||||||
|   elif [ -f /etc/debian_version ]; then |  | ||||||
|     OS="Debian" |  | ||||||
|     VER=$(cat /etc/debian_version) |  | ||||||
|   elif [ -f /etc/redhat-release ]; then |  | ||||||
|     OS=$(cat /etc/redhat-release | cut -d ' ' -f 1) |  | ||||||
|     VER=$(cat /etc/redhat-release | grep -oE '[0-9]+\.[0-9]+') |  | ||||||
|   elif [ "$(uname)" == "Darwin" ]; then |  | ||||||
|     OS="macOS" |  | ||||||
|     VER=$(sw_vers -productVersion) |  | ||||||
|   elif [ "$(uname)" == "FreeBSD" ]; then |  | ||||||
|     OS="FreeBSD" |  | ||||||
|     VER=$(uname -r) |  | ||||||
|   else |  | ||||||
|     OS="Unknown" |  | ||||||
|     VER="Unknown" |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   echo "$OS" |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función para instalar VSCode en sistemas basados en Debian/Ubuntu |  | ||||||
| install_vscode_debian() { |  | ||||||
|   echo -e "\n${head_info}: Instalando paquetes necesarios..." |  | ||||||
|   sudo apt update |  | ||||||
|   sudo apt install -y wget gpg apt-transport-https |  | ||||||
| 
 |  | ||||||
|   echo -e "\n${head_info}: Descargando e instalando la clave GPG de Microsoft..." |  | ||||||
|   wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg |  | ||||||
|   sudo install -D -o root -g root -m 644 microsoft.gpg /etc/apt/keyrings/microsoft.gpg |  | ||||||
|   rm microsoft.gpg |  | ||||||
| 
 |  | ||||||
|   echo -e "\n${head_info}: Configurando el repositorio de VSCode..." |  | ||||||
|   echo "deb [arch=amd64,arm64,armhf signed-by=/etc/apt/keyrings/microsoft.gpg] https://packages.microsoft.com/repos/code stable main" | \ |  | ||||||
|     sudo tee /etc/apt/sources.list.d/vscode.list |  | ||||||
| 
 |  | ||||||
|   echo -e "\n${head_info}: Actualizando repositorios e instalando Visual Studio Code..." |  | ||||||
|   sudo apt update |  | ||||||
|   sudo apt install -y code |  | ||||||
| 
 |  | ||||||
|   if command -v code &>/dev/null; then |  | ||||||
|     echo -e "\n${head_success}: Visual Studio Code ha sido instalado correctamente." |  | ||||||
|     echo -e "${head_info}: Versión instalada: $(code --version | head -n 1)" |  | ||||||
|     return 0 |  | ||||||
|   else |  | ||||||
|     echo -e "\n${head_error}: No se pudo instalar Visual Studio Code." |  | ||||||
|     return 1 |  | ||||||
|   fi |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función para desinstalar VSCode en sistemas basados en Debian/Ubuntu |  | ||||||
| uninstall_vscode_debian() { |  | ||||||
|   echo -e "\n${head_info}: Desinstalando Visual Studio Code..." |  | ||||||
|   sudo apt remove --purge -y code |  | ||||||
|   sudo rm -f /etc/apt/sources.list.d/vscode.list |  | ||||||
|   sudo rm -f /etc/apt/keyrings/microsoft.gpg |  | ||||||
|   sudo apt update |  | ||||||
| 
 |  | ||||||
|   if ! command -v code &>/dev/null; then |  | ||||||
|     echo -e "\n${head_success}: Visual Studio Code ha sido desinstalado correctamente." |  | ||||||
|     return 0 |  | ||||||
|   else |  | ||||||
|     echo -e "\n${head_error}: No se pudo desinstalar completamente Visual Studio Code." |  | ||||||
|     return 1 |  | ||||||
|   fi |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función para instalar VSCode en sistemas basados en Red Hat (Fedora, RHEL, etc.) |  | ||||||
| install_vscode_redhat() { |  | ||||||
|   echo -e "\n${head_info}: Instalando paquetes necesarios..." |  | ||||||
|   sudo dnf check-update |  | ||||||
|   sudo dnf install -y dnf-plugins-core |  | ||||||
| 
 |  | ||||||
|   echo -e "\n${head_info}: Configurando el repositorio de VSCode..." |  | ||||||
|   sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc |  | ||||||
|   sudo sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo' |  | ||||||
| 
 |  | ||||||
|   echo -e "\n${head_info}: Instalando Visual Studio Code..." |  | ||||||
|   sudo dnf install -y code |  | ||||||
| 
 |  | ||||||
|   if command -v code &>/dev/null; then |  | ||||||
|     echo -e "\n${head_success}: Visual Studio Code ha sido instalado correctamente." |  | ||||||
|     echo -e "${head_info}: Versión instalada: $(code --version | head -n 1)" |  | ||||||
|     return 0 |  | ||||||
|   else |  | ||||||
|     echo -e "\n${head_error}: No se pudo instalar Visual Studio Code." |  | ||||||
|     return 1 |  | ||||||
|   fi |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función para desinstalar VSCode en sistemas basados en Red Hat |  | ||||||
| uninstall_vscode_redhat() { |  | ||||||
|   echo -e "\n${head_info}: Desinstalando Visual Studio Code..." |  | ||||||
|   sudo dnf remove -y code |  | ||||||
|   sudo rm -f /etc/yum.repos.d/vscode.repo |  | ||||||
| 
 |  | ||||||
|   if ! command -v code &>/dev/null; then |  | ||||||
|     echo -e "\n${head_success}: Visual Studio Code ha sido desinstalado correctamente." |  | ||||||
|     return 0 |  | ||||||
|   else |  | ||||||
|     echo -e "\n${head_error}: No se pudo desinstalar completamente Visual Studio Code." |  | ||||||
|     return 1 |  | ||||||
|   fi |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función para instalar VSCode en Arch Linux |  | ||||||
| install_vscode_arch() { |  | ||||||
|   echo -e "\n${head_info}: Actualizando repositorios..." |  | ||||||
|   sudo pacman -Sy |  | ||||||
| 
 |  | ||||||
|   # Verificar si yay está instalado |  | ||||||
|   if command -v yay &>/dev/null; then |  | ||||||
|     echo -e "\n${head_info}: Instalando Visual Studio Code usando yay..." |  | ||||||
|     yay -S --noconfirm visual-studio-code-bin |  | ||||||
|   else |  | ||||||
|     echo -e "\n${head_info}: Instalando Visual Studio Code desde los repositorios oficiales..." |  | ||||||
|     # Intentar instalar el paquete oficial si está disponible |  | ||||||
|     if pacman -Si code &>/dev/null; then |  | ||||||
|       sudo pacman -S --noconfirm code |  | ||||||
|     else |  | ||||||
|       # Si no está disponible, intentar con el AUR |  | ||||||
|       echo -e "\n${head_info}: El paquete no está en los repositorios oficiales. Intentando con git..." |  | ||||||
|       sudo pacman -S --noconfirm git base-devel |  | ||||||
|        |  | ||||||
|       # Directorio temporal para la compilación |  | ||||||
|       BUILD_DIR=$(mktemp -d) |  | ||||||
|       cd "$BUILD_DIR" |  | ||||||
|        |  | ||||||
|       # Clonar el paquete del AUR y compilarlo |  | ||||||
|       git clone https://aur.archlinux.org/visual-studio-code-bin.git |  | ||||||
|       cd visual-studio-code-bin |  | ||||||
|       makepkg -si --noconfirm |  | ||||||
|        |  | ||||||
|       # Limpiar |  | ||||||
|       cd |  | ||||||
|       rm -rf "$BUILD_DIR" |  | ||||||
|     fi |  | ||||||
|   fi |  | ||||||
| 
 |  | ||||||
|   if command -v code &>/dev/null; then |  | ||||||
|     echo -e "\n${head_success}: Visual Studio Code ha sido instalado correctamente." |  | ||||||
|     echo -e "${head_info}: Versión instalada: $(code --version | head -n 1)" |  | ||||||
|     return 0 |  | ||||||
|   else |  | ||||||
|     echo -e "\n${head_error}: No se pudo instalar Visual Studio Code." |  | ||||||
|     return 1 |  | ||||||
|   fi |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función para desinstalar VSCode en Arch Linux |  | ||||||
| uninstall_vscode_arch() { |  | ||||||
|   echo -e "\n${head_info}: Desinstalando Visual Studio Code..." |  | ||||||
|    |  | ||||||
|   # Intentar desinstalar desde diferentes paquetes posibles |  | ||||||
|   if pacman -Qi visual-studio-code-bin &>/dev/null; then |  | ||||||
|     sudo pacman -R --noconfirm visual-studio-code-bin |  | ||||||
|   elif pacman -Qi code &>/dev/null; then |  | ||||||
|     sudo pacman -R --noconfirm code |  | ||||||
|   elif pacman -Qi visual-studio-code &>/dev/null; then |  | ||||||
|     sudo pacman -R --noconfirm visual-studio-code |  | ||||||
|   fi |  | ||||||
| 
 |  | ||||||
|   if ! command -v code &>/dev/null; then |  | ||||||
|     echo -e "\n${head_success}: Visual Studio Code ha sido desinstalado correctamente." |  | ||||||
|     return 0 |  | ||||||
|   else |  | ||||||
|     echo -e "\n${head_error}: No se pudo desinstalar completamente Visual Studio Code." |  | ||||||
|     return 1 |  | ||||||
|   fi |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función para instalar VSCode en macOS |  | ||||||
| install_vscode_macos() { |  | ||||||
|   echo -e "\n${head_info}: Verificando si Homebrew está instalado..." |  | ||||||
|    |  | ||||||
|   if ! command -v brew &>/dev/null; then |  | ||||||
|     echo -e "\n${head_info}: Instalando Homebrew..." |  | ||||||
|     /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   echo -e "\n${head_info}: Instalando Visual Studio Code mediante Homebrew..." |  | ||||||
|   brew install --cask visual-studio-code |  | ||||||
|    |  | ||||||
|   if [ -d "/Applications/Visual Studio Code.app" ]; then |  | ||||||
|     echo -e "\n${head_success}: Visual Studio Code ha sido instalado correctamente." |  | ||||||
|     return 0 |  | ||||||
|   else |  | ||||||
|     echo -e "\n${head_error}: No se pudo instalar Visual Studio Code." |  | ||||||
|     return 1 |  | ||||||
|   fi |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función para desinstalar VSCode en macOS |  | ||||||
| uninstall_vscode_macos() { |  | ||||||
|   echo -e "\n${head_info}: Desinstalando Visual Studio Code..." |  | ||||||
|    |  | ||||||
|   if command -v brew &>/dev/null; then |  | ||||||
|     brew uninstall --cask visual-studio-code |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   if [ -d "/Applications/Visual Studio Code.app" ]; then |  | ||||||
|     rm -rf "/Applications/Visual Studio Code.app" |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   if [ ! -d "/Applications/Visual Studio Code.app" ]; then |  | ||||||
|     echo -e "\n${head_success}: Visual Studio Code ha sido desinstalado correctamente." |  | ||||||
|     return 0 |  | ||||||
|   else |  | ||||||
|     echo -e "\n${head_error}: No se pudo desinstalar completamente Visual Studio Code." |  | ||||||
|     return 1 |  | ||||||
|   fi |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función para instalar VSCode en FreeBSD |  | ||||||
| install_vscode_freebsd() { |  | ||||||
|   echo -e "\n${head_info}: Actualizando repositorios..." |  | ||||||
|   sudo pkg update |  | ||||||
|    |  | ||||||
|   echo -e "\n${head_info}: Instalando Visual Studio Code..." |  | ||||||
|   sudo pkg install -y vscode |  | ||||||
|    |  | ||||||
|   if command -v code &>/dev/null; then |  | ||||||
|     echo -e "\n${head_success}: Visual Studio Code ha sido instalado correctamente." |  | ||||||
|     echo -e "${head_info}: Versión instalada: $(code --version | head -n 1)" |  | ||||||
|     return 0 |  | ||||||
|   else |  | ||||||
|     echo -e "\n${head_error}: No se pudo instalar Visual Studio Code." |  | ||||||
|     return 1 |  | ||||||
|   fi |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función para desinstalar VSCode en FreeBSD |  | ||||||
| uninstall_vscode_freebsd() { |  | ||||||
|   echo -e "\n${head_info}: Desinstalando Visual Studio Code..." |  | ||||||
|   sudo pkg remove -y vscode |  | ||||||
|    |  | ||||||
|   if ! command -v code &>/dev/null; then |  | ||||||
|     echo -e "\n${head_success}: Visual Studio Code ha sido desinstalado correctamente." |  | ||||||
|     return 0 |  | ||||||
|   else |  | ||||||
|     echo -e "\n${head_error}: No se pudo desinstalar completamente Visual Studio Code." |  | ||||||
|     return 1 |  | ||||||
|   fi |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función principal para instalar VSCode |  | ||||||
| install_vscode() { |  | ||||||
|   local os=$(detect_os) |  | ||||||
|   local result=0 |  | ||||||
|    |  | ||||||
|   echo -e "\n${head_info}: Sistema operativo detectado: ${os}" |  | ||||||
|    |  | ||||||
|   # Instalar según el sistema operativo |  | ||||||
|   case "$os" in |  | ||||||
|     *"Ubuntu"*|*"Debian"*|*"Linux Mint"*|*"Pop!_OS"*|*"elementary OS"*) |  | ||||||
|       install_vscode_debian |  | ||||||
|       result=$? |  | ||||||
|       ;; |  | ||||||
|     *"Fedora"*|*"Red Hat"*|*"CentOS"*|*"Rocky"*|*"AlmaLinux"*|*"Oracle Linux"*) |  | ||||||
|       install_vscode_redhat |  | ||||||
|       result=$? |  | ||||||
|       ;; |  | ||||||
|     *"Arch"*|*"Manjaro"*|*"EndeavourOS"*|*"Garuda"*) |  | ||||||
|       install_vscode_arch |  | ||||||
|       result=$? |  | ||||||
|       ;; |  | ||||||
|     *"macOS"*) |  | ||||||
|       install_vscode_macos |  | ||||||
|       result=$? |  | ||||||
|       ;; |  | ||||||
|     *"FreeBSD"*) |  | ||||||
|       install_vscode_freebsd |  | ||||||
|       result=$? |  | ||||||
|       ;; |  | ||||||
|     *) |  | ||||||
|       echo -e "\n${head_error}: ${os_nofound}" |  | ||||||
|       return 1 |  | ||||||
|       ;; |  | ||||||
|   esac |  | ||||||
|    |  | ||||||
|   # Si la instalación fue exitosa, mostrar información adicional |  | ||||||
|   if [ $result -eq 0 ]; then |  | ||||||
|     echo -e "\n${head_info}: Visual Studio Code ha sido instalado correctamente." |  | ||||||
|     echo -e "${head_info}: Para iniciar VSCode, ejecute: code" |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   return $result |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función principal para desinstalar VSCode |  | ||||||
| uninstall_vscode() { |  | ||||||
|   local os=$(detect_os) |  | ||||||
|   local result=0 |  | ||||||
|    |  | ||||||
|   echo -e "\n${head_info}: Sistema operativo detectado: ${os}" |  | ||||||
|    |  | ||||||
|   # Mostrar diálogo de confirmación |  | ||||||
|   if command -v dialog &>/dev/null; then |  | ||||||
|     dialog --title "Confirmación" --yesno "¿Está seguro que desea desinstalar Visual Studio Code?" 8 60 |  | ||||||
|     if [ $? -ne 0 ]; then |  | ||||||
|       echo -e "\n${head_info}: Desinstalación cancelada por el usuario." |  | ||||||
|       return 0 |  | ||||||
|     fi |  | ||||||
|   else |  | ||||||
|     read -p "¿Está seguro que desea desinstalar Visual Studio Code? (s/n): " CONFIRM |  | ||||||
|     if [[ ! "$CONFIRM" =~ ^[Ss]$ ]]; then |  | ||||||
|       echo -e "\n${head_info}: Desinstalación cancelada por el usuario." |  | ||||||
|       return 0 |  | ||||||
|     fi |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   # Desinstalar según el sistema operativo |  | ||||||
|   case "$os" in |  | ||||||
|     *"Ubuntu"*|*"Debian"*|*"Linux Mint"*|*"Pop!_OS"*|*"elementary OS"*) |  | ||||||
|       uninstall_vscode_debian |  | ||||||
|       result=$? |  | ||||||
|       ;; |  | ||||||
|     *"Fedora"*|*"Red Hat"*|*"CentOS"*|*"Rocky"*|*"AlmaLinux"*|*"Oracle Linux"*) |  | ||||||
|       uninstall_vscode_redhat |  | ||||||
|       result=$? |  | ||||||
|       ;; |  | ||||||
|     *"Arch"*|*"Manjaro"*|*"EndeavourOS"*|*"Garuda"*) |  | ||||||
|       uninstall_vscode_arch |  | ||||||
|       result=$? |  | ||||||
|       ;; |  | ||||||
|     *"macOS"*) |  | ||||||
|       uninstall_vscode_macos |  | ||||||
|       result=$? |  | ||||||
|       ;; |  | ||||||
|     *"FreeBSD"*) |  | ||||||
|       uninstall_vscode_freebsd |  | ||||||
|       result=$? |  | ||||||
|       ;; |  | ||||||
|     *) |  | ||||||
|       echo -e "\n${head_error}: ${os_nofound}" |  | ||||||
|       return 1 |  | ||||||
|       ;; |  | ||||||
|   esac |  | ||||||
|    |  | ||||||
|   # Si la desinstalación fue exitosa, mostrar mensaje |  | ||||||
|   if [ $result -eq 0 ]; then |  | ||||||
|     echo -e "\n${head_success}: Visual Studio Code ha sido desinstalado correctamente." |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   return $result |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Mostrar encabezado |  | ||||||
| echo -e "\n=== Instalación de Visual Studio Code ===" |  | ||||||
| 
 |  | ||||||
| # Verificar si VSCode ya está instalado |  | ||||||
| if command -v code &>/dev/null; then |  | ||||||
|   CODE_VERSION=$(code --version | head -n 1) |  | ||||||
|   echo -e "\n${npm_019}" |  | ||||||
|   echo "Visual Studio Code: $CODE_VERSION" |  | ||||||
|    |  | ||||||
|   # Si se solicita desinstalación |  | ||||||
|   if [ $UNINSTALL -eq 1 ]; then |  | ||||||
|     uninstall_vscode |  | ||||||
|   else |  | ||||||
|     # Si ya está instalado y no se solicita desinstalación, preguntar qué hacer |  | ||||||
|     if command -v dialog &>/dev/null; then |  | ||||||
|       dialog --title "${npm_031}" --yesno "Visual Studio Code ya está instalado (versión $CODE_VERSION).\n¿Desea reinstalarlo?" 8 60 |  | ||||||
|       REINSTALL=$? |  | ||||||
|       if [ $REINSTALL -eq 0 ]; then |  | ||||||
|         uninstall_vscode && install_vscode |  | ||||||
|       fi |  | ||||||
|     else |  | ||||||
|       read -p "Visual Studio Code ya está instalado (versión $CODE_VERSION). ¿Desea reinstalarlo? (s/n): " REINSTALL |  | ||||||
|       if [[ "$REINSTALL" =~ ^[Ss]$ ]]; then |  | ||||||
|         uninstall_vscode && install_vscode |  | ||||||
|       fi |  | ||||||
|     fi |  | ||||||
|   fi |  | ||||||
| else |  | ||||||
|   # Si no está instalado |  | ||||||
|   if [ $UNINSTALL -eq 1 ]; then |  | ||||||
|     echo -e "\n${head_info}: Visual Studio Code no está instalado. Nada que hacer." |  | ||||||
|   else |  | ||||||
|     # Mostrar diálogo de confirmación para instalar |  | ||||||
|     if command -v dialog &>/dev/null; then |  | ||||||
|       dialog --title "Confirmación" --yesno "¿Desea instalar Visual Studio Code?" 8 60 |  | ||||||
|       if [ $? -eq 0 ]; then |  | ||||||
|         install_vscode |  | ||||||
|       else |  | ||||||
|         echo -e "\n${head_info}: Instalación cancelada por el usuario." |  | ||||||
|       fi |  | ||||||
|     else |  | ||||||
|       read -p "¿Desea instalar Visual Studio Code? (s/n): " CONFIRM |  | ||||||
|       if [[ "$CONFIRM" =~ ^[Ss]$ ]]; then |  | ||||||
|         install_vscode |  | ||||||
|       else |  | ||||||
|         echo -e "\n${head_info}: Instalación cancelada por el usuario." |  | ||||||
|       fi |  | ||||||
|     fi |  | ||||||
|   fi |  | ||||||
| fi |  | ||||||
| 
 |  | ||||||
| echo -e "\n=== Proceso Finalizado ===" |  | ||||||
|  | @ -1,608 +0,0 @@ | ||||||
| #!/bin/bash |  | ||||||
| #Script     	: zettlr_install.sh |  | ||||||
| #Apps		: MRDEVS TOOLS |  | ||||||
| #Description	: Instala Zettlr Markdown Editor con soporte multiplataforma |  | ||||||
| #Author		: Cortana Rosero One <cortana@rosero.one> |  | ||||||
| #Generated	: Created by Claude Code (claude-3-7-sonnet-20250219) |  | ||||||
| #Created	: 2025/04/04 12:00:00 |  | ||||||
| #Modified	: 2025/04/04 12:00:00 |  | ||||||
| #Version	: 1.3.1 |  | ||||||
| #Use Notes	: Ejecutar sin parámetros para instalación interactiva |  | ||||||
| #		  -u para desinstalar |  | ||||||
| #============================================================================== |  | ||||||
| # Derechos de Autor 2025 Mauro Rosero P. <mauro@rosero.one> |  | ||||||
| #============================================================================== |  | ||||||
| # Este programa es software libre: usted puede redistribuirlo y/o modificarlo |  | ||||||
| # bajo los términos de la Licencia Pública Affero General de GNU tal como |  | ||||||
| # lo publica la Free Software Foundation, ya sea la versión 3 de la licencia, |  | ||||||
| # o (a su elección) cualquier versión posterior. |  | ||||||
| # |  | ||||||
| # Este programa se distribuye con la esperanza de que sea útil, |  | ||||||
| # pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de |  | ||||||
| # COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte la |  | ||||||
| # Licencia Pública Affero General de GNU para obtener más detalles. |  | ||||||
| # |  | ||||||
| # Debería haber recibido una copia de la Licencia Pública Affero General |  | ||||||
| # junto con este programa. Si no la recibió, consulte <https://www.gnu.org/licenses/>. |  | ||||||
| 
 |  | ||||||
| # Configuración inicial |  | ||||||
| SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |  | ||||||
| BIN_BASE="bin" |  | ||||||
| BIN_LIBS="lib" |  | ||||||
| BIN_MESG="msg" |  | ||||||
| BIN_LANG="head.es" |  | ||||||
| BIN_CFGS="config" |  | ||||||
| 
 |  | ||||||
| # Leer DEVSPATH desde el archivo de configuración o usar "devs" por defecto |  | ||||||
| if [ -f "$SCRIPT_DIR/$BIN_CFGS/devspath.dat" ]; then |  | ||||||
|   DEVSPATH=$(cat "$SCRIPT_DIR/$BIN_CFGS/devspath.dat") |  | ||||||
| else |  | ||||||
|   DEVSPATH="devs" |  | ||||||
| fi |  | ||||||
| 
 |  | ||||||
| # Cargar bibliotecas comunes |  | ||||||
| if [ -f "$SCRIPT_DIR/$BIN_LIBS/base.lib" ]; then |  | ||||||
|   source "$SCRIPT_DIR/$BIN_LIBS/base.lib" |  | ||||||
| else |  | ||||||
|   echo "Error: No se encontró la biblioteca base.lib" |  | ||||||
|   exit 1 |  | ||||||
| fi |  | ||||||
| 
 |  | ||||||
| # Cargar biblioteca de consola |  | ||||||
| if [ -f "$SCRIPT_DIR/$BIN_LIBS/console.lib" ]; then |  | ||||||
|   source "$SCRIPT_DIR/$BIN_LIBS/console.lib" |  | ||||||
| else |  | ||||||
|   echo "Error: No se encontró la biblioteca console.lib" |  | ||||||
|   exit 1 |  | ||||||
| fi |  | ||||||
| 
 |  | ||||||
| # Cargar mensajes en español |  | ||||||
| if [ -f "$SCRIPT_DIR/$BIN_MESG/$BIN_LANG" ]; then |  | ||||||
|   source "$SCRIPT_DIR/$BIN_MESG/$BIN_LANG" |  | ||||||
| else |  | ||||||
|   echo "Error: No se encontraron los archivos de mensajes" |  | ||||||
|   exit 1 |  | ||||||
| fi |  | ||||||
| 
 |  | ||||||
| # Configurar título |  | ||||||
| title="${head_000} ${head_002}" |  | ||||||
| apps_title="${zl_001}" |  | ||||||
| 
 |  | ||||||
| # Función para limpiar la pantalla y salir |  | ||||||
| function finish() { |  | ||||||
|   clear |  | ||||||
|   exit |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función para ejecutar comandos con sudo si es necesario |  | ||||||
| run_cmd() { |  | ||||||
|   if [ "$EUID" -eq 0 ]; then |  | ||||||
|     "$@" |  | ||||||
|   else |  | ||||||
|     echo "$SUDO_PASS" | sudo -S "$@" |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   # Devuelve el código de estado del último comando ejecutado |  | ||||||
|   return $? |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Verificar si se está solicitando la desinstalación |  | ||||||
| UNINSTALL=0 |  | ||||||
| if [ "$1" = "-u" ]; then |  | ||||||
|   UNINSTALL=1 |  | ||||||
| fi |  | ||||||
| 
 |  | ||||||
| # Definir la versión y URLs |  | ||||||
| ZETTLR_VERSION="3.0.3" |  | ||||||
| GITHUB_API_URL="https://api.github.com/repos/Zettlr/Zettlr/releases/latest" |  | ||||||
| 
 |  | ||||||
| # Función para obtener la última versión de Zettlr desde GitHub |  | ||||||
| get_latest_version() { |  | ||||||
|   if command -v curl &>/dev/null; then |  | ||||||
|     ZETTLR_LATEST_VERSION=$(curl -s $GITHUB_API_URL | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/' | cut -c 2-) |  | ||||||
|     if [ -n "$ZETTLR_LATEST_VERSION" ]; then |  | ||||||
|       ZETTLR_VERSION=$ZETTLR_LATEST_VERSION |  | ||||||
|     fi |  | ||||||
|   fi |  | ||||||
|   echo "Versión a instalar: $ZETTLR_VERSION" |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función para detectar el sistema operativo |  | ||||||
| detect_os() { |  | ||||||
|   if [ -f /etc/os-release ]; then |  | ||||||
|     . /etc/os-release |  | ||||||
|     OS=$NAME |  | ||||||
|     VER=$VERSION_ID |  | ||||||
|   elif [ -f /etc/lsb-release ]; then |  | ||||||
|     . /etc/lsb-release |  | ||||||
|     OS=$DISTRIB_ID |  | ||||||
|     VER=$DISTRIB_RELEASE |  | ||||||
|   elif [ -f /etc/debian_version ]; then |  | ||||||
|     OS="Debian" |  | ||||||
|     VER=$(cat /etc/debian_version) |  | ||||||
|   elif [ -f /etc/redhat-release ]; then |  | ||||||
|     OS=$(cat /etc/redhat-release | cut -d ' ' -f 1) |  | ||||||
|     VER=$(cat /etc/redhat-release | grep -oE '[0-9]+\.[0-9]+') |  | ||||||
|   elif [ "$(uname)" == "Darwin" ]; then |  | ||||||
|     OS="macOS" |  | ||||||
|     VER=$(sw_vers -productVersion) |  | ||||||
|   elif [ "$(uname)" == "FreeBSD" ]; then |  | ||||||
|     OS="FreeBSD" |  | ||||||
|     VER=$(uname -r) |  | ||||||
|   else |  | ||||||
|     OS="Unknown" |  | ||||||
|     VER="Unknown" |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   echo "$OS" |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función para obtener la arquitectura del sistema |  | ||||||
| get_arch() { |  | ||||||
|   ARCH=$(uname -m) |  | ||||||
|    |  | ||||||
|   # Normalizar la arquitectura |  | ||||||
|   if [ "$ARCH" = "x86_64" ]; then |  | ||||||
|     ARCH="amd64" |  | ||||||
|   elif [[ "$ARCH" == "arm"* ]] || [ "$ARCH" = "aarch64" ]; then |  | ||||||
|     ARCH="arm64" |  | ||||||
|   else |  | ||||||
|     ARCH="i386" |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   echo $ARCH |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función para instalar Zettlr en sistemas basados en Debian/Ubuntu |  | ||||||
| install_zettlr_debian() { |  | ||||||
|   local arch=$(get_arch) |  | ||||||
|    |  | ||||||
|   echo -e "\n${head_info}: Instalando dependencias necesarias..." |  | ||||||
|   run_cmd apt update |  | ||||||
|   run_cmd apt install -y wget  |  | ||||||
|    |  | ||||||
|   echo -e "\n${head_info}: Descargando Zettlr versión $ZETTLR_VERSION para $arch..." |  | ||||||
|    |  | ||||||
|   if [ "$arch" = "amd64" ]; then |  | ||||||
|     wget -O /tmp/zettlr.deb "https://github.com/Zettlr/Zettlr/releases/download/v${ZETTLR_VERSION}/Zettlr-${ZETTLR_VERSION}-amd64.deb" |  | ||||||
|   elif [ "$arch" = "arm64" ]; then |  | ||||||
|     wget -O /tmp/zettlr.deb "https://github.com/Zettlr/Zettlr/releases/download/v${ZETTLR_VERSION}/Zettlr-${ZETTLR_VERSION}-arm64.deb" |  | ||||||
|   else |  | ||||||
|     echo -e "\n${head_error}: Arquitectura $arch no soportada para Zettlr." |  | ||||||
|     return 1 |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   echo -e "\n${head_info}: Instalando Zettlr..." |  | ||||||
|   run_cmd apt install -y /tmp/zettlr.deb |  | ||||||
|   rm -f /tmp/zettlr.deb |  | ||||||
|    |  | ||||||
|   # Verificar la instalación |  | ||||||
|   if command -v zettlr &>/dev/null || [ -f /usr/bin/zettlr ] || [ -f /opt/Zettlr/zettlr ]; then |  | ||||||
|     echo -e "\n${head_success}: Zettlr ha sido instalado correctamente." |  | ||||||
|     return 0 |  | ||||||
|   else |  | ||||||
|     echo -e "\n${head_error}: No se pudo instalar Zettlr." |  | ||||||
|     return 1 |  | ||||||
|   fi |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función para desinstalar Zettlr en sistemas basados en Debian/Ubuntu |  | ||||||
| uninstall_zettlr_debian() { |  | ||||||
|   echo -e "\n${head_info}: Desinstalando Zettlr..." |  | ||||||
|   run_cmd apt remove --purge -y zettlr |  | ||||||
|   run_cmd apt autoremove -y |  | ||||||
|    |  | ||||||
|   # Eliminar archivos de configuración residuales |  | ||||||
|   echo -e "\n${head_info}: Limpiando archivos de configuración..." |  | ||||||
|   rm -rf ~/.config/Zettlr |  | ||||||
|    |  | ||||||
|   echo -e "\n${head_success}: Zettlr ha sido desinstalado correctamente." |  | ||||||
|   return 0 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función para instalar Zettlr en sistemas basados en Red Hat |  | ||||||
| install_zettlr_redhat() { |  | ||||||
|   local arch=$(get_arch) |  | ||||||
|    |  | ||||||
|   echo -e "\n${head_info}: Instalando dependencias necesarias..." |  | ||||||
|   run_cmd dnf check-update |  | ||||||
|   run_cmd dnf install -y wget |  | ||||||
| 
 |  | ||||||
|   echo -e "\n${head_info}: Descargando Zettlr versión $ZETTLR_VERSION para $arch..." |  | ||||||
|    |  | ||||||
|   if [ "$arch" = "amd64" ]; then |  | ||||||
|     wget -O /tmp/zettlr.rpm "https://github.com/Zettlr/Zettlr/releases/download/v${ZETTLR_VERSION}/Zettlr-${ZETTLR_VERSION}.x86_64.rpm" |  | ||||||
|   elif [ "$arch" = "arm64" ]; then |  | ||||||
|     wget -O /tmp/zettlr.rpm "https://github.com/Zettlr/Zettlr/releases/download/v${ZETTLR_VERSION}/Zettlr-${ZETTLR_VERSION}.arm64.rpm" |  | ||||||
|   else |  | ||||||
|     echo -e "\n${head_error}: Arquitectura $arch no soportada para Zettlr." |  | ||||||
|     return 1 |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   echo -e "\n${head_info}: Instalando Zettlr..." |  | ||||||
|   run_cmd dnf install -y /tmp/zettlr.rpm |  | ||||||
|   rm -f /tmp/zettlr.rpm |  | ||||||
|    |  | ||||||
|   # Verificar la instalación |  | ||||||
|   if command -v zettlr &>/dev/null || [ -f /usr/bin/zettlr ] || [ -f /opt/Zettlr/zettlr ]; then |  | ||||||
|     echo -e "\n${head_success}: Zettlr ha sido instalado correctamente." |  | ||||||
|     return 0 |  | ||||||
|   else |  | ||||||
|     echo -e "\n${head_error}: No se pudo instalar Zettlr." |  | ||||||
|     return 1 |  | ||||||
|   fi |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función para desinstalar Zettlr en sistemas basados en Red Hat |  | ||||||
| uninstall_zettlr_redhat() { |  | ||||||
|   echo -e "\n${head_info}: Desinstalando Zettlr..." |  | ||||||
|   run_cmd dnf remove -y zettlr |  | ||||||
|    |  | ||||||
|   # Eliminar archivos de configuración residuales |  | ||||||
|   echo -e "\n${head_info}: Limpiando archivos de configuración..." |  | ||||||
|   rm -rf ~/.config/Zettlr |  | ||||||
|    |  | ||||||
|   echo -e "\n${head_success}: Zettlr ha sido desinstalado correctamente." |  | ||||||
|   return 0 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función para instalar Zettlr en Arch Linux |  | ||||||
| install_zettlr_arch() { |  | ||||||
|   echo -e "\n${head_info}: Actualizando repositorios..." |  | ||||||
|   run_cmd pacman -Sy |  | ||||||
|    |  | ||||||
|   echo -e "\n${head_info}: Instalando dependencias necesarias..." |  | ||||||
|   run_cmd pacman -S --needed --noconfirm base-devel git |  | ||||||
| 
 |  | ||||||
|   # Verificar si yay está instalado |  | ||||||
|   if ! command -v yay &>/dev/null; then |  | ||||||
|     echo -e "\n${head_info}: Instalando yay (AUR helper)..." |  | ||||||
|     TMP_DIR=$(mktemp -d) |  | ||||||
|     cd "$TMP_DIR" |  | ||||||
|     git clone https://aur.archlinux.org/yay.git |  | ||||||
|     cd yay |  | ||||||
|     makepkg -si --noconfirm |  | ||||||
|     cd |  | ||||||
|     rm -rf "$TMP_DIR" |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   echo -e "\n${head_info}: Instalando Zettlr desde AUR..." |  | ||||||
|   yay -S --noconfirm zettlr-bin |  | ||||||
|    |  | ||||||
|   # Verificar la instalación |  | ||||||
|   if command -v zettlr &>/dev/null || [ -f /usr/bin/zettlr ]; then |  | ||||||
|     echo -e "\n${head_success}: Zettlr ha sido instalado correctamente." |  | ||||||
|     return 0 |  | ||||||
|   else |  | ||||||
|     echo -e "\n${head_error}: No se pudo instalar Zettlr." |  | ||||||
|     return 1 |  | ||||||
|   fi |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función para desinstalar Zettlr en Arch Linux |  | ||||||
| uninstall_zettlr_arch() { |  | ||||||
|   echo -e "\n${head_info}: Desinstalando Zettlr..." |  | ||||||
|   if pacman -Qi zettlr-bin &>/dev/null; then |  | ||||||
|     run_cmd pacman -R --noconfirm zettlr-bin |  | ||||||
|   elif pacman -Qi zettlr &>/dev/null; then |  | ||||||
|     run_cmd pacman -R --noconfirm zettlr |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   # Eliminar archivos de configuración residuales |  | ||||||
|   echo -e "\n${head_info}: Limpiando archivos de configuración..." |  | ||||||
|   rm -rf ~/.config/Zettlr |  | ||||||
|    |  | ||||||
|   echo -e "\n${head_success}: Zettlr ha sido desinstalado correctamente." |  | ||||||
|   return 0 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función para instalar Zettlr en macOS |  | ||||||
| install_zettlr_macos() { |  | ||||||
|   echo -e "\n${head_info}: Verificando si Homebrew está instalado..." |  | ||||||
|    |  | ||||||
|   if ! command -v brew &>/dev/null; then |  | ||||||
|     echo -e "\n${head_info}: Instalando Homebrew..." |  | ||||||
|     /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   echo -e "\n${head_info}: Instalando Zettlr mediante Homebrew..." |  | ||||||
|   brew install --cask zettlr |  | ||||||
|    |  | ||||||
|   # Verificar la instalación |  | ||||||
|   if [ -d "/Applications/Zettlr.app" ]; then |  | ||||||
|     echo -e "\n${head_success}: Zettlr ha sido instalado correctamente." |  | ||||||
|     return 0 |  | ||||||
|   else |  | ||||||
|     echo -e "\n${head_error}: No se pudo instalar Zettlr." |  | ||||||
|     return 1 |  | ||||||
|   fi |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función para desinstalar Zettlr en macOS |  | ||||||
| uninstall_zettlr_macos() { |  | ||||||
|   echo -e "\n${head_info}: Desinstalando Zettlr..." |  | ||||||
|    |  | ||||||
|   if command -v brew &>/dev/null; then |  | ||||||
|     brew uninstall --cask zettlr |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   # Eliminar la aplicación manualmente si brew no funcionó |  | ||||||
|   if [ -d "/Applications/Zettlr.app" ]; then |  | ||||||
|     rm -rf "/Applications/Zettlr.app" |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   # Eliminar archivos de configuración |  | ||||||
|   rm -rf ~/Library/Application\ Support/Zettlr |  | ||||||
|    |  | ||||||
|   echo -e "\n${head_success}: Zettlr ha sido desinstalado correctamente." |  | ||||||
|   return 0 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función para instalar Zettlr en FreeBSD |  | ||||||
| install_zettlr_freebsd() { |  | ||||||
|   echo -e "\n${head_info}: FreeBSD no tiene soporte oficial para Zettlr." |  | ||||||
|   echo -e "${head_info}: Se puede intentar utilizar la versión AppImage o la instalación manual." |  | ||||||
|    |  | ||||||
|   local arch=$(get_arch) |  | ||||||
|   if [ "$arch" = "amd64" ]; then |  | ||||||
|     echo -e "\n${head_info}: Descargando AppImage de Zettlr..." |  | ||||||
|     fetch -o /tmp/Zettlr.AppImage "https://github.com/Zettlr/Zettlr/releases/download/v${ZETTLR_VERSION}/Zettlr-${ZETTLR_VERSION}-x86_64.AppImage" |  | ||||||
|      |  | ||||||
|     chmod +x /tmp/Zettlr.AppImage |  | ||||||
|     mkdir -p "$HOME/Applications" |  | ||||||
|     mv /tmp/Zettlr.AppImage "$HOME/Applications/" |  | ||||||
|      |  | ||||||
|     echo -e "\n${head_info}: Creando enlace simbólico..." |  | ||||||
|     mkdir -p "$HOME/bin" |  | ||||||
|     ln -sf "$HOME/Applications/Zettlr.AppImage" "$HOME/bin/zettlr" |  | ||||||
|      |  | ||||||
|     echo -e "\n${head_success}: Zettlr ha sido instalado en $HOME/Applications/Zettlr.AppImage" |  | ||||||
|     echo -e "${head_info}: Para ejecutar Zettlr, use: $HOME/bin/zettlr" |  | ||||||
|     return 0 |  | ||||||
|   else |  | ||||||
|     echo -e "\n${head_error}: Arquitectura $arch no soportada para Zettlr en FreeBSD." |  | ||||||
|     return 1 |  | ||||||
|   fi |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función para desinstalar Zettlr en FreeBSD |  | ||||||
| uninstall_zettlr_freebsd() { |  | ||||||
|   echo -e "\n${head_info}: Desinstalando Zettlr..." |  | ||||||
|    |  | ||||||
|   # Eliminar AppImage |  | ||||||
|   if [ -f "$HOME/Applications/Zettlr.AppImage" ]; then |  | ||||||
|     rm -f "$HOME/Applications/Zettlr.AppImage" |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   # Eliminar enlace simbólico |  | ||||||
|   if [ -L "$HOME/bin/zettlr" ]; then |  | ||||||
|     rm -f "$HOME/bin/zettlr" |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   # Eliminar archivos de configuración |  | ||||||
|   rm -rf "$HOME/.config/Zettlr" |  | ||||||
|    |  | ||||||
|   echo -e "\n${head_success}: Zettlr ha sido desinstalado correctamente." |  | ||||||
|   return 0 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función principal para instalar Zettlr |  | ||||||
| install_zettlr() { |  | ||||||
|   local os=$(detect_os) |  | ||||||
|   local result=0 |  | ||||||
|    |  | ||||||
|   # Obtener la última versión disponible |  | ||||||
|   get_latest_version |  | ||||||
|    |  | ||||||
|   echo -e "\n${head_info}: Sistema operativo detectado: ${os}" |  | ||||||
|    |  | ||||||
|   # Instalar según el sistema operativo |  | ||||||
|   case "$os" in |  | ||||||
|     *"Ubuntu"*|*"Debian"*|*"Linux Mint"*|*"Pop!_OS"*|*"elementary OS"*) |  | ||||||
|       install_zettlr_debian |  | ||||||
|       result=$? |  | ||||||
|       ;; |  | ||||||
|     *"Fedora"*|*"Red Hat"*|*"CentOS"*|*"Rocky"*|*"AlmaLinux"*|*"Oracle Linux"*) |  | ||||||
|       install_zettlr_redhat |  | ||||||
|       result=$? |  | ||||||
|       ;; |  | ||||||
|     *"Arch"*|*"Manjaro"*|*"EndeavourOS"*|*"Garuda"*) |  | ||||||
|       install_zettlr_arch |  | ||||||
|       result=$? |  | ||||||
|       ;; |  | ||||||
|     *"macOS"*) |  | ||||||
|       install_zettlr_macos |  | ||||||
|       result=$? |  | ||||||
|       ;; |  | ||||||
|     *"FreeBSD"*) |  | ||||||
|       install_zettlr_freebsd |  | ||||||
|       result=$? |  | ||||||
|       ;; |  | ||||||
|     *) |  | ||||||
|       echo -e "\n${head_error}: ${os_nofound}" |  | ||||||
|       return 1 |  | ||||||
|       ;; |  | ||||||
|   esac |  | ||||||
|    |  | ||||||
|   # Si la instalación fue exitosa, mostrar información adicional |  | ||||||
|   if [ $result -eq 0 ]; then |  | ||||||
|     # La información se mostrará después del gauge |  | ||||||
|     INSTALL_SUCCESS=1 |  | ||||||
|     ZETTLR_INFO="Zettlr es un editor Markdown moderno con enfoque académico\n" |  | ||||||
|     ZETTLR_INFO+="- Incluye editor Markdown WYSIWYG y soporte para Zettelkasten\n" |  | ||||||
|     ZETTLR_INFO+="- Integración con Pandoc y LaTeX para exportación de documentos\n" |  | ||||||
|     ZETTLR_INFO+="- Soporte para Markdown, Citas, Referencias y más\n" |  | ||||||
|     ZETTLR_INFO+="- Sitio web oficial: https://www.zettlr.com/" |  | ||||||
|   else |  | ||||||
|     INSTALL_SUCCESS=0 |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   return $result |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Función principal para desinstalar Zettlr |  | ||||||
| uninstall_zettlr() { |  | ||||||
|   local os=$(detect_os) |  | ||||||
|   local result=0 |  | ||||||
|    |  | ||||||
|   echo -e "\n${head_info}: Sistema operativo detectado: ${os}" |  | ||||||
|    |  | ||||||
|   # Mostrar diálogo de confirmación |  | ||||||
|   if command -v dialog &>/dev/null; then |  | ||||||
|     dialog_yesno "¿Está seguro que desea ${head_delete} Zettlr Markdown Editor?" |  | ||||||
|     if [ $? -ne 0 ]; then |  | ||||||
|       echo -e "\n${head_info}: ${head_op_error}" |  | ||||||
|       return 0 |  | ||||||
|     fi |  | ||||||
|   else |  | ||||||
|     read -p "¿Está seguro que desea ${head_delete} Zettlr Markdown Editor? (s/n): " CONFIRM |  | ||||||
|     if [[ ! "$CONFIRM" =~ ^[Ss]$ ]]; then |  | ||||||
|       echo -e "\n${head_info}: ${head_op_error}" |  | ||||||
|       return 0 |  | ||||||
|     fi |  | ||||||
|   fi |  | ||||||
|    |  | ||||||
|   # Desinstalar según el sistema operativo |  | ||||||
|   case "$os" in |  | ||||||
|     *"Ubuntu"*|*"Debian"*|*"Linux Mint"*|*"Pop!_OS"*|*"elementary OS"*) |  | ||||||
|       uninstall_zettlr_debian |  | ||||||
|       result=$? |  | ||||||
|       ;; |  | ||||||
|     *"Fedora"*|*"Red Hat"*|*"CentOS"*|*"Rocky"*|*"AlmaLinux"*|*"Oracle Linux"*) |  | ||||||
|       uninstall_zettlr_redhat |  | ||||||
|       result=$? |  | ||||||
|       ;; |  | ||||||
|     *"Arch"*|*"Manjaro"*|*"EndeavourOS"*|*"Garuda"*) |  | ||||||
|       uninstall_zettlr_arch |  | ||||||
|       result=$? |  | ||||||
|       ;; |  | ||||||
|     *"macOS"*) |  | ||||||
|       uninstall_zettlr_macos |  | ||||||
|       result=$? |  | ||||||
|       ;; |  | ||||||
|     *"FreeBSD"*) |  | ||||||
|       uninstall_zettlr_freebsd |  | ||||||
|       result=$? |  | ||||||
|       ;; |  | ||||||
|     *) |  | ||||||
|       echo -e "\n${head_error}: ${os_nofound}" |  | ||||||
|       return 1 |  | ||||||
|       ;; |  | ||||||
|   esac |  | ||||||
|    |  | ||||||
|   return $result |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| # Si no se ejecuta como root, solicitar contraseña para escalamiento vía dialog |  | ||||||
| if [ "$EUID" -ne 0 ]; then |  | ||||||
|   dialog_error_box "${head_superuser}" "${zl_011}" |  | ||||||
|   dialog_input_pass "${npm_002}" "" "" |  | ||||||
|   if [ $? -ne 0 ]; then |  | ||||||
|     dialog_error_box "${head_error}" "${npm_003}" |  | ||||||
|     finish |  | ||||||
|   fi |  | ||||||
|   SUDO_PASS="$value" |  | ||||||
|    |  | ||||||
|   # Verificar que la contraseña funcione |  | ||||||
|   echo "$SUDO_PASS" | sudo -S true &> /dev/null |  | ||||||
|   if [ $? -ne 0 ]; then |  | ||||||
|     dialog_error_box "${head_error}" "${npm_003}" |  | ||||||
|     finish |  | ||||||
|   fi |  | ||||||
| fi |  | ||||||
| 
 |  | ||||||
| # Mensaje de bienvenida |  | ||||||
| clear |  | ||||||
| dialog_error_box "${zl_001}" "${zl_002}" |  | ||||||
| 
 |  | ||||||
| # Verificar si Zettlr ya está instalado |  | ||||||
| ZETTLR_INSTALLED=0 |  | ||||||
| if command -v zettlr &>/dev/null || [ -f /usr/bin/zettlr ] || [ -f /opt/Zettlr/zettlr ] || [ -d "/Applications/Zettlr.app" ]; then |  | ||||||
|   ZETTLR_INSTALLED=1 |  | ||||||
| fi |  | ||||||
| 
 |  | ||||||
| # Determinar acción a realizar |  | ||||||
| if [ $UNINSTALL -eq 1 ]; then |  | ||||||
|   # Desinstalar si está instalado |  | ||||||
|   if [ $ZETTLR_INSTALLED -eq 1 ]; then |  | ||||||
|     dialog_yesno "¿${head_delete} Zettlr Markdown Editor?" |  | ||||||
|     if [ $? -eq 0 ]; then |  | ||||||
|         # Limpiar pantalla y ejecutar en consola |  | ||||||
|       clear |  | ||||||
|       echo -e "\n=== ${head_delete} Zettlr Markdown Editor ===" |  | ||||||
|        |  | ||||||
|       uninstall_zettlr |  | ||||||
|       UNINSTALL_RESULT=$? |  | ||||||
|        |  | ||||||
|       if [ $UNINSTALL_RESULT -eq 0 ]; then |  | ||||||
|         echo -e "\n=== ${head_success}: Zettlr ha sido desinstalado correctamente ===" |  | ||||||
|       else |  | ||||||
|         echo -e "\n=== ${head_error}: No se pudo desinstalar Zettlr ===" |  | ||||||
|       fi |  | ||||||
|     else |  | ||||||
|       dialog_error_box "${head_canceled}" "${head_op_error}" |  | ||||||
|     fi |  | ||||||
|   else |  | ||||||
|     dialog_error_box "${head_info}" "Zettlr no está instalado. Nada que desinstalar." |  | ||||||
|   fi |  | ||||||
| else |  | ||||||
|   # Instalar o reinstalar |  | ||||||
|   if [ $ZETTLR_INSTALLED -eq 1 ]; then |  | ||||||
|     # Preguntar si desea reinstalar |  | ||||||
|     dialog_yesno "Zettlr ${head_version} ya está instalado.\n\n¿Desea reinstalarlo?" |  | ||||||
|     if [ $? -eq 0 ]; then |  | ||||||
|       # Limpiar pantalla y ejecutar en consola |  | ||||||
|       clear |  | ||||||
|       echo -e "\n=== ${zl_003} ===" |  | ||||||
|       sleep 1 |  | ||||||
|       echo -e "\n=== ${zl_004} ===" |  | ||||||
|       sleep 1 |  | ||||||
|       echo -e "\n=== ${zl_005} ===" |  | ||||||
|        |  | ||||||
|       # Desinstalar e instalar Zettlr |  | ||||||
|       uninstall_zettlr && install_zettlr |  | ||||||
|       INSTALL_RESULT=$? |  | ||||||
|        |  | ||||||
|       # Verificar el resultado de la instalación |  | ||||||
|       if [ $INSTALL_RESULT -eq 0 ]; then |  | ||||||
|         echo -e "\n=== ${zl_006} ===" |  | ||||||
|         if [ $INSTALL_SUCCESS -eq 1 ]; then |  | ||||||
|           echo -e "\n${ZETTLR_INFO}" |  | ||||||
|         fi |  | ||||||
|       else |  | ||||||
|         echo -e "\n=== ${zl_008} ===" |  | ||||||
|       fi |  | ||||||
|     fi |  | ||||||
|   else |  | ||||||
|     # Preguntar si desea instalar |  | ||||||
|     dialog_yesno "${zl_009}" |  | ||||||
|     if [ $? -eq 0 ]; then |  | ||||||
|       # Limpiar pantalla y ejecutar en consola |  | ||||||
|       clear |  | ||||||
|       echo -e "\n=== ${zl_003} ===" |  | ||||||
|       sleep 1 |  | ||||||
|       echo -e "\n=== ${zl_004} ===" |  | ||||||
|       sleep 1 |  | ||||||
|       echo -e "\n=== ${zl_005} ===" |  | ||||||
|        |  | ||||||
|       # Instalar Zettlr |  | ||||||
|       install_zettlr |  | ||||||
|       INSTALL_RESULT=$? |  | ||||||
|        |  | ||||||
|       # Verificar el resultado de la instalación |  | ||||||
|       if [ $INSTALL_RESULT -eq 0 ]; then |  | ||||||
|         echo -e "\n=== ${zl_006} ===" |  | ||||||
|         if [ $INSTALL_SUCCESS -eq 1 ]; then |  | ||||||
|           echo -e "\n${ZETTLR_INFO}" |  | ||||||
|         fi |  | ||||||
|       else |  | ||||||
|         echo -e "\n=== ${zl_008} ===" |  | ||||||
|       fi |  | ||||||
|     else |  | ||||||
|       dialog_error_box "${head_canceled}" "${head_op_error}" |  | ||||||
|     fi |  | ||||||
|   fi |  | ||||||
| fi |  | ||||||
| 
 |  | ||||||
| # Salir |  | ||||||
| finish |  | ||||||
		Loading…
	
		Reference in a new issue