Files
NodeBB/src/plugins/install.js

155 lines
3.7 KiB
JavaScript
Raw Normal View History

2014-12-26 18:54:20 -05:00
'use strict';
var winston = require('winston'),
async = require('async'),
path = require('path'),
fs = require('fs'),
nconf = require('nconf'),
os = require('os'),
2014-12-26 18:54:20 -05:00
db = require('../database'),
meta = require('../meta'),
pubsub = require('../pubsub');
module.exports = function (Plugins) {
2014-12-26 18:54:20 -05:00
if (nconf.get('isPrimary') === 'true') {
pubsub.on('plugins:toggleInstall', function (data) {
if (data.hostname !== os.hostname()) {
toggleInstall(data.id, data.version);
}
});
pubsub.on('plugins:upgrade', function (data) {
if (data.hostname !== os.hostname()) {
upgrade(data.id, data.version);
}
});
}
Plugins.toggleActive = function (id, callback) {
callback = callback || function () {};
2014-12-26 19:17:37 -05:00
var isActive;
async.waterfall([
function (next) {
2014-12-26 19:17:37 -05:00
Plugins.isActive(id, next);
},
function (_isActive, next) {
2014-12-26 19:17:37 -05:00
isActive = _isActive;
2015-02-23 14:57:22 -05:00
if (isActive) {
db.sortedSetRemove('plugins:active', id, next);
} else {
db.sortedSetCard('plugins:active', function (err, count) {
2015-02-23 14:57:22 -05:00
if (err) {
return next(err);
}
2015-09-12 15:14:49 -04:00
db.sortedSetAdd('plugins:active', count, id, next);
});
2015-02-23 14:57:22 -05:00
}
2014-12-26 19:17:37 -05:00
},
function (next) {
2014-12-26 19:17:37 -05:00
meta.reloadRequired = true;
Plugins.fireHook(isActive ? 'action:plugin.deactivate' : 'action:plugin.activate', id);
next();
}
], function (err) {
2014-12-26 18:54:20 -05:00
if (err) {
winston.warn('[plugins] Could not toggle active state on plugin \'' + id + '\'');
return callback(err);
}
2014-12-26 19:17:37 -05:00
callback(null, {id: id, active: !isActive});
2014-12-26 18:54:20 -05:00
});
};
Plugins.toggleInstall = function (id, version, callback) {
pubsub.publish('plugins:toggleInstall', {hostname: os.hostname(), id: id, version: version});
toggleInstall(id, version, callback);
};
function toggleInstall(id, version, callback) {
Plugins.isInstalled(id, function (err, installed) {
2014-12-26 18:54:20 -05:00
if (err) {
return callback(err);
}
2015-01-15 12:34:11 -05:00
var type = installed ? 'uninstall' : 'install';
2014-12-26 18:54:20 -05:00
async.waterfall([
function (next) {
2014-12-26 18:54:20 -05:00
Plugins.isActive(id, next);
},
function (active, next) {
2014-12-26 18:54:20 -05:00
if (active) {
Plugins.toggleActive(id, function (err, status) {
2014-12-26 18:54:20 -05:00
next(err);
});
return;
}
next();
},
function (next) {
var command = installed ? ('npm uninstall ' + id) : ('npm install ' + id + '@' + (version || 'latest'));
runNpmCommand(command, next);
2014-12-26 18:54:20 -05:00
}
], function (err) {
2015-01-15 12:34:11 -05:00
if (err) {
return callback(err);
}
2015-07-08 17:04:21 -04:00
Plugins.get(id, function (err, pluginData) {
2016-08-16 19:46:59 +02:00
if (err) {
return callback(err);
}
2015-07-08 17:04:21 -04:00
Plugins.fireHook('action:plugin.' + type, id);
callback(null, pluginData);
});
2014-12-26 18:54:20 -05:00
});
});
}
2014-12-26 18:54:20 -05:00
function runNpmCommand(command, callback) {
require('child_process').exec(command, function (err, stdout) {
if (err) {
return callback(err);
}
winston.info('[plugins] ' + stdout);
callback(err);
});
}
Plugins.upgrade = function (id, version, callback) {
pubsub.publish('plugins:upgrade', {hostname: os.hostname(), id: id, version: version});
upgrade(id, version, callback);
};
function upgrade(id, version, callback) {
2014-12-26 18:54:20 -05:00
async.waterfall([
function (next) {
runNpmCommand('npm install ' + id + '@' + (version || 'latest'), next);
2015-03-06 13:00:56 -05:00
},
function (next) {
2015-03-06 13:00:56 -05:00
Plugins.isActive(id, next);
},
function (isActive, next) {
2015-03-06 13:00:56 -05:00
meta.reloadRequired = isActive;
next(null, isActive);
2014-12-26 18:54:20 -05:00
}
], callback);
}
2014-12-26 18:54:20 -05:00
Plugins.isInstalled = function (id, callback) {
var pluginDir = path.join(__dirname, '../../node_modules', id);
2014-12-26 18:54:20 -05:00
fs.stat(pluginDir, function (err, stats) {
2014-12-26 18:54:20 -05:00
callback(null, err ? false : stats.isDirectory());
});
};
Plugins.isActive = function (id, callback) {
2015-02-23 14:57:22 -05:00
db.isSortedSetMember('plugins:active', id, callback);
2014-12-26 18:54:20 -05:00
};
2015-02-23 15:55:35 -05:00
Plugins.getActive = function (callback) {
2015-02-23 15:55:35 -05:00
db.getSortedSetRange('plugins:active', 0, -1, callback);
};
2014-12-26 18:54:20 -05:00
};