[FIXED] Soporte para NODE_RED_HOME en nodered.sh
🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
b1e56b6196
commit
a5e1cf5787
1 changed files with 36 additions and 210 deletions
246
bin/nodered.sh
246
bin/nodered.sh
|
@ -6,8 +6,8 @@
|
||||||
#Company Email : mauro@rosero.one
|
#Company Email : mauro@rosero.one
|
||||||
#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/04/01 18:55:38
|
#Modified : 2025/03/19 11:57:08
|
||||||
#Version : 1.3.1
|
#Version : 1.2.0
|
||||||
#==============================================================================
|
#==============================================================================
|
||||||
# Derechos de Autor [2025] [Mauro Rosero P. <mauro@rosero.one>]
|
# Derechos de Autor [2025] [Mauro Rosero P. <mauro@rosero.one>]
|
||||||
#==============================================================================
|
#==============================================================================
|
||||||
|
@ -51,9 +51,7 @@ if [ -f "${BIN_HOME}/${BIN_BASE}/${BIN_LIBS}/base.lib" ]; then
|
||||||
source "${BIN_HOME}/${BIN_BASE}/${BIN_LIBS}/base.lib"
|
source "${BIN_HOME}/${BIN_BASE}/${BIN_LIBS}/base.lib"
|
||||||
# Cargar mensajes en el idioma del sistema o español por defecto
|
# Cargar mensajes en el idioma del sistema o español por defecto
|
||||||
load_messages "${BIN_HOME}/${BIN_BASE}" "${BIN_MESG}" "${BIN_LANG}" "head"
|
load_messages "${BIN_HOME}/${BIN_BASE}" "${BIN_MESG}" "${BIN_LANG}" "head"
|
||||||
# Cargar mensajes específicos de NodeRED
|
title="${head_000} ${head_002}"
|
||||||
load_messages "${BIN_HOME}/${BIN_BASE}" "${BIN_MESG}" "${BIN_LANG}" "developers"
|
|
||||||
title="${head_000} ${head_002} - ${nrmsg_000}"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Verificar si es un proyecto de desarrollo y de tipo NodeJS
|
# Verificar si es un proyecto de desarrollo y de tipo NodeJS
|
||||||
|
@ -73,7 +71,7 @@ fi
|
||||||
|
|
||||||
# Configuración de Node-RED
|
# Configuración de Node-RED
|
||||||
NODE_RED_DIR="$PWD"
|
NODE_RED_DIR="$PWD"
|
||||||
NODE_RED_DATA="$NODE_RED_DIR/node_red"
|
NODE_RED_DATA="${NODE_RED_HOME:-$NODE_RED_DIR/node_red}"
|
||||||
NODE_RED_PORT=${NODE_RED_PORT:-1880}
|
NODE_RED_PORT=${NODE_RED_PORT:-1880}
|
||||||
NODE_RED_CMD="npx node-red -u $NODE_RED_DATA -p $NODE_RED_PORT"
|
NODE_RED_CMD="npx node-red -u $NODE_RED_DATA -p $NODE_RED_PORT"
|
||||||
PID_FILE="$NODE_RED_DIR/nodered.pid"
|
PID_FILE="$NODE_RED_DIR/nodered.pid"
|
||||||
|
@ -85,8 +83,8 @@ mkdir -p "$NODE_RED_DATA" 2>/dev/null
|
||||||
|
|
||||||
start() {
|
start() {
|
||||||
if [ -f "$PID_FILE" ] && kill -0 "$(cat $PID_FILE)" 2>/dev/null; then
|
if [ -f "$PID_FILE" ] && kill -0 "$(cat $PID_FILE)" 2>/dev/null; then
|
||||||
printf "${nrmsg_001}\n" "$(cat $PID_FILE)"
|
echo "Node-RED ya está en ejecución (PID $(cat $PID_FILE))"
|
||||||
printf "${nrmsg_002}\n" "$NODE_RED_PORT"
|
echo "Abre http://localhost:$NODE_RED_PORT en tu navegador"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -97,21 +95,6 @@ start() {
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
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
|
# Verificar si node-red está disponible localmente
|
||||||
if ! npm list -g node-red &> /dev/null && ! npm list node-red &> /dev/null; then
|
if ! npm list -g node-red &> /dev/null && ! npm list node-red &> /dev/null; then
|
||||||
echo "Node-RED no está instalado. Instalando localmente..."
|
echo "Node-RED no está instalado. Instalando localmente..."
|
||||||
|
@ -147,103 +130,39 @@ start() {
|
||||||
}
|
}
|
||||||
|
|
||||||
stop() {
|
stop() {
|
||||||
# Variable para seguir si se detectaron procesos
|
if [ ! -f "$PID_FILE" ] || ! kill -0 "$(cat $PID_FILE)" 2>/dev/null; then
|
||||||
local found_processes=0
|
echo "Node-RED no está en ejecución."
|
||||||
|
# Limpiar archivos PID huérfanos si existen
|
||||||
|
[ -f "$PID_FILE" ] && rm -f "$PID_FILE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Deteniendo Node-RED (PID $(cat $PID_FILE))..."
|
||||||
|
local PID=$(cat "$PID_FILE")
|
||||||
|
|
||||||
echo "Deteniendo Node-RED..."
|
# Enviar señal SIGTERM para terminar amigablemente
|
||||||
|
kill "$PID"
|
||||||
|
|
||||||
# Matar todos los procesos recursivamente y de forma agresiva
|
# Esperar hasta 10 segundos para que el proceso termine
|
||||||
kill_all_nodered() {
|
for i in {1..10}; do
|
||||||
echo "Buscando procesos Node-RED..."
|
if ! kill -0 "$PID" 2>/dev/null; then
|
||||||
|
break
|
||||||
# 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
|
fi
|
||||||
|
sleep 1
|
||||||
# Procesar cada PID encontrado
|
echo -n "."
|
||||||
found_processes=1
|
done
|
||||||
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
|
# Si aún está en ejecución, forzar la terminación
|
||||||
if [ -f "$PID_FILE" ]; then
|
if kill -0 "$PID" 2>/dev/null; then
|
||||||
echo "Usando archivo PID: $PID_FILE"
|
echo "Forzando terminación..."
|
||||||
if kill -0 "$(cat $PID_FILE)" 2>/dev/null; then
|
kill -9 "$PID"
|
||||||
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
|
fi
|
||||||
|
|
||||||
# Buscar y matar todos los procesos de Node-RED
|
rm -f "$PID_FILE"
|
||||||
kill_all_nodered
|
echo "Node-RED detenido correctamente."
|
||||||
|
|
||||||
# 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() {
|
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
|
if [ -f "$PID_FILE" ] && kill -0 "$(cat $PID_FILE)" 2>/dev/null; then
|
||||||
echo "Node-RED está en ejecución:"
|
echo "Node-RED está en ejecución:"
|
||||||
echo " - PID: $(cat $PID_FILE)"
|
echo " - PID: $(cat $PID_FILE)"
|
||||||
|
@ -265,80 +184,17 @@ status() {
|
||||||
echo " - Estado: Proceso en ejecución pero no responde HTTP"
|
echo " - Estado: Proceso en ejecución pero no responde HTTP"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
return 0
|
else
|
||||||
|
echo "Node-RED no está en ejecución."
|
||||||
|
# Limpiar archivos PID huérfanos si existen
|
||||||
|
[ -f "$PID_FILE" ] && rm -f "$PID_FILE"
|
||||||
fi
|
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() {
|
restart() {
|
||||||
echo "Reiniciando Node-RED..."
|
echo "Reiniciando Node-RED..."
|
||||||
|
|
||||||
# Forzar detención completa
|
|
||||||
stop
|
stop
|
||||||
|
sleep 2
|
||||||
# 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
|
start
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -352,43 +208,13 @@ install_deps() {
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
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
|
# Instalar o actualizar Node-RED
|
||||||
echo "Instalando Node-RED..."
|
|
||||||
npm install --save node-red
|
npm install --save node-red
|
||||||
|
|
||||||
# Instalar paquetes comunes útiles para IoT
|
# 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
|
npm install --save node-red-dashboard node-red-node-serialport node-red-contrib-mqtt-broker
|
||||||
|
|
||||||
# Verificar si las instalaciones fueron exitosas
|
echo "Dependencias instaladas correctamente."
|
||||||
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() {
|
logs() {
|
||||||
|
|
Loading…
Reference in a new issue