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