fd4ccb6c8f
-npm 9.7.2 added better color support detection which effectively broke the explorer's detection of whether pm2 or forever modules are installed due to extra color codes in the `npm list` output. This has been corrected so that pm2 and forever are now detected properly on newer and older npm versions
154 lines
6.4 KiB
JavaScript
154 lines
6.4 KiB
JavaScript
const minNodeVersionMajor = '14';
|
|
const minNodeVersionMinor = '13';
|
|
const minNodeVersionRevision = '1';
|
|
|
|
// get the nodejs version
|
|
var nodeVersion = process.version;
|
|
var nodeVersionMajor = '0';
|
|
var nodeVersionMinor = '0';
|
|
var nodeVersionRevision = '0';
|
|
|
|
// check if the nodejs version # is blank or a very long string as that would usually indicate a problem
|
|
if (nodeVersion != null && nodeVersion != '' && nodeVersion.length < 16) {
|
|
// remove the 'v' from the beginning of the version string
|
|
if (nodeVersion.indexOf('v') == 0)
|
|
nodeVersion = nodeVersion.slice(1);
|
|
|
|
// split node version string into major, minor and revision
|
|
var splitVersion = nodeVersion.split('.');
|
|
|
|
nodeVersionMajor = splitVersion[0];
|
|
|
|
if (splitVersion.length > 1)
|
|
nodeVersionMinor = splitVersion[1];
|
|
|
|
if (splitVersion.length > 2)
|
|
nodeVersionRevision = splitVersion[2];
|
|
}
|
|
|
|
// check if the installed nodejs is an older version than supported by the explorer
|
|
if (!(nodeVersionMajor > minNodeVersionMajor || (nodeVersionMajor == minNodeVersionMajor && (nodeVersionMinor > minNodeVersionMinor || (nodeVersionMinor == minNodeVersionMinor && nodeVersionRevision >= minNodeVersionRevision))))) {
|
|
console.log(`Please install an updated version of nodejs.\n\nInstalled: ${nodeVersion}\nRequired: ${minNodeVersionMajor}.${minNodeVersionMinor}.${minNodeVersionRevision}`);
|
|
process.exit(0);
|
|
}
|
|
|
|
function check_arguments_passed(cb) {
|
|
const arguments = (process.argv[2] == null ? '' : process.argv[2]).split(' ');
|
|
const pidName = (arguments != null && arguments.length > 0 && arguments[0] != null && arguments[0] != '' && (arguments[0] == 'pm2' || arguments[0] == 'forever') ? arguments[0] : 'node');
|
|
const node_env = (arguments != null && arguments.length > 0 && arguments[1] != null && arguments[1] != '' ? arguments[1] : 'development');
|
|
|
|
// check 1st argument
|
|
if (pidName != null) {
|
|
const { exec } = require('child_process');
|
|
|
|
// determine which argument was passed
|
|
switch (pidName) {
|
|
case 'pm2':
|
|
// windows pm2 has problem loading locally, but other os's should work fine
|
|
const isWinOS = process.platform == 'win32';
|
|
|
|
// run a cmd to check if pm2 is installed
|
|
exec(`npm list${(isWinOS ? ' -g' : '')} pm2`, (err, stdout, stderr) => {
|
|
// split stdout string by new line
|
|
var splitResponse = (stdout == null ? '' : stdout.trim()).split('\n').filter(element => element);
|
|
|
|
// check if the cmd result contains an @ symbol
|
|
if (splitResponse[1].indexOf('@') == -1) {
|
|
console.log('Installing pm2 module.. Please wait..');
|
|
|
|
// install pm2
|
|
exec(`npm install pm2@latest${(isWinOS ? ' -g' : '')}`, (err, stdout, stderr) => {
|
|
// always return the pidName and node_env value for now without checking results
|
|
return cb(pidName, node_env);
|
|
});
|
|
} else
|
|
return cb(pidName, node_env);
|
|
});
|
|
break;
|
|
case 'forever':
|
|
// run a cmd to check if forever is installed
|
|
exec('npm list forever', (err, stdout, stderr) => {
|
|
// split stdout string by new line
|
|
var splitResponse = (stdout == null ? '' : stdout.trim()).split('\n').filter(element => element);
|
|
|
|
// check if the cmd result contains an @ symbol
|
|
if (splitResponse[1].indexOf('@') == -1) {
|
|
console.log('Installing forever module.. Please wait..');
|
|
|
|
// install forever
|
|
exec('npm install forever', (err, stdout, stderr) => {
|
|
// always return the pidName and node_env value for now without checking results
|
|
return cb(pidName, node_env);
|
|
});
|
|
} else
|
|
return cb(pidName, node_env);
|
|
});
|
|
break;
|
|
default:
|
|
// argument not passed or unknown argument
|
|
return cb(pidName, node_env);
|
|
}
|
|
} else
|
|
return cb(pidName, node_env);
|
|
}
|
|
|
|
// check if arguments were passed into this script
|
|
check_arguments_passed(function(pidName, node_env) {
|
|
const execSync = require('child_process').execSync;
|
|
|
|
// compile scss to css
|
|
execSync('node ./scripts/compile_css.js', {stdio : 'inherit'});
|
|
|
|
const db = require('../lib/database');
|
|
|
|
// connect to the mongo database
|
|
db.connect(null, function() {
|
|
// initialize the database
|
|
db.initialize_data_startup(function() {
|
|
// check if the webserver should be started from here based on the pidName
|
|
switch (pidName) {
|
|
case 'pm2':
|
|
let startOrReload = 'start';
|
|
|
|
// get a json list of pm2 processes
|
|
let result = execSync(`pm2 jlist`);
|
|
|
|
// check if the result is null
|
|
if (result != null) {
|
|
try {
|
|
// convert return result to JSON
|
|
result = JSON.parse(result);
|
|
|
|
// loop through the results
|
|
for (let i = 0; i < result.length; i++) {
|
|
// check if this is an explorer process
|
|
if (result[i].name == 'explorer') {
|
|
// explorer process exists, so reload the process
|
|
startOrReload = 'reload';
|
|
break;
|
|
}
|
|
}
|
|
} catch(e) {
|
|
// do nothing
|
|
}
|
|
}
|
|
|
|
// Setting the NODE_ENV variable is more easily done from here seeing at the syntax changes slightly depending on operating system
|
|
execSync(`${(process.platform == 'win32' ? 'set' : 'export')} NODE_ENV=${node_env} && pm2 ${startOrReload} ./bin/instance -i 0 -n explorer -p "./tmp/pm2.pid" --node-args="--stack-size=10000" --update-env`, {stdio : 'inherit'});
|
|
break;
|
|
case 'forever':
|
|
const path = require('path');
|
|
|
|
// there is a long-time bug or shortcoming in forever that still exists in the latest version which requires the absolute path to the pid file option
|
|
// more info: https://github.com/foreversd/forever/issues/421
|
|
// forever is therefore started from here to be able to more easily resolve the absolute path
|
|
// also, setting the NODE_ENV variable is more easily done from here as well seeing at the syntax changes slightly depending on operating system
|
|
execSync(`${(process.platform == 'win32' ? 'set' : 'export')} NODE_ENV=${node_env} && forever start --append --uid "explorer" --pidFile "${path.resolve('./tmp/forever.pid')}" ./bin/cluster`, {stdio : 'inherit'});
|
|
break;
|
|
}
|
|
|
|
// finished pre-loading
|
|
process.exit(0);
|
|
});
|
|
});
|
|
}); |