diff --git a/bin/zettlr_install.sh b/bin/zettlr_install.sh new file mode 100755 index 0000000..e847088 --- /dev/null +++ b/bin/zettlr_install.sh @@ -0,0 +1,516 @@ +#!/bin/bash +#Script : zettlr_install.sh +#Apps : MRDEVS TOOLS +#Description : Instala Zettlr Markdown Editor con soporte multiplataforma +#Author : 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. +#============================================================================== +# 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)" +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 + +# 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..." + sudo apt update + sudo 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..." + sudo 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..." + sudo apt remove --purge -y zettlr + sudo 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..." + sudo dnf check-update + sudo 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..." + sudo 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..." + sudo 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..." + sudo pacman -Sy + + echo -e "\n${head_info}: Instalando dependencias necesarias..." + sudo 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 + sudo pacman -R --noconfirm zettlr-bin + elif pacman -Qi zettlr &>/dev/null; then + sudo 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 + echo -e "\n${head_info}: Información de Zettlr:" + echo -e " - Zettlr es un editor Markdown moderno con enfoque académico" + echo -e " - Incluye características como editor Markdown WYSIWYG, soporte para Zettelkasten" + echo -e " - Integración con Pandoc y LaTeX para exportación de documentos" + echo -e " - Soporta Markdown, Citas, Referencias y más" + echo -e " - Sitio web oficial: https://www.zettlr.com/" + 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 --title "Confirmación" --yesno "¿Está seguro que desea desinstalar Zettlr?" 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 Zettlr? (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_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 +} + +# Mostrar encabezado +echo -e "\n=== Instalación de Zettlr Markdown Editor ===" + +# 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 + echo -e "\n${head_info}: Zettlr ya está instalado en el sistema." +fi + +# Determinar acción a realizar +if [ $UNINSTALL -eq 1 ]; then + # Desinstalar si está instalado + if [ $ZETTLR_INSTALLED -eq 1 ]; then + uninstall_zettlr + else + echo -e "\n${head_info}: Zettlr no está instalado. Nada que desinstalar." + fi +else + # Instalar o reinstalar + if [ $ZETTLR_INSTALLED -eq 1 ]; then + # Preguntar si desea reinstalar + if command -v dialog &>/dev/null; then + dialog --title "Confirmación" --yesno "Zettlr ya está instalado. ¿Desea reinstalarlo?" 8 60 + if [ $? -eq 0 ]; then + uninstall_zettlr && install_zettlr + fi + else + read -p "Zettlr ya está instalado. ¿Desea reinstalarlo? (s/n): " REINSTALL + if [[ "$REINSTALL" =~ ^[Ss]$ ]]; then + uninstall_zettlr && install_zettlr + fi + fi + else + # Preguntar si desea instalar + if command -v dialog &>/dev/null; then + dialog --title "Confirmación" --yesno "¿Desea instalar Zettlr Markdown Editor?" 8 60 + if [ $? -eq 0 ]; then + install_zettlr + else + echo -e "\n${head_info}: Instalación cancelada por el usuario." + fi + else + read -p "¿Desea instalar Zettlr Markdown Editor? (s/n): " CONFIRM + if [[ "$CONFIRM" =~ ^[Ss]$ ]]; then + install_zettlr + else + echo -e "\n${head_info}: Instalación cancelada por el usuario." + fi + fi + fi +fi + +echo -e "\n=== Proceso Finalizado ===" \ No newline at end of file