64 lines
1.5 KiB
Python
Executable File
64 lines
1.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""Collect server runtime stats (uptime, top, cgroup, mounts, hdd) and return as JSON."""
|
|
|
|
import json
|
|
import os
|
|
import subprocess
|
|
|
|
|
|
def cmd(args, splitlines=False):
|
|
try:
|
|
result = subprocess.run(
|
|
args,
|
|
capture_output=True,
|
|
text=True,
|
|
timeout=30,
|
|
)
|
|
out = (result.stdout + result.stderr).strip()
|
|
|
|
if splitlines:
|
|
return out.splitlines()
|
|
|
|
return out
|
|
|
|
except Exception as e:
|
|
return f"ERROR: {e}"
|
|
|
|
|
|
def read_file(path):
|
|
try:
|
|
with open(path) as f:
|
|
return f.read().strip().splitlines()
|
|
except FileNotFoundError:
|
|
return None
|
|
|
|
|
|
def disk_usage(path):
|
|
"""Total/used/available bytes for the filesystem at `path` (same figures as df)."""
|
|
try:
|
|
st = os.statvfs(path)
|
|
return {
|
|
"path": path,
|
|
"total_bytes": st.f_blocks * st.f_frsize,
|
|
"used_bytes": (st.f_blocks - st.f_bfree) * st.f_frsize,
|
|
"available_bytes": st.f_bavail * st.f_frsize,
|
|
}
|
|
except Exception as e:
|
|
return f"ERROR: {e}"
|
|
|
|
|
|
def main():
|
|
stats = {}
|
|
|
|
stats["uptime"] = cmd(["uptime"])
|
|
stats["top"] = cmd(["sh", "-c", "top -b -n 1 | head -n 3"], splitlines=True)
|
|
stats["cgroup"] = read_file("/proc/self/cgroup")
|
|
stats["mounts"] = cmd(["mount"], splitlines=True)
|
|
stats["hdd"] = disk_usage("/")
|
|
|
|
print(json.dumps(stats, indent=2))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|