feat: add manual disk discovery and weekly capacity cache

This commit is contained in:
way
2026-10-15 23:30:06 +08:00
parent 174ac747c5
commit 747503d86d
13 changed files with 400 additions and 12 deletions
+9 -3
View File
@@ -1,12 +1,12 @@
#!/usr/bin/env python3
import time,socket,subprocess,configparser,signal,re,argparse,json,os,platform
from pathlib import Path
APP_VERSION="3.10.0"
APP_VERSION="3.11.2"
import sys
sys.path.append("/usr/local/share/pigway-pi-control")
from plugin_api import Publisher,registered,discover
from network_rates import NetworkRates
from storage_cache import StorageCache
from storage_cache import StorageCache,StorageInventory
storage_cache=StorageCache("/run/pigway-pi-control/storage-cache.json")
CFG="/etc/pigway-pi-control.conf"
@@ -199,6 +199,7 @@ def load_cfg():
if target and not target.startswith("#"): watches.append(("process",label.upper(),target))
return c,watches
cfg,watches=load_cfg()
storage_inventory=StorageInventory(cache_path=Path(CFG).with_suffix(".storage.json"),capacity_path="/run/pigway-pi-control/storage-inventory-usage.json")
def cf(section,key,default,cast=float):
try: return cast(cfg.get(section,key))
@@ -427,15 +428,17 @@ def write_status(cpu,temp,mem,disk):
display_state=alert_manager.status_snapshot()
memory_total,memory_used,memory_available,memory_calculated=memory_usage()
storage=storage_cache.sample()
disks=storage_inventory.sample(cfg)
disk_total,disk_used,disk_free=(storage[k] for k in ("total","used","free")) if storage else (None,None,None)
signal=wifi_percent(net_metric) if net_kind=="WIF" else None
state={
"version":APP_VERSION,"timestamp":int(time.time()),
"collection":{"interval_seconds":min(1.0,SENSOR_INTERVAL,NETWORK_INTERVAL,SERVICE_INTERVAL,HEALTH_INTERVAL),
"refresh":{
"storage_inventory":{"interval_seconds":604800,"observed_at":storage_inventory.observed_at,"next_update_at":storage_inventory.next_update_at,"error":storage_inventory.error},
"system":{"interval_seconds":SENSOR_INTERVAL,"observed_at":sensor_observed_at,"next_update_at":sensor_observed_at+SENSOR_INTERVAL if sensor_observed_at else None},
"network":{"interval_seconds":NETWORK_INTERVAL,"observed_at":network_observed_at,"next_update_at":network_observed_at+NETWORK_INTERVAL if network_observed_at else None},
"storage":{"interval_seconds":86400,"observed_at":storage_cache.observed_at,"next_update_at":storage_cache.next_update_at,"error":storage_cache.error},
"storage":{"interval_seconds":604800,"observed_at":storage_cache.observed_at,"next_update_at":storage_cache.next_update_at,"error":storage_cache.error},
"display":{"interval_seconds":1,"next_update_at":time.time()+1},
"alerts":{"interval_seconds":1,"next_update_at":time.time()+1}}},"uptime_seconds":uptime_seconds(),
"machine":{"id":DEVICE_ID,"name":DEVICE_NAME,"hostname":socket.gethostname()},
@@ -446,6 +449,9 @@ def write_status(cpu,temp,mem,disk):
"memory_total_bytes":memory_total,"memory_used_bytes":memory_used,
"memory_available_bytes":memory_available,
"storage_observed_at":storage_cache.observed_at,
"storage_inventory":disks,"storage_inventory_observed_at":storage_inventory.observed_at,
"storage_inventory_error":storage_inventory.error,
"storage_scanned_at":storage_inventory.scanned_at,"storage_discovery_mode":"manual",
"disk_percent":round(disk,1) if disk is not None else None,"disk_total_bytes":disk_total,
"disk_used_bytes":disk_used,"disk_free_bytes":disk_free,
"root_readonly":bool(fs_readonly)},