2014-04-05 01:09:40 +00:00
// Generated by CoffeeScript 1.7.1
2014-04-04 21:57:22 +00:00
/ *
2013-11-19 13:53:36 +00:00
2014-04-04 21:57:22 +00:00
Dynamic Modules
=== === === === ===
> Compiles CoffeeScript modules and loads JS modules in a VM , together
> with only a few allowed node . js modules .
2014-04-05 01:09:40 +00:00
* /
2013-11-19 13:53:36 +00:00
2014-04-04 21:57:22 +00:00
( function ( ) {
2014-04-22 21:42:31 +00:00
var db , dynmod , encryption , fCallFunction , fCheckAndRun , fLoadModule , isRunning , listUserModules , log , logconf , logger , pollLoop ;
2013-11-19 13:53:36 +00:00
2014-04-04 21:57:22 +00:00
logger = require ( './logging' ) ;
2013-11-19 13:53:36 +00:00
2014-04-04 21:57:22 +00:00
db = require ( './persistence' ) ;
dynmod = require ( './dynamic-modules' ) ;
2014-04-19 01:49:48 +00:00
encryption = require ( './encryption' ) ;
2014-04-05 17:02:03 +00:00
if ( process . argv . length < 8 ) {
2014-02-17 22:27:26 +00:00
console . error ( 'Not all arguments have been passed!' ) ;
process . exit ( ) ;
}
2014-04-04 21:57:22 +00:00
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 ] ;
2014-02-17 22:27:26 +00:00
2014-02-19 13:14:08 +00:00
log = logger . getLogger ( logconf ) ;
2014-04-04 21:57:22 +00:00
log . info ( 'EP | Event Poller starts up' ) ;
2014-04-25 13:49:55 +00:00
process . on ( 'uncaughtException' , function ( err ) {
2014-04-28 20:23:27 +00:00
return log . error ( 'Probably one of the event pollers produced an error!' ) ;
2014-04-25 13:49:55 +00:00
} ) ;
2014-04-04 21:57:22 +00:00
db ( {
logger : log
} ) ;
dynmod ( {
2014-04-19 01:49:48 +00:00
logger : log
} ) ;
2014-04-22 13:24:34 +00:00
db . selectDatabase ( parseInt ( process . argv [ 7 ] ) || 0 ) ;
2014-04-19 01:49:48 +00:00
encryption ( {
2014-04-05 17:02:03 +00:00
logger : log ,
2014-04-22 13:24:34 +00:00
keygen : process . argv [ 8 ]
2014-04-04 21:57:22 +00:00
} ) ;
listUserModules = { } ;
isRunning = true ;
process . on ( 'disconnect' , function ( ) {
log . info ( 'EP | Shutting down Event Poller' ) ;
isRunning = false ;
return process . exit ( ) ;
} ) ;
process . on ( 'message' , function ( msg ) {
2014-04-17 16:19:40 +00:00
log . info ( "EP | Got info about new rule: " + msg . event ) ;
2014-04-26 00:16:06 +00:00
if ( msg . intevent === 'new' || msg . intevent === 'init' ) {
2014-04-04 21:57:22 +00:00
fLoadModule ( msg ) ;
2013-11-19 13:53:36 +00:00
}
2014-04-26 00:16:06 +00:00
if ( msg . intevent === 'del' ) {
2014-04-04 21:57:22 +00:00
delete listUserModules [ msg . user ] [ msg . ruleId ] ;
if ( JSON . stringify ( listUserModules [ msg . user ] ) === "{}" ) {
return delete listUserModules [ msg . user ] ;
2013-11-19 13:53:36 +00:00
}
}
} ) ;
2014-04-04 21:57:22 +00:00
fLoadModule = function ( msg ) {
var arrName , fAnonymous ;
2014-04-26 00:16:06 +00:00
arrName = msg . rule . eventname . split ( ' -> ' ) ;
2014-04-04 21:57:22 +00:00
fAnonymous = function ( ) {
2014-04-21 22:06:22 +00:00
return db . eventPollers . getModule ( msg . user , arrName [ 0 ] , function ( err , obj ) {
2014-04-04 21:57:22 +00:00
if ( ! obj ) {
2014-04-27 11:20:08 +00:00
return log . info ( "EP | No module retrieved for " + arrName [ 0 ] + ", must be a custom event or Webhook" ) ;
2014-04-04 21:57:22 +00:00
} else {
2014-04-22 21:42:31 +00:00
return dynmod . compileString ( obj . data , msg . user , msg . rule , arrName [ 0 ] , obj . lang , "eventpoller" , db . eventPollers , function ( result ) {
2014-04-22 13:24:34 +00:00
var nd , now , oUser , start ;
2014-04-04 21:57:22 +00:00
if ( ! result . answ === 200 ) {
2014-04-05 01:09:40 +00:00
log . error ( "EP | Compilation of code failed! " + msg . user + ", " + msg . rule . id + ", " + arrName [ 0 ] ) ;
2014-04-04 21:57:22 +00:00
}
if ( ! listUserModules [ msg . user ] ) {
listUserModules [ msg . user ] = { } ;
}
2014-04-20 18:35:52 +00:00
oUser = listUserModules [ msg . user ] ;
oUser [ msg . rule . id ] = {
2014-04-26 00:16:06 +00:00
id : msg . rule . eventname ,
2014-04-22 13:24:34 +00:00
timestamp : msg . rule . timestamp ,
2014-04-04 21:57:22 +00:00
pollfunc : arrName [ 1 ] ,
2014-04-20 18:35:52 +00:00
funcArgs : result . funcArgs ,
2014-04-26 00:16:06 +00:00
eventinterval : msg . rule . eventinterval * 60 * 1000 ,
2014-04-05 17:02:03 +00:00
module : result . module ,
2014-04-22 13:24:34 +00:00
logger : result . logger
2014-04-04 21:57:22 +00:00
} ;
2014-04-26 00:16:06 +00:00
start = new Date ( msg . rule . eventstart ) ;
2014-04-22 07:59:57 +00:00
nd = new Date ( ) ;
2014-04-22 13:24:34 +00:00
now = new Date ( ) ;
2014-04-22 07:59:57 +00:00
if ( start < nd ) {
2014-04-22 13:24:34 +00:00
nd . setMilliseconds ( 0 ) ;
nd . setSeconds ( 0 ) ;
nd . setMinutes ( start . getMinutes ( ) ) ;
nd . setHours ( start . getHours ( ) ) ;
if ( nd < now ) {
nd . setDate ( nd . getDate ( ) + 1 ) ;
2014-04-22 07:59:57 +00:00
}
2014-04-22 13:24:34 +00:00
} else {
nd = start ;
2014-04-22 07:59:57 +00:00
}
2014-04-26 00:16:06 +00:00
log . info ( "EP | New event module '" + arrName [ 0 ] + "' loaded for user " + msg . user + ", in rule " + msg . rule . id + ", registered at UTC|" + msg . rule . timestamp + ", starting at UTC|" + ( start . toISOString ( ) ) + " ( which is in " + ( ( nd - now ) / 1000 / 60 ) + " minutes ) and polling every " + msg . rule . eventinterval + " minutes" ) ;
2014-04-22 13:24:34 +00:00
return setTimeout ( fCheckAndRun ( msg . user , msg . rule . id , msg . rule . timestamp ) , nd - now ) ;
2014-04-04 21:57:22 +00:00
} ) ;
}
} ) ;
} ;
2014-04-26 00:16:06 +00:00
if ( msg . intevent === 'new' || ! listUserModules [ msg . user ] || ! listUserModules [ msg . user ] [ msg . rule . id ] ) {
2014-04-04 21:57:22 +00:00
return fAnonymous ( ) ;
2013-11-19 13:53:36 +00:00
}
} ;
2014-04-04 21:57:22 +00:00
2014-04-19 20:35:05 +00:00
fCheckAndRun = function ( userId , ruleId , timestamp ) {
2014-04-16 15:42:56 +00:00
return function ( ) {
var oRule ;
2014-04-17 16:19:40 +00:00
log . info ( "EP | Check and run user " + userId + ", rule " + ruleId ) ;
2014-04-16 15:42:56 +00:00
if ( isRunning && listUserModules [ userId ] && listUserModules [ userId ] [ ruleId ] ) {
2014-04-19 20:35:05 +00:00
if ( listUserModules [ userId ] [ ruleId ] . timestamp === timestamp ) {
oRule = listUserModules [ userId ] [ ruleId ] ;
fCallFunction ( userId , ruleId , oRule ) ;
2014-04-26 00:16:06 +00:00
return setTimeout ( fCheckAndRun ( userId , ruleId , timestamp ) , oRule . eventinterval ) ;
2014-04-19 20:35:05 +00:00
} else {
2014-04-22 13:24:34 +00:00
return log . info ( "EP | We found a newer polling interval and discontinue this one which was created at UTC|" + timestamp ) ;
2014-04-19 20:35:05 +00:00
}
2014-04-04 21:57:22 +00:00
}
2014-04-16 15:42:56 +00:00
} ;
2014-04-04 21:57:22 +00:00
} ;
2013-11-19 13:53:36 +00:00
2014-04-16 15:42:56 +00:00
fCallFunction = function ( userId , ruleId , oRule ) {
2014-04-20 18:35:52 +00:00
var arrArgs , err , oArg , _i , _len , _ref ;
2014-04-16 15:42:56 +00:00
try {
2014-04-20 18:35:52 +00:00
arrArgs = [ ] ;
2014-04-22 13:24:34 +00:00
if ( oRule . funcArgs && oRule . funcArgs [ oRule . pollfunc ] ) {
2014-04-20 18:35:52 +00:00
_ref = oRule . funcArgs [ oRule . pollfunc ] ;
for ( _i = 0 , _len = _ref . length ; _i < _len ; _i ++ ) {
oArg = _ref [ _i ] ;
arrArgs . push ( oArg . value ) ;
}
}
return oRule . module [ oRule . pollfunc ] . apply ( null , arrArgs ) ;
2014-04-16 15:42:56 +00:00
} catch ( _error ) {
err = _error ;
log . info ( "EP | ERROR in module when polled: " + oRule . id + " " + userId + ": " + err . message ) ;
2014-04-22 13:24:34 +00:00
throw err ;
2014-04-16 15:42:56 +00:00
return oRule . logger ( err . message ) ;
}
} ;
2014-04-04 21:57:22 +00:00
2014-04-17 16:19:40 +00:00
/ *
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 ( ) ;
2014-04-04 21:57:22 +00:00
} ) . call ( this ) ;