Move default provisions to a separate file
And reuse the same set of default provisions for presets and tasks.
This commit is contained in:
1 parent
ee40a44339
commit
2ca3ec86a8
4 files changed
+112
-64
No files matched your search
+1
-1
@@ -136,7 +136,7 @@ refresh = (callback) ->
|
|||||||
for c in preset.configurations
|
for c in preset.configurations
|
||||||
switch c.type
|
switch c.type
|
||||||
when 'age'
|
when 'age'
|
||||||
_provisions.push(['refresh', c.name, c.age * -1000])
|
_provisions.push(['refresh', c.name, c.age])
|
||||||
when 'value'
|
when 'value'
|
||||||
_provisions.push(['value', c.name, c.value])
|
_provisions.push(['value', c.name, c.value])
|
||||||
when 'add_tag'
|
when 'add_tag'
|
||||||
|
|||||||
+21
-19
@@ -41,7 +41,6 @@
|
|||||||
util = require 'util'
|
util = require 'util'
|
||||||
zlib = require 'zlib'
|
zlib = require 'zlib'
|
||||||
crypto = require 'crypto'
|
crypto = require 'crypto'
|
||||||
mongodb = require 'mongodb'
|
|
||||||
|
|
||||||
config = require './config'
|
config = require './config'
|
||||||
common = require './common'
|
common = require './common'
|
||||||
@@ -341,8 +340,8 @@ nextRpc = (currentRequest) ->
|
|||||||
|
|
||||||
if fault
|
if fault
|
||||||
for channel of currentRequest.sessionData.channels
|
for channel of currentRequest.sessionData.channels
|
||||||
if channel.startsWith('_task_')
|
if channel.startsWith('task_')
|
||||||
taskId = channel.slice(6)
|
taskId = channel.slice(5)
|
||||||
for t, j in currentRequest.sessionData.tasks
|
for t, j in currentRequest.sessionData.tasks
|
||||||
if t._id == taskId
|
if t._id == taskId
|
||||||
currentRequest.sessionData.tasks.splice(j, 1)
|
currentRequest.sessionData.tasks.splice(j, 1)
|
||||||
@@ -362,12 +361,12 @@ nextRpc = (currentRequest) ->
|
|||||||
currentRequest.sessionData.faultsTouched ?= {}
|
currentRequest.sessionData.faultsTouched ?= {}
|
||||||
currentRequest.sessionData.faultsTouched[channel] = true
|
currentRequest.sessionData.faultsTouched[channel] = true
|
||||||
|
|
||||||
for p in currentRequest.sessionData.provisions
|
if channel.startsWith('task_')
|
||||||
if p[0] == '_task'
|
taskId = channel.slice(5)
|
||||||
currentRequest.sessionData.doneTasks ?= []
|
currentRequest.sessionData.doneTasks ?= []
|
||||||
currentRequest.sessionData.doneTasks.push(p[1])
|
currentRequest.sessionData.doneTasks.push(taskId)
|
||||||
for t, j in currentRequest.sessionData.tasks
|
for t, j in currentRequest.sessionData.tasks
|
||||||
if String(t._id) == p[1]
|
if t._id == taskId
|
||||||
currentRequest.sessionData.tasks.splice(j, 1)
|
currentRequest.sessionData.tasks.splice(j, 1)
|
||||||
break
|
break
|
||||||
|
|
||||||
@@ -383,22 +382,25 @@ nextRpc = (currentRequest) ->
|
|||||||
|
|
||||||
switch task.name
|
switch task.name
|
||||||
when 'getParameterValues'
|
when 'getParameterValues'
|
||||||
session.addProvisions(currentRequest.sessionData, "_task_#{task._id}", [['_task', task._id, 'getParameterValues'].concat(task.parameterNames)])
|
for p in task.parameterNames
|
||||||
|
session.addProvisions(currentRequest.sessionData, "task_#{task._id}",
|
||||||
|
[['refresh', p]])
|
||||||
when 'setParameterValues'
|
when 'setParameterValues'
|
||||||
t = ['_task', task._id, 'setParameterValues']
|
|
||||||
for p in task.parameterValues
|
for p in task.parameterValues
|
||||||
t.push(p[0])
|
session.addProvisions(currentRequest.sessionData, "task_#{task._id}",
|
||||||
t.push(p[1])
|
[['value', p[0], p[1]]])
|
||||||
t.push(p[2] ? '')
|
|
||||||
session.addProvisions(currentRequest.sessionData, "_task_#{task._id}", [t])
|
|
||||||
when 'refreshObject'
|
when 'refreshObject'
|
||||||
session.addProvisions(currentRequest.sessionData, "_task_#{task._id}", [['_task', task._id, 'refreshObject', task.objectName]])
|
session.addProvisions(currentRequest.sessionData, "task_#{task._id}",
|
||||||
|
[['refresh', task.objectName]])
|
||||||
when 'reboot'
|
when 'reboot'
|
||||||
session.addProvisions(currentRequest.sessionData, "_task_#{task._id}", [['_task', task._id, 'reboot']])
|
session.addProvisions(currentRequest.sessionData, "task_#{task._id}",
|
||||||
|
[['reboot']])
|
||||||
when 'factoryReset'
|
when 'factoryReset'
|
||||||
session.addProvisions(currentRequest.sessionData, "_task_#{task._id}", [['_task', task._id, 'factoryReset']])
|
session.addProvisions(currentRequest.sessionData, "task_#{task._id}",
|
||||||
|
[['reset']])
|
||||||
when 'download'
|
when 'download'
|
||||||
session.addProvisions(currentRequest.sessionData, "_task_#{task._id}", [['_task', task._id, 'download', task.fileType, task.fileName, task.targetFileName]])
|
session.addProvisions(currentRequest.sessionData, "task_#{task._id}",
|
||||||
|
[['download', task.fileType, task.fileName, task.targetFileName]])
|
||||||
else
|
else
|
||||||
return throwError(new Error('Task name not recognized'), currentRequest.httpResponse) if err
|
return throwError(new Error('Task name not recognized'), currentRequest.httpResponse) if err
|
||||||
|
|
||||||
@@ -643,8 +645,8 @@ listener = (httpRequest, httpResponse) ->
|
|||||||
|
|
||||||
if fault
|
if fault
|
||||||
for channel of currentRequest.sessionData.channels
|
for channel of currentRequest.sessionData.channels
|
||||||
if channel.startsWith('_task_')
|
if channel.startsWith('task_')
|
||||||
taskId = channel.slice(6)
|
taskId = channel.slice(5)
|
||||||
for t, j in currentRequest.sessionData.tasks
|
for t, j in currentRequest.sessionData.tasks
|
||||||
if t._id == taskId
|
if t._id == taskId
|
||||||
currentRequest.sessionData.tasks.splice(j, 1)
|
currentRequest.sessionData.tasks.splice(j, 1)
|
||||||
|
|||||||
@@ -0,0 +1,87 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2013-2016 Zaid Abdulla
|
||||||
|
*
|
||||||
|
* GenieACS is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GenieACS is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with GenieACS. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
const config = require("./config");
|
||||||
|
const common = require("./common");
|
||||||
|
|
||||||
|
const MAX_DEPTH = config.get("MAX_DEPTH");
|
||||||
|
|
||||||
|
|
||||||
|
function refresh(sessionData, provision, declarations, startRevision, endRevision) {
|
||||||
|
let path = common.parsePath(provision[1]).slice();
|
||||||
|
let l = path.length;
|
||||||
|
path.length = MAX_DEPTH;
|
||||||
|
path.fill("*", l);
|
||||||
|
let every = 1000 * (provision[2] || 1);
|
||||||
|
let t = Math.trunc(sessionData.timestamp / every) * every;
|
||||||
|
|
||||||
|
for (let i = l; i < path.length; ++ i)
|
||||||
|
declarations.push([path.slice(0, i), t, {object: 1, writable: 1, value: t}]);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function value(sessionData, provision, declarations, startRevision, endRevision) {
|
||||||
|
let path = common.parsePath(provision[1]);
|
||||||
|
declarations.push([path, 1, {value: 1}, null, {value: [provision[2]]}]);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function tag(sessionData, provision, declarations, startRevision, endRevision) {
|
||||||
|
let path = ["Tags", provision[1]];
|
||||||
|
declarations.push([path, 1, {value: 1}, null, {value: [provision[2]]}]);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function reboot(sessionData, provision, declarations, startRevision, endRevision) {
|
||||||
|
declarations.push([["Reboot"], 1, {value: 1}, null, {value: [sessionData.timestamp]}]);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function reset(sessionData, provision, declarations, startRevision, endRevision) {
|
||||||
|
declarations.push([["FactoryReset"], 1, {value: 1}, null, {value: [sessionData.timestamp]}]);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function download(sessionData, provision, declarations, startRevision, endRevision) {
|
||||||
|
let alias = ["FileType", provision[1] || "", "FileName", provision[2] || "",
|
||||||
|
"TargetFileName", provision[3] || ""];
|
||||||
|
|
||||||
|
declarations.push([["Downloads", alias], 1, {}, 1]);
|
||||||
|
declarations.push([["Downloads", alias, "Download"], 1, {value: 1}, null,
|
||||||
|
{value: [sessionData.timestamp]}]);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
exports.refresh = refresh;
|
||||||
|
exports.value = value;
|
||||||
|
exports.tag = tag;
|
||||||
|
exports.reboot = reboot;
|
||||||
|
exports.reset = reset;
|
||||||
|
exports.download = download;
|
||||||
+3
-44
@@ -24,6 +24,7 @@ cache = require './cache'
|
|||||||
PathSet = require './path-set'
|
PathSet = require './path-set'
|
||||||
VersionedMap = require './versioned-map'
|
VersionedMap = require './versioned-map'
|
||||||
InstanceSet = require './instance-set'
|
InstanceSet = require './instance-set'
|
||||||
|
defaultProvisions = require './default-provisions'
|
||||||
|
|
||||||
|
|
||||||
initDeviceData = () ->
|
initDeviceData = () ->
|
||||||
@@ -323,50 +324,8 @@ runProvisions = (sessionData, provisions, startRevision, endRevision, callback)
|
|||||||
counter = 1
|
counter = 1
|
||||||
for provision in provisions
|
for provision in provisions
|
||||||
if not sessionData.cache.provisions[provision[0]]?
|
if not sessionData.cache.provisions[provision[0]]?
|
||||||
switch provision[0]
|
if defaultProvisions[provision[0]]
|
||||||
when 'refresh'
|
done = defaultProvisions[provision[0]](sessionData, provision, allDeclarations, startRevision, endRevision) and done
|
||||||
path = common.parsePath(provision[1]).slice()
|
|
||||||
l = path.length
|
|
||||||
path.length = config.get('MAX_DEPTH', sessionData.deviceId)
|
|
||||||
path.fill('*', l)
|
|
||||||
t = provision[2]
|
|
||||||
t += sessionData.timestamp if t <= 0
|
|
||||||
|
|
||||||
for i in [l...path.length] by 1
|
|
||||||
p = common.addPathMeta(path.slice(0, i))
|
|
||||||
allDeclarations.push([p, t, {object: 1, writable: 1, value: t}])
|
|
||||||
when 'value'
|
|
||||||
allDeclarations.push([common.parsePath(provision[1]), 1, {value: 1}, null, {value: [provision[2]]}])
|
|
||||||
when 'tag'
|
|
||||||
allDeclarations.push([['Tags', provision[1]], 1, {value: 1}, null, {value: [provision[2], 'xsd:boolean']}])
|
|
||||||
when '_task'
|
|
||||||
# A special provision for tasks compatibility
|
|
||||||
switch provision[2]
|
|
||||||
when 'getParameterValues'
|
|
||||||
for i in [3...provision.length] by 1
|
|
||||||
allDeclarations.push([common.parsePath(provision[i]), 1, {value: sessionData.timestamp}])
|
|
||||||
when 'setParameterValues'
|
|
||||||
for i in [3...provision.length] by 3
|
|
||||||
v = if provision[i + 2] then [provision[i + 1], provision[i + 2]] else [provision[i + 1]]
|
|
||||||
allDeclarations.push([common.parsePath(provision[i]), 1, {value: 1}, null, {value: v}])
|
|
||||||
when 'refreshObject'
|
|
||||||
path = common.parsePath(provision[3]).slice()
|
|
||||||
l = path.length
|
|
||||||
path.length = config.get('MAX_DEPTH', sessionData.deviceId)
|
|
||||||
path.fill('*', l)
|
|
||||||
for i in [l...path.length] by 1
|
|
||||||
p = common.addPathMeta(path.slice(0, i))
|
|
||||||
allDeclarations.push([p, sessionData.timestamp, {object: 1, writable: 1, value: sessionData.timestamp}])
|
|
||||||
when 'reboot'
|
|
||||||
allDeclarations.push([['Reboot'], 1, {value: 1}, null, {value: [sessionData.timestamp]}])
|
|
||||||
when 'factoryReset'
|
|
||||||
allDeclarations.push([['FactoryReset'], 1, {value: 1}, null, {value: [sessionData.timestamp]}])
|
|
||||||
when 'download'
|
|
||||||
alias = "[FileType:#{JSON.stringify(provision[3] or '')},FileName:#{JSON.stringify(provision[4] or '')},TargetFileName:#{JSON.stringify(provision[5] or '')}]"
|
|
||||||
allDeclarations.push([common.parsePath("Downloads.#{alias}"),
|
|
||||||
1, {}, 1, {}])
|
|
||||||
allDeclarations.push([common.parsePath("Downloads.#{alias}.Download"),
|
|
||||||
1, {value: 1}, null, {value: [sessionData.timestamp]}])
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
++ counter
|
++ counter
|
||||||
|
|||||||
Reference in new issue
Block a user