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-20 18:35:52 +00:00
var db , dynmod , encryption , fCallFunction , fCheckAndRun , fLoadModule , fPushEvent , 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' ) ;
db ( {
logger : log
} ) ;
dynmod ( {
2014-04-19 01:49:48 +00:00
logger : log
} ) ;
encryption ( {
2014-04-05 17:02:03 +00:00
logger : log ,
keygen : process . argv [ 7 ]
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-04 21:57:22 +00:00
if ( msg . event === 'new' || msg . event === 'init' ) {
fLoadModule ( msg ) ;
2013-11-19 13:53:36 +00:00
}
2014-04-04 21:57:22 +00:00
if ( msg . event === 'del' ) {
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 ;
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 ) {
2014-04-20 18:35:52 +00:00
var oUser , ts ;
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 ] ;
2014-04-19 20:35:05 +00:00
ts = new Date ( ) ;
2014-04-20 18:35:52 +00:00
oUser [ msg . rule . id ] = {
2014-04-04 21:57:22 +00:00
id : msg . rule . event ,
pollfunc : arrName [ 1 ] ,
2014-04-20 18:35:52 +00:00
funcArgs : result . funcArgs ,
2014-04-19 20:35:05 +00:00
event _interval : msg . rule . event _interval * 60 * 1000 ,
2014-04-05 17:02:03 +00:00
module : result . module ,
2014-04-19 20:35:05 +00:00
logger : result . logger ,
timestamp : ts
2014-04-04 21:57:22 +00:00
} ;
2014-04-20 18:35:52 +00:00
oUser [ msg . rule . id ] . module . pushEvent = fPushEvent ( msg . user , msg . rule . id , oUser [ msg . rule . id ] ) ;
2014-04-20 23:34:49 +00:00
log . info ( "EP | New event module '" + arrName [ 0 ] + "' loaded for user " + msg . user + ", in rule " + msg . rule . id + ", starting at UTC|" + ( ts . toISOString ( ) ) + " and polling every " + msg . rule . event _interval + " minutes" ) ;
2014-04-20 18:35:52 +00:00
return setTimeout ( fCheckAndRun ( msg . user , msg . rule . id , ts ) , 1000 ) ;
2014-04-04 21:57:22 +00:00
} ) ;
}
} ) ;
} ;
if ( msg . event === 'new' || ! listUserModules [ msg . user ] || ! listUserModules [ msg . user ] [ msg . rule . id ] ) {
return fAnonymous ( ) ;
2013-11-19 13:53:36 +00:00
}
} ;
2014-04-04 21:57:22 +00:00
2014-04-20 18:35:52 +00:00
fPushEvent = function ( userId , ruleId , oRule ) {
return function ( obj ) {
return db . pushEvent ( {
event : oRule . id ,
2014-04-20 23:34:49 +00:00
eventid : "polled " + oRule . id + " " + userId + "_UTC|" + ( ( new Date ( ) ) . toISOString ( ) ) ,
2014-04-20 18:35:52 +00:00
payload : obj
} ) ;
} ;
} ;
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 ) ;
return setTimeout ( fCheckAndRun ( userId , ruleId , timestamp ) , oRule . event _interval ) ;
} else {
2014-04-20 23:34:49 +00:00
return log . info ( "EP | We found a newer polling interval and discontinue this one which was created at UTC|" + ( timestamp . toISOString ( ) ) ) ;
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 = [ ] ;
if ( oRule . funcArgs ) {
_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 ) ;
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 ) ;