Skip to content

Commit

Permalink
fix: Handle additional content in iw command output
Browse files Browse the repository at this point in the history
  • Loading branch information
Hypfer committed Jan 6, 2023
1 parent 9932b03 commit e5a2791
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 10 deletions.
Expand Up @@ -69,17 +69,43 @@ class LinuxWifiConfigurationCapability extends WifiConfigurationCapability {
details: {}
};

// eslint-disable-next-line regexp/no-super-linear-backtracking,regexp/optimal-quantifier-concatenation
const WIFI_CONNECTED_IW_REGEX = /^Connected to (?<bssid>[\da-f]{2}:[\da-f]{2}:[\da-f]{2}:[\da-f]{2}:[\da-f]{2}:[\da-f]{2}).*(?:[\n\r\u2028\u2029]\s*)?SSID: (?<ssid>.*)\s*freq: (?<freq>\d*)\s*signal: (?<signal>-\d{1,3}) dBm\s*tx bitrate: (?<txbitrate>[\d.]*).*/;
const WIFI_NOT_CONNECTED_IW_REGEX = /^Not connected\.$/;

const extractedWifiData = stdout.match(WIFI_CONNECTED_IW_REGEX);
if (extractedWifiData) {
const connectedMatch = stdout.match(WIFI_CONNECTED_IW_REGEX);
if (connectedMatch) {
output.state = ValetudoWifiStatus.STATE.CONNECTED;
output.details.upspeed = parseFloat(extractedWifiData.groups.txbitrate);
output.details.signal = parseInt(extractedWifiData.groups.signal);
output.details.ssid = extractedWifiData.groups.ssid.trim();
output.details.bssid = extractedWifiData.groups.bssid.trim();
output.details.bssid = connectedMatch.groups.bssid.trim();

stdout.split("\n").splice(1).forEach(line => {
const lineMatch = line.match(WIFI_CONNECTED_TUPLE_REGEX);

if (lineMatch) {
switch (lineMatch.groups.key.trim()) {
case "SSID":
output.details.ssid = lineMatch.groups.value.trim();

break;
case "tx bitrate": {
const numberMatch = lineMatch.groups.value.match(NUMBER_REGEX);

if (numberMatch) {
output.details.upspeed = parseFloat(numberMatch.groups.number);
}

break;
}
case "signal": {
const numberMatch = lineMatch.groups.value.match(NUMBER_REGEX);

if (numberMatch) {
output.details.signal = parseFloat(numberMatch.groups.number);
}

break;
}

}
}
});

output.details.frequency = ValetudoWifiStatus.FREQUENCY_TYPE.W2_4Ghz;
} else if (stdout.trim().match(WIFI_NOT_CONNECTED_IW_REGEX)) {
output.state = ValetudoWifiStatus.STATE.NOT_CONNECTED;
Expand All @@ -89,4 +115,9 @@ class LinuxWifiConfigurationCapability extends WifiConfigurationCapability {
}
}

const WIFI_CONNECTED_IW_REGEX = /^Connected to (?<bssid>[\da-f]{2}:[\da-f]{2}:[\da-f]{2}:[\da-f]{2}:[\da-f]{2}:[\da-f]{2})/;
const WIFI_CONNECTED_TUPLE_REGEX = /^(?<key>[a-zA-Z\s]+): (?<value>[a-zA-Z0-9\-\s./()]+)$/;
const WIFI_NOT_CONNECTED_IW_REGEX = /^Not connected\.$/;
const NUMBER_REGEX = /(?<number>[-0-9.]+)/;

module.exports = LinuxWifiConfigurationCapability;
Expand Up @@ -21,6 +21,15 @@ describe("LinuxWifiConfigurationCapability", function () {
actual.should.deepEqual(expected);
});

it("Should parse iw connected with counters correctly", async function() {
let data = fs.readFileSync(path.join(__dirname, "/res/iw_3.4_connected_with_counters.txt")).toString();
let expected = JSON.parse(fs.readFileSync(path.join(__dirname, "/res/iw_3.4_connected_with_counters.json")).toString());

let actual = capability.parseIwStdout(data);

actual.should.deepEqual(expected);
});

it("Should parse iw not connected output correctly", async function() {
let data = fs.readFileSync(path.join(__dirname, "/res/iw_3.4_not_connected.txt")).toString();
let expected = JSON.parse(fs.readFileSync(path.join(__dirname, "/res/iw_3.4_not_connected.json")).toString());
Expand Down
@@ -0,0 +1,12 @@
{
"__class": "ValetudoWifiStatus",
"metaData": {},
"state": "connected",
"details": {
"bssid": "18:64:72:d6:dd:23",
"ssid": "Das IotT",
"signal": -56,
"upspeed": 65,
"frequency": "2.4ghz"
}
}
@@ -0,0 +1,7 @@
Connected to 18:64:72:d6:dd:23 (on wlan0)
SSID: Das IotT
freq: 2452
RX: 0 bytes (0 packets)
TX: 1402391 bytes (2034 packets)
signal: -56 dBm
tx bitrate: 65.0 MBit/s MCS 7

0 comments on commit e5a2791

Please sign in to comment.