Implement cron-like scheduling for presets
This commit is contained in:
1 parent
1537603945
commit
d9f8b1c695
3 files changed
+48
-2
No files matched your search
+19
-1
@@ -18,6 +18,8 @@
|
|||||||
vm = require 'vm'
|
vm = require 'vm'
|
||||||
crypto = require 'crypto'
|
crypto = require 'crypto'
|
||||||
|
|
||||||
|
later = require 'later'
|
||||||
|
|
||||||
db = require './db'
|
db = require './db'
|
||||||
|
|
||||||
REFRESH = 3000
|
REFRESH = 3000
|
||||||
@@ -101,6 +103,22 @@ refresh = (callback) ->
|
|||||||
presets = []
|
presets = []
|
||||||
|
|
||||||
for preset in res
|
for preset in res
|
||||||
|
schedule = null
|
||||||
|
if preset.schedule
|
||||||
|
parts = preset.schedule.trim().split(/\s+/)
|
||||||
|
schedule = {
|
||||||
|
md5: crypto.createHash('md5').update(preset.schedule).digest('hex')
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
schedule.duration = +(parts.shift()) * 1000
|
||||||
|
parts.unshift('0') if parts.length == 5
|
||||||
|
# TODO later.js doesn't throw erorr if expression is invalid!
|
||||||
|
schedule.schedule = later.schedule(later.parse.cron(parts.join(' '), true))
|
||||||
|
catch err
|
||||||
|
# TODO show a warning
|
||||||
|
schedule.schedule = false
|
||||||
|
|
||||||
precondition = JSON.parse(preset.precondition)
|
precondition = JSON.parse(preset.precondition)
|
||||||
|
|
||||||
_provisions = preset.provisions or []
|
_provisions = preset.provisions or []
|
||||||
@@ -121,7 +139,7 @@ refresh = (callback) ->
|
|||||||
else
|
else
|
||||||
throw new Error("Unknown configuration type #{c.type}")
|
throw new Error("Unknown configuration type #{c.type}")
|
||||||
|
|
||||||
presets.push({name: preset._id, precondition: precondition, provisions: _provisions})
|
presets.push({name: preset._id, schedule: schedule, precondition: precondition, provisions: _provisions})
|
||||||
|
|
||||||
if -- counter == 0
|
if -- counter == 0
|
||||||
computeHash()
|
computeHash()
|
||||||
|
|||||||
+28
-1
@@ -105,6 +105,28 @@ inform = (currentRequest, cwmpRequest) ->
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
testSchedule = (schedule, timestamp) ->
|
||||||
|
range = schedule.schedule.nextRange(10, new Date(timestamp))
|
||||||
|
prev = schedule.schedule.prevRange(1, new Date(timestamp), new Date(timestamp - schedule.duration))
|
||||||
|
|
||||||
|
if prev
|
||||||
|
first = +(prev[0] ? 0)
|
||||||
|
last = +(prev[1] ? 0) + schedule.duration
|
||||||
|
else
|
||||||
|
first = +(range[0][0] ? 0)
|
||||||
|
last = +(range[0][1] ? 0) + schedule.duration
|
||||||
|
|
||||||
|
for r in range
|
||||||
|
if last < r[0]
|
||||||
|
break
|
||||||
|
last = +(r[1] ? 0) + schedule.duration
|
||||||
|
|
||||||
|
if timestamp >= first
|
||||||
|
return [true, Math.max(0, last - timestamp)]
|
||||||
|
else
|
||||||
|
return [false, first - timestamp]
|
||||||
|
|
||||||
|
|
||||||
applyPresets = (currentRequest) ->
|
applyPresets = (currentRequest) ->
|
||||||
cache.getPresets((err, presetsHash, presets) ->
|
cache.getPresets((err, presetsHash, presets) ->
|
||||||
throw err if err
|
throw err if err
|
||||||
@@ -112,7 +134,12 @@ applyPresets = (currentRequest) ->
|
|||||||
currentRequest.sessionData.presetsHash = presetsHash
|
currentRequest.sessionData.presetsHash = presetsHash
|
||||||
|
|
||||||
parameters = {}
|
parameters = {}
|
||||||
|
filteredPresets = []
|
||||||
for p in presets
|
for p in presets
|
||||||
|
continue if p.schedule and not
|
||||||
|
(p.schedule.schedule and testSchedule(p.schedule, currentRequest.sessionData.timestamp)[0])
|
||||||
|
|
||||||
|
filteredPresets.push(p)
|
||||||
for a in Object.keys(query.queryProjection(p.precondition))
|
for a in Object.keys(query.queryProjection(p.precondition))
|
||||||
parameters[a] = common.parsePath(a)
|
parameters[a] = common.parsePath(a)
|
||||||
|
|
||||||
@@ -131,7 +158,7 @@ applyPresets = (currentRequest) ->
|
|||||||
if unpacked[0] and (vv = deviceData.values.value.get(unpacked[0]))?
|
if unpacked[0] and (vv = deviceData.values.value.get(unpacked[0]))?
|
||||||
parameters[k] = vv[0]
|
parameters[k] = vv[0]
|
||||||
|
|
||||||
for p in presets
|
for p in filteredPresets
|
||||||
if query.test(parameters, p.precondition)
|
if query.test(parameters, p.precondition)
|
||||||
session.addProvisions(currentRequest.sessionData, p.provisions)
|
session.addProvisions(currentRequest.sessionData, p.provisions)
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
"bin": "bin"
|
"bin": "bin"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"later": "^1.2.0",
|
||||||
"libxmljs": "^0.17.1",
|
"libxmljs": "^0.17.1",
|
||||||
"redis": "^2.4.2",
|
"redis": "^2.4.2",
|
||||||
"hiredis": "^0.4.1",
|
"hiredis": "^0.4.1",
|
||||||
|
|||||||
Reference in new issue
Block a user