Compare commits

...
13 Commits
Author SHA1 Message Date
Zaid Abdulla 91f9a8f54b 1.0.7 2016-05-18 01:15:59 +03:00
Zaid Abdulla 68b6a786bf Add config option for connection request timeout
Resolves: #148
2016-05-18 01:02:01 +03:00
Zaid Abdulla 9fde3ad5d5 Some fixes in unpacking of queries with regex 2016-05-18 00:44:52 +03:00
Zaid Abdulla 3fa299cbee Merge pull request #155 from shweelan/v1.0
Clear presets when task is deleted
2016-05-11 20:24:24 +03:00
Shweelan Samson b8e3260e75 Clear presets when task is deleted 2016-05-11 20:16:25 +03:00
Zaid Abdulla 47f7282a27 Fix regression bug in download task 2016-03-17 13:15:19 +03:00
Zaid Abdulla 4e57b7124a Fix alias unpacking bug in queries with $ne operator 2016-03-07 02:45:43 +03:00
Richard Platel 650efa9bec Allow downloads from arbitrary URLS
If the download task contains a 'url', instruct the device to download
from that URL instead of genieacs-fs.
2016-03-07 02:45:43 +03:00
Zaid Abdulla 4284fded99 1.0.6 2016-01-15 11:57:56 +03:00
Zaid Abdulla 4bede83ccd Fix sorting bug in API 2016-01-13 18:08:46 +03:00
Zaid Abdulla fe8e782e9f Fix bug preventing saving of boot and bootstrap timestamps 2016-01-06 22:42:19 +03:00
Zaid Abdulla 3eb89e5dc6 Fix bug causing constant refreshing of custom commands 2015-12-20 02:14:35 +03:00
Zaid Abdulla 1362eb4cd9 Fix custom command not found when specifying different config dir
Resolves: #123
2015-12-20 02:06:51 +03:00
10 changed files with 90 additions and 48 deletions

No files matched your search

