From bb38c18fb326e8ba49e411893558ba223d67c675 Mon Sep 17 00:00:00 2001 From: Omar M Date: Sun, 6 Oct 2013 16:50:22 +0300 Subject: [PATCH] added custom-commands for greenpacket --- config/custom_commands-sample.json | 3 +- .../greenpacket_frequencies.js | 157 ++++++++++++++++++ 2 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 config/custom_commands/greenpacket_frequencies.js diff --git a/config/custom_commands-sample.json b/config/custom_commands-sample.json index b9200a0..b83be0e 100644 --- a/config/custom_commands-sample.json +++ b/config/custom_commands-sample.json @@ -1,3 +1,4 @@ { - "seowon_frequencies" : "/^[0-9]+\\-SWU\\%2D9200\\-[0-9A-Z]+$/" + "seowon_frequencies" : "/^[0-9]+\\-SWU\\%2D9200\\-[0-9A-Z]+$/", + "greenpacket_frequencies" : "/^[0-9A-Z]+\\-DX350\\-[0-9A-Z]+$/" } diff --git a/config/custom_commands/greenpacket_frequencies.js b/config/custom_commands/greenpacket_frequencies.js new file mode 100644 index 0000000..0b46474 --- /dev/null +++ b/config/custom_commands/greenpacket_frequencies.js @@ -0,0 +1,157 @@ +var net = require('net'); +var PORT = 23; +var USERNAME = 'mt7109'; +var PASSWORD = 'wimax'; +var TIMEOUT = 5000; + +var FREQUENCIES_REGEX = /([0-9,]+)/ +var BANDWIDTHS_REGEX = /[0-9]+\-([0-9,]+)/ +var DEFAULT_BW_REGEX = /([0-9]+)\-[0-9,]+/ +var telnetConnect = function(host, callback) { + var client = net.connect(PORT, host, function() { + // enter username + telnetExecute(USERNAME, client, "Password: ", function(err, response) { + if (err) return callback(err); + // enter password + telnetExecute(PASSWORD, client, "\n# ", function(err, response) { + return callback(err); + }); + }); + }); + return client; +} + +var telnetExecute = function(command, connection, prompt, callback) { + var response = ''; + command += "\n"; + var listener = function(chunk) { + response += chunk.toString(); + if (response.slice(0 - prompt.length) == prompt) { + connection.removeListener('data', listener); + return callback(null, response.slice(command.length, 0 - prompt.length)); + } + }; + + var end = function() { + connection.removeListener('end', end); + return callback(null, response.slice(command.length)); + }; + + if (prompt) + connection.on('data', listener); + else + connection.on('end', end); + + if (command) + connection.write(command); +} + +var getDeviceIp = function(deviceId, callback) { + var db = require('../../db'); + var URL = require('url'); + + 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); + return callback(url.hostname); + }); +}; + +exports.init = function(deviceId, args, callback) { + return exports.get(deviceId, args, callback); +} + +exports.get = function(deviceId, args, callback) { + var currentFrequencies = []; + var currentBandwidths = []; + var defaultBandwidth = ''; + var final = []; + + getDeviceIp(deviceId, function(ip) { + var client = telnetConnect(ip, function(err) { + // get frequencies + telnetExecute("sncfg get WMX_FREQ_LIST", client, "\n# ", function(err, response) { + if (err) return callback(err); + currentFrequencies = FREQUENCIES_REGEX.exec(response)[1].split(',') + // get bandwidths + telnetExecute("sncfg get WMX_FREQ_BANDWDITH_FL", client, "\n# ", function(err, response) { + if (err) return callback(err); + currentBandwidths = BANDWIDTHS_REGEX.exec(response)[1].split(',') + defaultBandwidth = DEFAULT_BW_REGEX.exec(response)[1] + // generate freq/bw pairs string + for (var i = 0; i < currentFrequencies.length; i++) { + final.push(currentFrequencies[i] + ' ' + currentBandwidths[i]) + } + // log out + telnetExecute("exit", client, null, function(err, response) { + client.end(); + return callback(err, defaultBandwidth + '-' + final.join(',')); + }); + }); + }); + }); + + client.on("error", function(err) { + client.destroy(); + callback(err); + }); + + client.setTimeout(TIMEOUT, function() { + client.destroy(); + callback("timeout"); + }); + }); +}; + +var parsePairs = function(pairsString) { + var a = pairsString.split(','); + var f = []; + var b = []; + var l = []; + for (i in a) { + var sp = a[i].trim().split(' '); + f.push(parseInt(sp[0])); + b.push(parseFloat(sp[1])); + } + l.push(f.join(',')); + l.push(b.join(',')); + return l; +} + +exports.set = function(deviceId, args, callback) { + var tmp = args.split('-'); + var defaultBandwidth = tmp[0]; + var pairs = parsePairs(tmp[1]); + var frequenciesString = pairs[0]; + var bandwidthsString = pairs[1]; + + getDeviceIp(deviceId, function(ip) { + var client = telnetConnect(ip, function(err) { + //return callback(null, "ok"); + telnetExecute("sncfg set WMX_FREQ_BANDWDITH_FL '" + defaultBandwidth + "-" + bandwidthsString + "'", client, "\n# ", function(err, response) { + if (err) return callback(err); + telnetExecute("sncfg set WMX_FREQ_LIST '" + frequenciesString + "'", client, "\n# ", function(err, response) { + if (err) return callback(err); + telnetExecute("sncfg commit", client, "\n# ", function(err, response) { + if (err) return callback(err); + // log out + telnetExecute("exit", client, null, function(err, response) { + client.end(); + return callback(null, args); + }); + }); + }); + }); + }); + + client.on("error", function(err) { + client.destroy(); + callback(err); + }); + + client.setTimeout(TIMEOUT, function() { + client.destroy(); + callback("timeout"); + }); + }); +};