mirror of
https://github.com/BigBodyCobain/Shadowbroker.git
synced 2026-06-18 20:10:09 +02:00
89d6bb8fb9
Auto-relay connect DMs with End Contact severing, signed fleet prekey lookup, OpenClaw private Infonet channel intents, headless relay Tor bootstrap on redeploy, and swarm/DM live verification scripts. Co-authored-by: Cursor <cursoragent@cursor.com>
136 lines
4.9 KiB
Python
136 lines
4.9 KiB
Python
#!/usr/bin/env python3
|
|
"""Verify v1 Infonet swarm: fleet join, manifest peers, optional gate propagation."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
import time
|
|
import urllib.error
|
|
import urllib.request
|
|
|
|
API = os.environ.get("SHADOWBROKER_API", "http://127.0.0.1:8000").strip().rstrip("/")
|
|
MARKER = os.environ.get("SWARM_VERIFY_MARKER", f"SWARM-V1-{int(time.time())}")
|
|
|
|
|
|
def http_json(method: str, path: str, body: dict | None = None, *, timeout: int = 180) -> dict:
|
|
data = None
|
|
headers = {"Content-Type": "application/json"}
|
|
if body is not None:
|
|
data = json.dumps(body, separators=(",", ":"), sort_keys=True).encode("utf-8")
|
|
req = urllib.request.Request(f"{API}{path}", data=data, headers=headers, method=method.upper())
|
|
try:
|
|
with urllib.request.urlopen(req, timeout=timeout) as resp:
|
|
return json.loads(resp.read().decode("utf-8"))
|
|
except urllib.error.HTTPError as exc:
|
|
detail = exc.read().decode("utf-8", errors="replace")
|
|
raise RuntimeError(f"{method} {path} -> {exc.code}: {detail}") from exc
|
|
|
|
|
|
def docker_python(code: str) -> str:
|
|
proc = subprocess.run(
|
|
["docker", "exec", "shadowbroker-backend", "python", "-c", code],
|
|
capture_output=True,
|
|
text=True,
|
|
timeout=300,
|
|
check=False,
|
|
)
|
|
if proc.returncode != 0:
|
|
raise RuntimeError(proc.stderr.strip() or proc.stdout.strip() or "docker exec failed")
|
|
return proc.stdout.strip()
|
|
|
|
|
|
def step_ghcr_fleet_join() -> None:
|
|
out = docker_python(
|
|
"import json; "
|
|
"from services.mesh.mesh_fleet_defaults import infonet_fleet_join_enabled, FLEET_SEED_ONION_URL; "
|
|
"print(json.dumps({'fleet_join': infonet_fleet_join_enabled(), 'seed': FLEET_SEED_ONION_URL}))"
|
|
)
|
|
payload = json.loads(out)
|
|
if not payload.get("fleet_join"):
|
|
raise RuntimeError(f"fleet join disabled in container: {payload}")
|
|
if not str(payload.get("seed") or "").endswith(".onion:8000"):
|
|
raise RuntimeError(f"unexpected fleet seed: {payload}")
|
|
print("PASS: container has fleet join defaults")
|
|
|
|
|
|
def step_enable_node_and_join() -> dict:
|
|
code = r"""
|
|
import json
|
|
import main as main_mod
|
|
from services.mesh.mesh_swarm_runtime import (
|
|
announce_local_peer_to_seeds,
|
|
refresh_swarm_manifest_from_seeds,
|
|
)
|
|
|
|
main_mod._set_participant_node_enabled(True)
|
|
announce = announce_local_peer_to_seeds(force=True)
|
|
manifest = refresh_swarm_manifest_from_seeds(force=True)
|
|
print(json.dumps({
|
|
'ok': bool(announce.get('ok')) or bool(manifest.get('ok')),
|
|
'announce': announce,
|
|
'manifest_pull': manifest,
|
|
}))
|
|
"""
|
|
join = json.loads(docker_python(code))
|
|
print("swarm/join:", json.dumps(join, indent=2)[:4000])
|
|
if not join.get("ok"):
|
|
raise RuntimeError(f"swarm join failed: {join}")
|
|
manifest = join.get("manifest_pull") or {}
|
|
peer_count = int(manifest.get("merged_peer_count") or manifest.get("peer_count") or 0)
|
|
if peer_count < 1:
|
|
raise RuntimeError(f"manifest has no peers: {join}")
|
|
print(f"PASS: swarm join ok ({peer_count} manifest peer(s))")
|
|
return join
|
|
|
|
|
|
def step_manifest_lists_pete(join: dict) -> None:
|
|
manifest = join.get("manifest_pull") or {}
|
|
peer_count = int(manifest.get("merged_peer_count") or manifest.get("peer_count") or 0)
|
|
if peer_count < 2:
|
|
raise RuntimeError(f"expected fleet manifest with seed + participants, got: {manifest}")
|
|
code = r"""
|
|
import json
|
|
from services.mesh.mesh_router import authenticated_push_peer_urls
|
|
print(json.dumps({'push_peers': authenticated_push_peer_urls()[:12]}))
|
|
"""
|
|
payload = json.loads(docker_python(code))
|
|
push_peers = [p for p in payload.get("push_peers") or [] if p]
|
|
onion_peers = [p for p in push_peers if ".onion" in p]
|
|
print("sync peer store:", json.dumps(payload, indent=2))
|
|
if not onion_peers:
|
|
raise RuntimeError(f"expected onion peers in local sync store after manifest pull, got: {push_peers}")
|
|
print("PASS: manifest pull populated onion fleet peer(s)")
|
|
|
|
|
|
def step_gate_propagation() -> None:
|
|
try:
|
|
subprocess.run(
|
|
[sys.executable, os.path.join(os.path.dirname(__file__), "e2e_openclaw_infonet_agent_live.py")],
|
|
env={**os.environ, "E2E_MARKER": MARKER, "SHADOWBROKER_API": API},
|
|
check=True,
|
|
timeout=600,
|
|
)
|
|
print("PASS: gate event propagated across fleet")
|
|
except subprocess.CalledProcessError as exc:
|
|
raise RuntimeError(f"gate propagation check failed (exit {exc.returncode})") from exc
|
|
except FileNotFoundError:
|
|
print("SKIP: e2e_openclaw_infonet_agent_live.py not available")
|
|
|
|
|
|
def main() -> int:
|
|
print(f"Swarm v1 verify against {API}")
|
|
step_ghcr_fleet_join()
|
|
join = step_enable_node_and_join()
|
|
step_manifest_lists_pete(join)
|
|
if os.environ.get("SWARM_VERIFY_SKIP_PROPAGATION") != "1":
|
|
step_gate_propagation()
|
|
print("ALL SWARM V1 CHECKS PASSED")
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|