From d97d6349955ef5d51f8bf3d12b7209428bed9408 Mon Sep 17 00:00:00 2001 From: Dominic Bosch Date: Thu, 24 Apr 2014 17:34:00 +0200 Subject: [PATCH] Started UI improvements for the rules forge --- coffee/components-manager.coffee | 270 ++++++++++------- coffee/dynamic-modules.coffee | 2 +- coffee/engine.coffee | 5 +- coffee/persistence.coffee | 31 ++ documentation/techdoc/techdoc.tex | 2 +- examples/action-invokers/neospeech.coffee | 2 +- examples/action-invokers/system.coffee | 8 +- examples/event-pollers/importio.coffee | 39 +-- examples/eventproducers/hoststatistics.coffee | 94 ++++-- js/components-manager.js | 275 +++++++++++------- js/dynamic-modules.js | 2 +- js/engine.js | 5 +- js/persistence.js | 44 +++ testing/files/testObjects.json | 6 +- testing/test_components-manager.coffee | 28 +- webpages/handlers/coffee/edit_modules.coffee | 2 +- webpages/handlers/coffee/edit_rules.coffee | 4 +- webpages/handlers/coffee/forge_event.coffee | 34 ++- webpages/handlers/coffee/forge_module.coffee | 14 +- webpages/handlers/coffee/forge_rule.coffee | 164 +++++++---- webpages/handlers/coffee/forge_webhook.coffee | 0 webpages/handlers/js/edit_modules.js | 2 +- webpages/handlers/js/edit_rules.js | 4 +- webpages/handlers/js/forge_event.js | 51 +++- webpages/handlers/js/forge_module.js | 16 +- webpages/handlers/js/forge_rule.js | 205 ++++++++----- webpages/handlers/js/forge_webhook.js | 5 + webpages/handlers/templates/forge_event.html | 4 +- webpages/handlers/templates/forge_module.html | 2 +- webpages/handlers/templates/forge_rule.html | 27 +- .../handlers/templates/forge_webhook.html | 5 + webpages/handlers/templates/menubar.html | 27 +- webpages/public/histogram.html | 6 +- webpages/public/style.css | 4 + 34 files changed, 916 insertions(+), 473 deletions(-) create mode 100644 webpages/handlers/coffee/forge_webhook.coffee create mode 100644 webpages/handlers/js/forge_webhook.js create mode 100644 webpages/handlers/templates/forge_webhook.html diff --git a/coffee/components-manager.coffee b/coffee/components-manager.coffee index a6c631e..a82d63f 100644 --- a/coffee/components-manager.coffee +++ b/coffee/components-manager.coffee @@ -87,21 +87,21 @@ Processes a user request coming through the request-handler. - `oReq` is the request object that contains: - `command` as a string - - `payload` an optional stringified JSON object + - `body` an optional stringified JSON object The callback function `callback( obj )` will receive an object containing the HTTP response code and a corresponding message. @public processRequest ( *user, oReq, callback* ) ### exports.processRequest = ( user, oReq, callback ) -> - if not oReq.payload - oReq.payload = '{}' + if not oReq.body + oReq.body = '{}' try - dat = JSON.parse oReq.payload + dat = JSON.parse oReq.body catch err return callback code: 404 - message: 'You had a strange payload in your request!' + message: 'You had a strange body in your request!' if commandFunctions[oReq.command] # If the command function was registered we invoke it @@ -112,17 +112,17 @@ exports.processRequest = ( user, oReq, callback ) -> message: 'What do you want from me?' ### -Checks whether all required parameters are present in the payload. +Checks whether all required parameters are present in the body. -@private hasRequiredParams ( *arrParams, oPayload* ) +@private hasRequiredParams ( *arrParams, oBody* ) @param {Array} arrParams -@param {Object} oPayload +@param {Object} oBody ### -hasRequiredParams = ( arrParams, oPayload ) -> +hasRequiredParams = ( arrParams, oBody ) -> answ = code: 400 message: "Your request didn't contain all necessary fields! Requires: #{ arrParams.join() }" - return answ for param in arrParams when not oPayload[param] + return answ for param in arrParams when not oBody[param] answ.code = 200 answ.message = 'All required properties found' answ @@ -130,13 +130,13 @@ hasRequiredParams = ( arrParams, oPayload ) -> ### Fetches all available modules and return them together with the available functions. -@private getModules ( *user, oPayload, dbMod, callback* ) +@private getModules ( *user, oBody, dbMod, callback* ) @param {Object} user -@param {Object} oPayload +@param {Object} oBody @param {Object} dbMod @param {function} callback ### -getModules = ( user, oPayload, dbMod, callback ) -> +getModules = ( user, oBody, dbMod, callback ) -> fProcessIds = ( userName ) -> ( err, arrNames ) -> oRes = {} @@ -158,21 +158,21 @@ getModules = ( user, oPayload, dbMod, callback ) -> dbMod.getAvailableModuleIds user.username, fProcessIds user.username -getModuleParams = ( user, oPayload, dbMod, callback ) -> - answ = hasRequiredParams [ 'id' ], oPayload +getModuleParams = ( user, oBody, dbMod, callback ) -> + answ = hasRequiredParams [ 'id' ], oBody if answ.code isnt 200 callback answ else - dbMod.getModuleField user.username, oPayload.id, "params", ( err, oPayload ) -> - answ.message = oPayload + dbMod.getModuleField user.username, oBody.id, "params", ( err, oBody ) -> + answ.message = oBody callback answ -getModuleUserParams = ( user, oPayload, dbMod, callback ) -> - answ = hasRequiredParams [ 'id' ], oPayload +getModuleUserParams = ( user, oBody, dbMod, callback ) -> + answ = hasRequiredParams [ 'id' ], oBody if answ.code isnt 200 callback answ else - dbMod.getUserParams oPayload.id, user.username, ( err, str ) -> + dbMod.getUserParams oBody.id, user.username, ( err, str ) -> oParams = JSON.parse str for name, oParam of oParams if not oParam.shielded @@ -180,58 +180,58 @@ getModuleUserParams = ( user, oPayload, dbMod, callback ) -> answ.message = JSON.stringify oParams callback answ -getModuleUserArguments = ( user, oPayload, dbMod, callback ) -> - answ = hasRequiredParams [ 'ruleId' ,'moduleId' ], oPayload +getModuleUserArguments = ( user, oBody, dbMod, callback ) -> + answ = hasRequiredParams [ 'ruleId' ,'moduleId' ], oBody if answ.code isnt 200 callback answ else - dbMod.getAllModuleUserArguments user.username, oPayload.ruleId, oPayload.moduleId, ( err, oPayload ) -> - answ.message = oPayload + dbMod.getAllModuleUserArguments user.username, oBody.ruleId, oBody.moduleId, ( err, oBody ) -> + answ.message = oBody callback answ -forgeModule = ( user, oPayload, modType, dbMod, callback ) => - answ = hasRequiredParams [ 'id', 'params', 'lang', 'data' ], oPayload +forgeModule = ( user, oBody, modType, dbMod, callback ) => + answ = hasRequiredParams [ 'id', 'params', 'lang', 'data' ], oBody if answ.code isnt 200 callback answ else - if oPayload.overwrite - storeModule user, oPayload, modType, dbMod, callback + if oBody.overwrite + storeModule user, oBody, modType, dbMod, callback else - dbMod.getModule user.username, oPayload.id, ( err, mod ) => + dbMod.getModule user.username, oBody.id, ( err, mod ) => if mod answ.code = 409 - answ.message = 'Module name already existing: ' + oPayload.id + answ.message = 'Module name already existing: ' + oBody.id callback answ else - storeModule user, oPayload, modType, dbMod, callback + storeModule user, oBody, modType, dbMod, callback -storeModule = ( user, oPayload, modType, dbMod, callback ) => - src = oPayload.data - dynmod.compileString src, user.username, id: 'dummyRule' , oPayload.id, oPayload.lang, modType, null, ( cm ) => +storeModule = ( user, oBody, modType, dbMod, callback ) => + src = oBody.data + dynmod.compileString src, user.username, id: 'dummyRule' , oBody.id, oBody.lang, modType, null, ( cm ) => answ = cm.answ if answ.code is 200 funcs = [] funcs.push name for name, id of cm.module @log.info "CM | Storing new module with functions #{ funcs.join( ', ' ) }" answ.message = - " Module #{ oPayload.id } successfully stored! Found following function(s): #{ funcs }" - oPayload.functions = JSON.stringify funcs - oPayload.functionArgs = JSON.stringify cm.funcParams - dbMod.storeModule user.username, oPayload - # if oPayload.public is 'true' - # dbMod.publish oPayload.id + " Module #{ oBody.id } successfully stored! Found following function(s): #{ funcs }" + oBody.functions = JSON.stringify funcs + oBody.functionArgs = JSON.stringify cm.funcParams + dbMod.storeModule user.username, oBody + # if oBody.public is 'true' + # dbMod.publish oBody.id callback answ -storeRule = ( user, oPayload, callback ) => +storeRule = ( user, oBody, callback ) => # This is how a rule is stored in the database rule = - id: oPayload.id - event: oPayload.event - event_start: oPayload.event_start - event_interval: oPayload.event_interval - conditions: oPayload.conditions - actions: oPayload.actions - if oPayload.event_start + id: oBody.id + event: oBody.event + event_start: oBody.event_start + event_interval: oBody.event_interval + conditions: oBody.conditions + actions: oBody.actions + if oBody.event_start rule.timestamp = (new Date()).toISOString() strRule = JSON.stringify rule # store the rule @@ -241,20 +241,20 @@ storeRule = ( user, oPayload, callback ) => # activate the rule db.activateRule rule.id, user.username # if event module parameters were send, store them - if oPayload.event_params + if oBody.event_params epModId = rule.event.split( ' -> ' )[ 0 ] - db.eventPollers.storeUserParams epModId, user.username, JSON.stringify oPayload.event_params - oFuncArgs = oPayload.event_functions + db.eventPollers.storeUserParams epModId, user.username, JSON.stringify oBody.event_params + oFuncArgs = oBody.event_functions # if event function arguments were send, store them for id, args of oFuncArgs arr = id.split ' -> ' db.eventPollers.storeUserArguments user.username, rule.id, arr[ 0 ], arr[ 1 ], JSON.stringify args # if action module params were send, store them - oParams = oPayload.action_params + oParams = oBody.action_params for id, params of oParams db.actionInvokers.storeUserParams id, user.username, JSON.stringify params - oFuncArgs = oPayload.action_functions + oFuncArgs = oBody.action_functions # if action function arguments were send, store them for id, args of oFuncArgs arr = id.split ' -> ' @@ -276,126 +276,133 @@ storeRule = ( user, oPayload, callback ) => code: 200 message: "Rule '#{ rule.id }' stored and activated!" + +# +# COMMAND FUNCTIONS +# ================= +# +# Those are the answers to user requests. + commandFunctions = - get_public_key: ( user, oPayload, callback ) -> + get_public_key: ( user, oBody, callback ) -> callback code: 200 message: encryption.getPublicKey() # EVENT POLLERS # ------------- - get_event_pollers: ( user, oPayload, callback ) -> - getModules user, oPayload, db.eventPollers, callback + get_event_pollers: ( user, oBody, callback ) -> + getModules user, oBody, db.eventPollers, callback - get_full_event_poller: ( user, oPayload, callback ) -> - db.eventPollers.getModule user.username, oPayload.id, ( err, obj ) -> + get_full_event_poller: ( user, oBody, callback ) -> + db.eventPollers.getModule user.username, oBody.id, ( err, obj ) -> callback code: 200 message: JSON.stringify obj - get_event_poller_params: ( user, oPayload, callback ) -> - getModuleParams user, oPayload, db.eventPollers, callback + get_event_poller_params: ( user, oBody, callback ) -> + getModuleParams user, oBody, db.eventPollers, callback - get_event_poller_user_params: ( user, oPayload, callback ) -> - getModuleUserParams user, oPayload, db.eventPollers, callback + get_event_poller_user_params: ( user, oBody, callback ) -> + getModuleUserParams user, oBody, db.eventPollers, callback - get_event_poller_user_arguments: ( user, oPayload, callback ) -> - getModuleUserArguments user, oPayload, db.eventPollers, callback + get_event_poller_user_arguments: ( user, oBody, callback ) -> + getModuleUserArguments user, oBody, db.eventPollers, callback - get_event_poller_function_arguments: ( user, oPayload, callback ) -> - answ = hasRequiredParams [ 'id' ], oPayload + get_event_poller_function_arguments: ( user, oBody, callback ) -> + answ = hasRequiredParams [ 'id' ], oBody if answ.code isnt 200 callback answ else - db.eventPollers.getModuleField user.username, oPayload.id, 'functionArgs', ( err, obj ) -> + db.eventPollers.getModuleField user.username, oBody.id, 'functionArgs', ( err, obj ) -> callback code: 200 message: obj - forge_event_poller: ( user, oPayload, callback ) -> - forgeModule user, oPayload, "eventpoller", db.eventPollers, callback + forge_event_poller: ( user, oBody, callback ) -> + forgeModule user, oBody, "eventpoller", db.eventPollers, callback - delete_event_poller: ( user, oPayload, callback ) -> - answ = hasRequiredParams [ 'id' ], oPayload + delete_event_poller: ( user, oBody, callback ) -> + answ = hasRequiredParams [ 'id' ], oBody if answ.code isnt 200 callback answ else - db.eventPollers.deleteModule user.username, oPayload.id + db.eventPollers.deleteModule user.username, oBody.id callback code: 200 message: 'OK!' # ACTION INVOKERS # --------------- - get_action_invokers: ( user, oPayload, callback ) -> - getModules user, oPayload, db.actionInvokers, callback + get_action_invokers: ( user, oBody, callback ) -> + getModules user, oBody, db.actionInvokers, callback - get_full_action_invoker: ( user, oPayload, callback ) -> - answ = hasRequiredParams [ 'id' ], oPayload + get_full_action_invoker: ( user, oBody, callback ) -> + answ = hasRequiredParams [ 'id' ], oBody if answ.code isnt 200 callback answ else - db.actionInvokers.getModule user.username, oPayload.id, ( err, obj ) -> + db.actionInvokers.getModule user.username, oBody.id, ( err, obj ) -> callback code: 200 message: JSON.stringify obj - get_action_invoker_params: ( user, oPayload, callback ) -> - getModuleParams user, oPayload, db.actionInvokers, callback + get_action_invoker_params: ( user, oBody, callback ) -> + getModuleParams user, oBody, db.actionInvokers, callback - get_action_invoker_user_params: ( user, oPayload, callback ) -> - getModuleUserParams user, oPayload, db.actionInvokers, callback + get_action_invoker_user_params: ( user, oBody, callback ) -> + getModuleUserParams user, oBody, db.actionInvokers, callback - get_action_invoker_user_arguments: ( user, oPayload, callback ) -> - getModuleUserArguments user, oPayload, db.actionInvokers, callback + get_action_invoker_user_arguments: ( user, oBody, callback ) -> + getModuleUserArguments user, oBody, db.actionInvokers, callback - get_action_invoker_function_arguments: ( user, oPayload, callback ) -> - answ = hasRequiredParams [ 'id' ], oPayload + get_action_invoker_function_arguments: ( user, oBody, callback ) -> + answ = hasRequiredParams [ 'id' ], oBody if answ.code isnt 200 callback answ else - db.actionInvokers.getModuleField user.username, oPayload.id, 'functionArgs', ( err, obj ) -> + db.actionInvokers.getModuleField user.username, oBody.id, 'functionArgs', ( err, obj ) -> callback code: 200 message: obj - forge_action_invoker: ( user, oPayload, callback ) -> - forgeModule user, oPayload, "actioninvoker", db.actionInvokers, callback + forge_action_invoker: ( user, oBody, callback ) -> + forgeModule user, oBody, "actioninvoker", db.actionInvokers, callback - delete_action_invoker: ( user, oPayload, callback ) -> - answ = hasRequiredParams [ 'id' ], oPayload + delete_action_invoker: ( user, oBody, callback ) -> + answ = hasRequiredParams [ 'id' ], oBody if answ.code isnt 200 callback answ else - db.actionInvokers.deleteModule user.username, oPayload.id + db.actionInvokers.deleteModule user.username, oBody.id callback code: 200 message: 'OK!' # RULES # ----- - get_rules: ( user, oPayload, callback ) -> + get_rules: ( user, oBody, callback ) -> db.getUserLinkedRules user.username, ( err, obj ) -> callback code: 200 message: obj - get_rule: ( user, oPayload, callback ) -> - answ = hasRequiredParams [ 'id' ], oPayload + get_rule: ( user, oBody, callback ) -> + answ = hasRequiredParams [ 'id' ], oBody if answ.code isnt 200 callback answ else - db.getRule oPayload.id, ( err, obj ) -> + db.getRule oBody.id, ( err, obj ) -> callback code: 200 message: obj - get_rule_log: ( user, oPayload, callback ) -> - answ = hasRequiredParams [ 'id' ], oPayload + get_rule_log: ( user, oBody, callback ) -> + answ = hasRequiredParams [ 'id' ], oBody if answ.code isnt 200 callback answ else - db.getLog user.username, oPayload.id, ( err, obj ) -> + db.getLog user.username, oBody.id, ( err, obj ) -> callback code: 200 message: obj @@ -406,33 +413,78 @@ commandFunctions = # - event # - conditions # - actions - forge_rule: ( user, oPayload, callback ) -> - answ = hasRequiredParams [ 'id', 'event', 'conditions', 'actions' ], oPayload + forge_rule: ( user, oBody, callback ) -> + answ = hasRequiredParams [ 'id', 'event', 'conditions', 'actions' ], oBody if answ.code isnt 200 callback answ else - if oPayload.overwrite - storeRule user, oPayload, callback + if oBody.overwrite + storeRule user, oBody, callback else - db.getRule oPayload.id, ( err, mod ) => + db.getRule oBody.id, ( err, mod ) => if mod answ.code = 409 - answ.message = 'Rule name already existing: ' + oPayload.id + answ.message = 'Rule name already existing: ' + oBody.id callback answ else - storeRule user, oPayload, callback + storeRule user, oBody, callback - delete_rule: ( user, oPayload, callback ) -> - answ = hasRequiredParams [ 'id' ], oPayload + delete_rule: ( user, oBody, callback ) -> + answ = hasRequiredParams [ 'id' ], oBody if answ.code isnt 200 callback answ else - db.deleteRule oPayload.id + db.deleteRule oBody.id eventEmitter.emit 'rule', event: 'del' user: user.username rule: null - ruleId: oPayload.id + ruleId: oBody.id callback code: 200 message: 'OK!' + + + create_webhook: ( user, oBody, callback ) -> + answ = hasRequiredParams [ 'hookname' ], oBody + if answ.code isnt 200 + callback answ + else + db.getWebhooks ( err, hooks ) => + if hooks.indexOf oBody.hookname > -1 + answ.code = 409 + answ.message = 'Webhook already existing: ' + oBody.hookname + callback answ + else + db.storeWebhook user.username, oBody.hookname + callback + code: 200 + message: 'OK!' + + delete_webhook: ( user, oBody, callback ) -> + answ = hasRequiredParams [ 'hookname' ], oBody + if answ.code isnt 200 + callback answ + else + db.getWebhooks ( err, hooks ) => + if hooks.indexOf oBody.hookname is -1 + answ.code = 409 + answ.message = 'Webhook does not exist: ' + oBody.hookname + callback answ + else + db.deleteWebhook user.username, oBody.hookname + callback + code: 200 + message: 'OK!' + + get_webhooks: ( user, oBody, callback ) -> + db.getWebhooks user.username, ( err, data ) -> + if err + callback + code: 400 + message: "We didn't like your request!" + else + callback + code: 200 + message: JSON.stringify data + diff --git a/coffee/dynamic-modules.coffee b/coffee/dynamic-modules.coffee index 7d97b84..d5d6e02 100644 --- a/coffee/dynamic-modules.coffee +++ b/coffee/dynamic-modules.coffee @@ -100,7 +100,7 @@ fPushEvent = ( userId, oRule, modType ) -> db.pushEvent event: oRule.event + '_created:' + oRule.timestamp eventid: "#{ userId }_#{ oRule.event }_UTC|#{ timestamp }_#{ rand }" - payload: obj + body: obj else obj.eventid = "#{ userId }_#{ oRule.event }_UTC|#{ timestamp }_#{ rand }" diff --git a/coffee/engine.coffee b/coffee/engine.coffee index b881591..5fba63f 100644 --- a/coffee/engine.coffee +++ b/coffee/engine.coffee @@ -188,6 +188,7 @@ oOperators = '>': ( x, y ) -> x > y '>=': ( x, y ) -> x >= y '==': ( x, y ) -> x is y + '!=': ( x, y ) -> x isnt y 'instr': ( x, y ) -> x.indexOf( y ) > -1 ### @@ -252,12 +253,12 @@ processEvent = ( evt ) => if arrSelectors for sel in arrSelectors selector = sel.substring 2, sel.length - 1 - data = jsonQuery( evt.payload, selector ).nodes()[ 0 ] + data = jsonQuery( evt.body, selector ).nodes()[ 0 ] argument = argument.replace sel, data if oArg.value is sel argument = data # if the user wants to pass an object, we allow him to do so # if oArg.jsselector - arrArgs.push argument #jsonQuery( evt.payload, oArg.value ).nodes()[ 0 ] + arrArgs.push argument #jsonQuery( evt.body, oArg.value ).nodes()[ 0 ] # else # arrArgs.push oArg.value else diff --git a/coffee/persistence.coffee b/coffee/persistence.coffee index d433636..db8ba38 100644 --- a/coffee/persistence.coffee +++ b/coffee/persistence.coffee @@ -794,6 +794,37 @@ exports.removeUserRole = ( userId, role ) => replyHandler "srem 'role:#{ role }:users' -> '#{ userId }'" +### +Creates and stores a webhook. + +@public createWebhook( *userId, hookname* ) +@param {String} userId +@param {String} hookname +### +exports.createWebhook = ( userId, hookname ) => + @db.sadd "user:#{ userId }:webhooks", hookname, + replyHandler "sadd 'user:#{ userId }:webhooks' -> '#{ hookname }'" + +### +Deletes a webhook. + +@public deleteWebhook( *userId, hookname* ) +@param {String} userId +@param {String} hookname +### +exports.deleteWebhook = ( userId, hookname ) => + @db.srem "user:#{ userId }:webhooks", hookname, + replyHandler "srem 'user:#{ userId }:webhooks' -> '#{ hookname }'" + +### +Gets all the users webhooks. + +@public getWebhooks( *userId* ) +@param {String} userId +### +exports.getWebhooks = ( userId, cb ) => + @db.smembers "user:#{ userId }:webhooks", cb + ### Shuts down the db link. diff --git a/documentation/techdoc/techdoc.tex b/documentation/techdoc/techdoc.tex index 10acee6..eebd89e 100644 --- a/documentation/techdoc/techdoc.tex +++ b/documentation/techdoc/techdoc.tex @@ -120,7 +120,7 @@ this also allows us to send privately stored modules and rules encrypted to the \subsubsection{User commands} -object that has a command as string and an optional payload as a stringified JSON +object that has a command as string and an optional body as a stringified JSON \bibliography{user-manual} diff --git a/examples/action-invokers/neospeech.coffee b/examples/action-invokers/neospeech.coffee index ce854f5..3b75fc6 100644 --- a/examples/action-invokers/neospeech.coffee +++ b/examples/action-invokers/neospeech.coffee @@ -102,7 +102,7 @@ pollUntilDone = ( conversionNumber, email, accountid, infoEvent ) -> if oAnsw.statusCode is '4' or oAnsw.statusCode is '5' pushEvent event: infoEvent - payload: + body: accountid: accountid downloadUrl: oAnsw.downloadUrl else diff --git a/examples/action-invokers/system.coffee b/examples/action-invokers/system.coffee index bcda1e3..d01b740 100644 --- a/examples/action-invokers/system.coffee +++ b/examples/action-invokers/system.coffee @@ -7,7 +7,7 @@ exports.parseTextToJSON = ( eventname, text ) -> try pushEvent event: eventname - payload: JSON.parse text + body: JSON.parse text log "Text successfully parsed" catch e log "Error during JSON parsing of #{ text }" @@ -17,7 +17,7 @@ exports.parseTextToJSON = ( eventname, text ) -> exports.parseObjectToPrettyText = ( eventname, obj ) -> pushEvent event: eventname - payload: JSON.stringify text, undefined, 2 + body: JSON.stringify text, undefined, 2 lastSend = null @@ -31,7 +31,7 @@ exports.accumulateEvents = ( evtname, evt, sendTime ) -> lastSend = sTime pushEvent event: evtname - payload: arrEvents + body: arrEvents arrEvents = [] @@ -57,7 +57,7 @@ fPushEvent = () -> log "Pushing changed interval event" pushEvent event: eventname - payload: event + body: event setTimeout fPushEvent, interval diff --git a/examples/event-pollers/importio.coffee b/examples/event-pollers/importio.coffee index 0ac4656..80138f3 100644 --- a/examples/event-pollers/importio.coffee +++ b/examples/event-pollers/importio.coffee @@ -8,17 +8,19 @@ Required module params: ### io = new importio params.userGuid, params.apikey, "query.import.io" - +isConnected = false tryToConnect = ( numAttempt, cb ) -> - io.connect ( connected ) -> - if connected - cb true - else - log "Unable to connect, attempting again... ##{ numAttempt++ }" - if numAttempt is 5 - cb false + if not isConnected + io.connect ( connected ) -> + if connected + isConnected = true + cb true else - tryToConnect numAttempt, cb + log "Unable to connect, attempting again... ##{ numAttempt++ }" + if numAttempt is 5 + cb false + else + tryToConnect numAttempt, cb arrPages = [ "http://www.meteoblue.com/en/switzerland/weather-basel" @@ -87,7 +89,7 @@ exports.currentData = ( idCity ) -> # Helper function to detect and convert temperatures convertTemperature = ( text ) -> arrStr = text.split '°' - if arrStr > 1 + if arrStr.length > 1 val = parseFloat arrStr[ 0 ] if arrStr[ 1 ] is 'F' fahrenheit = val @@ -100,7 +102,7 @@ convertTemperature = ( text ) -> celsius: celsius fahrenheit: fahrenheit - kelvin: celsius - 273.15 + kelvin: celsius + 273.15 # idCity, the city identifier corresponding to the arrPages array @@ -121,9 +123,12 @@ exports.tempOverThreshold = ( tempUnit, tempThreshold, idCity ) -> connectorGuids: [ "06394265-b4e1-4b48-be82-a9f2acb9040f" ] queryService params, ( data ) -> oTemp = convertTemperature data[ 0 ].current_temp - switch tempUnit - when "K" then val = oTemp.kelvin - when "F" then val = oTemp.fahrenheit - else val = oTemp.celsius - if val > parseFloat tempThreshold - pushEvent oTemp \ No newline at end of file + if oTemp + switch tempUnit + when "K" then val = oTemp.kelvin + when "F" then val = oTemp.fahrenheit + else val = oTemp.celsius + if val > parseFloat tempThreshold + pushEvent oTemp + else + log "Can't grab temperature from #{ data[ 0 ].current_temp }" \ No newline at end of file diff --git a/examples/eventproducers/hoststatistics.coffee b/examples/eventproducers/hoststatistics.coffee index 00143f3..42ceb7e 100644 --- a/examples/eventproducers/hoststatistics.coffee +++ b/examples/eventproducers/hoststatistics.coffee @@ -5,16 +5,23 @@ ping = require 'net-ping' needle = require 'needle' +# remoteUrl = "localhost:8125" +remoteUrl = "http://ec2-54-226-188-9.compute-1.amazonaws.com:8126" +fPushEvent = ( evt ) -> + needle.post remoteUrl + '/webhooks/uptimestatistics', JSON.stringify( evt ), ( err, resp, body ) -> + if err or resp.statusCode isnt 200 + console.log 'Error in pushing event!' + else + console.log 'Successfully posted an event' + try - arrHosts = JSON.parse fs.readFileSync 'hostlist.json', 'utf8' + # arrHosts = JSON.parse fs.readFileSync 'hostlist.json', 'utf8' histData = JSON.parse fs.readFileSync 'histochart.json', 'utf8' catch err console.error err - console.error "Error reading host list file" + console.error "Error reading historical data file" process.exit() -remoteUrl = "http://ec2-54-226-188-9.compute-1.amazonaws.com:8126" -# remoteUrl = "localhost:8125" # console.log arrHosts # libnmap.nmap 'scan', @@ -26,45 +33,68 @@ remoteUrl = "http://ec2-54-226-188-9.compute-1.amazonaws.com:8126" # report.forEach ( item ) -> # console.log item[ 0 ] -session = ping.createSession retries: 5 +session = ping.createSession retries: 2 everyMins = 10 oHosts = {} oPings = {} +i = -1 if histData oHosts = histData.hosts oPings = histData.pingtimes +pingTime = (new Date()).toISOString() +oPings[ pingTime ] = ips: [] fPollHosts = () -> - semaphore = arrHosts.length - pingTime = (new Date()).toISOString() - oPings[ pingTime ] = ips: [] - for host in arrHosts - session.pingHost host, ( err, target, sent, rcvd ) -> - if not err - if not oHosts[ target ] - oHosts[ target ] = {} - oHosts[ target ][ pingTime ] = (new Date( rcvd - sent )).getTime() - oPings[ pingTime ].ips.push target + i++ + console.log "Pinging 131.152.85.#{ i }" + session.pingHost "131.152.85.#{ i }", ( err, target, sent, rcvd ) -> + if not err + if not oHosts[ target ] + oHosts[ target ] = {} + oHosts[ target ][ pingTime ] = (new Date( rcvd - sent )).getTime() + oPings[ pingTime ].ips.push target + + if i is 255 + i = -1 + console.log 'All ping requests returned, pushing event into the system and starting again at 0' + oPings[ pingTime ].sum = oPings[ pingTime ].ips.length + evt = + currentlyon: oPings[ pingTime ].ips.length + pingtimes: oPings + hosts: oHosts + fPushEvent evt + fs.writeFile 'histochart.json', JSON.stringify( evt, undefined, 2 ), 'utf8' + pingTime = (new Date()).toISOString() + oPings[ pingTime ] = ips: [] - if --semaphore is 0 - console.log 'All ping requests returned, pushing event into the system' - oPings[ pingTime ].sum = oPings[ pingTime ].ips.length - evt = - currentlyon: oPings[ pingTime ].ips.length - pingtimes: oPings - hosts: oHosts - fPushEvent evt - fs.writeFile 'histochart.json', JSON.stringify( evt, undefined, 2 ), 'utf8' - console.log "Pinging again in #{ everyMins } minutes" - setTimeout fPollHosts, everyMins * 60 * 1000 + setTimeout fPollHosts, 7000 + fPollHosts() +# Some pings eventually get blocked if you ping 255 IPs within one second... +# +# fPollHosts = () -> +# semaphore = arrHosts.length +# pingTime = (new Date()).toISOString() +# oPings[ pingTime ] = ips: [] +# for host in arrHosts +# session.pingHost host, ( err, target, sent, rcvd ) -> +# if not err +# if not oHosts[ target ] +# oHosts[ target ] = {} +# oHosts[ target ][ pingTime ] = (new Date( rcvd - sent )).getTime() +# oPings[ pingTime ].ips.push target -fPushEvent = ( evt ) -> - needle.post remoteUrl + '/webhooks/uptimestatistics', JSON.stringify( evt ), ( err, resp, body ) -> - if err or resp.statusCode isnt 200 - console.log 'Error in pushing event!' - else - console.log 'Successfully posted an event' +# if --semaphore is 0 +# console.log 'All ping requests returned, pushing event into the system' +# oPings[ pingTime ].sum = oPings[ pingTime ].ips.length +# evt = +# currentlyon: oPings[ pingTime ].ips.length +# pingtimes: oPings +# hosts: oHosts +# fPushEvent evt +# fs.writeFile 'histochart.json', JSON.stringify( evt, undefined, 2 ), 'utf8' +# console.log "Pinging again in #{ everyMins } minutes" +# setTimeout fPollHosts, everyMins * 60 * 1000 diff --git a/js/components-manager.js b/js/components-manager.js index ca71f01..c179b22 100644 --- a/js/components-manager.js +++ b/js/components-manager.js @@ -108,7 +108,7 @@ Components Manager - `oReq` is the request object that contains: - `command` as a string - - `payload` an optional stringified JSON object + - `body` an optional stringified JSON object The callback function `callback( obj )` will receive an object containing the HTTP response code and a corresponding message. @@ -117,16 +117,16 @@ Components Manager exports.processRequest = function(user, oReq, callback) { var dat, err; - if (!oReq.payload) { - oReq.payload = '{}'; + if (!oReq.body) { + oReq.body = '{}'; } try { - dat = JSON.parse(oReq.payload); + dat = JSON.parse(oReq.body); } catch (_error) { err = _error; return callback({ code: 404, - message: 'You had a strange payload in your request!' + message: 'You had a strange body in your request!' }); } if (commandFunctions[oReq.command]) { @@ -141,14 +141,14 @@ Components Manager /* - Checks whether all required parameters are present in the payload. + Checks whether all required parameters are present in the body. - @private hasRequiredParams ( *arrParams, oPayload* ) + @private hasRequiredParams ( *arrParams, oBody* ) @param {Array} arrParams - @param {Object} oPayload + @param {Object} oBody */ - hasRequiredParams = function(arrParams, oPayload) { + hasRequiredParams = function(arrParams, oBody) { var answ, param, _i, _len; answ = { code: 400, @@ -156,7 +156,7 @@ Components Manager }; for (_i = 0, _len = arrParams.length; _i < _len; _i++) { param = arrParams[_i]; - if (!oPayload[param]) { + if (!oBody[param]) { return answ; } } @@ -169,14 +169,14 @@ Components Manager /* Fetches all available modules and return them together with the available functions. - @private getModules ( *user, oPayload, dbMod, callback* ) + @private getModules ( *user, oBody, dbMod, callback* ) @param {Object} user - @param {Object} oPayload + @param {Object} oBody @param {Object} dbMod @param {function} callback */ - getModules = function(user, oPayload, dbMod, callback) { + getModules = function(user, oBody, dbMod, callback) { var fProcessIds; fProcessIds = function(userName) { return function(err, arrNames) { @@ -216,26 +216,26 @@ Components Manager return dbMod.getAvailableModuleIds(user.username, fProcessIds(user.username)); }; - getModuleParams = function(user, oPayload, dbMod, callback) { + getModuleParams = function(user, oBody, dbMod, callback) { var answ; - answ = hasRequiredParams(['id'], oPayload); + answ = hasRequiredParams(['id'], oBody); if (answ.code !== 200) { return callback(answ); } else { - return dbMod.getModuleField(user.username, oPayload.id, "params", function(err, oPayload) { - answ.message = oPayload; + return dbMod.getModuleField(user.username, oBody.id, "params", function(err, oBody) { + answ.message = oBody; return callback(answ); }); } }; - getModuleUserParams = function(user, oPayload, dbMod, callback) { + getModuleUserParams = function(user, oBody, dbMod, callback) { var answ; - answ = hasRequiredParams(['id'], oPayload); + answ = hasRequiredParams(['id'], oBody); if (answ.code !== 200) { return callback(answ); } else { - return dbMod.getUserParams(oPayload.id, user.username, function(err, str) { + return dbMod.getUserParams(oBody.id, user.username, function(err, str) { var name, oParam, oParams; oParams = JSON.parse(str); for (name in oParams) { @@ -250,36 +250,36 @@ Components Manager } }; - getModuleUserArguments = function(user, oPayload, dbMod, callback) { + getModuleUserArguments = function(user, oBody, dbMod, callback) { var answ; - answ = hasRequiredParams(['ruleId', 'moduleId'], oPayload); + answ = hasRequiredParams(['ruleId', 'moduleId'], oBody); if (answ.code !== 200) { return callback(answ); } else { - return dbMod.getAllModuleUserArguments(user.username, oPayload.ruleId, oPayload.moduleId, function(err, oPayload) { - answ.message = oPayload; + return dbMod.getAllModuleUserArguments(user.username, oBody.ruleId, oBody.moduleId, function(err, oBody) { + answ.message = oBody; return callback(answ); }); } }; forgeModule = (function(_this) { - return function(user, oPayload, modType, dbMod, callback) { + return function(user, oBody, modType, dbMod, callback) { var answ; - answ = hasRequiredParams(['id', 'params', 'lang', 'data'], oPayload); + answ = hasRequiredParams(['id', 'params', 'lang', 'data'], oBody); if (answ.code !== 200) { return callback(answ); } else { - if (oPayload.overwrite) { - return storeModule(user, oPayload, modType, dbMod, callback); + if (oBody.overwrite) { + return storeModule(user, oBody, modType, dbMod, callback); } else { - return dbMod.getModule(user.username, oPayload.id, function(err, mod) { + return dbMod.getModule(user.username, oBody.id, function(err, mod) { if (mod) { answ.code = 409; - answ.message = 'Module name already existing: ' + oPayload.id; + answ.message = 'Module name already existing: ' + oBody.id; return callback(answ); } else { - return storeModule(user, oPayload, modType, dbMod, callback); + return storeModule(user, oBody, modType, dbMod, callback); } }); } @@ -288,12 +288,12 @@ Components Manager })(this); storeModule = (function(_this) { - return function(user, oPayload, modType, dbMod, callback) { + return function(user, oBody, modType, dbMod, callback) { var src; - src = oPayload.data; + src = oBody.data; return dynmod.compileString(src, user.username, { id: 'dummyRule' - }, oPayload.id, oPayload.lang, modType, null, function(cm) { + }, oBody.id, oBody.lang, modType, null, function(cm) { var answ, funcs, id, name, _ref; answ = cm.answ; if (answ.code === 200) { @@ -304,10 +304,10 @@ Components Manager funcs.push(name); } _this.log.info("CM | Storing new module with functions " + (funcs.join(', '))); - answ.message = " Module " + oPayload.id + " successfully stored! Found following function(s): " + funcs; - oPayload.functions = JSON.stringify(funcs); - oPayload.functionArgs = JSON.stringify(cm.funcParams); - dbMod.storeModule(user.username, oPayload); + answ.message = " Module " + oBody.id + " successfully stored! Found following function(s): " + funcs; + oBody.functions = JSON.stringify(funcs); + oBody.functionArgs = JSON.stringify(cm.funcParams); + dbMod.storeModule(user.username, oBody); } return callback(answ); }); @@ -315,39 +315,39 @@ Components Manager })(this); storeRule = (function(_this) { - return function(user, oPayload, callback) { + return function(user, oBody, callback) { var args, arr, epModId, eventInfo, id, oFuncArgs, oParams, params, rule, strRule; rule = { - id: oPayload.id, - event: oPayload.event, - event_start: oPayload.event_start, - event_interval: oPayload.event_interval, - conditions: oPayload.conditions, - actions: oPayload.actions + id: oBody.id, + event: oBody.event, + event_start: oBody.event_start, + event_interval: oBody.event_interval, + conditions: oBody.conditions, + actions: oBody.actions }; - if (oPayload.event_start) { + if (oBody.event_start) { rule.timestamp = (new Date()).toISOString(); } strRule = JSON.stringify(rule); db.storeRule(rule.id, strRule); db.linkRule(rule.id, user.username); db.activateRule(rule.id, user.username); - if (oPayload.event_params) { + if (oBody.event_params) { epModId = rule.event.split(' -> ')[0]; - db.eventPollers.storeUserParams(epModId, user.username, JSON.stringify(oPayload.event_params)); + db.eventPollers.storeUserParams(epModId, user.username, JSON.stringify(oBody.event_params)); } - oFuncArgs = oPayload.event_functions; + oFuncArgs = oBody.event_functions; for (id in oFuncArgs) { args = oFuncArgs[id]; arr = id.split(' -> '); db.eventPollers.storeUserArguments(user.username, rule.id, arr[0], arr[1], JSON.stringify(args)); } - oParams = oPayload.action_params; + oParams = oBody.action_params; for (id in oParams) { params = oParams[id]; db.actionInvokers.storeUserParams(id, user.username, JSON.stringify(params)); } - oFuncArgs = oPayload.action_functions; + oFuncArgs = oBody.action_functions; for (id in oFuncArgs) { args = oFuncArgs[id]; arr = id.split(' -> '); @@ -372,39 +372,39 @@ Components Manager })(this); commandFunctions = { - get_public_key: function(user, oPayload, callback) { + get_public_key: function(user, oBody, callback) { return callback({ code: 200, message: encryption.getPublicKey() }); }, - get_event_pollers: function(user, oPayload, callback) { - return getModules(user, oPayload, db.eventPollers, callback); + get_event_pollers: function(user, oBody, callback) { + return getModules(user, oBody, db.eventPollers, callback); }, - get_full_event_poller: function(user, oPayload, callback) { - return db.eventPollers.getModule(user.username, oPayload.id, function(err, obj) { + get_full_event_poller: function(user, oBody, callback) { + return db.eventPollers.getModule(user.username, oBody.id, function(err, obj) { return callback({ code: 200, message: JSON.stringify(obj) }); }); }, - get_event_poller_params: function(user, oPayload, callback) { - return getModuleParams(user, oPayload, db.eventPollers, callback); + get_event_poller_params: function(user, oBody, callback) { + return getModuleParams(user, oBody, db.eventPollers, callback); }, - get_event_poller_user_params: function(user, oPayload, callback) { - return getModuleUserParams(user, oPayload, db.eventPollers, callback); + get_event_poller_user_params: function(user, oBody, callback) { + return getModuleUserParams(user, oBody, db.eventPollers, callback); }, - get_event_poller_user_arguments: function(user, oPayload, callback) { - return getModuleUserArguments(user, oPayload, db.eventPollers, callback); + get_event_poller_user_arguments: function(user, oBody, callback) { + return getModuleUserArguments(user, oBody, db.eventPollers, callback); }, - get_event_poller_function_arguments: function(user, oPayload, callback) { + get_event_poller_function_arguments: function(user, oBody, callback) { var answ; - answ = hasRequiredParams(['id'], oPayload); + answ = hasRequiredParams(['id'], oBody); if (answ.code !== 200) { return callback(answ); } else { - return db.eventPollers.getModuleField(user.username, oPayload.id, 'functionArgs', function(err, obj) { + return db.eventPollers.getModuleField(user.username, oBody.id, 'functionArgs', function(err, obj) { return callback({ code: 200, message: obj @@ -412,32 +412,32 @@ Components Manager }); } }, - forge_event_poller: function(user, oPayload, callback) { - return forgeModule(user, oPayload, "eventpoller", db.eventPollers, callback); + forge_event_poller: function(user, oBody, callback) { + return forgeModule(user, oBody, "eventpoller", db.eventPollers, callback); }, - delete_event_poller: function(user, oPayload, callback) { + delete_event_poller: function(user, oBody, callback) { var answ; - answ = hasRequiredParams(['id'], oPayload); + answ = hasRequiredParams(['id'], oBody); if (answ.code !== 200) { return callback(answ); } else { - db.eventPollers.deleteModule(user.username, oPayload.id); + db.eventPollers.deleteModule(user.username, oBody.id); return callback({ code: 200, message: 'OK!' }); } }, - get_action_invokers: function(user, oPayload, callback) { - return getModules(user, oPayload, db.actionInvokers, callback); + get_action_invokers: function(user, oBody, callback) { + return getModules(user, oBody, db.actionInvokers, callback); }, - get_full_action_invoker: function(user, oPayload, callback) { + get_full_action_invoker: function(user, oBody, callback) { var answ; - answ = hasRequiredParams(['id'], oPayload); + answ = hasRequiredParams(['id'], oBody); if (answ.code !== 200) { return callback(answ); } else { - return db.actionInvokers.getModule(user.username, oPayload.id, function(err, obj) { + return db.actionInvokers.getModule(user.username, oBody.id, function(err, obj) { return callback({ code: 200, message: JSON.stringify(obj) @@ -445,22 +445,22 @@ Components Manager }); } }, - get_action_invoker_params: function(user, oPayload, callback) { - return getModuleParams(user, oPayload, db.actionInvokers, callback); + get_action_invoker_params: function(user, oBody, callback) { + return getModuleParams(user, oBody, db.actionInvokers, callback); }, - get_action_invoker_user_params: function(user, oPayload, callback) { - return getModuleUserParams(user, oPayload, db.actionInvokers, callback); + get_action_invoker_user_params: function(user, oBody, callback) { + return getModuleUserParams(user, oBody, db.actionInvokers, callback); }, - get_action_invoker_user_arguments: function(user, oPayload, callback) { - return getModuleUserArguments(user, oPayload, db.actionInvokers, callback); + get_action_invoker_user_arguments: function(user, oBody, callback) { + return getModuleUserArguments(user, oBody, db.actionInvokers, callback); }, - get_action_invoker_function_arguments: function(user, oPayload, callback) { + get_action_invoker_function_arguments: function(user, oBody, callback) { var answ; - answ = hasRequiredParams(['id'], oPayload); + answ = hasRequiredParams(['id'], oBody); if (answ.code !== 200) { return callback(answ); } else { - return db.actionInvokers.getModuleField(user.username, oPayload.id, 'functionArgs', function(err, obj) { + return db.actionInvokers.getModuleField(user.username, oBody.id, 'functionArgs', function(err, obj) { return callback({ code: 200, message: obj @@ -468,23 +468,23 @@ Components Manager }); } }, - forge_action_invoker: function(user, oPayload, callback) { - return forgeModule(user, oPayload, "actioninvoker", db.actionInvokers, callback); + forge_action_invoker: function(user, oBody, callback) { + return forgeModule(user, oBody, "actioninvoker", db.actionInvokers, callback); }, - delete_action_invoker: function(user, oPayload, callback) { + delete_action_invoker: function(user, oBody, callback) { var answ; - answ = hasRequiredParams(['id'], oPayload); + answ = hasRequiredParams(['id'], oBody); if (answ.code !== 200) { return callback(answ); } else { - db.actionInvokers.deleteModule(user.username, oPayload.id); + db.actionInvokers.deleteModule(user.username, oBody.id); return callback({ code: 200, message: 'OK!' }); } }, - get_rules: function(user, oPayload, callback) { + get_rules: function(user, oBody, callback) { return db.getUserLinkedRules(user.username, function(err, obj) { return callback({ code: 200, @@ -492,13 +492,13 @@ Components Manager }); }); }, - get_rule: function(user, oPayload, callback) { + get_rule: function(user, oBody, callback) { var answ; - answ = hasRequiredParams(['id'], oPayload); + answ = hasRequiredParams(['id'], oBody); if (answ.code !== 200) { return callback(answ); } else { - return db.getRule(oPayload.id, function(err, obj) { + return db.getRule(oBody.id, function(err, obj) { return callback({ code: 200, message: obj @@ -506,13 +506,13 @@ Components Manager }); } }, - get_rule_log: function(user, oPayload, callback) { + get_rule_log: function(user, oBody, callback) { var answ; - answ = hasRequiredParams(['id'], oPayload); + answ = hasRequiredParams(['id'], oBody); if (answ.code !== 200) { return callback(answ); } else { - return db.getLog(user.username, oPayload.id, function(err, obj) { + return db.getLog(user.username, oBody.id, function(err, obj) { return callback({ code: 200, message: obj @@ -520,47 +520,108 @@ Components Manager }); } }, - forge_rule: function(user, oPayload, callback) { + forge_rule: function(user, oBody, callback) { var answ; - answ = hasRequiredParams(['id', 'event', 'conditions', 'actions'], oPayload); + answ = hasRequiredParams(['id', 'event', 'conditions', 'actions'], oBody); if (answ.code !== 200) { return callback(answ); } else { - if (oPayload.overwrite) { - return storeRule(user, oPayload, callback); + if (oBody.overwrite) { + return storeRule(user, oBody, callback); } else { - return db.getRule(oPayload.id, (function(_this) { + return db.getRule(oBody.id, (function(_this) { return function(err, mod) { if (mod) { answ.code = 409; - answ.message = 'Rule name already existing: ' + oPayload.id; + answ.message = 'Rule name already existing: ' + oBody.id; return callback(answ); } else { - return storeRule(user, oPayload, callback); + return storeRule(user, oBody, callback); } }; })(this)); } } }, - delete_rule: function(user, oPayload, callback) { + delete_rule: function(user, oBody, callback) { var answ; - answ = hasRequiredParams(['id'], oPayload); + answ = hasRequiredParams(['id'], oBody); if (answ.code !== 200) { return callback(answ); } else { - db.deleteRule(oPayload.id); + db.deleteRule(oBody.id); eventEmitter.emit('rule', { event: 'del', user: user.username, rule: null, - ruleId: oPayload.id + ruleId: oBody.id }); return callback({ code: 200, message: 'OK!' }); } + }, + create_webhook: function(user, oBody, callback) { + var answ; + answ = hasRequiredParams(['hookname'], oBody); + if (answ.code !== 200) { + return callback(answ); + } else { + return db.getWebhooks((function(_this) { + return function(err, hooks) { + if (hooks.indexOf(oBody.hookname > -1)) { + answ.code = 409; + answ.message = 'Webhook already existing: ' + oBody.hookname; + return callback(answ); + } else { + db.storeWebhook(user.username, oBody.hookname); + return callback({ + code: 200, + message: 'OK!' + }); + } + }; + })(this)); + } + }, + delete_webhook: function(user, oBody, callback) { + var answ; + answ = hasRequiredParams(['hookname'], oBody); + if (answ.code !== 200) { + return callback(answ); + } else { + return db.getWebhooks((function(_this) { + return function(err, hooks) { + if (hooks.indexOf(oBody.hookname === -1)) { + answ.code = 409; + answ.message = 'Webhook does not exist: ' + oBody.hookname; + return callback(answ); + } else { + db.deleteWebhook(user.username, oBody.hookname); + return callback({ + code: 200, + message: 'OK!' + }); + } + }; + })(this)); + } + }, + get_webhooks: function(user, oBody, callback) { + return db.getWebhooks(user.username, function(err, data) { + if (err) { + return callback({ + code: 400, + message: "We didn't like your request!" + }); + } else { + return callback({ + code: 200, + message: JSON.stringify(data) + }); + } + }); } }; diff --git a/js/dynamic-modules.js b/js/dynamic-modules.js index 7885671..3f95a0d 100644 --- a/js/dynamic-modules.js +++ b/js/dynamic-modules.js @@ -127,7 +127,7 @@ Dynamic Modules return db.pushEvent({ event: oRule.event + '_created:' + oRule.timestamp, eventid: "" + userId + "_" + oRule.event + "_UTC|" + timestamp + "_" + rand, - payload: obj + body: obj }); } else { obj.eventid = "" + userId + "_" + oRule.event + "_UTC|" + timestamp + "_" + rand; diff --git a/js/engine.js b/js/engine.js index 05fd6e4..664ac85 100644 --- a/js/engine.js +++ b/js/engine.js @@ -235,6 +235,9 @@ Engine '==': function(x, y) { return x === y; }, + '!=': function(x, y) { + return x !== y; + }, 'instr': function(x, y) { return x.indexOf(y) > -1; } @@ -318,7 +321,7 @@ Engine for (_j = 0, _len1 = arrSelectors.length; _j < _len1; _j++) { sel = arrSelectors[_j]; selector = sel.substring(2, sel.length - 1); - data = jsonQuery(evt.payload, selector).nodes()[0]; + data = jsonQuery(evt.body, selector).nodes()[0]; argument = argument.replace(sel, data); if (oArg.value === sel) { argument = data; diff --git a/js/persistence.js b/js/persistence.js index 70f9823..b361148 100644 --- a/js/persistence.js +++ b/js/persistence.js @@ -1035,6 +1035,50 @@ Persistence })(this); + /* + Creates and stores a webhook. + + @public createWebhook( *userId, hookname* ) + @param {String} userId + @param {String} hookname + */ + + exports.createWebhook = (function(_this) { + return function(userId, hookname) { + return _this.db.sadd("user:" + userId + ":webhooks", hookname, replyHandler("sadd 'user:" + userId + ":webhooks' -> '" + hookname + "'")); + }; + })(this); + + + /* + Deletes a webhook. + + @public deleteWebhook( *userId, hookname* ) + @param {String} userId + @param {String} hookname + */ + + exports.deleteWebhook = (function(_this) { + return function(userId, hookname) { + return _this.db.srem("user:" + userId + ":webhooks", hookname, replyHandler("srem 'user:" + userId + ":webhooks' -> '" + hookname + "'")); + }; + })(this); + + + /* + Gets all the users webhooks. + + @public getWebhooks( *userId* ) + @param {String} userId + */ + + exports.getWebhooks = (function(_this) { + return function(userId, cb) { + return _this.db.smembers("user:" + userId + ":webhooks", cb); + }; + })(this); + + /* Shuts down the db link. diff --git a/testing/files/testObjects.json b/testing/files/testObjects.json index 1d27a5d..ed1630d 100644 --- a/testing/files/testObjects.json +++ b/testing/files/testObjects.json @@ -32,7 +32,7 @@ "aiTwo": { "id":"aiTwo", "lang":"CoffeeScript", - "data":"# Send a mail through emailyak\nexports.otherEvent = ( evt ) ->\n\turl = 'https://api.emailyak.com/v1/' + params.apikey + '/json/send/email/'\n\tpayload =\n\t FromAddress : \"testsender@mscliveweb.simpleyak.com\",\n\t ToAddress: \"dominic.bosch@gmail.com\",\n\t Subject: \"TestMAIL\",\n\t TextBody: \"Hello\"\n\t\n\tneedle.post url, payload, ( err, resp, body ) ->\n\t\tif err\n\t\t\tlog err\n\t\tif resp.statusCode isnt 200\n\t\t\tlog 'Request not successful:'\n\t\t\tlog body\n", + "data":"# Send a mail through emailyak\nexports.otherEvent = ( evt ) ->\n\turl = 'https://api.emailyak.com/v1/' + params.apikey + '/json/send/email/'\n\tbody =\n\t FromAddress : \"testsender@mscliveweb.simpleyak.com\",\n\t ToAddress: \"dominic.bosch@gmail.com\",\n\t Subject: \"TestMAIL\",\n\t TextBody: \"Hello\"\n\t\n\tneedle.post url, body, ( err, resp, body ) ->\n\t\tif err\n\t\t\tlog err\n\t\tif resp.statusCode isnt 200\n\t\t\tlog 'Request not successful:'\n\t\t\tlog body\n", "public":"false", "params":"[\"apikey\",\"andmore\"]", "functions":"[\"otherEvent\"]", @@ -56,7 +56,7 @@ "events": { "eventOne":{ "event": "test_1", - "payload": { + "body": { "property": "test_1", "nestedProperty": { "more": "really nested" @@ -68,7 +68,7 @@ }, "eventReal":{ "event": "epOne -> newMail", - "payload": { + "body": { "property": "test_1", "nestedProperty": { "more": "really nested" diff --git a/testing/test_components-manager.coffee b/testing/test_components-manager.coffee index 9b007c1..a5eb18b 100644 --- a/testing/test_components-manager.coffee +++ b/testing/test_components-manager.coffee @@ -69,25 +69,25 @@ exports.tearDown = ( cb ) -> setTimeout cb, 100 exports.requestProcessing = - testEmptyPayload: ( test ) => + testEmptyBody: ( test ) => test.expect 1 request = command: 'get_event_pollers' cm.processRequest oUser, request, ( answ ) => - test.strictEqual 200, answ.code, 'Empty payload did not return 200' + test.strictEqual 200, answ.code, 'Empty body did not return 200' test.done() - testCorruptPayload: ( test ) => + testCorruptBody: ( test ) => test.expect 1 request = command: 'get_event_pollers' - payload: 'no-json' + body: 'no-json' cm.processRequest oUser, request, ( answ ) => - test.strictEqual 404, answ.code, 'Corrupt payload did not return 404' + test.strictEqual 404, answ.code, 'Corrupt body did not return 404' test.done() exports.testListener = ( test ) => @@ -108,7 +108,7 @@ exports.testListener = ( test ) => request = command: 'forge_rule' - payload: strRuleThree + body: strRuleThree cm.addRuleListener ( evt ) => strEvt = JSON.stringify evt.rule @@ -162,9 +162,9 @@ exports.moduleHandling = request = command: 'get_event_poller_params' - payload: + body: id: oEpOne.id - request.payload = JSON.stringify request.payload + request.body = JSON.stringify request.body cm.processRequest oUser, request, ( answ ) => test.strictEqual 200, answ.code, 'Required Module Parameters did not return 200' @@ -181,7 +181,7 @@ exports.moduleHandling = request = command: 'forge_action_invoker' - payload: JSON.stringify oTmp + body: JSON.stringify oTmp cm.processRequest oUser, request, ( answ ) => test.strictEqual 200, answ.code, 'Forging Module did not return 200' @@ -208,7 +208,7 @@ exports.ruleForge = request = command: 'forge_rule' - payload: JSON.stringify oRuleThree + body: JSON.stringify oRuleThree cm.processRequest oUser, request, ( answ ) => test.strictEqual 200, answ.code, "Forging Rule returned #{ answ.code }: #{ answ.message }" @@ -229,7 +229,7 @@ exports.ruleForge = request = command: 'delete_rule' - payload: JSON.stringify id: oRuleThree.id + body: JSON.stringify id: oRuleThree.id cm.processRequest oUser, request, ( answ ) => test.strictEqual 200, answ.code, "Deleting Rule returned #{ answ.code }: #{ answ.message }" @@ -248,7 +248,7 @@ exports.ruleForge = request = command: 'forge_rule' - payload: JSON.stringify oRuleOne + body: JSON.stringify oRuleOne cm.processRequest oUser, request, ( answ ) => test.strictEqual 200, answ.code, "Forging Rule returned #{ answ.code }: #{ answ.message }" @@ -261,14 +261,14 @@ exports.ruleForge = try arrRows = data.split "\n" logged = arrRows[ 1 ].split( '] ' )[1] - test.strictEqual logged, "{#{ oAiOne.id }} " + oEventOne.payload.property, + test.strictEqual logged, "{#{ oAiOne.id }} " + oEventOne.body.property, 'Did not log the right thing' catch e test.ok false, 'Parsing log failed' request = command: 'delete_rule' - payload: JSON.stringify id: oRuleOne.id + body: JSON.stringify id: oRuleOne.id cm.processRequest oUser, request, ( answ ) => test.strictEqual 200, answ.code, "Deleting Rule returned #{ answ.code }: #{ answ.message }" diff --git a/webpages/handlers/coffee/edit_modules.coffee b/webpages/handlers/coffee/edit_modules.coffee index 7d4e84e..3a1e72f 100644 --- a/webpages/handlers/coffee/edit_modules.coffee +++ b/webpages/handlers/coffee/edit_modules.coffee @@ -58,7 +58,7 @@ fOnLoad = () -> cmd = 'delete_action_invoker' data = command: cmd - payload: JSON.stringify + body: JSON.stringify id: modName $.post( '/usercommand', data ) .done fFetchModules diff --git a/webpages/handlers/coffee/edit_rules.coffee b/webpages/handlers/coffee/edit_rules.coffee index 100194e..f810244 100644 --- a/webpages/handlers/coffee/edit_rules.coffee +++ b/webpages/handlers/coffee/edit_rules.coffee @@ -50,7 +50,7 @@ fOnLoad = () -> $( '#log_col' ).text "" data = command: 'delete_rule' - payload: JSON.stringify + body: JSON.stringify id: ruleName $.post( '/usercommand', data ) .done fFetchRules @@ -64,7 +64,7 @@ fOnLoad = () -> ruleName = $( 'div', $( this ).closest( 'tr' )).text() data = command: 'get_rule_log' - payload: JSON.stringify + body: JSON.stringify id: ruleName $.post( '/usercommand', data ) .done ( data ) -> diff --git a/webpages/handlers/coffee/forge_event.coffee b/webpages/handlers/coffee/forge_event.coffee index 9230a82..436abeb 100644 --- a/webpages/handlers/coffee/forge_event.coffee +++ b/webpages/handlers/coffee/forge_event.coffee @@ -1,8 +1,17 @@ +fFindKeyStringPair = ( obj ) -> + for key, val of obj + if typeof val is 'string' or typeof val is 'number' + return key: key, val: val + else if typeof val is 'object' + oRet = fFindKeyStringPair val + if oRet + return oRet + null fOnLoad = () -> - document.title = 'Event Forge!' - $( '#pagetitle' ).text 'Invoke your custom event!' + document.title = 'Push Events!' + $( '#pagetitle' ).text 'Push your own custom event directly into the engine!' editor = ace.edit "editor" editor.setTheme "ace/theme/monokai" @@ -35,4 +44,25 @@ fOnLoad = () -> $( '#info' ).text 'You have errors in your JSON object! ' + err $( '#info' ).attr 'class', 'error' + $( '#but_prepare' ). on 'click', () -> + + try + obj = JSON.parse editor.getValue() # try to parse, throw an error if JSON not valid + if obj.event and typeof obj.event is 'string' and obj.event isnt '' + sel = '' + if obj.body and typeof obj.body is 'object' + oSelector = fFindKeyStringPair obj.body + if oSelector + sel = "&selkey=#{ oSelector.key }&selval=#{ oSelector.val }" + url = 'forge?page=forge_rule&eventname=' + obj.event + sel + window.open url, '_blank' + else + $( '#info' ).text 'Please provide a valid eventname' + $( '#info' ).attr 'class', 'error' + catch err + $( '#info' ).text 'You have errors in your JSON object! ' + err + $( '#info' ).attr 'class', 'error' + + + window.addEventListener 'load', fOnLoad, true diff --git a/webpages/handlers/coffee/forge_module.coffee b/webpages/handlers/coffee/forge_module.coffee index 2e91576..46d2d3f 100644 --- a/webpages/handlers/coffee/forge_module.coffee +++ b/webpages/handlers/coffee/forge_module.coffee @@ -31,8 +31,8 @@ fErrHandler = ( errMsg ) -> setTimeout fDelayed, 500 fOnLoad = () -> - document.title = "Forge #{ moduleName }" - $( '#pagetitle' ).text "{{{user.username}}}, forge your custom #{ moduleName }!" + document.title = "Create #{ moduleName }" + $( '#pagetitle' ).text "{{{user.username}}}, create your custom #{ moduleName }!" # Setup the ACE editor editor = ace.edit "editor" @@ -100,7 +100,7 @@ fOnLoad = () -> true obj = command: "forge_#{ oParams.type }" - payload: JSON.stringify + body: JSON.stringify id: $( '#input_id' ).val() lang: $( '#editor_mode' ).val() public: $( '#is_public' ).is ':checked' @@ -110,9 +110,9 @@ fOnLoad = () -> ( err ) -> if err.status is 409 if confirm 'Are you sure you want to overwrite the existing module?' - payl = JSON.parse obj.payload - payl.overwrite = true - obj.payload = JSON.stringify payl + bod = JSON.parse obj.body + bod.overwrite = true + obj.body = JSON.stringify bod $.post( '/usercommand', obj ) .done ( data ) -> $( '#info' ).text data.message @@ -140,7 +140,7 @@ fOnLoad = () -> if oParams.id obj = command: "get_full_#{ oParams.type }" - payload: JSON.stringify + body: JSON.stringify id: oParams.id $.post( '/usercommand', obj ) diff --git a/webpages/handlers/coffee/forge_rule.coffee b/webpages/handlers/coffee/forge_rule.coffee index 4bde32c..1ccb839 100644 --- a/webpages/handlers/coffee/forge_rule.coffee +++ b/webpages/handlers/coffee/forge_rule.coffee @@ -17,27 +17,39 @@ fPlaceAndPaintInterval = () -> "days hours:minutes", default = 10 minutes' +fDisplayError = ( msg ) -> + window.scrollTo 0, 0 + $( '#info' ).text "Error: #{ msg }" + $( '#info' ).attr 'class', 'error' + fFailedRequest = ( msg ) -> ( err ) -> if err.status is 401 window.location.href = 'forge?page=forge_rule' else - $( '#info' ).text msg - $( '#info' ).attr 'class', 'error' + fDisplayError msg -$.post( '/usercommand', command: 'get_public_key' ) - .done ( data ) -> - strPublicKey = data.message - .fail ( err ) -> - if err.status is 401 - window.location.href = 'forge?page=forge_rule' - else - $( '#info' ).text 'Error fetching public key, unable to send user specific parameters securely' - $( '#info' ).attr 'class', 'error' +fIssueRequest = ( args ) -> + $( '#info' ).text '' + $.post( '/usercommand', args.body ) + .done args.done + .fail args.fail + fOnLoad = () -> - document.title = 'Rule Forge!' - $( '#pagetitle' ).text '{{{user.username}}}, forge your ECA Rule!' + # Fetch the public key from the engine + fIssueRequest + body: command: 'get_public_key' + done: ( data ) -> + strPublicKey = data.message + fail: ( err ) -> + if err.status is 401 + window.location.href = 'forge?page=forge_rule' + else + fDisplayError 'When fetching public key. Unable to send user specific parameters securely!' + + document.title = 'Create Rules!' + $( '#pagetitle' ).text '{{{user.username}}}, create your ECA Rule!' editor = ace.edit "editor_conditions" editor.setTheme "ace/theme/monokai" @@ -45,23 +57,63 @@ fOnLoad = () -> editor.setShowPrintMargin false # editor.session.setUseSoftTabs false + + # EVENT - $.post( '/usercommand', command: 'get_event_pollers' ) - .done ( data ) -> - try - oEps = JSON.parse data.message - catch err - console.error 'ERROR: non-object received from server: ' + data.message - return - - fAppendEvents = ( id, events ) -> - fAppendEvent = ( evt ) -> - $( '#select_event' ).append $( '