From 8aaba16047f903ca1b5ceb3eb60a64a4151efba7 Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Thu, 26 Apr 2018 18:33:09 -0400 Subject: bin/hwmon: New script --- (limited to 'bin') diff --git a/bin/hwmon b/bin/hwmon new file mode 100755 index 0000000..cc583c4 --- /dev/null +++ b/bin/hwmon @@ -0,0 +1,237 @@ +#!/bin/sh + +set -eu + +debug=0 + +err() +{ + local fmt="${1}" + shift 1 + + printf "Error: ${fmt}\n" "${@}" 1>&2 + return 0 +} + +dbg() +{ + local fmt="${1}" + shift 1 + + case "${debug}" in '1') + printf "DEBUG: ${fmt}\n" "${@}" 1>&2 + esac + + return 0 +} + +lookup_chips() +{ + local hwmon_dir= + local hwmon= + local name= + + for hwmon_dir in /sys/class/hwmon/hwmon*; do + hwmon="${hwmon_dir#/sys/class/hwmon/}" + if [ -f "${hwmon_dir}/name" ]; then + read -r name <"${hwmon_dir}/name" + elif [ -f "${hwmon_dir}/device/name" ]; then + read -r name <"${hwmon_dir}/device/name" + else + return 1 + fi + printf '%s %s\n' "${hwmon}" "${name}" + dbg 'Chip %s = %s' "${name}" "${hwmon}" + done + + return 0 +} + +lookup_chip() +{ + local chip="${1}" + local chips="${2}" + shift 2 + local hwmon= + local name= + + while read -r hwmon name; do + case "${name}" in "${chip}") + printf '%s' "${hwmon}" + return 0 + esac + done <<-EOF + ${chips} + EOF + + return 1 +} + +read_value() +{ + local hwmon="${1}" + local element="${2}" + shift 2 + local hwmon_dir= + local value= + + hwmon_dir="/sys/class/hwmon/${hwmon}" + if [ -f "${hwmon_dir}/${element}_input" ]; then + read -r value <"${hwmon_dir}/${element}_input" + elif [ -f "${hwmon_dir}/device/${element}_input" ]; then + read -r value <"${hwmon_dir}/device/${element}_input" + else + return 1 + fi + + printf '%s' "${value}" + return 0 +} + +format_temp() +{ + local hwmon="${1}" + local element="${2}" + shift 2 + local value= + + value="$(read_value "${hwmon}" "${element}")" || return 1 + printf '%d C' "${value%???}" + + return 0 +} + +format_fan() +{ + local hwmon="${1}" + local element="${2}" + shift 2 + local value= + + value="$(read_value "${hwmon}" "${element}")" || return 1 + printf '%d RPM' "${value}" + + return 0 +} + +format_power() +{ + local hwmon="${1}" + local element="${2}" + shift 2 + local value= + + value="$(read_value "${hwmon}" "${element}")" || return 1 + printf '%d W' "${value%??????}" + + return 0 +} + +print_sensor() +{ + local label="${1}" + local len=${2} + local chip="${3}" + local chips="${4}" + local element="${5}" + shift 5 + local hwmon= + local value= + local i= + + if ! hwmon="$(lookup_chip "${chip}" "${chips}")"; then + err 'Unknown chip "%s"' "${chip}" + return 1 + fi + + case "${element}" in + 'temp'*) + value="$(format_temp "${hwmon}" "${element}")" || \ + return 1 + ;; + 'fan'*) + value="$(format_fan "${hwmon}" "${element}")" || \ + return 1 + ;; + 'power'*) + value="$(format_power "${hwmon}" "${element}")" || \ + return 1 + ;; + *) + err 'Unsupported type of element "%s"' "${element}" + return 1 + ;; + esac + + printf ' %s:' "${label}" + i=${#label} + while [ ${i} -lt ${len} ]; do + printf ' ' + i=$((${i} + 1)) + done + printf ' %s\n' "${value}" + + return 0 +} + +usage() +{ + printf 'Usage: %s [-d] %s [%s ...]\n' "${0}" \ + '