Implemented debugging mechanism to log requests and responses when exception occurs

This commit is contained in:
Zaid Abdulla committed 2012-12-19 21:36:26 +03:00
1 parent e5d1a97375
commit aa76e027f2
4 files changed
+43 -11

No files matched your search

+38 -4
View File
@@ -9,6 +9,7 @@ Memcached = require 'memcached'
memcached = new Memcached(config.MEMCACHED_SOCKET) memcached = new Memcached(config.MEMCACHED_SOCKET)
sanitize = require('./sanitize').sanitize sanitize = require('./sanitize').sanitize
currentClientIP = null
# Create MongoDB connections # Create MongoDB connections
dbserver = new mongo.Server(config.MONGODB_SOCKET, 0, {auto_reconnect: true}) dbserver = new mongo.Server(config.MONGODB_SOCKET, 0, {auto_reconnect: true})
@@ -27,6 +28,16 @@ db.open( (err, db) ->
) )
writeResponse = (serverResponse, res) ->
if config.DEBUG
s = "# RESPONSE #{new Date(Date.now())}\n" + JSON.stringify(res.headers) + "\n#{res.data}\n\n"
memcached.append("debug-#{currentClientIP}", s, (err, result) ->
)
serverResponse.writeHead(res.code, res.headers)
serverResponse.end(res.data)
updateDevice = (deviceId, actions, callback) -> updateDevice = (deviceId, actions, callback) ->
if not actions? if not actions?
callback() if callback? callback() if callback?
@@ -71,7 +82,8 @@ runTask = (sessionId, deviceId, task, reqParams, response) ->
if Object.keys(resParams).length > 0 if Object.keys(resParams).length > 0
memcached.set(String(task._id), task, config.CACHE_DURATION, (err, result) -> memcached.set(String(task._id), task, config.CACHE_DURATION, (err, result) ->
tr069.response(reqParams.sessionId, response, resParams, {task : String(task._id)}) res = tr069.response(reqParams.sessionId, resParams, {task : String(task._id)})
writeResponse response, res
) )
return return
@@ -80,7 +92,6 @@ runTask = (sessionId, deviceId, task, reqParams, response) ->
tasksCollection.remove({'_id' : mongo.ObjectID(task._id)}, {safe: true}, (err, removed) -> tasksCollection.remove({'_id' : mongo.ObjectID(task._id)}, {safe: true}, (err, removed) ->
util.log("#{deviceId}: completed task #{task.name}(#{task._id})") util.log("#{deviceId}: completed task #{task.name}(#{task._id})")
cookies = {task : null} cookies = {task : null}
tr069.response(sessionId, response, resParams, cookies)
nextTask(sessionId, deviceId, response, cookies) nextTask(sessionId, deviceId, response, cookies)
) )
@@ -91,7 +102,8 @@ nextTask = (sessionId, deviceId, response, cookies) ->
reqParams = {} reqParams = {}
resParams = {} resParams = {}
if not task if not task
tr069.response(sessionId, response, resParams, cookies) res = tr069.response(sessionId, resParams, cookies)
writeResponse response, res
return return
util.log("#{deviceId}: started task #{task.name}(#{task._id})") util.log("#{deviceId}: started task #{task.name}(#{task._id})")
@@ -117,6 +129,18 @@ if cluster.isMaster
for i in [1 .. numCPUs] for i in [1 .. numCPUs]
cluster.fork() cluster.fork()
else else
if config.DEBUG
process.on('uncaughtException', (err) ->
# dump request/response logs and stack trace
util.log("Unexpected error occured. Writing log to debug/#{currentClientIP}.log.")
memcached.get("debug-#{currentClientIP}", (er, l) ->
fs = require 'fs'
fs.writeFile("debug/#{currentClientIP}.log", l + "\n\n" + err.stack, (err) ->
process.exit(1)
)
)
)
server = http.createServer (request, response) -> server = http.createServer (request, response) ->
if request.method != 'POST' if request.method != 'POST'
#console.log '>>> 405 Method Not Allowed' #console.log '>>> 405 Method Not Allowed'
@@ -145,6 +169,15 @@ else
return body.toString(encoding || 'utf8', 0, body.byteLength) return body.toString(encoding || 'utf8', 0, body.byteLength)
request.addListener 'end', () -> request.addListener 'end', () ->
currentClientIP = request.connection.remoteAddress
if config.DEBUG
s = "# REQUEST #{new Date(Date.now())}\n" + JSON.stringify(request.headers) + "\n#{request.getBody()}\n\n"
memcached.append("debug-#{currentClientIP}", s, (err, result) ->
if err == 'Item is not stored'
memcached.set("debug-#{currentClientIP}", s, 10, (err, result) ->
)
)
resParams = {} resParams = {}
reqParams = tr069.request(request.headers, request.getBody()) reqParams = tr069.request(request.headers, request.getBody())
@@ -162,7 +195,8 @@ else
) )
updateDevice(deviceId, {'inform' : true, 'parameterValues' : reqParams.informParameterValues}, (err) -> updateDevice(deviceId, {'inform' : true, 'parameterValues' : reqParams.informParameterValues}, (err) ->
tr069.response(reqParams.sessionId, response, resParams, cookies) res = tr069.response(reqParams.sessionId, resParams, cookies)
writeResponse response, res
) )
) )
return return
+2 -1
View File
@@ -3,7 +3,8 @@ exports.ACS_PORT = 7547 # same as AP Manager's port
exports.ACS_INTERFACE = '0.0.0.0' exports.ACS_INTERFACE = '0.0.0.0'
exports.API_PORT = 7557 exports.API_PORT = 7557
exports.API_INTERFACE = '0.0.0.0' exports.API_INTERFACE = '0.0.0.0'
exports.CACHE_DURATION = 60000 exports.CACHE_DURATION = 60 # in seconds
exports.MONGODB_SOCKET = '/tmp/mongodb-27017.sock' exports.MONGODB_SOCKET = '/tmp/mongodb-27017.sock'
exports.MEMCACHED_SOCKET = '/tmp/memcached.sock' exports.MEMCACHED_SOCKET = '/tmp/memcached.sock'
exports.WORKER_RESPAWN_TIME = 3000 exports.WORKER_RESPAWN_TIME = 3000
exports.DEBUG = false
View File
Whitespace-only changes.
+3 -6
View File
@@ -140,7 +140,7 @@ exports.request = (headers, data) ->
return req return req
exports.response = (sessionId, response, params, cookies = null) -> exports.response = (sessionId, params, cookies = null) ->
headers = { headers = {
'Content-Type' : 'text/xml; charset="utf-8"', 'Content-Type' : 'text/xml; charset="utf-8"',
'Server' : SERVER_NAME, 'Server' : SERVER_NAME,
@@ -154,9 +154,7 @@ exports.response = (sessionId, response, params, cookies = null) ->
#console.log '>>> EMPTY RESPONSE' #console.log '>>> EMPTY RESPONSE'
# send empty response # send empty response
headers['Content-Length'] = 0 headers['Content-Length'] = 0
response.writeHead 204, headers return {code: 204, headers: headers, data: null}
response.end()
return
xml = libxmljs.Document() xml = libxmljs.Document()
env = xml.node('soap-env:Envelope') env = xml.node('soap-env:Envelope')
@@ -201,5 +199,4 @@ exports.response = (sessionId, response, params, cookies = null) ->
#console.dir headers #console.dir headers
#console.log data #console.log data
response.writeHead 200, headers return {code: 200, headers: headers, data: data}
response.end(data)