network
Version:
Cross platform network utilities for Node.js (gateway_ip, MAC address, etc)
114 lines (92 loc) • 2.93 kB
JavaScript
var os = require('os'),
exec = require('child_process').exec,
async = require('async');
function trim_exec(cmd, cb) {
exec(cmd, function(err, out) {
if (out && out.toString() != '')
cb(null, out.toString().trim())
else
cb(err)
})
}
function ensure_valid_nic(str) {
if (str.match(/[^\w]/))
throw new Error("Invalid nic name given: " + str);
}
// If no wifi, then there is no error but cbed get's a null in second param.
exports.get_active_network_interface_name = function(cb) {
var cmd = "netstat -rn | grep UG | awk '{print $NF}'";
exec(cmd, function(err, stdout, stderr) {
if (err) return cb(err);
if (stderr.toString().match('not found')) {
return cb(new Error('Command failed: ' + stderr.toString().trim()))
}
var raw = stdout.toString().trim().split('\n');
if (raw.length === 0 || raw === [''])
return cb(new Error('No active network interface found.'));
cb(null, raw[0]);
});
};
exports.interface_type_for = function(nic_name, cb) {
ensure_valid_nic(nic_name);
exec('cat /proc/net/wireless | grep ' + nic_name, function(err, out) {
return cb(null, err ? 'Wired' : 'Wireless')
})
};
exports.mac_address_for = function(nic_name, cb) {
ensure_valid_nic(nic_name);
var cmd = 'cat /sys/class/net/' + nic_name + '/address';
trim_exec(cmd, cb);
};
exports.gateway_ip_for = function(nic_name, cb) {
ensure_valid_nic(nic_name);
trim_exec("ip r | grep " + nic_name + " | grep default | cut -d ' ' -f 3 | head -n1", cb);
};
exports.netmask_for = function(nic_name, cb) {
ensure_valid_nic(nic_name);
var cmd = "ifconfig " + nic_name + " 2> /dev/null | egrep 'netmask|Mask:' | awk '{print $4}' | sed 's/Mask://'";
trim_exec(cmd, cb);
};
exports.get_network_interfaces_list = function(cb) {
var count = 0,
list = [],
nics = os.networkInterfaces();
function append_data(obj) {
async.parallel([
function(cb) {
exports.mac_address_for(obj.name, cb)
},
function(cb) {
exports.gateway_ip_for(obj.name, cb)
},
function(cb) {
exports.netmask_for(obj.name, cb)
},
function(cb) {
exports.interface_type_for(obj.name, cb)
}
], function(err, results) {
if (results[0]) obj.mac_address = results[0];
if (results[1]) obj.gateway_ip = results[1];
if (results[2]) obj.netmask = results[2];
if (results[3]) obj.type = results[3];
list.push(obj);
--count || cb(null, list);
})
}
for (var key in nics) {
if (key != 'lo0' && key != 'lo' && !key.match(/^tun/)) {
count++;
var obj = { name: key };
nics[key].forEach(function(type) {
if (type.family == 'IPv4') {
obj.ip_address = type.address;
}
});
append_data(obj);
}
}
if (count == 0)
cb(new Error('No interfaces found.'))
}
;