+1 -1
View File
@@ -84,7 +84,7 @@ connectionRequest = (deviceId, callback) ->
) )
request.on('socket', (socket) -> request.on('socket', (socket) ->
socket.setTimeout(2000) socket.setTimeout(config.get('CONNECTION_REQUEST_TIMEOUT', deviceId))
socket.on('timeout', () -> socket.on('timeout', () ->
request.abort() request.abort()
) )
+1
View File
@@ -50,6 +50,7 @@ options = {
GET_PARAMETER_NAMES_DEPTH_THRESHOLD : {type : 'int', default : 0}, GET_PARAMETER_NAMES_DEPTH_THRESHOLD : {type : 'int', default : 0},
TASK_PARAMETERS_BATCH_SIZE : {type : 'int', default : 32}, TASK_PARAMETERS_BATCH_SIZE : {type : 'int', default : 32},
COOKIES_PATH : {type : 'string'}, COOKIES_PATH : {type : 'string'},
CONNECTION_REQUEST_TIMEOUT : {type : 'int', default : 2000},
# Libxml related configuration # Libxml related configuration
XML_PARSE_RECOVER : {type : 'bool'}, XML_PARSE_RECOVER : {type : 'bool'},
+11 -2
View File
@@ -15,22 +15,31 @@
# along with GenieACS. If not, see <http://www.gnu.org/licenses/>. # along with GenieACS. If not, see <http://www.gnu.org/licenses/>.
### ###
path = require 'path'
config = require './config' config = require './config'
common = require './common' common = require './common'
FILES = {}
getFile = (filename) ->
if filename not of FILES
FILES[filename] = require(path.resolve(config.get('CONFIG_DIR'), "custom_commands/#{filename}"))
return FILES[filename]
exports.execute = (deviceId, command, callback) -> exports.execute = (deviceId, command, callback) ->
args = command.split(/\s+/) args = command.split(/\s+/)
f = args.shift() f = args.shift()
c = args.shift() c = args.shift()
file = require "../config/custom_commands/#{f}" file = getFile(f)
file[c](deviceId, args.join(' '), callback) file[c](deviceId, args.join(' '), callback)
exports.getFileCommands = (filename) -> exports.getFileCommands = (filename) ->
commands = [] commands = []
f = require("../config/custom_commands/#{filename}") f = getFile(filename)
for k,v of f for k,v of f
commands.push(k) commands.push(k)
return commands return commands
+1 -1
View File
@@ -185,7 +185,7 @@ inform = (currentRequest, cwmpRequest) ->
deviceCustomCommands[k] = v._timestamp for k,v of device._customCommands deviceCustomCommands[k] = v._timestamp for k,v of device._customCommands
for cmd in customCommands.getDeviceCustomCommandNames(currentRequest.session.deviceId) for cmd in customCommands.getDeviceCustomCommandNames(currentRequest.session.deviceId)
if not (deviceCustomCommands[cmd]?._timestamp < lastBootstrap) if not deviceCustomCommands[cmd]? or deviceCustomCommands[cmd] < lastBootstrap
# Increment timestamp by one millisecond to ensure it runs after any refresh task # Increment timestamp by one millisecond to ensure it runs after any refresh task
_tasks.push({device: currentRequest.session.deviceId, name: 'customCommand', command: "#{cmd} init", timestamp: new Date(now.getTime() + 1)}) _tasks.push({device: currentRequest.session.deviceId, name: 'customCommand', command: "#{cmd} init", timestamp: new Date(now.getTime() + 1)})
delete deviceCustomCommands[cmd] delete deviceCustomCommands[cmd]
+23 -10
View File
@@ -290,19 +290,25 @@ listener = (request, response) ->
action = r[2] action = r[2]
if not action? or action is '/' if not action? or action is '/'
if request.method == 'DELETE' if request.method == 'DELETE'
db.tasksCollection.remove({'_id' : taskId}, (err, removedCount) -> db.tasksCollection.findOne({'_id' : taskId}, {'device' : 1}, (err, task) ->
if err throw err if err
response.writeHead(500)
response.end(errorToString(err))
return
if removedCount == 0 if not task
response.writeHead(404) response.writeHead(404)
response.end() response.end()
return return
response.writeHead(200) deviceId = task.device
response.end() db.tasksCollection.remove({'_id' : taskId}, (err, removedCount) ->
throw err if err
db.redisClient.del("#{deviceId}_presets_hash", (err) ->
throw err if err
response.writeHead(200)
response.end()
)
)
) )
else else
response.writeHead 405, {'Allow': 'PUT DELETE'} response.writeHead 405, {'Allow': 'PUT DELETE'}
@@ -421,9 +427,16 @@ listener = (request, response) ->
sort = {} sort = {}
for k,v of s for k,v of s
if aliases[k]? if aliases[k]?
sort[a] = v for a in aliases[k] for a in aliases[k]
if a[a.lastIndexOf('.')+1] != '_' and collectionName is 'devices'
sort["#{a}._value"] = v
else
sort[a] = v
else else
sort[k] = v if k[k.lastIndexOf('.') + 1] != '_' and collectionName is 'devices'
sort["#{k}._value"] = v
else
sort[k] = v
cur.sort(sort) cur.sort(sort)
cur.skip(parseInt(urlParts.query.skip)) if urlParts.query.skip? cur.skip(parseInt(urlParts.query.skip)) if urlParts.query.skip?
+3 -3
View File
@@ -68,7 +68,7 @@ normalizers.default = (input, normType) ->
r = stringToRegexp(input) r = stringToRegexp(input)
if r isnt false if r isnt false
vals.push({'$regex' : r}) vals.push(r)
return vals return vals
return input return input
@@ -90,7 +90,7 @@ normalizers.date = (input, normType) ->
normalizers.string = (input, normType) -> normalizers.string = (input, normType) ->
if normType is 'query' if normType is 'query'
if (m = /^\/(.*?)\/(g?i?m?y?)$/.exec(input)) if (m = /^\/(.*?)\/(g?i?m?y?)$/.exec(input))
return [{'$regex' : new RegExp(m[1], m[2])}, input] return [new RegExp(m[1], m[2]), input]
return input return input
@@ -124,7 +124,7 @@ normalizers.mac = (input, normType) ->
if input.length == 17 if input.length == 17
return [input, input.toLowerCase()] return [input, input.toLowerCase()]
return {'$regex' : new RegExp(input, 'i')} return new RegExp(input, 'i')
exports.normalize = (path, value, normType) -> exports.normalize = (path, value, normType) ->
+16 -5
View File
@@ -51,8 +51,17 @@ expandValue = (param, value) ->
while i < indices.length while i < indices.length
obj = {} obj = {}
for i in [0...keys.length] for i in [0...keys.length]
if common.typeOf(values[i][indices[i]]) is common.REGEXP_TYPE
if keys[i] == '$ne'
obj['$not'] = values[i][indices[i]]
continue
else if keys[i] == '$not' and common.typeOf(values[i][indices[i]]) isnt common.OBJECT_TYPE
# Only a regex or decoument (object) are allowed within a $not operator.
# This is needed in order to discard string from which a regex is generated.
continue
obj[keys[i]] = values[i][indices[i]] obj[keys[i]] = values[i][indices[i]]
objs.push(obj) objs.push(obj) if Object.keys(obj).length
for i in [0...indices.length] for i in [0...indices.length]
indices[i] += 1 indices[i] += 1
@@ -75,7 +84,7 @@ permute = (param, val, aliases) ->
values = expandValue(k, val) values = expandValue(k, val)
if k[k.lastIndexOf('.') + 1] != '_' if k[k.lastIndexOf('.') + 1] != '_'
k += '._value' k += '._value'
for v in values for v in values
obj = {} obj = {}
obj[k] = v obj[k] = v
@@ -95,10 +104,12 @@ expand = (query, aliases) ->
else else
conditions = permute(k, v, aliases) conditions = permute(k, v, aliases)
if conditions.length > 1 if conditions.length > 1
if new_query['$and']? new_query['$and'] ?= []
new_query['$and'].push({'$or' : conditions}) if v?['$ne']? or v?['$nin']? or v?['$not']?
for c in conditions
new_query['$and'].push(c)
else else
new_query['$and'] = [{'$or' : conditions}] new_query['$and'].push({'$or' : conditions})
else else
common.extend(new_query, conditions[0]) common.extend(new_query, conditions[0])
+31 -23
View File
@@ -322,31 +322,39 @@ this.download = (task, methodResponse, callback) ->
return return
if methodResponse.type isnt 'DownloadResponse' if methodResponse.type isnt 'DownloadResponse'
db.filesCollection.findOne({_id : mongodb.ObjectID(String(task.file))}, (err, file) -> if task.url?
if not file? methodRequest = {
callback('File not found') type : 'Download',
return fileType : task.fileType or '1 Firmware Upgrade Image',
else if err? url : task.url,
callback(err) username: task.username,
return password: task.password,
successUrl : task.successUrl,
failureUrl : task.failureUrl
}
callback(null, STATUS_OK, methodRequest)
else
db.filesCollection.findOne({_id : mongodb.ObjectID(String(task.file))}, (err, file) ->
if err or not file?
return callback(err or new Error('File not found'))
l = { l = {
protocol : if config.get('FS_SSL') then 'https' else 'http', protocol : if config.get('FS_SSL') then 'https' else 'http',
hostname : config.get('FS_IP'), hostname : config.get('FS_IP'),
port : config.get('FS_PORT'), port : config.get('FS_PORT'),
pathname : encodeURIComponent(file.filename) pathname : encodeURIComponent(file.filename)
} }
methodRequest = { methodRequest = {
type : 'Download', type : 'Download',
fileType : file.metadata.fileType, fileType : file.metadata.fileType,
fileSize : file.length, fileSize : file.length,
url : url.format(l), url : url.format(l),
successUrl : task.successUrl, successUrl : task.successUrl,
failureUrl : task.failureUrl failureUrl : task.failureUrl
} }
callback(null, STATUS_OK, methodRequest) callback(null, STATUS_OK, methodRequest)
) )
else else
callback(null, STATUS_COMPLETED) callback(null, STATUS_COMPLETED)
+2 -2
View File
@@ -53,8 +53,8 @@ commitUpdates = (deviceId, deviceUpdates, commitQueue, callback) ->
processBatch = (updatesBatch, cb) -> processBatch = (updatesBatch, cb) ->
if updatesBatch.informEvents? if updatesBatch.informEvents?
update['$set']['_lastInform'] = now update['$set']['_lastInform'] = now
update['$set']['_lastBoot'] if '1 BOOT' in updatesBatch.informEvents update['$set']['_lastBoot'] = now if '1 BOOT' in updatesBatch.informEvents
update['$set']['_lastBootstrap'] if '0 BOOTSTRAP' in updatesBatch.informEvents update['$set']['_lastBootstrap'] = now if '0 BOOTSTRAP' in updatesBatch.informEvents
if updatesBatch.parameterValues? if updatesBatch.parameterValues?
for p in updatesBatch.parameterValues for p in updatesBatch.parameterValues
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "genieacs", "name": "genieacs",
"version": "1.0.5", "version": "1.0.7",
"description": "A blazing fast TR-069 auto configuration server (ACS) built with Node.js, Redis, and MongoDB", "description": "A blazing fast TR-069 auto configuration server (ACS) built with Node.js, Redis, and MongoDB",
"repository": { "repository": {
"type": "git", "type": "git",