58 lines
1.7 KiB
Python
58 lines
1.7 KiB
Python
#!/usr/bin/env python3
|
|
"""Rust toolchain health check - verifies rustc, cargo, and rustup are functional."""
|
|
|
|
import subprocess
|
|
import sys
|
|
import json
|
|
|
|
def run_cmd(cmd):
|
|
try:
|
|
result = subprocess.run(cmd, capture_output=True, text=True, timeout=10)
|
|
return result.returncode, result.stdout.strip(), result.stderr.strip()
|
|
except FileNotFoundError:
|
|
return -1, "", "command not found"
|
|
except subprocess.TimeoutExpired:
|
|
return -2, "", "timeout"
|
|
|
|
def check_rustc():
|
|
code, out, err = run_cmd(["rustc", "--version"])
|
|
if code == 0:
|
|
version = out.split()[-1] if out else "unknown"
|
|
return {"status": "ok", "version": version, "raw": out}
|
|
return {"status": "error", "error": err or out or "not installed"}
|
|
|
|
def check_cargo():
|
|
code, out, err = run_cmd(["cargo", "--version"])
|
|
if code == 0:
|
|
version = out.split()[-1] if out else "unknown"
|
|
return {"status": "ok", "version": version, "raw": out}
|
|
return {"status": "error", "error": err or out or "not installed"}
|
|
|
|
def check_rustup():
|
|
code, out, err = run_cmd(["rustup", "--version"])
|
|
if code == 0:
|
|
return {"status": "ok", "raw": out}
|
|
return {"status": "error", "error": err or out or "not installed"}
|
|
|
|
def main():
|
|
results = {
|
|
"rustc": check_rustc(),
|
|
"cargo": check_cargo(),
|
|
"rustup": check_rustup(),
|
|
}
|
|
|
|
all_ok = all(
|
|
r["status"] == "ok"
|
|
for r in results.values()
|
|
)
|
|
|
|
print(json.dumps({
|
|
"all_ok": all_ok,
|
|
"timestamp": __import__('datetime').datetime.utcnow().isoformat() + "Z",
|
|
"components": results
|
|
}, indent=2))
|
|
|
|
sys.exit(0 if all_ok else 1)
|
|
|
|
if __name__ == "__main__":
|
|
main() |