#!/usr/bin/env python3 """Постоянная sdbg-сессия: единственный владелец MAME для CLI/MCP/DAP.""" import argparse import json import signal import sys import threading from sdbg.model import DebugMap from sdbg.server import SessionController, SessionRpcServer from sdbg.session import DebugSession, SessionError from sdbg.transport import BridgeError, FileBridge def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('--build', required=True) parser.add_argument('--ipc', required=True) parser.add_argument('--session', required=True) parser.add_argument('--socket', required=True) parser.add_argument('--timeout', type=float, default=5) args = parser.parse_args() bridge = controller = server = None try: bridge = FileBridge(args.ipc, args.session, args.timeout) controller = SessionController(DebugSession(DebugMap(args.build), bridge)) server = SessionRpcServer(args.socket, controller) stop = lambda *_: threading.Thread(target=server.server.shutdown, daemon=True).start() signal.signal(signal.SIGTERM, stop) signal.signal(signal.SIGINT, stop) print(json.dumps({'ready': True, 'socket': args.socket, 'build_id': controller.attached['build_id']}, ensure_ascii=False), flush=True) server.serve_forever() return 0 except (BridgeError, SessionError, ValueError, OSError, KeyError) as error: print('sdbg-server: ' + str(error), file=sys.stderr) return 1 finally: if server is not None: server.close() if controller is not None: controller.close() elif bridge is not None: bridge.close() if __name__ == '__main__': sys.exit(main())