From d1fbfd58c40e9f61fdd45538e995b3f63080d886 Mon Sep 17 00:00:00 2001 From: Dominic Bosch Date: Thu, 24 Apr 2014 03:40:07 +0200 Subject: [PATCH] More examples implemented --- coffee/dynamic-modules.coffee | 1 + coffee/engine.coffee | 3 + examples/action-invokers/system.coffee | 82 ++++++++++++++++++- examples/event-pollers/emailyak.coffee | 1 - examples/event-pollers/probinder.coffee | 27 ++++++ examples/event-pollers/statistics.coffee | 31 +++++++ examples/event-pollers/weather.coffee | 20 ++--- examples/eventproducers/hoststatistics.coffee | 2 +- webpages/handlers/coffee/forge_rule.coffee | 8 +- .../handlers/remote-scripts/forge_module.html | 1 - webpages/public/data/histochart.json | 35 ++++++++ webpages/public/histogram.html | 43 +++++----- 12 files changed, 211 insertions(+), 43 deletions(-) create mode 100644 examples/event-pollers/statistics.coffee diff --git a/coffee/dynamic-modules.coffee b/coffee/dynamic-modules.coffee index 969b6dc..7d97b84 100644 --- a/coffee/dynamic-modules.coffee +++ b/coffee/dynamic-modules.coffee @@ -128,6 +128,7 @@ fTryToLoadModule = ( userId, oRule, modId, src, modType, dbMod, params, cb ) => log: logFunc debug: console.log exports: {} + setTimeout: setTimeout # This one allows probably too much pushEvent: fPushEvent userId, oRule, modType diff --git a/coffee/engine.coffee b/coffee/engine.coffee index 34e0dac..b881591 100644 --- a/coffee/engine.coffee +++ b/coffee/engine.coffee @@ -213,8 +213,11 @@ validConditions = ( evt, rule, userId, ruleId ) -> return false try + # maybe we should only allow certain ops for certain types if cond.type is 'string' val = selectedProperty[ 0 ] + else if cond.type is 'bool' + val = selectedProperty[ 0 ] else if cond.type is 'value' val = parseFloat( selectedProperty[ 0 ] ) || 0 diff --git a/examples/action-invokers/system.coffee b/examples/action-invokers/system.coffee index a2a6061..bcda1e3 100644 --- a/examples/action-invokers/system.coffee +++ b/examples/action-invokers/system.coffee @@ -2,12 +2,88 @@ # Helper constructs # -exports.parseTextToJSON = ( text, infoEvent ) -> +# Parses text to JSON +exports.parseTextToJSON = ( eventname, text ) -> try pushEvent - event: infoEvent + event: eventname payload: JSON.parse text log "Text successfully parsed" catch e log "Error during JSON parsing of #{ text }" - \ No newline at end of file + + +# Parses objects to text +exports.parseObjectToPrettyText = ( eventname, obj ) -> + pushEvent + event: eventname + payload: JSON.stringify text, undefined, 2 + + +lastSend = null +arrEvents = [] +exports.accumulateEvents = ( evtname, evt, sendTime ) -> + arrEvents.push evt + sTime = fConvertTimeStringToDate sendTime + yesterday = new Date() + yesterday.setDate sTime.getDate() - 1 + if lastSend < yesterday + lastSend = sTime + pushEvent + event: evtname + payload: arrEvents + arrEvents = [] + + +# Changes the speed on how often a event is pushed into the system +isRunning = false +interval = 10 * 60 * 1000 +eventname = '' +event = {} +exports.changeEventSpeed = ( evtname, evt, startTime, intervalMins ) -> + eventname = evtname + event = evt + start = fConvertTimeStringToDate startTime + mins = parseInt( intervalMins ) || 10 + interval = mins * 60 * 1000 + if not isRunning + isRunning = true + now = new Date() + setTimeout fPushEvent, start.getTime() - now.getTime() + + +fPushEvent = () -> + if eventname isnt '' + log "Pushing changed interval event" + pushEvent + event: eventname + payload: event + setTimeout fPushEvent, interval + + +fConvertTimeStringToDate = ( text ) -> + start = new Date() + if not text + start.setHours 12 + start.setMinutes 0 + else + arrInp = text.split ':' + # There's only one string entered: hour + if arrInp.length is 1 + txtHr = text + start.setMinutes 0 + else + txtHr = arrInp[ 0 ] + intMin = parseInt( arrInp[ 1 ] ) || 0 + m = Math.max 0, Math.min intMin, 59 + start.setMinutes m + + intHour = parseInt( txtHr ) || 12 + h = Math.max 0, Math.min intHour, 24 + start.setHours h + + start.setSeconds 0 + start.setMilliseconds 0 + if start < new Date() + start.setDate start.getDate() + 1 + start \ No newline at end of file diff --git a/examples/event-pollers/emailyak.coffee b/examples/event-pollers/emailyak.coffee index b44250d..5160d39 100644 --- a/examples/event-pollers/emailyak.coffee +++ b/examples/event-pollers/emailyak.coffee @@ -16,7 +16,6 @@ exports.newMail = () -> # Syntax: needle.request method, url, data, [options], callback # needle.request 'get', url, null, null, ( err, resp, body ) -> - log 'Poll function executed' if err log 'Error in EmailYak EM newMail: ' + err.message else diff --git a/examples/event-pollers/probinder.coffee b/examples/event-pollers/probinder.coffee index 4155712..0ffd6f4 100644 --- a/examples/event-pollers/probinder.coffee +++ b/examples/event-pollers/probinder.coffee @@ -89,3 +89,30 @@ getContent = ( args ) -> service: args.contentServiceId callback: args.callback +# Returns an event of the form: +# +# { +# "text": "test subject", +# "id": 127815, +# "createDate": "2014-04-19 16:27:45", +# "lastModified": "2014-04-19 16:27:45", +# "time": "5 days ago", +# "userId": 10595, +# "username": "Dominic Bosch", +# "uri": "https://probinder.com/content/view/id/127815/", +# "localUri": "https://probinder.com/content/view/id/127815/", +# "title": "", +# "serviceId": 27, +# "userIds": [ +# 10595 +# ], +# "description": "", +# "context": [ +# { +# "id": 18749, +# "name": "WebAPI ECA Test Binder", +# "remove": true, +# "uri": "/content/context/id/18749/webapi-eca-test-binder" +# } +# ] +# } \ No newline at end of file diff --git a/examples/event-pollers/statistics.coffee b/examples/event-pollers/statistics.coffee new file mode 100644 index 0000000..7132abd --- /dev/null +++ b/examples/event-pollers/statistics.coffee @@ -0,0 +1,31 @@ + +pingHost = ( url, cb ) -> + isDown = true + semaphore = 5 + for i in [1..5] + needle.get url, ( err, resp ) -> + if not err + isDown = false + if --semaphore is 0 + cb + timestamp: (new Date()).toISOString() + url: url + isdown: isDown + +wasDown = false +# Checks whether a remote host is down +exports.pingedRemoteHost = ( url ) -> + pingHost url, ( evt ) -> + if evt.isdown and not wasDown + wasDown = true + pushEvent evt + if not evt.isdown + wasDown = false + + +# Checks a host uptime and maintains a history which is pushed as an event +oStats = {} +exports.hostUptime = ( url ) -> + pingHost url, ( evt ) -> + oStats[ evt.timestamp ] = evt + pushEvent oStats \ No newline at end of file diff --git a/examples/event-pollers/weather.coffee b/examples/event-pollers/weather.coffee index 6ab0c42..de8dd85 100644 --- a/examples/event-pollers/weather.coffee +++ b/examples/event-pollers/weather.coffee @@ -3,9 +3,7 @@ OpenWeather EVENT POLLER ------------------------ This module requires user-specific parameters: -- openweatherKey -- tempThreshold -- city +- appid ### urlService = 'http://api.openweathermap.org/data/2.5/weather' @@ -13,15 +11,15 @@ urlService = 'http://api.openweathermap.org/data/2.5/weather' ### Fetches the temperature ### -getWeatherData = ( cb ) -> - url = urlService + '?APPID=' + params.openweatherKey + '&q=' + params.city +getWeatherData = ( city, cb ) -> + url = urlService + '?APPID=' + params.appid + '&q=' + params.city needle.request 'get', url, null, null, cb ### Pushes the current weather data into the system ### -exports.currentData = () -> - getWeatherData ( err, resp, body ) -> +exports.currentData = ( city ) -> + getWeatherData city, ( err, resp, body ) -> if err or resp.statusCode isnt 200 log JSON.stringify body else @@ -30,14 +28,14 @@ exports.currentData = () -> ### Emits one event per day if the temperature today raises above user defined threshold ### -exports.temperatureOverThreshold = () -> - getWeatherData ( err, resp, body ) -> +exports.temperatureOverThreshold = ( city, tempThreshold ) -> + getWeatherData city, ( err, resp, body ) -> if err or resp.statusCode isnt 200 log JSON.stringify body else #If temperature is above threshold - if body.main.temp_max - 272.15 > params.tempThreshold + if body.main.temp_max - 272.15 > tempThreshold pushEvent - threshold: params.tempThreshold + threshold: tempThreshold measured: body.main.temp_max - 272.15 diff --git a/examples/eventproducers/hoststatistics.coffee b/examples/eventproducers/hoststatistics.coffee index 10c6222..00143f3 100644 --- a/examples/eventproducers/hoststatistics.coffee +++ b/examples/eventproducers/hoststatistics.coffee @@ -26,7 +26,7 @@ remoteUrl = "http://ec2-54-226-188-9.compute-1.amazonaws.com:8126" # report.forEach ( item ) -> # console.log item[ 0 ] -session = ping.createSession() +session = ping.createSession retries: 5 everyMins = 10 oHosts = {} oPings = {} diff --git a/webpages/handlers/coffee/forge_rule.coffee b/webpages/handlers/coffee/forge_rule.coffee index 9b3c501..4bde32c 100644 --- a/webpages/handlers/coffee/forge_rule.coffee +++ b/webpages/handlers/coffee/forge_rule.coffee @@ -142,7 +142,9 @@ fOnLoad = () -> $( '#event_poller_params' ).html 'Required Global Parameters:' $( '#event_poller_params' ).append table - fFillEventParams id + fDelayed = () -> + fFillEventParams id + setTimeout fDelayed, 200 fFillEventParams = ( moduleId ) -> obj = @@ -219,7 +221,9 @@ fOnLoad = () -> $( "#select_actions option" ).each () -> if $( this ).text() is name $( this ).remove() - fFillActionFunction arrName[ 0 ] + fDelayed = () -> + fFillActionFunction arrName[ 0 ] + setTimeout fDelayed, 300 fFetchActionParams = ( div, modName ) -> obj = diff --git a/webpages/handlers/remote-scripts/forge_module.html b/webpages/handlers/remote-scripts/forge_module.html index 7311999..18be31b 100644 --- a/webpages/handlers/remote-scripts/forge_module.html +++ b/webpages/handlers/remote-scripts/forge_module.html @@ -18,7 +18,6 @@ exports.newMail = () -> # Syntax: needle.request method, url, data, [options], callback # needle.request 'get', url, null, null, ( err, resp, body ) -> - log 'Poll function executed' if err log 'Error in EmailYak EM newMail: ' + err.message else diff --git a/webpages/public/data/histochart.json b/webpages/public/data/histochart.json index e4dcf32..b8c2cbc 100644 --- a/webpages/public/data/histochart.json +++ b/webpages/public/data/histochart.json @@ -528,6 +528,41 @@ "131.152.85.228" ], "sum": 35 + }, + "2014-04-23T14:02:50.747Z": { + "ips": [ + "131.152.85.64", + "131.152.85.67", + "131.152.85.68", + "131.152.85.69", + "131.152.85.72", + "131.152.85.66", + "131.152.85.73", + "131.152.85.80", + "131.152.85.82", + "131.152.85.81", + "131.152.85.84", + "131.152.85.83", + "131.152.85.93", + "131.152.85.85", + "131.152.85.94", + "131.152.85.96", + "131.152.85.106", + "131.152.85.97", + "131.152.85.74", + "131.152.85.95", + "131.152.85.103", + "131.152.85.120", + "131.152.85.115", + "131.152.85.70", + "131.152.85.254", + "131.152.85.79", + "131.152.85.227", + "131.152.85.225", + "131.152.85.226", + "131.152.85.228" + ], + "sum": 30 } }, "hosts": { diff --git a/webpages/public/histogram.html b/webpages/public/histogram.html index f404376..c4c1106 100644 --- a/webpages/public/histogram.html +++ b/webpages/public/histogram.html @@ -11,31 +11,26 @@