同步移动端工程、设备控制改进与发布资料
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Exercise the independent recovery task after a real systemd service stop."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
from pathlib import Path
|
||||
import shutil
|
||||
import subprocess
|
||||
import time
|
||||
from uuid import uuid4
|
||||
|
||||
|
||||
def run(*args: str) -> subprocess.CompletedProcess[str]:
|
||||
return subprocess.run(args, check=True, capture_output=True, text=True, timeout=30)
|
||||
|
||||
|
||||
def main() -> int:
|
||||
if os.geteuid() != 0 or not Path("/run/systemd/system").is_dir():
|
||||
raise RuntimeError("real systemd lifecycle test requires root on a systemd host")
|
||||
token = uuid4().hex[:12]
|
||||
directory_name = f"matrix-kernel-recovery-test-{token}"
|
||||
main_unit = f"{directory_name}-main"
|
||||
task_unit = f"{directory_name}-task"
|
||||
runtime = Path("/run") / directory_name
|
||||
if runtime.exists():
|
||||
raise RuntimeError("isolated runtime directory already exists")
|
||||
try:
|
||||
run("systemd-run", "--quiet", f"--unit={main_unit}",
|
||||
f"--property=RuntimeDirectory={directory_name}",
|
||||
"--property=RuntimeDirectoryPreserve=yes", "/bin/sleep", "120")
|
||||
for _ in range(30):
|
||||
if runtime.is_dir():
|
||||
break
|
||||
time.sleep(0.1)
|
||||
else:
|
||||
raise RuntimeError("temporary service did not create its runtime directory")
|
||||
if run("systemctl", "show", main_unit, "--property=RuntimeDirectoryPreserve", "--value").stdout.strip() != "yes":
|
||||
raise RuntimeError("temporary service did not enable runtime preservation")
|
||||
run("systemctl", "stop", main_unit)
|
||||
if not runtime.is_dir():
|
||||
raise RuntimeError("systemd removed the runtime directory after service stop")
|
||||
proof = runtime / "independent-task.txt"
|
||||
run("systemd-run", "--quiet", "--wait", "--collect", f"--unit={task_unit}",
|
||||
"/usr/bin/python3", "-c",
|
||||
"from pathlib import Path; import sys; Path(sys.argv[1]).write_text('ok', encoding='ascii')",
|
||||
str(proof))
|
||||
if proof.read_text(encoding="ascii") != "ok":
|
||||
raise RuntimeError("independent task did not survive the main service stop")
|
||||
print("real systemd recovery lifecycle passed")
|
||||
return 0
|
||||
finally:
|
||||
subprocess.run(["systemctl", "stop", main_unit], check=False, capture_output=True, timeout=15)
|
||||
if runtime.is_dir() and runtime.parent == Path("/run") and runtime.name == directory_name:
|
||||
shutil.rmtree(runtime)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
Reference in New Issue
Block a user