diff --git a/nodebb b/nodebb index d45163ee32..dd05fbf841 100755 --- a/nodebb +++ b/nodebb @@ -1,138 +1,130 @@ -#!/bin/bash - -# $0 script path -# $1 action -# $2 subaction - -node="$(which nodejs 2>/dev/null)"; -if [ $? -gt 0 ]; - then node="$(which node)"; -fi - -function pidExists() { - if [ -e "pidfile" ]; - then - if ps -p $(cat pidfile) > /dev/null - then return 1; - else - rm ./pidfile; - return 0; - fi - else - return 0; - fi +#!/usr/bin/env node + +var colors = require('colors'), + cproc = require('child_process'), + argv = require('minimist')(process.argv.slice(2)), + fs = require('fs'); + +var getRunningPid = function(callback) { + fs.readFile(__dirname + '/pidfile', { + encoding: 'utf-8' + }, function(err, pid) { + if (err) { + return callback(err); + } + + try { + process.kill(parseInt(pid, 10), 0); + callback(null, parseInt(pid, 10)); + } catch(e) { + callback(e); + } + }); + }; + +switch(process.argv[2]) { + case 'status': + getRunningPid(function(err, pid) { + if (!err) { + process.stdout.write('\nNodeBB Running '.bold + '(pid '.cyan + pid.toString().cyan + ')\n'.cyan); + process.stdout.write('\t"' + './nodebb stop'.yellow + '" to stop the NodeBB server\n'); + process.stdout.write('\t"' + './nodebb log'.yellow + '" to view server output\n'); + process.stdout.write('\t"' + './nodebb restart'.yellow + '" to restart NodeBB\n\n'); + } else { + process.stdout.write('\nNodeBB is not running\n'.bold); + process.stdout.write('\t"' + './nodebb start'.yellow + '" to launch the NodeBB server\n\n'); + } + }) + break; + + case 'start': + process.stdout.write('\nStarting NodeBB\n'.bold); + process.stdout.write(' "' + './nodebb stop'.yellow + '" to stop the NodeBB server\n'); + process.stdout.write(' "' + './nodebb log'.yellow + '" to view server output\n'); + process.stdout.write(' "' + './nodebb restart'.yellow + '" to restart NodeBB\n\n'); + + // Spawn a new NodeBB process + cproc.fork(__dirname + '/loader.js', { + env: process.env, + detatched: true + }); + break; + + case 'stop': + getRunningPid(function(err, pid) { + if (!err) { + process.kill(pid, 'SIGTERM'); + process.stdout.write('Stopping NodeBB. Goodbye!\n') + } else { + process.stdout.write('NodeBB is already stopped.\n'); + } + }); + break; + + case 'restart': + getRunningPid(function(err, pid) { + if (!err) { + process.kill(pid, 'SIGHUP'); + } else { + process.stdout.write('NodeBB could not be restarted, as a running instance could not be found.'); + } + }); + break; + + case 'reload': + getRunningPid(function(err, pid) { + if (!err) { + process.kill(pid, 'SIGUSR2'); + } else { + process.stdout.write('NodeBB could not be reloaded, as a running instance could not be found.'); + } + }); + break; + + case 'dev': + process.env.NODE_ENV = 'development'; + cproc.fork(__dirname + '/loader.js', ['--no-daemon', '--no-silent'], { + env: process.env + }); + break; + + default: + process.stdout.write('\nWelcome to NodeBB\n\n'.bold); + process.stdout.write('Usage: ./nodebb {start|stop|reload|restart|log|setup|reset|upgrade|dev}\n\n'); + process.stdout.write('\t' + 'start'.yellow + '\tStart the NodeBB server\n'); + process.stdout.write('\t' + 'stop'.yellow + '\tStops the NodeBB server\n'); + process.stdout.write('\t' + 'reload'.yellow + '\tRestarts NodeBB\n'); + process.stdout.write('\t' + 'restart'.yellow + '\tRestarts NodeBB\n'); + process.stdout.write('\t' + 'log'.yellow + '\tOpens the logging interface (useful for debugging)\n'); + process.stdout.write('\t' + 'setup'.yellow + '\tRuns the NodeBB setup script\n'); + process.stdout.write('\t' + 'reset'.yellow + '\tDisables all plugins, restores the default theme.\n'); + process.stdout.write('\t' + 'upgrade'.yellow + '\tRun NodeBB upgrade scripts, ensure packages are up-to-date\n'); + process.stdout.write('\t' + 'dev'.yellow + '\tStart NodeBB in interactive development mode\n'); + process.stdout.write('\t' + 'watch'.yellow + '\tStart NodeBB in development mode and watch for changes\n'); + process.stdout.write('\n'); + break; } -case "$1" in - start) - echo "Starting NodeBB"; - echo " \"./nodebb stop\" to stop the NodeBB server"; - echo " \"./nodebb log\" to view server output"; - echo " \"./nodebb restart\" to restart NodeBB"; - - # Start the loader daemon - "$node" loader "$@" - ;; - - stop) - pidExists; - if [ 0 -eq $? ]; - then - echo "NodeBB is already stopped."; - else - echo "Stopping NodeBB. Goodbye!"; - kill $(cat pidfile); - fi - ;; - - restart) - pidExists; - if [ 0 -eq $? ]; - then - echo "NodeBB could not be restarted, as a running instance could not be found."; - else - echo "Restarting NodeBB."; - kill -1 $(cat pidfile); - fi - ;; - - reload) - pidExists; - if [ 0 -eq $? ]; - then - echo "NodeBB could not be reloaded, as a running instance could not be found."; - else - echo "Reloading NodeBB."; - kill -12 $(cat pidfile); - fi - ;; - - status) - pidExists; - if [ 0 -eq $? ]; - then - echo "NodeBB is not running"; - echo " \"./nodebb start\" to launch the NodeBB server"; - else - echo "NodeBB Running (pid $(cat pidfile))"; - echo " \"./nodebb stop\" to stop the NodeBB server"; - echo " \"./nodebb log\" to view server output"; - echo " \"./nodebb restart\" to restart NodeBB"; - fi - ;; - +/* log) - clear; - tail -F ./logs/output.log; - ;; + clear; + tail -F ./logs/output.log; + ;; upgrade) - npm install - # ls -d node_modules/nodebb* | xargs -n1 basename | xargs npm install - # ls -d node_modules/nodebb* | xargs -n1 basename | xargs npm update - npm i nodebb-theme-vanilla nodebb-theme-lavender nodebb-widget-essentials - "$node" app --upgrade - touch package.json - ;; + npm install + # ls -d node_modules/nodebb* | xargs -n1 basename | xargs npm install + # ls -d node_modules/nodebb* | xargs -n1 basename | xargs npm update + npm i nodebb-theme-vanilla nodebb-theme-lavender nodebb-widget-essentials + "$node" app --upgrade + touch package.json + ;; setup) - "$node" app --setup "$@" - ;; + "$node" app --setup "$@" + ;; reset) - "$node" app --reset --$2 - ;; - - dev) - echo "Launching NodeBB in \"development\" mode." - echo "To run the production build of NodeBB, please use \"forever\"." - echo "More Information: https://docs.nodebb.org/en/latest/running/index.html" - NODE_ENV=development "$node" loader --no-daemon --no-silent "$@" - ;; - - watch) - echo "***************************************************************************" - echo "WARNING: ./nodebb watch will be deprecated soon. Please use grunt: " - echo "https://docs.nodebb.org/en/latest/running/index.html#grunt-development" - echo "***************************************************************************" - NODE_ENV=development supervisor -q --ignore public/templates,public/nodebb.min.js,public/nodebb.min.js.map --extensions 'node|js|tpl|less' -- app "$@" - ;; - - *) - echo "Welcome to NodeBB" - echo $"Usage: $0 {start|stop|reload|restart|log|setup|reset|upgrade|dev|watch}" - echo '' - column -s ' ' -t <<< ' - start Start the NodeBB server - stop Stops the NodeBB server - reload Restarts NodeBB - restart Restarts NodeBB - log Opens the logging interface (useful for debugging) - setup Runs the NodeBB setup script - reset Disables all plugins, restores the default theme. - upgrade Run NodeBB upgrade scripts, ensure packages are up-to-date - dev Start NodeBB in interactive development mode - watch Start NodeBB in development mode and watch for changes - ' - exit 1 -esac + "$node" app --reset --$2 + ;; +*/ \ No newline at end of file diff --git a/package.json b/package.json index 27d4933f94..6fd4275862 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "async": "~0.9.0", "bcryptjs": "~2.1.0", "body-parser": "^1.9.0", + "colors": "^1.1.0", "compression": "^1.1.0", "connect-ensure-login": "^0.1.1", "connect-flash": "^0.1.1", @@ -34,6 +35,7 @@ "logrotate-stream": "^0.2.3", "lru-cache": "^2.6.1", "mime": "^1.3.4", + "minimist": "^1.1.1", "mkdirp": "~0.5.0", "mmmagic": "^0.3.13", "morgan": "^1.3.2", @@ -44,11 +46,11 @@ "nodebb-plugin-mentions": "^0.11.2", "nodebb-plugin-soundpack-default": "^0.1.1", "nodebb-plugin-spam-be-gone": "^0.4.0", + "nodebb-rewards-essentials": "^0.0.1", "nodebb-theme-lavender": "^1.0.42", - "nodebb-theme-vanilla": "^1.0.130", "nodebb-theme-persona": "^0.1.55", + "nodebb-theme-vanilla": "^1.0.130", "nodebb-widget-essentials": "^1.0.2", - "nodebb-rewards-essentials": "^0.0.1", "npm": "^2.1.4", "passport": "^0.2.1", "passport-local": "1.0.0",