From bb678be805362aee912ed46e2f302a34e217188a Mon Sep 17 00:00:00 2001 From: polyfloyd Date: Thu, 7 May 2020 15:29:33 +0200 Subject: [PATCH] Publish the number of unique users online for each network --- access_points.d/aruba_instant.php | 11 +++++++---- wifi-mqtt.py | 6 ++++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/access_points.d/aruba_instant.php b/access_points.d/aruba_instant.php index fab398c..ae6bad4 100755 --- a/access_points.d/aruba_instant.php +++ b/access_points.d/aruba_instant.php @@ -57,12 +57,15 @@ foreach($clientTable as $index => $value) { if ($index2[0] == 1) { $radio_mac = $clientTable["iso.3.6.1.4.1.14823.2.3.3.1.2.4.1.2.".$index3]; + $username = $clientTable["iso.3.6.1.4.1.14823.2.3.3.1.2.4.1.5.".$index3]; + // Only count the username field an actual username if it contains an '@'. + $username = strpos($username, "@") !== false ? $username : ""; $radio_mac = str_replace(" ", ":", trim(str_replace("Hex-STRING: ", "", $radio_mac))); $macs[] = array ( - "mac" => strtolower(str_replace(" ", ":", trim(str_replace("Hex-STRING: ", "", $value)))), - "ssid" => trim(str_replace("\"", "", str_replace("STRING: ", "", $ssid[$radio_mac]))), -// "radio" => "IAP", - "signal" => intval(trim(str_replace("INTEGER: ", "", $clientTable["iso.3.6.1.4.1.14823.2.3.3.1.2.4.1.7.".$index3]))), + "mac" => strtolower(str_replace(" ", ":", trim(str_replace("Hex-STRING: ", "", $value)))), + "ssid" => trim(str_replace("\"", "", str_replace("STRING: ", "", $ssid[$radio_mac]))), + "username" => $username !== "" ? trim(str_replace("\"", "", str_replace("STRING: ", "", $username))) : NULL, + "signal" => intval(trim(str_replace("INTEGER: ", "", $clientTable["iso.3.6.1.4.1.14823.2.3.3.1.2.4.1.7.".$index3]))), ); } } diff --git a/wifi-mqtt.py b/wifi-mqtt.py index fd3f627..45fb1db 100755 --- a/wifi-mqtt.py +++ b/wifi-mqtt.py @@ -49,6 +49,10 @@ class Activity(object): 'parted': [ prev_activity.associations[mac] for mac in macs_parted ], } + def unique_usernames_for_ssid(self, ssid): + include = lambda assoc: assoc['ssid'] == ssid and assoc['username'] is not None + return { assoc['username'] for assoc in self.associations.values() if include(assoc) } + def hook_print(activity, prev_activity, diff): print('') @@ -64,6 +68,8 @@ def hook_mqtt(activity, prev_activity, diff): for ssid in activity.ssids() | prev_activity.ssids(): online_count = sum(assoc['ssid'] == ssid for assoc in activity.associations.values()) mqttc.publish('bitlair/wifi/%s/online' % normalize_ssid(ssid), str(online_count), retain=True) + unique_usernames = len(activity.unique_usernames_for_ssid(ssid)) + mqttc.publish('bitlair/wifi/%s/unique_usernames' % normalize_ssid(ssid), str(unique_usernames), retain=True) for assoc in diff['joined']: signal = assoc['signal'] if 'signal' in assoc else '-' payload = 'join %s %s' % (assoc['mac'], signal)