#!/bin/sh # system_profiler for the Darling prefix: reports the host's real display and # network hardware for the data types applications query at startup. # Installed as /usr/sbin/system_profiler by tools/install-darling-system-profiler.py. host=/Volumes/SystemRoot xml=0 types= while [ $# -gt 0 ]; do case "$1" in -xml) xml=1;; -detailLevel|-timeout) shift;; -listDataTypes) printf 'Available Datatypes:\nSPAirPortDataType\nSPDisplaysDataType\nSPEthernetDataType\n'; exit 0;; SP*DataType) types="$types $1";; esac shift done [ -n "$types" ] || types=" SPDisplaysDataType SPEthernetDataType SPAirPortDataType" escape() { sed -e 's/&/\&/g' -e 's//\>/g'; } pci_name() { # vendor device (hex without 0x) -> "Vendor Model" for ids in "$host/usr/share/hwdata/pci.ids" "$host/usr/share/misc/pci.ids"; do [ -r "$ids" ] || continue awk -v v="$1" -v d="$2" ' /^[0-9a-f][0-9a-f][0-9a-f][0-9a-f] / { found = ($1 == v); if (found) { vendor = $0; sub(/^[0-9a-f]+ /, "", vendor) } next } found && /^\t[0-9a-f][0-9a-f][0-9a-f][0-9a-f] / && $1 == d { model = $0; sub(/^\t[0-9a-f]+ /, "", model); exit } END { if (v == "1002") vendor = "AMD"; else if (v == "10de") vendor = "NVIDIA"; else if (v == "8086") vendor = "Intel" if (match(model, /\[[^]]*\]/)) model = substr(model, RSTART + 1, RLENGTH - 2) if (vendor != "" && model != "") print vendor " " model; else if (vendor != "") print vendor " Graphics" }' "$ids" return done } displays() { # one line per GPU: vendor|device|vram MB or empty|name for card in "$host"/sys/class/drm/card[0-9] "$host"/sys/class/drm/card[0-9][0-9]; do [ -r "$card/device/vendor" ] || continue vendor=$(sed 's/^0x//' "$card/device/vendor"); device=$(sed 's/^0x//' "$card/device/device") vram= if [ -r "$card/device/mem_info_vram_total" ]; then vram=$(awk '{ printf "%d", $1 / 1048576 }' "$card/device/mem_info_vram_total") fi name=$(pci_name "$vendor" "$device"); [ -n "$name" ] || name="Display" echo "$vendor|$device|$vram|$name" done } interfaces() { # $1 = wired|wireless; physical host interfaces only for path in "$host"/sys/class/net/*; do [ -e "$path/device" ] || continue if [ -d "$path/wireless" ] || [ -e "$path/phy80211" ]; then kind=wireless; else kind=wired; fi [ "$kind" = "$1" ] && basename "$path" done } if [ "$xml" = 1 ]; then echo '' echo '' echo '' echo '' for type in $types; do echo ' ' echo " _dataType$type" echo ' _items' echo ' ' case "$type" in SPDisplaysDataType) displays | while IFS='|' read -r vendor device vram name; do name=$(printf '%s' "$name" | escape) echo ' ' echo " _name$name" echo ' spdisplays_busspdisplays_builtin' echo " spdisplays_device-id0x$device" echo " spdisplays_vendor${name%% *} (0x$vendor)" [ -z "$vram" ] || echo " spdisplays_vram$vram MB" echo " sppci_model$name" echo ' sppci_device_typespdisplays_gpu' echo ' ' done;; SPEthernetDataType) interfaces wired | while read -r name; do echo ' ' echo ' _nameethernet' echo " spethernet_BSD_Name$name" echo ' ' done;; SPAirPortDataType) echo ' ' echo ' spairport_airport_interfaces' echo ' ' interfaces wireless | while read -r name; do echo ' ' echo " _name$name" echo ' spairport_wireless_card_typeWi-Fi' echo ' ' done echo ' ' echo ' ';; esac echo ' ' echo ' ' done echo '' echo '' exit 0 fi for type in $types; do case "$type" in SPDisplaysDataType) printf 'Graphics/Displays:\n\n' displays | while IFS='|' read -r vendor device vram name; do printf ' %s:\n\n Chipset Model: %s\n Type: GPU\n Bus: Built-In\n' "$name" "$name" [ -z "$vram" ] || printf ' VRAM (Total): %s MB\n' "$vram" printf ' Vendor: %s (0x%s)\n Device ID: 0x%s\n\n' "${name%% *}" "$vendor" "$device" done;; SPEthernetDataType) printf 'Ethernet Cards:\n\n' interfaces wired | while read -r name; do printf ' ethernet:\n\n Type: Ethernet Controller\n BSD name: %s\n\n' "$name" done;; SPAirPortDataType) printf 'Wi-Fi:\n\n Interfaces:\n' interfaces wireless | while read -r name; do printf ' %s:\n Card Type: Wi-Fi\n\n' "$name" done;; esac done