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-17 16:19:40 +00:00
var db , dynmod , 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-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-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-16 15:42:56 +00:00
var iv ;
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-17 16:19:40 +00:00
iv = msg . rule . event _interval * 60 * 1000 ;
2014-04-04 21:57:22 +00:00
listUserModules [ msg . user ] [ msg . rule . id ] = {
id : msg . rule . event ,
pollfunc : arrName [ 1 ] ,
2014-04-17 16:19:40 +00:00
event _interval : iv ,
2014-04-05 17:02:03 +00:00
module : result . module ,
logger : result . logger
2014-04-04 21:57:22 +00:00
} ;
2014-04-17 16:19:40 +00:00
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" ) ;
2014-04-16 15:42:56 +00:00
return setTimeout ( fCheckAndRun ( msg . user , msg . rule . id ) , iv ) ;
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-16 15:42:56 +00:00
fCheckAndRun = function ( userId , ruleId ) {
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 ] ) {
oRule = listUserModules [ userId ] [ ruleId ] ;
fCallFunction ( userId , ruleId , oRule ) ;
2014-04-17 16:19:40 +00:00
return setTimeout ( fCheckAndRun ( userId , ruleId ) , oRule . event _interval ) ;
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 ) {
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 ) ;
}
} ;
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 ) ;