devs/bin/update.sh
Mauro Rosero P. 2d9afccca0
[ADDED] Soporte para gum (Charm TUI toolkit)
- Añadida instalación de gum a bootstrap.sh
- Implementada actualización automática de gum en update.sh
- Agregada función gum_install en bootstrap.lib
- Actualizada documentación en README para reflejar el nuevo componente
- Actualizada la estructura de directorios con el nuevo directorio data/
- Actualizada versión a 1.3.1

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-04-04 11:27:55 -05:00

326 lines
11 KiB
Bash
Executable file

#!/bin/bash
#Script : update.sh
#Apps : MRDEVS TOOLS
#Description : Actualiza pre-requisitos para MRDEVS TOOLS
#Author : Mauro Rosero Pérez
#Company Email : mauro@rosero.one
#Personal Email : mauro.rosero@gmail.com
#Created : 2024/12/09 10:27:00
#Modified : 2025/04/04 14:00:00
#Version : 1.3.1
#Use Notes :
#==============================================================================
# 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)"
# Leer DEVSPATH desde el archivo de configuración o usar "devs" por defecto
if [ -f "$SCRIPT_DIR/config/devspath.dat" ]; then
DEVSPATH=$(cat "$SCRIPT_DIR/config/devspath.dat")
else
DEVSPATH="devs"
fi
BIN_HOME="$HOME/$DEVSPATH"
BIN_BASE="bin"
BIN_LIBS="lib"
BIN_MESG="msg"
BIN_CFGS="config"
VERSION=$(cat "$SCRIPT_DIR/$BIN_CFGS/version")
# LOAD BASE BASH LIBRARY
source $SCRIPT_DIR/$BIN_LIBS/base.lib
#baselib_test
load_bootstrap_msg() {
local BIN_PATH=$1
local MSG_PATH=$2
local LANGUAGE=$3
# Load head messages
load_messages $BIN_PATH $MSG_PATH $LANGUAGE "head"
# Load bootstrap messages
load_messages $BIN_PATH $MSG_PATH $LANGUAGE "bootstrap"
}
# Load messages
load_bootstrap_msg $SCRIPT_DIR $BIN_MESG $BIN_LANG
# Display Headers
display_devstools_header "- $bomsg_001"
# Run update devs environment
if [ "$PWD" == "$BIN_HOME" ]
then
git pull
else
cd $BIN_HOME
git pull
fi
# Load bootstrap library for update functions
source $SCRIPT_DIR/$BIN_LIBS/bootstrap.lib
# Update sistema operativo y repositorios primero (no requiere privilegios de root)
echo -e "\n${head_info}: Actualizando repositorios locales primero..."
# Función para actualizar Python y pip (requiere privilegios de superusuario)
update_python_and_pip() {
local BIN_PATH=$1
local LIBRARY=$2
local MESSAGES=$3
local UPDATE_LANG=$4
# No necesitamos cargar bootstrap.lib, ya que tenemos las funciones definidas internamente
# Definiciones internas para no depender de fuentes externas
function python3_update() {
echo "Actualizando Python..."
if [ "$(uname)" == "Darwin" ]; then
# En macOS, actualizamos Python a través de Homebrew
brew upgrade python
elif [ -f /etc/debian_version ] || [ -f /etc/os-release ]; then
# En sistemas Debian y derivados
apt update
apt install --only-upgrade -y python3-full
elif [ -f /etc/redhat-release ]; then
# En sistemas Red Hat
dnf upgrade -y python3
elif [ -f /etc/arch-release ]; then
# En Arch Linux
pacman -Syu --noconfirm python
elif [ -f /etc/rc.conf ]; then
# En BSD
pkg upgrade -y python3
else
echo "Sistema operativo no soportado"
return 1
fi
echo "Python actualizado correctamente."
return 0
}
function pip_update() {
echo "Actualizando pip..."
# Actualizar pip usando el método adecuado según el sistema operativo
if [ "$(uname)" == "Darwin" ]; then
# En macOS, actualizamos pip a través de Homebrew
brew upgrade python-pip
elif [ -f /etc/debian_version ] || [ -f /etc/os-release ]; then
# En sistemas Debian y derivados
apt update
apt install --only-upgrade -y python3-pip
# También actualizar usando el propio pip
python3 -m pip install --upgrade pip
elif [ -f /etc/redhat-release ]; then
# En sistemas Red Hat
dnf upgrade -y python3-pip
# También actualizar usando el propio pip
python3 -m pip install --upgrade pip
elif [ -f /etc/arch-release ]; then
# En Arch Linux
pacman -Syu --noconfirm python-pip
elif [ -f /etc/rc.conf ]; then
# En BSD
pkg upgrade -y python3-pip
# También actualizar usando el propio pip
python3 -m pip install --upgrade pip
else
echo "Sistema operativo no soportado"
return 1
fi
echo "Pip actualizado correctamente."
return 0
}
echo -e "\n${head_info}: Actualizando Python y pip..."
# Update Python - asegurándonos de que python3-full esté instalado
command_installed python3-full
PYTHON_FULL_INSTALLED=$?
command_installed python3
PYTHON_BASIC_INSTALLED=$?
if [ $PYTHON_FULL_INSTALLED -eq 0 ]; then
# Si python3-full está instalado, actualízalo
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
echo -e "\n${head_error}: Python3 no está instalado. Ejecute bin/bootstrap.sh primero."
fi
# Update pip separately
command_installed pip3
if [ $? -eq 0 ]; then
pip_update
else
echo -e "\n${head_error}: pip3 no está instalado. Ejecute bin/bootstrap.sh primero."
echo -e "Esta dependencia es necesaria para varias herramientas del sistema."
fi
# Update pipx separately
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
command_installed python3
PYTHON_INSTALLED=$?
command_installed pip3
PIP_INSTALLED=$?
command_installed pipx
PIPX_INSTALLED=$?
# 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
# Ejecutar la actualización de Python, pip y pipx con sudo
echo -e "\n${head_info}: Se necesitan privilegios de administrador para actualizar Python, pip y pipx..."
# 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
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
echo -e "\n${head_error}: No se pudo actualizar Python, pip y pipx. Verifique sus privilegios."
fi
else
echo -e "\n${head_info}: No se detectaron Python, pip ni pipx instalados. No hay actualizaciones que realizar."
echo -e "Para instalar estas dependencias, ejecute bin/bootstrap.sh primero."
fi
# Actualizar herramientas adicionales si están instaladas
update_additional_tools() {
local BIN_PATH=$1
local LIBRARY=$2
local MESSAGES=$3
local UPDATE_LANG=$4
# Cargar biblioteca bootstrap para acceder a las funciones de instalación
source "$BIN_PATH/$LIBRARY/bootstrap.lib"
# Actualizar oathtool si está instalado
command_installed oathtool
if [ $? -eq 0 ]; then
echo -e "\n${head_info}: Actualizando oathtool..."
oathtool_install
echo -e "${head_info}: oathtool actualizado correctamente."
fi
# Actualizar zbar si está instalado
command_installed zbar-tools
if [ $? -eq 0 ]; then
echo -e "\n${head_info}: Actualizando zbar..."
zbar_install
echo -e "${head_info}: zbar actualizado correctamente."
fi
# Actualizar redis-cli si está instalado
command_installed redis-cli
if [ $? -eq 0 ]; then
echo -e "\n${head_info}: Actualizando redis-cli..."
if [ -f /etc/debian_version ] || [ -f /etc/os-release ]; then
# Para sistemas basados en Debian
apt update
apt install --only-upgrade -y redis-tools
elif [ -f /etc/redhat-release ]; then
# Para sistemas basados en Red Hat
dnf upgrade -y redis
elif [ -f /etc/arch-release ]; then
# Para Arch Linux
pacman -Syu --noconfirm redis
elif [ "$(uname)" == "Darwin" ]; then
# Para macOS con Homebrew
brew upgrade redis
else
echo -e "${head_error}: Sistema operativo no soportado para actualizar redis-cli"
fi
echo -e "${head_info}: redis-cli actualizado correctamente."
fi
# Actualizar gum si está instalado
command_installed gum
if [ $? -eq 0 ]; then
echo -e "\n${head_info}: Actualizando gum (Charm TUI toolkit)..."
if [ -f /etc/debian_version ] || [ -f /etc/os-release ]; then
# Para sistemas basados en Debian
apt update
apt install --only-upgrade -y gum
elif [ -f /etc/redhat-release ]; then
# Para sistemas basados en Red Hat
dnf upgrade -y gum
elif [ -f /etc/arch-release ]; then
# Para Arch Linux con yay
command_installed yay
if [ $? -eq 0 ]; then
yay -Syu --noconfirm gum
else
echo -e "${head_error}: yay no está instalado, no se puede actualizar gum"
fi
elif [ "$(uname)" == "Darwin" ]; then
# Para macOS con Homebrew
brew upgrade gum
else
echo -e "${head_error}: Sistema operativo no soportado para actualizar gum"
fi
echo -e "${head_info}: gum actualizado correctamente."
fi
}
# Actualizar herramientas adicionales con sudo si están instaladas
echo -e "\n${head_info}: Verificando herramientas adicionales..."
sudo bash -c "$(declare -f command_installed; declare -f update_additional_tools); update_additional_tools $SCRIPT_DIR $BIN_LIBS $BIN_MESG $BIN_LANG"
echo -e "\n${head_info}: Proceso de actualización completado."