#!/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. ] #============================================================================== # 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 . # 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."