| # 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 sys |
| from typing import Any |
| |
| from cli.commands.base import BaseCommand |
| from daemon_manager.manager import UDS_PATH, DaemonManager |
| |
| |
| class Command(BaseCommand): |
| @staticmethod |
| def register_cli(subparsers: Any) -> None: |
| subparsers.add_parser("stop", help="Stop the daemon") |
| |
| @staticmethod |
| async def execute(args: argparse.Namespace) -> int: |
| return await stop_daemon() |
| |
| |
| async def stop_daemon() -> int: |
| """Stops the daemon using DaemonManager. |
| |
| Note: We do not wait for the process directly because the CLI is a |
| short-lived invocation and we do not persist the DaemonManager's process |
| handle across commands. Instead, `manager.stop()` gracefully requests the |
| daemon stop via UDS, which drains the socket connection before shutdown. |
| """ |
| manager = DaemonManager(socket_path=UDS_PATH) |
| try: |
| await manager.stop() |
| return 0 |
| except Exception as e: |
| print(f"Error stopping daemon: {e}", file=sys.stderr) |
| return 1 |