sief
Version:
Session hijacking tool in Node.
96 lines (75 loc) • 1.99 kB
JavaScript
var plugins = {};
var logger = require('log4js').getLogger('pluginLoader');
var path = require('path');
var chokidar = require('chokidar');
function loadPlugin(plugin) {
if (plugin instanceof Array) {
plugin.forEach(function (v) {
loadPlugin(v);
});
return;
}
var watcher = chokidar.watch(plugin, {
persistent: false,
ignored: function (file) {
var ignored = false;
if (file.indexOf(__dirname) > -1) {
ignored = false;
} else {
var extname = path.extname(file);
ignored = /node_modules|package.json/.test(file) || (extname && extname != '.js');
}
logger.debug('ignored', ignored, file);
return ignored;
}
});
watcher
.on('add', function (path, stat) {
logger.info(path + ' added');
_loadPlugin(path);
})
.on('change', function (path, stat) {
logger.info(path + ' changed');
_loadPlugin(path);
})
.on('unlink', function (path, stat) {
logger.info(path + ' deleted');
_unloadPlugin(path);
})
.on('error', function(error) {
logger.error('Error happened', error);
});
}
function _loadPlugin (file) {
var plugin;
var pluginName = path.basename(file, '.js');
try {
delete require.cache[file];
plugin = require(file);
} catch (e) {
logger.error(e);
return;
}
if (plugin) {
if (!plugin.run) {
plugin = null;
logger.error('Invalid plugin: run method not found');
return;
}
logger.info('Plugin ' + pluginName + (plugins[pluginName] ? ' reloaded' : ' loaded'));
plugins[pluginName] = plugin;
}
return plugin;
}
function _unloadPlugin(file) {
var pluginName = path.basename(file, '.js');
if (plugins[pluginName])
logger.info('Plugin ' + pluginName + ' unloaded');
delete plugins[pluginName];
}
module.exports = {
getPlugin: function (name) {
return plugins[name];
},
loadPlugin: loadPlugin
};