import asyncio
import sys
from aws_ssm_bridge import SessionManager, SsmError, configure_logging
async def run_on(manager: SessionManager, target: str, command: str) -> str:
session = await manager.start_session(
target,
document_name="AWS-StartNonInteractiveCommand",
parameters={"command": [command]},
)
try:
await session.wait_ready()
chunks = []
async def drain() -> None:
async for chunk in session.output():
chunks.append(chunk)
try:
await asyncio.wait_for(drain(), timeout=30.0)
except asyncio.TimeoutError:
pass
return b"".join(chunks).decode(errors="replace")
finally:
await session.terminate()
async def main() -> None:
configure_logging("warn")
command, *targets = sys.argv[1:]
manager = await SessionManager.new()
results = await asyncio.gather(
*(run_on(manager, target, command) for target in targets),
return_exceptions=True,
)
for target, result in zip(targets, results):
print(f"=== {target} ===")
if isinstance(result, SsmError):
print(f"failed: {result}")
elif isinstance(result, BaseException):
raise result
else:
print(result.strip())
asyncio.run(main())