mirror of
https://github.com/Hopiu/webapi-eca.git
synced 2026-03-16 22:10:31 +00:00
157 lines
4.2 KiB
JavaScript
157 lines
4.2 KiB
JavaScript
// Generated by CoffeeScript 1.7.1
|
|
|
|
/*
|
|
|
|
Dynamic Modules
|
|
===============
|
|
> Compiles CoffeeScript modules and loads JS modules in a VM, together
|
|
> with only a few allowed node.js modules.
|
|
*/
|
|
|
|
(function() {
|
|
var db, dynmod, encryption, fCallFunction, fCheckAndRun, fLoadModule, isRunning, listUserModules, log, logconf, logger, pollLoop;
|
|
|
|
logger = require('./logging');
|
|
|
|
db = require('./persistence');
|
|
|
|
dynmod = require('./dynamic-modules');
|
|
|
|
encryption = require('./encryption');
|
|
|
|
if (process.argv.length < 8) {
|
|
console.error('Not all arguments have been passed!');
|
|
process.exit();
|
|
}
|
|
|
|
logconf = {
|
|
mode: process.argv[2],
|
|
nolog: process.argv[6]
|
|
};
|
|
|
|
logconf['io-level'] = process.argv[3];
|
|
|
|
logconf['file-level'] = process.argv[4];
|
|
|
|
logconf['file-path'] = process.argv[5];
|
|
|
|
log = logger.getLogger(logconf);
|
|
|
|
log.info('EP | Event Poller starts up');
|
|
|
|
db({
|
|
logger: log
|
|
});
|
|
|
|
dynmod({
|
|
logger: log
|
|
});
|
|
|
|
encryption({
|
|
logger: log,
|
|
keygen: process.argv[7]
|
|
});
|
|
|
|
listUserModules = {};
|
|
|
|
isRunning = true;
|
|
|
|
process.on('disconnect', function() {
|
|
log.info('EP | Shutting down Event Poller');
|
|
isRunning = false;
|
|
return process.exit();
|
|
});
|
|
|
|
process.on('message', function(msg) {
|
|
log.info("EP | Got info about new rule: " + msg.event);
|
|
if (msg.event === 'new' || msg.event === 'init') {
|
|
fLoadModule(msg);
|
|
}
|
|
if (msg.event === 'del') {
|
|
delete listUserModules[msg.user][msg.ruleId];
|
|
if (JSON.stringify(listUserModules[msg.user]) === "{}") {
|
|
return delete listUserModules[msg.user];
|
|
}
|
|
}
|
|
});
|
|
|
|
fLoadModule = function(msg) {
|
|
var arrName, fAnonymous;
|
|
arrName = msg.rule.event.split(' -> ');
|
|
fAnonymous = function() {
|
|
return db.eventPollers.getModule(arrName[0], function(err, obj) {
|
|
if (!obj) {
|
|
return log.warn("EP | Strange... no module retrieved: " + arrName[0]);
|
|
} else {
|
|
return dynmod.compileString(obj.data, msg.user, msg.rule.id, arrName[0], obj.lang, db.eventPollers, function(result) {
|
|
var iv;
|
|
if (!result.answ === 200) {
|
|
log.error("EP | Compilation of code failed! " + msg.user + ", " + msg.rule.id + ", " + arrName[0]);
|
|
}
|
|
if (!listUserModules[msg.user]) {
|
|
listUserModules[msg.user] = {};
|
|
}
|
|
iv = msg.rule.event_interval * 60 * 1000;
|
|
listUserModules[msg.user][msg.rule.id] = {
|
|
id: msg.rule.event,
|
|
pollfunc: arrName[1],
|
|
event_interval: iv,
|
|
module: result.module,
|
|
logger: result.logger
|
|
};
|
|
log.info("EP | New event module '" + arrName[0] + "' loaded for user " + msg.user + ", in rule " + msg.rule.id + ", polling every " + msg.rule.event_interval + " minutes");
|
|
return setTimeout(fCheckAndRun(msg.user, msg.rule.id), iv);
|
|
});
|
|
}
|
|
});
|
|
};
|
|
if (msg.event === 'new' || !listUserModules[msg.user] || !listUserModules[msg.user][msg.rule.id]) {
|
|
return fAnonymous();
|
|
}
|
|
};
|
|
|
|
fCheckAndRun = function(userId, ruleId) {
|
|
return function() {
|
|
var oRule;
|
|
log.info("EP | Check and run user " + userId + ", rule " + ruleId);
|
|
if (isRunning && listUserModules[userId] && listUserModules[userId][ruleId]) {
|
|
oRule = listUserModules[userId][ruleId];
|
|
fCallFunction(userId, ruleId, oRule);
|
|
return setTimeout(fCheckAndRun(userId, ruleId), oRule.event_interval);
|
|
}
|
|
};
|
|
};
|
|
|
|
fCallFunction = function(userId, ruleId, oRule) {
|
|
var err;
|
|
try {
|
|
return oRule.module[oRule.pollfunc](function(obj) {
|
|
return db.pushEvent({
|
|
event: oRule.id,
|
|
eventid: "polled " + oRule.id + " " + userId + "_" + ((new Date).toISOString()),
|
|
payload: obj
|
|
});
|
|
});
|
|
} catch (_error) {
|
|
err = _error;
|
|
log.info("EP | ERROR in module when polled: " + oRule.id + " " + userId + ": " + err.message);
|
|
return oRule.logger(err.message);
|
|
}
|
|
};
|
|
|
|
|
|
/*
|
|
This function will loop infinitely every 10 seconds until isRunning is set to false
|
|
|
|
@private pollLoop()
|
|
*/
|
|
|
|
pollLoop = function() {
|
|
if (isRunning) {
|
|
return setTimeout(pollLoop, 10000);
|
|
}
|
|
};
|
|
|
|
pollLoop();
|
|
|
|
}).call(this);
|