Publish the number of unique users online for each network

This commit is contained in:
polyfloyd 2020-05-07 15:29:33 +02:00
parent de3275ca28
commit bb678be805
2 changed files with 13 additions and 4 deletions

View file

@ -57,12 +57,15 @@ foreach($clientTable as $index => $value) {
if ($index2[0] == 1) { if ($index2[0] == 1) {
$radio_mac = $clientTable["iso.3.6.1.4.1.14823.2.3.3.1.2.4.1.2.".$index3]; $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))); $radio_mac = str_replace(" ", ":", trim(str_replace("Hex-STRING: ", "", $radio_mac)));
$macs[] = array ( $macs[] = array (
"mac" => strtolower(str_replace(" ", ":", trim(str_replace("Hex-STRING: ", "", $value)))), "mac" => strtolower(str_replace(" ", ":", trim(str_replace("Hex-STRING: ", "", $value)))),
"ssid" => trim(str_replace("\"", "", str_replace("STRING: ", "", $ssid[$radio_mac]))), "ssid" => trim(str_replace("\"", "", str_replace("STRING: ", "", $ssid[$radio_mac]))),
// "radio" => "IAP", "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]))), "signal" => intval(trim(str_replace("INTEGER: ", "", $clientTable["iso.3.6.1.4.1.14823.2.3.3.1.2.4.1.7.".$index3]))),
); );
} }
} }

View file

@ -49,6 +49,10 @@ class Activity(object):
'parted': [ prev_activity.associations[mac] for mac in macs_parted ], '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): def hook_print(activity, prev_activity, diff):
print('') print('')
@ -64,6 +68,8 @@ def hook_mqtt(activity, prev_activity, diff):
for ssid in activity.ssids() | prev_activity.ssids(): for ssid in activity.ssids() | prev_activity.ssids():
online_count = sum(assoc['ssid'] == ssid for assoc in activity.associations.values()) 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) 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']: for assoc in diff['joined']:
signal = assoc['signal'] if 'signal' in assoc else '-' signal = assoc['signal'] if 'signal' in assoc else '-'
payload = 'join %s %s' % (assoc['mac'], signal) payload = 'join %s %s' % (assoc['mac'], signal)