43 lines
1.1 KiB
Python
43 lines
1.1 KiB
Python
|
|
#!/usr/bin/env python3
|
||
|
|
"""L3 probe for the bootstrap slice.
|
||
|
|
|
||
|
|
Runs under ``swactor.run`` and reports facts observable without any
|
||
|
|
data-plane primitives: context shape, wake readability, and descriptor
|
||
|
|
hygiene across an exec boundary.
|
||
|
|
"""
|
||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import os
|
||
|
|
import select
|
||
|
|
import subprocess
|
||
|
|
import sys
|
||
|
|
|
||
|
|
import swactor
|
||
|
|
|
||
|
|
_CHILD_CHECK = (
|
||
|
|
"import os, sys; "
|
||
|
|
"sys.exit(0 if sys.argv[1] not in os.listdir('/proc/self/fd') else 3)"
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
async def main(ctx: swactor.Context) -> None:
|
||
|
|
facts = [f"HAS_DATA={int(isinstance(ctx.data, swactor.DataPlane))}"]
|
||
|
|
|
||
|
|
wake = int(os.environ["SWACTOR_WAKE_FD"])
|
||
|
|
readable = bool(select.select([wake], [], [], 0)[0])
|
||
|
|
facts.append(f"WAKE_READABLE={int(readable)}")
|
||
|
|
|
||
|
|
# B5: a close_fds=False child must not see the CLOEXEC-armed wake fd.
|
||
|
|
child = subprocess.Popen(
|
||
|
|
[sys.executable, "-c", _CHILD_CHECK, str(wake)],
|
||
|
|
close_fds=False,
|
||
|
|
)
|
||
|
|
child.wait()
|
||
|
|
facts.append(f"WAKE_LEAKED={int(child.returncode == 3)}")
|
||
|
|
print(" ".join(facts))
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
swactor.run(main)
|