devs/bin/nodered.sh
Mauro Rosero P. 56fc09621c
[IMPROVED] Script nodered.sh para gestión avanzada de Node-RED
- Mejorada verificación de tipo de proyecto (nodejs)
- Añadido soporte para directorio de datos separado (.node-red)
- Mejorada función start para verificar dependencias e instalación automática
- Añadida detección de inicio completo del servicio
- Mejorada gestión del proceso, apagado ordenado y limpieza PID
- Detallado status con información de PID, URL, logs y estado HTTP
- Nuevas funciones: restart, install_deps para módulos comunes y logs
- Mejor documentación e interfaz de uso
- Actualizado README.md con entrada para nodered.sh

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-03-23 12:28:36 -05:00

253 lines
8.3 KiB
Bash
Executable file

#!/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.2.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"
title="${head_000} ${head_002}"
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
echo "Node-RED ya está en ejecución (PID $(cat $PID_FILE))"
echo "Abre http://localhost:$NODE_RED_PORT en tu navegador"
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 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() {
if [ ! -f "$PID_FILE" ] || ! kill -0 "$(cat $PID_FILE)" 2>/dev/null; then
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")
# Enviar señal SIGTERM para terminar amigablemente
kill "$PID"
# Esperar hasta 10 segundos para que el proceso termine
for i in {1..10}; do
if ! kill -0 "$PID" 2>/dev/null; then
break
fi
sleep 1
echo -n "."
done
# Si aún está en ejecución, forzar la terminación
if kill -0 "$PID" 2>/dev/null; then
echo "Forzando terminación..."
kill -9 "$PID"
fi
rm -f "$PID_FILE"
echo "Node-RED detenido correctamente."
}
status() {
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
else
echo "Node-RED no está en ejecución."
# Limpiar archivos PID huérfanos si existen
[ -f "$PID_FILE" ] && rm -f "$PID_FILE"
fi
}
restart() {
echo "Reiniciando Node-RED..."
stop
sleep 2
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
# Instalar o actualizar Node-RED
npm install --save node-red
# Instalar paquetes comunes útiles para IoT
npm install --save node-red-dashboard node-red-node-serialport node-red-contrib-mqtt-broker
echo "Dependencias instaladas correctamente."
}
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