Files

49 lines
1.8 KiB
Python

#!/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())