Files
Joe Uhren 788454051c Add preliminary plugin support
-Plugins can now be enabled via settings.json after dropping the plugin files into the new plugins directory
-Enabling plugins will allow extending the normal functionality of the explorer with new database collections, menus, pages and apis + open up a new url for data to be sent from the plugin to the explorer
-A new plugins section was added to the settings with a definition for the generic-snapshots plugin
-Locale strings are now loaded and shared out via the settings so there is generally no more need to explicitly include the locale.js file
-The locale object has been updated to localization within the explorer
-A number of new locale strings have been added and their values replaced with the locale string within the explorer
-Added plugin support verbiage and a link to the generic-snapshots crowdfunding task to the README
2024-06-16 18:58:12 -06:00

198 lines
6.5 KiB
JavaScript

const { execSync } = require('child_process');
const fs = require('fs');
const argument = (process.argv[2] != null && process.argv[2] != '' && (process.argv[2] == 'explorer-only' || process.argv[2] == 'dependencies-only') ? process.argv[2] : '');
const settings = require('../lib/settings');
let reloadWebserver = false;
function exit() {
console.log('Explorer update complete');
process.exit(0);
}
function init_database(cb) {
// compile scss to css
execSync('node ./scripts/compile_css.js', {stdio : 'inherit'});
const db = require('../lib/database');
// connect to mongo database
db.connect(null, function() {
// initialize the database
db.initialize_data_startup(function() {
// finish the database init
return cb(null);
});
});
}
// check if the script should check for code updates
if (argument == '' || argument == 'explorer-only') {
// check if the .git directory and .git/refs/heads/master file exist
if (fs.existsSync('./.git') && fs.existsSync('./.git/refs/heads/master')) {
// get the current commit hash
var commit = fs.readFileSync('./.git/refs/heads/master');
// update to newest explorer source
console.log(`${settings.localization.downloading_newest_explorer_code}.. ${settings.localization.please_wait}..\n`);
try {
console.log('Git response:');
execSync('git pull', {stdio : 'inherit'});
// get the current commit hash to see if it has changed
var new_commit = fs.readFileSync('./.git/refs/heads/master');
// check if the commit values are the same
if (new_commit.toString() == commit.toString()) {
// explorer code was already up-to-date
console.log('\nExplorer code is already up-to-date');
} else {
console.log('\nExplorer code successfully updated');
reloadWebserver = true;
}
} catch(err) {
console.log('\nError updating explorer code. Maybe git is not installed globally or you made some custom changes to the explorer code?');
}
} else {
console.log('WARNING: Explorer code not cloned from github and cannot be automatically updated!');
console.log('Skipping explorer code update');
}
// check if this was an explorer-only update
if (argument == 'explorer-only') {
// add a new line for better spacing
console.log('');
}
}
// check if the script should check for outdated dependencies
if (argument == '' || argument == 'dependencies-only') {
var outdatedPkgs = null;
// check for outdated packages
try {
console.log(`${(argument == 'dependencies-only' ? '' : '\n')}${settings.localization.check_outdated_packages}.. ${settings.localization.please_wait}..`);
execSync('npm outdated');
// all packages are up-to-date
console.log('\nAll explorer packages are up-to-date');
} catch (err) {
outdatedPkgs = err.stdout.toString().trim();
}
// add a new line for better spacing
console.log('');
// check if there were any outdated packages
if (outdatedPkgs != null) {
// update npm modules to latest versions according to package.json rules
console.log(`${settings.localization.updating_explorer_packages}.. ${settings.localization.please_wait}..\n`);
execSync('npm update');
// check for outdated packages (again)
try {
execSync('npm outdated');
// all packages are up-to-date
console.log('All explorer packages are up-to-date\n');
reloadWebserver = true;
} catch (err) {
console.log(`The following packages are still out-of-date:\n${err.stdout.toString().trim()}\n`);
// check if any of the packages were updated
if (err.stdout.toString().trim() == outdatedPkgs)
reloadWebserver = true;
}
}
}
// check if the web server should be reloaded
if (reloadWebserver == true) {
console.log(`${settings.localization.checking_webserver_running}.. ${settings.localization.please_wait}..\n`);
const path = require('path');
const lib = require('../lib/explorer');
var pidActive = false;
// get a list of all files in the tmp directory
var tmpFiles = fs.readdirSync('./tmp');
// get a list of all pm2 pid files
var pm2Files = tmpFiles
.filter(file => file.startsWith('pm2') && file.endsWith('.pid'))
.map(file => path.basename(file, '.pid'));
// loop through the pm2 pid files and check if at least one is valid/active by testing the pid to see if it is running
for (var i = 0; i < pm2Files.length; i++) {
// check if the current pm2.pid file is valid
if (lib.is_locked([pm2Files[i]], true) == true) {
// this pid is active so stop checking
pidActive = true;
break;
}
}
// check if any pm2 pids were active
if (pidActive == true) {
// compile css and initialize database
init_database(function() {
console.log(`\n${settings.localization.reloading_explorer}.. ${settings.localization.please_wait}..\n`);
// reload pm2 using the zero-downtime reload function
execSync(`pm2 reload explorer`, {stdio : 'inherit'});
// add a new line for better spacing
console.log('');
// finish the script
exit();
});
} else {
// check if the forever pid file exists and is valid
if (fs.existsSync('./tmp/forever.pid') && lib.is_locked(['forever'], true) == true) {
// this pid is active
pidActive = true;
}
// check if the forever.pid is active
if (pidActive == true) {
// compile css and initialize database
init_database(function() {
console.log(`\n${settings.localization.reloading_explorer}.. ${settings.localization.please_wait}..\n`);
// reload forever using the restart function
execSync(`forever restart explorer`, {stdio : 'inherit'});
// add a new line for better spacing
console.log('');
// finish the script
exit();
});
} else {
const request = require('postman-request');
// try executing the restart explorer api
request({uri: `http://localhost:${settings.webserver.port}/system/restartexplorer`, timeout: 1000}, function (error, response, summary) {
// check if there was an error
if (error != null) {
console.log('Webserver is not runnning\n');
// finish the script
exit();
} else {
// compile css and initialize database
init_database(function() {
console.log(`\n${settings.localization.reloading_explorer}.. ${settings.localization.please_wait}..\n`);
// finish the script
exit();
});
}
});
}
}
} else {
// finish the script
exit();
}