From 7d7c0ff35fe91c480711f6213e9869000a3fe148 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 12 Jan 2022 21:37:43 -0800 Subject: [PATCH] tools: add bootlog helpers (#23504) * tools: add bootlog helpers * this is nice * types --- tools/lib/bootlog.py | 48 ++++++++++++++++++++++++++++++++++++++++++++ tools/lib/helpers.py | 20 ++++++++++++++++++ tools/lib/route.py | 10 +++------ 3 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 tools/lib/bootlog.py create mode 100644 tools/lib/helpers.py diff --git a/tools/lib/bootlog.py b/tools/lib/bootlog.py new file mode 100644 index 000000000..dc1cf35c5 --- /dev/null +++ b/tools/lib/bootlog.py @@ -0,0 +1,48 @@ +import datetime +import functools +import re + +from tools.lib.auth_config import get_token +from tools.lib.api import CommaApi +from tools.lib.helpers import RE, timestamp_to_datetime + + +@functools.total_ordering +class Bootlog: + def __init__(self, url: str): + self._url = url + + r = re.search(RE.BOOTLOG_NAME, url) + if not r: + raise Exception(f"Unable to parse: {url}") + + self._dongle_id = r.group('dongle_id') + self._timestamp = r.group('timestamp') + + @property + def url(self) -> str: + return self._url + + @property + def dongle_id(self) -> str: + return self._dongle_id + + @property + def timestamp(self) -> str: + return self._timestamp + + @property + def datetime(self) -> datetime.datetime: + return timestamp_to_datetime(self._timestamp) + + def __eq__(self, b) -> bool: + return self.datetime == b.datetime + + def __lt__(self, b) -> bool: + return self.datetime < b.datetime + + +def get_bootlogs(dongle_id: str): + api = CommaApi(get_token()) + r = api.get(f'v1/devices/{dongle_id}/bootlogs') + return [Bootlog(b) for b in r] diff --git a/tools/lib/helpers.py b/tools/lib/helpers.py new file mode 100644 index 000000000..efe704b9e --- /dev/null +++ b/tools/lib/helpers.py @@ -0,0 +1,20 @@ +import datetime + +TIME_FMT = "%Y-%m-%d--%H-%M-%S" + +# regex patterns +class RE: + DONGLE_ID = r'(?P[a-z0-9]{16})' + TIMESTAMP = r'(?P[0-9]{4}-[0-9]{2}-[0-9]{2}--[0-9]{2}-[0-9]{2}-[0-9]{2})' + ROUTE_NAME = r'{}[|_/]{}'.format(DONGLE_ID, TIMESTAMP) + SEGMENT_NAME = r'{}(?:--|/)(?P[0-9]+)'.format(ROUTE_NAME) + BOOTLOG_NAME = ROUTE_NAME + + EXPLORER_FILE = r'^(?P{})--(?P[a-z]+\.[a-z0-9]+)$'.format(SEGMENT_NAME) + OP_SEGMENT_DIR = r'^(?P{})$'.format(SEGMENT_NAME) + +def timestamp_to_datetime(t: str) -> datetime.datetime: + """ + Convert an openpilot route timestamp to a python datetime + """ + return datetime.datetime.strptime(t, TIME_FMT) diff --git a/tools/lib/route.py b/tools/lib/route.py index c87bd04b9..8092096a0 100644 --- a/tools/lib/route.py +++ b/tools/lib/route.py @@ -6,11 +6,7 @@ from itertools import chain from tools.lib.auth_config import get_token from tools.lib.api import CommaApi - -ROUTE_NAME_RE = r'(?P[a-z0-9]{16})[|_/](?P[0-9]{4}-[0-9]{2}-[0-9]{2}--[0-9]{2}-[0-9]{2}-[0-9]{2})' -SEGMENT_NAME_RE = r'{}(?:--|/)(?P[0-9]+)'.format(ROUTE_NAME_RE) -EXPLORER_FILE_RE = r'^(?P{})--(?P[a-z]+\.[a-z0-9]+)$'.format(SEGMENT_NAME_RE) -OP_SEGMENT_DIR_RE = r'^(?P{})$'.format(SEGMENT_NAME_RE) +from tools.lib.helpers import RE QLOG_FILENAMES = ['qlog.bz2'] QCAMERA_FILENAMES = ['qcamera.ts'] @@ -100,8 +96,8 @@ class Route: for f in files: fullpath = os.path.join(data_dir, f) - explorer_match = re.match(EXPLORER_FILE_RE, f) - op_match = re.match(OP_SEGMENT_DIR_RE, f) + explorer_match = re.match(RE.EXPLORER_FILE, f) + op_match = re.match(RE.OP_SEGMENT_DIR, f) if explorer_match: segment_name = explorer_match.group('segment_name')