wifi-scanner
Version:
Wireless networks scanner.
101 lines (83 loc) • 3.66 kB
JavaScript
;
var program = require('commander');
var iwlist = require('wireless-tools/iwlist');
var chalk = require('chalk');
var fs = require('fs');
program.version('0.0.1').option('-i, --interface [interfaceName]', 'Capture interface. Defaults to \'wlan0\'.').option('-p, --print', '(Optional) Print results to the console.').option('-o, --output [filename]', '(Optional) Output filename.').option('-c --criteria [criteria]', '(Optional) Criteria to filter. Example: \'security\'.').option('-f, --filter [result]', '(Optional) Desired result for specified criteria. Example: \'wep\'.').option('-s, --sortCriteria [criteria]', '(Optional) Sort results according to a specified criteria.').option('-a, --ascending', '(Optional) Sort results ascendingly. (DEFAULT)').option('-d, --descending', '(Optional) Sort results descendingly.').option('-r, --retry', '(Optional) Should retry until it finds a result matching the specified filter.').option('-t, --timeout', '(Optional) Retry interval (millisseconds). Defaults to 1000.').parse(process.argv);
var filename = program.output;
var cInterface = program['interface'] || 'wlan0';
var filter = program.filter;
var criteria = program.criteria;
var shouldUseConsole = program.print || false;
var shouldRetry = program.retry || false;
var timeout = Number(program.timeout) || 1000;
var sortCriteria = program.sortCriteria;
var ascending = program.ascending || true;
var descending = program.descending || false;
function searchNetworks(callback) {
console.log(chalk.yellow('Scanning...'));
iwlist.scan(cInterface, function (err, networks) {
if (!err) console.log(chalk.green('Finished scanning nearby networks.'));
callback(err, networks);
});
}
function sortNetworks(networks) {
function compare(a, b) {
if (a[sortCriteria] < b[sortCriteria]) return -1;
if (a[sortCriteria] > b[sortCriteria]) return 1;
return 0;
}
return networks.sort(compare);
}
function filterNetworks(networks) {
var results = networks;
if (criteria && filter) {
results = results.filter(function (network) {
if (network[criteria] + '' === filter) {
return true;
}
});
}
if (sortCriteria) {
results = sortNetworks(results);
if (descending) {
results = results.reverse();
}
}
return results;
}
function search(retryCount) {
searchNetworks(function (err, networks) {
if (err) {
console.log(chalk.bgRed(err));
} else {
var filteredNetworks = filterNetworks(networks);
var resultString = JSON.stringify(filteredNetworks, null, 2);
if (filteredNetworks.length === 0) {
console.log(chalk.yellow('No networks found matching the filter: ' + criteria + ' = ' + filter));
if (shouldRetry) {
setTimeout(function () {
console.log(chalk.yellow('Retrying. (' + retryCount + ')\n'));
search(retryCount + 1);
}, timeout);
}
} else {
if (filteredNetworks.length > 0 && filename !== undefined) {
fs.writeFile(filename, resultString, function () {
console.log(chalk.green('Nearby networks saved at: ' + filename));
});
}
if (shouldUseConsole) {
console.log(chalk.cyan(resultString));
}
if (criteria !== undefined && filter !== undefined) {
console.log(chalk.bgGreen.white('Found ' + filteredNetworks.length + ' networks matching the filter: ' + criteria + ' = ' + filter));
} else {
console.log(chalk.bgGreen.white('Found ' + filteredNetworks.length + ' network(s).'));
}
}
}
});
}
search(0);