시놀로지 health 조회 SSH 통합

This commit is contained in:
seo committed 2026-08-29 23:33:54 +09:00
1 parent 61ad4af4ae
commit 64510e8fe5
2 files changed
+35 -43

No files matched your search

+34 -42
View File
@@ -45,6 +45,7 @@ SYNOLOGY_SSH = [
"seo@chaegeon.com",
]
SYNOLOGY_STATUS_SCRIPT = r"""
health_tick=49
while :; do
wan="$(awk '$2=="00000000"{print $1; exit}' /proc/net/route)"
[ -n "$wan" ] || wan=ovs_eth0
@@ -90,22 +91,25 @@ while :; do
}
' /proc/net/snmp
awk '/^(pgfault|pgmajfault|pgpgin|pgpgout) / {key=toupper($1); printf "%s=%s\n", key, $2}' /proc/vmstat
if [ "$health_tick" -ge 49 ]; then
cpu="$(cat /sys/class/hwmon/hwmon0/temp1_input 2>/dev/null)"
fan="$(cat /sys/class/hwmon/hwmon1/fan2_input 2>/dev/null)"
pwm="$(cat /sys/class/hwmon/hwmon1/pwm2 2>/dev/null)"
enable="$(cat /sys/class/hwmon/hwmon1/pwm2_enable 2>/dev/null)"
guard="$(systemctl is-active synology-fan-guard.service 2>/dev/null || printf unknown)"
case "$cpu" in ''|*[!0-9]*) cpu=0 ;; esac
case "$fan" in ''|*[!0-9]*) fan=0 ;; esac
case "$pwm" in ''|*[!0-9]*) pwm=0 ;; esac
case "$enable" in ''|*[!0-9]*) enable=-1 ;; esac
awk -v cpu="$cpu" -v fan="$fan" -v pwm="$pwm" -v enable="$enable" -v guard="$guard" 'BEGIN {printf "SYNO_CPU=%.1f\nSYNO_FAN=%d\nSYNO_GUARD=%s\nSYNO_PWM=%d\nSYNO_PWM_ENABLE=%d\n", cpu / 1000, fan, guard, pwm, enable}'
health_tick=0
else
health_tick=$((health_tick + 1))
fi
echo END=1
sleep 0.1
done
"""
SYNOLOGY_HEALTH_SCRIPT = r"""
cpu="$(cat /sys/class/hwmon/hwmon0/temp1_input 2>/dev/null)"
fan="$(cat /sys/class/hwmon/hwmon1/fan2_input 2>/dev/null)"
pwm="$(cat /sys/class/hwmon/hwmon1/pwm2 2>/dev/null)"
enable="$(cat /sys/class/hwmon/hwmon1/pwm2_enable 2>/dev/null)"
guard="$(systemctl is-active synology-fan-guard.service 2>/dev/null || printf unknown)"
case "$cpu" in ''|*[!0-9]*) cpu=0 ;; esac
case "$fan" in ''|*[!0-9]*) fan=0 ;; esac
case "$pwm" in ''|*[!0-9]*) pwm=0 ;; esac
case "$enable" in ''|*[!0-9]*) enable=-1 ;; esac
awk -v cpu="$cpu" -v fan="$fan" -v pwm="$pwm" -v enable="$enable" -v guard="$guard" 'BEGIN {printf "SYNO_CPU=%.1f\nSYNO_FAN=%d\nSYNO_GUARD=%s\nSYNO_PWM=%d\nSYNO_PWM_ENABLE=%d\n", cpu / 1000, fan, guard, pwm, enable}'
"""
SAMPLE_INTERVAL_MS = 100
DASHBOARD_INTERVAL_MS = 500
FAN_INTERVAL_MS = 500
@@ -114,13 +118,12 @@ TEMP_GRAPH_SECONDS = 60
WAN_GRAPH_POINT_DENSITY = 2
WAN_GRAPH_POINTS = WAN_GRAPH_SECONDS * 1000 // SAMPLE_INTERVAL_MS * WAN_GRAPH_POINT_DENSITY
TEMP_GRAPH_POINTS = TEMP_GRAPH_SECONDS * 1000 // DASHBOARD_INTERVAL_MS
SYNOLOGY_RESTART_INTERVAL_MS = 1000
SYNOLOGY_RESTART_INTERVAL_MS = 3000
TEMP_INTERVAL_MS = 500
DISK_TEMP_INTERVAL_MS = TEMP_INTERVAL_MS
DISK_TEMP_CACHE_FILE = "/run/control-rpi-disk-temp"
DISK_TEMP_CACHE_MAX_AGE_SECONDS = 30
RPI_THROTTLE_INTERVAL_MS = SAMPLE_INTERVAL_MS
SYNOLOGY_HEALTH_INTERVAL_MS = FAN_INTERVAL_MS
def byte_rate_unit(values):
@@ -692,6 +695,7 @@ class TouchPanel(QMainWindow):
self.synology_values = {}
self.synology_cpu_temp = 0.0
self.synology_fan_rpm = 0
self.synology_guard_values = {}
self.last_io = None
self.last_sample = None
self.last_graph = None
@@ -739,12 +743,6 @@ class TouchPanel(QMainWindow):
self.synology_timer.timeout.connect(self.update_synology_status)
self.synology_timer.start(SYNOLOGY_RESTART_INTERVAL_MS)
self.synology_health_proc = QProcess(self)
self.synology_health_proc.finished.connect(self.synology_health_finished)
self.synology_health_timer = QTimer(self)
self.synology_health_timer.timeout.connect(self.update_synology_health)
self.synology_health_timer.start(SYNOLOGY_HEALTH_INTERVAL_MS)
self.synology_ping_proc = QProcess(self)
self.synology_ping_buffer = ""
self.synology_ping_proc.readyReadStandardOutput.connect(self.synology_ping_ready)
@@ -768,7 +766,6 @@ class TouchPanel(QMainWindow):
self.ping_pc()
self.update_disk_temp()
self.update_synology_status()
self.update_synology_health()
self.ping_synology()
self.update_rpi_throttle()
@@ -1105,30 +1102,24 @@ class TouchPanel(QMainWindow):
self.synology_values = {}
self.synology_proc.start(SYNOLOGY_SSH[0], SYNOLOGY_SSH[1:] + [SYNOLOGY_STATUS_SCRIPT])
def update_synology_health(self):
if self.synology_health_proc.state() != QProcess.NotRunning:
def apply_synology_health(self, values):
health_keys = ["SYNO_CPU", "SYNO_FAN", "SYNO_GUARD", "SYNO_PWM", "SYNO_PWM_ENABLE"]
if not any(key in values for key in health_keys):
return
self.synology_health_proc.start(SYNOLOGY_SSH[0], SYNOLOGY_SSH[1:] + [SYNOLOGY_HEALTH_SCRIPT])
def synology_health_finished(self, exit_code, exit_status):
del exit_status
if exit_code != 0:
return
output = bytes(self.synology_health_proc.readAllStandardOutput()).decode("utf-8", "ignore")
values = {}
for line in output.splitlines():
if "=" not in line:
continue
key, value = line.split("=", 1)
values[key.strip()] = value.strip()
try:
self.synology_cpu_temp = float(values.get("SYNO_CPU", "0") or 0)
except ValueError:
self.synology_cpu_temp = 0.0
self.synology_fan_rpm = int(values.get("SYNO_FAN", "0") or 0)
if "SYNO_CPU" in values:
try:
self.synology_cpu_temp = float(values.get("SYNO_CPU", "0") or 0)
except ValueError:
self.synology_cpu_temp = 0.0
if "SYNO_FAN" in values:
try:
self.synology_fan_rpm = int(values.get("SYNO_FAN", "0") or 0)
except ValueError:
self.synology_fan_rpm = 0
self.synology_guard_values.update({key: values[key] for key in health_keys if key in values})
self.render_synology_temp()
self.render_synology_fan()
self.render_synology_guard(values)
self.render_synology_guard(self.synology_guard_values)
def synology_status_ready(self):
output = bytes(self.synology_proc.readAllStandardOutput()).decode("utf-8", "ignore")
@@ -1172,6 +1163,7 @@ class TouchPanel(QMainWindow):
if not values:
self.set_synology_offline()
return
self.apply_synology_health(values)
for disk in ["SATA1", "SATA2", "SATA4"]:
self.set_synology_io_tile(
f"synology_{disk.lower()}",