From 088dbd46c1b0fb3b526fb6a461de41a8a6d8a778 Mon Sep 17 00:00:00 2001 From: matti Date: Sun, 25 Aug 2024 09:32:58 +0000 Subject: [PATCH] neues info Script MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Übersichtlicher und nicht verwendete Infos aus dem Script entfernt --- angestoepselt-info | 325 ++++++++++++++------------------------------- 1 file changed, 101 insertions(+), 224 deletions(-) diff --git a/angestoepselt-info b/angestoepselt-info index 835356f..db0e7bc 100755 --- a/angestoepselt-info +++ b/angestoepselt-info @@ -1,231 +1,108 @@ #!/bin/bash + # This ist a small script which collect system information of a Linux PC and print it as json -# created by matthias of angestöpselt e.V. +# copy this script to /usr/local/bin and make it executable +# created by matthias of Angestöpselt e.V. # created at 2022-02-17 +# modified at 2024-08-25 -version=1.0 -charity=angestoepselt -os=Linux - -read_uname() { - read -ra uname <<< "$(uname -srm)" - - kernel_name="${uname[0]}" - kernel_version="${uname[1]}" - kernel_machine="${uname[2]}" -} - -get_memory() { - memory="$(free -g | awk '/Mem:/ {printf "%i GiB", $2}')" -} - -get_cpu() { - - # Get CPU name. - cpu_file="/proc/cpuinfo" - - - cpu="$(awk -F '\\s*: | @' \ - '/model name|Hardware|Processor|^cpu model|chip type|^cpu type/ { - cpu=$2; if ($1 == "Hardware") exit } END { print cpu }' "$cpu_file")" - - - # Remove un-needed patterns from cpu output. - cpu="${cpu//(TM)}" - cpu="${cpu//(tm)}" - cpu="${cpu//(R)}" - cpu="${cpu//(r)}" - cpu="${cpu//CPU}" - cpu="${cpu//Processor}" - cpu="${cpu//Dual-Core}" - cpu="${cpu//Quad-Core}" - cpu="${cpu//Six-Core}" - cpu="${cpu//Eight-Core}" - cpu="${cpu//[1-9][0-9]-Core}" - cpu="${cpu//[0-9]-Core}" - cpu="${cpu//, * Compute Cores}" - cpu="${cpu//Core / }" - cpu="${cpu//(\"AuthenticAMD\"*)}" - cpu="${cpu//with Radeon * Graphics}" - cpu="${cpu//, altivec supported}" - cpu="${cpu//FPU*}" - cpu="${cpu//Chip Revision*}" - cpu="${cpu//Technologies, Inc}" - cpu="${cpu//Core2/Core 2}" - - # Remove CPU brand from the output. - cpu="${cpu/AMD}" - cpu="${cpu/Intel}" - cpu="${cpu/Core? Duo}" - cpu="${cpu/Qualcomm}" - cpu="${cpu//[[:space:]]}" -} - -get_disk() { - type -p df &>/dev/null || - { err "Disk requires 'df' to function. Install 'df' to get disk info."; return; } - - df_version=$(df --version 2>&1) - - # Create an array called 'disks' where each element is a separate line from - # df's output. We then unset the first element which removes the column titles. - IFS=$'\n' read -d "" -ra disks <<< "$(df "${df_flags[@]}" "${disk_show[@]:-/}")" - unset "disks[0]" - - # Stop here if 'df' fails to print disk info. - [[ ${disks[*]} ]] || { - err "Disk: df failed to print the disks, make sure the disk_show array is set properly." - return - } - - for disk in "${disks[@]}"; do - # Create a second array and make each element split at whitespace this time. - IFS=" " read -ra disk_info <<< "$disk" - disk=$((disk_info[${#disk_info[@]} - 5] / 1024/ 1024))G - - done -} - -get_model() { - - if [[ -d /system/app/ && -d /system/priv-app ]]; then - model="$(getprop ro.product.brand) $(getprop ro.product.model)" - - elif [[ -f /sys/devices/virtual/dmi/id/board_vendor || - -f /sys/devices/virtual/dmi/id/board_name ]]; then - model=$(< /sys/devices/virtual/dmi/id/board_vendor) - model+=" $(< /sys/devices/virtual/dmi/id/board_name)" - - elif [[ -f /sys/devices/virtual/dmi/id/product_name || - -f /sys/devices/virtual/dmi/id/product_version ]]; then - model=$(< /sys/devices/virtual/dmi/id/product_name) - model+=" $(< /sys/devices/virtual/dmi/id/product_version)" - - elif [[ -f /sys/firmware/devicetree/base/model ]]; then - model=$(< /sys/firmware/devicetree/base/model) - - elif [[ -f /tmp/sysinfo/model ]]; then - model=$(< /tmp/sysinfo/model) - fi - - # Remove dummy OEM info. - model=${model//To be filled by O.E.M.} - model=${model//To Be Filled*} - model=${model//OEM*} - model=${model//Not Applicable} - model=${model//System Product Name} - model=${model//System Version} - model=${model//Undefined} - model=${model//Default string} - model=${model//Not Specified} - model=${model//Type1ProductConfigId} - model=${model//INVALID} - model=${model//All Series} - model=${model//�} - - case $model in - "Standard PC"*) model="KVM/QEMU (${model})" ;; - OpenBSD*) model="vmm ($model)" ;; - esac -} - -get_vendor() { - sys_vendor=$(cat /sys/devices/virtual/dmi/id/sys_vendor) -} - -get_distro() { - source /etc/os-release - distro="${NAME} ${VERSION_ID}" -} - -get_serial() { - [ `id -u` -eq 0 ] && serialno=$(sudo cat /sys/devices/virtual/dmi/id/product_serial) -} - -get_category() { - category=$(hostnamectl | grep Chassis | cut -c 21-) -} - -get_odd() { - [[ $(lsblk --include 11 -n) ]] && odd="1" || odd="0" -} - -get_mac() { - mac=$(ip link | sed -n "/BROADCAST.*state UP/{n;p}" | tail -1 | tr -s " " | cut -d" " -f3) -} - - -get_anydesk_id() { - dpkg-query -l "anydesk" &>/dev/null && anydesk_status="TRUE" || anydesk_status="FALSE" - if [ "$anydesk_status" == "TRUE" ]; then - # fetching the id of anydesk consumes most of the time when calling the script. Room for improvement - andydesk_id=$(/usr/bin/anydesk --get-id) - fi -} - -get_battery() { - for bat in /sys/class/power_supply/*; do - if [[ $bat =~ BAT ]]; then - source $bat/uevent - energy_full_design="$(< "${bat}/energy_full_design")" - energy_full="$(< "${bat}/energy_full")" - battery=`expr ${energy_full} \* 100 / ${energy_full_design}`% - fi - done -} - -get_resolution() { - resolution=$(xdpyinfo | awk '/dimensions/ {print $2}') -} - -get_display() { - display=`xrandr | awk '/ connected/{print sqrt( ($(NF-2)/10)^2 + ($NF/10)^2 )/2.54}' | cut -c -2 | head -n 1` -} - -get_desktopmanager() { - echo $XDG_CURRENT_DESKTOP -} - -# fetch informations -read_uname -get_memory -get_cpu -get_disk -get_model -get_vendor -get_distro -get_serial -get_category -get_odd -get_mac -get_desktopmanager -get_anydesk_id - - -# fetch additional laptop infos -if [[ $category == "laptop" ]]; then - get_battery - get_resolution - get_display +# Script muss mit sudo Rechten ausgeführt werden +if [ "$EUID" -ne 0 ] + then echo "Please run as root" + exit fi -# print summary in json +install_if_not_exist() { + if /usr/bin/dpkg -s "$1" &>/dev/null; then + PKG_EXIST=$(/usr/bin/dpkg -s "$1" | grep "install ok installed") + if [[ -n "$PKG_EXIST" ]]; then + return + fi + fi + /usr/bin/apt-get install --no-install-recommends --yes "$1" +} -printf '{\n' -printf ' %s\n' "\"Charity\": \"${charity}\"", -printf ' %s\n' "\"Distro\": \"${distro}\"", -printf ' %s\n' "\"Vendor\": \"${sys_vendor}\"", -printf ' %s\n' "\"Model\": \"${model}\"", -printf ' %s\n' "\"Serial\": \"${serialno}\"", -printf ' %s\n' "\"Platform\": \"${category}\"", -printf ' %s\n' "\"CPU\": \"${cpu}\"", -printf ' %s\n' "\"Memory\": \"${memory}\"", -printf ' %s\n' "\"HDD\": \"${disk}\"", -printf ' %s\n' "\"HW_ADDRESS\": \"${mac}\"", -printf ' %s\n' "\"Anydesk_ID\": \"${andydesk_id}\"", -printf ' %s\n' "\"Resolution\": \"${resolution}\"", -printf ' %s\n' "\"Displaysize\": \"${display}\"", -printf ' %s\n' "\"Battery_life\": \"${battery}\"", -printf ' %s\n' "\"Optical_Drive\": \"${odd}\"", -printf ' %s\n' "\"Version\": \"${version}\"" -printf '}\n' +install_if_not_exist jq +install_if_not_exist jc + +# Werte aus dmidecode auslesen +dmidecode_output=$(jc dmidecode) + +type=$(echo "$dmidecode_output" | jq -r '.[] | select(.description == "Chassis Information") | .values.type') +manufacturer=$(echo "$dmidecode_output" | jq -r '.[] | select(.description == "System Information") | .values.manufacturer') +product_name=$(echo "$dmidecode_output" | jq -r '.[] | select(.description == "System Information") | .values.product_name') +serial_number=$(echo "$dmidecode_output" | jq -r '.[] | select(.description == "System Information") | .values.serial_number') +family=$(echo "$dmidecode_output" | jq -r '.[] | select(.description == "System Information") | .values.family') +memory_size=$(echo "$dmidecode_output" | jq -r '.[] | select(.description == "Memory Device" and .values.bank_locator == "BANK 0") | .values.size') +memory_type=$(echo "$dmidecode_output" | jq -r '.[] | select(.description == "Memory Device" and .values.bank_locator == "BANK 0") | .values.type') +cpu_family=$(echo "$dmidecode_output" | jq -r '.[] | select(.description == "Processor Information") | .values.family') +cpu_manufacturer=$(echo "$dmidecode_output" | jq -r '.[] | select(.description == "Processor Information") | .values.manufacturer') +cpu_version_raw=$(echo "$dmidecode_output" | jq -r '.[] | select(.description == "Processor Information") | .values.version') +cpu_core_count=$(echo "$dmidecode_output" | jq -r '.[] | select(.description == "Processor Information") | .values.core_count') +cpu_thread_count=$(echo "$dmidecode_output" | jq -r '.[] | select(.description == "Processor Information") | .values.thread_count') + +# Formatiere Variablen für eine schöne Ausgabe +# Im Moment ist es nur auf einem Intel Laptop getestet mit einem Intel Core i5 +cpu_version=$(echo "${cpu_version_raw%" CPU"*}") + + +# Laptop spezifischen Werte, Batterie, Display +battery_dir="/sys/class/power_supply/BAT0" + +# Überprüfen, ob das Verzeichnis existiert (d.h. ob eine Batterie vorhanden ist) +if [ -d "$battery_dir" ]; then + charge_full_design=$(cat "$battery_dir/charge_full_design") + charge_full=$(cat "$battery_dir/charge_full") + + # Bestimme auch Display Größe und Auflösung sofern ein Akku vorhanden ist + display_resolution=$(xdpyinfo | awk '/dimensions/ {print $2}') + display_size_raw=$(xrandr | awk '/ connected/{print sqrt( ($(NF-2)/10)^2 + ($NF/10)^2 )/2.54}' | head -n 1) + display_size=$(LC_ALL=C /usr/bin/printf "%.*f\n" 2 $display_size_raw) + + # Sicherstellen, dass beide Werte numerisch sind + if [[ "$charge_full_design" =~ ^[0-9]+$ ]] && [[ "$charge_full" =~ ^[0-9]+$ ]]; then + if [ "$charge_full_design" -ne 0 ]; then + bat_capacity=$((100 * charge_full / charge_full_design)) + fi + fi +else + bat_capacity="no_battery" + display_resolution="n/a" + display_size="n/a" +fi + + +# Erstelle das JSON-Objekt +jq -n \ + --arg type "$type" \ + --arg manufacturer "$manufacturer" \ + --arg product_name "$product_name" \ + --arg serial_number "$serial_number" \ + --arg family "$family" \ + --arg memory_size "$memory_size" \ + --arg memory_type "$memory_type" \ + --arg cpu_family "$cpu_family" \ + --arg cpu_manufacturer "$cpu_manufacturer" \ + --arg cpu_version "$cpu_version" \ + --arg cpu_core_count "$cpu_core_count" \ + --arg cpu_thread_count "$cpu_thread_count" \ + --arg bat_capacity "$bat_capacity" \ + --arg display_resolution "$display_resolution" \ + --arg display_size "$display_size" \ + '{ + type: $type, + manufacturer: $manufacturer, + product_name: $product_name, + serial_number: $serial_number, + family: $family, + memory_size: $memory_size, + memory_type: $memory_type, + cpu_family: $cpu_family, + cpu_manufacturer: $cpu_manufacturer, + cpu_version: $cpu_version, + cpu_core_count: $cpu_core_count, + cpu_thread_count: $cpu_thread_count, + bat_capacity: $bat_capacity, + display_resolution: $display_resolution, + display_size: $display_size + }'