Compare commits
	
		
			No commits in common. "35c2216df36fc016b89e580c27dd48d4fda707e6" and "af32c0015a71c81c94225924183002ee6a08af12" have entirely different histories.
		
	
	
		
			35c2216df3
			...
			af32c0015a
		
	
		
					 9 changed files with 18 additions and 546 deletions
				
			
		
							
								
								
									
										35
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								CHANGELOG.md
									
									
									
									
									
								
							|  | @ -7,41 +7,6 @@ y el proyecto adhiere a [Semantic Versioning](https://semver.org/spec/v2.0.0.htm | |||
| 
 | ||||
| ## [Unreleased] | ||||
| 
 | ||||
| ## [1.3.0] - 2025-03-23 | ||||
| 
 | ||||
| ### Añadido | ||||
| - Nuevos scripts para gestión del servicio Ollama: | ||||
|   - `ollama_up.sh` para iniciar el servicio Ollama con podman-compose | ||||
|   - `ollama_down.sh` para detener el servicio Ollama | ||||
|   - `ollama.sh` cliente para interactuar con Ollama (auto-inicia el servicio si es necesario) | ||||
| - Nuevo script `nodered.sh` para administración completa de Node-RED: | ||||
|   - Soporte para iniciar, detener, reiniciar y verificar estado del servicio | ||||
|   - Instalación automática de dependencias y módulos comunes | ||||
|   - Monitoreo en tiempo real de logs y procesos | ||||
| - Script `vpn_check.sh` para verificar y mostrar información de conexiones VPN | ||||
| - Funciones en base.lib para detección de VPN: | ||||
|   - `is_connected_to_vpn()` para verificar si existe una conexión VPN activa | ||||
|   - `get_vpn_type()` para identificar el tipo específico de VPN (Pritunl, OpenVPN, etc.) | ||||
| - Sistema de mensajes internacionalizados para Node-RED con prefijo `nrmsg_` | ||||
| 
 | ||||
| ### Mejorado | ||||
| - Robustez en scripts de gestión de servicios con mejor manejo de errores | ||||
| - Verificación de package.json en proyectos Node.js y corrección automática si está vacío | ||||
| - Detección mejorada de procesos persistentes en servicios | ||||
| - Sistema de mensajes con prefijos específicos por herramienta para mejor organización | ||||
| - Documentación expandida sobre internacionalización y contribución | ||||
| 
 | ||||
| ### Corregido | ||||
| - Problemas al detener servicios Node-RED cuando el PID file no existe | ||||
| - Manejo de package.json vacío o inválido en proyectos Node.js | ||||
| - Detección de Pritunl VPN para distinguirlo correctamente de OpenVPN | ||||
| 
 | ||||
| ### Documentación | ||||
| - Adición de nuevas herramientas al README.md | ||||
| - Instrucciones para internacionalización de scripts | ||||
| - Actualización de componentes principales del sistema | ||||
| - Descripción del sistema de mensajes con prefijos específicos | ||||
| 
 | ||||
| ## [1.2.0] - 2025-03-19 | ||||
| 
 | ||||
| ### Añadido | ||||
|  |  | |||
							
								
								
									
										32
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								README.md
									
									
									
									
									
								
							|  | @ -2,13 +2,13 @@ | |||
| 
 | ||||
| <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.0-green.svg" alt="Version: 1.3.0"> | ||||
|   <img src="https://img.shields.io/badge/version-1.2.0-green.svg" alt="Version: 1.2.0"> | ||||
| </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/Shell-78%25-yellow.svg" alt="Shell: 78%"> | ||||
|   <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/Bash_Lib-15%25-orange.svg" alt="Bash Lib: 15%"> | ||||
|   <img src="https://img.shields.io/badge/Config-2%25-lightgrey.svg" alt="Config: 2%"> | ||||
| </p> | ||||
| 
 | ||||
|  | @ -70,7 +70,6 @@ bin/update.sh | |||
| | `bin/ollama_up.sh` | Inicia el servicio Ollama (IA local) con podman-compose | | ||||
| | `bin/ollama_down.sh` | Detiene el servicio Ollama (IA local) | | ||||
| | `bin/ollama.sh` | Cliente para interactuar con Ollama (auto-inicia el servicio si es necesario) | | ||||
| | `bin/nodered.sh` | Administra Node-RED con soporte para ejecución, monitoreo y gestión completa del servicio | | ||||
| 
 | ||||
| ### Herramientas para Editores de Código | ||||
| 
 | ||||
|  | @ -403,13 +402,11 @@ bin/ | |||
| ### Componentes Principales | ||||
| 
 | ||||
| - **Bibliotecas Base**: Conjunto de funciones reutilizables (`base.lib`, `bootstrap.lib`, `developers.lib`, `console.lib`, etc.) | ||||
| - **Sistema de Mensajes**: Soporte multilingüe para internacionalización con prefijos específicos por herramienta | ||||
| - **Sistema de Mensajes**: Soporte multilingüe para internacionalización | ||||
| - **Gestión de Configuración**: Archivos de configuración centralizados, plantillas .gitignore por tipo de proyecto | ||||
| - **Herramientas de Automatización**: Scripts y playbooks de Ansible | ||||
| - **Gestión de Servicios**: Administración de servicios locales como Node-RED, Ollama y más | ||||
| - **Creación de Proyectos**: Sistema estandarizado de plantillas para diversos tipos de proyectos | ||||
| - **Backup y Seguridad**: Herramientas para respaldar configuraciones de desarrollador | ||||
| - **Integración con IA**: Múltiples herramientas para trabajar con proveedores de IA, tokens y modelos locales | ||||
| 
 | ||||
| ## 💻 Compatibilidad | ||||
| 
 | ||||
|  | @ -426,7 +423,6 @@ El proyecto está diseñado para funcionar en múltiples sistemas operativos: | |||
| Para contribuir al proyecto: | ||||
| 
 | ||||
| 1. Asegúrese de seguir las convenciones de codificación | ||||
| 
 | ||||
| 2. Use los mensajes de commit con prefijos estándar: | ||||
|    - `[ADDED]` - Nueva funcionalidad añadida | ||||
|    - `[IMPROVED]` - Mejora en funcionalidad existente | ||||
|  | @ -436,21 +432,19 @@ Para contribuir al proyecto: | |||
|    - `[INIT]` - Inicialización de proyecto o componente | ||||
|    - `[REFACTORED]` - Reestructuración de código sin cambios funcionales | ||||
|    - `[MODIFIED]` - Cambios menores o ajustes | ||||
|     | ||||
| 3. Para scripts bash, use la plantilla de encabezado que está en `bin/config/bash.header`: | ||||
|    ```bash | ||||
|    #!/bin/bash | ||||
|    #Script     	: [Bash Script Name]  | ||||
|    #Apps			: MRDEVS TOOLS | ||||
|    #Description	: [Bash Script Description] | ||||
|    #Author			: [Bash Script Author] | ||||
|    #Company Email	: [Company Email Author's] | ||||
|    #Personal Email	: [Personal Email Author's] | ||||
|    #Created		: [Created Date/Time] | ||||
|    #Modified		: [Modified Date/Time] | ||||
|    #Version		: [Apps Version] | ||||
|    #Use Notes		: | ||||
|    # | ||||
|    # Script: nombre_archivo.sh | ||||
|    # Description: Breve descripción del script | ||||
|    # Created: YYYY/MM/DD HH:MM:SS | ||||
|    # Modified: YYYY/MM/DD HH:MM:SS | ||||
|    # [Author] Su Nombre <su.email@ejemplo.com> | ||||
|    # | ||||
|    # Derechos de Autor (C) [YYYY] [Su Nombre <su.email@ejemplo.com>] | ||||
|    ``` | ||||
| 4. Documente cualquier nueva funcionalidad añadida | ||||
| 
 | ||||
| ## 📄 Licencia | ||||
| 
 | ||||
|  |  | |||
|  | @ -1 +1 @@ | |||
| 1.3.0 | ||||
| 1.2.0 | ||||
|  |  | |||
|  | @ -11,66 +11,6 @@ | |||
| #============================================================================== | ||||
| #============================================================================== | ||||
| 
 | ||||
| # Mensajes para Node-RED | ||||
| nrmsg_000="GESTOR DE NODE-RED" | ||||
| nrmsg_001="Node-RED ya está en ejecución (PID %s)" | ||||
| nrmsg_002="Abre http://localhost:%s en tu navegador" | ||||
| nrmsg_003="Error: Node.js y npm son requeridos pero no están instalados." | ||||
| nrmsg_004="Instala Node.js con el comando: bin/npm_install.sh" | ||||
| nrmsg_005="ADVERTENCIA: Archivo package.json está vacío. Eliminándolo..." | ||||
| nrmsg_006="ADVERTENCIA: Archivo package.json contiene JSON inválido. Haciendo copia de seguridad..." | ||||
| nrmsg_007="Node-RED no está instalado. Instalando localmente..." | ||||
| nrmsg_008="Error al instalar Node-RED. Verifica tu conexión a internet." | ||||
| nrmsg_009="Iniciando Node-RED en el puerto %s..." | ||||
| nrmsg_010="Iniciando Node-RED (PID %s)..." | ||||
| nrmsg_011="Esperando a que el servicio esté disponible..." | ||||
| nrmsg_012="Node-RED iniciado correctamente." | ||||
| nrmsg_013="Node-RED parece estar tardando en iniciar. Verifica %s para más detalles." | ||||
| nrmsg_014="Si todo está bien, abre http://localhost:%s en tu navegador" | ||||
| nrmsg_015="Deteniendo Node-RED..." | ||||
| nrmsg_016="Buscando procesos Node-RED..." | ||||
| nrmsg_017="Terminando procesos Node-RED: %s" | ||||
| nrmsg_018="Enviando SIGTERM al proceso %s..." | ||||
| nrmsg_019="Algunos procesos persisten. Forzando terminación (SIGKILL)..." | ||||
| nrmsg_020="Forzando terminación del proceso %s..." | ||||
| nrmsg_021="ADVERTENCIA: Algunos procesos de Node-RED aún persisten: %s" | ||||
| nrmsg_022="Puede ser necesario reiniciar el sistema para liberarlos completamente." | ||||
| nrmsg_023="Usando archivo PID: %s" | ||||
| nrmsg_024="PID válido encontrado: %s" | ||||
| nrmsg_025="Archivo PID existe pero el proceso no está activo" | ||||
| nrmsg_026="ERROR: No se pudo detener completamente Node-RED." | ||||
| nrmsg_027="Verifique manualmente los procesos con: ps aux | grep node-red" | ||||
| nrmsg_028="Node-RED detenido correctamente." | ||||
| nrmsg_029="No se encontraron procesos de Node-RED en ejecución." | ||||
| nrmsg_030="Node-RED está en ejecución:" | ||||
| nrmsg_031="Node-RED está en ejecución, pero sin archivo PID correcto:" | ||||
| nrmsg_032="NOTA: Ejecute 'stop' y 'start' para regenerar el archivo PID correcto." | ||||
| nrmsg_033="Node-RED no está en ejecución." | ||||
| nrmsg_034="Reiniciando Node-RED..." | ||||
| nrmsg_035="Intento adicional %s: Forzando terminación de procesos persistentes..." | ||||
| nrmsg_036="ADVERTENCIA: No fue posible detener completamente Node-RED." | ||||
| nrmsg_037="Los nuevos procesos podrían comportarse de manera inesperada." | ||||
| nrmsg_038="Instalando dependencias de Node-RED..." | ||||
| nrmsg_039="ADVERTENCIA: Archivo package.json está vacío. Eliminándolo para una instalación limpia..." | ||||
| nrmsg_040="Inicializando package.json..." | ||||
| nrmsg_041="Instalando Node-RED..." | ||||
| nrmsg_042="Instalando módulos adicionales para Node-RED..." | ||||
| nrmsg_043="Node-RED instalado correctamente." | ||||
| nrmsg_044="ADVERTENCIA: Hubo problemas instalando Node-RED." | ||||
| nrmsg_045="Todas las dependencias instaladas. Use './nodered.sh start' para iniciar el servidor." | ||||
| nrmsg_046="Mostrando las últimas líneas del log (Ctrl+C para salir):" | ||||
| nrmsg_047="Contenido del archivo de log:" | ||||
| nrmsg_048="No hay archivo de log disponible." | ||||
| nrmsg_049="Node-RED Administración" | ||||
| nrmsg_050="Uso: %s {start|stop|restart|status|install|logs}" | ||||
| nrmsg_051="Comandos:" | ||||
| nrmsg_052="  start    - Inicia el servidor Node-RED" | ||||
| nrmsg_053="  stop     - Detiene el servidor Node-RED" | ||||
| nrmsg_054="  restart  - Reinicia el servidor Node-RED" | ||||
| nrmsg_055="  status   - Muestra el estado del servidor" | ||||
| nrmsg_056="  install  - Instala/actualiza Node-RED y dependencias comunes" | ||||
| nrmsg_057="  logs     - Muestra los logs en tiempo real" | ||||
| 
 | ||||
| # Mensajes para aider_install.sh | ||||
| aimsg_000="INSTALACIÓN DE AIDER" | ||||
| aimsg_001="Error: Python 3 no está instalado." | ||||
|  |  | |||
							
								
								
									
										427
									
								
								bin/nodered.sh
									
									
									
									
									
								
							
							
						
						
									
										427
									
								
								bin/nodered.sh
									
									
									
									
									
								
							|  | @ -1,427 +0,0 @@ | |||
| #!/bin/bash | ||||
| #Script     	: nodered.sh | ||||
| #Apps			: MRDEVS TOOLS | ||||
| #Description	: Inicia y Detiene el servicio de Nodered | ||||
| #Author			: Mauro Rosero Pérez | ||||
| #Company Email	: mauro@rosero.one | ||||
| #Personal Email	: mauro.rosero@gmail.com | ||||
| #Created		: 2024/12/01 15:27:00 | ||||
| #Modified		: 2025/03/19 11:57:08 | ||||
| #Version		: 1.3.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/>. | ||||
| 
 | ||||
| # Configuración inicial | ||||
| # Usar DEVELOPER_DIR de base.lib | ||||
| SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" | ||||
| BIN_BASE="bin" | ||||
| BIN_LIBS="lib" | ||||
| BIN_MESG="msg" | ||||
| BIN_CFGS="config" | ||||
| 
 | ||||
| # 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/$BIN_CFGS/devspath.dat") | ||||
| else | ||||
|   DEVSPATH="devs" | ||||
| fi | ||||
| 
 | ||||
| BIN_HOME="$HOME/$DEVSPATH" | ||||
| BIN_PATH=$BIN_HOME/$BIN_BASE | ||||
| VERSION=$(cat "$BIN_HOME/$BIN_BASE/$BIN_CFGS/version") | ||||
| 
 | ||||
| # CHECK SHELL LANGUAGE | ||||
| BIN_LANG=${LANG:0:2} | ||||
| 
 | ||||
| # Importar bibliotecas necesarias | ||||
| if [ -f "${BIN_HOME}/${BIN_BASE}/${BIN_LIBS}/base.lib" ]; then | ||||
|   source "${BIN_HOME}/${BIN_BASE}/${BIN_LIBS}/base.lib" | ||||
|   # Cargar mensajes en el idioma del sistema o español por defecto | ||||
|   load_messages "${BIN_HOME}/${BIN_BASE}" "${BIN_MESG}" "${BIN_LANG}" "head" | ||||
|   # Cargar mensajes específicos de NodeRED | ||||
|   load_messages "${BIN_HOME}/${BIN_BASE}" "${BIN_MESG}" "${BIN_LANG}" "developers" | ||||
|   title="${head_000} ${head_002} - ${nrmsg_000}" | ||||
| fi | ||||
| 
 | ||||
| # Verificar si es un proyecto de desarrollo y de tipo NodeJS | ||||
| if [ ! -f "$PWD/.protype" ]; then | ||||
|   echo "${head_noproject}" | ||||
|   exit 1 | ||||
| fi | ||||
| 
 | ||||
| if [ "$(cat "$PWD/.protype")" != "nodejs" ]; then | ||||
|   echo "${head_002} ${head_warning}: Este script está diseñado para proyectos NodeJS." | ||||
|   read -p "¿Desea continuar de todos modos? (s/N): " CONTINUE | ||||
|   if [[ ! "$CONTINUE" =~ ^[Ss]$ ]]; then | ||||
|     echo "Operación cancelada." | ||||
|     exit 1 | ||||
|   fi | ||||
| fi | ||||
| 
 | ||||
| # Configuración de Node-RED | ||||
| NODE_RED_DIR="$PWD" | ||||
| NODE_RED_DATA="$NODE_RED_DIR/.node-red" | ||||
| NODE_RED_PORT=${NODE_RED_PORT:-1880} | ||||
| NODE_RED_CMD="npx node-red -u $NODE_RED_DATA -p $NODE_RED_PORT" | ||||
| PID_FILE="$NODE_RED_DIR/nodered.pid" | ||||
| LOG_FILE="$NODE_RED_DIR/nodered.log" | ||||
| CONFIG_FILE="$NODE_RED_DATA/settings.js" | ||||
| 
 | ||||
| # Crear directorio de datos si no existe | ||||
| mkdir -p "$NODE_RED_DATA" 2>/dev/null | ||||
| 
 | ||||
| start() { | ||||
|     if [ -f "$PID_FILE" ] && kill -0 "$(cat $PID_FILE)" 2>/dev/null; then | ||||
|         printf "${nrmsg_001}\n" "$(cat $PID_FILE)" | ||||
|         printf "${nrmsg_002}\n" "$NODE_RED_PORT" | ||||
|         exit 1 | ||||
|     fi | ||||
| 
 | ||||
|     # Verificar si Node.js y npm están instalados | ||||
|     if ! command -v node &> /dev/null || ! command -v npm &> /dev/null; then | ||||
|         echo "Error: Node.js y npm son requeridos pero no están instalados." | ||||
|         echo "Instala Node.js con el comando: bin/npm_install.sh" | ||||
|         exit 1 | ||||
|     fi | ||||
|      | ||||
|     # Verificar package.json y corregirlo si está vacío o dañado | ||||
|     if [ -f "package.json" ]; then | ||||
|         # Verificar si package.json está vacío o solo contiene espacios/saltos de línea | ||||
|         if [ ! -s "package.json" ] || [ "$(cat package.json | tr -d '[:space:]')" = "" ]; then | ||||
|             echo "ADVERTENCIA: Archivo package.json está vacío. Eliminándolo..." | ||||
|             rm -f "package.json" | ||||
|         else | ||||
|             # Verificar si el archivo es un JSON válido | ||||
|             if ! node -e "try { require('./package.json'); process.exit(0); } catch(e) { console.error('JSON inválido:', e.message); process.exit(1); }" 2>/dev/null; then | ||||
|                 echo "ADVERTENCIA: Archivo package.json contiene JSON inválido. Haciendo copia de seguridad y eliminándolo..." | ||||
|                 mv "package.json" "package.json.bak.$(date +%Y%m%d%H%M%S)" | ||||
|             fi | ||||
|         fi | ||||
|     fi | ||||
|      | ||||
|     # Verificar si node-red está disponible localmente | ||||
|     if ! npm list -g node-red &> /dev/null && ! npm list node-red &> /dev/null; then | ||||
|         echo "Node-RED no está instalado. Instalando localmente..." | ||||
|         npm install --save node-red | ||||
|         if [ $? -ne 0 ]; then | ||||
|             echo "Error al instalar Node-RED. Verifica tu conexión a internet." | ||||
|             exit 1 | ||||
|         fi | ||||
|     fi | ||||
| 
 | ||||
|     echo "Iniciando Node-RED en el puerto $NODE_RED_PORT..." | ||||
|     mkdir -p "$NODE_RED_DATA" | ||||
|     nohup $NODE_RED_CMD > "$LOG_FILE" 2>&1 & | ||||
|     echo $! > "$PID_FILE" | ||||
|      | ||||
|     # Esperar a que Node-RED esté listo | ||||
|     echo "Iniciando Node-RED (PID $(cat $PID_FILE))..." | ||||
|     echo "Esperando a que el servicio esté disponible..." | ||||
|      | ||||
|     for i in {1..30}; do | ||||
|         if grep -q "Server now running" "$LOG_FILE" 2>/dev/null; then | ||||
|             echo "Node-RED iniciado correctamente." | ||||
|             echo "Abre http://localhost:$NODE_RED_PORT en tu navegador" | ||||
|             return 0 | ||||
|         fi | ||||
|         sleep 1 | ||||
|         echo -n "." | ||||
|     done | ||||
|      | ||||
|     echo "" | ||||
|     echo "Node-RED parece estar tardando en iniciar. Verifica $LOG_FILE para más detalles." | ||||
|     echo "Si todo está bien, abre http://localhost:$NODE_RED_PORT en tu navegador" | ||||
| } | ||||
| 
 | ||||
| stop() { | ||||
|     # Variable para seguir si se detectaron procesos | ||||
|     local found_processes=0 | ||||
|      | ||||
|     echo "Deteniendo Node-RED..." | ||||
|      | ||||
|     # Matar todos los procesos recursivamente y de forma agresiva | ||||
|     kill_all_nodered() { | ||||
|         echo "Buscando procesos Node-RED..." | ||||
|          | ||||
|         # Buscar todos los procesos relacionados con Node-RED | ||||
|         local NR_PIDS=$(pgrep -f "node-red" 2>/dev/null || echo "") | ||||
|          | ||||
|         # Si no se encontraron procesos | ||||
|         if [ -z "$NR_PIDS" ]; then | ||||
|             return 1 | ||||
|         fi | ||||
|          | ||||
|         # Procesar cada PID encontrado | ||||
|         found_processes=1 | ||||
|         echo "Terminando procesos Node-RED: $NR_PIDS" | ||||
|          | ||||
|         # Primera pasada: intento amigable (SIGTERM) | ||||
|         for pid in $NR_PIDS; do | ||||
|             echo "Enviando SIGTERM al proceso $pid..." | ||||
|             kill $pid 2>/dev/null | ||||
|         done | ||||
|          | ||||
|         # Esperar un momento | ||||
|         sleep 2 | ||||
|          | ||||
|         # Segunda pasada: verificar y forzar si es necesario | ||||
|         local REMAINING_PIDS=$(pgrep -f "node-red" 2>/dev/null || echo "") | ||||
|         if [ -n "$REMAINING_PIDS" ]; then | ||||
|             echo "Algunos procesos persisten. Forzando terminación (SIGKILL)..." | ||||
|             for pid in $REMAINING_PIDS; do | ||||
|                 echo "Forzando terminación del proceso $pid..." | ||||
|                 kill -9 $pid 2>/dev/null | ||||
|             done | ||||
|              | ||||
|             # Esperar un poco más | ||||
|             sleep 1 | ||||
|              | ||||
|             # Verificación final | ||||
|             local FINAL_CHECK=$(pgrep -f "node-red" 2>/dev/null || echo "") | ||||
|             if [ -n "$FINAL_CHECK" ]; then | ||||
|                 echo "ADVERTENCIA: Algunos procesos de Node-RED aún persisten: $FINAL_CHECK" | ||||
|                 echo "Puede ser necesario reiniciar el sistema para liberarlos completamente." | ||||
|                 return 2 | ||||
|             fi | ||||
|         fi | ||||
|          | ||||
|         return 0 | ||||
|     } | ||||
|      | ||||
|     # Verificar primero si el archivo PID existe | ||||
|     if [ -f "$PID_FILE" ]; then | ||||
|         echo "Usando archivo PID: $PID_FILE" | ||||
|         if kill -0 "$(cat $PID_FILE)" 2>/dev/null; then | ||||
|             local PID=$(cat "$PID_FILE") | ||||
|             echo "PID válido encontrado: $PID" | ||||
|              | ||||
|             # Enviar señal SIGTERM para terminar amigablemente | ||||
|             kill $PID 2>/dev/null | ||||
|             found_processes=1 | ||||
|              | ||||
|             # Esperar brevemente | ||||
|             sleep 2 | ||||
|         else | ||||
|             echo "Archivo PID existe pero el proceso no está activo" | ||||
|         fi | ||||
|          | ||||
|         # Eliminar el archivo PID en cualquier caso | ||||
|         rm -f "$PID_FILE" | ||||
|     fi | ||||
|      | ||||
|     # Buscar y matar todos los procesos de Node-RED | ||||
|     kill_all_nodered | ||||
|      | ||||
|     # Usar pkill como último recurso | ||||
|     pkill -9 -f "node-red" 2>/dev/null | ||||
|      | ||||
|     # Verificación final y mensaje | ||||
|     if pgrep -f "node-red" > /dev/null; then | ||||
|         echo "ERROR: No se pudo detener completamente Node-RED." | ||||
|         echo "Verifique manualmente los procesos con: ps aux | grep node-red" | ||||
|         return 1 | ||||
|     elif [ $found_processes -eq 1 ]; then | ||||
|         echo "Node-RED detenido correctamente." | ||||
|         return 0 | ||||
|     else | ||||
|         echo "No se encontraron procesos de Node-RED en ejecución." | ||||
|         return 1 | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| status() { | ||||
|     # Primera verificación: archivo PID existe y el proceso está en ejecución | ||||
|     if [ -f "$PID_FILE" ] && kill -0 "$(cat $PID_FILE)" 2>/dev/null; then | ||||
|         echo "Node-RED está en ejecución:" | ||||
|         echo "  - PID: $(cat $PID_FILE)" | ||||
|         echo "  - URL: http://localhost:$NODE_RED_PORT" | ||||
|         echo "  - Directorio de datos: $NODE_RED_DATA" | ||||
|         echo "  - Archivo de log: $LOG_FILE" | ||||
|          | ||||
|         # Mostrar tiempo de ejecución si está disponible | ||||
|         if command -v ps &>/dev/null; then | ||||
|             local start_time=$(ps -p $(cat $PID_FILE) -o lstart= 2>/dev/null) | ||||
|             [ -n "$start_time" ] && echo "  - Iniciado: $start_time" | ||||
|         fi | ||||
|          | ||||
|         # Verificar si el servicio está realmente respondiendo | ||||
|         if command -v curl &>/dev/null; then | ||||
|             if curl -s "http://localhost:$NODE_RED_PORT" >/dev/null; then | ||||
|                 echo "  - Estado: Respondiendo" | ||||
|             else | ||||
|                 echo "  - Estado: Proceso en ejecución pero no responde HTTP" | ||||
|             fi | ||||
|         fi | ||||
|         return 0 | ||||
|     fi | ||||
|      | ||||
|     # Segunda verificación: buscar procesos de Node-RED sin archivo PID | ||||
|     local NR_PIDS=$(pgrep -f "node-red" | tr "\n" " ") | ||||
|      | ||||
|     if [ -n "$NR_PIDS" ]; then | ||||
|         echo "Node-RED está en ejecución, pero sin archivo PID correcto:" | ||||
|          | ||||
|         for pid in $NR_PIDS; do | ||||
|             echo "  - PID: $pid" | ||||
|              | ||||
|             # Mostrar información adicional si está disponible | ||||
|             if command -v ps &>/dev/null; then | ||||
|                 local cmd_line=$(ps -p $pid -o cmd= 2>/dev/null) | ||||
|                 [ -n "$cmd_line" ] && echo "  - Comando: $cmd_line" | ||||
|                  | ||||
|                 local start_time=$(ps -p $pid -o lstart= 2>/dev/null) | ||||
|                 [ -n "$start_time" ] && echo "  - Iniciado: $start_time" | ||||
|             fi | ||||
|         done | ||||
|          | ||||
|         echo "  - URL: http://localhost:$NODE_RED_PORT (probable)" | ||||
|          | ||||
|         # Verificar si el servicio está realmente respondiendo | ||||
|         if command -v curl &>/dev/null; then | ||||
|             if curl -s "http://localhost:$NODE_RED_PORT" >/dev/null; then | ||||
|                 echo "  - Estado: Respondiendo" | ||||
|             else | ||||
|                 echo "  - Estado: Proceso en ejecución pero no responde HTTP" | ||||
|             fi | ||||
|         fi | ||||
|          | ||||
|         echo "NOTA: Ejecute 'stop' y 'start' para regenerar el archivo PID correcto." | ||||
|         return 0 | ||||
|     fi | ||||
|      | ||||
|     # Si no se encontró ningún proceso | ||||
|     echo "Node-RED no está en ejecución." | ||||
|     # Limpiar archivos PID huérfanos si existen | ||||
|     [ -f "$PID_FILE" ] && rm -f "$PID_FILE" | ||||
|     return 1 | ||||
| } | ||||
| 
 | ||||
| restart() { | ||||
|     echo "Reiniciando Node-RED..." | ||||
|      | ||||
|     # Forzar detención completa | ||||
|     stop | ||||
|      | ||||
|     # Verificación adicional y limpieza | ||||
|     for i in {1..3}; do | ||||
|         if pgrep -f "node-red" > /dev/null; then | ||||
|             echo "Intento adicional $i: Forzando terminación de procesos persistentes..." | ||||
|             pkill -9 -f "node-red" 2>/dev/null | ||||
|             sleep 2 | ||||
|         else | ||||
|             break | ||||
|         fi | ||||
|     done | ||||
|      | ||||
|     # Comprobar una última vez | ||||
|     if pgrep -f "node-red" > /dev/null; then | ||||
|         echo "ADVERTENCIA: No fue posible detener completamente Node-RED." | ||||
|         echo "Los nuevos procesos podrían comportarse de manera inesperada." | ||||
|     fi | ||||
|      | ||||
|     # Limpiar cualquier archivo temporal o socket que pudiera causar problemas | ||||
|     rm -f /tmp/node-red-*.sock 2>/dev/null | ||||
|      | ||||
|     # Esperar a que el sistema se estabilice | ||||
|     sleep 3 | ||||
|      | ||||
|     # Iniciar Node-RED | ||||
|     start | ||||
| } | ||||
| 
 | ||||
| install_deps() { | ||||
|     echo "Instalando dependencias de Node-RED..." | ||||
|      | ||||
|     # Verificar si Node.js y npm están instalados | ||||
|     if ! command -v node &> /dev/null || ! command -v npm &> /dev/null; then | ||||
|         echo "Error: Node.js y npm son requeridos pero no están instalados." | ||||
|         echo "Instala Node.js con el comando: bin/npm_install.sh" | ||||
|         exit 1 | ||||
|     fi | ||||
|      | ||||
|     # Verificar y corregir package.json si es necesario | ||||
|     if [ -f "package.json" ]; then | ||||
|         # Verificar si package.json está vacío o solo contiene espacios/saltos de línea | ||||
|         if [ ! -s "package.json" ] || [ "$(cat package.json | tr -d '[:space:]')" = "" ]; then | ||||
|             echo "ADVERTENCIA: Archivo package.json está vacío. Eliminándolo para una instalación limpia..." | ||||
|             rm -f "package.json" | ||||
|         else | ||||
|             # Verificar si el archivo es un JSON válido | ||||
|             if ! node -e "try { require('./package.json'); process.exit(0); } catch(e) { process.exit(1); }" 2>/dev/null; then | ||||
|                 echo "ADVERTENCIA: Archivo package.json contiene JSON inválido. Haciendo copia de seguridad..." | ||||
|                 mv "package.json" "package.json.bak.$(date +%Y%m%d%H%M%S)" | ||||
|             fi | ||||
|         fi | ||||
|     fi | ||||
|      | ||||
|     # Inicializar package.json si no existe | ||||
|     if [ ! -f "package.json" ]; then | ||||
|         echo "Inicializando package.json..." | ||||
|         npm init -y | ||||
|     fi | ||||
|      | ||||
|     # Instalar o actualizar Node-RED | ||||
|     echo "Instalando Node-RED..." | ||||
|     npm install --save node-red | ||||
|      | ||||
|     # Instalar paquetes comunes útiles para IoT | ||||
|     echo "Instalando módulos adicionales para Node-RED..." | ||||
|     npm install --save node-red-dashboard node-red-node-serialport node-red-contrib-mqtt-broker | ||||
|      | ||||
|     # Verificar si las instalaciones fueron exitosas | ||||
|     if npm list node-red | grep -q "node-red"; then | ||||
|         echo "Node-RED instalado correctamente." | ||||
|     else | ||||
|         echo "ADVERTENCIA: Hubo problemas instalando Node-RED." | ||||
|     fi | ||||
|      | ||||
|     echo "Todas las dependencias instaladas. Use './nodered.sh start' para iniciar el servidor." | ||||
| } | ||||
| 
 | ||||
| logs() { | ||||
|     if [ -f "$LOG_FILE" ]; then | ||||
|         if command -v tail &>/dev/null; then | ||||
|             echo "Mostrando las últimas líneas del log (Ctrl+C para salir):" | ||||
|             tail -f "$LOG_FILE" | ||||
|         else | ||||
|             echo "Contenido del archivo de log:" | ||||
|             cat "$LOG_FILE" | ||||
|         fi | ||||
|     else | ||||
|         echo "No hay archivo de log disponible." | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| case "$1" in | ||||
|     start) start ;; | ||||
|     stop) stop ;; | ||||
|     restart) restart ;; | ||||
|     status) status ;; | ||||
|     install) install_deps ;; | ||||
|     logs) logs ;; | ||||
|     *)  | ||||
|         echo "Node-RED Administración" | ||||
|         echo "Uso: $0 {start|stop|restart|status|install|logs}" | ||||
|         echo "" | ||||
|         echo "Comandos:" | ||||
|         echo "  start    - Inicia el servidor Node-RED" | ||||
|         echo "  stop     - Detiene el servidor Node-RED" | ||||
|         echo "  restart  - Reinicia el servidor Node-RED" | ||||
|         echo "  status   - Muestra el estado del servidor" | ||||
|         echo "  install  - Instala/actualiza Node-RED y dependencias comunes" | ||||
|         echo "  logs     - Muestra los logs en tiempo real" | ||||
|         ;; | ||||
| esac | ||||
|  | @ -7,7 +7,7 @@ | |||
| #Personal Email	: mauro.rosero@gmail.com | ||||
| #Created		: 2024/12/01 15:27:00 | ||||
| #Modified		: 2025/03/19 11:57:08 | ||||
| #Version		: 1.3.0 | ||||
| #Version		: 1.2.0 | ||||
| #============================================================================== | ||||
| # Derechos de Autor [2025] [Mauro Rosero P. <mauro@rosero.one>] | ||||
| #============================================================================== | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ | |||
| #Personal Email	: mauro.rosero@gmail.com | ||||
| #Created		: 2025/03/21 19:27:08 | ||||
| #Modified		: 2025/03/21 19:27:08 | ||||
| #Version		: 1.3.0 | ||||
| #Version		: 1.2.0 | ||||
| #============================================================================== | ||||
| # Derechos de Autor [2025] [Mauro Rosero P. <mauro@rosero.one>] | ||||
| #============================================================================== | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ | |||
| #Personal Email	: mauro.rosero@gmail.com | ||||
| #Created		: 2025/03/21 19:27:08 | ||||
| #Modified		: 2025/03/21 19:27:08 | ||||
| #Version		: 1.3.0 | ||||
| #Version		: 1.2.0 | ||||
| #============================================================================== | ||||
| # Derechos de Autor [2025] [Mauro Rosero P. <mauro@rosero.one>] | ||||
| #============================================================================== | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ | |||
| #Personal Email	: mauro.rosero@gmail.com | ||||
| #Created		: 2025/03/22 14:57:08 | ||||
| #Modified		: 2025/03/22 14:57:08 | ||||
| #Version		: 1.3.0 | ||||
| #Version		: 1.2.0 | ||||
| #============================================================================== | ||||
| # Derechos de Autor [2025] [Mauro Rosero P. <mauro@rosero.one>] | ||||
| #============================================================================== | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue