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]
|
||||
|
||||
## [1.3.0] - 2025-03-23
|
||||
|
||||
### Añadido
|
||||
- Nuevos scripts para gestión del servicio Ollama:
|
||||
- `ollama_up.sh` para iniciar el servicio Ollama con podman-compose
|
||||
- `ollama_down.sh` para detener el servicio Ollama
|
||||
- `ollama.sh` cliente para interactuar con Ollama (auto-inicia el servicio si es necesario)
|
||||
- Nuevo script `nodered.sh` para administración completa de Node-RED:
|
||||
- Soporte para iniciar, detener, reiniciar y verificar estado del servicio
|
||||
- Instalación automática de dependencias y módulos comunes
|
||||
- Monitoreo en tiempo real de logs y procesos
|
||||
- Script `vpn_check.sh` para verificar y mostrar información de conexiones VPN
|
||||
- Funciones en base.lib para detección de VPN:
|
||||
- `is_connected_to_vpn()` para verificar si existe una conexión VPN activa
|
||||
- `get_vpn_type()` para identificar el tipo específico de VPN (Pritunl, OpenVPN, etc.)
|
||||
- Sistema de mensajes internacionalizados para Node-RED con prefijo `nrmsg_`
|
||||
|
||||
### Mejorado
|
||||
- Robustez en scripts de gestión de servicios con mejor manejo de errores
|
||||
- Verificación de package.json en proyectos Node.js y corrección automática si está vacío
|
||||
- Detección mejorada de procesos persistentes en servicios
|
||||
- Sistema de mensajes con prefijos específicos por herramienta para mejor organización
|
||||
- Documentación expandida sobre internacionalización y contribución
|
||||
|
||||
### Corregido
|
||||
- Problemas al detener servicios Node-RED cuando el PID file no existe
|
||||
- Manejo de package.json vacío o inválido en proyectos Node.js
|
||||
- Detección de Pritunl VPN para distinguirlo correctamente de OpenVPN
|
||||
|
||||
### Documentación
|
||||
- Adición de nuevas herramientas al README.md
|
||||
- Instrucciones para internacionalización de scripts
|
||||
- Actualización de componentes principales del sistema
|
||||
- Descripción del sistema de mensajes con prefijos específicos
|
||||
|
||||
## [1.2.0] - 2025-03-19
|
||||
|
||||
### Añadido
|
||||
|
|
32
README.md
32
README.md
|
@ -2,13 +2,13 @@
|
|||
|
||||
<p align="center">
|
||||
<img src="https://img.shields.io/badge/License-AGPL--3.0-blue.svg" alt="License: AGPL-3.0">
|
||||
<img src="https://img.shields.io/badge/version-1.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 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/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%">
|
||||
</p>
|
||||
|
||||
|
@ -70,6 +70,7 @@ bin/update.sh
|
|||
| `bin/ollama_up.sh` | Inicia el servicio Ollama (IA local) con podman-compose |
|
||||
| `bin/ollama_down.sh` | Detiene el servicio Ollama (IA local) |
|
||||
| `bin/ollama.sh` | Cliente para interactuar con Ollama (auto-inicia el servicio si es necesario) |
|
||||
| `bin/nodered.sh` | Administra Node-RED con soporte para ejecución, monitoreo y gestión completa del servicio |
|
||||
|
||||
### Herramientas para Editores de Código
|
||||
|
||||
|
@ -402,11 +403,13 @@ bin/
|
|||
### Componentes Principales
|
||||
|
||||
- **Bibliotecas Base**: Conjunto de funciones reutilizables (`base.lib`, `bootstrap.lib`, `developers.lib`, `console.lib`, etc.)
|
||||
- **Sistema de Mensajes**: Soporte multilingüe para internacionalización
|
||||
- **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
|
||||
- **Herramientas de Automatización**: Scripts y playbooks de Ansible
|
||||
- **Gestión de Servicios**: Administración de servicios locales como Node-RED, Ollama y más
|
||||
- **Creación de Proyectos**: Sistema estandarizado de plantillas para diversos tipos de proyectos
|
||||
- **Backup y Seguridad**: Herramientas para respaldar configuraciones de desarrollador
|
||||
- **Integración con IA**: Múltiples herramientas para trabajar con proveedores de IA, tokens y modelos locales
|
||||
|
||||
## 💻 Compatibilidad
|
||||
|
||||
|
@ -423,6 +426,7 @@ El proyecto está diseñado para funcionar en múltiples sistemas operativos:
|
|||
Para contribuir al proyecto:
|
||||
|
||||
1. Asegúrese de seguir las convenciones de codificación
|
||||
|
||||
2. Use los mensajes de commit con prefijos estándar:
|
||||
- `[ADDED]` - Nueva funcionalidad añadida
|
||||
- `[IMPROVED]` - Mejora en funcionalidad existente
|
||||
|
@ -432,19 +436,21 @@ Para contribuir al proyecto:
|
|||
- `[INIT]` - Inicialización de proyecto o componente
|
||||
- `[REFACTORED]` - Reestructuración de código sin cambios funcionales
|
||||
- `[MODIFIED]` - Cambios menores o ajustes
|
||||
|
||||
3. Para scripts bash, use la plantilla de encabezado que está en `bin/config/bash.header`:
|
||||
```bash
|
||||
#!/bin/bash
|
||||
#
|
||||
# Script: nombre_archivo.sh
|
||||
# Description: Breve descripción del script
|
||||
# Created: YYYY/MM/DD HH:MM:SS
|
||||
# Modified: YYYY/MM/DD HH:MM:SS
|
||||
# [Author] Su Nombre <su.email@ejemplo.com>
|
||||
#
|
||||
# Derechos de Autor (C) [YYYY] [Su Nombre <su.email@ejemplo.com>]
|
||||
#Script : [Bash Script Name]
|
||||
#Apps : MRDEVS TOOLS
|
||||
#Description : [Bash Script Description]
|
||||
#Author : [Bash Script Author]
|
||||
#Company Email : [Company Email Author's]
|
||||
#Personal Email : [Personal Email Author's]
|
||||
#Created : [Created Date/Time]
|
||||
#Modified : [Modified Date/Time]
|
||||
#Version : [Apps Version]
|
||||
#Use Notes :
|
||||
```
|
||||
4. Documente cualquier nueva funcionalidad añadida
|
||||
|
||||
## 📄 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
|
||||
aimsg_000="INSTALACIÓN DE AIDER"
|
||||
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
|
||||
#Created : 2024/12/01 15:27:00
|
||||
#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>]
|
||||
#==============================================================================
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
#Personal Email : mauro.rosero@gmail.com
|
||||
#Created : 2025/03/21 19:27:08
|
||||
#Modified : 2025/03/21 19:27:08
|
||||
#Version : 1.2.0
|
||||
#Version : 1.3.0
|
||||
#==============================================================================
|
||||
# Derechos de Autor [2025] [Mauro Rosero P. <mauro@rosero.one>]
|
||||
#==============================================================================
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
#Personal Email : mauro.rosero@gmail.com
|
||||
#Created : 2025/03/21 19:27:08
|
||||
#Modified : 2025/03/21 19:27:08
|
||||
#Version : 1.2.0
|
||||
#Version : 1.3.0
|
||||
#==============================================================================
|
||||
# Derechos de Autor [2025] [Mauro Rosero P. <mauro@rosero.one>]
|
||||
#==============================================================================
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
#Personal Email : mauro.rosero@gmail.com
|
||||
#Created : 2025/03/22 14:57:08
|
||||
#Modified : 2025/03/22 14:57:08
|
||||
#Version : 1.2.0
|
||||
#Version : 1.3.0
|
||||
#==============================================================================
|
||||
# Derechos de Autor [2025] [Mauro Rosero P. <mauro@rosero.one>]
|
||||
#==============================================================================
|
||||
|
|
Loading…
Reference in a new issue