시놀로지 팬 가드 추가
This commit is contained in:
1 parent
33851e0189
commit
17dacd896f
3 files changed
+129
No files matched your search
Executable
+113
@@ -0,0 +1,113 @@
|
||||
#!/bin/sh
|
||||
set -eu
|
||||
|
||||
INTERVAL_SECONDS="${INTERVAL_SECONDS:-5}"
|
||||
HIGH_TEMP_C="${HIGH_TEMP_C:-75}"
|
||||
LOW_TEMP_C="${LOW_TEMP_C:-65}"
|
||||
PWM_CHANNEL="${PWM_CHANNEL:-2}"
|
||||
PWM_FULL="${PWM_FULL:-255}"
|
||||
PWM_AUTO_ENABLE="${PWM_AUTO_ENABLE:-5}"
|
||||
PWM_MANUAL_ENABLE="${PWM_MANUAL_ENABLE:-1}"
|
||||
LAST_MODE=""
|
||||
|
||||
log() {
|
||||
if command -v logger >/dev/null 2>&1; then
|
||||
logger -t syno-fan-guard "$*"
|
||||
fi
|
||||
printf '%s\n' "$*"
|
||||
}
|
||||
|
||||
hwmon_by_name() {
|
||||
target="$1"
|
||||
for hwmon in /sys/class/hwmon/hwmon*; do
|
||||
[ -r "$hwmon/name" ] || continue
|
||||
[ "$(cat "$hwmon/name" 2>/dev/null)" = "$target" ] || continue
|
||||
printf '%s\n' "$hwmon"
|
||||
return 0
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
read_cpu_temp_mc() {
|
||||
cpu_hwmon="$(hwmon_by_name k10temp || true)"
|
||||
if [ -n "$cpu_hwmon" ]; then
|
||||
for sensor in temp2_input temp1_input temp3_input; do
|
||||
path="$cpu_hwmon/$sensor"
|
||||
[ -r "$path" ] || continue
|
||||
value="$(cat "$path" 2>/dev/null || printf 0)"
|
||||
case "$value" in
|
||||
''|*[!0-9-]*) continue ;;
|
||||
esac
|
||||
[ "$value" -gt 0 ] || continue
|
||||
printf '%s\n' "$value"
|
||||
return 0
|
||||
done
|
||||
fi
|
||||
printf '0\n'
|
||||
}
|
||||
|
||||
fan_hwmon() {
|
||||
hwmon_by_name nct6795
|
||||
}
|
||||
|
||||
write_if_needed() {
|
||||
path="$1"
|
||||
value="$2"
|
||||
[ -w "$path" ] || return 1
|
||||
current="$(cat "$path" 2>/dev/null || printf '')"
|
||||
[ "$current" = "$value" ] && return 0
|
||||
printf '%s\n' "$value" > "$path"
|
||||
}
|
||||
|
||||
apply_once() {
|
||||
verbose="${1:-0}"
|
||||
fan_hwmon_path="$(fan_hwmon)"
|
||||
pwm_path="$fan_hwmon_path/pwm${PWM_CHANNEL}"
|
||||
enable_path="$fan_hwmon_path/pwm${PWM_CHANNEL}_enable"
|
||||
rpm_path="$fan_hwmon_path/fan${PWM_CHANNEL}_input"
|
||||
temp_mc="$(read_cpu_temp_mc)"
|
||||
temp_c=$((temp_mc / 1000))
|
||||
rpm=0
|
||||
[ -r "$rpm_path" ] && rpm="$(cat "$rpm_path" 2>/dev/null || printf 0)"
|
||||
enable="$(cat "$enable_path" 2>/dev/null || printf '?')"
|
||||
pwm="$(cat "$pwm_path" 2>/dev/null || printf '?')"
|
||||
|
||||
if [ "$temp_c" -ge "$HIGH_TEMP_C" ]; then
|
||||
write_if_needed "$enable_path" "$PWM_MANUAL_ENABLE"
|
||||
write_if_needed "$pwm_path" "$PWM_FULL"
|
||||
if [ "$LAST_MODE" != "force-full" ] || [ "$verbose" = "1" ]; then
|
||||
log "force-full temp=${temp_c}C rpm=${rpm} pwm=${pwm} enable=${enable}"
|
||||
fi
|
||||
LAST_MODE="force-full"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [ "$temp_c" -le "$LOW_TEMP_C" ] && [ "$enable" != "$PWM_AUTO_ENABLE" ]; then
|
||||
write_if_needed "$enable_path" "$PWM_AUTO_ENABLE"
|
||||
log "restore-auto temp=${temp_c}C rpm=${rpm} pwm=${pwm} enable=${enable}"
|
||||
LAST_MODE="auto"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [ "$verbose" = "1" ]; then
|
||||
log "observe temp=${temp_c}C rpm=${rpm} pwm=${pwm} enable=${enable}"
|
||||
fi
|
||||
LAST_MODE="observe"
|
||||
}
|
||||
|
||||
case "${1:-run}" in
|
||||
once|status)
|
||||
apply_once 1
|
||||
;;
|
||||
run)
|
||||
log "start high=${HIGH_TEMP_C}C low=${LOW_TEMP_C}C channel=${PWM_CHANNEL}"
|
||||
while :; do
|
||||
apply_once 0 || true
|
||||
sleep "$INTERVAL_SECONDS"
|
||||
done
|
||||
;;
|
||||
*)
|
||||
printf 'Usage: %s [run|once|status]\n' "$0" >&2
|
||||
exit 2
|
||||
;;
|
||||
esac
|
||||
Reference in new issue
Block a user