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] | ## [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 | ## [1.2.0] - 2025-03-19 | ||||||
| 
 | 
 | ||||||
| ### Añadido | ### Añadido | ||||||
|  |  | ||||||
							
								
								
									
										32
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								README.md
									
									
									
									
									
								
							|  | @ -2,13 +2,13 @@ | ||||||
| 
 | 
 | ||||||
| <p align="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/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> | ||||||
| 
 | 
 | ||||||
| <p align="center"> | <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/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%"> |   <img src="https://img.shields.io/badge/Config-2%25-lightgrey.svg" alt="Config: 2%"> | ||||||
| </p> | </p> | ||||||
| 
 | 
 | ||||||
|  | @ -70,7 +70,6 @@ bin/update.sh | ||||||
| | `bin/ollama_up.sh` | Inicia el servicio Ollama (IA local) con podman-compose | | | `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_down.sh` | Detiene el servicio Ollama (IA local) | | ||||||
| | `bin/ollama.sh` | Cliente para interactuar con Ollama (auto-inicia el servicio si es necesario) | | | `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 | ### Herramientas para Editores de Código | ||||||
| 
 | 
 | ||||||
|  | @ -403,13 +402,11 @@ bin/ | ||||||
| ### Componentes Principales | ### Componentes Principales | ||||||
| 
 | 
 | ||||||
| - **Bibliotecas Base**: Conjunto de funciones reutilizables (`base.lib`, `bootstrap.lib`, `developers.lib`, `console.lib`, etc.) | - **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 | - **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 | - **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 | - **Creación de Proyectos**: Sistema estandarizado de plantillas para diversos tipos de proyectos | ||||||
| - **Backup y Seguridad**: Herramientas para respaldar configuraciones de desarrollador | - **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 | ## 💻 Compatibilidad | ||||||
| 
 | 
 | ||||||
|  | @ -426,7 +423,6 @@ El proyecto está diseñado para funcionar en múltiples sistemas operativos: | ||||||
| Para contribuir al proyecto: | Para contribuir al proyecto: | ||||||
| 
 | 
 | ||||||
| 1. Asegúrese de seguir las convenciones de codificación | 1. Asegúrese de seguir las convenciones de codificación | ||||||
| 
 |  | ||||||
| 2. Use los mensajes de commit con prefijos estándar: | 2. Use los mensajes de commit con prefijos estándar: | ||||||
|    - `[ADDED]` - Nueva funcionalidad añadida |    - `[ADDED]` - Nueva funcionalidad añadida | ||||||
|    - `[IMPROVED]` - Mejora en funcionalidad existente |    - `[IMPROVED]` - Mejora en funcionalidad existente | ||||||
|  | @ -436,21 +432,19 @@ Para contribuir al proyecto: | ||||||
|    - `[INIT]` - Inicialización de proyecto o componente |    - `[INIT]` - Inicialización de proyecto o componente | ||||||
|    - `[REFACTORED]` - Reestructuración de código sin cambios funcionales |    - `[REFACTORED]` - Reestructuración de código sin cambios funcionales | ||||||
|    - `[MODIFIED]` - Cambios menores o ajustes |    - `[MODIFIED]` - Cambios menores o ajustes | ||||||
|     |  | ||||||
| 3. Para scripts bash, use la plantilla de encabezado que está en `bin/config/bash.header`: | 3. Para scripts bash, use la plantilla de encabezado que está en `bin/config/bash.header`: | ||||||
|    ```bash |    ```bash | ||||||
|    #!/bin/bash |    #!/bin/bash | ||||||
|    #Script     	: [Bash Script Name]  |    # | ||||||
|    #Apps			: MRDEVS TOOLS |    # Script: nombre_archivo.sh | ||||||
|    #Description	: [Bash Script Description] |    # Description: Breve descripción del script | ||||||
|    #Author			: [Bash Script Author] |    # Created: YYYY/MM/DD HH:MM:SS | ||||||
|    #Company Email	: [Company Email Author's] |    # Modified: YYYY/MM/DD HH:MM:SS | ||||||
|    #Personal Email	: [Personal Email Author's] |    # [Author] Su Nombre <su.email@ejemplo.com> | ||||||
|    #Created		: [Created Date/Time] |    # | ||||||
|    #Modified		: [Modified Date/Time] |    # Derechos de Autor (C) [YYYY] [Su Nombre <su.email@ejemplo.com>] | ||||||
|    #Version		: [Apps Version] |  | ||||||
|    #Use Notes		: |  | ||||||
|    ``` |    ``` | ||||||
|  | 4. Documente cualquier nueva funcionalidad añadida | ||||||
| 
 | 
 | ||||||
| ## 📄 Licencia | ## 📄 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 | # Mensajes para aider_install.sh | ||||||
| aimsg_000="INSTALACIÓN DE AIDER" | aimsg_000="INSTALACIÓN DE AIDER" | ||||||
| aimsg_001="Error: Python 3 no está instalado." | 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 | #Personal Email	: mauro.rosero@gmail.com | ||||||
| #Created		: 2024/12/01 15:27:00 | #Created		: 2024/12/01 15:27:00 | ||||||
| #Modified		: 2025/03/19 11:57:08 | #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>] | # Derechos de Autor [2025] [Mauro Rosero P. <mauro@rosero.one>] | ||||||
| #============================================================================== | #============================================================================== | ||||||
|  |  | ||||||
|  | @ -7,7 +7,7 @@ | ||||||
| #Personal Email	: mauro.rosero@gmail.com | #Personal Email	: mauro.rosero@gmail.com | ||||||
| #Created		: 2025/03/21 19:27:08 | #Created		: 2025/03/21 19:27:08 | ||||||
| #Modified		: 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>] | # Derechos de Autor [2025] [Mauro Rosero P. <mauro@rosero.one>] | ||||||
| #============================================================================== | #============================================================================== | ||||||
|  |  | ||||||
|  | @ -7,7 +7,7 @@ | ||||||
| #Personal Email	: mauro.rosero@gmail.com | #Personal Email	: mauro.rosero@gmail.com | ||||||
| #Created		: 2025/03/21 19:27:08 | #Created		: 2025/03/21 19:27:08 | ||||||
| #Modified		: 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>] | # Derechos de Autor [2025] [Mauro Rosero P. <mauro@rosero.one>] | ||||||
| #============================================================================== | #============================================================================== | ||||||
|  |  | ||||||
|  | @ -7,7 +7,7 @@ | ||||||
| #Personal Email	: mauro.rosero@gmail.com | #Personal Email	: mauro.rosero@gmail.com | ||||||
| #Created		: 2025/03/22 14:57:08 | #Created		: 2025/03/22 14:57:08 | ||||||
| #Modified		: 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>] | # Derechos de Autor [2025] [Mauro Rosero P. <mauro@rosero.one>] | ||||||
| #============================================================================== | #============================================================================== | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue