diff options
-rwxr-xr-x | .gitignore.d/fluxbox | 1 | ||||
-rwxr-xr-x | bin/hwmon | 237 |
2 files changed, 238 insertions, 0 deletions
diff --git a/.gitignore.d/fluxbox b/.gitignore.d/fluxbox index fb4d452..fb53c6c 100755 --- a/.gitignore.d/fluxbox +++ b/.gitignore.d/fluxbox @@ -17,6 +17,7 @@ !/bin/ !/bin/chdt !/bin/dpmsmouse +!/bin/hwmon !/bin/volmon !/.fehbg !/.gitattributes.d/ 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}" \ + '<label>:<chip>/<element>' '<label>:<chip>/<element>' +} + +main() +{ + local opt= + local chips= + local max_len= + local sensor= + local label= + local len= + local chip= + local element= + + while getopts 'd' opt "${@}"; do + case "${opt}" in + 'd') debug=1;; + '?') + usage 1>&2 + return 1 + ;; + esac + done + shift $((${OPTIND} - 1)) + + if [ ${#} -lt 1 ]; then + usage 1>&2 + return 1 + fi + + chips="$(lookup_chips)" || return 1 + + max_len=0 + for sensor in "${@}"; do + label="${sensor%%:*}" + len=${#label} + if [ ${len} -gt ${max_len} ]; then + max_len=${len} + fi + done + + for sensor in "${@}"; do + label="${sensor%%:*}" + sensor="${sensor#*:}" + case "${sensor}" in '') + printf '%s\n' "${label}" + continue + esac + chip="${sensor%/*}" + element="${sensor##*/}" + print_sensor "${label}" ${len} \ + "${chip}" "${chips}" "${element}" || return 1 + done + + return 0 +} + +main "${@}" |