# SPDX-FileCopyrightText: 2014-2018 Tony DiCola, Limor Fried, Brennen Bearnes # # SPDX-License-Identifier: MIT """ Attempt to detect the current platform. """ import os import re import sys try: from typing import Optional except ImportError: pass from adafruit_platformdetect.board import Board from adafruit_platformdetect.chip import Chip # Needed to find libs (like libusb) installed by homebrew on Apple Silicon if sys.platform == "darwin": os.environ["DYLD_FALLBACK_LIBRARY_PATH"] = "/opt/homebrew/lib/" # Various methods here may retain state in future, so tell pylint not to worry # that they don't use self right now: # pylint: disable=no-self-use class Detector: """Wrap various platform detection functions.""" def __init__(self) -> None: self.board = Board(self) self.chip = Chip(self) def get_cpuinfo_field(self, field: str) -> Optional[str]: """ Search /proc/cpuinfo for a field and return its value, if found, otherwise None. """ # Match a line like 'Hardware : BCM2709': pattern = r"^" + field + r"\s+:\s+(.*)$" with open("/proc/cpuinfo", "r", encoding="utf-8") as infile: cpuinfo = infile.read().split("\n") for line in cpuinfo: match = re.search(pattern, line, flags=re.IGNORECASE) if match: return match.group(1) return None def check_dt_compatible_value(self, value: str) -> bool: """ Search /proc/device-tree/compatible for a value and return True, if found, otherwise False. """ # Match a value like 'qcom,apq8016-sbc': dt_compatible = self.get_device_compatible() if dt_compatible and value in dt_compatible: return True return False def get_armbian_release_field(self, field: str) -> Optional[str]: """ Search /etc/armbian-release, if it exists, for a field and return its value, if found, otherwise None. """ field_value = None pattern = r"^" + field + r"=(.*)" try: with open("/etc/armbian-release", "r", encoding="utf-8") as release_file: armbian = release_file.read().split("\n") for line in armbian: match = re.search(pattern, line) if match: field_value = match.group(1) except FileNotFoundError: pass return field_value def get_device_model(self) -> Optional[str]: """ Search /proc/device-tree/model for the device model and return its value, if found, otherwise None. """ try: with open("/proc/device-tree/model", "r", encoding="utf-8") as model_file: return model_file.read() except FileNotFoundError: pass return None def get_device_compatible(self) -> Optional[str]: """ Search /proc/device-tree/compatible for the compatible chip name. """ try: with open( "/proc/device-tree/compatible", "r", encoding="utf-8" ) as model_file: return model_file.read() except FileNotFoundError: pass return None def check_board_asset_tag_value(self) -> Optional[str]: """ Search /sys/devices/virtual/dmi/id for the device model and return its value, if found, otherwise None. """ try: with open( "/sys/devices/virtual/dmi/id/board_asset_tag", "r", encoding="utf-8" ) as tag_file: return tag_file.read().strip() except FileNotFoundError: pass return None def check_board_name_value(self) -> Optional[str]: """ Search /sys/devices/virtual/dmi/id for the board name and return its value, if found, otherwise None. Debian/ubuntu based """ try: with open( "/sys/devices/virtual/dmi/id/board_name", "r", encoding="utf-8" ) as board_name_file: return board_name_file.read().strip() except FileNotFoundError: pass return None