Firmware upgrade now functional

This commit is contained in:
Zaid Abdulla committed 2013-02-22 22:37:51 +03:00
1 parent e15f42a531
commit 39a5ff8a9a
5 files changed
+123 -107

No files matched your search

+30 -31
View File
@@ -94,38 +94,37 @@ updateDevice = (currentRequest, actions, callback) ->
runTask = (currentRequest, task, methodResponse) -> runTask = (currentRequest, task, methodResponse) ->
cwmpResponse = {} tasks.task(task, methodResponse, (err, status, cwmpResponse, deviceUpdates) ->
deviceUpdates = {} # TODO handle error
status = tasks.task(task, methodResponse, cwmpResponse, deviceUpdates) updateDevice(currentRequest, deviceUpdates)
updateDevice(currentRequest, deviceUpdates) switch status
when tasks.STATUS_FINISHED
switch status db.memcached.del(String(task._id))
when tasks.STATUS_FINISHED db.tasksCollection.remove({'_id' : mongodb.ObjectID(String(task._id))}, {safe: true}, (err, removed) ->
db.memcached.del(String(task._id)) util.log("#{currentRequest.deviceId}: Completed task #{task.name}(#{task._id})")
db.tasksCollection.remove({'_id' : mongodb.ObjectID(String(task._id))}, {safe: true}, (err, removed) -> nextTask(currentRequest)
util.log("#{currentRequest.deviceId}: Completed task #{task.name}(#{task._id})") )
nextTask(currentRequest) when tasks.STATUS_FAULT
) util.log("#{currentRequest.deviceId}: Fault response for task #{task._id}")
when tasks.STATUS_FAULT db.saveTask(task, (err) ->
util.log("#{currentRequest.deviceId}: Fault response for task #{task._id}") # Faulty task. No more work to do until task is deleted.
db.saveTask(task, (err) -> res = tr069.response(null, cwmpResponse)
# Faulty task. No more work to do until task is deleted. writeResponse(currentRequest, res)
res = tr069.response(null, cwmpResponse) )
writeResponse(currentRequest, res) when tasks.STATUS_PENDING
) db.saveTask(task, (err) ->
when tasks.STATUS_PENDING # task expects CPE confirmation later
db.saveTask(task, (err) -> nextTask(currentRequest)
# task expects CPE confirmation later )
nextTask(currentRequest) when tasks.STATUS_STARTED
) db.updateTask(task, (err) ->
when tasks.STATUS_STARTED res = tr069.response(task._id, cwmpResponse)
db.updateTask(task, (err) -> writeResponse(currentRequest, res)
res = tr069.response(task._id, cwmpResponse) )
writeResponse(currentRequest, res) else
) throw Error('Unknown task status')
else )
throw Error('Unknown task status')
nextTask = (currentRequest) -> nextTask = (currentRequest) ->
+1
View File
@@ -7,6 +7,7 @@ exports.API_PORT = 7557
exports.API_INTERFACE = '0.0.0.0' exports.API_INTERFACE = '0.0.0.0'
exports.FILES_PORT = 7567 exports.FILES_PORT = 7567
exports.FILES_INTERFACE = '0.0.0.0' exports.FILES_INTERFACE = '0.0.0.0'
exports.FILES_IP = '172.240.21.2' # Used when sending download requests to devices
exports.CACHE_DURATION = 60 # in seconds exports.CACHE_DURATION = 60 # in seconds
exports.PRESETS_CACHE_DURATION = 86400 exports.PRESETS_CACHE_DURATION = 86400
exports.PRESETS_TIME_PADDING = 1 exports.PRESETS_TIME_PADDING = 1
+4
View File
@@ -33,6 +33,10 @@ db.open( (err, db) ->
db.collection('presets', (err, collection) -> db.collection('presets', (err, collection) ->
exports.presetsCollection = presetsCollection = collection exports.presetsCollection = presetsCollection = collection
) )
db.collection('fs.files', (err, collection) ->
exports.filesCollection = filesCollection = collection
)
) )
+87 -75
View File
@@ -1,4 +1,7 @@
config = require './config'
common = require './common' common = require './common'
db = require './db'
mongodb = require 'mongodb'
BATCH_SIZE = 16 BATCH_SIZE = 16
exports.STATUS_QUEUED = STATUS_QUEUED = 0 exports.STATUS_QUEUED = STATUS_QUEUED = 0
@@ -8,60 +11,64 @@ exports.STATUS_FAULT = STATUS_FAULT = 3
exports.STATUS_FINISHED = STATUS_FINISHED = 4 exports.STATUS_FINISHED = STATUS_FINISHED = 4
this.init = (task, methodResponse, cwmpResponse, deviceUpdates) -> this.init = (task, methodResponse, callback) ->
if not task.subtask? if not task.subtask?
task.subtask = {'name' : 'getParameterNames', 'parameterPath' : '', 'nextLevel' : false} task.subtask = {name : 'getParameterNames', parameterPath : '', nextLevel : false}
if task.subtask.name == 'getParameterNames' if task.subtask.name == 'getParameterNames'
if methodResponse.faultcode? if methodResponse.faultcode?
task.fault = methodResponse task.fault = methodResponse
return STATUS_FAULT callback(null, STATUS_FAULT)
return
status = this.getParameterNames(task.subtask, methodResponse, cwmpResponse, deviceUpdates) this.getParameterNames(task.subtask, methodResponse, (err, status, cwmpResponse, deviceUpdates) =>
if status is STATUS_FINISHED if status is STATUS_FINISHED
parameterNames = [] parameterNames = []
for p in deviceUpdates.parameterNames for p in deviceUpdates.parameterNames
if not common.endsWith(p[0], '.') if not common.endsWith(p[0], '.')
parameterNames.push(p[0]) parameterNames.push(p[0])
task.subtask = {'name' : 'getParameterValues', 'parameterNames' : parameterNames} task.subtask = {name : 'getParameterValues', parameterNames : parameterNames}
else if status != STATUS_STARTED this.getParameterValues(task.subtask, {}, (err, status, cwmpResponse, deviceUpdates) ->
throw Error('Unexpected subtask status') callback(err, status, cwmpResponse, deviceUpdates)
)
if task.subtask.name == 'getParameterValues' else if status is STATUS_STARTED
callback(err, STATUS_STARTED, cwmpResponse, deviceUpdates)
else
throw Error('Unexpected subtask status')
)
else if task.subtask.name == 'getParameterValues'
if methodResponse.faultcode? if methodResponse.faultcode?
# Ignore GetParameterValues errors. A workaround for the crappy Seewon devices. # Ignore GetParameterValues errors. A workaround for the crappy Seewon devices.
status = this.getParameterValues(task.subtask, {parameterList : {}}, cwmpResponse, deviceUpdates) methodResponse = {parameterList : {}}
else this.getParameterValues(task.subtask, methodResponse, (err, status, cwmpResponse, deviceUpdates) ->
status = this.getParameterValues(task.subtask, methodResponse, cwmpResponse, deviceUpdates) callback(err, status, cwmpResponse, deviceUpdates)
if status is STATUS_FINISHED )
return STATUS_FINISHED else
else if status isnt STATUS_STARTED throw Error('Unexpected subtask name')
throw Error('Unexpected subtask status')
return STATUS_STARTED
this.getParameterNames = (task, methodResponse, cwmpResponse, deviceUpdates) -> this.getParameterNames = (task, methodResponse, callback) ->
if methodResponse.faultcode? if methodResponse.faultcode?
task.fault = methodResponse task.fault = methodResponse
return STATUS_FAULT callback(null, STATUS_FAULT)
return
if methodResponse.type is 'GetParameterNamesResponse' if methodResponse.type is 'GetParameterNamesResponse'
deviceUpdates.parameterNames = methodResponse.parameterList callback(null, STATUS_FINISHED, null, {parameterNames : methodResponse.parameterList})
return STATUS_FINISHED else
methodRequest = {
cwmpResponse.methodRequest = { type : 'GetParameterNames',
type : 'GetParameterNames', parameterPath : task.parameterPath,
parameterPath : task.parameterPath, nextLevel : if task.nextLevel? then task.nextLevel else false
nextLevel : if task.nextLevel? then task.nextLevel else false }
} callback(null, STATUS_STARTED, {methodRequest : methodRequest})
return STATUS_STARTED
this.getParameterValues = (task, methodResponse, cwmpResponse, deviceUpdates) -> this.getParameterValues = (task, methodResponse, callback) ->
if methodResponse.faultcode? if methodResponse.faultcode?
task.fault = methodResponse task.fault = methodResponse
return STATUS_FAULT callback(null, STATUS_FAULT)
return
if not task.currentIndex? if not task.currentIndex?
task.currentIndex = 0 task.currentIndex = 0
@@ -72,23 +79,23 @@ this.getParameterValues = (task, methodResponse, cwmpResponse, deviceUpdates) ->
names = task.parameterNames.slice(task.currentIndex, task.nextIndex) names = task.parameterNames.slice(task.currentIndex, task.nextIndex)
if methodResponse.type is 'GetParameterValuesResponse' if methodResponse.type is 'GetParameterValuesResponse'
deviceUpdates.parameterValues = methodResponse.parameterList deviceUpdates = {parameterValues : methodResponse.parameterList}
if names.length == 0 if names.length == 0
return STATUS_FINISHED callback(null, STATUS_FINISHED, null, deviceUpdates)
else
cwmpResponse.methodRequest = { methodRequest = {
type : 'GetParameterValues', type : 'GetParameterValues',
parameterNames : names parameterNames : names
} }
callback(null, STATUS_STARTED, {methodRequest : methodRequest}, deviceUpdates)
return STATUS_STARTED
this.setParameterValues = (task, methodResponse, cwmpResponse, deviceUpdates) -> this.setParameterValues = (task, methodResponse, callback) ->
if methodResponse.faultcode? if methodResponse.faultcode?
task.fault = methodResponse task.fault = methodResponse
return STATUS_FAULT callback(null, STATUS_FAULT)
return
if not task.currentIndex? if not task.currentIndex?
task.currentIndex = 0 task.currentIndex = 0
@@ -100,47 +107,52 @@ this.setParameterValues = (task, methodResponse, cwmpResponse, deviceUpdates) ->
values = task.parameterValues.slice(task.currentIndex, task.nextIndex) values = task.parameterValues.slice(task.currentIndex, task.nextIndex)
if prevValues? if prevValues?
deviceUpdates.parameterValues = prevValues deviceUpdates = {parameterValues : prevValues}
if values.length == 0 if values.length == 0
return STATUS_FINISHED callback(null, STATUS_FINISHED, null, deviceUpdates)
else
cwmpResponse.methodRequest = { callback(null, STATUS_STARTED, {methodRequest : {type : 'SetParameterValues', parameterList : values}}, deviceUpdates)
type : 'SetParameterValues',
parameterList : values
}
return STATUS_STARTED
this.reboot = (task, methodResponse, cwmpResponse, deviceUpdates) -> this.reboot = (task, methodResponse, callback) ->
if methodResponse.faultcode? if methodResponse.faultcode?
task.fault = methodResponse task.fault = methodResponse
return STATUS_FAULT callback(null, STATUS_FAULT)
return
if methodResponse.type isnt 'RebootResponse' if methodResponse.type isnt 'RebootResponse'
cwmpResponse.methodRequest = { callback(null, STATUS_STARTED, {methodRequest : {type : 'Reboot'}})
type : 'Reboot' else
} callback(null, STATUS_FINISHED)
return STATUS_STARTED
return STATUS_FINISHED
this.download = (task, methodResponse, cwmpResponse, deviceUpdates) -> this.download = (task, methodResponse, callback) ->
if methodResponse.faultcode? if methodResponse.faultcode?
task.fault = methodResponse task.fault = methodResponse
return STATUS_FAULT callback(null, STATUS_FAULT)
return
if methodResponse.type isnt 'DownloadResponse' if methodResponse.type isnt 'DownloadResponse'
cwmpResponse.methodRequest = { db.filesCollection.findOne({_id : mongodb.ObjectID(task.file)}, (err, file) ->
type : 'Download', if not file?
fileType : task.fileType, callback('File not found')
url : task.url return
} else if err?
return STATUS_STARTED callback(err)
return
return STATUS_FINISHED methodRequest = {
type : 'Download',
fileType : '1 Firmware Upgrade Image',
fileSize : file.length,
url : "http://#{config.FILES_IP}:#{config.FILES_PORT}/#{file.filename}"
}
callback(null, STATUS_STARTED, {methodRequest : methodRequest})
)
else
callback(null, STATUS_FINISHED)
exports.task = (task, methodResponse, cwmpResponse, deviceUpdates) -> exports.task = (task, methodResponse, callback) ->
return this[task.name](task, methodResponse, cwmpResponse, deviceUpdates) this[task.name](task, methodResponse, callback)
+1 -1
View File
@@ -222,7 +222,7 @@ exports.response = (id, cwmpResponse, cookies = null) ->
if cookies? and Object.keys(cookies).length > 0 if cookies? and Object.keys(cookies).length > 0
headers['Set-Cookie'] = cookiesToStr(cookies) headers['Set-Cookie'] = cookiesToStr(cookies)
if cwmpResponse is null or Object.keys(cwmpResponse).length == 0 if not cwmpResponse? or Object.keys(cwmpResponse).length == 0
#console.log '>>> EMPTY RESPONSE' #console.log '>>> EMPTY RESPONSE'
# send empty response # send empty response
headers['Content-Length'] = 0 headers['Content-Length'] = 0