Improved telnet timeout handling.

This commit is contained in:
Zaid Abdulla committed 2013-09-16 14:35:55 +03:00
1 parent 1586ce92aa
commit 615c8d418b
1 file changed
+31 -22
+31 -22
View File
@@ -4,6 +4,7 @@ var net = require('net');
var PORT = 23; var PORT = 23;
var USERNAME = 'admin'; var USERNAME = 'admin';
var PASSWORD = 'admin'; var PASSWORD = 'admin';
var TIMEOUT = 5000;
var FREQUENCIES_REGEX = /\s*([\d]+)\.\s*Frequency\s*:\s*([\d]+)\s\(KHz\),\s*Bandwidth\s*:\s*([\d\.]+)\s*\(MHz\)/gm var FREQUENCIES_REGEX = /\s*([\d]+)\.\s*Frequency\s*:\s*([\d]+)\s\(KHz\),\s*Bandwidth\s*:\s*([\d\.]+)\s*\(MHz\)/gm
@@ -11,47 +12,32 @@ var telnetConnect = function(host, callback) {
var client = net.connect(PORT, host, function() { var client = net.connect(PORT, host, function() {
// enter username // enter username
telnetExecute(USERNAME, client, "Password: ", function(err, response) { telnetExecute(USERNAME, client, "Password: ", function(err, response) {
if (err) return callback(err, client); if (err) return callback(err);
if (!timeout) return;
// enter password // enter password
telnetExecute(PASSWORD, client, "MT7109> ", function(err, response) { telnetExecute(PASSWORD, client, "MT7109> ", function(err, response) {
if (!timeout) return; return callback(err);
clearTimeout(timeout);
return callback(err, client);
}); });
}); });
}); });
var timeout = setTimeout(function() { return client;
timeout = null;
return callback('timeout', client);
}, 4000);
} }
var telnetExecute = function(command, connection, prompt, callback) { var telnetExecute = function(command, connection, prompt, callback) {
command += "\n";
var response = ''; var response = '';
command += "\n";
var listener = function(chunk) { var listener = function(chunk) {
response += chunk.toString(); response += chunk.toString();
if (response.slice(0 - prompt.length) == prompt) { if (response.slice(0 - prompt.length) == prompt) {
if (!timeout) return;
clearTimeout(timeout);
connection.removeListener('data', listener); connection.removeListener('data', listener);
return callback(null, response.slice(command.length, 0 - prompt.length)); return callback(null, response.slice(command.length, 0 - prompt.length));
} }
}; };
var end = function() { var end = function() {
if (!timeout) return;
clearTimeout(timeout);
connection.removeListener('end', end); connection.removeListener('end', end);
return callback(null, response.slice(command.length)); return callback(null, response.slice(command.length));
}; };
var timeout = setTimeout(function() {
timeout = null;
return callback('timeout', response);
}, 2000);
if (prompt) if (prompt)
connection.on('data', listener); connection.on('data', listener);
else else
@@ -62,7 +48,7 @@ var telnetExecute = function(command, connection, prompt, callback) {
} }
var parseFrequencies = function(frequenciesString) { var parseFrequencies = function(frequenciesString) {
var a = frequenciesString.split(',') var a = frequenciesString.split(',');
var l = []; var l = [];
for (i in a) { for (i in a) {
var sp = a[i].trim().split(' '); var sp = a[i].trim().split(' ');
@@ -100,7 +86,7 @@ exports.get = function(deviceId, args, callback) {
var currentFrequencies = []; var currentFrequencies = [];
getDeviceIp(deviceId, function(ip) { getDeviceIp(deviceId, function(ip) {
telnetConnect(ip, function(err, client) { var client = telnetConnect(ip, function(err) {
// enter privileged mode // enter privileged mode
telnetExecute("enable", client, "MT7109# ", function(err, response) { telnetExecute("enable", client, "MT7109# ", function(err, response) {
if (err) return callback(err); if (err) return callback(err);
@@ -115,11 +101,22 @@ exports.get = function(deviceId, args, callback) {
} }
// log out // log out
telnetExecute("logout", client, null, function(err, response) { telnetExecute("logout", client, null, function(err, response) {
client.end();
return callback(err, currentFrequencies.join(',')); return callback(err, currentFrequencies.join(','));
}); });
}); });
}); });
}); });
client.on("error", function(err) {
client.destroy();
callback(err);
});
client.setTimeout(TIMEOUT, function() {
client.destroy();
callback("timeout");
});
}); });
}; };
@@ -129,7 +126,7 @@ exports.set = function(deviceId, args, callback) {
var delFrequencies = []; var delFrequencies = [];
getDeviceIp(deviceId, function(ip) { getDeviceIp(deviceId, function(ip) {
telnetConnect(ip, function(err, client) { var client = telnetConnect(ip, function(err) {
// enter privileged mode // enter privileged mode
telnetExecute("enable", client, "MT7109# ", function(err, response) { telnetExecute("enable", client, "MT7109# ", function(err, response) {
if (err) return callback(err); if (err) return callback(err);
@@ -153,6 +150,7 @@ exports.set = function(deviceId, args, callback) {
if (addFrequencies.length == 0 && delFrequencies.length == 0) { if (addFrequencies.length == 0 && delFrequencies.length == 0) {
// log out // log out
telnetExecute("logout", client, null, function(err, response) { telnetExecute("logout", client, null, function(err, response) {
client.end();
return callback(err, args); return callback(err, args);
}); });
return; return;
@@ -179,6 +177,7 @@ exports.set = function(deviceId, args, callback) {
if (err) return callback(err); if (err) return callback(err);
// log out // log out
telnetExecute("logout", client, null, function(err, response) { telnetExecute("logout", client, null, function(err, response) {
client.end();
return callback(null, args); return callback(null, args);
}); });
}); });
@@ -195,5 +194,15 @@ exports.set = function(deviceId, args, callback) {
}); });
}); });
}); });
client.on("error", function(err) {
client.destroy();
callback(err);
});
client.setTimeout(TIMEOUT, function() {
client.destroy();
callback("timeout");
});
}); });
}; };