|
|
|
@ -2,16 +2,25 @@
|
|
|
|
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
|
|
var cproc;
|
|
|
|
|
var args;
|
|
|
|
|
var fs;
|
|
|
|
|
var path;
|
|
|
|
|
var request;
|
|
|
|
|
var semver;
|
|
|
|
|
var prompt;
|
|
|
|
|
var async;
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
require('colors');
|
|
|
|
|
var cproc = require('child_process');
|
|
|
|
|
var args = require('minimist')(process.argv.slice(2));
|
|
|
|
|
var fs = require('fs');
|
|
|
|
|
var path = require('path');
|
|
|
|
|
var request = require('request');
|
|
|
|
|
var semver = require('semver');
|
|
|
|
|
var prompt = require('prompt');
|
|
|
|
|
var async = require('async');
|
|
|
|
|
cproc = require('child_process');
|
|
|
|
|
args = require('minimist')(process.argv.slice(2));
|
|
|
|
|
fs = require('fs');
|
|
|
|
|
path = require('path');
|
|
|
|
|
request = require('request');
|
|
|
|
|
semver = require('semver');
|
|
|
|
|
prompt = require('prompt');
|
|
|
|
|
async = require('async');
|
|
|
|
|
} catch (e) {
|
|
|
|
|
if (e.code === 'MODULE_NOT_FOUND') {
|
|
|
|
|
process.stdout.write('NodeBB could not be started because it\'s dependencies have not been installed.\n');
|
|
|
|
@ -23,13 +32,16 @@ try {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var loaderPath = path.join(__dirname, 'loader.js');
|
|
|
|
|
var appPath = path.join(__dirname, 'app.js');
|
|
|
|
|
|
|
|
|
|
if (args.dev) {
|
|
|
|
|
process.env.NODE_ENV = 'development';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getRunningPid(callback) {
|
|
|
|
|
fs.readFile(__dirname + '/pidfile', {
|
|
|
|
|
encoding: 'utf-8'
|
|
|
|
|
fs.readFile(path.join(__dirname, 'pidfile'), {
|
|
|
|
|
encoding: 'utf-8',
|
|
|
|
|
}, function (err, pid) {
|
|
|
|
|
if (err) {
|
|
|
|
|
return callback(err);
|
|
|
|
@ -38,7 +50,7 @@ function getRunningPid(callback) {
|
|
|
|
|
try {
|
|
|
|
|
process.kill(parseInt(pid, 10), 0);
|
|
|
|
|
callback(null, parseInt(pid, 10));
|
|
|
|
|
} catch(e) {
|
|
|
|
|
} catch (e) {
|
|
|
|
|
callback(e);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
@ -52,28 +64,29 @@ function getCurrentVersion(callback) {
|
|
|
|
|
try {
|
|
|
|
|
pkg = JSON.parse(pkg);
|
|
|
|
|
return callback(null, pkg.version);
|
|
|
|
|
} catch(err) {
|
|
|
|
|
} catch (err) {
|
|
|
|
|
return callback(err);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
function fork(args) {
|
|
|
|
|
return cproc.fork('app.js', args, {
|
|
|
|
|
return cproc.fork(appPath, args, {
|
|
|
|
|
cwd: __dirname,
|
|
|
|
|
silent: false
|
|
|
|
|
silent: false,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
function getInstalledPlugins(callback) {
|
|
|
|
|
async.parallel({
|
|
|
|
|
files: async.apply(fs.readdir, path.join(__dirname, 'node_modules')),
|
|
|
|
|
deps: async.apply(fs.readFile, path.join(__dirname, 'package.json'), { encoding: 'utf-8' })
|
|
|
|
|
deps: async.apply(fs.readFile, path.join(__dirname, 'package.json'), { encoding: 'utf-8' }),
|
|
|
|
|
}, function (err, payload) {
|
|
|
|
|
if (err) {
|
|
|
|
|
return callback(err);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var isNbbModule = /^nodebb-(?:plugin|theme|widget|rewards)-[\w\-]+$/,
|
|
|
|
|
moduleName, isGitRepo;
|
|
|
|
|
var isNbbModule = /^nodebb-(?:plugin|theme|widget|rewards)-[\w-]+$/;
|
|
|
|
|
var moduleName;
|
|
|
|
|
var isGitRepo;
|
|
|
|
|
|
|
|
|
|
payload.files = payload.files.filter(function (file) {
|
|
|
|
|
return isNbbModule.test(file);
|
|
|
|
@ -98,7 +111,7 @@ function getInstalledPlugins(callback) {
|
|
|
|
|
try {
|
|
|
|
|
fs.accessSync(path.join(__dirname, 'node_modules/' + moduleName, '.git'));
|
|
|
|
|
isGitRepo = true;
|
|
|
|
|
} catch(e) {
|
|
|
|
|
} catch (e) {
|
|
|
|
|
isGitRepo = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -144,7 +157,7 @@ function checkPlugins(standalone, callback) {
|
|
|
|
|
async.waterfall([
|
|
|
|
|
async.apply(async.parallel, {
|
|
|
|
|
plugins: async.apply(getInstalledPlugins),
|
|
|
|
|
version: async.apply(getCurrentVersion)
|
|
|
|
|
version: async.apply(getCurrentVersion),
|
|
|
|
|
}),
|
|
|
|
|
function (payload, next) {
|
|
|
|
|
var toCheck = Object.keys(payload.plugins);
|
|
|
|
@ -157,7 +170,7 @@ function checkPlugins(standalone, callback) {
|
|
|
|
|
request({
|
|
|
|
|
method: 'GET',
|
|
|
|
|
url: 'https://packages.nodebb.org/api/v1/suggest?version=' + payload.version + '&package[]=' + toCheck.join('&package[]='),
|
|
|
|
|
json: true
|
|
|
|
|
json: true,
|
|
|
|
|
}, function (err, res, body) {
|
|
|
|
|
if (err) {
|
|
|
|
|
process.stdout.write('error'.red + '\n'.reset);
|
|
|
|
@ -169,25 +182,25 @@ function checkPlugins(standalone, callback) {
|
|
|
|
|
body = [body];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var current, suggested,
|
|
|
|
|
upgradable = body.map(function (suggestObj) {
|
|
|
|
|
current = payload.plugins[suggestObj.package];
|
|
|
|
|
suggested = suggestObj.version;
|
|
|
|
|
|
|
|
|
|
if (suggestObj.code === 'match-found' && semver.gt(suggested, current)) {
|
|
|
|
|
return {
|
|
|
|
|
name: suggestObj.package,
|
|
|
|
|
current: current,
|
|
|
|
|
suggested: suggested
|
|
|
|
|
};
|
|
|
|
|
} else {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}).filter(Boolean);
|
|
|
|
|
var current;
|
|
|
|
|
var suggested;
|
|
|
|
|
var upgradable = body.map(function (suggestObj) {
|
|
|
|
|
current = payload.plugins[suggestObj.package];
|
|
|
|
|
suggested = suggestObj.version;
|
|
|
|
|
|
|
|
|
|
if (suggestObj.code === 'match-found' && semver.gt(suggested, current)) {
|
|
|
|
|
return {
|
|
|
|
|
name: suggestObj.package,
|
|
|
|
|
current: current,
|
|
|
|
|
suggested: suggested,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}).filter(Boolean);
|
|
|
|
|
|
|
|
|
|
next(null, upgradable);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
], callback);
|
|
|
|
|
}
|
|
|
|
|
function upgradePlugins(callback) {
|
|
|
|
@ -199,7 +212,7 @@ function upgradePlugins(callback) {
|
|
|
|
|
|
|
|
|
|
checkPlugins(standalone, function (err, found) {
|
|
|
|
|
if (err) {
|
|
|
|
|
process.stdout.write('\Warning'.yellow + ': An unexpected error occured when attempting to verify plugin upgradability\n'.reset);
|
|
|
|
|
process.stdout.write('Warning'.yellow + ': An unexpected error occured when attempting to verify plugin upgradability\n'.reset);
|
|
|
|
|
return callback(err);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -223,7 +236,7 @@ function upgradePlugins(callback) {
|
|
|
|
|
prompt.get({
|
|
|
|
|
name: 'upgrade',
|
|
|
|
|
description: 'Proceed with upgrade (y|n)?'.reset,
|
|
|
|
|
type: 'string'
|
|
|
|
|
type: 'string',
|
|
|
|
|
}, function (err, result) {
|
|
|
|
|
if (err) {
|
|
|
|
|
return callback(err);
|
|
|
|
@ -279,8 +292,8 @@ var commands = {
|
|
|
|
|
process.stdout.write(' "' + './nodebb restart'.yellow + '" to restart NodeBB\n\n'.reset);
|
|
|
|
|
|
|
|
|
|
// Spawn a new NodeBB process
|
|
|
|
|
cproc.fork(__dirname + '/loader.js', {
|
|
|
|
|
env: process.env
|
|
|
|
|
cproc.fork(loaderPath, {
|
|
|
|
|
env: process.env,
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
@ -320,7 +333,7 @@ var commands = {
|
|
|
|
|
process.stdout.write('\n\n'.reset);
|
|
|
|
|
cproc.spawn('tail', ['-F', './logs/output.log'], {
|
|
|
|
|
cwd: __dirname,
|
|
|
|
|
stdio: 'inherit'
|
|
|
|
|
stdio: 'inherit',
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
@ -333,12 +346,12 @@ var commands = {
|
|
|
|
|
process.stdout.write('\n\n'.reset);
|
|
|
|
|
|
|
|
|
|
// Spawn a new NodeBB process
|
|
|
|
|
cproc.fork(__dirname + '/loader.js', {
|
|
|
|
|
env: process.env
|
|
|
|
|
cproc.fork(loaderPath, {
|
|
|
|
|
env: process.env,
|
|
|
|
|
});
|
|
|
|
|
cproc.spawn('tail', ['-F', './logs/output.log'], {
|
|
|
|
|
cwd: __dirname,
|
|
|
|
|
stdio: 'inherit'
|
|
|
|
|
stdio: 'inherit',
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
@ -347,14 +360,14 @@ var commands = {
|
|
|
|
|
usage: 'Usage: ' + './nodebb dev'.yellow,
|
|
|
|
|
handler: function () {
|
|
|
|
|
process.env.NODE_ENV = 'development';
|
|
|
|
|
cproc.fork(__dirname + '/loader.js', ['--no-daemon', '--no-silent'], {
|
|
|
|
|
env: process.env
|
|
|
|
|
cproc.fork(loaderPath, ['--no-daemon', '--no-silent'], {
|
|
|
|
|
env: process.env,
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
build: {
|
|
|
|
|
description: 'Compile static assets (CSS, Javascript, etc)',
|
|
|
|
|
usage: 'Usage: ' + './nodebb build'.yellow + ' [js,clientCSS,acpCSS,tpl,lang]'.red + '\n' +
|
|
|
|
|
usage: 'Usage: ' + './nodebb build'.yellow + ' [js,clientCSS,acpCSS,tpl,lang]'.red + '\n' +
|
|
|
|
|
' e.g. ' + './nodebb build js,tpl'.yellow + '\tbuilds JS and templates\n' +
|
|
|
|
|
' ' + './nodebb build'.yellow + '\t\tbuilds all targets\n',
|
|
|
|
|
handler: function () {
|
|
|
|
@ -422,7 +435,7 @@ var commands = {
|
|
|
|
|
var upgradeProc = fork(arr);
|
|
|
|
|
|
|
|
|
|
upgradeProc.on('close', next);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
], function (err) {
|
|
|
|
|
if (err) {
|
|
|
|
|
process.stdout.write('\nError'.red + ': ' + err.message + '\n');
|
|
|
|
@ -430,7 +443,7 @@ var commands = {
|
|
|
|
|
var message = 'NodeBB Upgrade Complete!';
|
|
|
|
|
// some consoles will return undefined/zero columns, so just use 2 spaces in upgrade script if we can't get our column count
|
|
|
|
|
var columns = process.stdout.columns;
|
|
|
|
|
var spaces = columns ? new Array(Math.floor(columns / 2) - (message.length / 2) + 1).join(' ') : " ";
|
|
|
|
|
var spaces = columns ? new Array(Math.floor(columns / 2) - (message.length / 2) + 1).join(' ') : ' ';
|
|
|
|
|
|
|
|
|
|
process.stdout.write('OK\n'.green);
|
|
|
|
|
process.stdout.write('\n' + spaces + message.green.bold + '\n\n'.reset);
|
|
|
|
|