Timeout handling for seowon_frequencies custom command.

This commit is contained in:
Zaid Abdulla committed 2013-09-12 15:15:39 +03:00
1 parent 0a2da2fc70
commit 86ff19a6e2
1 file changed
+48 -37
+48 -37
View File
@@ -1,7 +1,6 @@
// Change frequency plans for Seowon devices. // 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 // 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 net = require('net');
//var host = '192.168.1.1';
var PORT = 23; var PORT = 23;
var USERNAME = 'admin'; var USERNAME = 'admin';
var PASSWORD = 'admin'; var PASSWORD = 'admin';
@@ -11,14 +10,21 @@ var FREQUENCIES_REGEX = /\s*([\d]+)\.\s*Frequency\s*:\s*([\d]+)\s\(KHz\),\s*Band
var telnetConnect = function(host, callback) { 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(response) { telnetExecute(USERNAME, client, "Password: ", function(err, response) {
if (err) return callback(err, client);
if (!timeout) return;
// enter password // enter password
telnetExecute(PASSWORD, client, "MT7109> ", function(response) { telnetExecute(PASSWORD, client, "MT7109> ", function(err, response) {
callback(client); 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) { var telnetExecute = function(command, connection, prompt, callback) {
@@ -27,16 +33,25 @@ var telnetExecute = function(command, connection, prompt, callback) {
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);
callback(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);
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) if (prompt)
connection.on('data', listener); connection.on('data', listener);
else else
@@ -73,35 +88,34 @@ var getDeviceIp = function(deviceId, callback) {
db.devicesCollection.findOne({_id : deviceId}, {'InternetGatewayDevice.ManagementServer.ConnectionRequestURL._value' : 1}, function(err, device) { db.devicesCollection.findOne({_id : deviceId}, {'InternetGatewayDevice.ManagementServer.ConnectionRequestURL._value' : 1}, function(err, device) {
var connectionRequestUrl = device.InternetGatewayDevice.ManagementServer.ConnectionRequestURL._value; var connectionRequestUrl = device.InternetGatewayDevice.ManagementServer.ConnectionRequestURL._value;
var url = URL.parse(connectionRequestUrl); var url = URL.parse(connectionRequestUrl);
callback(url.hostname); return callback(url.hostname);
}); });
}; };
exports.init = function(deviceId, args, callback) { exports.init = function(deviceId, args, callback) {
exports.get(deviceId, args, callback); return exports.get(deviceId, args, callback);
}; };
exports.get = function(deviceId, args, callback) { exports.get = function(deviceId, args, callback) {
var currentFrequencies = []; var currentFrequencies = [];
getDeviceIp(deviceId, function(ip) { getDeviceIp(deviceId, function(ip) {
var client = telnetConnect(ip, function() { telnetConnect(ip, function(err, client) {
// enter privileged mode // enter privileged mode
telnetExecute("enable", client, "MT7109# ", function(response) { telnetExecute("enable", client, "MT7109# ", function(err, response) {
if (err) return callback(err);
// show frequencies // 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)) { while (f = FREQUENCIES_REGEX.exec(response)) {
var frequency = parseInt(f[2]); var frequency = parseInt(f[2]);
var bandwidth = Math.floor(parseFloat(f[3]) * 1000); var bandwidth = Math.floor(parseFloat(f[3]) * 1000);
var freqStr = String(frequency) + ' ' + String(bandwidth); var freqStr = String(frequency) + ' ' + String(bandwidth);
currentFrequencies.push(freqStr); currentFrequencies.push(freqStr);
} }
// exist privileged mode
telnetExecute("exit", client, "MT7109> ", function(response) {
// log out // log out
telnetExecute("logout", client, null, function(response) { telnetExecute("logout", client, null, function(err, response) {
callback(null, currentFrequencies.join(',')); return callback(err, currentFrequencies.join(','));
});
}); });
}); });
}); });
@@ -115,11 +129,13 @@ exports.set = function(deviceId, args, callback) {
var delFrequencies = []; var delFrequencies = [];
getDeviceIp(deviceId, function(ip) { getDeviceIp(deviceId, function(ip) {
var client = telnetConnect(ip, function() { telnetConnect(ip, function(err, client) {
// enter privileged mode // enter privileged mode
telnetExecute("enable", client, "MT7109# ", function(response) { telnetExecute("enable", client, "MT7109# ", function(err, response) {
if (err) return callback(err);
// show frequencies // 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)) { while (f = FREQUENCIES_REGEX.exec(response)) {
var index = parseInt(f[1]); var index = parseInt(f[1]);
var frequency = parseInt(f[2]); var frequency = parseInt(f[2]);
@@ -135,17 +151,15 @@ exports.set = function(deviceId, args, callback) {
addFrequencies.push(newFrequencies[f]); addFrequencies.push(newFrequencies[f]);
if (addFrequencies.length == 0 && delFrequencies.length == 0) { if (addFrequencies.length == 0 && delFrequencies.length == 0) {
// exit privileged mode
telnetExecute("exit", client, "MT7109> ", function(response) {
// log out // log out
telnetExecute("logout", client, null, function(response) { telnetExecute("logout", client, null, function(err, response) {
callback(null, args); return callback(err, args);
});
}); });
return; return;
} }
telnetExecute("wimax", client, "MT7109 (WiMax)# ", function(response) { telnetExecute("wimax", client, "MT7109 (WiMax)# ", function(err, response) {
if (err) return callback(err);
var add, del; var add, del;
del = function() { del = function() {
if (delFrequencies.length == 0) { if (delFrequencies.length == 0) {
@@ -153,29 +167,26 @@ exports.set = function(deviceId, args, callback) {
return; return;
} }
var i = delFrequencies.pop(); 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(); del();
}); });
}; };
add = function() { add = function() {
if (addFrequencies.length == 0) { if (addFrequencies.length == 0) {
// commit // commit
telnetExecute("commit", client, "MT7109 (WiMax)# ", function(response) { telnetExecute("commit", client, "MT7109 (WiMax)# ", function(err, response) {
// exist wimax mode if (err) return callback(err);
telnetExecute("exit", client, "MT7109# ", function(response) {
// exit privileged mode
telnetExecute("exit", client, "MT7109> ", function(response) {
// log out // log out
telnetExecute("logout", client, null, function(response) { telnetExecute("logout", client, null, function(err, response) {
callback(null, args); return callback(null, args);
});
});
}); });
}); });
return; return;
} }
var i = addFrequencies.pop(); 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(); add();
}); });
}; };