]>
code.delx.au - monosys/blob - wifi-scan
3 const {exec
} = require('child_process');
5 function execAsync(command
, opts
) {
6 return new Promise((resolve
, reject
) => {
7 exec(command
, opts
, (error
, stdout
, stderr
) => {
11 resolve({stdout
, stderr
});
18 return new Promise((resolve
) => setTimeout(resolve
, n
));
21 async
function findInterface() {
22 const {stdout
} = await
execAsync('iw dev');
23 const lines
= stdout
.split('\n')
24 .map((line
) => line
.trim())
25 .filter((line
) => line
.startsWith('Interface '))
26 .map((line
) => line
.split(' ')[1]);
30 async
function scanInterface(interface) {
31 const {stdout
} = await
execAsync(`sudo iw dev ${interface} scan`);
36 for (let line
of stdout
.split('\n')) {
37 if (line
.startsWith('BSS ')) {
40 partial
.bssid
= line
.match(/[a-z0-9:]+/)[0];
44 if (line
.startsWith('SSID: ')) {
45 partial
.ssid
= line
.split(':')[1].trim();
47 if (line
.startsWith('signal: ')) {
48 partial
.signal
= line
.split(':')[1].trim();
50 if (line
.startsWith('DS Parameter set: channel')) {
51 partial
.channel
= line
.split(':')[1].trim();
55 function finishPartial() {
60 partial
.ssid
= partial
.ssid
|| '';
61 partial
.channel
= partial
.channel
|| '';
64 parseFloat(partial
.signal
),
65 parseInt(partial
.channel
.split(' ')[1])
68 results
.push([sortKey
, partial
]);
73 .map(([_
, {bssid
, ssid
, signal
, channel
}]) => {
74 ssid
= ssid
.padStart(40, ' ');
75 channel
= channel
.padEnd(10, ' ');
76 return `${signal} ${channel} ${ssid} ${bssid}`;
81 async
function main() {
82 const interface = await
findInterface();
85 const scanResult
= await
scanInterface(interface).catch((err
) => err
.toString());
86 process
.stdout
.write('\033[2J\033[0f');
87 process
.stdout
.write(scanResult
);
92 main().catch((err
) => {
93 console
.log('Unhandled error!', err
);