merge: testing → main (reconcile 2-week divergence)
This commit is contained in:
44
scripts/bus/pub.py
Executable file
44
scripts/bus/pub.py
Executable file
@@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Publish a single event to the local DECNET bus.
|
||||
|
||||
Usage: scripts/bus/pub.py <topic> [json-payload] [--type EVENT_TYPE]
|
||||
Examples:
|
||||
scripts/bus/pub.py topology.abc.status '{"state": "active"}'
|
||||
scripts/bus/pub.py topology.abc.mutation.applied '{"id": 1}' --type applied
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import asyncio
|
||||
import json
|
||||
import os
|
||||
|
||||
from decnet.bus.unix_client import UnixSocketBus
|
||||
|
||||
|
||||
async def main(topic: str, payload: dict, event_type: str) -> None:
|
||||
sock = os.environ.get("DECNET_BUS_SOCKET", "/tmp/decnet-bus.sock")
|
||||
client = UnixSocketBus(sock, client_name="scripts-pub")
|
||||
await client.connect()
|
||||
try:
|
||||
await client.publish(topic, payload, event_type=event_type)
|
||||
print(f"pub: {topic} type={event_type!r} payload={payload}")
|
||||
finally:
|
||||
await client.close()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument("topic")
|
||||
ap.add_argument("payload", nargs="?", default="{}", help="JSON object (default {})")
|
||||
ap.add_argument("--type", dest="event_type", default="", help="optional event_type tag")
|
||||
args = ap.parse_args()
|
||||
|
||||
try:
|
||||
payload = json.loads(args.payload)
|
||||
except json.JSONDecodeError as exc:
|
||||
raise SystemExit(f"pub: payload is not valid JSON: {exc}")
|
||||
if not isinstance(payload, dict):
|
||||
raise SystemExit("pub: payload must be a JSON object")
|
||||
|
||||
asyncio.run(main(args.topic, payload, args.event_type))
|
||||
Reference in New Issue
Block a user