From dde530901585c9f5b6dbbcd3fddf5eee1c286b2e Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Fri, 9 Jun 2023 15:11:31 -0400 Subject: [PATCH] Tmux error viewer: catch more exceptions (#117) * Tmux error viewer: new file name convention and cleanup * log in local_osm_install * show on ui * add this * not needed * just need these * unused * log custom_dep * rename * cleaner --- selfdrive/manager/custom_dep.py | 59 ++++++++++++++++---------- selfdrive/manager/local_osm_install.py | 53 ++++++++++++++--------- selfdrive/manager/manager.py | 5 +-- selfdrive/sentry.py | 21 ++++----- 4 files changed, 82 insertions(+), 56 deletions(-) diff --git a/selfdrive/manager/custom_dep.py b/selfdrive/manager/custom_dep.py index eba38a3db2..71b7be628f 100755 --- a/selfdrive/manager/custom_dep.py +++ b/selfdrive/manager/custom_dep.py @@ -5,7 +5,10 @@ import errno import shutil import tarfile import time +import traceback from common.basedir import BASEDIR +from common.text_window import TextWindow +import selfdrive.sentry as sentry from urllib.request import urlopen from glob import glob import subprocess @@ -90,26 +93,36 @@ def install_dep(spinner): if __name__ == "__main__" and (OPSPLINE_SPEC is None or OVERPY_SPEC is None): spinner = Spinner() preload_fault = False - if os.path.exists(PRELOADED_DEP_FILE): - spinner.update("Loading preloaded dependencies") - try: - with tarfile.open(PRELOADED_DEP_FILE, "r:xz") as tar: - for member in tar.getmembers(): - split_components = member.name.split('/') - if len(split_components) > 1: - member.name = '/'.join(split_components[1:]) - tar.extract(member, path=THIRD_PARTY_DIR) - print(f"SP_LOG: Preloaded dependencies extracted to {THIRD_PARTY_DIR}") - except Exception as e: - preload_fault = True - print(f"SP_LOG: An error occurred while extracting preloaded dependencies: {e}") - if not os.path.exists(PRELOADED_DEP_FILE) or preload_fault: - if os.path.exists(THIRD_PARTY_DIR_SP): - spinner.update("Loading dependencies") - command = f'rm -rf {THIRD_PARTY_DIR}; cp -rf {THIRD_PARTY_DIR_SP} {THIRD_PARTY_DIR}' - process = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True) - print(f"SP_LOG: Removed directory {THIRD_PARTY_DIR}") - print(f"SP_LOG: Copied {THIRD_PARTY_DIR_SP} to {THIRD_PARTY_DIR}") - else: - spinner.update("Waiting for internet") - install_dep(spinner) + try: + if os.path.exists(PRELOADED_DEP_FILE): + spinner.update("Loading preloaded dependencies") + try: + with tarfile.open(PRELOADED_DEP_FILE, "r:xz") as tar: + for member in tar.getmembers(): + split_components = member.name.split('/') + if len(split_components) > 1: + member.name = '/'.join(split_components[1:]) + tar.extract(member, path=THIRD_PARTY_DIR) + print(f"SP_LOG: Preloaded dependencies extracted to {THIRD_PARTY_DIR}") + except Exception as e: + preload_fault = True + print(f"SP_LOG: An error occurred while extracting preloaded dependencies: {e}") + if not os.path.exists(PRELOADED_DEP_FILE) or preload_fault: + if os.path.exists(THIRD_PARTY_DIR_SP): + spinner.update("Loading dependencies") + command = f'rm -rf {THIRD_PARTY_DIR}; cp -rf {THIRD_PARTY_DIR_SP} {THIRD_PARTY_DIR}' + process = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True) + print(f"SP_LOG: Removed directory {THIRD_PARTY_DIR}") + print(f"SP_LOG: Copied {THIRD_PARTY_DIR_SP} to {THIRD_PARTY_DIR}") + else: + spinner.update("Waiting for internet") + install_dep(spinner) + except Exception: + sentry.init(sentry.SentryProject.SELFDRIVE) + traceback.print_exc() + sentry.capture_exception() + + error = traceback.format_exc(-3) + error = "Dependency Manager failed to start\n\n" + error + with TextWindow(error) as t: + t.wait_for_exit() diff --git a/selfdrive/manager/local_osm_install.py b/selfdrive/manager/local_osm_install.py index 2fff925fd1..b0bb60a1ee 100755 --- a/selfdrive/manager/local_osm_install.py +++ b/selfdrive/manager/local_osm_install.py @@ -2,13 +2,16 @@ import os import subprocess import sys +import time +import traceback # NOTE: Do NOT import anything here that needs be built (e.g. params) from common.basedir import BASEDIR from common.params import Params from common.spinner import Spinner +from common.text_window import TextWindow +import selfdrive.sentry as sentry from selfdrive.manager.custom_dep import wait_for_internet_connection -import time def install_local_osm(_spinner): @@ -36,24 +39,34 @@ def _install(_spinner, script, title): if __name__ == "__main__": - from selfdrive.mapd.lib.helpers import is_local_osm_installed, timestamp_local_osm_db, is_osm_db_up_to_date, OSM_LOCAL_PATH - sys.path.append(os.path.join(BASEDIR, "third_party/mapd")) - params = Params() - update_osm_db_check = params.get_bool("OsmDbUpdatesCheck") - if not (os.path.exists(f"{OSM_LOCAL_PATH}/db") or - os.path.exists(f"{OSM_LOCAL_PATH}/v0.7.57")) or update_osm_db_check: - spinner = Spinner() - spinner.update("Waiting for internet connection...") - if wait_for_internet_connection(return_on_failure=True): - is_osm_installed = is_local_osm_installed(params) - is_db_updated = is_osm_db_up_to_date() - print(f'Local OSM Installer:\nOSM currently installed: {is_osm_installed}\nDB up to date: {is_db_updated}') + try: + from selfdrive.mapd.lib.helpers import is_local_osm_installed, timestamp_local_osm_db, is_osm_db_up_to_date, OSM_LOCAL_PATH + sys.path.append(os.path.join(BASEDIR, "third_party/mapd")) + params = Params() + update_osm_db_check = params.get_bool("OsmDbUpdatesCheck") + if not (os.path.exists(f"{OSM_LOCAL_PATH}/db") or + os.path.exists(f"{OSM_LOCAL_PATH}/v0.7.57")) or update_osm_db_check: + spinner = Spinner() + spinner.update("Waiting for internet connection...") + if wait_for_internet_connection(return_on_failure=True): + is_osm_installed = is_local_osm_installed(params) + is_db_updated = is_osm_db_up_to_date() + print(f'Local OSM Installer:\nOSM currently installed: {is_osm_installed}\nDB up to date: {is_db_updated}') - if not is_osm_installed: - install_local_osm(spinner) - if not is_db_updated: - install_osm_db(spinner) - timestamp_local_osm_db() - spinner.close() + if not is_osm_installed: + install_local_osm(spinner) + if not is_db_updated: + install_osm_db(spinner) + timestamp_local_osm_db() + spinner.close() - params.put_bool("OsmDbUpdatesCheck", False) + params.put_bool("OsmDbUpdatesCheck", False) + except Exception: + sentry.init(sentry.SentryProject.SELFDRIVE) + traceback.print_exc() + sentry.capture_exception() + + error = traceback.format_exc(-3) + error = "OSM Offline Database Manager failed to start\n\n" + error + with TextWindow(error) as t: + t.wait_for_exit() diff --git a/selfdrive/manager/manager.py b/selfdrive/manager/manager.py index 924c2b2064..7ec550dbea 100755 --- a/selfdrive/manager/manager.py +++ b/selfdrive/manager/manager.py @@ -17,7 +17,6 @@ from system.hardware import HARDWARE, PC from selfdrive.manager.helpers import unblock_stdout, write_onroad_params from selfdrive.manager.process import ensure_running from selfdrive.manager.process_config import managed_processes -from selfdrive.sentry import CRASHES_DIR from selfdrive.athena.registration import register, UNREGISTERED_DONGLE_ID from system.swaglog import cloudlog, add_file_handler from system.version import is_dirty, get_commit, get_version, get_origin, get_short_branch, \ @@ -164,8 +163,8 @@ def manager_init() -> None: dirty=is_dirty(), device=HARDWARE.get_device_type()) - if os.path.isfile(f'{CRASHES_DIR}/error.txt'): - os.remove(f'{CRASHES_DIR}/error.txt') + if os.path.isfile(os.path.join(sentry.CRASHES_DIR, 'error.txt')): + os.remove(os.path.join(sentry.CRASHES_DIR, 'error.txt')) def manager_prepare() -> None: diff --git a/selfdrive/sentry.py b/selfdrive/sentry.py index 3c8865badc..48dd5d5f0d 100644 --- a/selfdrive/sentry.py +++ b/selfdrive/sentry.py @@ -23,7 +23,7 @@ class SentryProject(Enum): SELFDRIVE_NATIVE = "https://7e3be9bfcfe04c9abe58bd25fe290d1a@o1138119.ingest.sentry.io/6191481" -CRASHES_DIR = os.path.join('/data/community/crashes') +CRASHES_DIR = '/data/community/crashes/' ret = car.CarParams.new_message() candidate = ret.carFingerprint params = Params() @@ -73,15 +73,16 @@ def save_exception(exc_text): if not os.path.exists(CRASHES_DIR): os.makedirs(CRASHES_DIR) - log_file = '{}/{}'.format(CRASHES_DIR, datetime.now().strftime('%m-%d-%Y--%I:%M.%S-%p.log')) - log_file_2 = f'{CRASHES_DIR}/error.txt' - with open(log_file, 'w') as f: - f.write(exc_text) - f.close() - with open(log_file_2, 'w') as f2: - f2.write(exc_text) - f2.close() - print('Logged current crash to {}'.format(log_file)) + files = [ + os.path.join(CRASHES_DIR, datetime.now().strftime('%Y-%m-%d--%H-%M-%S.log')), + os.path.join(CRASHES_DIR, 'error.txt') + ] + + for file in files: + with open(file, 'w') as f: + f.write(exc_text) + + print('Logged current crash to {}'.format(files)) def bind_user(**kwargs) -> None: