55 lines
2.2 KiB
Python
Executable File
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))
|