#!/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. ] #============================================================================== # 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 . # 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_HOME:-$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