From 6ce58993a2df434461136f4a65c8418f0e755f6d Mon Sep 17 00:00:00 2001 From: Christian Kuster Date: Fri, 9 Dec 2016 16:55:17 +0100 Subject: [PATCH] Refactoring tool detection, work in progress --- index.js | 39 ++++++++++++++++++++++++++------------- lib/airport.js | 2 ++ lib/iwlist.js | 3 +++ lib/netsh.js | 2 ++ package.json | 3 ++- 5 files changed, 35 insertions(+), 14 deletions(-) diff --git a/index.js b/index.js index badf58f..c2abdc7 100644 --- a/index.js +++ b/index.js @@ -5,6 +5,8 @@ const fs = require('fs'); const exec = require('child_process').exec; +const async = require('async'); +const _ = require('lodash'); // The tools const airport = require('./lib/airport'); const iwlist = require('./lib/iwlist'); @@ -14,25 +16,36 @@ var scanner; // Initializing the tools function initTools(callback) { - fs.stat(airport.tool, function (err, stats) { - if (stats) { - return callback(null, airport); - } - fs.stat(iwlist.tool, function (err, stats) { - if (stats) { - return callback(null, iwlist); + // When a command is not found, an error is issued and async would finish. Therefore we pack + // the error into the result and check it later on. + async.parallel([ + function (cb) { + exec(airport.detector, err => cb(null, {err: err, scanner: airport})); + }, + function (cb) { + exec(iwlist.detector, err => cb(null, {err: err, scanner: iwlist})); + }, + function (cb) { + exec(netsh.detector, err => cb(null, {err: err, scanner: netsh})); } - fs.stat(netsh.tool, function (err, stats) { - if (stats) { - return callback(null, netsh); - } - callback(new Error('No scanner found')); + ], + function (err, results) { + let res = _.find(results, f => { + return !f.err }); + + if (res) { + return callback(null, res.scanner); + } + callback(new Error('No scanner found')); }); - }); } +/** + * Scan the networks with the scanner detected before + * @param callback + */ function scanNetworks(callback) { exec(scanner.cmdLine, function (err, stdout) { if (err) { diff --git a/lib/airport.js b/lib/airport.js index da25aef..86a37c4 100644 --- a/lib/airport.js +++ b/lib/airport.js @@ -5,6 +5,7 @@ const tool = '/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport'; const cmdLine = tool + ' -s'; +const detector = tool + ' -getInfo'; const macRegex = /([0-9a-zA-Z]{1}[0-9a-zA-Z]{1}[:]{1}){5}[0-9a-zA-Z]{1}[0-9a-zA-Z]{1}/; /** @@ -45,5 +46,6 @@ function parseOutput(str, callback) { module.exports = { parseOutput: parseOutput, cmdLine : cmdLine, + detector : detector, tool : tool }; diff --git a/lib/iwlist.js b/lib/iwlist.js index 801e17b..a8dd1ab 100644 --- a/lib/iwlist.js +++ b/lib/iwlist.js @@ -8,6 +8,8 @@ const _ = require('lodash'); // when the default location, /usr/bin/ is not in the PATH!). GitHub issue #1 const tool = 'iwlist'; const cmdLine = tool + ' scan'; +const detector = tool + ' --help'; + const macRegex = /([0-9a-zA-Z]{1}[0-9a-zA-Z]{1}[:]{1}){5}[0-9a-zA-Z]{1}[0-9a-zA-Z]{1}/; const cellRegex = /Cell [0-9]{2,} - Address:/; @@ -81,5 +83,6 @@ function parseOutput(str, callback) { module.exports = { parseOutput: parseOutput, cmdLine : cmdLine, + detector : detector, tool : tool }; diff --git a/lib/netsh.js b/lib/netsh.js index 06e8a35..da4dbcf 100644 --- a/lib/netsh.js +++ b/lib/netsh.js @@ -6,6 +6,7 @@ const systemRoot = process.env.SystemRoot || 'C:\\Windows'; const tool = systemRoot + '\\System32\\netsh.exe'; const cmdLine = tool + ' wlan show networks mode=Bssid'; +const detector = tool + ' -h'; /** * Parsing netnsh output. Unfortunately netsh supplies the network information @@ -90,5 +91,6 @@ function parseOutput(str, callback) { module.exports = { parseOutput: parseOutput, cmdLine : cmdLine, + detector : detector, tool : tool }; diff --git a/package.json b/package.json index c6b627b..69481f4 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,8 @@ "test": "mocha test" }, "dependencies": { - "lodash": "4.8.1" + "async": "2.1.4", + "lodash": "4.17.2" }, "devDependencies": { "grunt": "0.4.5",