Compare commits
	
		
			9 commits
		
	
	
		
			af32c0015a
			...
			35c2216df3
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 35c2216df3 | |||
| cc39859c40 | |||
| 79aeb54260 | |||
| 2af72ba7f3 | |||
| 2b9a62eb8a | |||
| fa0a5563c5 | |||
| 89daa56b46 | |||
| 5310adb62c | |||
| 56fc09621c | 
					 9 changed files with 546 additions and 18 deletions
				
			
		
							
								
								
									
										35
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								CHANGELOG.md
									
									
									
									
									
								
							|  | @ -7,6 +7,41 @@ 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.2.0-green.svg" alt="Version: 1.2.0"> |   <img src="https://img.shields.io/badge/version-1.3.0-green.svg" alt="Version: 1.3.0"> | ||||||
| </p> | </p> | ||||||
| 
 | 
 | ||||||
| <p align="center"> | <p align="center"> | ||||||
|   <img src="https://img.shields.io/badge/Shell-78%25-yellow.svg" alt="Shell: 78%"> |   <img src="https://img.shields.io/badge/Shell-80%25-yellow.svg" alt="Shell: 80%"> | ||||||
|   <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-15%25-orange.svg" alt="Bash Lib: 15%"> |   <img src="https://img.shields.io/badge/Bash_Lib-13%25-orange.svg" alt="Bash Lib: 13%"> | ||||||
|   <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,6 +70,7 @@ 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 | ||||||
| 
 | 
 | ||||||
|  | @ -402,11 +403,13 @@ 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 | - **Sistema de Mensajes**: Soporte multilingüe para internacionalización con prefijos específicos por herramienta | ||||||
| - **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 | ||||||
| 
 | 
 | ||||||
|  | @ -423,6 +426,7 @@ 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 | ||||||
|  | @ -432,19 +436,21 @@ 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]  | ||||||
|    # Script: nombre_archivo.sh |    #Apps			: MRDEVS TOOLS | ||||||
|    # Description: Breve descripción del script |    #Description	: [Bash Script Description] | ||||||
|    # Created: YYYY/MM/DD HH:MM:SS |    #Author			: [Bash Script Author] | ||||||
|    # Modified: YYYY/MM/DD HH:MM:SS |    #Company Email	: [Company Email Author's] | ||||||
|    # [Author] Su Nombre <su.email@ejemplo.com> |    #Personal Email	: [Personal Email Author's] | ||||||
|    # |    #Created		: [Created Date/Time] | ||||||
|    # Derechos de Autor (C) [YYYY] [Su Nombre <su.email@ejemplo.com>] |    #Modified		: [Modified Date/Time] | ||||||
|  |    #Version		: [Apps Version] | ||||||
|  |    #Use Notes		: | ||||||
|    ``` |    ``` | ||||||
| 4. Documente cualquier nueva funcionalidad añadida |  | ||||||
| 
 | 
 | ||||||
| ## 📄 Licencia | ## 📄 Licencia | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1 +1 @@ | ||||||
| 1.2.0 | 1.3.0 | ||||||
|  |  | ||||||
|  | @ -11,6 +11,66 @@ | ||||||
| #============================================================================== | #============================================================================== | ||||||
| #============================================================================== | #============================================================================== | ||||||
| 
 | 
 | ||||||
|  | # 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
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										427
									
								
								bin/nodered.sh
									
									
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,427 @@ | ||||||
|  | #!/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.2.0 | #Version		: 1.3.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.2.0 | #Version		: 1.3.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.2.0 | #Version		: 1.3.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.2.0 | #Version		: 1.3.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