You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nodebb/src/cli/reset.js

184 lines
4.5 KiB
JavaScript

10 years ago
'use strict';
8 years ago
require('colors');
var path = require('path');
10 years ago
var winston = require('winston');
9 years ago
var async = require('async');
var fs = require('fs');
10 years ago
var db = require('../database');
var events = require('../events');
var meta = require('../meta');
var plugins = require('../plugins');
var widgets = require('../widgets');
var privileges = require('../privileges');
10 years ago
var dirname = require('./paths').baseDir;
10 years ago
var themeNamePattern = /^(@.*?\/)?nodebb-theme-.*$/;
var pluginNamePattern = /^(@.*?\/)?nodebb-(theme|plugin|widget|rewards)-.*$/;
exports.reset = function (options, callback) {
var map = {
theme: function (next) {
var themeId = options.theme;
if (themeId === true) {
resetThemes(next);
} else {
if (!themeNamePattern.test(themeId)) {
// Allow omission of `nodebb-theme-`
themeId = 'nodebb-theme-' + themeId;
}
resetTheme(themeId, next);
}
},
plugin: function (next) {
var pluginId = options.plugin;
if (pluginId === true) {
resetPlugins(next);
10 years ago
} else {
if (!pluginNamePattern.test(pluginId)) {
// Allow omission of `nodebb-plugin-`
pluginId = 'nodebb-plugin-' + pluginId;
}
resetPlugin(pluginId, next);
10 years ago
}
},
widgets: resetWidgets,
settings: resetSettings,
all: function (next) {
async.series([resetWidgets, resetThemes, resetPlugins, resetSettings], next);
},
};
var tasks = Object.keys(map)
.filter(function (x) { return options[x]; })
.map(function (x) { return map[x]; });
if (!tasks.length) {
console.log([
'No arguments passed in, so nothing was reset.\n'.yellow,
'Use ./nodebb reset ' + '{-t|-p|-w|-s|-a}'.red,
' -t\tthemes',
' -p\tplugins',
' -w\twidgets',
' -s\tsettings',
' -a\tall of the above',
'',
'Plugin and theme reset flags (-p & -t) can take a single argument',
' e.g. ./nodebb reset -p nodebb-plugin-mentions, ./nodebb reset -t nodebb-theme-persona',
' Prefix is optional, e.g. ./nodebb reset -p markdown, ./nodebb reset -t persona',
].join('\n'));
process.exit(0);
}
async.series([db.init].concat(tasks), function (err) {
if (err) {
winston.error('[reset] Errors were encountered during reset -- ' + err.message);
return callback(err);
10 years ago
}
winston.info('[reset] Reset complete');
callback();
10 years ago
});
};
function resetSettings(callback) {
privileges.global.give(['local:login'], 'registered-users', function (err) {
if (err) {
return callback(err);
}
winston.info('[reset] registered-users given login privilege');
10 years ago
winston.info('[reset] Settings reset to default');
callback();
10 years ago
});
}
8 years ago
function resetTheme(themeId, callback) {
fs.access(path.join(dirname, 'node_modules', themeId, 'package.json'), function (err) {
if (err) {
winston.warn('[reset] Theme `%s` is not installed on this forum', themeId);
callback(new Error('theme-not-found'));
} else {
meta.themes.set({
type: 'local',
id: themeId,
}, function (err) {
if (err) {
winston.warn('[reset] Failed to reset theme to ' + themeId);
} else {
winston.info('[reset] Theme reset to ' + themeId);
}
callback();
});
}
});
}
10 years ago
function resetThemes(callback) {
meta.themes.set({
type: 'local',
id: 'nodebb-theme-persona',
}, function (err) {
10 years ago
winston.info('[reset] Theme reset to Persona');
callback(err);
10 years ago
});
}
8 years ago
function resetPlugin(pluginId, callback) {
9 years ago
var active = false;
async.waterfall([
async.apply(db.isSortedSetMember, 'plugins:active', pluginId),
function (isMember, next) {
9 years ago
active = isMember;
if (isMember) {
db.sortedSetRemove('plugins:active', pluginId, next);
} else {
next();
}
},
8 years ago
function (next) {
events.log({
type: 'plugin-deactivate',
text: pluginId,
}, next);
},
], function (err) {
10 years ago
if (err) {
winston.error('[reset] Could not disable plugin: ' + pluginId + ' encountered error %s', err);
} else if (active) {
winston.info('[reset] Plugin `%s` disabled', pluginId);
10 years ago
} else {
winston.warn('[reset] Plugin `%s` was not active on this forum', pluginId);
winston.info('[reset] No action taken.');
err = new Error('plugin-not-active');
10 years ago
}
callback(err);
10 years ago
});
}
function resetPlugins(callback) {
db.delete('plugins:active', function (err) {
10 years ago
winston.info('[reset] All Plugins De-activated');
callback(err);
10 years ago
});
}
function resetWidgets(callback) {
async.waterfall([
plugins.reload,
widgets.reset,
function (next) {
winston.info('[reset] All Widgets moved to Draft Zone');
next();
},
], callback);
10 years ago
}