memberPlumbing/events.py

85 lines
2.4 KiB
Python
Executable File

#!/usr/bin/env python3
import os
import re
import requests
from lxml import etree
from common import doors
from lib.hid.DoorController import E, E_plain
def getStrings(door):
"""Parses out the message strings from source."""
r = requests.get(
"https://" + door.ip + "/html/en_EN/en_EN.js",
auth=requests.auth.HTTPDigestAuth(door.username, door.password),
verify=False,
)
regex = re.compile(r'([0-9]+)="([^"]*)')
strings = [
regex.search(s)
for s in r.text.split(";")
if s.startswith("localeStrings.eventDetails")
]
print({int(g.group(1)): g.group(2) for g in strings})
def getMessages(door):
# get parameters for messages to get?
# honestly not really sure why this is required, their API is confusing
parXMLIn = E_plain.VertXMessage(E.EventMessages({"action": "LR"}))
parXMLOut = door.doXMLRequest(parXMLIn)
etree.dump(parXMLOut)
if os.path.exists("logs/" + door.name + ".xml"):
# read last log
tree = etree.ElementTree(file="logs/" + door.name + ".xml")
root = tree.getroot()
recordCount = int(parXMLOut[0].attrib["historyRecordMarker"]) - int(
root[0][0].attrib["recordMarker"]
)
else:
# first run for this door
root = None
recordCount = 1000
if recordCount == 0:
print("No records to get!")
return
print("Getting", recordCount, "records")
# get the actual messages
eventsXMLIn = E_plain.VertXMessage(
E.EventMessages(
{
"action": "LR",
"recordCount": str(recordCount),
"historyRecordMarker": parXMLOut[0].attrib["historyRecordMarker"],
"historyTimestamp": parXMLOut[0].attrib["historyTimestamp"],
}
)
)
eventsXMLOut = door.doXMLRequest(eventsXMLIn)
# TODO: handle modeRecords=true
for index, event in enumerate(eventsXMLOut[0]):
event.attrib["recordMarker"] = str(
int(parXMLOut[0].attrib["historyRecordMarker"]) - index
)
if root is None:
tree = etree.ElementTree(eventsXMLOut)
else:
for event in reversed(eventsXMLOut[0]):
root[0].insert(0, event)
tree.write("logs/" + door.name + ".xml")
def main():
for door in doors.values():
getMessages(door)
if __name__ == "__main__":
main()