mirror of
https://github.com/PR0M3TH3AN/TORCH.git
synced 2026-10-27 07:51:52 +00:00
58 lines
1.9 KiB
Python
58 lines
1.9 KiB
Python
"""Explicit Linux qualification only; observe, never signal, one owned group."""
|
|
import json
|
|
import os
|
|
import select
|
|
import sys
|
|
import time
|
|
|
|
root = int(sys.argv[1])
|
|
expected_start = sys.argv[2]
|
|
|
|
|
|
def record(pid):
|
|
with open(f"/proc/{pid}/stat", encoding="utf8") as stream:
|
|
value = stream.read()
|
|
fields = value[value.rfind(")") + 2:].split()
|
|
return fields
|
|
|
|
|
|
assert record(root)[19] == expected_start, "Browser PID identity changed"
|
|
assert os.getpgid(root) == root, "Browser must own an isolated process group"
|
|
handles = []
|
|
executor = int(sys.argv[3])
|
|
assert record(executor)[19] == sys.argv[4], "Harness PID identity changed"
|
|
handles.append(os.pidfd_open(executor))
|
|
observed = 0
|
|
for entry in os.scandir("/proc"):
|
|
if not entry.name.isdigit():
|
|
continue
|
|
try:
|
|
fields = record(entry.name)
|
|
if int(fields[2]) != root or fields[0] in ("Z", "X"):
|
|
continue
|
|
observed += 1
|
|
handles.append(os.pidfd_open(int(entry.name)))
|
|
except ProcessLookupError:
|
|
pass
|
|
except FileNotFoundError:
|
|
pass
|
|
assert observed > 1, "Qualification must include real browser descendants"
|
|
print(json.dumps({"event": "watching", "observed": observed}), flush=True)
|
|
deadline = time.monotonic() + 30
|
|
remaining = set(handles)
|
|
while remaining:
|
|
ready, _, _ = select.select(list(remaining), [], [], max(0, deadline - time.monotonic()))
|
|
assert ready, "Owned browser group did not reach terminal state"
|
|
remaining.difference_update(ready)
|
|
for handle in handles:
|
|
os.close(handle)
|
|
for entry in os.scandir("/proc"):
|
|
if not entry.name.isdigit():
|
|
continue
|
|
try:
|
|
fields = record(entry.name)
|
|
assert int(fields[2]) != root or fields[0] in ("Z", "X"), "Live group member survived shutdown"
|
|
except FileNotFoundError:
|
|
pass
|
|
print(json.dumps({"event": "terminal", "observed": observed}), flush=True)
|