| # Copyright 2026 The Fuchsia Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import argparse |
| import json |
| import sys |
| from typing import Any, Final |
| |
| from daemon_manager.manager import UDS_PATH, DaemonManager, DaemonManagerError |
| |
| DAEMON_STARTUP_TIMEOUT_SECS: Final[float] = 10.0 |
| |
| |
| from cli.commands.base import BaseCommand |
| |
| |
| class Command(BaseCommand): |
| @staticmethod |
| def register_cli(subparsers: Any) -> None: |
| start_parser = subparsers.add_parser("start", help="Start the daemon") |
| start_parser.add_argument( |
| "--port", type=int, help="Port for DAP server", default=None |
| ) |
| start_parser.add_argument( |
| "--connect", |
| action="store_true", |
| help="Connect to existing DAP server", |
| ) |
| |
| @staticmethod |
| async def execute(args: argparse.Namespace) -> int: |
| return await start_daemon(args.port, args.connect) |
| |
| |
| async def start_daemon( |
| port: int | None, connect_to_existing: bool = False |
| ) -> int: |
| """Spawns the daemon process and waits for it to be ready.""" |
| manager = DaemonManager( |
| socket_path=UDS_PATH, |
| port=port, |
| connect_to_existing=connect_to_existing, |
| startup_timeout=DAEMON_STARTUP_TIMEOUT_SECS, |
| ) |
| try: |
| proc = await manager.start() |
| if proc is None: |
| print( |
| json.dumps( |
| { |
| "success": True, |
| "message": "Connected to existing daemon", |
| } |
| ) |
| ) |
| else: |
| print( |
| json.dumps( |
| { |
| "success": True, |
| "message": "Daemon started successfully", |
| } |
| ) |
| ) |
| return 0 |
| except DaemonManagerError as e: |
| print( |
| json.dumps( |
| { |
| "success": False, |
| "message": str(e), |
| } |
| ), |
| file=sys.stderr, |
| ) |
| return 1 |
| except Exception as e: |
| print( |
| json.dumps( |
| { |
| "success": False, |
| "message": f"Failed to start daemon: {e}", |
| } |
| ), |
| file=sys.stderr, |
| ) |
| return 1 |