76 lines
2.2 KiB
Python
76 lines
2.2 KiB
Python
# credits: https://gist.github.com/calebmadrigal/fdb8855a6d05c87bbb0254a1424ee582
|
|
|
|
import sys
|
|
import yaml
|
|
import requests
|
|
import json
|
|
import hmac
|
|
import hashlib
|
|
|
|
IDENTITIES_PATH = "identities.yaml"
|
|
WEBHOOK_URL = "http://localhost:8080/update.php"
|
|
WEBHOOK_SECRET = "CHANGE-THIS"
|
|
|
|
def parse_wifi_map(map_path):
|
|
# read scan results
|
|
with open(map_path, 'r') as f:
|
|
wifi_map = yaml.safe_load(f)
|
|
|
|
# read known identities
|
|
with open(IDENTITIES_PATH, 'r') as f:
|
|
identities = yaml.safe_load(f)['identities']
|
|
|
|
print("Known identities:")
|
|
for identity in identities:
|
|
print('mac = {}, name = {}'.format(identity['mac'],identity['name']))
|
|
|
|
devices = set()
|
|
filtered_devices = []
|
|
|
|
# filter scan results for known identities
|
|
for ssid in wifi_map:
|
|
#print('ssid = {}'.format(ssid))
|
|
ssid_node = wifi_map[ssid]
|
|
for bssid in ssid_node:
|
|
#print('\tbssid = {}'.format(bssid))
|
|
bssid_node = ssid_node[bssid]
|
|
if 'devices' in bssid_node:
|
|
for device in bssid_node['devices']:
|
|
devices |= {device}
|
|
#print('\t\tdevice = {}'.format(device))
|
|
for identity in identities:
|
|
if identity['mac'] == device:
|
|
filtered_devices.append(identity)
|
|
|
|
#print('\n\nSSID count: {}, Device count: {}'.format(len(wifi_map), len(devices)))
|
|
print('\nFiltered devices:')
|
|
print(filtered_devices)
|
|
|
|
return filtered_devices
|
|
|
|
if __name__ == '__main__':
|
|
wifi_map_path = 'wifi_map.yaml'
|
|
if len(sys.argv) > 1:
|
|
wifi_map_path = sys.argv[1]
|
|
|
|
filtered_devices = parse_wifi_map(wifi_map_path)
|
|
|
|
# build request
|
|
json_payload = json.dumps(filtered_devices).encode("utf-8")
|
|
|
|
signature = hmac.new(
|
|
key=bytes(WEBHOOK_SECRET, "utf-8"),
|
|
msg=json_payload,
|
|
digestmod=hashlib.sha256
|
|
).hexdigest()
|
|
|
|
req_headers = {
|
|
'Content-Type': 'application/json',
|
|
'x-hmac-hash': signature
|
|
}
|
|
|
|
# send request
|
|
r = requests.post(url=WEBHOOK_URL, data=json_payload, headers=req_headers)
|
|
|
|
print("Upload response:")
|
|
print(r.status_code)
|