Fix compose path: resolve real project path via list_projects API
_find_compose_path was constructing {compose_base_path}/{project_name}
which didn't match the actual NAS path (e.g. /volume1/docker/frostiq/jenkins).
Now calls _find_project() first and uses project["path"] as the base
directory, with the old constructed path as a fallback only.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -16,6 +16,8 @@ if TYPE_CHECKING:
|
||||
from mcp_synology_container.config import AppConfig
|
||||
from mcp_synology_container.dsm_client import DsmClient
|
||||
|
||||
from mcp_synology_container.modules.projects import _find_project
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Recognized compose file names (in priority order)
|
||||
@@ -42,10 +44,15 @@ def register_compose(mcp: FastMCP, config: AppConfig, client: DsmClient) -> None
|
||||
"""
|
||||
path = await _find_compose_path(client, config, project_name)
|
||||
if path is None:
|
||||
project = await _find_project(client, project_name)
|
||||
searched = (
|
||||
project.get("path", f"{config.compose_base_path}/{project_name}")
|
||||
if project
|
||||
else f"{config.compose_base_path}/{project_name}"
|
||||
)
|
||||
return (
|
||||
f"No compose file found for project '{project_name}'.\n"
|
||||
f"Looked in {config.compose_base_path}/{project_name}/ for: "
|
||||
+ ", ".join(_COMPOSE_FILENAMES)
|
||||
f"Looked in {searched}/ for: " + ", ".join(_COMPOSE_FILENAMES)
|
||||
)
|
||||
|
||||
try:
|
||||
@@ -295,22 +302,33 @@ async def _find_compose_path(
|
||||
) -> str | None:
|
||||
"""Find the compose file path for a project.
|
||||
|
||||
Tries each recognized filename under {compose_base_path}/{project_name}/.
|
||||
Resolves the project's real directory via SYNO.Docker.Project list,
|
||||
then probes each recognised filename under that directory.
|
||||
Falls back to {compose_base_path}/{project_name} when the project
|
||||
cannot be found in Container Manager.
|
||||
|
||||
Args:
|
||||
client: DsmClient instance.
|
||||
config: AppConfig with compose_base_path.
|
||||
config: AppConfig with compose_base_path (used as fallback).
|
||||
project_name: Project name.
|
||||
|
||||
Returns:
|
||||
Full path to the compose file if found, None otherwise.
|
||||
"""
|
||||
base = f"{config.compose_base_path}/{project_name}"
|
||||
project = await _find_project(client, project_name)
|
||||
if project is not None:
|
||||
base = project.get("path", "").rstrip("/")
|
||||
else:
|
||||
base = f"{config.compose_base_path}/{project_name}"
|
||||
logger.debug(
|
||||
"Project '%s' not found via API, falling back to base path: %s",
|
||||
project_name,
|
||||
base,
|
||||
)
|
||||
|
||||
for filename in _COMPOSE_FILENAMES:
|
||||
path = f"{base}/{filename}"
|
||||
try:
|
||||
# Try to list the file; if it exists, return the path
|
||||
await client.request(
|
||||
"SYNO.FileStation.Info",
|
||||
"get",
|
||||
|
||||
Reference in New Issue
Block a user