Files
weval-l99/disk-guardian.py
2026-04-13 12:43:21 +02:00

55 lines
2.2 KiB
Python
Executable File

#!/usr/bin/env python3
# disk_guardian — Implemented Wave 124 Opus #1
# Monitors disk usage, alerts if > 90%, cleans /opt/wevads/vault/ GOLD files > 7 days
import subprocess, json, datetime, os, sys, glob
AGENT = 'disk_guardian'
CRITICAL = 90
WARN = 85
def sh(cmd, t=10):
try:
r = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=t)
return r.stdout.strip()
except: return ''
def scan():
disk_line = sh("df -h / | tail -1")
parts = disk_line.split()
pct = int(parts[4].rstrip('%')) if len(parts) >= 5 else 0
vault_size = sh("find /opt/wevads/vault -maxdepth 1 -type f 2>/dev/null | wc -l 2>/dev/null | awk '{print $1}'")
vault_count = int(sh("find /opt/wevads/vault -type f 2>/dev/null | wc -l") or 0)
old_gold = sh("find /opt/wevads/vault -name '*.GOLD-*' -mtime +7 2>/dev/null | wc -l")
logs_size = sh("du -sh /var/log 2>/dev/null | awk '{print $1}'")
screenshots = int(sh("find /opt/weval-l99/screenshots -type f 2>/dev/null | wc -l") or 0)
videos = int(sh("find /opt/weval-l99/videos -type f 2>/dev/null | wc -l") or 0)
level = 'CRITICAL' if pct >= CRITICAL else ('WARN' if pct >= WARN else 'OK')
return {
'agent': AGENT, 'ts': datetime.datetime.now().isoformat(),
'disk_pct': pct, 'level': level,
'vault': {'size': vault_size, 'files': vault_count, 'gold_old_7d': int(old_gold or 0)},
'logs_size': logs_size,
'screenshots': screenshots, 'videos': videos,
}
def act():
st = scan()
cleaned = []
if st['vault']['gold_old_7d'] > 20:
# Remove GOLD > 14 days (safer)
old = sh("find /opt/wevads/vault -name '*.GOLD-*' -mtime +14 -print 2>/dev/null")
for f in old.split('\n')[:50]:
if f and os.path.exists(f):
try: os.unlink(f); cleaned.append(f)
except: pass
# Rotate /var/log files > 100M
big_logs = sh("find /var/log -size +100M -type f -name '*.log' 2>/dev/null")
return {'agent': AGENT, 'scan': st, 'cleaned_files': len(cleaned), 'big_logs': big_logs.split('\n')[:10]}
if __name__ == '__main__':
cmd = sys.argv[1] if len(sys.argv) > 1 else 'scan'
print(json.dumps(scan() if cmd == 'scan' else act(), ensure_ascii=False, indent=2))