diff --git a/lib/cache.coffee b/lib/cache.coffee index 886d012..e40634d 100644 --- a/lib/cache.coffee +++ b/lib/cache.coffee @@ -18,6 +18,8 @@ vm = require 'vm' crypto = require 'crypto' +later = require 'later' + db = require './db' REFRESH = 3000 @@ -101,6 +103,22 @@ refresh = (callback) -> presets = [] 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) _provisions = preset.provisions or [] @@ -121,7 +139,7 @@ refresh = (callback) -> else 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 computeHash() diff --git a/lib/cwmp.coffee b/lib/cwmp.coffee index 0e15397..ea94066 100644 --- a/lib/cwmp.coffee +++ b/lib/cwmp.coffee @@ -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) -> cache.getPresets((err, presetsHash, presets) -> throw err if err @@ -112,7 +134,12 @@ applyPresets = (currentRequest) -> currentRequest.sessionData.presetsHash = presetsHash parameters = {} + filteredPresets = [] 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)) parameters[a] = common.parsePath(a) @@ -131,7 +158,7 @@ applyPresets = (currentRequest) -> if unpacked[0] and (vv = deviceData.values.value.get(unpacked[0]))? parameters[k] = vv[0] - for p in presets + for p in filteredPresets if query.test(parameters, p.precondition) session.addProvisions(currentRequest.sessionData, p.provisions) diff --git a/package.json b/package.json index 8b7b0ab..e190d49 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "bin": "bin" }, "dependencies": { + "later": "^1.2.0", "libxmljs": "^0.17.1", "redis": "^2.4.2", "hiredis": "^0.4.1",