From 86ff19a6e2b14e81c62886b2b5a7243e1af706b5 Mon Sep 17 00:00:00 2001 From: Zaid Abdulla Date: Thu, 12 Sep 2013 15:15:39 +0300 Subject: [PATCH] Timeout handling for seowon_frequencies custom command. --- config/custom_commands/seowon_frequencies.js | 93 +++++++++++--------- 1 file changed, 52 insertions(+), 41 deletions(-) diff --git a/config/custom_commands/seowon_frequencies.js b/config/custom_commands/seowon_frequencies.js index 6a2d37e..3869b05 100644 --- a/config/custom_commands/seowon_frequencies.js +++ b/config/custom_commands/seowon_frequencies.js @@ -1,7 +1,6 @@ // Change frequency plans for Seowon devices. // Args format: 3532500 5000,3537500 5000,3542500 5000,3547500 5000,3552500 5000,3557500 5000,3505000 10000,3515000 10000,3525000 10000,3535000 10000,3545000 10000,3555000 10000 var net = require('net'); -//var host = '192.168.1.1'; var PORT = 23; var USERNAME = 'admin'; var PASSWORD = 'admin'; @@ -9,16 +8,23 @@ var PASSWORD = 'admin'; var FREQUENCIES_REGEX = /\s*([\d]+)\.\s*Frequency\s*:\s*([\d]+)\s\(KHz\),\s*Bandwidth\s*:\s*([\d\.]+)\s*\(MHz\)/gm var telnetConnect = function(host, callback) { - var client = net.connect(PORT, host, function() { + var client = net.connect(PORT, host, function() { // enter username - telnetExecute(USERNAME, client, "Password: ", function(response) { + telnetExecute(USERNAME, client, "Password: ", function(err, response) { + if (err) return callback(err, client); + if (!timeout) return; // enter password - telnetExecute(PASSWORD, client, "MT7109> ", function(response) { - callback(client); + telnetExecute(PASSWORD, client, "MT7109> ", function(err, response) { + if (!timeout) return; + clearTimeout(timeout); + return callback(err, client); }); }); }); - return client; + var timeout = setTimeout(function() { + timeout = null; + return callback('timeout', client); + }, 2000); } var telnetExecute = function(command, connection, prompt, callback) { @@ -27,16 +33,25 @@ var telnetExecute = function(command, connection, prompt, callback) { var listener = function(chunk) { response += chunk.toString(); if (response.slice(0 - prompt.length) == prompt) { + if (!timeout) return; + clearTimeout(timeout); connection.removeListener('data', listener); - callback(response.slice(command.length, 0 - prompt.length)); + return callback(null, response.slice(command.length, 0 - prompt.length)); } }; var end = function() { + if (!timeout) return; + clearTimeout(timeout); connection.removeListener('end', end); - callback(response.slice(command.length)); + return callback(null, response.slice(command.length)); }; + var timeout = setTimeout(function() { + timeout = null; + return callback('timeout', response); + }, 2000); + if (prompt) connection.on('data', listener); else @@ -73,35 +88,34 @@ var getDeviceIp = function(deviceId, callback) { db.devicesCollection.findOne({_id : deviceId}, {'InternetGatewayDevice.ManagementServer.ConnectionRequestURL._value' : 1}, function(err, device) { var connectionRequestUrl = device.InternetGatewayDevice.ManagementServer.ConnectionRequestURL._value; var url = URL.parse(connectionRequestUrl); - callback(url.hostname); + return callback(url.hostname); }); }; exports.init = function(deviceId, args, callback) { - exports.get(deviceId, args, callback); + return exports.get(deviceId, args, callback); }; exports.get = function(deviceId, args, callback) { var currentFrequencies = []; getDeviceIp(deviceId, function(ip) { - var client = telnetConnect(ip, function() { + telnetConnect(ip, function(err, client) { // enter privileged mode - telnetExecute("enable", client, "MT7109# ", function(response) { + telnetExecute("enable", client, "MT7109# ", function(err, response) { + if (err) return callback(err); // show frequencies - telnetExecute("show wmx freq", client, "MT7109# ", function(response) { + telnetExecute("show wmx freq", client, "MT7109# ", function(err, response) { + if (err) return callback(err); while (f = FREQUENCIES_REGEX.exec(response)) { var frequency = parseInt(f[2]); var bandwidth = Math.floor(parseFloat(f[3]) * 1000); var freqStr = String(frequency) + ' ' + String(bandwidth); currentFrequencies.push(freqStr); } - // exist privileged mode - telnetExecute("exit", client, "MT7109> ", function(response) { - // log out - telnetExecute("logout", client, null, function(response) { - callback(null, currentFrequencies.join(',')); - }); + // log out + telnetExecute("logout", client, null, function(err, response) { + return callback(err, currentFrequencies.join(',')); }); }); }); @@ -115,11 +129,13 @@ exports.set = function(deviceId, args, callback) { var delFrequencies = []; getDeviceIp(deviceId, function(ip) { - var client = telnetConnect(ip, function() { + telnetConnect(ip, function(err, client) { // enter privileged mode - telnetExecute("enable", client, "MT7109# ", function(response) { + telnetExecute("enable", client, "MT7109# ", function(err, response) { + if (err) return callback(err); // show frequencies - telnetExecute("show wmx freq", client, "MT7109# ", function(response) { + telnetExecute("show wmx freq", client, "MT7109# ", function(err, response) { + if (err) return callback(err); while (f = FREQUENCIES_REGEX.exec(response)) { var index = parseInt(f[1]); var frequency = parseInt(f[2]); @@ -135,17 +151,15 @@ exports.set = function(deviceId, args, callback) { addFrequencies.push(newFrequencies[f]); if (addFrequencies.length == 0 && delFrequencies.length == 0) { - // exit privileged mode - telnetExecute("exit", client, "MT7109> ", function(response) { - // log out - telnetExecute("logout", client, null, function(response) { - callback(null, args); - }); + // log out + telnetExecute("logout", client, null, function(err, response) { + return callback(err, args); }); return; } - telnetExecute("wimax", client, "MT7109 (WiMax)# ", function(response) { + telnetExecute("wimax", client, "MT7109 (WiMax)# ", function(err, response) { + if (err) return callback(err); var add, del; del = function() { if (delFrequencies.length == 0) { @@ -153,29 +167,26 @@ exports.set = function(deviceId, args, callback) { return; } var i = delFrequencies.pop(); - telnetExecute("wmx freq del " + i, client, "MT7109 (WiMax)# ", function(response) { + telnetExecute("wmx freq del " + i, client, "MT7109 (WiMax)# ", function(err, response) { + if (err) return callback(err); del(); }); }; add = function() { if (addFrequencies.length == 0) { // commit - telnetExecute("commit", client, "MT7109 (WiMax)# ", function(response) { - // exist wimax mode - telnetExecute("exit", client, "MT7109# ", function(response) { - // exit privileged mode - telnetExecute("exit", client, "MT7109> ", function(response) { - // log out - telnetExecute("logout", client, null, function(response) { - callback(null, args); - }); - }); + telnetExecute("commit", client, "MT7109 (WiMax)# ", function(err, response) { + if (err) return callback(err); + // log out + telnetExecute("logout", client, null, function(err, response) { + return callback(null, args); }); }); return; } var i = addFrequencies.pop(); - telnetExecute("wmx freq add " + i[0] + ' ' + i[1]/1000, client, "MT7109 (WiMax)# ", function(response) { + telnetExecute("wmx freq add " + i[0] + ' ' + i[1]/1000, client, "MT7109 (WiMax)# ", function(err, response) { + if (err) return callback(err); add(); }); };