From 9481caa65ccf60603171b12a65b337390d6ae826 Mon Sep 17 00:00:00 2001 From: jongaudu <101347194+jongaudu@users.noreply.github.com> Date: Fri, 17 Jul 2026 10:06:47 -0400 Subject: [PATCH] added ncm_mcp_servers --- ncm_mcp_servers/Dockerfile | 22 + ncm_mcp_servers/README.md | 240 + ncm_mcp_servers/__init__.py | 7 + ncm_mcp_servers/__main__.py | 103 + ncm_mcp_servers/assets/screenshot.png | Bin 0 -> 578459 bytes ncm_mcp_servers/credentials.example.json | 7 + ncm_mcp_servers/docker-compose.yml | 14 + ncm_mcp_servers/entrypoint.sh | 38 + .../ncm_cloud_services/__init__.py | 5 + .../ncm_cloud_services/__main__.py | 3 + ncm_mcp_servers/ncm_cloud_services/server.py | 65 + .../ncm_cloud_services/tools/__init__.py | 22 + .../ncm_cloud_services/tools/exchange.py | 296 + .../tools/private_cellular.py | 290 + .../ncm_cloud_services/tools/subscriptions.py | 97 + .../ncm_cloud_services/tools/users.py | 109 + ncm_mcp_servers/ncm_fleet/__init__.py | 5 + ncm_mcp_servers/ncm_fleet/__main__.py | 3 + ncm_mcp_servers/ncm_fleet/server.py | 68 + ncm_mcp_servers/ncm_fleet/tools/__init__.py | 26 + ncm_mcp_servers/ncm_fleet/tools/accounts.py | 133 + .../ncm_fleet/tools/configurations.py | 130 + ncm_mcp_servers/ncm_fleet/tools/firmware.py | 78 + ncm_mcp_servers/ncm_fleet/tools/groups.py | 155 + ncm_mcp_servers/ncm_fleet/tools/locations.py | 109 + ncm_mcp_servers/ncm_fleet/tools/routers.py | 196 + ncm_mcp_servers/ncm_monitoring/__init__.py | 5 + ncm_mcp_servers/ncm_monitoring/__main__.py | 3 + ncm_mcp_servers/ncm_monitoring/server.py | 63 + .../ncm_monitoring/tools/__init__.py | 20 + .../ncm_monitoring/tools/alerts.py | 119 + .../ncm_monitoring/tools/net_devices.py | 123 + .../ncm_monitoring/tools/speed_tests.py | 89 + ncm_mcp_servers/pyproject.toml | 47 + ncm_mcp_servers/shared/__init__.py | 25 + ncm_mcp_servers/shared/client.py | 39 + ncm_mcp_servers/shared/credentials.py | 174 + ncm_mcp_servers/shared/error_handler.py | 197 + ncm_mcp_servers/shared/logging.py | 85 + ncm_mcp_servers/shared/ncm.py | 5394 +++++++++++++++++ 40 files changed, 8604 insertions(+) create mode 100644 ncm_mcp_servers/Dockerfile create mode 100644 ncm_mcp_servers/README.md create mode 100644 ncm_mcp_servers/__init__.py create mode 100644 ncm_mcp_servers/__main__.py create mode 100644 ncm_mcp_servers/assets/screenshot.png create mode 100644 ncm_mcp_servers/credentials.example.json create mode 100644 ncm_mcp_servers/docker-compose.yml create mode 100644 ncm_mcp_servers/entrypoint.sh create mode 100644 ncm_mcp_servers/ncm_cloud_services/__init__.py create mode 100644 ncm_mcp_servers/ncm_cloud_services/__main__.py create mode 100644 ncm_mcp_servers/ncm_cloud_services/server.py create mode 100644 ncm_mcp_servers/ncm_cloud_services/tools/__init__.py create mode 100644 ncm_mcp_servers/ncm_cloud_services/tools/exchange.py create mode 100644 ncm_mcp_servers/ncm_cloud_services/tools/private_cellular.py create mode 100644 ncm_mcp_servers/ncm_cloud_services/tools/subscriptions.py create mode 100644 ncm_mcp_servers/ncm_cloud_services/tools/users.py create mode 100644 ncm_mcp_servers/ncm_fleet/__init__.py create mode 100644 ncm_mcp_servers/ncm_fleet/__main__.py create mode 100644 ncm_mcp_servers/ncm_fleet/server.py create mode 100644 ncm_mcp_servers/ncm_fleet/tools/__init__.py create mode 100644 ncm_mcp_servers/ncm_fleet/tools/accounts.py create mode 100644 ncm_mcp_servers/ncm_fleet/tools/configurations.py create mode 100644 ncm_mcp_servers/ncm_fleet/tools/firmware.py create mode 100644 ncm_mcp_servers/ncm_fleet/tools/groups.py create mode 100644 ncm_mcp_servers/ncm_fleet/tools/locations.py create mode 100644 ncm_mcp_servers/ncm_fleet/tools/routers.py create mode 100644 ncm_mcp_servers/ncm_monitoring/__init__.py create mode 100644 ncm_mcp_servers/ncm_monitoring/__main__.py create mode 100644 ncm_mcp_servers/ncm_monitoring/server.py create mode 100644 ncm_mcp_servers/ncm_monitoring/tools/__init__.py create mode 100644 ncm_mcp_servers/ncm_monitoring/tools/alerts.py create mode 100644 ncm_mcp_servers/ncm_monitoring/tools/net_devices.py create mode 100644 ncm_mcp_servers/ncm_monitoring/tools/speed_tests.py create mode 100644 ncm_mcp_servers/pyproject.toml create mode 100644 ncm_mcp_servers/shared/__init__.py create mode 100644 ncm_mcp_servers/shared/client.py create mode 100644 ncm_mcp_servers/shared/credentials.py create mode 100644 ncm_mcp_servers/shared/error_handler.py create mode 100644 ncm_mcp_servers/shared/logging.py create mode 100644 ncm_mcp_servers/shared/ncm.py diff --git a/ncm_mcp_servers/Dockerfile b/ncm_mcp_servers/Dockerfile new file mode 100644 index 0000000..3d02fa6 --- /dev/null +++ b/ncm_mcp_servers/Dockerfile @@ -0,0 +1,22 @@ +FROM python:3.11-slim + +WORKDIR /app + +COPY pyproject.toml . +COPY __init__.py ./ncm_mcp_servers/ +COPY shared/ ./ncm_mcp_servers/shared/ +COPY ncm_fleet/ ./ncm_mcp_servers/ncm_fleet/ +COPY ncm_monitoring/ ./ncm_mcp_servers/ncm_monitoring/ +COPY ncm_cloud_services/ ./ncm_mcp_servers/ncm_cloud_services/ +COPY entrypoint.sh /app/entrypoint.sh + +RUN pip install --no-cache-dir -e . && chmod +x /app/entrypoint.sh + +ENV MCP_TRANSPORT=streamable-http +ENV NCM_FLEET_PORT=3001 +ENV NCM_MONITORING_PORT=3002 +ENV NCM_CLOUD_SERVICES_PORT=3003 + +EXPOSE 3001 3002 3003 + +ENTRYPOINT ["/app/entrypoint.sh"] diff --git a/ncm_mcp_servers/README.md b/ncm_mcp_servers/README.md new file mode 100644 index 0000000..ccd08db --- /dev/null +++ b/ncm_mcp_servers/README.md @@ -0,0 +1,240 @@ +# NCM MCP Servers + +![NCM MCP Servers](assets/screenshot.png) + +A suite of three focused MCP (Model Context Protocol) servers for the Ericsson Enterprise Wireless NCM API, split by domain responsibility for optimal LLM tool selection. + +## Architecture + +| Server | Port | Domain | Tools | +|--------|------|--------|-------| +| `ncm-fleet` | 3001 | Routers, groups, accounts, locations, configurations, firmware, products | 17 | +| `ncm-monitoring` | 3002 | Net devices, alerts/logs, speed tests | 6 | +| `ncm-cloud-services` | 3003 | Users, subscriptions, private cellular, exchange | 13 | + +All servers default to **Streamable HTTP transport** and run together in a single container. + +## Quick Start + +### 1. Install + +```bash +cd ncm_mcp_servers +pip install -e . +``` + +### 2. Configure Credentials + +Copy the example and fill in your values: + +```bash +cp credentials.example.json credentials.json +``` + +```json +{ + "X_CP_API_ID": "your-cp-api-id", + "X_CP_API_KEY": "your-cp-api-key", + "X_ECM_API_ID": "your-ecm-api-id", + "X_ECM_API_KEY": "your-ecm-api-key", + "NCM_API_TOKEN": "your-v3-bearer-token" +} +``` + +Alternatively, set environment variables with the same names. + +### 3. Run (Docker — recommended) + +```bash +docker compose up --build +``` + +Or build and run manually: + +```bash +docker build -t ncm-mcp-servers . +docker run -p 3001:3001 -p 3002:3002 -p 3003:3003 \ + -v ./credentials.json:/app/credentials.json:ro \ + ncm-mcp-servers +``` + +This starts a single container running all 3 servers: +- `http://localhost:3001/mcp` — ncm-fleet +- `http://localhost:3002/mcp` — ncm-monitoring +- `http://localhost:3003/mcp` — ncm-cloud-services + +### 4. Run (Local, without Docker) + +```bash +# Run all 3 servers in a single process (recommended for local dev) +ncm-mcp-servers + +# Or via python module +python -m ncm_mcp_servers +``` + +Run servers individually if you only need a subset: + +```bash +ncm-fleet # port 3001 +ncm-monitoring # port 3002 +ncm-cloud-services # port 3003 +``` + +Override ports via environment variables: +```bash +NCM_FLEET_PORT=4001 ncm-fleet +NCM_MONITORING_PORT=4002 ncm-monitoring +NCM_CLOUD_SERVICES_PORT=4003 ncm-cloud-services +``` + +### 5. Transport Options + +The default transport is **Streamable HTTP**. Supported transports: + +| Transport | Value | Use case | +|-----------|-------|----------| +| Streamable HTTP | `streamable-http` (default) | Recommended for all MCP clients | +| SSE | `sse` | Legacy MCP clients using Server-Sent Events | +| Stdio | `stdio` | Piped MCP clients (single server only) | + +```bash +# Use SSE transport (legacy) +MCP_TRANSPORT=sse ncm-mcp-servers + +# Use stdio (only works with individual servers, not the unified runner) +MCP_TRANSPORT=stdio ncm-fleet +``` + +## MCP Client Configuration + +Add to your MCP settings (e.g. `.kiro/settings/mcp.json`): + +```json +{ + "mcpServers": { + "ncm-fleet": { + "url": "http://localhost:3001/mcp" + }, + "ncm-monitoring": { + "url": "http://localhost:3002/mcp" + }, + "ncm-cloud-services": { + "url": "http://localhost:3003/mcp" + } + } +} +``` + +## Tool Consolidation Strategy + +CRUD operations are consolidated into `manage_*` tools with an `action` parameter: + +```python +manage_router(action="rename", router_id=123, new_name="foo") +manage_router(action="delete", router_id=123) +manage_router(action="update", router_id=123, description="bar") +``` + +Read-only metrics are consolidated by type: + +```python +get_net_device_metrics(metric_type="signal", net_device=1) +get_net_device_metrics(metric_type="usage", net_device=1) +get_net_device_metrics(metric_type="wan", net_device=1) +get_net_device_metrics(metric_type="modem", net_device=1) +``` + +## Project Structure + +``` +ncm_mcp_servers/ +├── pyproject.toml +├── Dockerfile +├── docker-compose.yml +├── entrypoint.sh +├── credentials.example.json +├── credentials.json # Your credentials (gitignored) +├── ncm_mcp_servers/ +│ ├── shared/ # Common utilities +│ │ ├── ncm.py # NCM API client library +│ │ ├── credentials.py # Credential loading +│ │ ├── error_handler.py # Response/error formatting +│ │ └── client.py # NCM client factory +│ ├── ncm_fleet/ # Fleet management server (port 3001) +│ │ ├── server.py +│ │ └── tools/ +│ │ ├── routers.py +│ │ ├── groups.py +│ │ ├── accounts.py +│ │ ├── locations.py +│ │ ├── configurations.py +│ │ └── firmware.py +│ ├── ncm_monitoring/ # Monitoring server (port 3002) +│ │ ├── server.py +│ │ └── tools/ +│ │ ├── net_devices.py +│ │ ├── alerts.py +│ │ └── speed_tests.py +│ └── ncm_cloud_services/ # Cloud services server (port 3003) +│ ├── server.py +│ └── tools/ +│ ├── users.py +│ ├── subscriptions.py +│ ├── private_cellular.py +│ └── exchange.py +└── README.md +``` + +## Tool Reference + +### ncm-fleet (17 tools) + +| Tool | Description | +|------|-------------| +| `get_routers` | Query routers by ID, name, account, or group | +| `manage_router` | Rename, delete, update fields, assign to group/account, remove from group | +| `reboot_router` | Reboot a single router | +| `reboot_group` | Reboot all routers in a group | +| `get_groups` | Query groups by ID, name, or account | +| `manage_group` | Create, rename, delete, update groups | +| `get_accounts` | Query accounts by ID or name | +| `manage_subaccount` | Create, rename, delete subaccounts | +| `get_locations` | Query current or historical locations | +| `manage_location` | Create or delete router locations | +| `get_configuration_managers` | Query config sync status | +| `patch_config` | Partial config update (router or group) | +| `put_router_config` | Full config replacement | +| `copy_router_config` | Copy config between routers | +| `resume_updates` | Resume suspended config sync | +| `get_firmware` | Query firmware versions by product | +| `get_products` | Query product catalog | + +### ncm-monitoring (6 tools) + +| Tool | Description | +|------|-------------| +| `get_net_devices` | Query net devices by router, mode, connection state | +| `get_net_device_health` | Get cellular health scores | +| `get_net_device_metrics` | Signal, usage, WAN, or modem metrics | +| `get_logs` | Alerts, recent alerts, router logs, or activity logs | +| `create_speed_test` | Run speed test on devices or all modems on a router | +| `get_speed_test` | Get speed test status and results | + +### ncm-cloud-services (13 tools) + +| Tool | Description | +|------|-------------| +| `get_users` | Query NCM users | +| `manage_user` | Create, update, delete users, change role | +| `get_subscriptions` | Query subscriptions | +| `manage_subscription` | Regrade or unlicense devices | +| `get_networks` | Query private cellular networks | +| `manage_network` | Create, update, delete networks | +| `get_radios` | Query radios and operational status | +| `manage_radio` | Update radio settings | +| `manage_sim` | Query or update SIMs | +| `get_exchange_sites` | Query exchange sites | +| `manage_exchange_site` | Create, update, delete sites | +| `get_exchange_resources` | Query exchange resources | +| `manage_exchange_resource` | Create, update, delete resources | diff --git a/ncm_mcp_servers/__init__.py b/ncm_mcp_servers/__init__.py new file mode 100644 index 0000000..8aaeb18 --- /dev/null +++ b/ncm_mcp_servers/__init__.py @@ -0,0 +1,7 @@ +"""NCM MCP Servers — a suite of focused MCP servers for Cradlepoint NCM. + +This package contains three specialized MCP servers: +- ncm_fleet: Router, group, account, location, configuration, and firmware management +- ncm_monitoring: Net device monitoring, alerts/logs, and speed tests +- ncm_cloud_services: Users, subscriptions, private cellular, and NetCloud Exchange +""" diff --git a/ncm_mcp_servers/__main__.py b/ncm_mcp_servers/__main__.py new file mode 100644 index 0000000..ab424e5 --- /dev/null +++ b/ncm_mcp_servers/__main__.py @@ -0,0 +1,103 @@ +"""Unified runner — starts all three NCM MCP servers concurrently. + +Usage: + python -m ncm_mcp_servers + +All servers run in a single process using asyncio. Each binds to its +own port (default: 3001, 3002, 3003). Transport defaults to Streamable HTTP. + +Environment variables: + MCP_TRANSPORT: "streamable-http" (default) or "sse" + NCM_FLEET_PORT: Fleet server port (default 3001) + NCM_MONITORING_PORT: Monitoring server port (default 3002) + NCM_CLOUD_SERVICES_PORT: Cloud services server port (default 3003) + LOG_LEVEL: Logging level (default INFO) +""" + +import asyncio +import os +import signal +import sys +from typing import cast + +from ncm_mcp_servers.shared.credentials import load_credentials +from ncm_mcp_servers.shared.logging import get_logger + +logger = get_logger("runner") + + +async def run_all() -> None: + """Start all three MCP servers concurrently.""" + credentials = load_credentials() + transport = os.environ.get("MCP_TRANSPORT", "streamable-http").lower() + + logger.info( + "Starting all NCM MCP servers", + extra={"transport": transport}, + ) + + # Import here to avoid circular import issues at module level + from ncm_mcp_servers.ncm_fleet.server import create_server as create_fleet + from ncm_mcp_servers.ncm_monitoring.server import create_server as create_monitoring + from ncm_mcp_servers.ncm_cloud_services.server import create_server as create_cloud + + fleet = create_fleet(credentials) + monitoring = create_monitoring(credentials) + cloud = create_cloud(credentials) + + # Select the async runner based on transport + if transport == "sse": + tasks = [ + asyncio.create_task(fleet.run_sse_async()), + asyncio.create_task(monitoring.run_sse_async()), + asyncio.create_task(cloud.run_sse_async()), + ] + else: + # Default: Streamable HTTP + tasks = [ + asyncio.create_task(fleet.run_streamable_http_async()), + asyncio.create_task(monitoring.run_streamable_http_async()), + asyncio.create_task(cloud.run_streamable_http_async()), + ] + + fleet_port = os.environ.get("NCM_FLEET_PORT", "3001") + monitoring_port = os.environ.get("NCM_MONITORING_PORT", "3002") + cloud_port = os.environ.get("NCM_CLOUD_SERVICES_PORT", "3003") + + logger.info(f" ncm-fleet -> port {fleet_port}") + logger.info(f" ncm-monitoring -> port {monitoring_port}") + logger.info(f" ncm-cloud-services -> port {cloud_port}") + + # Wait for all tasks; if one fails, cancel the rest + done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_EXCEPTION) + + for task in pending: + task.cancel() + + # Re-raise any exceptions from completed tasks + for task in done: + if task.exception(): + raise task.exception() + + +def main() -> None: + """Entry point for unified server runner.""" + # Handle Ctrl+C gracefully + def handle_signal(sig, frame): + logger.info("Shutting down...") + sys.exit(0) + + signal.signal(signal.SIGINT, handle_signal) + signal.signal(signal.SIGTERM, handle_signal) + + try: + asyncio.run(run_all()) + except ValueError as exc: + logger.error("Failed to start servers", extra={"error": str(exc)}) + sys.exit(1) + except KeyboardInterrupt: + logger.info("Shutting down...") + + +if __name__ == "__main__": + main() diff --git a/ncm_mcp_servers/assets/screenshot.png b/ncm_mcp_servers/assets/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..d07a8c040e565577e0e07d338aa4059f54db7e19 GIT binary patch literal 578459 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%0ASOJ{mL832$Gw( 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 literal 0 HcmV?d00001 diff --git a/ncm_mcp_servers/credentials.example.json b/ncm_mcp_servers/credentials.example.json new file mode 100644 index 0000000..6f83b2e --- /dev/null +++ b/ncm_mcp_servers/credentials.example.json @@ -0,0 +1,7 @@ +{ + "X_CP_API_ID": "your-cp-api-id", + "X_CP_API_KEY": "your-cp-api-key", + "X_ECM_API_ID": "your-ecm-api-id", + "X_ECM_API_KEY": "your-ecm-api-key", + "NCM_API_TOKEN": "your-v3-bearer-token" +} diff --git a/ncm_mcp_servers/docker-compose.yml b/ncm_mcp_servers/docker-compose.yml new file mode 100644 index 0000000..a2b0e63 --- /dev/null +++ b/ncm_mcp_servers/docker-compose.yml @@ -0,0 +1,14 @@ +services: + ncm-mcp: + build: . + ports: + - "3001:3001" + - "3002:3002" + - "3003:3003" + environment: + - MCP_TRANSPORT=streamable-http + - NCM_FLEET_PORT=3001 + - NCM_MONITORING_PORT=3002 + - NCM_CLOUD_SERVICES_PORT=3003 + volumes: + - ./credentials.json:/app/credentials.json:ro diff --git a/ncm_mcp_servers/entrypoint.sh b/ncm_mcp_servers/entrypoint.sh new file mode 100644 index 0000000..79af058 --- /dev/null +++ b/ncm_mcp_servers/entrypoint.sh @@ -0,0 +1,38 @@ +#!/bin/bash +# Start all three NCM MCP servers in a single container. +# Each server runs on its own port (default: 3001, 3002, 3003). +set -e + +PIDS=() + +# Trap SIGTERM/SIGINT and forward to child processes +cleanup() { + echo "Received shutdown signal. Stopping servers..." + for pid in "${PIDS[@]}"; do + kill "$pid" 2>/dev/null + done + wait + exit 0 +} +trap cleanup SIGTERM SIGINT + +echo "Starting NCM MCP Servers..." +echo " ncm-fleet -> port ${NCM_FLEET_PORT:-3001}" +echo " ncm-monitoring -> port ${NCM_MONITORING_PORT:-3002}" +echo " ncm-cloud-services -> port ${NCM_CLOUD_SERVICES_PORT:-3003}" + +python -m ncm_mcp_servers.ncm_fleet & +PIDS+=($!) + +python -m ncm_mcp_servers.ncm_monitoring & +PIDS+=($!) + +python -m ncm_mcp_servers.ncm_cloud_services & +PIDS+=($!) + +# Wait for any process to exit +wait -n +EXIT_CODE=$? + +echo "A server process exited (code=$EXIT_CODE). Shutting down..." +cleanup diff --git a/ncm_mcp_servers/ncm_cloud_services/__init__.py b/ncm_mcp_servers/ncm_cloud_services/__init__.py new file mode 100644 index 0000000..7e8fce4 --- /dev/null +++ b/ncm_mcp_servers/ncm_cloud_services/__init__.py @@ -0,0 +1,5 @@ +"""NCM Cloud Services MCP Server. + +Manages users, subscriptions, private cellular networks, and NetCloud Exchange +via the NCM v3 API. +""" diff --git a/ncm_mcp_servers/ncm_cloud_services/__main__.py b/ncm_mcp_servers/ncm_cloud_services/__main__.py new file mode 100644 index 0000000..2d6af74 --- /dev/null +++ b/ncm_mcp_servers/ncm_cloud_services/__main__.py @@ -0,0 +1,3 @@ +"""Allow running with ``python -m ncm_mcp_servers.ncm_cloud_services``.""" +from ncm_mcp_servers.ncm_cloud_services.server import main +main() diff --git a/ncm_mcp_servers/ncm_cloud_services/server.py b/ncm_mcp_servers/ncm_cloud_services/server.py new file mode 100644 index 0000000..9622531 --- /dev/null +++ b/ncm_mcp_servers/ncm_cloud_services/server.py @@ -0,0 +1,65 @@ +"""NCM Cloud Services MCP Server entry point. + +Manages users, subscriptions, private cellular networks, and +NetCloud Exchange via the NCM v3 API. + +Tools (13 total): +- get_users, manage_user +- get_subscriptions, manage_subscription +- get_networks, manage_network, get_radios, manage_radio, manage_sim +- get_exchange_sites, manage_exchange_site, get_exchange_resources, + manage_exchange_resource +""" + +import os +import sys +from typing import Optional, cast + +from mcp.server.fastmcp import FastMCP + +from ncm_mcp_servers.shared.credentials import ApiCredentials, load_credentials +from ncm_mcp_servers.shared.client import get_ncm_client +from ncm_mcp_servers.shared.logging import get_logger +from ncm_mcp_servers.ncm_cloud_services.tools import register_all + +logger = get_logger("ncm_cloud_services") + + +def create_server( + credentials: Optional[ApiCredentials] = None, +) -> FastMCP: + """Creates and configures the cloud services MCP server.""" + if credentials is None: + credentials = load_credentials() + + credentials.validate(require_v3=True) + client = get_ncm_client(credentials) + v3_client = client.v3 if hasattr(client, 'v3') else client + + transport = os.environ.get("MCP_TRANSPORT", "streamable-http").lower() + port = int(os.environ.get("NCM_CLOUD_SERVICES_PORT", "3003")) + + if transport == "sse": + mcp = FastMCP("ncm-cloud-services", host="0.0.0.0", port=port) + else: + mcp = FastMCP("ncm-cloud-services", host="0.0.0.0", port=port) + + register_all(mcp, v3_client) # type: ignore[arg-type] + logger.info("Server configured", extra={"transport": transport, "port": port}) + return mcp + + +def main() -> None: + """Entry point for ncm-cloud-services server.""" + try: + server = create_server() + transport = cast(str, os.environ.get("MCP_TRANSPORT", "streamable-http")).lower() + logger.info("Starting ncm-cloud-services server") + server.run(transport=transport) # type: ignore[arg-type] + except ValueError as exc: + logger.error("Failed to start server", extra={"error": str(exc)}) + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/ncm_mcp_servers/ncm_cloud_services/tools/__init__.py b/ncm_mcp_servers/ncm_cloud_services/tools/__init__.py new file mode 100644 index 0000000..6683a31 --- /dev/null +++ b/ncm_mcp_servers/ncm_cloud_services/tools/__init__.py @@ -0,0 +1,22 @@ +"""NCM Cloud Services tools registration.""" + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from mcp.server.fastmcp import FastMCP + from ncm_mcp_servers.shared.ncm import NcmClientv3 + +from ncm_mcp_servers.ncm_cloud_services.tools import ( + users, + subscriptions, + private_cellular, + exchange, +) + + +def register_all(mcp: "FastMCP", client: "NcmClientv3") -> None: + """Registers all cloud services tools with the MCP server.""" + users.register(mcp, client) + subscriptions.register(mcp, client) + private_cellular.register(mcp, client) + exchange.register(mcp, client) diff --git a/ncm_mcp_servers/ncm_cloud_services/tools/exchange.py b/ncm_mcp_servers/ncm_cloud_services/tools/exchange.py new file mode 100644 index 0000000..51ef6c7 --- /dev/null +++ b/ncm_mcp_servers/ncm_cloud_services/tools/exchange.py @@ -0,0 +1,296 @@ +"""MCP tools for NCM exchange site and resource management. + +Consolidates exchange operations into: +- get_exchange_sites: Query exchange sites +- manage_exchange_site: Create, update, delete sites +- get_exchange_resources: Query exchange resources +- manage_exchange_resource: Create, update, delete resources +""" + +from typing import List, Optional + +from ncm_mcp_servers.shared.error_handler import ( + handle_exception, + handle_ncm_response, + validate_required_params, +) + + +def register(mcp, client): + """Register exchange management tools.""" + + @mcp.tool() + def get_exchange_sites( + site_id: Optional[str] = None, + exchange_network_id: Optional[str] = None, + name: Optional[str] = None, + limit: Optional[int] = None, + ) -> dict: + """Retrieve exchange sites with optional filtering by ID, name, or network.""" + try: + kwargs = {} + if limit is not None: + kwargs["limit"] = limit + result = client.get_exchange_sites( + site_id=site_id, + exchange_network_id=exchange_network_id, + name=name, + **kwargs, + ) + return handle_ncm_response(result, "get_exchange_sites") + except Exception as e: + return handle_exception(e, "get_exchange_sites") + + @mcp.tool() + def manage_exchange_site( + action: str = None, + site_id: Optional[str] = None, + site_name: Optional[str] = None, + name: Optional[str] = None, + exchange_network_id: Optional[str] = None, + router_id: Optional[str] = None, + primary_dns: Optional[str] = None, + secondary_dns: Optional[str] = None, + lan_as_dns: Optional[bool] = None, + local_domain: Optional[str] = None, + tags: Optional[List[str]] = None, + ) -> dict: + """Manage exchange site lifecycle operations. + + Actions: + - "create": Create a new site. Requires name, exchange_network_id, router_id. + Optional: primary_dns, secondary_dns, lan_as_dns, local_domain, tags. + - "update": Update a site. Requires site_id or name. + Optional: primary_dns, secondary_dns, lan_as_dns, local_domain, tags. + - "delete": Delete a site. Requires site_id or site_name. + """ + try: + err = validate_required_params(action=action) + if err is not None: + return err + + if action == "create": + err = validate_required_params( + name=name, + exchange_network_id=exchange_network_id, + router_id=router_id, + ) + if err is not None: + return err + kwargs = {} + if primary_dns is not None: + kwargs["primary_dns"] = primary_dns + if secondary_dns is not None: + kwargs["secondary_dns"] = secondary_dns + if lan_as_dns is not None: + kwargs["lan_as_dns"] = lan_as_dns + if local_domain is not None: + kwargs["local_domain"] = local_domain + if tags is not None: + kwargs["tags"] = tags + result = client.create_exchange_site( + name, exchange_network_id, router_id, **kwargs + ) + + elif action == "update": + if site_id is None and name is None: + return { + "success": False, + "error": { + "code": 400, + "message": "Missing required parameters", + "details": "Provide either site_id or name", + }, + "operation": "manage_exchange_site", + } + kwargs = {} + if primary_dns is not None: + kwargs["primary_dns"] = primary_dns + if secondary_dns is not None: + kwargs["secondary_dns"] = secondary_dns + if lan_as_dns is not None: + kwargs["lan_as_dns"] = lan_as_dns + if local_domain is not None: + kwargs["local_domain"] = local_domain + if tags is not None: + kwargs["tags"] = tags + result = client.update_exchange_site( + site_id=site_id, name=name, **kwargs + ) + + elif action == "delete": + if site_id is None and site_name is None: + return { + "success": False, + "error": { + "code": 400, + "message": "Missing required parameters", + "details": "Provide either site_id or site_name", + }, + "operation": "manage_exchange_site", + } + result = client.delete_exchange_site( + site_id=site_id, site_name=site_name + ) + + else: + return { + "success": False, + "error": { + "code": 400, + "message": "Invalid action", + "details": "Valid actions: create, update, delete", + }, + "operation": "manage_exchange_site", + } + + return handle_ncm_response(result, "manage_exchange_site") + except Exception as e: + return handle_exception(e, "manage_exchange_site") + + @mcp.tool() + def get_exchange_resources( + site_id: Optional[str] = None, + exchange_network_id: Optional[str] = None, + resource_id: Optional[str] = None, + site_name: Optional[str] = None, + limit: Optional[int] = None, + ) -> dict: + """Retrieve exchange resources with optional filtering.""" + try: + kwargs = {} + if limit is not None: + kwargs["limit"] = limit + result = client.get_exchange_resources( + site_id=site_id, + exchange_network_id=exchange_network_id, + resource_id=resource_id, + site_name=site_name, + **kwargs, + ) + return handle_ncm_response(result, "get_exchange_resources") + except Exception as e: + return handle_exception(e, "get_exchange_resources") + + @mcp.tool() + def manage_exchange_resource( + action: str = None, + resource_id: Optional[str] = None, + resource_name: Optional[str] = None, + resource_type: Optional[str] = None, + site_id: Optional[str] = None, + site_name: Optional[str] = None, + domain: Optional[str] = None, + ip: Optional[str] = None, + protocols: Optional[List[str]] = None, + tags: Optional[List[str]] = None, + static_prime_ip: Optional[str] = None, + port_ranges: Optional[List[str]] = None, + name: Optional[str] = None, + ) -> dict: + """Manage exchange resource lifecycle operations. + + Actions: + - "create": Create a resource. Requires resource_name, resource_type, + (site_id or site_name). resource_type must be one of: + exchange_fqdn_resources, exchange_wildcard_fqdn_resources, + or exchange_ipsubnet_resources. + Optional: domain, ip, protocols, tags, static_prime_ip, port_ranges. + - "update": Update a resource. Requires resource_id. + Optional: name, protocols, tags, domain, ip, static_prime_ip, port_ranges. + - "delete": Delete resources. Requires resource_id, site_name, or site_id. + """ + try: + err = validate_required_params(action=action) + if err is not None: + return err + + if action == "create": + err = validate_required_params( + resource_name=resource_name, resource_type=resource_type + ) + if err is not None: + return err + if site_id is None and site_name is None: + return { + "success": False, + "error": { + "code": 400, + "message": "Missing required parameters", + "details": "Provide either site_id or site_name", + }, + "operation": "manage_exchange_resource", + } + kwargs = {} + if domain is not None: + kwargs["domain"] = domain + if ip is not None: + kwargs["ip"] = ip + if protocols is not None: + kwargs["protocols"] = protocols + if tags is not None: + kwargs["tags"] = tags + if static_prime_ip is not None: + kwargs["static_prime_ip"] = static_prime_ip + if port_ranges is not None: + kwargs["port_ranges"] = port_ranges + result = client.create_exchange_resource( + resource_name, + resource_type, + site_id=site_id, + site_name=site_name, + **kwargs, + ) + + elif action == "update": + err = validate_required_params(resource_id=resource_id) + if err is not None: + return err + kwargs = {} + if name is not None: + kwargs["name"] = name + if protocols is not None: + kwargs["protocols"] = protocols + if tags is not None: + kwargs["tags"] = tags + if domain is not None: + kwargs["domain"] = domain + if ip is not None: + kwargs["ip"] = ip + if static_prime_ip is not None: + kwargs["static_prime_ip"] = static_prime_ip + if port_ranges is not None: + kwargs["port_ranges"] = port_ranges + result = client.update_exchange_resource(resource_id, **kwargs) + + elif action == "delete": + if resource_id is None and site_name is None and site_id is None: + return { + "success": False, + "error": { + "code": 400, + "message": "Missing required parameters", + "details": "Provide resource_id, site_name, or site_id", + }, + "operation": "manage_exchange_resource", + } + result = client.delete_exchange_resource( + resource_id=resource_id, + site_name=site_name, + site_id=site_id, + ) + + else: + return { + "success": False, + "error": { + "code": 400, + "message": "Invalid action", + "details": "Valid actions: create, update, delete", + }, + "operation": "manage_exchange_resource", + } + + return handle_ncm_response(result, "manage_exchange_resource") + except Exception as e: + return handle_exception(e, "manage_exchange_resource") diff --git a/ncm_mcp_servers/ncm_cloud_services/tools/private_cellular.py b/ncm_mcp_servers/ncm_cloud_services/tools/private_cellular.py new file mode 100644 index 0000000..3b4f0ee --- /dev/null +++ b/ncm_mcp_servers/ncm_cloud_services/tools/private_cellular.py @@ -0,0 +1,290 @@ +"""MCP tools for NCM private cellular network management. + +Consolidates private cellular operations into: +- get_networks: Query private cellular networks +- manage_network: Create, update, delete networks +- get_radios: Query radios and their statuses +- manage_radio: Update radio settings +- manage_sim: Query and update SIMs +""" + +from typing import Optional + +from ncm_mcp_servers.shared.error_handler import ( + handle_exception, + handle_ncm_response, + validate_required_params, +) + + +def register(mcp, client): + """Register private cellular management tools.""" + + @mcp.tool() + def get_networks( + network_id: Optional[str] = None, + name: Optional[str] = None, + status: Optional[str] = None, + limit: Optional[int] = None, + ) -> dict: + """Retrieve private cellular networks with optional filtering.""" + try: + if network_id is not None: + result = client.get_private_cellular_network(network_id) + return handle_ncm_response(result, "get_networks") + kwargs = {} + if name is not None: + kwargs["name"] = name + if status is not None: + kwargs["status"] = status + if limit is not None: + kwargs["limit"] = limit + result = client.get_private_cellular_networks(**kwargs) + return handle_ncm_response(result, "get_networks") + except Exception as e: + return handle_exception(e, "get_networks") + + @mcp.tool() + def manage_network( + action: str = None, + network_id: Optional[str] = None, + name: Optional[str] = None, + core_ip: Optional[str] = None, + ha_enabled: Optional[bool] = None, + mobility_gateway_virtual_ip: Optional[str] = None, + mobility_gateways: Optional[str] = None, + ) -> dict: + """Manage private cellular network lifecycle. + + Actions: + - "create": Create a network. Requires name + core_ip. + Optional: ha_enabled, mobility_gateway_virtual_ip, mobility_gateways. + - "update": Update a network. Requires network_id or name. + Optional: core_ip, ha_enabled, mobility_gateway_virtual_ip. + - "delete": Delete a network. Requires network_id. + """ + try: + err = validate_required_params(action=action) + if err is not None: + return err + + if action == "create": + err = validate_required_params(name=name, core_ip=core_ip) + if err is not None: + return err + result = client.create_private_cellular_network( + name, + core_ip, + ha_enabled=ha_enabled if ha_enabled is not None else False, + mobility_gateway_virtual_ip=mobility_gateway_virtual_ip, + mobility_gateways=mobility_gateways, + ) + + elif action == "update": + if network_id is None and name is None: + return { + "success": False, + "error": { + "code": 400, + "message": "Missing required parameters", + "details": "Provide either network_id or name", + }, + "operation": "manage_network", + } + kwargs = {} + if core_ip is not None: + kwargs["core_ip"] = core_ip + if ha_enabled is not None: + kwargs["ha_enabled"] = ha_enabled + if mobility_gateway_virtual_ip is not None: + kwargs["mobility_gateway_virtual_ip"] = mobility_gateway_virtual_ip + result = client.update_private_cellular_network( + id=network_id, name=name, **kwargs + ) + + elif action == "delete": + err = validate_required_params(network_id=network_id) + if err is not None: + return err + result = client.delete_private_cellular_network(network_id) + + else: + return { + "success": False, + "error": { + "code": 400, + "message": "Invalid action", + "details": "Valid actions: create, update, delete", + }, + "operation": "manage_network", + } + + return handle_ncm_response(result, "manage_network") + except Exception as e: + return handle_exception(e, "manage_network") + + @mcp.tool() + def get_radios( + radio_id: Optional[str] = None, + network: Optional[str] = None, + name: Optional[str] = None, + status: Optional[str] = None, + include_status: bool = False, + online_status: Optional[str] = None, + limit: Optional[int] = None, + ) -> dict: + """Retrieve private cellular radios or their operational statuses. + + Args: + radio_id: Get a specific radio by ID. + network: Filter by network. + name: Filter by name. + status: Filter by admin state. + include_status: If True, retrieves operational status instead of radio config. + online_status: Filter operational status (only when include_status=True). + limit: Max results. + """ + try: + if include_status: + kwargs = {} + if online_status is not None: + kwargs["online_status"] = online_status + if limit is not None: + kwargs["limit"] = limit + if radio_id is not None: + result = client.get_private_cellular_radio_status(radio_id) + else: + result = client.get_private_cellular_radio_statuses(**kwargs) + else: + if radio_id is not None: + result = client.get_private_cellular_radio(radio_id) + else: + kwargs = {} + if network is not None: + kwargs["network"] = network + if name is not None: + kwargs["name"] = name + if status is not None: + kwargs["admin_state"] = status + if limit is not None: + kwargs["limit"] = limit + result = client.get_private_cellular_radios(**kwargs) + return handle_ncm_response(result, "get_radios") + except Exception as e: + return handle_exception(e, "get_radios") + + @mcp.tool() + def manage_radio( + radio_id: Optional[str] = None, + name: Optional[str] = None, + admin_state: Optional[str] = None, + description: Optional[str] = None, + network: Optional[str] = None, + tx_power: Optional[int] = None, + ) -> dict: + """Update a private cellular radio by ID or name. + + Requires radio_id or name to identify the radio. + Optional fields to update: admin_state, description, network, tx_power. + """ + try: + if radio_id is None and name is None: + return { + "success": False, + "error": { + "code": 400, + "message": "Missing required parameters", + "details": "Provide either radio_id or name", + }, + "operation": "manage_radio", + } + kwargs = {} + if admin_state is not None: + kwargs["admin_state"] = admin_state + if description is not None: + kwargs["description"] = description + if network is not None: + kwargs["network"] = network + if tx_power is not None: + kwargs["tx_power"] = tx_power + result = client.update_private_cellular_radio( + id=radio_id, name=name, **kwargs + ) + return handle_ncm_response(result, "manage_radio") + except Exception as e: + return handle_exception(e, "manage_radio") + + @mcp.tool() + def manage_sim( + action: str = None, + sim_id: Optional[str] = None, + iccid: Optional[str] = None, + imsi: Optional[str] = None, + network: Optional[str] = None, + name: Optional[str] = None, + state: Optional[str] = None, + limit: Optional[int] = None, + ) -> dict: + """Query or update private cellular SIMs. + + Actions: + - "get": Retrieve SIMs. Optional filters: sim_id, network, iccid, name, limit. + - "update": Update a SIM. Requires sim_id, iccid, or imsi. + Optional: name, state, network. + """ + try: + err = validate_required_params(action=action) + if err is not None: + return err + + if action == "get": + if sim_id is not None: + result = client.get_private_cellular_sim(sim_id) + else: + kwargs = {} + if network is not None: + kwargs["network"] = network + if iccid is not None: + kwargs["iccid"] = iccid + if name is not None: + kwargs["name"] = name + if limit is not None: + kwargs["limit"] = limit + result = client.get_private_cellular_sims(**kwargs) + + elif action == "update": + if sim_id is None and iccid is None and imsi is None: + return { + "success": False, + "error": { + "code": 400, + "message": "Missing required parameters", + "details": "Provide sim_id, iccid, or imsi", + }, + "operation": "manage_sim", + } + kwargs = {} + if name is not None: + kwargs["name"] = name + if state is not None: + kwargs["state"] = state + if network is not None: + kwargs["network"] = network + result = client.update_private_cellular_sim( + id=sim_id, iccid=iccid, imsi=imsi, **kwargs + ) + + else: + return { + "success": False, + "error": { + "code": 400, + "message": "Invalid action", + "details": "Valid actions: get, update", + }, + "operation": "manage_sim", + } + + return handle_ncm_response(result, "manage_sim") + except Exception as e: + return handle_exception(e, "manage_sim") diff --git a/ncm_mcp_servers/ncm_cloud_services/tools/subscriptions.py b/ncm_mcp_servers/ncm_cloud_services/tools/subscriptions.py new file mode 100644 index 0000000..d8e053b --- /dev/null +++ b/ncm_mcp_servers/ncm_cloud_services/tools/subscriptions.py @@ -0,0 +1,97 @@ +"""MCP tools for NCM subscription and licensing management. + +Provides: +- get_subscriptions: Query subscriptions +- manage_subscription: Upgrade/downgrade/unlicense devices +""" + +from typing import List, Optional + +from ncm_mcp_servers.shared.error_handler import ( + handle_exception, + handle_ncm_response, + validate_required_params, +) + + +def register(mcp, client): + """Register subscription management tools.""" + + @mcp.tool() + def get_subscriptions( + subscription_id: Optional[str] = None, + name: Optional[str] = None, + tenant: Optional[str] = None, + subscription_type: Optional[str] = None, + limit: Optional[int] = None, + ) -> dict: + """Retrieve subscriptions with optional filtering by ID, name, tenant, or type.""" + try: + kwargs = {} + if subscription_id is not None: + kwargs["id"] = subscription_id + if name is not None: + kwargs["name"] = name + if tenant is not None: + kwargs["tenant"] = tenant + if subscription_type is not None: + kwargs["type"] = subscription_type + if limit is not None: + kwargs["limit"] = limit + result = client.get_subscriptions(**kwargs) + return handle_ncm_response(result, "get_subscriptions") + except Exception as e: + return handle_exception(e, "get_subscriptions") + + @mcp.tool() + def manage_subscription( + action: str = None, + subscription_id: Optional[str] = None, + mac: Optional[str] = None, + mac_addresses: Optional[List[str]] = None, + regrade_action: Optional[str] = "UPGRADE", + ) -> dict: + """Manage device subscriptions and licensing. + + Actions: + - "regrade": Upgrade or downgrade a device subscription. + Requires subscription_id + mac. Optional: regrade_action + ("UPGRADE" or "DOWNGRADE", default "UPGRADE"). + - "unlicense": Remove licenses from devices. + Requires mac_addresses (list of MAC addresses). + """ + try: + err = validate_required_params(action=action) + if err is not None: + return err + + if action == "regrade": + err = validate_required_params( + subscription_id=subscription_id, mac=mac + ) + if err is not None: + return err + result = client.regrade( + subscription_id, mac, action=regrade_action + ) + + elif action == "unlicense": + err = validate_required_params(mac_addresses=mac_addresses) + if err is not None: + return err + result = client.unlicense_devices(mac_addresses) + + else: + return { + "success": False, + "error": { + "code": 400, + "message": "Invalid action", + "details": "Valid actions: regrade, unlicense", + }, + "operation": "manage_subscription", + } + + return handle_ncm_response(result, "manage_subscription") + except Exception as e: + return handle_exception(e, "manage_subscription") diff --git a/ncm_mcp_servers/ncm_cloud_services/tools/users.py b/ncm_mcp_servers/ncm_cloud_services/tools/users.py new file mode 100644 index 0000000..4fc2ab5 --- /dev/null +++ b/ncm_mcp_servers/ncm_cloud_services/tools/users.py @@ -0,0 +1,109 @@ +"""MCP tools for NCM user management. + +Consolidates user CRUD into: +- get_users: Query/list users +- manage_user: Create, update, delete, change role +""" + +from typing import Optional + +from ncm_mcp_servers.shared.error_handler import ( + handle_exception, + handle_ncm_response, + validate_required_params, +) + + +def register(mcp, client): + """Register user management tools.""" + + @mcp.tool() + def get_users( + email: Optional[str] = None, + first_name: Optional[str] = None, + last_name: Optional[str] = None, + is_active: Optional[bool] = None, + limit: Optional[int] = None, + ) -> dict: + """Retrieve NCM users with optional filtering by email, name, or active status.""" + try: + kwargs = {} + if email is not None: + kwargs["email"] = email + if first_name is not None: + kwargs["first_name"] = first_name + if last_name is not None: + kwargs["last_name"] = last_name + if is_active is not None: + kwargs["is_active"] = is_active + if limit is not None: + kwargs["limit"] = limit + result = client.get_users(**kwargs) + return handle_ncm_response(result, "get_users") + except Exception as e: + return handle_exception(e, "get_users") + + @mcp.tool() + def manage_user( + action: str = None, + email: str = None, + first_name: Optional[str] = None, + last_name: Optional[str] = None, + is_active: Optional[bool] = None, + new_role: Optional[str] = None, + ) -> dict: + """Manage NCM user lifecycle operations. + + Actions: + - "create": Create a new user. Requires email, first_name, last_name. + - "update": Update user details. Requires email + any of + first_name, last_name, is_active. + - "delete": Delete a user. Requires email. + - "change_role": Change user role. Requires email + new_role. + """ + try: + err = validate_required_params(action=action, email=email) + if err is not None: + return err + + if action == "create": + err = validate_required_params( + first_name=first_name, last_name=last_name + ) + if err is not None: + return err + result = client.create_user(email, first_name, last_name) + + elif action == "update": + kwargs = {} + if first_name is not None: + kwargs["first_name"] = first_name + if last_name is not None: + kwargs["last_name"] = last_name + if is_active is not None: + kwargs["is_active"] = is_active + result = client.update_user(email, **kwargs) + + elif action == "delete": + result = client.delete_user(email) + + elif action == "change_role": + err = validate_required_params(new_role=new_role) + if err is not None: + return err + result = client.update_user_role(email, new_role) + + else: + return { + "success": False, + "error": { + "code": 400, + "message": "Invalid action", + "details": "Valid actions: create, update, delete, change_role", + }, + "operation": "manage_user", + } + + return handle_ncm_response(result, "manage_user") + except Exception as e: + return handle_exception(e, "manage_user") diff --git a/ncm_mcp_servers/ncm_fleet/__init__.py b/ncm_mcp_servers/ncm_fleet/__init__.py new file mode 100644 index 0000000..0285c20 --- /dev/null +++ b/ncm_mcp_servers/ncm_fleet/__init__.py @@ -0,0 +1,5 @@ +"""NCM Fleet Management MCP Server. + +Manages routers, groups, accounts, locations, configurations, firmware, +and products via the NCM v2 API. +""" diff --git a/ncm_mcp_servers/ncm_fleet/__main__.py b/ncm_mcp_servers/ncm_fleet/__main__.py new file mode 100644 index 0000000..6b2d979 --- /dev/null +++ b/ncm_mcp_servers/ncm_fleet/__main__.py @@ -0,0 +1,3 @@ +"""Allow running with ``python -m ncm_mcp_servers.ncm_fleet``.""" +from ncm_mcp_servers.ncm_fleet.server import main +main() diff --git a/ncm_mcp_servers/ncm_fleet/server.py b/ncm_mcp_servers/ncm_fleet/server.py new file mode 100644 index 0000000..cb1ff9c --- /dev/null +++ b/ncm_mcp_servers/ncm_fleet/server.py @@ -0,0 +1,68 @@ +"""NCM Fleet Management MCP Server entry point. + +Manages routers, groups, accounts, locations, configurations, +firmware, and products via the NCM v2 API. + +Tools (17 total): +- get_routers, manage_router, reboot_router, reboot_group +- get_groups, manage_group +- get_accounts, manage_subaccount +- get_locations, manage_location +- get_configuration_managers, patch_config, put_router_config, + copy_router_config, resume_updates +- get_firmware +- get_products +""" + +import os +import sys +from typing import Optional, cast + +from mcp.server.fastmcp import FastMCP + +from ncm_mcp_servers.shared.credentials import ApiCredentials, load_credentials +from ncm_mcp_servers.shared.client import get_ncm_client +from ncm_mcp_servers.shared.logging import get_logger +from ncm_mcp_servers.ncm_fleet.tools import register_all + +logger = get_logger("ncm_fleet") + + +def create_server( + credentials: Optional[ApiCredentials] = None, +) -> FastMCP: + """Creates and configures the fleet management MCP server.""" + if credentials is None: + credentials = load_credentials() + + credentials.validate(require_v2=True) + client = get_ncm_client(credentials) + v2_client = client.v2 if hasattr(client, 'v2') else client + + transport = os.environ.get("MCP_TRANSPORT", "streamable-http").lower() + port = int(os.environ.get("NCM_FLEET_PORT", "3001")) + + if transport == "sse": + mcp = FastMCP("ncm-fleet", host="0.0.0.0", port=port) + else: + mcp = FastMCP("ncm-fleet", host="0.0.0.0", port=port) + + register_all(mcp, v2_client) # type: ignore[arg-type] + logger.info("Server configured", extra={"transport": transport, "port": port}) + return mcp + + +def main() -> None: + """Entry point for ncm-fleet server.""" + try: + server = create_server() + transport = cast(str, os.environ.get("MCP_TRANSPORT", "streamable-http")).lower() + logger.info("Starting ncm-fleet server") + server.run(transport=transport) # type: ignore[arg-type] + except ValueError as exc: + logger.error("Failed to start server", extra={"error": str(exc)}) + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/ncm_mcp_servers/ncm_fleet/tools/__init__.py b/ncm_mcp_servers/ncm_fleet/tools/__init__.py new file mode 100644 index 0000000..f82c971 --- /dev/null +++ b/ncm_mcp_servers/ncm_fleet/tools/__init__.py @@ -0,0 +1,26 @@ +"""NCM Fleet Management tools registration.""" + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from mcp.server.fastmcp import FastMCP + from ncm_mcp_servers.shared.ncm import NcmClientv2 + +from ncm_mcp_servers.ncm_fleet.tools import ( + routers, + groups, + accounts, + locations, + configurations, + firmware, +) + + +def register_all(mcp: "FastMCP", client: "NcmClientv2") -> None: + """Registers all fleet management tools with the MCP server.""" + routers.register(mcp, client) + groups.register(mcp, client) + accounts.register(mcp, client) + locations.register(mcp, client) + configurations.register(mcp, client) + firmware.register(mcp, client) diff --git a/ncm_mcp_servers/ncm_fleet/tools/accounts.py b/ncm_mcp_servers/ncm_fleet/tools/accounts.py new file mode 100644 index 0000000..2ae39ec --- /dev/null +++ b/ncm_mcp_servers/ncm_fleet/tools/accounts.py @@ -0,0 +1,133 @@ +"""MCP tools for NCM account management. + +Consolidates account CRUD operations into: +- get_accounts: Query/list accounts +- manage_subaccount: Create, rename, delete subaccounts +""" + +from typing import Optional + +from ncm_mcp_servers.shared.error_handler import ( + handle_exception, + handle_ncm_response, + validate_required_params, +) + + +def register(mcp, client): + """Register account management tools.""" + + @mcp.tool() + def get_accounts( + account_id: Optional[int] = None, + name: Optional[str] = None, + ) -> dict: + """Retrieve accounts with optional filtering by ID or name.""" + try: + kwargs = {} + if account_id is not None: + kwargs["id"] = account_id + if name is not None: + kwargs["name"] = name + result = client.get_accounts(**kwargs) + return handle_ncm_response(result, "get_accounts") + except Exception as e: + return handle_exception(e, "get_accounts") + + @mcp.tool() + def manage_subaccount( + action: str = None, + subaccount_id: Optional[int] = None, + subaccount_name: Optional[str] = None, + new_name: Optional[str] = None, + parent_account_id: Optional[int] = None, + parent_account_name: Optional[str] = None, + ) -> dict: + """Manage subaccount lifecycle operations. + + Actions: + - "create": Create a subaccount. Requires new_name + + (parent_account_id or parent_account_name). + - "rename": Rename a subaccount. Requires (subaccount_id or subaccount_name) + + new_name. + - "delete": Delete a subaccount. Requires subaccount_id or subaccount_name. + """ + try: + err = validate_required_params(action=action) + if err is not None: + return err + + if action == "create": + err = validate_required_params(new_name=new_name) + if err is not None: + return err + if parent_account_id is None and parent_account_name is None: + return { + "success": False, + "error": { + "code": 400, + "message": "Missing required parameters", + "details": "Provide either parent_account_id or parent_account_name", + }, + "operation": "manage_subaccount", + } + if parent_account_id is not None: + result = client.create_subaccount_by_parent_id( + parent_account_id, new_name + ) + else: + result = client.create_subaccount_by_parent_name( + parent_account_name, new_name + ) + + elif action == "rename": + err = validate_required_params(new_name=new_name) + if err is not None: + return err + if subaccount_id is None and subaccount_name is None: + return { + "success": False, + "error": { + "code": 400, + "message": "Missing required parameters", + "details": "Provide either subaccount_id or subaccount_name", + }, + "operation": "manage_subaccount", + } + if subaccount_id is not None: + result = client.rename_subaccount_by_id(subaccount_id, new_name) + else: + result = client.rename_subaccount_by_name( + subaccount_name, new_name + ) + + elif action == "delete": + if subaccount_id is None and subaccount_name is None: + return { + "success": False, + "error": { + "code": 400, + "message": "Missing required parameters", + "details": "Provide either subaccount_id or subaccount_name", + }, + "operation": "manage_subaccount", + } + if subaccount_id is not None: + result = client.delete_subaccount_by_id(subaccount_id) + else: + result = client.delete_subaccount_by_name(subaccount_name) + + else: + return { + "success": False, + "error": { + "code": 400, + "message": "Invalid action", + "details": "Valid actions: create, rename, delete", + }, + "operation": "manage_subaccount", + } + + return handle_ncm_response(result, "manage_subaccount") + except Exception as e: + return handle_exception(e, "manage_subaccount") diff --git a/ncm_mcp_servers/ncm_fleet/tools/configurations.py b/ncm_mcp_servers/ncm_fleet/tools/configurations.py new file mode 100644 index 0000000..01e5c55 --- /dev/null +++ b/ncm_mcp_servers/ncm_fleet/tools/configurations.py @@ -0,0 +1,130 @@ +"""MCP tools for NCM configuration management. + +Provides: +- get_configuration_managers: Query config sync status +- patch_config: Apply partial config updates to a router or group +- put_router_config: Full config replacement for a router +- copy_router_config: Copy config between routers +- resume_updates: Resume suspended config sync +""" + +from typing import List, Optional + +from ncm_mcp_servers.shared.error_handler import ( + handle_exception, + handle_ncm_response, + validate_required_params, +) + + +def register(mcp, client): + """Register configuration management tools.""" + + @mcp.tool() + def get_configuration_managers( + router: Optional[int] = None, + synched: Optional[bool] = None, + suspended: Optional[bool] = None, + ) -> dict: + """Retrieve configuration managers with optional filtering.""" + try: + kwargs = {} + if router is not None: + kwargs["router"] = router + if synched is not None: + kwargs["synched"] = synched + if suspended is not None: + kwargs["suspended"] = suspended + result = client.get_configuration_managers(**kwargs) + return handle_ncm_response(result, "get_configuration_managers") + except Exception as e: + return handle_exception(e, "get_configuration_managers") + + @mcp.tool() + def patch_config( + target: str = None, + target_id: int = None, + config_json: dict = None, + removals: Optional[List[str]] = None, + ) -> dict: + """Apply a partial configuration update to a router or group. + + Args: + target: "router" or "group". + target_id: ID of the router or group to update. + config_json: Dictionary of configuration updates to apply. + removals: Optional list of configuration paths to remove. + """ + try: + err = validate_required_params( + target=target, target_id=target_id, config_json=config_json + ) + if err is not None: + return err + + payload = { + "configuration": [config_json, removals if removals else []] + } + + if target == "router": + result = client.patch_configuration_managers(target_id, payload) + elif target == "group": + result = client.patch_group_configuration(target_id, payload) + else: + return { + "success": False, + "error": { + "code": 400, + "message": "Invalid target", + "details": "Valid targets: router, group", + }, + "operation": "patch_config", + } + + return handle_ncm_response(result, "patch_config") + except Exception as e: + return handle_exception(e, "patch_config") + + @mcp.tool() + def put_router_config( + router_id: int = None, + config_json: dict = None, + ) -> dict: + """Perform a full configuration replacement on a router.""" + try: + err = validate_required_params(router_id=router_id, config_json=config_json) + if err is not None: + return err + result = client.put_configuration_managers(router_id, config_json) + return handle_ncm_response(result, "put_router_config") + except Exception as e: + return handle_exception(e, "put_router_config") + + @mcp.tool() + def copy_router_config( + src_router_id: int = None, + dst_router_id: int = None, + ) -> dict: + """Copy configuration from one router to another.""" + try: + err = validate_required_params( + src_router_id=src_router_id, dst_router_id=dst_router_id + ) + if err is not None: + return err + result = client.copy_router_configuration(src_router_id, dst_router_id) + return handle_ncm_response(result, "copy_router_config") + except Exception as e: + return handle_exception(e, "copy_router_config") + + @mcp.tool() + def resume_updates(router_id: int = None) -> dict: + """Resume configuration sync for a router in suspended state.""" + try: + err = validate_required_params(router_id=router_id) + if err is not None: + return err + result = client.resume_updates_for_router(router_id) + return handle_ncm_response(result, "resume_updates") + except Exception as e: + return handle_exception(e, "resume_updates") diff --git a/ncm_mcp_servers/ncm_fleet/tools/firmware.py b/ncm_mcp_servers/ncm_fleet/tools/firmware.py new file mode 100644 index 0000000..736e00d --- /dev/null +++ b/ncm_mcp_servers/ncm_fleet/tools/firmware.py @@ -0,0 +1,78 @@ +"""MCP tools for NCM firmware and product information. + +Consolidates firmware + products into a single tool: +- get_firmware: Query firmware versions, optionally by product +""" + +from typing import Optional + +from ncm_mcp_servers.shared.error_handler import ( + handle_exception, + handle_ncm_response, + validate_required_params, +) + + +def register(mcp, client): + """Register firmware and product tools.""" + + @mcp.tool() + def get_products( + product_id: Optional[int] = None, + product_name: Optional[str] = None, + limit: Optional[int] = None, + ) -> dict: + """Retrieve products with optional filtering by ID or name. + + If product_id is provided, returns a single product by ID. + If product_name is provided, returns a single product by name. + Otherwise returns all products. + """ + try: + if product_id is not None: + result = client.get_product_by_id(product_id) + return handle_ncm_response(result, "get_products") + if product_name is not None: + result = client.get_product_by_name(product_name) + return handle_ncm_response(result, "get_products") + kwargs = {} + if limit is not None: + kwargs["limit"] = limit + result = client.get_products(**kwargs) + return handle_ncm_response(result, "get_products") + except Exception as e: + return handle_exception(e, "get_products") + + @mcp.tool() + def get_firmware( + version: Optional[str] = None, + product_id: Optional[int] = None, + product_name: Optional[str] = None, + limit: Optional[int] = None, + ) -> dict: + """Retrieve firmware versions with optional filtering. + + If product_id or product_name is provided along with version, + retrieves firmware for that specific product and version. + Otherwise returns all firmware matching the version filter. + """ + try: + if version and (product_id or product_name): + if product_id is not None: + result = client.get_firmware_for_product_id_by_version( + product_id, version + ) + else: + result = client.get_firmware_for_product_name_by_version( + product_name, version + ) + else: + kwargs = {} + if version is not None: + kwargs["version"] = version + if limit is not None: + kwargs["limit"] = limit + result = client.get_firmwares(**kwargs) + return handle_ncm_response(result, "get_firmware") + except Exception as e: + return handle_exception(e, "get_firmware") diff --git a/ncm_mcp_servers/ncm_fleet/tools/groups.py b/ncm_mcp_servers/ncm_fleet/tools/groups.py new file mode 100644 index 0000000..cc9955d --- /dev/null +++ b/ncm_mcp_servers/ncm_fleet/tools/groups.py @@ -0,0 +1,155 @@ +"""MCP tools for NCM group management. + +Consolidates group CRUD operations into: +- get_groups: Query/list groups +- manage_group: Create, rename, delete, update +""" + +from typing import Optional + +from ncm_mcp_servers.shared.error_handler import ( + handle_exception, + handle_ncm_response, + validate_required_params, +) + + +def register(mcp, client): + """Register group management tools.""" + + @mcp.tool() + def get_groups( + group_id: Optional[int] = None, + name: Optional[str] = None, + account: Optional[str] = None, + ) -> dict: + """Retrieve groups with optional filtering by ID, name, or account.""" + try: + kwargs = {} + if group_id is not None: + kwargs["id"] = group_id + if name is not None: + kwargs["name"] = name + if account is not None: + kwargs["account"] = account + result = client.get_groups(**kwargs) + return handle_ncm_response(result, "get_groups") + except Exception as e: + return handle_exception(e, "get_groups") + + @mcp.tool() + def manage_group( + action: str = None, + group_id: Optional[int] = None, + group_name: Optional[str] = None, + new_name: Optional[str] = None, + parent_account_id: Optional[int] = None, + parent_account_name: Optional[str] = None, + product_name: Optional[str] = None, + firmware_version: Optional[str] = None, + product: Optional[str] = None, + target_firmware: Optional[str] = None, + configuration: Optional[dict] = None, + ) -> dict: + """Manage group lifecycle operations. + + Actions: + - "create": Create a new group. Requires group_name + + (parent_account_id or parent_account_name). Optional: product_name, firmware_version. + - "rename": Rename a group. Requires (group_id or group_name) + new_name. + - "delete": Delete a group. Requires group_id or group_name. + - "update": Update group fields. Requires group_id. + Optional: new_name, product, target_firmware, configuration. + """ + try: + err = validate_required_params(action=action) + if err is not None: + return err + + if action == "create": + err = validate_required_params(group_name=group_name) + if err is not None: + return err + if parent_account_id is None and parent_account_name is None: + return { + "success": False, + "error": { + "code": 400, + "message": "Missing required parameters", + "details": "Provide either parent_account_id or parent_account_name", + }, + "operation": "manage_group", + } + if parent_account_id is not None: + result = client.create_group_by_parent_id( + parent_account_id, group_name, product_name, firmware_version + ) + else: + result = client.create_group_by_parent_name( + parent_account_name, group_name, product_name, firmware_version + ) + + elif action == "rename": + err = validate_required_params(new_name=new_name) + if err is not None: + return err + if group_id is None and group_name is None: + return { + "success": False, + "error": { + "code": 400, + "message": "Missing required parameters", + "details": "Provide either group_id or group_name", + }, + "operation": "manage_group", + } + if group_id is not None: + result = client.rename_group_by_id(group_id, new_name) + else: + result = client.rename_group_by_name(group_name, new_name) + + elif action == "delete": + if group_id is None and group_name is None: + return { + "success": False, + "error": { + "code": 400, + "message": "Missing required parameters", + "details": "Provide either group_id or group_name", + }, + "operation": "manage_group", + } + if group_id is not None: + result = client.delete_group_by_id(group_id) + else: + result = client.delete_group_by_name(group_name) + + elif action == "update": + err = validate_required_params(group_id=group_id) + if err is not None: + return err + kwargs = {} + if new_name is not None: + kwargs["name"] = new_name + if product is not None: + kwargs["product"] = product + if target_firmware is not None: + kwargs["target_firmware"] = target_firmware + if configuration is not None: + kwargs["configuration"] = configuration + result = client.patch_group(group_id, **kwargs) + + else: + return { + "success": False, + "error": { + "code": 400, + "message": "Invalid action", + "details": "Valid actions: create, rename, delete, update", + }, + "operation": "manage_group", + } + + return handle_ncm_response(result, "manage_group") + except Exception as e: + return handle_exception(e, "manage_group") diff --git a/ncm_mcp_servers/ncm_fleet/tools/locations.py b/ncm_mcp_servers/ncm_fleet/tools/locations.py new file mode 100644 index 0000000..577d9c8 --- /dev/null +++ b/ncm_mcp_servers/ncm_fleet/tools/locations.py @@ -0,0 +1,109 @@ +"""MCP tools for NCM location management. + +Consolidates location operations into: +- get_locations: Query current and historical locations +- manage_location: Create or delete locations +""" + +from typing import Optional + +from ncm_mcp_servers.shared.error_handler import ( + handle_exception, + handle_ncm_response, + validate_required_params, +) + + +def register(mcp, client): + """Register location management tools.""" + + @mcp.tool() + def get_locations( + router: Optional[int] = None, + historical: bool = False, + created_at__gt: Optional[str] = None, + created_at__lte: Optional[str] = None, + limit: Optional[int] = None, + ) -> dict: + """Retrieve current or historical locations for routers. + + Args: + router: Filter by router ID. + historical: If True, retrieves historical location data (requires router). + created_at__gt: Start date filter (ISO 8601). Only for historical. + created_at__lte: End date filter (ISO 8601). Only for historical. + limit: Max number of results to return. + """ + try: + if historical: + err = validate_required_params(router=router) + if err is not None: + return err + kwargs = {} + if created_at__gt is not None: + kwargs["created_at__gt"] = created_at__gt + if created_at__lte is not None: + kwargs["created_at__lte"] = created_at__lte + if limit is not None: + kwargs["limit"] = limit + result = client.get_historical_locations(router, **kwargs) + else: + kwargs = {} + if router is not None: + kwargs["router"] = router + if limit is not None: + kwargs["limit"] = limit + result = client.get_locations(**kwargs) + return handle_ncm_response(result, "get_locations") + except Exception as e: + return handle_exception(e, "get_locations") + + @mcp.tool() + def manage_location( + action: str = None, + router_id: int = None, + account_id: Optional[int] = None, + latitude: Optional[float] = None, + longitude: Optional[float] = None, + ) -> dict: + """Manage router location assignments. + + Actions: + - "create": Create and assign a location. Requires router_id, + account_id, latitude, longitude. + - "delete": Remove the location from a router. Requires router_id. + """ + try: + err = validate_required_params(action=action, router_id=router_id) + if err is not None: + return err + + if action == "create": + err = validate_required_params( + account_id=account_id, + latitude=latitude, + longitude=longitude, + ) + if err is not None: + return err + result = client.create_location( + account_id, latitude, longitude, router_id + ) + + elif action == "delete": + result = client.delete_location_for_router(router_id) + + else: + return { + "success": False, + "error": { + "code": 400, + "message": "Invalid action", + "details": "Valid actions: create, delete", + }, + "operation": "manage_location", + } + + return handle_ncm_response(result, "manage_location") + except Exception as e: + return handle_exception(e, "manage_location") diff --git a/ncm_mcp_servers/ncm_fleet/tools/routers.py b/ncm_mcp_servers/ncm_fleet/tools/routers.py new file mode 100644 index 0000000..a833ce8 --- /dev/null +++ b/ncm_mcp_servers/ncm_fleet/tools/routers.py @@ -0,0 +1,196 @@ +"""MCP tools for NCM router management. + +Consolidates router CRUD operations into: +- get_routers: Query/list routers +- manage_router: Create, rename, delete, update fields, assign/remove from group/account +- reboot_router: Reboot a single router +- reboot_group: Reboot all routers in a group +""" + +from typing import Optional + +from ncm_mcp_servers.shared.error_handler import ( + handle_exception, + handle_ncm_response, + validate_required_params, +) + + +def register(mcp, client): + """Register router management tools.""" + + @mcp.tool() + def get_routers( + router_id: Optional[int] = None, + name: Optional[str] = None, + account: Optional[str] = None, + group: Optional[str] = None, + limit: Optional[int] = None, + ) -> dict: + """Retrieve routers with optional filtering by ID, name, account, or group.""" + try: + kwargs = {} + if router_id is not None: + kwargs["id"] = router_id + if name is not None: + kwargs["name"] = name + if account is not None: + kwargs["account"] = account + if group is not None: + kwargs["group"] = group + if limit is not None: + kwargs["limit"] = limit + result = client.get_routers(**kwargs) + return handle_ncm_response(result, "get_routers") + except Exception as e: + return handle_exception(e, "get_routers") + + @mcp.tool() + def manage_router( + action: str = None, + router_id: Optional[int] = None, + router_name: Optional[str] = None, + new_name: Optional[str] = None, + description: Optional[str] = None, + asset_id: Optional[str] = None, + custom1: Optional[str] = None, + custom2: Optional[str] = None, + group_id: Optional[int] = None, + account_id: Optional[int] = None, + ) -> dict: + """Manage router lifecycle operations. + + Actions: + - "rename": Rename a router. Requires router_id or router_name + new_name. + - "delete": Delete a router. Requires router_id or router_name. + - "update": Update router fields. Requires router_id + any of + new_name, description, asset_id, custom1, custom2. + - "assign_to_group": Assign router to group. Requires router_id + group_id. + - "remove_from_group": Remove router from group. Requires router_id or router_name. + - "assign_to_account": Move router to account. Requires router_id + account_id. + """ + try: + err = validate_required_params(action=action) + if err is not None: + return err + + if action == "rename": + err = validate_required_params(new_name=new_name) + if err is not None: + return err + if router_id is None and router_name is None: + return { + "success": False, + "error": { + "code": 400, + "message": "Missing required parameters", + "details": "Provide either router_id or router_name", + }, + "operation": "manage_router", + } + if router_id is not None: + result = client.rename_router_by_id(router_id, new_name) + else: + result = client.rename_router_by_name(router_name, new_name) + + elif action == "delete": + if router_id is None and router_name is None: + return { + "success": False, + "error": { + "code": 400, + "message": "Missing required parameters", + "details": "Provide either router_id or router_name", + }, + "operation": "manage_router", + } + if router_id is not None: + result = client.delete_router_by_id(router_id) + else: + result = client.delete_router_by_name(router_name) + + elif action == "update": + err = validate_required_params(router_id=router_id) + if err is not None: + return err + kwargs = {} + if new_name is not None: + kwargs["name"] = new_name + if description is not None: + kwargs["description"] = description + if asset_id is not None: + kwargs["asset_id"] = asset_id + if custom1 is not None: + kwargs["custom1"] = custom1 + if custom2 is not None: + kwargs["custom2"] = custom2 + result = client.set_router_fields(router_id, **kwargs) + + elif action == "assign_to_group": + err = validate_required_params(router_id=router_id, group_id=group_id) + if err is not None: + return err + result = client.assign_router_to_group(router_id, group_id) + + elif action == "remove_from_group": + if router_id is None and router_name is None: + return { + "success": False, + "error": { + "code": 400, + "message": "Missing required parameters", + "details": "Provide either router_id or router_name", + }, + "operation": "manage_router", + } + result = client.remove_router_from_group( + router_id=router_id, router_name=router_name + ) + + elif action == "assign_to_account": + err = validate_required_params(router_id=router_id, account_id=account_id) + if err is not None: + return err + result = client.assign_router_to_account(router_id, account_id) + + else: + return { + "success": False, + "error": { + "code": 400, + "message": "Invalid action", + "details": ( + "Valid actions: rename, delete, update, " + "assign_to_group, remove_from_group, assign_to_account" + ), + }, + "operation": "manage_router", + } + + return handle_ncm_response(result, "manage_router") + except Exception as e: + return handle_exception(e, "manage_router") + + @mcp.tool() + def reboot_router(router_id: int = None) -> dict: + """Reboot a single router by its ID.""" + try: + err = validate_required_params(router_id=router_id) + if err is not None: + return err + result = client.reboot_device(router_id) + return handle_ncm_response(result, "reboot_router") + except Exception as e: + return handle_exception(e, "reboot_router") + + @mcp.tool() + def reboot_group(group_id: int = None) -> dict: + """Reboot all routers in a group by group ID.""" + try: + err = validate_required_params(group_id=group_id) + if err is not None: + return err + result = client.reboot_group(group_id) + return handle_ncm_response(result, "reboot_group") + except Exception as e: + return handle_exception(e, "reboot_group") diff --git a/ncm_mcp_servers/ncm_monitoring/__init__.py b/ncm_mcp_servers/ncm_monitoring/__init__.py new file mode 100644 index 0000000..297cd01 --- /dev/null +++ b/ncm_mcp_servers/ncm_monitoring/__init__.py @@ -0,0 +1,5 @@ +"""NCM Monitoring MCP Server. + +Monitors network health via net devices, alerts/logs, and speed tests +using the NCM v2 API. +""" diff --git a/ncm_mcp_servers/ncm_monitoring/__main__.py b/ncm_mcp_servers/ncm_monitoring/__main__.py new file mode 100644 index 0000000..a6b7653 --- /dev/null +++ b/ncm_mcp_servers/ncm_monitoring/__main__.py @@ -0,0 +1,3 @@ +"""Allow running with ``python -m ncm_mcp_servers.ncm_monitoring``.""" +from ncm_mcp_servers.ncm_monitoring.server import main +main() diff --git a/ncm_mcp_servers/ncm_monitoring/server.py b/ncm_mcp_servers/ncm_monitoring/server.py new file mode 100644 index 0000000..ead6688 --- /dev/null +++ b/ncm_mcp_servers/ncm_monitoring/server.py @@ -0,0 +1,63 @@ +"""NCM Monitoring MCP Server entry point. + +Monitors network health: net devices, alerts/logs, and speed tests +via the NCM v2 API. + +Tools (6 total): +- get_net_devices, get_net_device_health, get_net_device_metrics +- get_logs +- create_speed_test, get_speed_test +""" + +import os +import sys +from typing import Optional, cast + +from mcp.server.fastmcp import FastMCP + +from ncm_mcp_servers.shared.credentials import ApiCredentials, load_credentials +from ncm_mcp_servers.shared.client import get_ncm_client +from ncm_mcp_servers.shared.logging import get_logger +from ncm_mcp_servers.ncm_monitoring.tools import register_all + +logger = get_logger("ncm_monitoring") + + +def create_server( + credentials: Optional[ApiCredentials] = None, +) -> FastMCP: + """Creates and configures the monitoring MCP server.""" + if credentials is None: + credentials = load_credentials() + + credentials.validate(require_v2=True) + client = get_ncm_client(credentials) + v2_client = client.v2 if hasattr(client, 'v2') else client + + transport = os.environ.get("MCP_TRANSPORT", "streamable-http").lower() + port = int(os.environ.get("NCM_MONITORING_PORT", "3002")) + + if transport == "sse": + mcp = FastMCP("ncm-monitoring", host="0.0.0.0", port=port) + else: + mcp = FastMCP("ncm-monitoring", host="0.0.0.0", port=port) + + register_all(mcp, v2_client) # type: ignore[arg-type] + logger.info("Server configured", extra={"transport": transport, "port": port}) + return mcp + + +def main() -> None: + """Entry point for ncm-monitoring server.""" + try: + server = create_server() + transport = cast(str, os.environ.get("MCP_TRANSPORT", "streamable-http")).lower() + logger.info("Starting ncm-monitoring server") + server.run(transport=transport) # type: ignore[arg-type] + except ValueError as exc: + logger.error("Failed to start server", extra={"error": str(exc)}) + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/ncm_mcp_servers/ncm_monitoring/tools/__init__.py b/ncm_mcp_servers/ncm_monitoring/tools/__init__.py new file mode 100644 index 0000000..5c87ed1 --- /dev/null +++ b/ncm_mcp_servers/ncm_monitoring/tools/__init__.py @@ -0,0 +1,20 @@ +"""NCM Monitoring tools registration.""" + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from mcp.server.fastmcp import FastMCP + from ncm_mcp_servers.shared.ncm import NcmClientv2 + +from ncm_mcp_servers.ncm_monitoring.tools import ( + net_devices, + alerts, + speed_tests, +) + + +def register_all(mcp: "FastMCP", client: "NcmClientv2") -> None: + """Registers all monitoring tools with the MCP server.""" + net_devices.register(mcp, client) + alerts.register(mcp, client) + speed_tests.register(mcp, client) diff --git a/ncm_mcp_servers/ncm_monitoring/tools/alerts.py b/ncm_mcp_servers/ncm_monitoring/tools/alerts.py new file mode 100644 index 0000000..883ad9b --- /dev/null +++ b/ncm_mcp_servers/ncm_monitoring/tools/alerts.py @@ -0,0 +1,119 @@ +"""MCP tools for NCM alerts and logs. + +Consolidates alert/log queries into: +- get_logs: Unified log retrieval (alerts, recent_alerts, router_logs, activity_logs) +""" + +from typing import Optional + +from ncm_mcp_servers.shared.error_handler import ( + handle_exception, + handle_ncm_response, + validate_required_params, +) + + +def register(mcp, client): + """Register alert and log tools.""" + + @mcp.tool() + def get_logs( + source: str = None, + router: Optional[int] = None, + alert_type: Optional[str] = None, + actor: Optional[str] = None, + action_type: Optional[str] = None, + created_at__gt: Optional[str] = None, + created_at__lt: Optional[str] = None, + tzoffset_hrs: Optional[int] = 0, + limit: Optional[int] = None, + ) -> dict: + """Retrieve alerts or logs from various sources. + + Args: + source: One of "alerts", "recent_alerts", "router_logs", + or "activity_logs". + - alerts: Router alerts with date/type filtering. + - recent_alerts: Alerts from the last 24 hours. + - router_logs: Device logs for a specific router. + - activity_logs: NCM platform activity logs. + router: Filter by router ID (alerts, recent_alerts, router_logs). + alert_type: Filter by alert type (alerts only). + actor: Filter by actor ID (activity_logs only). + action_type: Filter by action type (activity_logs only). + created_at__gt: Start date filter (ISO 8601). + created_at__lt: End date filter (ISO 8601). + tzoffset_hrs: Timezone offset in hours (recent_alerts only). + limit: Max results to return. + """ + try: + err = validate_required_params(source=source) + if err is not None: + return err + + if source == "alerts": + kwargs = {} + if router is not None: + kwargs["router"] = router + if alert_type is not None: + kwargs["type"] = alert_type + if created_at__gt is not None: + kwargs["created_at__gt"] = created_at__gt + if created_at__lt is not None: + kwargs["created_at__lt"] = created_at__lt + if limit is not None: + kwargs["limit"] = limit + result = client.get_router_alerts(**kwargs) + + elif source == "recent_alerts": + kwargs = {} + if router is not None: + kwargs["router"] = router + result = client.get_router_alerts_last_24hrs( + tzoffset_hrs=tzoffset_hrs, **kwargs + ) + + elif source == "router_logs": + err = validate_required_params(router=router) + if err is not None: + return err + kwargs = {} + if created_at__gt is not None: + kwargs["created_at__gt"] = created_at__gt + if created_at__lt is not None: + kwargs["created_at__lt"] = created_at__lt + if limit is not None: + kwargs["limit"] = limit + result = client.get_router_logs(router, **kwargs) + + elif source == "activity_logs": + kwargs = {} + if actor is not None: + kwargs["actor__id"] = actor + if action_type is not None: + kwargs["action__type"] = action_type + if created_at__gt is not None: + kwargs["created_at__gt"] = created_at__gt + if created_at__lt is not None: + kwargs["created_at__lt"] = created_at__lt + if limit is not None: + kwargs["limit"] = limit + result = client.get_activity_logs(**kwargs) + + else: + return { + "success": False, + "error": { + "code": 400, + "message": "Invalid source", + "details": ( + "Valid sources: alerts, recent_alerts, " + "router_logs, activity_logs" + ), + }, + "operation": "get_logs", + } + + return handle_ncm_response(result, "get_logs") + except Exception as e: + return handle_exception(e, "get_logs") diff --git a/ncm_mcp_servers/ncm_monitoring/tools/net_devices.py b/ncm_mcp_servers/ncm_monitoring/tools/net_devices.py new file mode 100644 index 0000000..1052e5d --- /dev/null +++ b/ncm_mcp_servers/ncm_monitoring/tools/net_devices.py @@ -0,0 +1,123 @@ +"""MCP tools for NCM net device monitoring. + +Consolidates net device metrics into: +- get_net_devices: Query/list net devices +- get_net_device_health: Get cellular health scores +- get_net_device_metrics: Unified metrics retrieval (signal, usage, wan, modem) +""" + +from typing import Optional + +from ncm_mcp_servers.shared.error_handler import ( + handle_exception, + handle_ncm_response, + validate_required_params, +) + + +def register(mcp, client): + """Register net device monitoring tools.""" + + @mcp.tool() + def get_net_devices( + router: Optional[int] = None, + mode: Optional[str] = None, + connection_state: Optional[str] = None, + limit: Optional[int] = None, + ) -> dict: + """Retrieve net devices with optional filtering by router, mode, or connection state.""" + try: + kwargs = {} + if router is not None: + kwargs["router"] = router + if mode is not None: + kwargs["mode"] = mode + if connection_state is not None: + kwargs["connection_state"] = connection_state + if limit is not None: + kwargs["limit"] = limit + result = client.get_net_devices(**kwargs) + return handle_ncm_response(result, "get_net_devices") + except Exception as e: + return handle_exception(e, "get_net_devices") + + @mcp.tool() + def get_net_device_health( + net_device: Optional[int] = None, + ) -> dict: + """Retrieve cellular health scores, optionally filtered by net device ID.""" + try: + kwargs = {} + if net_device is not None: + kwargs["net_device"] = net_device + result = client.get_net_device_health(**kwargs) + return handle_ncm_response(result, "get_net_device_health") + except Exception as e: + return handle_exception(e, "get_net_device_health") + + @mcp.tool() + def get_net_device_metrics( + metric_type: str = None, + net_device: Optional[int] = None, + created_at__gt: Optional[str] = None, + created_at__lt: Optional[str] = None, + limit: Optional[int] = None, + ) -> dict: + """Retrieve net device metrics by type. + + Args: + metric_type: One of "signal", "usage", "wan", or "modem". + - signal: Signal strength samples over time. + - usage: Data usage samples over time. + - wan: Latest signal/usage metrics for WAN devices. + - modem: Latest signal/usage metrics for modem devices. + net_device: Filter by net device ID. + created_at__gt: Start date (ISO 8601). For signal/usage only. + created_at__lt: End date (ISO 8601). For signal/usage only. + limit: Max results to return. + """ + try: + err = validate_required_params(metric_type=metric_type) + if err is not None: + return err + + kwargs = {} + if net_device is not None: + kwargs["net_device"] = net_device + if limit is not None: + kwargs["limit"] = limit + + if metric_type == "signal": + if created_at__gt is not None: + kwargs["created_at__gt"] = created_at__gt + if created_at__lt is not None: + kwargs["created_at__lt"] = created_at__lt + result = client.get_net_device_signal_samples(**kwargs) + + elif metric_type == "usage": + if created_at__gt is not None: + kwargs["created_at__gt"] = created_at__gt + if created_at__lt is not None: + kwargs["created_at__lt"] = created_at__lt + result = client.get_net_device_usage_samples(**kwargs) + + elif metric_type == "wan": + result = client.get_net_devices_metrics_for_wan(**kwargs) + + elif metric_type == "modem": + result = client.get_net_devices_metrics_for_mdm(**kwargs) + + else: + return { + "success": False, + "error": { + "code": 400, + "message": "Invalid metric_type", + "details": "Valid types: signal, usage, wan, modem", + }, + "operation": "get_net_device_metrics", + } + + return handle_ncm_response(result, "get_net_device_metrics") + except Exception as e: + return handle_exception(e, "get_net_device_metrics") diff --git a/ncm_mcp_servers/ncm_monitoring/tools/speed_tests.py b/ncm_mcp_servers/ncm_monitoring/tools/speed_tests.py new file mode 100644 index 0000000..55cf900 --- /dev/null +++ b/ncm_mcp_servers/ncm_monitoring/tools/speed_tests.py @@ -0,0 +1,89 @@ +"""MCP tools for NCM speed tests. + +Provides: +- create_speed_test: Run speed tests on net devices or all modems on a router +- get_speed_test: Check speed test status/results +""" + +from typing import Optional + +from ncm_mcp_servers.shared.error_handler import ( + handle_exception, + handle_ncm_response, + validate_required_params, +) + + +def register(mcp, client): + """Register speed test tools.""" + + @mcp.tool() + def create_speed_test( + net_device_ids: Optional[list] = None, + router_id: Optional[int] = None, + account_id: Optional[int] = None, + host: Optional[str] = None, + max_test_concurrency: Optional[int] = None, + port: Optional[int] = None, + size: Optional[int] = None, + test_timeout: Optional[int] = None, + test_type: Optional[str] = None, + time: Optional[int] = None, + ) -> dict: + """Create a speed test for net devices or all modems on a router. + + Provide either net_device_ids (list of specific device IDs) or + router_id (auto-discovers all connected modems on that router). + + test_type can be 'TCP Download', 'TCP Upload', or 'TCP Latency'. + """ + try: + if net_device_ids is None and router_id is None: + return { + "success": False, + "error": { + "code": 400, + "message": "Missing required parameters", + "details": "Provide either net_device_ids or router_id", + }, + "operation": "create_speed_test", + } + + kwargs = {} + if account_id is not None: + kwargs["account_id"] = account_id + if host is not None: + kwargs["host"] = host + if max_test_concurrency is not None: + kwargs["max_test_concurrency"] = max_test_concurrency + if port is not None: + kwargs["port"] = port + if size is not None: + kwargs["size"] = size + if test_timeout is not None: + kwargs["test_timeout"] = test_timeout + if test_type is not None: + kwargs["test_type"] = test_type + if time is not None: + kwargs["time"] = time + + if net_device_ids is not None: + result = client.create_speed_test(net_device_ids, **kwargs) + else: + result = client.create_speed_test_mdm(router_id, **kwargs) + + return handle_ncm_response(result, "create_speed_test") + except Exception as e: + return handle_exception(e, "create_speed_test") + + @mcp.tool() + def get_speed_test(speed_test_id: int = None) -> dict: + """Get the status and results of a speed test by its ID.""" + try: + err = validate_required_params(speed_test_id=speed_test_id) + if err is not None: + return err + result = client.get_speed_test(speed_test_id) + return handle_ncm_response(result, "get_speed_test") + except Exception as e: + return handle_exception(e, "get_speed_test") diff --git a/ncm_mcp_servers/pyproject.toml b/ncm_mcp_servers/pyproject.toml new file mode 100644 index 0000000..777fda8 --- /dev/null +++ b/ncm_mcp_servers/pyproject.toml @@ -0,0 +1,47 @@ +[build-system] +requires = ["setuptools>=68.0", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "ncm-mcp-servers" +version = "1.0.0" +description = "Suite of focused MCP servers for Cradlepoint NCM API management" +requires-python = ">=3.10" +dependencies = [ + "mcp[cli]==1.28.0", + "requests==2.32.3", + "urllib3==2.2.3", +] + +[project.scripts] +ncm-fleet = "ncm_mcp_servers.ncm_fleet.server:main" +ncm-monitoring = "ncm_mcp_servers.ncm_monitoring.server:main" +ncm-cloud-services = "ncm_mcp_servers.ncm_cloud_services.server:main" +ncm-mcp-servers = "ncm_mcp_servers.__main__:main" + +[tool.setuptools.packages.find] +include = ["ncm_mcp_servers*"] + +[tool.setuptools.package-data] +ncm_mcp_servers = ["*.json"] + +[tool.mypy] +python_version = "3.10" +warn_return_any = true +warn_unused_configs = true +disallow_untyped_defs = false +check_untyped_defs = true +ignore_missing_imports = true +no_implicit_optional = false + +[[tool.mypy.overrides]] +module = "ncm_mcp_servers.shared.ncm" +ignore_errors = true + +[[tool.mypy.overrides]] +module = [ + "ncm_mcp_servers.ncm_fleet.tools.*", + "ncm_mcp_servers.ncm_monitoring.tools.*", + "ncm_mcp_servers.ncm_cloud_services.tools.*", +] +ignore_errors = true diff --git a/ncm_mcp_servers/shared/__init__.py b/ncm_mcp_servers/shared/__init__.py new file mode 100644 index 0000000..b09b7c2 --- /dev/null +++ b/ncm_mcp_servers/shared/__init__.py @@ -0,0 +1,25 @@ +"""Shared module for NCM MCP Servers. + +Contains common utilities: NCM client initialization, error handling, +and credential loading used by all three MCP server packages. +""" + +from ncm_mcp_servers.shared.error_handler import ( + handle_exception, + handle_ncm_response, + validate_required_params, +) +from ncm_mcp_servers.shared.credentials import ( + ApiCredentials, + load_credentials, +) +from ncm_mcp_servers.shared.client import get_ncm_client + +__all__ = [ + "handle_exception", + "handle_ncm_response", + "validate_required_params", + "ApiCredentials", + "load_credentials", + "get_ncm_client", +] diff --git a/ncm_mcp_servers/shared/client.py b/ncm_mcp_servers/shared/client.py new file mode 100644 index 0000000..effe13c --- /dev/null +++ b/ncm_mcp_servers/shared/client.py @@ -0,0 +1,39 @@ +"""NCM client factory for MCP Servers. + +Provides get_ncm_client() that instantiates the correct NcmClient +based on available credentials. +""" + +from typing import Optional, Union + +from ncm_mcp_servers.shared.ncm import NcmClientv2, NcmClientv3, NcmClientv2v3 +from ncm_mcp_servers.shared.credentials import ApiCredentials, load_credentials + + +def get_ncm_client( + credentials: Optional[ApiCredentials] = None, +) -> Union[NcmClientv2, NcmClientv3, NcmClientv2v3]: + """Instantiates the correct NcmClient based on available credentials. + + Returns: + NcmClientv2 when only v2 keys are present. + NcmClientv3 when only a v3 token is present. + NcmClientv2v3 when both are present. + + Raises: + ValueError: If credentials are missing or incomplete. + """ + if credentials is None: + credentials = load_credentials() + + credentials.validate() + + if credentials.has_v2 and credentials.has_v3: + return NcmClientv2v3( + api_keys=credentials.to_v2_dict(), + api_key=credentials.ncm_api_token, + ) + elif credentials.has_v2: + return NcmClientv2(api_keys=credentials.to_v2_dict()) + else: + return NcmClientv3(api_key=credentials.ncm_api_token) diff --git a/ncm_mcp_servers/shared/credentials.py b/ncm_mcp_servers/shared/credentials.py new file mode 100644 index 0000000..e522485 --- /dev/null +++ b/ncm_mcp_servers/shared/credentials.py @@ -0,0 +1,174 @@ +"""Credential loading for NCM MCP Servers. + +Reads API credentials from a JSON file or environment variables. + +Credential resolution order: +1. JSON file at the path specified by NCM_CREDENTIALS_FILE env var +2. JSON file at the default path: /app/credentials.json (Docker) or ./credentials.json +3. Environment variables (X_CP_API_ID, X_CP_API_KEY, X_ECM_API_ID, X_ECM_API_KEY, NCM_API_TOKEN) +""" + +import json +import os +import sys +from dataclasses import dataclass +from typing import Optional + + +@dataclass +class ApiCredentials: + """Holds NCM API credentials read from environment variables.""" + + x_cp_api_id: Optional[str] = None + x_cp_api_key: Optional[str] = None + x_ecm_api_id: Optional[str] = None + x_ecm_api_key: Optional[str] = None + ncm_api_token: Optional[str] = None + + @property + def has_v2(self) -> bool: + """True when all four v2 credentials are present.""" + return all([ + self.x_cp_api_id, + self.x_cp_api_key, + self.x_ecm_api_id, + self.x_ecm_api_key, + ]) + + @property + def has_v3(self) -> bool: + """True when the v3 bearer token is present.""" + return self.ncm_api_token is not None and self.ncm_api_token != "" + + def to_v2_dict(self) -> dict: + """Returns v2 credentials as the dict format expected by NcmClientv2.""" + return { + "X-CP-API-ID": self.x_cp_api_id, + "X-CP-API-KEY": self.x_cp_api_key, + "X-ECM-API-ID": self.x_ecm_api_id, + "X-ECM-API-KEY": self.x_ecm_api_key, + } + + @property + def _v2_fields(self) -> dict: + """Maps env var names to their current values for validation.""" + return { + "X_CP_API_ID": self.x_cp_api_id, + "X_CP_API_KEY": self.x_cp_api_key, + "X_ECM_API_ID": self.x_ecm_api_id, + "X_ECM_API_KEY": self.x_ecm_api_key, + } + + def validate(self, require_v2=False, require_v3=False) -> None: + """Validates that required credential sets are provided. + + Args: + require_v2: If True, v2 credentials must be present. + require_v3: If True, v3 credentials must be present. + + Raises ValueError with descriptive message when: + - No credentials of any type are provided + - v2 credentials are partially provided (1-3 of 4 keys) + - Required credentials are missing + """ + v2_fields = self._v2_fields + v2_present = {k: v for k, v in v2_fields.items() if v} + v2_missing = {k for k, v in v2_fields.items() if not v} + + # Check for partial v2 credentials (some but not all) + if 0 < len(v2_present) < 4: + missing_names = ", ".join(sorted(v2_missing)) + raise ValueError( + f"Incomplete v2 API credentials. Missing: {missing_names}" + ) + + if require_v2 and not self.has_v2: + raise ValueError( + "v2 API credentials required. Provide: " + "X_CP_API_ID, X_CP_API_KEY, X_ECM_API_ID, X_ECM_API_KEY" + ) + + if require_v3 and not self.has_v3: + raise ValueError( + "v3 API token required. Provide: NCM_API_TOKEN" + ) + + if not self.has_v2 and not self.has_v3: + raise ValueError( + "No API credentials found. Provide v2 credentials " + "(X_CP_API_ID, X_CP_API_KEY, X_ECM_API_ID, X_ECM_API_KEY) " + "or a v3 token (NCM_API_TOKEN), or both." + ) + + +# Default paths to look for a credentials JSON file +DEFAULT_CREDENTIALS_PATHS = [ + "/app/credentials.json", # Docker container default + "./credentials.json", # Local development +] + + +def _load_credentials_from_file() -> Optional[ApiCredentials]: + """Attempt to load credentials from a JSON file. + + Checks NCM_CREDENTIALS_FILE env var first, then default paths. + Returns None if no file is found. + + Expected JSON format:: + + { + "X_CP_API_ID": "...", + "X_CP_API_KEY": "...", + "X_ECM_API_ID": "...", + "X_ECM_API_KEY": "...", + "NCM_API_TOKEN": "..." + } + """ + paths_to_try = [] + custom_path = os.environ.get("NCM_CREDENTIALS_FILE") + if custom_path: + paths_to_try.append(custom_path) + paths_to_try.extend(DEFAULT_CREDENTIALS_PATHS) + + for path in paths_to_try: + if os.path.isfile(path): + try: + with open(path, "r") as f: + data = json.load(f) + return ApiCredentials( + x_cp_api_id=data.get("X_CP_API_ID") or None, + x_cp_api_key=data.get("X_CP_API_KEY") or None, + x_ecm_api_id=data.get("X_ECM_API_ID") or None, + x_ecm_api_key=data.get("X_ECM_API_KEY") or None, + ncm_api_token=data.get("NCM_API_TOKEN") or None, + ) + except (json.JSONDecodeError, OSError) as exc: + print( + f"Warning: Failed to read credentials from {path}: {exc}", + file=sys.stderr, + ) + return None + + +def _load_credentials_from_env() -> ApiCredentials: + """Reads API credentials from environment variables.""" + return ApiCredentials( + x_cp_api_id=os.environ.get("X_CP_API_ID") or None, + x_cp_api_key=os.environ.get("X_CP_API_KEY") or None, + x_ecm_api_id=os.environ.get("X_ECM_API_ID") or None, + x_ecm_api_key=os.environ.get("X_ECM_API_KEY") or None, + ncm_api_token=os.environ.get("NCM_API_TOKEN") or None, + ) + + +def load_credentials() -> ApiCredentials: + """Load API credentials from file first, then fall back to env vars. + + Resolution order: + 1. JSON file (NCM_CREDENTIALS_FILE env var or default paths) + 2. Environment variables + """ + file_creds = _load_credentials_from_file() + if file_creds is not None: + return file_creds + return _load_credentials_from_env() diff --git a/ncm_mcp_servers/shared/error_handler.py b/ncm_mcp_servers/shared/error_handler.py new file mode 100644 index 0000000..6c23a01 --- /dev/null +++ b/ncm_mcp_servers/shared/error_handler.py @@ -0,0 +1,197 @@ +"""Error handler module for NCM MCP Servers. + +Translates ncm.py responses and exceptions into structured MCP responses. +All output is sanitized to ensure API credentials never appear in responses. +""" + +import os +from typing import Any, Dict, List, Optional + +from requests.exceptions import ConnectionError, Timeout, RequestException + + +# HTTP status code to human-readable message mapping +HTTP_ERROR_MESSAGES = { + 400: "Bad request", + 401: "Unauthorized - invalid or expired API credentials", + 403: "Forbidden - insufficient permissions", + 404: "Resource not found", + 500: "Server error - please retry", +} + +# Environment variable names that hold credential values to sanitize +_CREDENTIAL_ENV_VARS = ( + "X_CP_API_ID", + "X_CP_API_KEY", + "X_ECM_API_ID", + "X_ECM_API_KEY", + "NCM_API_TOKEN", +) + + +def _get_credential_values(): + # type: () -> List[str] + """Returns a list of non-empty credential values from environment.""" + values = [] + for var in _CREDENTIAL_ENV_VARS: + val = os.environ.get(var) + if val: + values.append(val) + return values + + +def _sanitize(text, credential_values=None): + # type: (str, Optional[List[str]]) -> str + """Strip any credential values from the given text.""" + if not isinstance(text, str): + return text + if credential_values is None: + credential_values = _get_credential_values() + for cred in credential_values: + if cred and cred in text: + text = text.replace(cred, "***") + return text + + +def _sanitize_dict(data, credential_values=None): + # type: (Any, Optional[List[str]]) -> Any + """Recursively sanitize all string values in a dict or list.""" + if credential_values is None: + credential_values = _get_credential_values() + if not credential_values: + return data + if isinstance(data, str): + return _sanitize(data, credential_values) + if isinstance(data, dict): + return {k: _sanitize_dict(v, credential_values) for k, v in data.items()} + if isinstance(data, list): + return [_sanitize_dict(item, credential_values) for item in data] + return data + + +def _parse_ncm_error(result): + # type: (str) -> Optional[Dict[str, Any]] + """Parse ncm.py error string format into structured error dict. + + The ncm.py library returns error strings in the format: + "ERROR: {status_code}: {details}" + + Returns a dict with code, message, details if the string matches, + or None if it does not. + """ + if not isinstance(result, str) or not result.startswith("ERROR:"): + return None + parts = result.split(":", 2) + if len(parts) < 2: + return None + try: + code = int(parts[1].strip()) + except (ValueError, IndexError): + return None + details = parts[2].strip() if len(parts) > 2 else "" + message = HTTP_ERROR_MESSAGES.get(code, "Unknown error") + return {"code": code, "message": message, "details": details} + + +def handle_ncm_response(result, operation): + # type: (Any, str) -> dict + """Process ncm.py return values into structured responses. + + - If *result* is an error string ("ERROR: {code}: {details}"), + parse it into a structured error response. + - If *result* is a list or dict, wrap it in a success response. + - All output is sanitized to strip credential values. + + Returns: + dict with ``success``, ``data``/``error``, and ``operation`` keys. + """ + credential_values = _get_credential_values() + + # Check for ncm.py error string + parsed = _parse_ncm_error(result) + if parsed is not None: + parsed["details"] = _sanitize(parsed["details"], credential_values) + return { + "success": False, + "error": parsed, + "operation": operation, + } + + # Successful result — sanitize and wrap + sanitized_data = _sanitize_dict(result, credential_values) + return { + "success": True, + "data": sanitized_data, + "operation": operation, + } + + +def handle_exception(exc, operation): + # type: (Exception, str) -> dict + """Handle exceptions raised during NCM API calls. + + - ConnectionError / Timeout / RequestException -> connectivity error. + - Any other Exception -> generic error without exposing internals. + """ + credential_values = _get_credential_values() + + if isinstance(exc, (ConnectionError, Timeout)): + return { + "success": False, + "error": { + "code": 0, + "message": "Connectivity error - unable to reach NCM API", + "details": _sanitize(str(exc), credential_values), + }, + "operation": operation, + } + + if isinstance(exc, RequestException): + return { + "success": False, + "error": { + "code": 0, + "message": "Connectivity error - unable to reach NCM API", + "details": _sanitize(str(exc), credential_values), + }, + "operation": operation, + } + + # Broad Exception — do not expose internals + return { + "success": False, + "error": { + "code": 0, + "message": "An unexpected error occurred", + "details": "", + }, + "operation": operation, + } + + +def validate_required_params(**params): + # type: (...) -> Optional[dict] + """Check for missing required parameters. + + Pass each required parameter as a keyword argument. If any value is + None, a structured error listing the missing parameter names is + returned. Returns None when all parameters are present. + + Example:: + + err = validate_required_params(router_id=router_id, name=name) + if err is not None: + return err + """ + missing = [name for name, value in params.items() if value is None] + if not missing: + return None + return { + "success": False, + "error": { + "code": 400, + "message": "Missing required parameters", + "details": "Missing: {}".format(", ".join(sorted(missing))), + }, + "operation": "validate_params", + } diff --git a/ncm_mcp_servers/shared/logging.py b/ncm_mcp_servers/shared/logging.py new file mode 100644 index 0000000..7034bc9 --- /dev/null +++ b/ncm_mcp_servers/shared/logging.py @@ -0,0 +1,85 @@ +"""Structured logging configuration for NCM MCP Servers. + +Provides JSON-formatted log output for containerized deployments +and human-readable output for local development. + +Usage: + from ncm_mcp_servers.shared.logging import get_logger + logger = get_logger("ncm_fleet") + logger.info("Server started", extra={"port": 3001}) +""" + +import json +import logging +import os +import sys +from datetime import datetime, timezone +from typing import Optional + + +class JsonFormatter(logging.Formatter): + """Formats log records as single-line JSON for container environments.""" + + def format(self, record: logging.LogRecord) -> str: + log_entry = { + "timestamp": datetime.now(timezone.utc).isoformat(), + "level": record.levelname, + "logger": record.name, + "message": record.getMessage(), + } + if record.exc_info and record.exc_info[0] is not None: + log_entry["exception"] = self.formatException(record.exc_info) + # Include any extra fields passed via extra={} + for key in record.__dict__: + if key not in logging.LogRecord( + "", 0, "", 0, "", (), None + ).__dict__ and key not in ("message", "msg"): + log_entry[key] = record.__dict__[key] + return json.dumps(log_entry, default=str) + + +class HumanFormatter(logging.Formatter): + """Human-readable formatter for local development.""" + + def __init__(self): + super().__init__( + fmt="%(asctime)s [%(levelname)-8s] %(name)s: %(message)s", + datefmt="%H:%M:%S", + ) + + +def get_logger( + name: str, + level: Optional[str] = None, +) -> logging.Logger: + """Get a configured logger for an NCM MCP server component. + + Args: + name: Logger name (e.g., "ncm_fleet", "ncm_monitoring"). + level: Log level override. Defaults to LOG_LEVEL env var or INFO. + + Returns: + Configured logging.Logger instance. + """ + logger = logging.getLogger(f"ncm_mcp.{name}") + + if logger.handlers: + return logger + + log_level = level or os.environ.get("LOG_LEVEL", "INFO").upper() + logger.setLevel(getattr(logging, log_level, logging.INFO)) + + handler = logging.StreamHandler(sys.stdout) + + log_format = os.environ.get("LOG_FORMAT", "auto").lower() + if log_format == "json" or ( + log_format == "auto" and not sys.stdout.isatty() + ): + handler.setFormatter(JsonFormatter()) + else: + handler.setFormatter(HumanFormatter()) + + logger.addHandler(handler) + logger.propagate = False + + return logger diff --git a/ncm_mcp_servers/shared/ncm.py b/ncm_mcp_servers/shared/ncm.py new file mode 100644 index 0000000..13908c4 --- /dev/null +++ b/ncm_mcp_servers/shared/ncm.py @@ -0,0 +1,5394 @@ +""" +Ericsson Enterprise Wireless Solutions - Cradlepoint NCM API module +Maintained by: Alex Terrell, Jon Gaudu + +Overview: + This module provides easy access to the Cradlepoint NCM API with support + for both v2 and v3 APIs. It includes a singleton pattern for simple usage + and module-level function access for convenience. + +Requirements: + Cradlepoint NCM API Keys are required to make API calls. + - For v2 API: X-CP-API-ID, X-CP-API-KEY, X-ECM-API-ID, X-ECM-API-KEY + - For v3 API: Bearer token + +Usage Options: + + 1. Zero-Configuration Usage (Recommended): + import ncm + + # Set these environment variables once: + # export X_CP_API_ID="b89a24a3" + # export X_CP_API_KEY="4b1d77fe271241b1cfafab993ef0891d" + # export X_ECM_API_ID="c71b3e68-33f5-4e69-9853-14989700f204" + # export X_ECM_API_KEY="f1ca6cd41f326c00e23322795c063068274caa30" + # export NCM_API_TOKEN="your-bearer-token" # For v3 API + + # Then just use it - no setup required! + accounts = ncm.get_accounts() + devices = ncm.get_devices() + routers = ncm.get_routers() + + 2. Explicit Configuration (Alternative): + import ncm + + # Option A: Set up API keys explicitly + api_keys = { + 'X-CP-API-ID': 'b89a24a3', + 'X-CP-API-KEY': '4b1d77fe271241b1cfafab993ef0891d', + 'X-ECM-API-ID': 'c71b3e68-33f5-4e69-9853-14989700f204', + 'X-ECM-API-KEY': 'f1ca6cd41f326c00e23322795c063068274caa30' + } + ncm.set_api_keys(api_keys) + + # Option B: Manual environment variable loading + ncm.set_api_keys() # Manually loads from environment + + 3. Traditional Class Instantiation: + import ncm + api_keys = {...} # Same as above + client = ncm.NcmClient(api_keys=api_keys) + accounts = client.get_accounts() + + 4. Mixed v2/v3 API Usage: + import ncm + api_keys = { + 'X-CP-API-ID': 'b89a24a3', + 'X-CP-API-KEY': '4b1d77fe271241b1cfafab993ef0891d', + 'X-ECM-API-ID': 'c71b3e68-33f5-4e69-9853-14989700f204', + 'X-ECM-API-KEY': 'f1ca6cd41f326c00e23322795c063068274caa30', + 'token': 'your-v3-bearer-token' # For v3 API + } + client = ncm.NcmClient(api_keys=api_keys) + # Methods will automatically route to the appropriate API version + + 5. Backward Compatibility (Legacy Scripts): + from ncm import ncm # Old import pattern still works! + + api_keys = { + 'X-ECM-API-ID': os.environ.get("X_ECM_API_ID"), + 'X-ECM-API-KEY': os.environ.get("X_ECM_API_KEY"), + 'X-CP-API-ID': os.environ.get("X_CP_API_ID"), + 'X-CP-API-KEY': os.environ.get("X_CP_API_KEY"), + 'Authorization': f'Bearer {os.environ.get("TOKEN")}' + } + + # All existing patterns work unchanged: + ncm_client = ncm.NcmClientv3(api_key=token, log_events=True) + ncm_client.set_api_keys(api_keys) # Instance method still works + + # New convenience pattern also available: + ncm.set_api_keys(api_keys) # Module-level method + routers = ncm.get_routers() # Direct method access + +Features: + - Zero-configuration usage with automatic environment variable loading + - Singleton pattern for easy module-level access + - Automatic API version routing (v3 prioritized over v2) + - Module-level function access (ncm.method_name()) + - Automatic initialization on import if environment variables are set + - Full backward compatibility with existing scripts + - Support for both import patterns: "import ncm" and "from ncm import ncm" + - Optimized pagination (default limit 500 vs API default 20) + - Support for limit='all' to get all records without paging + - Automatic chunking of "__in" filters beyond 100 item limit + +Full documentation of the Cradlepoint NCM API is available at: +https://developer.cradlepoint.com + +""" + +from requests import Session +from requests.adapters import HTTPAdapter +from http import HTTPStatus +from urllib3.util.retry import Retry +from datetime import datetime, timedelta +import sys +import os +import json +import uuid +from typing import Union, Optional, Dict, Any, Tuple + + +def __is_json(test_json): + """ + Checks if a string is a valid json object + """ + try: + json.loads(test_json) + except ValueError: + return False + return True + + +class BaseNcmClient: + def __init__(self, + log_events=True, + logger=None, + retries=5, + retry_backoff_factor=2, + retry_on=None, + base_url=None): + """ + Constructor. Sets up and opens request session. + :param retries: number of retries on failure. Optional. + :param retry_backoff_factor: backoff time multiplier for retries. + Optional. + :param retry_on: types of errors on which automatic retry will occur. + Optional. + :param base_url: # base url for calls. Configurable for testing. + Optional. + """ + if retry_on is None: + retry_on = [ + HTTPStatus.REQUEST_TIMEOUT, + HTTPStatus.GATEWAY_TIMEOUT, + HTTPStatus.SERVICE_UNAVAILABLE + ] + self.log_events = log_events + self.logger = logger + self.session = Session() + self.adapter = HTTPAdapter( + max_retries=Retry(total=retries, + backoff_factor=retry_backoff_factor, + status_forcelist=retry_on, + redirect=3 + ) + ) + self.base_url = base_url + self.session.mount(self.base_url, self.adapter) + + def log(self, level, message): + """ + Logs messages if self.logEvents is True. + """ + if self.log_events: + if self.logger: + log_level = getattr(self.logger, level) + log_level(message) + else: + print(f"{level}: {message}", file=sys.stderr) + + def _return_handler(self, status_code, returntext, obj_type): + """ + Prints returned HTTP request information if self.logEvents is True. + """ + if str(status_code) == '200': + return f'{obj_type} operation successful.' + elif str(status_code) == '201': + self.log('info', '{0} created Successfully'.format(str(obj_type))) + return returntext + elif str(status_code) == '202': + self.log('info', '{0} accepted Successfully'.format(str(obj_type))) + return returntext + elif str(status_code) == '204': + self.log('info', '{0} deleted Successfully'.format(str(obj_type))) + return returntext + elif str(status_code) == '400': + self.log('error', 'Bad Request') + return f'ERROR: {status_code}: {returntext}' + elif str(status_code) == '401': + self.log('error', 'Unauthorized Access') + return f'ERROR: {status_code}: {returntext}' + elif str(status_code) == '404': + self.log('error', 'Resource Not Found\n') + return f'ERROR: {status_code}: {returntext}' + elif str(status_code) == '500': + self.log('error', 'HTTP 500 - Server Error\n') + return f'ERROR: {status_code}: {returntext}' + else: + self.log('info', f'HTTP Status Code: {status_code} - {returntext}\n') + + +class NcmClientv2(BaseNcmClient): + def __init__(self, + api_keys=None, + log_events=True, + logger=None, + retries=5, + retry_backoff_factor=2, + retry_on=None, + base_url=None): + self.v2 = self # for backwards compatibility + base_url = base_url or os.environ.get("CP_BASE_URL", "https://www.cradlepointecm.com/api/v2") + super().__init__(log_events=log_events, logger=logger, retries=retries, retry_backoff_factor=retry_backoff_factor, retry_on=retry_on, base_url=base_url) + if api_keys: + if self.__validate_api_keys(api_keys): + self.session.headers.update(api_keys) + self.session.headers.update({ + 'Content-Type': 'application/json' + }) + + def __validate_api_keys(self, api_keys): + """ + Checks NCM API Keys are a dictionary containing all necessary keys + :param api_keys: Dictionary of API credentials. Optional. + :type api_keys: dict + :return: True if valid + """ + if not isinstance(api_keys, dict): + raise TypeError("API Keys must be passed as a dictionary") + + for key in ('X-CP-API-ID', 'X-CP-API-KEY', 'X-ECM-API-ID', 'X-ECM-API-KEY'): + if not api_keys.get(key): + raise KeyError(f"{key} missing. Please ensure all API Keys are present.") + + return True + + def __get_json(self, get_url, call_type, params=None): + """ + Returns full paginated results, and handles chunking "__in" params + in groups of 100. + """ + results = [] + __in_keys = 0 + if params['limit'] == 'all': + params['limit'] = 1000000 + limit = int(params['limit']) + + if params is not None: + # Ensures that order_by is passed as a comma separated string + if 'order_by' in params.keys(): + if type(params['order_by']) is list: + params['order_by'] = ','.join( + str(x) for x in params['order_by']) + elif type(params['order_by']) is not list and type( + params['order_by']) is not str: + raise TypeError( + "Invalid 'order_by' parameter. " + "Must be 'list' or 'str'.") + + for key, val in params.items(): + # Handles multiple filters using __in fields. + if '__in' in key: + __in_keys += 1 + # Cradlepoint limit of 100 values. + # If more than 100 values, break into chunks + chunks = self.__chunk_param(val) + # For each chunk, get the full results list and + # filter by __in parameter + for chunk in chunks: + # Handles a list of int or list of str + chunk_str = ','.join(map(str, chunk)) + params.update({key: chunk_str}) + url = get_url + if params is not None: + from urllib.parse import urlencode + query_string = urlencode(params) + separator = '&' if '?' in url else '?' + url = f'{url}{separator}{query_string}' + while url and (len(results) < limit): + ncm = self.session.get(url) + if not (200 <= ncm.status_code < 300): + break + self._return_handler(ncm.status_code, + ncm.json()['data'], + call_type) + url = ncm.json()['meta']['next'] + for d in ncm.json()['data']: + results.append(d) + + if __in_keys == 0: + url = get_url + if params is not None: + from urllib.parse import urlencode + query_string = urlencode(params) + separator = '&' if '?' in url else '?' + url = f'{url}{separator}{query_string}' + while url and (len(results) < limit): + ncm = self.session.get(url) + if not (200 <= ncm.status_code < 300): + break + self._return_handler(ncm.status_code, ncm.json()['data'], + call_type) + url = ncm.json()['meta']['next'] + for d in ncm.json()['data']: + results.append(d) + return results + + def __parse_kwargs(self, kwargs, allowed_params): + """ + Increases default return limit to 500, + and checks for invalid parameters + """ + params = {k: v for (k, v) in kwargs.items() if k in allowed_params} + if 'limit' not in params: + params.update({'limit': '500'}) + + bad_params = {k: v for (k, v) in kwargs.items() if + k not in allowed_params} + if len(bad_params) > 0: + raise ValueError("Invalid parameters: {}".format(bad_params)) + + self.__validate_api_keys(dict(self.session.headers)) + + return params + + def __chunk_param(self, param): + """ + Chunks parameters into groups of 100 per Cradlepoint limit. + Iterate through chunks with a for loop. + """ + n = 100 + + if type(param) is str: + param_list = param.split(",") + elif type(param) is list: + param_list = param + else: + raise TypeError("Invalid param format. Must be str or list.") + + """Yield successive n-sized chunks from lst.""" + for i in range(0, len(param_list), n): + yield param_list[i:i + n] + + def set_api_keys(self, api_keys): + """ + Sets NCM API Keys for session. + :param api_keys: Dictionary of API credentials. Optional. + :type api_keys: dict + """ + if self.__validate_api_keys(api_keys): + self.session.headers.update(api_keys) + return + + def get_accounts(self, **kwargs): + """ + Returns accounts with details. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: A list of accounts based on API Key. + """ + call_type = 'Accounts' + get_url = '{0}/accounts/'.format(self.base_url) + + allowed_params = ['account', 'account__in', 'fields', 'id', 'id__in', + 'name', 'name__in', 'expand', 'limit', 'offset'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def get_account_by_id(self, account_id): + """ + This method returns a single account for a given account id. + :param account_id: ID of account to return + :return: + """ + return self.get_accounts(id=account_id)[0] + + def get_account_by_name(self, account_name): + """ + This method returns a single account for a given account name. + :param account_name: Name of account to return + :return: + """ + + return self.get_accounts(name=account_name)[0] + + def create_subaccount_by_parent_id(self, parent_account_id, + subaccount_name): + """ + This operation creates a new subaccount. + :param parent_account_id: ID of parent account. + :param subaccount_name: Name for new subaccount. + :return: + """ + call_type = 'Subaccount' + post_url = '{0}/accounts/'.format(self.base_url) + + post_data = { + 'account': '/api/v1/accounts/{}/'.format(str(parent_account_id)), + 'name': str(subaccount_name) + } + + ncm = self.session.post(post_url, data=json.dumps(post_data)) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + return result + + def create_subaccount_by_parent_name(self, parent_account_name, + subaccount_name): + """ + This operation creates a new subaccount. + :param parent_account_name: Name of parent account. + :param subaccount_name: Name for new subaccount. + :return: + """ + return self.create_subaccount_by_parent_id(self.get_account_by_name( + parent_account_name)['id'], subaccount_name) + + def rename_subaccount_by_id(self, subaccount_id, new_subaccount_name): + """ + This operation renames a subaccount + :param subaccount_id: ID of subaccount to rename + :param new_subaccount_name: New name for subaccount + :return: + """ + call_type = 'Subaccount' + put_url = '{0}/accounts/{1}/'.format(self.base_url, str(subaccount_id)) + + put_data = { + "name": str(new_subaccount_name) + } + + ncm = self.session.put(put_url, data=json.dumps(put_data)) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + return result + + def rename_subaccount_by_name(self, subaccount_name, new_subaccount_name): + """ + This operation renames a subaccount + :param subaccount_name: Name of subaccount to rename + :param new_subaccount_name: New name for subaccount + :return: + """ + return self.rename_subaccount_by_id(self.get_account_by_name( + subaccount_name)['id'], new_subaccount_name) + + def delete_subaccount_by_id(self, subaccount_id): + """ + This operation deletes a subaccount + :param subaccount_id: ID of subaccount to delete + :return: + """ + call_type = 'Subaccount' + post_url = '{0}/accounts/{1}'.format(self.base_url, subaccount_id) + + ncm = self.session.delete(post_url) + result = self._return_handler(ncm.status_code, ncm.text, call_type) + return result + + def delete_subaccount_by_name(self, subaccount_name): + """ + This operation deletes a subaccount + :param subaccount_name: Name of subaccount to delete + :return: + """ + return self.delete_subaccount_by_id(self.get_account_by_name( + subaccount_name)['id']) + + def get_activity_logs(self, **kwargs): + """ + This method returns NCM activity log information. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + call_type = 'Activity Logs' + get_url = '{0}/activity_logs/'.format(self.base_url) + + allowed_params = ['account', 'created_at__exact', 'created_at__lt', + 'created_at__lte', 'created_at__gt', + 'created_at__gte', 'action__timestamp__exact', + 'action__timestamp__lt', + 'action__timestamp__lte', 'action__timestamp__gt', + 'action__timestamp__gte', 'actor__id', + 'object__id', 'action__id__exact', 'actor__type', + 'action__type', 'object__type', 'order_by', + 'limit'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def get_alerts(self, **kwargs): + """ + This method gives alert information with associated id. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + call_type = 'Alerts' + get_url = '{0}/alerts/'.format(self.base_url) + + allowed_params = ['account', 'created_at', 'created_at_timeuuid', + 'detected_at', 'friendly_info', 'info', + 'router', 'type', 'order_by', 'limit', 'offset'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def get_configuration_managers(self, **kwargs): + """ + A configuration manager is an abstract resource for controlling and + monitoring config sync on a single device. + Each device has its own corresponding configuration manager. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + call_type = 'Configuration Managers' + get_url = '{0}/configuration_managers/'.format(self.base_url) + + allowed_params = ['account', 'account__in', 'fields', 'id', 'id__in', + 'router', 'router__in', 'synched', + 'suspended', 'expand', 'limit', 'offset'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def get_configuration_manager_id(self, router_id, **kwargs): + """ + A configuration manager is an abstract resource for controlling and + monitoring config sync on a single device. + Each device has its own corresponding configuration manager. + :param router_id: Router ID to query + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + call_type = 'Configuration Managers' + get_url = '{0}/configuration_managers/?router.id={1}&fields=id'.format( + self.base_url, router_id) + + allowed_params = ['account', 'account__in', 'id', 'id__in', 'router', + 'router__in', 'synched', + 'suspended', 'expand', 'limit', 'offset'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params)[0]['id'] + + def update_configuration_managers(self, config_man_id, config_man_json): + """ + This method updates an configuration_managers for associated id. + :param config_man_id: ID of the Configuration Manager to modify + :param config_man_json: JSON of the "configuration" field of the + configuration manager + :return: + """ + call_type = 'Configuration Manager' + put_url = '{0}/configuration_managers/{1}/'.format(self.base_url, + config_man_id) + + ncm = self.session.put(put_url, json=config_man_json) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + return result + + def patch_configuration_managers(self, router_id, config_man_json): + """ + This method patches an configuration_managers for associated id. + :param router_id: ID of router to update + :param config_man_json: JSON of the "configuration" field of the + configuration manager + :return: + """ + call_type = 'Configuration Manager' + + response = self.session.get( + '{0}/configuration_managers/?router.id={1}&fields=id'.format( + self.base_url, + str(router_id))) # Get Configuration Managers ID for router + response = json.loads(response.content.decode( + "utf-8")) # Decode the response and make it a dictionary + config_man_id = response['data'][0][ + 'id'] # get the Configuration Managers ID from response + + payload = config_man_json + + ncm = self.session.patch( + '{0}/configuration_managers/{1}/'.format(self.base_url, + str(config_man_id)), + data=json.dumps(payload)) # Patch indie config with new values + + result = self._return_handler(ncm.status_code, ncm.text, call_type) + return result + + def put_configuration_managers(self, router_id, configman_json): + """ + This method overwrites the configuration for a router with id. + :param router_id: ID of router to update + :param configman_json: JSON of the "configuration" field of the + configuration manager + :return: + """ + call_type = 'Configuration Manager' + + response = self.session.get( + '{0}/configuration_managers/?router.id={1}&fields=id'.format( + self.base_url, + str(router_id))) # Get Configuration Managers ID for router + response = json.loads(response.content.decode( + "utf-8")) # Decode the response and make it a dictionary + configman_id = response['data'][0][ + 'id'] # get the Configuration Managers ID from response + + payload = configman_json + + ncm = self.session.put( + '{0}/configuration_managers/{1}/?fields=configuration'.format( + self.base_url, str(configman_id)), + json=payload) # Patch indie config with new values + result = self._return_handler(ncm.status_code, ncm.text, call_type) + return result + + def patch_group_configuration(self, group_id, config_json): + """ + This method patches an configuration_managers for associated id. + :param group_id: ID of group to update + :param config_json: JSON of the "configuration" field of the + configuration manager + :return: + """ + call_type = 'Configuration Manager' + + payload = config_json + + ncm = self.session.patch( + '{0}/groups/{1}/'.format(self.base_url, str(group_id)), + data=json.dumps(payload)) # Patch indie config with new values + result = self._return_handler(ncm.status_code, ncm.text, call_type) + return result + + def put_group_configuration(self, group_id, config_json): + """ + This method puts a group configuration for associated group id. + :param group_id: ID of group to update + :param config_json: JSON of the "configuration" field of the + group config + :return: + """ + call_type = 'Configuration Manager' + + payload = config_json + + ncm = self.session.put( + '{0}/groups/{1}/'.format(self.base_url, str(group_id)), + data=json.dumps(payload)) # put group config with new values + result = self.__return_handler(ncm.status_code, ncm.text, call_type) + return result + + def patch_group(self, group_id, **kwargs): + """ + This method patches (updates) specific fields of a group. + Only the provided fields will be updated. + + :param group_id: ID of the group to update + :param kwargs: Group fields to update. Supported fields: + - account: url - Account that a group belongs to + - configuration: json - Configuration for the group + - name: string - Name of the group + - product: url - Product type for the group + - target_firmware: url - Firmware version for the group + :return: API response + """ + call_type = 'Group Update' + + # Define the allowed writable fields based on the API documentation + allowed_fields = { + 'account', 'configuration', 'name', 'product', 'target_firmware' + } + + # Filter kwargs to only include allowed fields + payload = {} + for field, value in kwargs.items(): + if field in allowed_fields: + payload[field] = value + else: + if self.log_events: + print(f"Warning: Field '{field}' is not a supported writable field and will be ignored.") + + if not payload: + raise ValueError("No valid writable fields provided. Supported fields: {}".format(', '.join(sorted(allowed_fields)))) + + ncm = self.session.patch( + '{0}/groups/{1}/'.format(self.base_url, str(group_id)), + data=json.dumps(payload)) + + result = self._return_handler(ncm.status_code, ncm.text, call_type) + return result + + def copy_router_configuration(self, src_router_id, dst_router_id): + """ + Copies the Configuration Manager config of one router to another. + This function will not copy any passwords as they are encrypted. + :param src_router_id: Router ID to copy from + :param dst_router_id: Router ID to copy to + :return: Should return HTTP Status Code 202 if successful + """ + call_type = 'Configuration Manager' + """Get source router existing configuration""" + src_config = self.get_configuration_managers(router=src_router_id, + fields='configuration')[0] + + """Strip passwords which aren't stored in plain text""" + src_config = json.dumps(src_config).replace(', "wpapsk": "*"','').replace('"wpapsk": "*"', '').replace(', "password": "*"', '').replace('"password": "*"', '') + + """Get destination router Configuration Manager ID""" + dst_config_man_id = \ + self.get_configuration_managers(router=dst_router_id)[0]['id'] + + put_url = '{0}/configuration_managers/{1}/'.format(self.base_url, + dst_config_man_id) + + ncm = self.session.patch(put_url, data=src_config) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + return result + + def resume_updates_for_router(self, router_id): + """ + This method will resume updates for a router in Sync Suspended state. + :param router_id: ID of router to update + :return: + """ + call_type = 'Configuration Manager' + + response = self.session.get( + '{0}/configuration_managers/?router.id={1}&fields=id'.format( + self.base_url, + str(router_id))) # Get Configuration Managers ID for router + response = json.loads(response.content.decode("utf-8")) + configman_id = response['data'][0]['id'] + payload = {"suspended": False} + + ncm = self.session.put( + '{0}/configuration_managers/{1}/'.format(self.base_url, + str(configman_id)), + json=payload) + result = self._return_handler(ncm.status_code, ncm.text, call_type) + return result + + def get_device_app_bindings(self, **kwargs): + """ + This method gives device app binding information for all device + app bindings associated with the account. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + call_type = 'Device App Bindings' + get_url = '{0}/device_app_bindings/'.format(self.base_url) + + allowed_params = ['account', 'account__in', 'group', 'group__in', + 'app_version', 'app_version__in', + 'id', 'id__in', 'state', 'state__in', 'expand', + 'limit', 'offset'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def get_device_app_states(self, **kwargs): + """ + This method gives device app state information for all device + app states associated with the account. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + call_type = 'Device App States' + get_url = '{0}/device_app_states/'.format(self.base_url) + + allowed_params = ['account', 'account__in', 'router', 'router__in', + 'app_version', 'app_version__in', + 'id', 'id__in', 'state', 'state__in', 'expand', + 'limit', 'offset'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def get_device_app_versions(self, **kwargs): + """ + This method gives device app version information for all device + app versions associated with the account. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + call_type = 'Device App Versions' + get_url = '{0}/device_app_versions/'.format(self.base_url) + + allowed_params = ['account', 'account__in', 'app', 'app__in', 'id', + 'id__in', 'state', 'state__in', + 'expand', 'limit', 'offset'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def get_device_apps(self, **kwargs): + """ + This method gives device app information for all device apps + associated with the account. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + call_type = 'Device Apps' + get_url = '{0}/device_apps/'.format(self.base_url) + + allowed_params = ['account', 'account__in', 'name', 'name__in', 'id', + 'id__in', 'uuid', 'uuid__in', + 'expand', 'order_by', 'limit', 'offset'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def get_failovers(self, **kwargs): + """ + This method returns a list of Failover Events for + a device, group, or account. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + call_type = 'Failovers' + get_url = '{0}/failovers/'.format(self.base_url) + + allowed_params = ['account_id', 'group_id', 'router_id', 'started_at', + 'ended_at', 'order_by', 'limit', 'offset'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def get_firmwares(self, **kwargs): + """ + This operation gives the list of device firmwares. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + call_type = 'Firmwares' + get_url = '{0}/firmwares/'.format(self.base_url) + + allowed_params = ['id', 'id__in', 'version', 'version__in', 'limit', + 'offset'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def get_firmware_for_product_id_by_version(self, product_id, + firmware_name): + """ + This operation returns firmwares for a given model ID and version name. + :param product_id: The ID of the product (e.g. 46) + :param firmware_name: The Firmware Version (e.g. 7.2.0) + :return: + """ + for f in self.get_firmwares(version=firmware_name): + if f['product'] == '{0}/products/{1}/'.format(self.base_url, + str(product_id)): + return f + raise ValueError("Invalid Firmware Version") + + def get_firmware_for_product_name_by_version(self, product_name, + firmware_name): + """ + This operation returns firmwares for a given model and version name. + :param product_name: The Name of the product (e.g. IBR200) + :param firmware_name: The Firmware Version (e.g. 7.2.0) + :return: + """ + product_id = self.get_product_by_name(product_name)['id'] + return self.get_firmware_for_product_id_by_version(product_id, + firmware_name) + + def get_groups(self, **kwargs): + """ + This method gives a groups list. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + call_type = 'Groups' + get_url = '{0}/groups/'.format(self.base_url) + + allowed_params = ['account', 'account__in', 'id', 'id__in', 'name', + 'name__in', 'expand', 'fields', 'limit', 'offset'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def get_group_by_id(self, group_id): + """ + This method returns a single group. + :param group_id: The ID of the group. + :return: + """ + return self.get_groups(id=group_id)[0] + + def get_group_by_name(self, group_name): + """ + This method returns a single group. + :param group_name: The Name of the group. + :return: + """ + return self.get_groups(name=group_name)[0] + + def create_group_by_parent_id(self, parent_account_id, group_name, + product_name, firmware_version): + """ + This operation creates a new group. + :param parent_account_id: ID of parent account + :param group_name: Name for new group + :param product_name: Product model (e.g. IBR200) + :param firmware_version: Firmware version for group (e.g. 7.2.0) + :return: + Example: n.create_group_by_parent_id('123456', 'My New Group', + 'IBR200', '7.2.0') + """ + + call_type = 'Group' + post_url = '{0}/groups/'.format(self.base_url) + + firmware = self.get_firmware_for_product_name_by_version( + product_name, firmware_version) + + post_data = { + 'account': '/api/v1/accounts/{}/'.format(str(parent_account_id)), + 'name': str(group_name), + 'product': str( + self.get_product_by_name(product_name)['resource_url']), + 'target_firmware': str(firmware['resource_url']) + } + + ncm = self.session.post(post_url, data=json.dumps(post_data)) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + return result + + def create_group_by_parent_name(self, parent_account_name, group_name, + product_name, firmware_version): + """ + This operation creates a new group. + :param parent_account_name: Name of parent account + :param group_name: Name for new group + :param product_name: Product model (e.g. IBR200) + :param firmware_version: Firmware version for group (e.g. 7.2.0) + :return: + Example: n.create_group_by_parent_name('Parent Account', + 'My New Group', 'IBR200', '7.2.0') + """ + + return self.create_group_by_parent_id( + self.get_account_by_name(parent_account_name)['id'], group_name, + product_name, firmware_version) + + def rename_group_by_id(self, group_id, new_group_name): + """ + This operation renames a group by specifying ID. + :param group_id: ID of the group to rename. + :param new_group_name: New name for the group. + :return: + """ + call_type = 'Group' + put_url = '{0}/groups/{1}/'.format(self.base_url, group_id) + + put_data = { + "name": str(new_group_name) + } + + ncm = self.session.put(put_url, data=json.dumps(put_data)) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + return result + + def rename_group_by_name(self, existing_group_name, new_group_name): + """ + This operation renames a group by specifying name. + :param existing_group_name: Name of the group to rename + :param new_group_name: New name for the group. + :return: + """ + return self.rename_group_by_id( + self.get_group_by_name(existing_group_name)['id'], new_group_name) + + def delete_group_by_id(self, group_id): + """ + This operation deletes a group by specifying ID. + :param group_id: ID of the group to delete + :return: + """ + call_type = 'Group' + post_url = '{0}/groups/{1}/'.format(self.base_url, group_id) + + ncm = self.session.delete(post_url) + result = self._return_handler(ncm.status_code, ncm.text, call_type) + return result + + def delete_group_by_name(self, group_name): + """ + This operation deletes a group by specifying Name. + :param group_name: Name of the group to delete + :return: + """ + return self.delete_group_by_id( + self.get_group_by_name(group_name)['id']) + + def get_historical_locations(self, router_id, **kwargs): + """ + This method returns a list of locations visited by a device. + :param router_id: ID of the router + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + call_type = 'Historical Locations' + get_url = '{0}/historical_locations/?router={1}'.format(self.base_url, + router_id) + + allowed_params = ['created_at__gt', 'created_at_timeuuid__gt', + 'created_at__lte', 'fields', 'limit', 'offset'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def get_historical_locations_for_date(self, router_id, date, + tzoffset_hrs=0, limit='all', + **kwargs): + """ + This method provides a history of device alerts. + To receive device alerts, you must enable them through the NCM UI: + Alerts -> Settings. The info section of the alert is firmware dependent + and may change between firmware releases. + :param router_id: ID of the router + :param date: Date to filter logs. Must be in format "YYYY-mm-dd" + :type date: str + :param tzoffset_hrs: Offset from UTC for local timezone + :type tzoffset_hrs: int + :param limit: Number of records to return. + Specifying "all" returns all records. Default all. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + + d = datetime.strptime(date, '%Y-%m-%d') + timedelta(hours=tzoffset_hrs) + start = d.strftime("%Y-%m-%dT%H:%M:%S") + end = (d + timedelta(hours=24)).strftime("%Y-%m-%dT%H:%M:%S") + + call_type = 'Historical Locations' + get_url = '{0}/historical_locations/?router={1}'.format(self.base_url, + router_id) + + allowed_params = ['created_at__gt', 'created_at_timeuuid__gt', + 'created_at__lte', 'fields', 'limit', 'offset'] + params = self.__parse_kwargs(kwargs, allowed_params) + + params.update({'created_at__lte': end, + 'created_at__gt': start, + 'limit': limit}) + + return self.__get_json(get_url, call_type, params=params) + + def get_locations(self, **kwargs): + """ + This method gives a list of locations. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + call_type = 'Locations' + get_url = '{0}/locations/'.format(self.base_url) + + allowed_params = ['id', 'id__in', 'router', 'router__in', 'limit', 'offset'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def create_location(self, account_id, latitude, longitude, router_id): + """ + This method creates a location and applies it to a router. + :param account_id: Account which owns the object + :param latitude: A device's relative position north or south + on the Earth's surface, in degrees from the Equator + :param longitude: A device's relative position east or west + on the Earth's surface, in degrees from the prime meridian + :param router_id: Device that the location is associated with + :return: + """ + + call_type = 'Locations' + post_url = '{0}/locations/'.format(self.base_url) + + post_data = { + 'account': + 'https://www.cradlepointecm.com/api/v2/accounts/{}/'.format( + str(account_id)), + 'accuracy': 0, + 'latitude': latitude, + 'longitude': longitude, + 'method': 'manual', + 'router': 'https://www.cradlepointecm.com/api/v2/routers/{}/' + .format(str(router_id)) + } + + ncm = self.session.post(post_url, data=json.dumps(post_data)) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + return result + + def delete_location_for_router(self, router_id): + """ + This operation deletes the location for a router by ID. + :param router_id: ID of router for which to remove location. + :return: + """ + call_type = 'Locations' + + locations = self.get_locations(router=router_id) + if locations: + location_id = locations[0]['id'] + + post_url = '{0}/locations/{1}/'.format(self.base_url, location_id) + + ncm = self.session.delete(post_url) + result = self._return_handler(ncm.status_code, ncm.text, + call_type) + return result + else: + return "NO LOCATION FOUND" + + def get_net_device_health(self, **kwargs): + """ + This operation gets cellular heath scores, by device. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + call_type = 'Net Device Health' + get_url = '{0}/net_device_health/'.format(self.base_url) + + allowed_params = ['net_device'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def get_net_device_metrics(self, **kwargs): + """ + This endpoint is supplied to allow easy access to the latest signal and + usage data reported by an account's net_devices without querying the + historical raw sample tables, which are not optimized for a query + spanning many net_devices at once. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + call_type = 'Net Device Metrics' + get_url = '{0}/net_device_metrics/'.format(self.base_url) + + allowed_params = ['net_device', 'net_device__in', 'update_ts__lt', + 'update_ts__gt', 'limit', 'offset'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def get_net_devices_metrics_for_wan(self, **kwargs): + """ + This endpoint is supplied to allow easy access to the latest signal and + usage data reported by an account's net_devices without querying the + historical raw sample tables, which are not optimized for a query + spanning many net_devices at once. Returns data only for + WAN interfaces. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + ids = [] + for net_device in self.get_net_devices(mode='wan'): + ids.append(net_device['id']) + idstring = ','.join(str(x) for x in ids) + return self.get_net_device_metrics(net_device__in=idstring, **kwargs) + + def get_net_devices_metrics_for_mdm(self, **kwargs): + """ + This endpoint is supplied to allow easy access to the latest signal and + usage data reported by an account's net_devices without querying the + historical raw sample tables, which are not optimized for a query + spanning many net_devices at once. Returns data only for + modem interfaces. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + ids = [] + for net_device in self.get_net_devices(is_asset=True): + ids.append(net_device['id']) + idstring = ','.join(str(x) for x in ids) + return self.get_net_device_metrics(net_device__in=idstring, **kwargs) + + def get_net_device_signal_samples(self, **kwargs): + """ + This endpoint is supplied to allow easy access to the latest signal and + usage data reported by an account's net_devices without querying the + historical raw sample tables, which are not optimized for a query + spanning many net_devices at once. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + call_type = 'Get Net Device Signal Samples' + get_url = '{0}/net_device_signal_samples/'.format(self.base_url) + + allowed_params = ['net_device', 'net_device__in', 'created_at', + 'created_at__lt', 'created_at__gt', + 'created_at_timeuuid', 'created_at_timeuuid__in', + 'created_at_timeuuid__gt', + 'created_at_timeuuid__gte', + 'created_at_timeuuid__lt', + 'created_at_timeuuid__lte', + 'order_by', 'limit', 'offset'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def get_net_device_usage_samples(self, **kwargs): + """ + This method provides information about the net device's + overall network traffic. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + call_type = 'Net Device Usage Samples' + get_url = '{0}/net_device_usage_samples/'.format(self.base_url) + + allowed_params = ['net_device', 'net_device__in', 'created_at', + 'created_at__lt', 'created_at__gt', + 'created_at_timeuuid', 'created_at_timeuuid__in', + 'created_at_timeuuid__gt', + 'created_at_timeuuid__gte', + 'created_at_timeuuid__lt', + 'created_at_timeuuid__lte', + 'order_by', 'limit', 'offset'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def get_net_devices(self, **kwargs): + """ + This method gives a list of net devices. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + call_type = 'Net Devices' + get_url = '{0}/net_devices/'.format(self.base_url) + + allowed_params = ['account', 'account__in', 'connection_state', + 'connection_state__in', 'fields', 'id', 'id__in', + 'is_asset', 'ipv4_address', 'ipv4_address__in', + 'mode', 'mode__in', 'router', 'router__in', + 'updated_at__gt', 'updated_at__lt', + 'expand', 'limit', 'offset'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def get_net_devices_for_router(self, router_id, **kwargs): + """ + This method gives a list of net devices for a given router. + :param router_id: ID of the router + :return: + """ + return self.get_net_devices(router=router_id, **kwargs) + + def get_net_devices_for_router_by_mode(self, router_id, mode, **kwargs): + """ + This method gives a list of net devices for a given router, + filtered by mode (lan/wan). + :param router_id: ID of router + :param mode: lan/wan + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + return self.get_net_devices(router=router_id, mode=mode, **kwargs) + + def get_products(self, **kwargs): + """ + This method gives a list of product information. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + call_type = 'Products' + get_url = '{0}/products/'.format(self.base_url) + + allowed_params = ['id', 'id__in', 'limit', 'offset'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def get_product_by_id(self, product_id): + """ + This method returns a single product by ID. + :param product_id: ID of product (e.g. 46) + :return: + """ + return self.get_products(id=product_id)[0] + + def get_product_by_name(self, product_name): + """ + This method returns a single product for a given model name. + :param product_name: Name of product (e.g. IBR200) + :return: + """ + for p in self.get_products(): + if p['name'] == product_name: + return p + raise ValueError("Invalid Product Name") + + def reboot_device(self, router_id): + """ + This operation reboots a device. + :param router_id: ID of router to reboot + :return: + """ + call_type = 'Reboot Device' + post_url = '{0}/reboot_activity/'.format(self.base_url) + + post_data = { + 'router': '{0}/routers/{1}/'.format(self.base_url, str(router_id)) + } + + ncm = self.session.post(post_url, data=json.dumps(post_data)) + result = self._return_handler(ncm.status_code, ncm.text, call_type) + return result + + def reboot_group(self, group_id): + """ + This operation reboots all routers in a group. + :param group_id: ID of group to reboot + :return: + """ + call_type = 'Reboot Group' + post_url = '{0}/reboot_activity/'.format(self.base_url) + + post_data = { + 'group': '{0}/groups/{1}/'.format(self.base_url, str(group_id)) + } + + ncm = self.session.post(post_url, data=json.dumps(post_data)) + result = self._return_handler(ncm.status_code, ncm.text, call_type) + return result + + def get_router_alerts(self, **kwargs): + """ + This method provides a history of device alerts. To receive device + alerts, you must enable them through the ECM UI: Alerts -> Settings. + The info section of the alert is firmware dependent and + may change between firmware releases. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + call_type = 'Router Alerts' + get_url = '{0}/router_alerts/'.format(self.base_url) + + allowed_params = ['router', 'router__in', 'created_at', + 'created_at__lt', 'created_at__gt', + 'created_at_timeuuid', 'created_at_timeuuid__in', + 'created_at_timeuuid__gt', + 'created_at_timeuuid__gte', + 'created_at_timeuuid__lt', + 'created_at_timeuuid__lte', + 'order_by', 'limit', 'offset'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def get_router_alerts_last_24hrs(self, tzoffset_hrs=0, **kwargs): + """ + This method provides a history of device alerts. + To receive device alerts, you must enable them through the NCM UI: + Alerts -> Settings. The info section of the alert is firmware dependent + and may change between firmware releases. + :param tzoffset_hrs: Offset from UTC for local timezone + :type tzoffset_hrs: int + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + d = datetime.utcnow() + timedelta(hours=tzoffset_hrs) + end = d.strftime("%Y-%m-%dT%H:%M:%S") + start = (d - timedelta(hours=24)).strftime("%Y-%m-%dT%H:%M:%S") + + call_type = 'Router Alerts' + get_url = '{0}/router_alerts/'.format(self.base_url) + + allowed_params = ['router', 'router__in'] + params = self.__parse_kwargs(kwargs, allowed_params) + + params.update({'created_at__lt': end, + 'created_at__gt': start, + 'order_by': 'created_at_timeuuid', + 'limit': '500'}) + + return self.__get_json(get_url, call_type, params=params) + + def get_router_alerts_for_date(self, date, tzoffset_hrs=0, **kwargs): + """ + This method provides a history of device alerts. + To receive device alerts, you must enable them through the NCM UI: + Alerts -> Settings. The info section of the alert is firmware dependent + and may change between firmware releases. + :param date: Date to filter logs. Must be in format "YYYY-mm-dd" + :type date: str + :param tzoffset_hrs: Offset from UTC for local timezone + :type tzoffset_hrs: int + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + + d = datetime.strptime(date, '%Y-%m-%d') + timedelta(hours=tzoffset_hrs) + start = d.strftime("%Y-%m-%dT%H:%M:%S") + end = (d + timedelta(hours=24)).strftime("%Y-%m-%dT%H:%M:%S") + + call_type = 'Router Alerts' + get_url = '{0}/router_alerts/'.format(self.base_url) + + allowed_params = ['router', 'router__in'] + params = self.__parse_kwargs(kwargs, allowed_params) + + params.update({'created_at__lt': end, + 'created_at__gt': start, + 'order_by': 'created_at_timeuuid', + 'limit': '500'}) + + return self.__get_json(get_url, call_type, params=params) + + def get_router_logs(self, router_id, **kwargs): + """ + This method provides a history of device events. + To receive device logs you must enable them on the Group settings form. + Enabling device logs can significantly increase the ECM network traffic + from the device to the server depending on how quickly the device is + generating events. + :param router_id: ID of router from which to grab logs. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + call_type = 'Router Logs' + get_url = '{0}/router_logs/?router={1}'.format(self.base_url, + router_id) + + allowed_params = ['created_at', 'created_at__lt', 'created_at__gt', + 'created_at_timeuuid', + 'created_at_timeuuid__in', 'created_at_timeuuid__gt', + 'created_at_timeuuid__gte', + 'created_at_timeuuid__lt', + 'created_at_timeuuid__lte', 'order_by', 'limit', + 'offset'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def get_router_logs_last_24hrs(self, router_id, tzoffset_hrs=0): + """ + This method provides a history of device events. + To receive device logs you must enable them on the Group settings form. + Enabling device logs can significantly increase the ECM network traffic + from the device to the server depending on how quickly the device is + generating events. + :param router_id: ID of router from which to grab logs. + :param tzoffset_hrs: Offset from UTC for local timezone + :type tzoffset_hrs: int + :return: + """ + d = datetime.utcnow() + timedelta(hours=tzoffset_hrs) + end = d.strftime("%Y-%m-%dT%H:%M:%S") + start = (d - timedelta(hours=24)).strftime("%Y-%m-%dT%H:%M:%S") + + call_type = 'Router Logs' + get_url = '{0}/router_logs/?router={1}'.format(self.base_url, + router_id) + + params = {'created_at__lt': end, 'created_at__gt': start, + 'order_by': 'created_at_timeuuid', 'limit': '500'} + + return self.__get_json(get_url, call_type, params=params) + + def get_router_logs_for_date(self, router_id, date, tzoffset_hrs=0): + """ + This method provides a history of device events. + To receive device logs you must enable them on the Group settings form. + Enabling device logs can significantly increase the ECM network traffic + from the device to the server depending on how quickly the device is + generating events. + :param router_id: ID of router from which to grab logs. + :param date: Date to filter logs. Must be in format "YYYY-mm-dd" + :type date: str + :param tzoffset_hrs: Offset from UTC for local timezone + :type tzoffset_hrs: int + :return: + """ + + d = datetime.strptime(date, '%Y-%m-%d') + timedelta(hours=tzoffset_hrs) + start = d.strftime("%Y-%m-%dT%H:%M:%S") + end = (d + timedelta(hours=24)).strftime("%Y-%m-%dT%H:%M:%S") + + call_type = 'Router Logs' + get_url = '{0}/router_logs/?router={1}'.format(self.base_url, + router_id) + + params = {'created_at__lt': end, 'created_at__gt': start, + 'order_by': 'created_at_timeuuid', 'limit': '500'} + + return self.__get_json(get_url, call_type, params=params) + + def get_router_state_samples(self, **kwargs): + """ + This method provides information about the connection state of the + device with the NCM server. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + call_type = 'Router State Samples' + get_url = '{0}/router_state_samples/'.format(self.base_url) + + allowed_params = ['router', 'router__in', 'created_at', + 'created_at__lt', 'created_at__gt', + 'created_at_timeuuid', 'created_at_timeuuid__in', + 'created_at_timeuuid__gt', + 'created_at_timeuuid__gte', + 'created_at_timeuuid__lt', + 'created_at_timeuuid__lte', + 'order_by', 'limit', 'offset'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def get_router_stream_usage_samples(self, **kwargs): + """ + This method provides information about the connection state of the + device with the NCM server. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + call_type = 'Router Stream Usage Samples' + get_url = '{0}/router_stream_usage_samples/'.format(self.base_url) + + allowed_params = ['router', 'router__in', 'created_at', + 'created_at__lt', 'created_at__gt', + 'created_at_timeuuid', 'created_at_timeuuid__in', + 'created_at_timeuuid__gt', + 'created_at_timeuuid__gte', + 'created_at_timeuuid__lt', + 'created_at_timeuuid__lte', + 'order_by', 'limit', 'offset'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def get_routers(self, **kwargs): + """ + This method gives device information with associated id. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + call_type = 'Routers' + get_url = '{0}/routers/'.format(self.base_url) + + allowed_params = ['account', 'account__in', 'device_type', + 'device_type__in', 'fields', 'group', 'group__in', + 'id', 'id__in', 'ipv4_address', 'ipv4_address__in', + 'mac', 'mac__in', 'name', 'name__in', + 'reboot_required', 'reboot_required__in', + 'serial_number', 'serial_number__in', 'state', 'state__in', + 'state_updated_at__lt', 'state_updated_at__gt', + 'updated_at__lt', 'updated_at__gt', 'expand', + 'order_by', 'limit', 'offset'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def get_router_by_id(self, router_id, **kwargs): + """ + This method gives device information for a given router ID. + :param router_id: ID of router + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + return self.get_routers(id=router_id, **kwargs)[0] + + def get_router_by_name(self, router_name, **kwargs): + """ + This method gives device information for a given router name. + :param router_name: Name of router + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + return self.get_routers(name=router_name, **kwargs)[0] + + def get_routers_for_account(self, account_id, **kwargs): + """ + This method gives a groups list filtered by account. + :param account_id: Account ID to filter + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + return self.get_routers(account=account_id, **kwargs) + + def get_routers_for_group(self, group_id, **kwargs): + """ + This method gives a groups list filtered by group. + :param group_id: Group ID to filter + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: + """ + return self.get_routers(group=group_id, **kwargs) + + def rename_router_by_id(self, router_id, new_router_name): + """ + This operation renames a router by ID. + :param router_id: ID of router to rename + :param new_router_name: New name for router + :return: + """ + call_type = 'Router' + put_url = '{0}/routers/{1}/'.format(self.base_url, router_id) + + put_data = { + 'name': str(new_router_name) + } + + ncm = self.session.put(put_url, data=json.dumps(put_data)) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + return result + + def rename_router_by_name(self, existing_router_name, new_router_name): + """ + This operation renames a router by name. + :param existing_router_name: Name of router to rename + :param new_router_name: New name for router + :return: + """ + return self.rename_router_by_id( + self.get_router_by_name(existing_router_name)['id'], new_router_name) + + def assign_router_to_group(self, router_id, group_id): + """ + This operation assigns a router to a group. + :param router_id: ID of router to move. + :param group_id: ID of destination group. + :return: + """ + call_type = "Router" + + put_url = '{0}/routers/{1}/'.format(self.base_url, str(router_id)) + + put_data = { + "group": 'https://www.cradlepointecm.com/api/v2/groups/{}/'.format( + group_id) + } + + ncm = self.session.put(put_url, data=json.dumps(put_data)) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + return result + + def remove_router_from_group(self, router_id=None, router_name=None): + """ + This operation removes a router from its group. + Either the ID or the name must be specified. + :param router_id: ID of router to move. + :param router_name: Name of router to move + :return: + """ + call_type = "Router" + if not router_id and not router_name: + return "ERROR: Either Router ID or Router Name must be specified." + if not router_id: + router_id = self.get_router_by_name(router_name)['id'] + + put_url = '{0}/routers/{1}/'.format(self.base_url, str(router_id)) + + put_data = { + "group": None + } + + ncm = self.session.put(put_url, data=json.dumps(put_data)) + if ncm.status_code == 201 or ncm.status_code == 202: + self.log('info', 'Router Modified Successfully') + return None + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + return result + + def assign_router_to_account(self, router_id, account_id): + """ + This operation assigns a router to an account. + :param router_id: ID of router to move. + :param account_id: ID of destination account. + :return: + """ + call_type = "Routers" + + put_url = '{0}/routers/{1}/'.format(self.base_url, str(router_id)) + + put_data = { + "account": + 'https://www.cradlepointecm.com/api/v2/accounts/{}/'.format( + account_id) + } + + ncm = self.session.put(put_url, data=json.dumps(put_data)) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + return result + + def delete_router_by_id(self, router_id): + """ + This operation deletes a router by ID. + :param router_id: ID of router to delete. + :return: + """ + call_type = 'Router' + post_url = '{0}/routers/{1}/'.format(self.base_url, router_id) + + ncm = self.session.delete(post_url) + result = self._return_handler(ncm.status_code, ncm.text, call_type) + return result + + unregister_router_by_id = delete_router_by_id + + def delete_router_by_name(self, router_name): + """ + This operation deletes a router by name. + :param router_name: Name of router to delete + :return: + """ + return self.delete_router_by_id( + self.get_router_by_name(router_name)['id']) + + unregister_router_by_name = delete_router_by_name + + def create_speed_test(self, net_device_ids: list, account_id=None, + host="netperf-west.bufferbloat.net", + max_test_concurrency=5, port=12865, size=None, + test_timeout=10, test_type="TCP Download", time=10): + """ + This method creates a speed test using Netperf. + + Usage Example: + n.create_speed_test([12345]) + + :param account_id: Account in which to create the speed_test record. + :param host: URL of Speedtest Server. + :param max_test_concurrency: Number of maximum simultaneous tests to server (1-50). + :param net_device_ids: List of net_device IDs (up to 10,000 net_device IDs per request). + :param port: TCP port for test. + :param size: Number of bytes to transfer. + :param test_timeout: Test timeout in seconds. + :param test_type: TCP Download, TCP Upload, TCP Latency + :param time: Test time + :return: + """ + call_type = 'Speed Test' + post_url = '{0}/speed_test/'.format(self.base_url) + + if account_id is None: + account_id = self.get_accounts()[0]['id'] + + post_data = { + "account": f"https://www.cradlepointecm.com/api/v2/accounts/{account_id}/", + "config": { + "host": host, + "max_test_concurrency": max_test_concurrency, + "net_device_ids": net_device_ids, + "port": port, + "size": size, + "test_timeout": test_timeout, + "test_type": test_type, + "time": time + } + } + + ncm = self.session.post(post_url, data=json.dumps(post_data)) + if ncm.status_code == 201: + return ncm.json() + else: + return ncm.text + + def create_speed_test_mdm(self, router_id, account_id=None, + host="netperf-west.bufferbloat.net", + max_test_concurrency=5, port=12865, size=None, + test_timeout=10, test_type="TCP Download", time=10): + """ + This method creates a speed test using Netperf for all connected + modems by specifying a router_id. This is helpful when the desired + net_device_id(s) are not known + + Usage Example: + n.create_speed_test_mdm(12345) + + :param account_id: Account in which to create the speed_test record. + :param host: URL of Speedtest Server. + :param max_test_concurrency: Number of maximum simultaneous tests to server (1-50). + :param router_id: Router ID to test. + :param port: TCP port for test. + :param size: Number of bytes to transfer. + :param test_timeout: Test timeout in seconds. + :param test_type: TCP Download, TCP Upload, TCP Latency + :param time: Test time + :return: + """ + + net_devices = self.get_net_devices_for_router(router_id, connection_state='connected', is_asset=True) + net_device_ids = [int(x["id"]) for x in net_devices] + speed_test = self.create_speed_test(net_device_ids=net_device_ids, + account_id=account_id, + host=host, + max_test_concurrency=max_test_concurrency, + port=port, + size=size, + test_timeout=test_timeout, + test_type=test_type, + time=time) + return speed_test + + def get_speed_test(self, speed_test_id, **kwargs): + """ + This method gets the status/results of a created speed test. + + Usage Example: + speed_test = n.create_speed_test([123456]) + n.get_speed_test(speed_test['id']) + + :param speed_test_id: ID of a speed_test record + :return: + """ + call_type = 'Speed Test' + get_url = '{0}/speed_test/{1}/'.format(self.base_url, speed_test_id) + + return self.session.get(get_url).json() + + + def set_lan_ip_address(self, router_id, lan_ip, netmask=None, + network_id=0): + """ + This method sets the Primary LAN IP Address for a given router id. + :param router_id: ID of router to update + :param lan_ip: LAN IP Address. (e.g. 192.168.1.1) + :param netmask: Subnet mask. (e.g. 255.255.255.0) + :param network_id: The ID of the network to update. + Numbering starts from 0. Defaults to Primary LAN. + :return: + """ + call_type = 'LAN IP Address' + + response = self.session.get( + '{0}/configuration_managers/?router.id={1}&fields=id'.format( + self.base_url, + str(router_id))) # Get Configuration Managers ID + response = json.loads(response.content.decode( + "utf-8")) # Decode the response and make it a dictionary + config_man_id = response['data'][0][ + 'id'] # get the Configuration Managers ID from response + + if netmask: + payload = { + "configuration": [ + { + "lan": { + network_id: { + "ip_address": lan_ip, + "netmask": netmask + } + } + }, + [] + ] + } + + else: + payload = { + "configuration": [ + { + "lan": { + network_id: { + "ip_address": lan_ip + } + } + }, + [] + ] + } + + ncm = self.session.patch( + '{0}/configuration_managers/{1}/'.format(self.base_url, + str(config_man_id)), + data=json.dumps(payload)) # Patch indie config with new values + result = self._return_handler(ncm.status_code, ncm.text, call_type) + return result + + def set_custom1(self, router_id, text): + """ + This method updates the Custom1 field in NCM for a given router id. + :param router_id: ID of router to update. + :param text: The text to set for the field + :return: + """ + call_type = "NCM Field Update" + + put_url = '{0}/routers/{1}/'.format(self.base_url, str(router_id)) + + put_data = { + "custom1": str(text) + } + + ncm = self.session.put(put_url, data=json.dumps(put_data)) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + return result + + def set_custom2(self, router_id, text): + """ + This method updates the Custom2 field in NCM for a given router id. + :param router_id: ID of router to update. + :param text: The text to set for the field + :return: + """ + call_type = "NCM Field Update" + + put_url = '{0}/routers/{1}/'.format(self.base_url, str(router_id)) + + put_data = { + "custom2": str(text) + } + + ncm = self.session.put(put_url, data=json.dumps(put_data)) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + return result + + def set_admin_password(self, router_id: int, new_password: str): + """ + This method sets the local admin password for a router. + :param router_id: ID of router to update + :param new_password: Cleartext password to assign + :return: + """ + call_type = 'Admin Password' + + response = self.session.get( + '{0}/configuration_managers/?router.id={1}&fields=id'.format( + self.base_url, + str(router_id))) # Get Configuration Managers ID + response = json.loads(response.content.decode( + "utf-8")) # Decode the response and make it a dictionary + config_man_id = response['data'][0][ + 'id'] # get the Configuration Managers ID from response + + payload = { + "configuration": [ + { + "system": { + "users": { + "0": { + "password": new_password + } + } + } + }, + [] + ] + } + + ncm = self.session.patch( + '{0}/configuration_managers/{1}/'.format(self.base_url, + str(config_man_id)), + data=json.dumps(payload)) # Patch indie config with new values + result = self._return_handler(ncm.status_code, ncm.text, call_type) + return result + + def set_router_name(self, router_id: int, new_router_name: str): + """ + This method sets the local admin password for a router. + :param router_id: ID of router to update + :param new_router_name: Name/System ID to set + :return: + """ + call_type = 'Router Name' + + response = self.session.get( + '{0}/configuration_managers/?router.id={1}&fields=id'.format( + self.base_url, + str(router_id))) # Get Configuration Managers ID + response = json.loads(response.content.decode( + "utf-8")) # Decode the response and make it a dictionary + config_man_id = response['data'][0][ + 'id'] # get the Configuration Managers ID from response + + payload = { + "configuration": [ + { + "system": { + "system_id": new_router_name + } + }, + [] + ] + } + + ncm = self.session.patch( + '{0}/configuration_managers/{1}/'.format(self.base_url, + str(config_man_id)), + data=json.dumps(payload)) # Patch indie config with new values + result = self._return_handler(ncm.status_code, ncm.text, call_type) + return result + + def set_router_description(self, router_id: int, new_router_description: str): + """ + This method sets the local admin password for a router. + :param router_id: ID of router to update + :param new_router_description: Description string to set + :return: + """ + call_type = 'Description' + + response = self.session.get( + '{0}/configuration_managers/?router.id={1}&fields=id'.format( + self.base_url, + str(router_id))) # Get Configuration Managers ID + response = json.loads(response.content.decode( + "utf-8")) # Decode the response and make it a dictionary + config_man_id = response['data'][0][ + 'id'] # get the Configuration Managers ID from response + + payload = { + "configuration": [ + { + "system": { + "desc": new_router_description + } + }, + [] + ] + } + + ncm = self.session.patch( + '{0}/configuration_managers/{1}/'.format(self.base_url, + str(config_man_id)), + data=json.dumps(payload)) # Patch indie config with new values + result = self._return_handler(ncm.status_code, ncm.text, call_type) + return result + + def set_router_asset_id(self, router_id: int, new_router_asset_id: str): + """ + This method sets the local admin password for a router. + :param router_id: ID of router to update + :param new_router_asset_id: Asset ID string to set + :return: + """ + call_type = 'Asset ID' + + response = self.session.get( + '{0}/configuration_managers/?router.id={1}&fields=id'.format( + self.base_url, + str(router_id))) # Get Configuration Managers ID + response = json.loads(response.content.decode( + "utf-8")) # Decode the response and make it a dictionary + config_man_id = response['data'][0][ + 'id'] # get the Configuration Managers ID from response + + payload = { + "configuration": [ + { + "system": { + "asset_id": new_router_asset_id + } + }, + [] + ] + } + + ncm = self.session.patch( + '{0}/configuration_managers/{1}/'.format(self.base_url, + str(config_man_id)), + data=json.dumps(payload)) # Patch indie config with new values + result = self._return_handler(ncm.status_code, ncm.text, call_type) + return result + + def set_ethernet_wan_ip(self, router_id: int, new_wan_ip: str, + new_netmask: str = None, new_gateway: str = None): + """ + This method sets the Ethernet WAN IP Address for a given router id. + :param router_id: ID of router to update + :param new_wan_ip: IP Address to assign to Ethernet WAN + :param new_netmask: Network Mask in dotted decimal notation (optional) + :param new_gateway: IP of gateway (optional) + :return: + """ + call_type = 'Etheret WAN IP Address' + + response = self.session.get( + '{0}/configuration_managers/?router.id={1}&fields=id'.format( + self.base_url, + str(router_id))) # Get Configuration Managers ID + response = json.loads(response.content.decode( + "utf-8")) # Decode the response and make it a dictionary + config_man_id = response['data'][0][ + 'id'] # get the Configuration Managers ID from response + + ip_override = { + "ip_address": new_wan_ip + } + + if new_netmask: + ip_override['netmask'] = new_netmask + + if new_gateway: + ip_override['gateway'] = new_gateway + + payload = { + "configuration": [ + { + "wan": { + "rules2": { + "0": { + "ip_override": ip_override + } + } + } + }, + [] + ] + } + + ncm = self.session.patch( + '{0}/configuration_managers/{1}/'.format(self.base_url, + str(config_man_id)), + data=json.dumps(payload)) # Patch indie config with new values + result = self._return_handler(ncm.status_code, ncm.text, call_type) + return result + + def add_custom_apn(self, router_id: int, new_carrier: str, new_apn: str): + """ + This method adds a new APN to the Advanced APN configuration + :param router_id: ID of router to update + :param new_carrier: Home Carrier / PLMN + :param new_apn: APN + :return: + """ + call_type = 'Custom APN' + + response = self.session.get( + '{0}/configuration_managers/?router.id={1}&fields=id,configuration'.format( + self.base_url, + str(router_id))) # Get Configuration Managers ID + response = json.loads(response.content.decode( + "utf-8")) # Decode the response and make it a dictionary + config_man_id = response['data'][0][ + 'id'] # get the Configuration Managers ID from response + + new_apn_id = 0 + try: + if response['data'][0]['configuration'][0]['wan']: + if response['data'][0]['configuration'][0]['wan']['custom_apns']: + new_apn_id = len(response['data'][0]['configuration'][0]['wan']['custom_apns']) + except KeyError: + pass + + payload = { + "configuration": [ + { + "wan": { + "custom_apns": { + new_apn_id: { + "apn": new_apn, + "carrier": new_carrier + } + } + } + }, + [] + ] + } + + ncm = self.session.patch( + '{0}/configuration_managers/{1}/'.format(self.base_url, + str(config_man_id)), + data=json.dumps(payload)) # Patch indie config with new values + result = self._return_handler(ncm.status_code, ncm.text, call_type) + return result + + + def set_ncm_api_keys_by_router(self, router_id=None, router_name=None, x_ecm_api_id: str = None, x_ecm_api_key: str = None, x_cp_api_id: str = None, x_cp_api_key: str = None, bearer_token: str = ''): + """ + This method sets NCM API keys using the router's certificate management configuration + :param router_id: ID of router to update (optional if router_name is provided) + :param router_name: Name of router to update (optional if router_id is provided) + :param x_ecm_id: ECM ID + :param x_ecm_api_key: ECM API Key + :param x_cp_api_id: CP API ID + :param x_cp_api_key: CP API Key + :param bearer_token: Bearer Token + :return: + """ + call_type = 'Set NCM API Keys' + + if not router_id and not router_name: + raise Exception("Either router_id or router_name must be provided") + + if router_name and not router_id: + try: + router_id = self.get_router_by_name(router_name)['id'] + except Exception as e: + raise Exception(f"Router with name '{router_name}' not found: {str(e)}") + + response = self.session.get( + '{0}/configuration_managers/?router.id={1}&fields=id,configuration'.format( + self.base_url, + str(router_id))) # Get Configuration Managers ID + + # Check response status + if response.status_code != 200: + raise Exception(f"Failed to get configuration manager: HTTP {response.status_code} - {response.text}") + + response_data = json.loads(response.content.decode( + "utf-8")) # Decode the response and make it a dictionary + + # Check if response has data and is not empty + if 'data' not in response_data: + raise Exception(f"Unexpected API response format. Response: {response_data}") + + if not response_data['data'] or len(response_data['data']) == 0: + raise Exception(f"No configuration manager found for router_id: {router_id}") + + config_man_id = response_data['data'][0][ + 'id'] # get the Configuration Managers ID from response + + x509 = "-----BEGIN CERTIFICATE-----\nMIIB0jCCATugAwIBAgIUIF7Bygk4C0l0ikNv00u98unXZ9kwDQYJKoZIhvcNAQEL\nBQAwFzEVMBMGA1UEAwwMTmV0Q2xvdWQgQVBJMB4XDTI1MDYwNDA5MjYzNloXDTM1\nMDYwMzA5MjYzNlowFzEVMBMGA1UEAwwMTmV0Q2xvdWQgQVBJMIGfMA0GCSqGSIb3\nDQEBAQUAA4GNADCBiQKBgQDHWAtI42kixQBU9yZdiTmakxlj1OGfXlYGYDTMr/Q7\neFRZHLxJwIwrfV4UjJSvXkeo9ui1JNXzfQzDwZXdJKEdFM0fBpu9TD/cyetz9lCs\nh5YL1aC0IcH/liZwGt/z2X4snqe3KADHjy8Dl/5ib16vTC/FuRm02Bf8wVJ0c/sr\nhwIDAQABoxswGTAJBgNVHREEAjAAMAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQEL\nBQADgYEAB5UavmWqkT7MXnt2/RE2qdtoTw4PfWIo+I2O7FAwJmHISubp3LW1vCn0\nRIsnyscH+BZmQkZOk3AYhLikgSky64HRHK32HXrLr79ku4as0drJzxuVOOKJn1+6\nDiNWTpAhzT55WU3fZ9H6FRvfEls0ZtLia/yiZ60rH01RO0lo2bs=\n-----END CERTIFICATE-----\n" + payload = { + "configuration": [ + { + "certmgmt": { + "certs": { + "00000000-abcd-1234-abcd-123456789000": { + "_id_": "00000000-abcd-1234-abcd-123456789000", + "key": x_ecm_api_id, + "name": "X-ECM-API-ID", + "x509": x509 + }, + "00000001-abcd-1234-abcd-123456789000": { + "_id_": "00000001-abcd-1234-abcd-123456789000", + "key": x_ecm_api_key, + "name": "X-ECM-API-KEY", + "x509": x509 + }, + "00000002-abcd-1234-abcd-123456789000": { + "_id_": "00000002-abcd-1234-abcd-123456789000", + "key": x_cp_api_id, + "name": "X-CP-API-ID", + "x509": x509 + }, + "00000003-abcd-1234-abcd-123456789000": { + "_id_": "00000003-abcd-1234-abcd-123456789000", + "key": x_cp_api_key, + "name": "X-CP-API-KEY", + "x509": x509 + }, + "00000004-abcd-1234-abcd-123456789000": { + "_id_": "00000004-abcd-1234-abcd-123456789000", + "key": bearer_token, + "name": "Bearer Token", + "x509": x509 + } + } + } + }, + [] + ] + } + + ncm = self.session.patch( + '{0}/configuration_managers/{1}/'.format(self.base_url, + str(config_man_id)), + data=json.dumps(payload)) # Patch indie config with new values + result = self._return_handler(ncm.status_code, ncm.text, call_type) + return result + + def set_ncm_api_keys_by_group(self, group_id=None, group_name=None, x_ecm_api_id: str = None, x_ecm_api_key: str = None, x_cp_api_id: str = None, x_cp_api_key: str = None, bearer_token: str = ''): + """ + This method sets NCM API keys using the group's certificate management configuration + :param group_id: ID of group to update (optional if group_name is provided) + :param group_name: Name of group to update (optional if group_id is provided) + :param x_ecm_id: ECM ID + :param x_ecm_api_key: ECM API Key + :param x_cp_api_id: CP API ID + :param x_cp_api_key: CP API Key + :param bearer_token: Bearer Token + :return: + """ + call_type = 'Set NCM API Keys' + + if not group_id and not group_name: + raise Exception("Either group_id or group_name must be provided") + + if group_name and not group_id: + try: + group_id = self.get_group_by_name(group_name)['id'] + except Exception as e: + raise Exception(f"Group with name '{group_name}' not found: {str(e)}") + + x509 = "-----BEGIN CERTIFICATE-----\nMIIB0jCCATugAwIBAgIUIF7Bygk4C0l0ikNv00u98unXZ9kwDQYJKoZIhvcNAQEL\nBQAwFzEVMBMGA1UEAwwMTmV0Q2xvdWQgQVBJMB4XDTI1MDYwNDA5MjYzNloXDTM1\nMDYwMzA5MjYzNlowFzEVMBMGA1UEAwwMTmV0Q2xvdWQgQVBJMIGfMA0GCSqGSIb3\nDQEBAQUAA4GNADCBiQKBgQDHWAtI42kixQBU9yZdiTmakxlj1OGfXlYGYDTMr/Q7\neFRZHLxJwIwrfV4UjJSvXkeo9ui1JNXzfQzDwZXdJKEdFM0fBpu9TD/cyetz9lCs\nh5YL1aC0IcH/liZwGt/z2X4snqe3KADHjy8Dl/5ib16vTC/FuRm02Bf8wVJ0c/sr\nhwIDAQABoxswGTAJBgNVHREEAjAAMAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQEL\nBQADgYEAB5UavmWqkT7MXnt2/RE2qdtoTw4PfWIo+I2O7FAwJmHISubp3LW1vCn0\nRIsnyscH+BZmQkZOk3AYhLikgSky64HRHK32HXrLr79ku4as0drJzxuVOOKJn1+6\nDiNWTpAhzT55WU3fZ9H6FRvfEls0ZtLia/yiZ60rH01RO0lo2bs=\n-----END CERTIFICATE-----\n" + payload = { + "configuration": [ + { + "certmgmt": { + "certs": { + "00000000-abcd-1234-abcd-123456789000": { + "_id_": "00000000-abcd-1234-abcd-123456789000", + "key": x_ecm_api_id, + "name": "X-ECM-API-ID", + "x509": x509 + }, + "00000001-abcd-1234-abcd-123456789000": { + "_id_": "00000001-abcd-1234-abcd-123456789000", + "key": x_ecm_api_key, + "name": "X-ECM-API-KEY", + "x509": x509 + }, + "00000002-abcd-1234-abcd-123456789000": { + "_id_": "00000002-abcd-1234-abcd-123456789000", + "key": x_cp_api_id, + "name": "X-CP-API-ID", + "x509": x509 + }, + "00000003-abcd-1234-abcd-123456789000": { + "_id_": "00000003-abcd-1234-abcd-123456789000", + "key": x_cp_api_key, + "name": "X-CP-API-KEY", + "x509": x509 + }, + "00000004-abcd-1234-abcd-123456789000": { + "_id_": "00000004-abcd-1234-abcd-123456789000", + "key": bearer_token, + "name": "Bearer Token", + "x509": x509 + } + } + } + }, + [] + ] + } + + ncm = self.session.patch( + '{0}/groups/{1}/'.format(self.base_url, str(group_id)), + data=json.dumps(payload)) # Patch group config with new values + result = self._return_handler(ncm.status_code, ncm.text, call_type) + return result + + def set_encrypted_value_by_router(self, router_id=None, router_name=None, name: str = None, key: str = None): + """ + This method sets an encrypted value using the router's certificate management configuration + :param router_id: ID of router to update (optional if router_name is provided) + :param router_name: Name of router to update (optional if router_id is provided) + :param name: Name of the encrypted value + :param key: Key value to encrypt + :return: + """ + call_type = 'Set Encrypted Value' + + if not router_id and not router_name: + raise Exception("Either router_id or router_name must be provided") + + if not name or not key: + raise Exception("Both name and key parameters must be provided") + + if router_name and not router_id: + try: + router_id = self.get_router_by_name(router_name)['id'] + except Exception as e: + raise Exception(f"Router with name '{router_name}' not found: {str(e)}") + + response = self.session.get( + '{0}/configuration_managers/?router.id={1}&fields=id,configuration'.format( + self.base_url, + str(router_id))) # Get Configuration Managers ID + response = json.loads(response.content.decode( + "utf-8")) # Decode the response and make it a dictionary + config_man_id = response['data'][0][ + 'id'] # get the Configuration Managers ID from response + + x509 = "-----BEGIN CERTIFICATE-----\nMIIB0jCCATugAwIBAgIUIF7Bygk4C0l0ikNv00u98unXZ9kwDQYJKoZIhvcNAQEL\nBQAwFzEVMBMGA1UEAwwMTmV0Q2xvdWQgQVBJMB4XDTI1MDYwNDA5MjYzNloXDTM1\nMDYwMzA5MjYzNlowFzEVMBMGA1UEAwwMTmV0Q2xvdWQgQVBJMIGfMA0GCSqGSIb3\nDQEBAQUAA4GNADCBiQKBgQDHWAtI42kixQBU9yZdiTmakxlj1OGfXlYGYDTMr/Q7\neFRZHLxJwIwrfV4UjJSvXkeo9ui1JNXzfQzDwZXdJKEdFM0fBpu9TD/cyetz9lCs\nh5YL1aC0IcH/liZwGt/z2X4snqe3KADHjy8Dl/5ib16vTC/FuRm02Bf8wVJ0c/sr\nhwIDAQABoxswGTAJBgNVHREEAjAAMAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQEL\nBQADgYEAB5UavmWqkT7MXnt2/RE2qdtoTw4PfWIo+I2O7FAwJmHISubp3LW1vCn0\nRIsnyscH+BZmQkZOk3AYhLikgSky64HRHK32HXrLr79ku4as0drJzxuVOOKJn1+6\nDiNWTpAhzT55WU3fZ9H6FRvfEls0ZtLia/yiZ60rH01RO0lo2bs=\n-----END CERTIFICATE-----\n" + + # Generate a unique ID for the certificate + cert_id = str(uuid.uuid4()) + + payload = { + "configuration": [ + { + "certmgmt": { + "certs": { + cert_id: { + "_id_": cert_id, + "key": key, + "name": name, + "x509": x509 + } + } + } + }, + [] + ] + } + + ncm = self.session.patch( + '{0}/configuration_managers/{1}/'.format(self.base_url, + str(config_man_id)), + data=json.dumps(payload)) # Patch indie config with new values + result = self._return_handler(ncm.status_code, ncm.text, call_type) + return result + + def set_encrypted_value_by_group(self, group_id=None, group_name=None, name: str = None, key: str = None): + """ + This method sets an encrypted value using the group's certificate management configuration + :param group_id: ID of group to update (optional if group_name is provided) + :param group_name: Name of group to update (optional if group_id is provided) + :param name: Name of the encrypted value + :param key: Key value to encrypt + :return: + """ + call_type = 'Set Encrypted Value' + + if not group_id and not group_name: + raise Exception("Either group_id or group_name must be provided") + + if not name or not key: + raise Exception("Both name and key parameters must be provided") + + if group_name and not group_id: + try: + group_id = self.get_group_by_name(group_name)['id'] + except Exception as e: + raise Exception(f"Group with name '{group_name}' not found: {str(e)}") + + x509 = "-----BEGIN CERTIFICATE-----\nMIIB0jCCATugAwIBAgIUIF7Bygk4C0l0ikNv00u98unXZ9kwDQYJKoZIhvcNAQEL\nBQAwFzEVMBMGA1UEAwwMTmV0Q2xvdWQgQVBJMB4XDTI1MDYwNDA5MjYzNloXDTM1\nMDYwMzA5MjYzNlowFzEVMBMGA1UEAwwMTmV0Q2xvdWQgQVBJMIGfMA0GCSqGSIb3\nDQEBAQUAA4GNADCBiQKBgQDHWAtI42kixQBU9yZdiTmakxlj1OGfXlYGYDTMr/Q7\neFRZHLxJwIwrfV4UjJSvXkeo9ui1JNXzfQzDwZXdJKEdFM0fBpu9TD/cyetz9lCs\nh5YL1aC0IcH/liZwGt/z2X4snqe3KADHjy8Dl/5ib16vTC/FuRm02Bf8wVJ0c/sr\nhwIDAQABoxswGTAJBgNVHREEAjAAMAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQEL\nBQADgYEAB5UavmWqkT7MXnt2/RE2qdtoTw4PfWIo+I2O7FAwJmHISubp3LW1vCn0\nRIsnyscH+BZmQkZOk3AYhLikgSky64HRHK32HXrLr79ku4as0drJzxuVOOKJn1+6\nDiNWTpAhzT55WU3fZ9H6FRvfEls0ZtLia/yiZ60rH01RO0lo2bs=\n-----END CERTIFICATE-----\n" + + # Generate a unique ID for the certificate + cert_id = str(uuid.uuid4()) + + payload = { + "configuration": [ + { + "certmgmt": { + "certs": { + cert_id: { + "_id_": cert_id, + "key": key, + "name": name, + "x509": x509 + } + } + } + }, + [] + ] + } + + ncm = self.session.patch( + '{0}/groups/{1}/'.format(self.base_url, str(group_id)), + data=json.dumps(payload)) # Patch group config with new values + result = self._return_handler(ncm.status_code, ncm.text, call_type) + return result + + def set_router_fields(self, router_id: int, name: str = None, description: str = None, asset_id: str = None, custom1: str = None, custom2: str = None): + """ + This method sets multiple fields for a router. + :param router_id: ID of router to update + :param name: Name/System ID to set + :param description: Description string to set + :param asset_id: Asset ID string to set + :param custom1: Custom1 field to set + :param custom2: Custom2 field to set + :return: + """ + call_type = 'Router Fields' + + put_url = '{0}/routers/{1}/'.format(self.base_url, str(router_id)) + + put_data = {} + for k,v in (('name', name), ('description', description), ('asset_id', asset_id), ('custom1', custom1), ('custom2', custom2)): + if v is not None: + put_data[k] = v + + ncm = self.session.put(put_url, data=json.dumps(put_data)) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + return result + + def get_router_appdata(self, router_id_or_name: Union[int, str], **kwargs) -> list: + """ + Get appdata from router configuration. + Retrieves the system/sdk/appdata from the router's configuration. + + :param router_id_or_name: ID (int) or name (str) of the router to get appdata from + :type router_id_or_name: Union[int, str] + :param kwargs: Additional parameters for the API call + :return: List of appdata items with _id_, name, and value fields + :rtype: list + """ + try: + # Get router with configuration_manager expanded + if isinstance(router_id_or_name, int): + router = self.get_router_by_id(router_id_or_name, expand='configuration_manager', **kwargs) + else: + # Check for multiple routers with the same name + routers_with_name = self.get_routers(name=router_id_or_name, **kwargs) + if len(routers_with_name) > 1: + print(f"Warning: Found {len(routers_with_name)} routers with name '{router_id_or_name}'. Using the first one (ID: {routers_with_name[0].get('id')})") + print(f"All routers with this name: {[r.get('id') for r in routers_with_name]}") + elif len(routers_with_name) == 0: + raise ValueError(f"No router found with name '{router_id_or_name}'") + + router = self.get_router_by_name(router_id_or_name, expand='configuration_manager', **kwargs) + + # Navigate to system/sdk/appdata through configuration_manager, always use item 0 + config_manager = router.get('configuration_manager', {}) + configuration = config_manager.get('configuration', []) + + if configuration and len(configuration) > 0: + first_config = configuration[0] # Always use item 0 + appdata_dict = (first_config + .get('system', {}) + .get('sdk', {}) + .get('appdata', {})) + + # Convert dict to list of appdata items + if isinstance(appdata_dict, dict): + return list(appdata_dict.values()) + else: + return [] + else: + return [] + + except Exception as e: + print(f"Error getting appdata for router {router_id_or_name}: {e}") + return [] + + def get_router_appdata_value(self, router_id_or_name: Union[int, str], name: str, **kwargs) -> Optional[str]: + """ + Get a specific appdata value by name from router configuration. + Searches the system/sdk/appdata array for an item with the specified name. + + :param router_id_or_name: ID (int) or name (str) of the router to get appdata from + :type router_id_or_name: Union[int, str] + :param name: Name of the appdata item to retrieve + :type name: str + :param kwargs: Additional parameters for the API call + :return: Value of the appdata item, or None if not found + :rtype: Optional[str] + """ + try: + # Get appdata array (this will handle the duplicate name checking) + sdk_data = self.get_router_appdata(router_id_or_name, **kwargs) + + # Search for item with matching name using method chaining + for item in sdk_data: + if item.get('name') == name: + return item.get('value') + + # Return None if not found + return None + + except Exception as e: + print(f"Error getting appdata value '{name}' for router {router_id_or_name}: {e}") + return None + +class NcmClientv3(BaseNcmClient): + """ + This NCM Client class provides functions for interacting with = + the Cradlepoint NCM API. Full documentation of the Cradlepoint API can be + found at: https://developer.cradlepoint.com + """ + + def __init__(self, + api_key=None, + log_events=False, + logger=None, + retries=5, + retry_backoff_factor=2, + retry_on=None, + base_url=None): + """ + Constructor. Sets up and opens request session. + :param api_key: API Bearer token (without the "Bearer" text). + Optional, but must be set before calling functions. + :type api_key: str + :param log_events: if True, HTTP status info will be printed. False by default + :type log_events: bool + :param retries: number of retries on failure. Optional. + :param retry_backoff_factor: backoff time multiplier for retries. + Optional. + :param retry_on: types of errors on which automatic retry will occur. + Optional. + :param base_url: # base url for calls. Configurable for testing. + Optional. + """ + self.v3 = self # For backwards compatibility + base_url = base_url or os.environ.get("CP_BASE_URL_V3", "https://api.cradlepointecm.com/api/v3") + super().__init__(log_events, logger, retries, retry_backoff_factor, retry_on, base_url) + if api_key: + token = {'Authorization': f'Bearer {api_key}'} + self.session.headers.update(token) + self.session.headers.update({ + 'Content-Type': 'application/vnd.api+json', + 'Accept': 'application/vnd.api+json' + }) + + def __get_json(self, get_url, call_type, params=None): + """ + Returns full paginated results + """ + results = [] + + if params is not None and "limit" in params: + limit = params['limit'] + if limit == 0: + limit = 1000000 + if params['limit'] > 50 or params['limit'] == 0: + params['page[size]'] = 50 + else: + params['page[size]'] = params['limit'] + else: + limit = 50 + + url = get_url + if params is not None: + from urllib.parse import urlencode + query_string = urlencode(params) + url = f'{url}?{query_string}' + + while url and (len(results) < limit): + ncm = self.session.get(url) + if not (200 <= ncm.status_code < 300): + return self._return_handler(ncm.status_code, ncm.json(), call_type) + data = ncm.json()['data'] + if isinstance(data, list): + self._return_handler(ncm.status_code, data, call_type) + for d in data: + results.append(d) + else: + results.append(data) + if "links" in ncm.json(): + url = ncm.json()['links']['next'] + else: + url = None + + if params is not None and "filter[fields]" in params.keys(): + data = [] + fields = params['filter[fields]'].split(",") + for result in results: + items = {} + for k, v in result['attributes'].items(): + if k in fields: + items[k] = v + data.append(items) + return data + + return results + + + def __parse_kwargs(self, kwargs, allowed_params): + """ + Checks for invalid parameters and missing API Keys, and handles "filter" fields + """ + if 'search' in kwargs: + return self.__parse_search_kwargs(kwargs, allowed_params) + + bad_params = {k: v for (k, v) in kwargs.items() if + k not in allowed_params if ("search" not in k and "filter" not in k and "sort" not in k)} + if len(bad_params) > 0: + raise ValueError("Invalid parameters: {}".format(bad_params)) + + if 'Authorization' not in self.session.headers: + raise KeyError( + "API key missing. " + "Please set API key before making API calls.") + + params = {} + + for key, val in kwargs.items(): + if "search" in key or "filter" in key or "sort" in key or "limit" in key: + params[key] = val + + elif "__" in key: + split_key = key.split("__") + params[f'filter[{split_key[0]}][{split_key[1]}]'] = val + else: + params[f'filter[{key}]'] = val + + return params + + def __parse_search_kwargs(self, kwargs, allowed_params): + """ + Checks for invalid parameters and missing API Keys, and handles "search" fields + """ + + bad_params = {k: v for (k, v) in kwargs.items() if + k not in allowed_params if ("search" not in k and "filter" not in k and "sort" not in k)} + if len(bad_params) > 0: + raise ValueError("Invalid parameters: {}".format(bad_params)) + + if 'Authorization' not in self.session.headers: + raise KeyError( + "API key missing. " + "Please set API key before making API calls.") + + params = {} + + for key, val in kwargs.items(): + if "filter" in key or "sort" in key or "limit" in key: + params[key] = val + elif "fields" in key: + params[f'filter[{key}]'] = val + else: + if "search" not in key: + params[f'search[{key}]'] = val + + return params + + def __parse_put_kwargs(self, kwargs, allowed_params): + """ + Checks for invalid parameters and missing API Keys, and handles "filter" fields + """ + + bad_params = {k: v for (k, v) in kwargs.items() if + k not in allowed_params if ("search" not in k and "filter" not in k and "sort" not in k)} + if len(bad_params) > 0: + raise ValueError("Invalid parameters: {}".format(bad_params)) + + if 'Authorization' not in self.session.headers: + raise KeyError( + "API key missing. " + "Please set API key before making API calls.") + + return kwargs + + def set_api_key(self, api_key): + """ + Sets NCM API Keys for session. + :param api_key: API Bearer token (without the "Bearer" prefix). + :type api_key: str + """ + if api_key: + token = {'Authorization': f'Bearer {api_key}'} + self.session.headers.update(token) + return + + def get_users(self, **kwargs): + """ + Returns users with details. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: A list of users with details. + """ + call_type = 'Users' + get_url = f'{self.base_url}/beta/users' + + allowed_params = ['email', + 'email__not', + 'first_name', + 'first_name__ne', + 'id', + 'is_active__ne', + 'last_login', + 'last_login__lt', + 'last_login__lte', + 'last_login__gt', + 'last_login__gte', + 'last_login__ne', + 'last_name', + 'last_name__ne', + 'pending_email', + 'fields', + 'limit', + 'sort'] + + params = self.__parse_kwargs(kwargs, allowed_params) + return self.__get_json(get_url, call_type, params=params) + + def create_user(self, email, first_name, last_name, **kwargs): + """ + Creates a user. + :param email: Email address + :type email: str + :param first_name: First name + :type first_name: str + :param last_name: Last name + :type last_name: str + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: User creation result. + """ + call_type = 'User' + post_url = f'{self.base_url}/beta/users' + + allowed_params = ['is_active', + 'last_login', + 'pending_email'] + params = self.__parse_kwargs(kwargs, allowed_params) + params['email'] = email + params['first_name'] = first_name + params['last_name'] = last_name + + """GET TENANT ID""" + t = self.get_subscriptions(limit=1) + + data = { + "data": { + "type": "users", + "attributes": params, + "relationships": { + "tenant": { + "data": [t[0]['relationships']['tenants']['data']] + } + } + } + } + + ncm = self.session.post(post_url, data=json.dumps(data)) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + return result + + def update_user(self, email, **kwargs): + """ + Updates a user's date. + :param email: Email address + :type email: str + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: User update result. + """ + call_type = 'Users' + + user = self.get_users(email=email)[0] + user.pop('links') + + put_url = f'{self.base_url}/beta/users/{user["id"]}' + + allowed_params = ['first_name', + 'last_name', + 'is_active', + 'user_id', + 'last_login', + 'pending_email'] + params = self.__parse_kwargs(kwargs, allowed_params) + + for k, v in params.items(): + user['attributes'][k] = v + + user = {"data": user} + + ncm = self.session.put(put_url, data=json.dumps(user)) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + return result + + def delete_user(self, email, **kwargs): + """ + Updates a user's date. + :param email: Email address + :type email: str + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: None unless error. + """ + call_type = 'Users' + + user = self.get_users(email=email)[0] + user.pop('links') + + delete_url = f'{self.base_url}/beta/users/{user["id"]}' + + ncm = self.session.delete(delete_url) + result = self._return_handler(ncm.status_code, ncm.text, call_type) + return result + + def get_asset_endpoints(self, **kwargs): + """ + Returns assets with details. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: A list of asset endpoints (routers) with details. + """ + call_type = 'Asset Endpoints' + get_url = f'{self.base_url}/asset_endpoints' + + allowed_params = ['id', + 'hardware_series', + 'hardware_series_key', + 'mac_address', + 'serial_number', + 'fields', + 'limit', + 'sort'] + + params = self.__parse_kwargs(kwargs, allowed_params) + return self.__get_json(get_url, call_type, params=params) + + def get_subscriptions(self, **kwargs): + """ + Returns subscriptions with details. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: A list of subscriptions with details. + """ + call_type = 'Subscriptions' + get_url = f'{self.base_url}/subscriptions' + + allowed_params = ['end_time', + 'end_time__lt', + 'end_time__lte', + 'end_time__gt', + 'end_time__gte', + 'end_time__ne', + 'id', + 'name', + 'quantity', + 'start_time', + 'start_time__lt', + 'start_time__lte', + 'start_time__gt', + 'start_time__gte', + 'start_time__ne', + 'tenant', + 'type', + 'fields', + 'limit', + 'sort'] + + params = self.__parse_kwargs(kwargs, allowed_params) + return self.__get_json(get_url, call_type, params=params) + + def regrade(self, subscription_id, mac, action="UPGRADE"): + """ + Applies a subscription to an asset. + :param subscription_id: ID of the subscription to apply. See https://developer.cradlepoint.com/ for list of subscriptions. + :param mac: MAC address of the asset to apply the subscription to. Can also be a list. + :param action: Action to take. Default is "UPGRADE". Can also be "DOWNGRADE". + """ + + call_type = 'Subscription' + post_url = f'{self.base_url}/asset_endpoints/regrades' + + payload = { + "atomic:operations": [] + } + mac = mac if isinstance(mac, list) else [mac] + for smac in mac: + data = { + "op": "add", + "data": { + "type": "regrades", + "attributes": { + "action": action, + "subscription_type": subscription_id, + "mac_address": smac.replace(':','') if len(smac) == 17 else smac + } + } + } + payload["atomic:operations"].append(data) + + ncm = self.session.post(post_url, json=payload) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + return result + + def unlicense_devices(self, mac_addresses): + """ + Unlicenses a device by MAC address using the NCM API v3. + :param mac_addresses: MAC address of the device to unlicense (can be a single MAC address or a list of MAC addresses) + :return: Result of the unlicense operation + """ + call_type = 'Unlicense Device' + post_url = f'{self.base_url}/asset_endpoints/regrades' + + # Convert single MAC address to list for consistent processing + mac_addresses = [mac_addresses] if isinstance(mac_addresses, str) else mac_addresses + + # Create atomic operations for each MAC address + operations = [] + for mac in mac_addresses: + operations.append({ + "op": "add", + "data": { + "type": "regrades", + "attributes": { + "mac_address": mac.replace(':', ''), + "action": "UNLICENSE" + } + } + }) + + payload = { + "atomic:operations": operations + } + + headers = { + 'Content-Type': 'application/vnd.api+json;ext="https://jsonapi.org/ext/atomic"', + 'Accept': 'application/vnd.api+json;ext="https://jsonapi.org/ext/atomic"' + } + + response = self.session.post(post_url, json=payload, headers=headers) + + result = self._return_handler(response.status_code, response.json(), call_type) + return result + + def get_regrades(self, **kwargs): + """ + Returns regrade jobs with details. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: A list of regrades with details. + """ + call_type = 'Subscription' + get_url = f'{self.base_url}/asset_endpoints/regrades' + + allowed_params = ["id", + "action_id", + "mac_address", + "created_at", + "action", + "subcription_type", + "status", + "error_code"] + + params = self.__parse_kwargs(kwargs, allowed_params) + return self.__get_json(get_url, call_type, params=params) + + def get_private_cellular_networks(self, **kwargs): + """ + Returns information about your private cellular networks. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: A list of PCNs with details. + """ + call_type = 'Private Cellular Networks' + get_url = f'{self.base_url}/beta/private_cellular_networks' + + allowed_params = ['core_ip', + 'created_at', + 'created_at__lt', + 'created_at__lte', + 'created_at__gt', + 'created_at__gte', + 'created_at__ne', + 'ha_enabled', + 'id', + 'mobility_gateways', + 'mobility_gateway_virtual_ip', + 'name', + 'state', + 'status', + 'tac', + 'type', + 'updated_at', + 'updated_at__lt', + 'updated_at__lte', + 'updated_at__gt', + 'updated_at__gte', + 'updated_at__ne', + 'fields', + 'limit', + 'sort'] + + params = self.__parse_kwargs(kwargs, allowed_params) + return self.__get_json(get_url, call_type, params=params) + + def get_private_cellular_network(self, network_id, **kwargs): + """ + Returns information about a private cellular network. + :param network_id: ID of the private_cellular_networks record + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: An individual PCN network with details. + """ + call_type = 'Private Cellular Networks' + get_url = f'{self.base_url}/beta/private_cellular_networks/{network_id}' + + allowed_params = ['name', + 'segw_ip', + 'ha_enabled', + 'mobility_gateway_virtual_ip', + 'state', + 'status', + 'tac', + 'created_at', + 'updated_at', + 'fields'] + + params = self.__parse_kwargs(kwargs, allowed_params) + return self.__get_json(get_url, call_type, params=params) + + def update_private_cellular_network(self, id=None, name=None, **kwargs): + """ + Make changes to a private cellular network. + :param id: PCN network ID. Specify either this or name. + :type id: str + :param name: PCN network name + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: PCN update result. + """ + call_type = 'Private Cellular Network' + + if not id and not name: + return "ERROR: no network specified. Must specify either network_id or network_name" + + if id: + net = self.get_private_cellular_networks(id=id)[0] + elif name: + net = self.get_private_cellular_networks(name=name)[0] + + if name: + kwargs['name'] = name + + net.pop('links') + + put_url = f'{self.base_url}/beta/private_cellular_networks/{net["id"]}' + + allowed_params = ['core_ip', + 'ha_enabled', + 'id', + 'mobility_gateways', + 'mobility_gateway_virtual_ip', + 'name', + 'state', + 'status', + 'tac', + 'type'] + params = self.__parse_put_kwargs(kwargs, allowed_params) + + for k, v in params.items(): + net['attributes'][k] = v + + data = {"data": net} + + ncm = self.session.put(put_url, data=json.dumps(data)) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + return result + + def create_private_cellular_network(self, name, core_ip, ha_enabled=False, mobility_gateway_virtual_ip=None, mobility_gateways=None): + """ + Make changes to a private cellular network. + :param name: Name of the networks. + :type name: str + :param core_ip: IP address to reach core network. + :type core_ip: str + :param ha_enabled: High availability (HA) of network. + :type ha_enabled: bool + :param mobility_gateway_virtual_ip: Virtual IP address to reach core when HA is enabled. Nullable. + :type mobility_gateway_virtual_ip: str + :param mobility_gateways: Comma separated list of private_cellular_cores IDs to add as mobility gateways. Nullable. + :type mobility_gateways: str + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: Create PCN result.. + """ + call_type = 'Private Cellular Network' + + post_url = f'{self.base_url}/beta/private_cellular_networks' + + data = { + "data": { + "type": "private_cellular_networks", + "attributes": { + "name": name, + "core_ip": core_ip, + "ha_enabled": ha_enabled, + "mobility_gateway_virtual_ip": mobility_gateway_virtual_ip + } + } + } + + if mobility_gateways: + relationships = { + "mobility_gateways": { + "data": [] + } + } + gateways = mobility_gateways.split(",") + + for gateway in gateways: + relationships['mobility_gateways']['data'].append({"type": "private_cellular_cores", "id": gateway}) + + data['data']['relationships'] = relationships + + ncm = self.session.post(post_url, data=json.dumps(data)) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + return result + + def delete_private_cellular_network(self, id): + """ + Returns information about a private cellular network. + :param id: ID of the private_cellular_networks record + :type id: str + :return: None unless error. + """ + # TODO support deletion by network name + call_type = 'Private Cellular Network' + delete_url = f'{self.base_url}/beta/private_cellular_networks/{id}' + + ncm = self.session.delete(delete_url) + result = self._return_handler(ncm.status_code, ncm.text, call_type) + return result + + def get_private_cellular_cores(self, **kwargs): + """ + Returns information about a private cellular core. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: A list of Mobility Gateways with details. + """ + call_type = 'Private Cellular Cores' + get_url = f'{self.base_url}/beta/private_cellular_cores' + + allowed_params = ['created_at', + 'id', + 'management_ip', + 'network', + 'router', + 'status', + 'type', + 'updated_at', + 'url', + 'fields', + 'limit', + 'sort'] + + params = self.__parse_kwargs(kwargs, allowed_params) + return self.__get_json(get_url, call_type, params=params) + + def get_private_cellular_core(self, core_id, **kwargs): + """ + Returns information about a private cellular core. + :param core_id: ID of the private_cellular_cores record + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: An individual Mobility Gateway with details. + """ + call_type = 'Private Cellular Core' + get_url = f'{self.base_url}/beta/private_cellular_cores/{core_id}' + + allowed_params = ['created_at', + 'id', + 'management_ip', + 'network', + 'router', + 'status', + 'type', + 'updated_at', + 'url', + 'fields', + 'sort'] + + params = self.__parse_kwargs(kwargs, allowed_params) + return self.__get_json(get_url, call_type, params=params) + + def get_private_cellular_radios(self, **kwargs): + """ + Returns information about a private cellular radio. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: A list of Cellular APs with details. + """ + call_type = 'Private Cellular Radios' + get_url = f'{self.base_url}/beta/private_cellular_radios' + + allowed_params = ['admin_state', + 'antenna_azimuth', + 'antenna_beamwidth', + 'antenna_downtilt', + 'antenna_gain', + 'bandwidth', + 'category', + 'cpi_id', + 'cpi_name', + 'cpi_signature', + 'created_at', + 'description', + 'fccid', + 'height', + 'height_type', + 'id', + 'indoor_deployment', + 'latitude', + 'location', + 'longitude', + 'mac', + 'name', + 'network', + 'serial_number', + 'tdd_mode', + 'tx_power', + 'type', + 'updated_at', + 'fields', + 'limit', + 'sort'] + + params = self.__parse_kwargs(kwargs, allowed_params) + return self.__get_json(get_url, call_type, params=params) + + def get_private_cellular_radio(self, id, **kwargs): + """ + Returns information about a private cellular radio. + :param id: ID of the private_cellular_radios record + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: An individual Cellular AP with details. + """ + call_type = 'Private Cellular Radios' + get_url = f'{self.base_url}/beta/private_cellular_radios/{id}' + + allowed_params = ['admin_state', + 'antenna_azimuth', + 'antenna_beamwidth', + 'antenna_downtilt', + 'antenna_gain', + 'bandwidth', + 'category', + 'cpi_id', + 'cpi_name', + 'cpi_signature', + 'created_at', + 'description', + 'fccid', + 'height', + 'height_type', + 'id', + 'indoor_deployment', + 'latitude', + 'location', + 'longitude', + 'mac', + 'name', + 'network', + 'serial_number', + 'tdd_mode', + 'tx_power', + 'type', + 'updated_at', + 'fields', + 'limit', + 'sort'] + + params = self.__parse_kwargs(kwargs, allowed_params) + return self.__get_json(get_url, call_type, params=params) + + def update_private_cellular_radio(self, id=None, name=None, **kwargs): + """ + Updates a Cellular AP's data. + :param id: ID of the private_cellular_radio record. Must specify this or name. + :type id: str + :param name: Name of the Cellular AP. Must specify this or id. + type id: str + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: Update Cellular AP results. + """ + call_type = 'Private Cellular Radio' + + if id: + radio = self.get_private_cellular_radios(id=id)[0] + elif name: + radio = self.get_private_cellular_radios(name=name)[0] + else: + return "ERROR: Must specify either ID or name" + + if name: + kwargs['name'] = name + + put_url = f'{self.base_url}/beta/private_cellular_radios/{radio["id"]}' + + if "network" in kwargs.keys(): + relationships = { + "network": { + "data": { + "type": "private_cellular_networks", + "id": kwargs['network'] + } + } + } + kwargs.pop("network") + + radio['data']['relationships'] = relationships + + if "location" in kwargs.keys(): + location = { + "data": { + "type": "private_cellular_radio_groups", + "id": kwargs['location'] + } + } + kwargs.pop("location") + radio['data']['location'] = location + + allowed_params = ['admin_state', + 'antenna_azimuth', + 'antenna_beamwidth', + 'antenna_downtilt', + 'antenna_gain', + 'bandwidth', + 'category', + 'cpi_id', + 'cpi_name', + 'cpi_signature', + 'created_at', + 'description', + 'fccid', + 'height', + 'height_type', + 'id', + 'indoor_deployment', + 'latitude', + 'location', + 'longitude', + 'mac', + 'name', + 'network', + 'serial_number', + 'tdd_mode', + 'tx_power'] + params = self.__parse_put_kwargs(kwargs, allowed_params) + + for k, v in params.items(): + radio['attributes'][k] = v + + radio = {"data": radio} + + ncm = self.session.put(put_url, data=json.dumps(radio)) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + return result + + def get_private_cellular_radio_groups(self, **kwargs): + """ + Returns information about a private cellular core. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: A list of Cellular AP Groups with details. + """ + call_type = 'Private Cellular Radio Groups' + get_url = f'{self.base_url}/beta/private_cellular_radio_groups' + + allowed_params = ['created_at', + 'created_at__lt', + 'created_at__lte', + 'created_at__gt', + 'created_at__gte', + 'created_at__ne', + 'description', + 'id', + 'name', + 'network', + 'type', + 'updated_at', + 'updated_at__lt', + 'updated_at__lte', + 'updated_at__gt', + 'updated_at__gte', + 'updated_at__ne', + 'fields', + 'limit', + 'sort'] + + params = self.__parse_kwargs(kwargs, allowed_params) + return self.__get_json(get_url, call_type, params=params) + + def get_private_cellular_radio_group(self, group_id, **kwargs): + """ + Returns information about a private cellular core. + :param group_id: ID of the private_cellular_radio_groups record + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: An individual Cellular AP Group with details. + """ + call_type = 'Private Cellular Radio Group' + get_url = f'{self.base_url}/beta/private_cellular_radio_groups/{group_id}' + + allowed_params = ['created_at', + 'description', + 'id', + 'name', + 'network', + 'type', + 'updated_at', + 'fields', + 'limit', + 'sort'] + if "search" not in kwargs.keys(): + params = self.__parse_kwargs(kwargs, allowed_params) + else: + if kwargs['search']: + params = self.__parse_search_kwargs(kwargs, allowed_params) + else: + params = self.__parse_kwargs(kwargs, allowed_params) + + results = self.__get_json(get_url, call_type, params=params) + return results + + def update_private_cellular_radio_group(self, id=None, name=None, **kwargs): + """ + Updates a Radio Group. + :param id: ID of the private_cellular_radio_groups record. Must specify this or name. + :type id: str + :param name: Name of the Radio Group. Must specify this or id. + type name: str + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: Update Cellular AP Group results. + """ + call_type = 'Private Cellular Radio Group' + + if id: + group = self.get_private_cellular_radio_groups(id=id)[0] + elif name: + group = self.get_private_cellular_radio_groups(name=name)[0] + else: + return "ERROR: Must specify either ID or name" + + if name: + kwargs['name'] = name + + put_url = f'{self.base_url}/beta/private_cellular_sims/{group["id"]}' + + if "network" in kwargs.keys(): + relationships = { + "network": { + "data": { + "type": "private_cellular_networks", + "id": kwargs['network'] + } + } + } + kwargs.pop("network") + + group['data']['relationships'] = relationships + + allowed_params = ['name', + 'description'] + params = self.__parse_put_kwargs(kwargs, allowed_params) + + for k, v in params.items(): + group['attributes'][k] = v + + group = {"data": group} + + ncm = self.session.put(put_url, data=json.dumps(group)) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + return result + + def create_private_cellular_radio_group(self, name, description, network=None): + """ + Creates a Radio Group. + :param name: Name of the Radio Group. + type name: str + :param description: Description of the Radio Group. + :type description: str + param network: ID of the private_cellular_network to belong to. Optional. + :type network: str + :return: Create Private Cellular Radio Group results. + """ + call_type = 'Private Cellular Radio Group' + + post_url = f'{self.base_url}/beta/private_cellular_radio_groups' + + group = { + "data": { + "type": "private_cellular_radio_groups", + "attributes": { + "name": name, + "description": description + } + } + } + + if network: + relationships = { + "network": { + "data": { + "type": "private_cellular_networks", + "id": network + } + } + } + + group['data']['relationships'] = relationships + + ncm = self.session.post(post_url, data=json.dumps(group)) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + return result + + def delete_private_cellular_radio_group(self, id): + """ + Deletes a private_cellular_radio_group record. + :param id: ID of the private_cellular_radio_group record + :type id: str + :return: None unless error. + """ + #TODO support deletion by group name + call_type = 'Private Cellular Radio Group' + delete_url = f'{self.base_url}/beta/private_cellular_radio_group/{id}' + + ncm = self.session.delete(delete_url) + result = self._return_handler(ncm.status_code, ncm.text, call_type) + return result + + def get_private_cellular_sims(self, **kwargs): + """ + Returns information about a private cellular core. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: A list of PCN SIMs with details. + """ + call_type = 'Private Cellular SIMs' + get_url = f'{self.base_url}/beta/private_cellular_sims' + + allowed_params = ['created_at', + 'created_at__lt', + 'created_at__lte', + 'created_at__gt', + 'created_at__gte', + 'created_at__ne', + 'iccid', + 'id', + 'imsi', + 'last_contact_at', + 'last_contact_at__lt', + 'last_contact_at__lte', + 'last_contact_at__gt', + 'last_contact_at__gte', + 'last_contact_at__ne', + 'name', + 'network', + 'state', + 'state_updated_at', + 'state_updated_at__lt', + 'state_updated_at__lte', + 'state_updated_at__gt', + 'state_updated_at__gte', + 'state_updated_at__ne', + 'type', + 'fields', + 'limit', + 'sort'] + + params = self.__parse_kwargs(kwargs, allowed_params) + return self.__get_json(get_url, call_type, params=params) + + def get_private_cellular_sim(self, id, **kwargs): + """ + Returns information about a private cellular core. + :param sim_id: ID of the private_cellular_sims record + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: An individual PCN SIM with details. + """ + call_type = 'Private Cellular SIMs' + get_url = f'{self.base_url}/beta/private_cellular_sims/{id}' + + allowed_params = ['created_at', + 'iccid', + 'id', + 'imsi', + 'last_contact_at', + 'name', + 'network', + 'state', + 'state_updated_at', + 'type', + 'fields', + 'limit', + 'sort'] + + params = self.__parse_kwargs(kwargs, allowed_params) + return self.__get_json(get_url, call_type, params=params) + + def update_private_cellular_sim(self, id=None, iccid=None, imsi=None, **kwargs): + """ + Updates a SIM's data. + :param id: ID of the private_cellular_sim record. Must specify ID, ICCID, or IMSI. + :type id: str + :param iccid: ICCID. Must specify ID, ICCID, or IMSI. + :type id: str + :param imsi: IMSI. Must specify ID, ICCID, or IMSI. + :type id: str + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: Update PCN SIM results. + """ + call_type = 'Private Cellular SIM' + + if id: + sim = self.get_private_cellular_sims(id=id)[0] + elif iccid: + sim = self.get_private_cellular_sims(iccid=iccid)[0] + elif imsi: + sim = self.get_private_cellular_sims(imsi=imsi)[0] + else: + return "ERROR: Must specify either ID, ICCID, or IMSI" + + put_url = f'{self.base_url}/beta/private_cellular_sims/{sim["id"]}' + + if "network" in kwargs.keys(): + relationships = { + "network": { + "data": { + "type": "private_cellular_networks", + "id": kwargs['network'] + } + } + } + kwargs.pop("network") + + sim['data']['relationships'] = relationships + + allowed_params = ['name', + 'state'] + params = self.__parse_put_kwargs(kwargs, allowed_params) + + for k, v in params.items(): + sim['attributes'][k] = v + + sim = {"data": sim} + + ncm = self.session.put(put_url, data=json.dumps(sim)) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + return result + + def get_private_cellular_radio_statuses(self, **kwargs): + """ + Returns information about a private cellular core. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: Cellular radio status for all cellular radios. + """ + call_type = 'Private Cellular Radio Statuses' + get_url = f'{self.base_url}/beta/private_cellular_radio_statuses' + + allowed_params = ['admin_state', + 'boot_time', + 'cbrs_sas_status', + 'cell', + 'connected_ues', + 'ethernet_status', + 'id', + 'ipsec_status', + 'ipv4_address', + 'last_update_time', + 'online_status', + 'operational_status', + 'operating_tx_power', + 's1_status', + 'time_synchronization', + 'type', + 'fields', + 'limit', + 'sort'] + + params = self.__parse_kwargs(kwargs, allowed_params) + return self.__get_json(get_url, call_type, params=params) + + def get_private_cellular_radio_status(self, status_id, **kwargs): + """ + Returns information about a private cellular core. + :param status_id: ID of the private_cellular_radio_statuses resource + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: Cellular radio status for an individual radio. + """ + call_type = 'Private Cellular Radio Status' + get_url = f'{self.base_url}/beta/private_cellular_radio_statuses/{status_id}' + + allowed_params = ['admin_state', + 'boot_time', + 'cbrs_sas_status', + 'cell', + 'connected_ues', + 'ethernet_status', + 'id', + 'ipsec_status', + 'ipv4_address', + 'last_update_time', + 'online_status', + 'operational_status', + 'operating_tx_power', + 's1_status', + 'time_synchronization', + 'type', + 'fields', + 'limit', + 'sort'] + + params = self.__parse_kwargs(kwargs, allowed_params) + return self.__get_json(get_url, call_type, params=params) + + + def get_public_sim_mgmt_assets(self, **kwargs): + """ + Returns information about SIM asset resources in your NetCloud Manager account. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: SIM asset resources. + """ + call_type = 'Private Cellular Radio Status' + get_url = f'{self.base_url}/beta/public_sim_mgmt_assets' + + allowed_params = ['assigned_imei', + 'carrier', + 'detected_imei', + 'device_status', + 'iccid', + 'is_licensed' + 'type', + 'fields', + 'limit', + 'sort'] + + params = self.__parse_kwargs(kwargs, allowed_params) + return self.__get_json(get_url, call_type, params=params) + + def get_public_sim_mgmt_rate_plans(self, **kwargs): + """ + Returns information about rate plan resources associated with the SIM assets in your NetCloud Manager account. + :param kwargs: A set of zero or more allowed parameters + in the allowed_params list. + :return: Rate plans for SIM assets. + """ + call_type = 'Private Cellular Radio Status' + get_url = f'{self.base_url}/beta/public_sim_mgmt_assets' + + allowed_params = ['carrier', + 'name', + 'status', + 'fields', + 'limit', + 'sort'] + + params = self.__parse_kwargs(kwargs, allowed_params) + return self.__get_json(get_url, call_type, params=params) + + def get_exchange_sites(self, site_id: str = None, exchange_network_id: str = None, name: str = None, **kwargs) -> list: + """ + Returns information about exchange sites. + + :param site_id: ID of a specific exchange site to retrieve. Optional. + :type site_id: str + :param exchange_network_id: ID of the exchange network to filter sites by. Optional. + :type exchange_network_id: str + :param name: Name of the site to filter by. Optional. + :type name: str + :param kwargs: Optional parameters such as limit, sort, fields. + - limit: Maximum number of sites to return. + - sort: Field to sort the results by. Can be prefixed with '-' for descending order. + Valid sort fields: name, updated_at + - fields: List of fields to include in the response. + Valid fields: name, created_at, updated_at, editable, lan_as_dns, + local_domain, primary_dns, secondary_dns, tags + :return: A list of exchange sites, a single site if site_id is provided, or an error message if no sites are found. + :raises TypeError: If the type of any parameter is incorrect. + :raises ValueError: If an invalid parameter or value is provided. + """ + call_type = 'Exchange Sites' + get_url = f'{self.base_url}/beta/exchange_sites' + + allowed_params = { + 'limit': int, + 'sort': str, + 'fields': list + } + + valid_sort_fields = ['name', 'updated_at'] + valid_fields = ['name', 'created_at', 'updated_at', 'editable', 'lan_as_dns', + 'local_domain', 'primary_dns', 'secondary_dns', 'tags'] + + params = {} + + if exchange_network_id: + if not isinstance(exchange_network_id, str): + raise TypeError("exchange_network_id must be a string") + params['filter[exchange_network]'] = exchange_network_id + + if name: + if not isinstance(name, str): + raise TypeError("name must be a string") + params['filter[name]'] = name + + # Type checking and validation for parameters + for key, value in kwargs.items(): + if key in allowed_params: + if not isinstance(value, allowed_params[key]): + raise TypeError(f"{key} must be of type {allowed_params[key].__name__}") + + if key == 'sort': + sort_field = value.lstrip('-') + if sort_field not in valid_sort_fields: + raise ValueError(f"Invalid sort field: {sort_field}") + + elif key == 'fields': + for field in value: + if field not in valid_fields: + raise ValueError(f"Invalid field: {field}") + params[key] = ','.join(value) + else: + params[key] = value + + elif key not in ['search', 'filter']: + raise ValueError(f"Invalid parameter: {key}") + + if site_id: + if not isinstance(site_id, str): + raise TypeError("site_id must be a string") + get_url += f'/{site_id}' + response = self.__get_json(get_url, call_type) + + if response.startswith('ERROR'): + return [f"No site found with site_id: {site_id}"] + return response + + params.update(self.__parse_kwargs(kwargs, allowed_params.keys())) + + response = self.__get_json(get_url, call_type, params=params) + + if not response: + if name: + return [f"No site found with name: {name}"] + if exchange_network_id: + return [f"No sites found for exchange_network_id: {exchange_network_id}"] + + return response + + def create_exchange_site(self, name: str, exchange_network_id: str, router_id: str, **kwargs) -> dict: + """ + Creates an exchange site. + + :param name: Name of the exchange site. + :type name: str + :param exchange_network_id: ID of the exchange network. + :type exchange_network_id: str + :param router_id: ID of the endpoint. + :type router_id: str + :param kwargs: Optional parameters such as primary_dns, secondary_dns, lan_as_dns, local_domain, tags. + - primary_dns: Primary DNS of the exchange site. + - secondary_dns: Secondary DNS of the exchange site. + - lan_as_dns: Whether LAN is used as DNS. Defaults to False. + - local_domain: Local domain of the exchange site. + - tags: List of tags for the exchange site. + :return: The created exchange site data if successful, error message otherwise. + :raises TypeError: If the type of any parameter is incorrect. + :raises ValueError: If required parameters are missing or if an invalid parameter or value is provided. + """ + call_type = 'Create Exchange Site' + + # Type checking for required parameters + if not isinstance(name, str): + raise TypeError("name must be a string") + if not isinstance(exchange_network_id, str): + raise TypeError("exchange_network_id must be a string") + if not isinstance(router_id, str): + raise TypeError("router_id must be a string") + + post_url = f'{self.base_url}/beta/exchange_sites' + + allowed_params = { + 'primary_dns': str, + 'secondary_dns': str, + 'lan_as_dns': bool, + 'local_domain': str, + 'tags': list + } + + attributes = { + 'name': name, + 'lan_as_dns': False # Default value + } + + # Process optional parameters + for key, value in kwargs.items(): + if key in allowed_params: + if not isinstance(value, allowed_params[key]): + raise TypeError(f"{key} must be of type {allowed_params[key].__name__}") + if key == 'tags': + if not all(isinstance(tag, str) for tag in value): + raise TypeError("All tags must be strings") + attributes[key] = value + else: + raise ValueError(f"Invalid parameter: {key}") + + # Check if lan_as_dns is True and primary_dns is provided + if attributes.get('lan_as_dns', False) and 'primary_dns' not in attributes: + raise ValueError("primary_dns is required when lan_as_dns is True") + + data = { + "data": { + "type": "exchange_user_managed_sites", + "attributes": attributes, + "relationships": { + "exchange_network": { + "data": { + "id": exchange_network_id, + "type": "exchange_networks" + } + }, + "endpoints": { + "data": [ + { + "id": router_id, + "type": "endpoints" + } + ] + } + } + } + } + + ncm = self.session.post(post_url, data=json.dumps(data)) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + if ncm.status_code == 201: + return ncm.json()['data'] + else: + return result + + def update_exchange_site(self, site_id: str = None, name: str = None, **kwargs) -> dict: + """ + Updates an exchange site. + + :param site_id: ID of the exchange site to update. Optional if name is provided. + :type site_id: str, optional + :param name: Name of the exchange site to update or the new name if site_id is provided. + :type name: str, optional + :param kwargs: Optional parameters to update. Can include: + - primary_dns: New primary DNS for the exchange site. + - secondary_dns: New secondary DNS for the exchange site. + - lan_as_dns: Whether LAN should be used as DNS. + - local_domain: New local domain for the exchange site. + - tags: New list of tags for the exchange site. + :return: The updated exchange site data if successful, error message otherwise. + :raises TypeError: If the type of any parameter is incorrect. + :raises ValueError: If neither site_id nor name is provided, or if an invalid parameter is provided. + :raises LookupError: If no site is found when searching by id or name. + """ + call_type = 'Update Exchange Site' + + if (site_id is None or site_id == '') and (name is None or name == ''): + raise ValueError("Either site_id or name must be provided and cannot be blank") + + allowed_params = { + 'primary_dns': str, + 'secondary_dns': str, + 'lan_as_dns': bool, + 'local_domain': str, + 'tags': list + } + + # Get current site data + if site_id: + if not isinstance(site_id, str): + raise TypeError("site_id must be a string") + current_site = self.get_exchange_sites(site_id=site_id) + if not current_site: + raise LookupError(f"No site found with id: {site_id}") + current_site = current_site[0] + update_name = name is not None + elif name: + if not isinstance(name, str): + raise TypeError("name must be a string") + current_site = self.get_exchange_sites(name=name) + if not current_site: + raise LookupError(f"No site found with name: {name}") + current_site = current_site[0] + site_id = current_site['id'] + update_name = False + + put_url = f'{self.base_url}/beta/exchange_sites/{site_id}' + + attributes = current_site['attributes'] + exchange_network_id = current_site['relationships']['exchange_network']['data']['id'] + router_id = current_site['relationships']['endpoints']['data'][0]['id'] + + # Update name if site_id was provided and name is different + if update_name and name != attributes['name']: + attributes['name'] = name + + # Update attributes with new values + for key, expected_type in allowed_params.items(): + if key in kwargs: + value = kwargs[key] + if key == 'tags': + if not isinstance(value, list): + raise TypeError("tags must be a list") + if not all(isinstance(tag, str) for tag in value): + raise TypeError("All tags must be strings") + elif not isinstance(value, expected_type): + raise TypeError(f"{key} must be of type {expected_type.__name__}") + attributes[key] = value + + # Check if lan_as_dns is True and primary_dns is provided + if attributes.get('lan_as_dns', False) and 'primary_dns' not in attributes: + raise ValueError("primary_dns is required when lan_as_dns is True") + + data = { + "data": { + "type": "exchange_user_managed_sites", + "id": site_id, + "attributes": attributes, + "relationships": { + "exchange_network": { + "data": { + "type": "exchange_networks", + "id": exchange_network_id + } + }, + "endpoints": { + "data": [{ + "type": "routers", + "id": router_id + }] + } + } + } + } + + ncm = self.session.put(put_url, data=json.dumps(data)) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + if ncm.status_code == 200: + return ncm.json()['data'] + else: + return result + + def delete_exchange_site(self, site_id: str = None, site_name: str = None) -> dict: + """ + Deletes an exchange site and its associated resources. + + :param site_id: ID of the exchange site to delete. Optional if site_name is provided. + :type site_id: str, optional + :param site_name: Name of the exchange site to delete. Optional if site_id is provided. + :type site_name: str, optional + :return: The response from the DELETE request. + :raises TypeError: If the type of any parameter is incorrect. + :raises ValueError: If neither site_id nor site_name is provided. + """ + call_type = 'Delete Exchange Site' + + if not site_id and not site_name: + raise ValueError("Either site_id or site_name must be provided") + + if site_name and not isinstance(site_name, str): + raise TypeError("site_name must be a string") + if site_id and not isinstance(site_id, str): + raise TypeError("site_id must be a string") + + # Delete associated resources + if site_id: + resource_deletion_results = self.delete_exchange_resource(site_id=site_id) + else: + resource_deletion_results = self.delete_exchange_resource(site_name=site_name) + + # Delete the exchange site + if site_id: + delete_url = f'{self.base_url}/beta/exchange_sites/{site_id}' + else: + site_id = self.get_exchange_sites(name=site_name)[0]["id"] + delete_url = f'{self.base_url}/beta/exchange_sites/{site_id}' + + ncm = self.session.delete(delete_url) + + if ncm.status_code == 204: + site_deletion_result = "deleted" + else: + site_deletion_result = "error" + + return { + "site_deletion_result": site_deletion_result, + "resource_deletion_results": resource_deletion_results + } + + def get_exchange_resources(self, site_id: str = None, exchange_network_id: str = None, resource_id: str = None, site_name: str = None, **kwargs) -> list: + """ + Returns information about exchange resources. + + :param site_id: ID of the exchange site to filter resources by. Optional. + :type site_id: str + :param exchange_network_id: ID of the exchange network to filter resources by. Optional. + :type exchange_network_id: str + :param resource_id: ID of a specific exchange resource to retrieve. Optional. + :type resource_id: str + :param site_name: Name of the exchange site to filter resources by. Optional. + :type site_name: str + :param kwargs: Optional parameters such as name, limit, sort, fields, resource_type. + - name: Name of the resource to filter by. + - limit: Maximum number of resources to return. + - sort: Field to sort the results by. Can be prefixed with '-' for descending order. + - fields: List of fields to include in the response. + - resource_type: Type of resource to filter by (exchange_fqdn_resources, exchange_wildcard_fqdn_resources, or exchange_ipsubnet_resources). + :return: A list of exchange resources or a single resource if resource_id is provided. + :raises TypeError: If the type of any parameter is incorrect. + :raises ValueError: If an invalid parameter or value is provided. + :raises LookupError: If no site is found when searching by site_name. + """ + call_type = 'Exchange Resources' + + if resource_id: + if not isinstance(resource_id, str): + raise TypeError("resource_id must be a string") + get_url = f"{self.base_url}/beta/exchange_resources/{resource_id}" + else: + get_url = f"{self.base_url}/beta/exchange_resources" + + params = {} + if site_name: + if not isinstance(site_name, str): + raise TypeError("site_name must be a string") + sites = self.get_exchange_sites(name=site_name) + if not sites: + raise LookupError(f"No site found with name: {site_name}") + site_id = sites[0]['id'] + + if site_id: + if not isinstance(site_id, str): + raise TypeError("site_id must be a string") + params['filter[exchange_site]'] = site_id + elif exchange_network_id: + if not isinstance(exchange_network_id, str): + raise TypeError("exchange_network_id must be a string") + params['filter[exchange_network]'] = exchange_network_id + + allowed_params = { + 'name': str, + 'limit': int, + 'sort': str, + 'fields': list, + 'resource_type': str + } + + valid_sort_fields = ['name', 'created_at', 'updated_at', 'protocols', 'tags', 'domain', 'ip', 'static_prime_ip', 'port_ranges'] + valid_fields = ['name', 'created_at', 'updated_at', 'protocols', 'tags', 'domain', 'ip', 'static_prime_ip', 'port_ranges'] + valid_types = ['exchange_fqdn_resources', 'exchange_wildcard_fqdn_resources', 'exchange_ipsubnet_resources'] + + for key, value in kwargs.items(): + if key in allowed_params: + if not isinstance(value, allowed_params[key]): + raise TypeError(f"{key} must be of type {allowed_params[key].__name__}") + + if key == 'sort': + if value.lstrip('-') not in valid_sort_fields: + raise ValueError(f"Invalid sort field: {value}") + + elif key == 'fields': + for field in value: + if field not in valid_fields: + raise ValueError(f"Invalid field: {field}") + params[key] = ','.join(value) + + elif key == 'resource_type': + if value not in valid_types: + raise ValueError(f"Invalid resource type: {value}. Valid types are: {', '.join(valid_types)}") + params['filter[type]'] = value + + else: + params[key] = value + + elif key not in ['search', 'filter']: + raise ValueError(f"Invalid parameter: {key}") + else: + params[key] = value + + response = self.session.get(get_url, params=params) + + if response.status_code == 200: + data = response.json()['data'] + return data if isinstance(data, list) else [data] + else: + return f"ERROR: {response.status_code}: {response.text}" + + def create_exchange_resource(self, resource_name: str, resource_type: str, site_id: str = None, site_name: str = None, **kwargs) -> dict: + """ + Creates an exchange resource. + + :param resource_name: Name for the new resource. + :type resource_name: str + :param resource_type: Type of resource to create. Must be one of: + 'exchange_fqdn_resources', 'exchange_wildcard_fqdn_resources', or 'exchange_ipsubnet_resources'. + :type resource_type: str + :param site_id: NCX Site ID to add the resource to. Optional if site_name is provided. + :type site_id: str + :param site_name: Name of the NCX Site to add the resource to. Optional if site_id is provided. + :type site_name: str + :param kwargs: Optional parameters for the resource. Can include: + - protocols: List of protocols (e.g., ['TCP'], ['UDP'], ['TCP', 'UDP'], or ['ICMP']). + - tags: List of tags for the resource. + - domain: Domain name for FQDN or wildcard FQDN resources. Required for these types. + For wildcard FQDN, must start with '*.'. + - ip: IP address for IP subnet resources. Required for this type. + - static_prime_ip: Static prime IP for the resource. + - port_ranges: List of port ranges. Each range can be an int, a string (e.g., '80' or '8000-8080'). + Will be converted to a list of dicts with 'lower_limit' and 'upper_limit'. + Not allowed when protocol is ICMP or None. + :return: The created exchange resource data if successful, error message otherwise. + :raises TypeError: If the type of any parameter is incorrect. + :raises ValueError: If required parameters are missing, if an invalid resource type is provided, + if an invalid parameter or value is provided, or if port ranges are provided + with ICMP protocol or no protocol. + :raises LookupError: If no site is found when searching by site_name. + """ + call_type = 'Create Exchange Site Resource' + + # Type checking for required parameters + if not isinstance(resource_name, str): + raise TypeError("resource_name must be a string") + if not isinstance(resource_type, str): + raise TypeError("resource_type must be a string") + + # Validate and get site_id + if site_id is None and site_name is None: + raise ValueError("Either site_id or site_name must be provided") + + if site_name: + if not isinstance(site_name, str): + raise TypeError("site_name must be a string") + sites = self.get_exchange_sites(name=site_name) + if not sites: + raise LookupError(f"No site found with name: {site_name}") + site_id = sites[0]['id'] + elif not isinstance(site_id, str): + raise TypeError("site_id must be a string") + + valid_resource_types = ['exchange_fqdn_resources', 'exchange_wildcard_fqdn_resources', 'exchange_ipsubnet_resources', 'exchange_http_resources', 'exchange_https_resources'] + if resource_type not in valid_resource_types: + raise ValueError(f"Invalid resource_type. Must be one of: {', '.join(valid_resource_types)}") + + post_url = f'{self.base_url}/beta/exchange_resources' + + allowed_params = { + 'protocols': (list, type(None)), + 'tags': list, + 'domain': str, + 'ip': str, + 'static_prime_ip': str, + 'port_ranges': (list, type(None)) + } + + attributes = {'name': resource_name} + + # Validate required parameters based on resource_type + if resource_type == 'exchange_ipsubnet_resources': + if 'ip' not in kwargs: + raise ValueError("'ip' is required for IP subnet resources") + attributes['ip'] = kwargs['ip'] + elif resource_type in ['exchange_fqdn_resources', 'exchange_wildcard_fqdn_resources']: + if 'domain' not in kwargs: + raise ValueError("'domain' is required for FQDN and wildcard FQDN resources") + domain = kwargs['domain'] + if resource_type == 'exchange_wildcard_fqdn_resources' and not domain.startswith('*.'): + raise ValueError("Domain for wildcard FQDN resources must start with '*.'") + attributes['domain'] = domain + + # Process optional parameters + for key, value in kwargs.items(): + if key in allowed_params and key not in attributes: + if not isinstance(value, allowed_params[key]): + raise TypeError(f"{key} must be of type {allowed_params[key].__name__}") + if key == 'tags': + if not all(isinstance(tag, str) for tag in value): + raise TypeError("All tags must be strings") + if key == 'protocols': + valid_protocols = [['TCP'], ['UDP'], ['TCP', 'UDP'], ['ICMP'], None] + if value not in valid_protocols: + raise ValueError(f"Invalid protocols. Must be one of: {valid_protocols}") + attributes[key] = value + if key == 'port_ranges': + # Check if protocols are set and not ICMP or None + if 'protocols' not in attributes or attributes['protocols'] in [['ICMP'], None]: + raise ValueError("Port ranges cannot be specified when protocol is ICMP or None") + + parsed_ranges = [] + for range_str in value: + if isinstance(range_str, int): + parsed_ranges.append({'lower_limit': range_str, 'upper_limit': range_str}) + elif isinstance(range_str, str): + if '-' in range_str: + lower, upper = map(int, range_str.split('-')) + if lower > upper: + raise ValueError(f"Invalid port range: {range_str}. Lower limit must be less than or equal to upper limit.") + parsed_ranges.append({'lower_limit': lower, 'upper_limit': upper}) + else: + port = int(range_str) + parsed_ranges.append({'lower_limit': port, 'upper_limit': port}) + else: + raise ValueError(f"Invalid port range format: {range_str}") + attributes[key] = parsed_ranges + else: + attributes[key] = value + + data = { + "data": { + "type": resource_type, + "attributes": attributes, + "relationships": { + "exchange_site": { + "data": { + "id": site_id, + "type": "exchange_sites" + } + } + } + } + } + + ncm = self.session.post(post_url, data=json.dumps(data)) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + if ncm.status_code == 201: + return ncm.json()['data'] + else: + return result + + def update_exchange_resource(self, resource_id: str, **kwargs) -> dict: #site_id: str = None, site_name: str = None, + """ + Updates an exchange resource. + + :param resource_id: ID of the exchange resource to update. + :type resource_id: str + :param site_id: NCX Site ID of the resource. Optional if site_name is provided. + :type site_id: str + :param site_name: Name of the NCX Site of the resource. Optional if site_id is provided. + :type site_name: str + :param kwargs: Optional parameters to update. Can include: + - name: New name for the resource. + - protocols: List of protocols (e.g., ['TCP'], ['UDP'], ['TCP', 'UDP'], or ['ICMP']). + - tags: List of tags for the resource. + - domain: Domain name for FQDN or wildcard FQDN resources. + - ip: IP address for IP subnet resources. + - static_prime_ip: Static prime IP for the resource. + - port_ranges: List of port ranges. Each range can be an int, a string (e.g., '80' or '8000-8080'). + Will be converted to a list of dicts with 'lower_limit' and 'upper_limit'. + Not allowed when protocol is ICMP or None. + :return: The updated exchange resource data if successful, error message otherwise. + :raises TypeError: If the type of any parameter is incorrect. + :raises ValueError: If an invalid parameter or value is provided, + or if port ranges are provided with ICMP protocol or no protocol. + :raises LookupError: If no site is found when searching by site_name. + """ + call_type = 'Update Exchange Resource' + + if not isinstance(resource_id, str): + raise TypeError("resource_id must be a string") + + # Raise an error if resource_type is provided + if 'resource_type' in kwargs: + raise ValueError("resource_type cannot be updated after resource creation") + + # Get current resource data + current_resource = self.get_exchange_resources(resource_id=resource_id)[0] + resource_type = current_resource['type'] + site_id = current_resource['relationships']['exchange_site']['data']['id'] + + put_url = f'{self.base_url}/beta/exchange_resources/{resource_id}' + + allowed_params = { + 'name': str, + 'protocols': (list, type(None)), + 'tags': list, + 'domain': str, + 'ip': str, + 'static_prime_ip': str, + 'port_ranges': (list, type(None)) + } + + attributes = current_resource['attributes'] + + # Process optional parameters + for key, value in kwargs.items(): + if key in allowed_params: + if not isinstance(value, allowed_params[key]): + raise TypeError(f"{key} must be of type {allowed_params[key].__name__}") + if key == 'tags': + if not all(isinstance(tag, str) for tag in value): + raise TypeError("All tags must be strings") + if key == 'protocols': + valid_protocols = [['TCP'], ['UDP'], ['TCP', 'UDP'], ['ICMP'], None] + if value not in valid_protocols: + raise ValueError(f"Invalid protocols. Must be one of: {valid_protocols}") + # if protocols is set to ICMP or None, port_ranges must be None + if value in [['ICMP'], None]: + attributes['port_ranges'] = None + if key == 'port_ranges': + # Check if protocols are set and not ICMP or None + if 'protocols' not in attributes or attributes['protocols'] in [['ICMP'], None]: + raise ValueError("Port ranges cannot be specified when protocol is ICMP or None") + + parsed_ranges = [] + for range_str in value: + if isinstance(range_str, int): + parsed_ranges.append({'lower_limit': range_str, 'upper_limit': range_str}) + elif isinstance(range_str, str): + if '-' in range_str: + lower, upper = map(int, range_str.split('-')) + if lower > upper: + raise ValueError(f"Invalid port range: {range_str}. Lower limit must be less than or equal to upper limit.") + parsed_ranges.append({'lower_limit': lower, 'upper_limit': upper}) + else: + port = int(range_str) + parsed_ranges.append({'lower_limit': port, 'upper_limit': port}) + else: + raise ValueError(f"Invalid port range format: {range_str}") + value = parsed_ranges + attributes[key] = value + + data = { + "data": { + "type": resource_type, + "id": resource_id, + "attributes": attributes, + "relationships": { + "exchange_site": { + "data": { + "type": "exchange_sites", + "id": site_id + } + } + } + } + } + + ncm = self.session.put(put_url, data=json.dumps(data)) + result = self._return_handler(ncm.status_code, ncm.json(), call_type) + if ncm.status_code == 200: + return ncm.json()['data'] + else: + return result + + def delete_exchange_resource(self, resource_id: str = None, site_name: str = None, site_id: str = None) -> list: + """ + Deletes exchange resources. + + :param resource_id: ID of the exchange resource to delete. Optional if site_name or site_id is provided. + :type resource_id: str, optional + :param site_name: Name of the exchange site to filter resources by. Optional if resource_id or site_id is provided. + :type site_name: str, optional + :param site_id: ID of the exchange site to filter resources by. Optional if resource_id or site_name is provided. + :type site_id: str, optional + :return: The response from the DELETE request. + :raises TypeError: If the type of any parameter is incorrect. + :raises ValueError: If none of resource_id, site_name, or site_id is provided. + :raises LookupError: If no site is found when searching by site_name. + """ + call_type = 'Delete Exchange Resource' + + if not resource_id and not site_name and not site_id: + raise ValueError("Either resource_id, site_name, or site_id must be provided") + + resource_ids = [] + + if resource_id: + if not isinstance(resource_id, str): + raise TypeError("resource_id must be a string") + resource_ids.append(resource_id) + else: + if site_name: + if not isinstance(site_name, str): + raise TypeError("site_name must be a string") + sites = self.get_exchange_sites(name=site_name) + if not sites: + raise LookupError(f"No site found with name: {site_name}") + site_id = sites[0]['id'] + elif site_id and not isinstance(site_id, str): + raise TypeError("site_id must be a string") + + resources = self.get_exchange_resources(site_id=site_id) + resource_ids = [resource['id'] for resource in resources] + + results = [] + for rid in resource_ids: + delete_url = f'{self.base_url}/beta/exchange_resources/{rid}' + ncm = self.session.delete(delete_url) + if ncm.status_code == 204: + results.append({'resource_id': rid, 'status': 'deleted'}) + else: + results.append({'resource_id': rid, 'status': 'error'}) + + return results + + def get_account_authorizations(self, **kwargs): + """ + Get account authorizations + + Args: + **kwargs: Optional parameters for filtering, sorting, and pagination + Supported parameters include: + - fields: Comma-separated list of fields to return + - user: Filter by user + - sort: Field to sort by + - limit: Number of records to return + - search: Search term to filter results + + Returns: + List of account authorization objects + """ + get_url = f'{self.base_url}/beta/account_authorizations' + call_type = 'Account Authorizations' + allowed_params = ['fields', 'user', 'sort', 'limit'] + params = self.__parse_kwargs(kwargs, allowed_params) + + return self.__get_json(get_url, call_type, params=params) + + def put_account_authorizations(self, authorization_id: str, account_authorization: dict): + """ + Update an account authorization role + + Args: + authorization_id: ID of the authorization to update + account_authorization: Account authorization object + + Returns: + Server response + """ + put_url = f'{self.base_url}/beta/account_authorizations/{authorization_id}' + call_type = 'Account Authorization' + ncm = self.session.put(put_url, json=account_authorization) + return self._return_handler(ncm.status_code, ncm.json(), call_type) + + def update_user_role(self, email: str, new_role: str) -> dict: + """ + Updates the role of a user in NCM. + + Args: + email (str): Email address of the user + new_role (str): New role to assign to the user + + Returns: + dict: Response from the API containing the updated authorization + """ + try: + # Find user + users = self.get_users(email=email) + if not users: + raise ValueError(f"User not found: {email}") + + user_id = users[0]['id'] + + # Get account authorizations + auths = self.get_account_authorizations(user=user_id) + if not auths: + raise ValueError(f"No account authorization found for: {email}") + + account_auth_data = auths[0] + account_auth_id = account_auth_data['id'] + + # Update authorization + account_auth = { + "data": { + **account_auth_data, + "attributes": { + **account_auth_data["attributes"], + "role": new_role + } + } + } + call_type = 'Update User Role' + response = self.put_account_authorizations(account_auth_id, account_auth) + return response + + except Exception as e: + self.log('error', f"Error updating role for {email}: {str(e)}") + raise + + # def get_group_modem_upgrade_jobs(self, **kwargs): + # """ + # Returns users with details. + # :param kwargs: A set of zero or more allowed parameters + # in the allowed_params list. + # :return: A list of users with details. + # """ + # call_type = 'Group Modem Upgrades' + # get_url = f'{self.base_url}/beta/group_modem_upgrade_jobs' + + # allowed_params = ['id', + # 'group_id', + # 'module_id', + # 'carrier_id', + # 'overwrite', + # 'active_only', + # 'upgrade_only', + # 'batch_size', + # 'created_at', + # 'created_at__lt', + # 'created_at__lte', + # 'created_at__gt', + # 'created_at__gte', + # 'created_at__ne', + # 'updated_at', + # 'updated_at__lt', + # 'updated_at__lte', + # 'updated_at__gt', + # 'updated_at__gte', + # 'updated_at__ne', + # 'available_version', + # 'modem_count', + # 'success_count', + # 'failed_count', + # 'statuscarrier_name', + # 'module_name', + # 'type', + # 'fields', + # 'limit', + # 'sort'] + + # if "search" not in kwargs.keys(): + # params = self.__parse_kwargs(kwargs, allowed_params) + # else: + # if kwargs['search']: + # params = self.__parse_search_kwargs(kwargs, allowed_params) + # else: + # params = self.__parse_kwargs(kwargs, allowed_params) + # return self.__get_json(get_url, call_type, params=params) + + # def get_group_modem_upgrade_job(self, job_id, **kwargs): + # """ + # Returns users with details. + # :param job_id: The ID of the job + # :param kwargs: A set of zero or more allowed parameters + # in the allowed_params list. + # :return: A list of users with details. + # """ + # call_type = 'Group Modem Upgrades' + # get_url = f'{self.base_url}/beta/group_modem_upgrade_jobs/{job_id}' + + # allowed_params = ['id', + # 'group_id', + # 'module_id', + # 'carrier_id', + # 'overwrite', + # 'active_only', + # 'upgrade_only', + # 'batch_size', + # 'created_at', + # 'updated_at', + # 'available_version', + # 'modem_count', + # 'success_count', + # 'failed_count', + # 'statuscarrier_name', + # 'module_name', + # 'type', + # 'fields', + # 'limit', + # 'sort'] + + # if "search" not in kwargs.keys(): + # params = self.__parse_kwargs(kwargs, allowed_params) + # else: + # if kwargs['search']: + # params = self.__parse_search_kwargs(kwargs, allowed_params) + # else: + # params = self.__parse_kwargs(kwargs, allowed_params) + # return self.__get_json(get_url, call_type, params=params) + + # def get_group_modem_upgrade_summary(self, **kwargs): + # """ + # Returns users with details. + # :param kwargs: A set of zero or more allowed parameters + # in the allowed_params list. + # :return: A list of users with details. + # """ + # call_type = 'Group Modem Upgrades' + # get_url = f'{self.base_url}/beta/group_modem_upgrade_jobs' + + # allowed_params = ['group_id', + # 'module_id', + # 'module_name', + # 'upgradable_modems', + # 'up_to_date_modems', + # 'summary_data', + # 'type', + # 'fields', + # 'limit', + # 'sort'] + + # if "search" not in kwargs.keys(): + # params = self.__parse_kwargs(kwargs, allowed_params) + # else: + # if kwargs['search']: + # params = self.__parse_search_kwargs(kwargs, allowed_params) + # else: + # params = self.__parse_kwargs(kwargs, allowed_params) + # return self.__get_json(get_url, call_type, params=params) + + # def get_group_modem_upgrade_device_summary(self, **kwargs): + # """ + # Returns users with details. + # :param kwargs: A set of zero or more allowed parameters + # in the allowed_params list. + # :return: A list of users with details. + # """ + # call_type = 'Group Modem Upgrades' + # get_url = f'{self.base_url}/beta/group_modem_upgrade_jobs' + + # allowed_params = ['group_id', + # 'module_id', + # 'carrier_id', + # 'overwrite', + # 'active_only', + # 'upgrade_only', + # 'router_name', + # 'net_device_name', + # 'current_version', + # 'type', + # 'fields', + # 'limit', + # 'sort'] + + # if "search" not in kwargs.keys(): + # params = self.__parse_kwargs(kwargs, allowed_params) + # else: + # if kwargs['search']: + # params = self.__parse_search_kwargs(kwargs, allowed_params) + # else: + # params = self.__parse_kwargs(kwargs, allowed_params) + # return self.__get_json(get_url, call_type, params=params) + + # def create_modem_upgrade(self, group_id: int, carrier: str, modem_type_name: str, operation: str, overwrite: bool = False, connection_states: list = None, **kwargs) -> dict: + # """ + # Creates a new modem upgrade job. + + # :param group_id: ID of the group to target for the modem upgrade. + # :type group_id: int + # :param carrier: Targeted carrier (e.g., "att"). + # :type carrier: str + # :param modem_type_name: Module name associated with module_id (e.g., "LP4"). + # :type modem_type_name: str + # :param operation: Operation type [preview|upgrade|cancel]. + # :type operation: str + # :param overwrite: Overwrite modem firmware if on the same version already. Defaults to False. + # :type overwrite: bool + # :param connection_states: The targeted net devices connection state. Optional. + # :type connection_states: list, optional + # :param kwargs: Additional optional parameters to include in the request. + # :return: The created modem upgrade job data if successful, error message otherwise. + # :raises TypeError: If the type of any parameter is incorrect. + # :raises ValueError: If required parameters are missing or if an invalid parameter or value is provided. + # """ + # call_type = 'Create Modem Upgrade' + + # # Type checking for required parameters + # if not isinstance(group_id, int): + # raise TypeError("group_id must be an integer") + # if not isinstance(carrier, str): + # raise TypeError("carrier must be a string") + # if not isinstance(modem_type_name, str): + # raise TypeError("modem_type_name must be a string") + # if not isinstance(operation, str): + # raise TypeError("operation must be a string") + # if not isinstance(overwrite, bool): + # raise TypeError("overwrite must be a boolean") + + # # Validate operation value + # valid_operations = ["preview", "upgrade", "cancel"] + # if operation not in valid_operations: + # raise ValueError(f"operation must be one of: {valid_operations}") + + # # Validate carrier and modem_type_name are not empty + # if not carrier.strip(): + # raise ValueError("carrier cannot be empty") + # if not modem_type_name.strip(): + # raise ValueError("modem_type_name cannot be empty") + + # post_url = f'{self.base_url}/beta/modem_upgrades' + + # # Build attributes dictionary with required fields + # attributes = { + # 'carrier': carrier, + # 'modem_type_name': modem_type_name, + # 'operation': operation, + # 'overwrite': overwrite + # } + + # # Add connection_states if provided + # if connection_states is not None: + # if not isinstance(connection_states, list): + # raise TypeError("connection_states must be a list") + # if not all(isinstance(state, str) for state in connection_states): + # raise TypeError("All connection_states must be strings") + # attributes['connection_states'] = connection_states + + # # Add any additional parameters from kwargs directly to attributes + # for key, value in kwargs.items(): + # attributes[key] = value + + # data = { + # "data": { + # "type": "modem_upgrades", + # "attributes": attributes, + # "relationships": { + # "group": { + # "data": { + # "type": "groups", + # "id": group_id + # } + # } + # } + # } + # } + + # ncm = self.session.post(post_url, data=json.dumps(data)) + # result = self._return_handler(ncm.status_code, ncm.json(), call_type) + # if ncm.status_code == 201: + # return ncm.json()['data'] + # else: + # return result + + + +class NcmClientv2v3: + """ + Unified NCM client that provides access to both v2 and v3 APIs. + Uses composition instead of inheritance for better maintainability. + """ + + def __init__(self, + api_keys=None, + api_key=None, + log_events=True, + logger=None, + retries=5, + retry_backoff_factor=2, + retry_on=None, + base_url=None, + base_url_v3=None): + """ + :param api_keys: Dictionary of API credentials (apiv2). + Optional, but must be set before calling functions. + :type api_keys: dict + :param api_key: API key for apiv3. + Optional, but must be set before calling functions. + :type api_key: str + """ + api_keys = api_keys or {} + apiv3_key = api_keys.pop('token', None) or api_key + + # Initialize clients using composition + self._v2_client = None + self._v3_client = None + + if api_keys: + self._v2_client = NcmClientv2(api_keys=api_keys, + log_events=log_events, + logger=logger, + retries=retries, + retry_backoff_factor=retry_backoff_factor, + retry_on=retry_on, + base_url=base_url) + + if apiv3_key: + base_url = base_url_v3 if api_keys else base_url + self._v3_client = NcmClientv3(api_key=apiv3_key, + log_events=log_events, + logger=logger, + retries=retries, + retry_backoff_factor=retry_backoff_factor, + retry_on=retry_on, + base_url=base_url) + + # For backwards compatibility + self.v2 = self._v2_client + self.v3 = self._v3_client + + def __getattr__(self, name: str) -> Any: + """ + Delegate method calls to the appropriate client. + Prioritizes v2 for router-related methods (since router IDs are v2-specific), + otherwise prioritizes v3 over v2 for method resolution. + + :param name: Name of the attribute to get + :type name: str + :return: The requested attribute + :raises AttributeError: If the attribute doesn't exist in either client + """ + # Router-related methods should use v2 since router IDs are v2-specific + router_methods = [ + 'get_router_appdata', 'get_router_appdata_value', + 'get_router_by_id', 'get_router_by_name', 'get_routers', + 'get_router_alerts', 'get_router_logs', 'get_router_state_samples', + 'get_router_stream_usage_samples', 'get_routers_for_account', + 'get_routers_for_group', 'rename_router_by_id', 'rename_router_by_name', + 'assign_router_to_group', 'remove_router_from_group', 'assign_router_to_account', + 'delete_router_by_id', 'delete_router_by_name', 'reboot_device', + 'set_lan_ip_address', 'set_custom1', 'set_custom2', 'set_admin_password', + 'set_router_name', 'set_router_description', 'set_router_asset_id', + 'set_ethernet_wan_ip', 'add_custom_apn', 'set_ncm_api_keys_by_router', + 'set_router_fields', 'copy_router_configuration', 'resume_updates_for_router', + 'get_net_devices_for_router', 'get_net_devices_for_router_by_mode', + 'get_historical_locations', 'get_historical_locations_for_date', + 'create_location', 'delete_location_for_router', 'create_speed_test_mdm' + ] + + # For router-related methods, try v2 first + if name in router_methods: + if self._v2_client and hasattr(self._v2_client, name): + return getattr(self._v2_client, name) + if self._v3_client and hasattr(self._v3_client, name): + return getattr(self._v3_client, name) + else: + # For other methods, try v3 first, then v2 + if self._v3_client and hasattr(self._v3_client, name): + return getattr(self._v3_client, name) + if self._v2_client and hasattr(self._v2_client, name): + return getattr(self._v2_client, name) + + raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'") + + def __dir__(self) -> list: + """ + Return a list of available attributes and methods. + Combines methods from both v2 and v3 clients. + + :return: List of available attribute names + :rtype: list + """ + attrs = set(super().__dir__()) + if self._v2_client: + attrs.update(dir(self._v2_client)) + if self._v3_client: + attrs.update(dir(self._v3_client)) + return sorted(attrs) + + def get_available_methods(self) -> list: + """ + Get a list of all available methods from both clients. + Useful for introspection and debugging. + + :return: List of available method names + :rtype: list + """ + methods = set() + if self._v2_client: + v2_methods = [method for method in dir(self._v2_client) + if not method.startswith('_') and callable(getattr(self._v2_client, method))] + methods.update(v2_methods) + if self._v3_client: + v3_methods = [method for method in dir(self._v3_client) + if not method.startswith('_') and callable(getattr(self._v3_client, method))] + methods.update(v3_methods) + return sorted(methods) + + def has_v2_client(self) -> bool: + """ + Check if v2 client is available. + + :return: True if v2 client is available + :rtype: bool + """ + return self._v2_client is not None + + def has_v3_client(self) -> bool: + """ + Check if v3 client is available. + + :return: True if v3 client is available + :rtype: bool + """ + return self._v3_client is not None + + +class NcmClient: + """ + This NCM Client class provides functions for interacting with = + the Cradlepoint NCM API. Full documentation of the Cradlepoint API can be + found at: https://developer.cradlepoint.com + """ + + def __new__(cls, api_keys=None, api_key=None, **kwargs): + api_keys = {**(api_keys or {})} + apiv3_key = api_keys.pop('token', None) or api_key + v2 = bool(api_keys) + v3 = bool(apiv3_key) + if v2 and v3: + return NcmClientv2v3(api_keys=api_keys, api_key=apiv3_key, **kwargs) + if v2 or not (v2 or v3): + return NcmClientv2(api_keys=api_keys, **kwargs) + else: + return NcmClientv3(api_key=apiv3_key, **kwargs) + + +# Singleton instance for easy module-level access +_ncm_instance = None + + +def _load_api_keys_from_env() -> Tuple[Optional[Dict[str, str]], Optional[str]]: + """ + Load API keys from environment variables if available. + + :return: Tuple of (v2_api_keys_dict, v3_api_key_string) + :rtype: tuple + """ + # Load v2 API keys from environment + v2_keys = {} + env_v2_keys = { + 'X-CP-API-ID': os.environ.get('X_CP_API_ID'), + 'X-CP-API-KEY': os.environ.get('X_CP_API_KEY'), + 'X-ECM-API-ID': os.environ.get('X_ECM_API_ID'), + 'X-ECM-API-KEY': os.environ.get('X_ECM_API_KEY') + } + + # Only include keys that are actually set + for key, value in env_v2_keys.items(): + if value: + v2_keys[key] = value + + # Load v3 API key from environment + v3_key = os.environ.get('NCM_API_TOKEN') or os.environ.get('TOKEN') + + # Return None for empty dictionaries/keys + v2_result = v2_keys if v2_keys else None + v3_result = v3_key if v3_key else None + + return v2_result, v3_result + + +def get_ncm_instance() -> Union['NcmClientv2', 'NcmClientv3', 'NcmClientv2v3']: + """ + Get the singleton NCM instance. + Automatically initializes from environment variables if no instance exists. + + Environment variables: + - X_CP_API_ID: CP API ID for v2 API + - X_CP_API_KEY: CP API Key for v2 API + - X_ECM_API_ID: ECM API ID for v2 API + - X_ECM_API_KEY: ECM API Key for v2 API + - NCM_API_TOKEN or TOKEN: Bearer token for v3 API + + :param api_keys: Dictionary of API credentials (apiv2). Optional. + :type api_keys: dict + :param api_key: API key for apiv3. Optional. + :type api_key: str + :param kwargs: Additional arguments passed to NcmClient + :return: NCM client instance + :rtype: NcmClientv2, NcmClientv3, or NcmClientv2v3 + """ + global _ncm_instance + if _ncm_instance is None: + # Try to auto-initialize from environment variables + env_v2_keys, env_v3_key = _load_api_keys_from_env() + if env_v2_keys or env_v3_key: + _ncm_instance = NcmClient(api_keys=env_v2_keys, api_key=env_v3_key, log_events=False) + else: + raise RuntimeError("No NCM instance has been created yet. Call ncm.set_api_keys() first or set environment variables (X_CP_API_ID, X_CP_API_KEY, X_ECM_API_ID, X_ECM_API_KEY, NCM_API_TOKEN).") + return _ncm_instance + + +def set_api_keys(api_keys: Optional[Dict[str, str]] = None, + api_key: Optional[str] = None, + **kwargs: Any) -> Union['NcmClientv2', 'NcmClientv3', 'NcmClientv2v3']: + """ + Set API keys for the singleton NCM instance. + This is a convenience function that creates or updates the singleton instance. + This function is backward compatible and doesn't interfere with existing + instance.set_api_keys() methods. + Automatically loads API keys from environment variables if not provided. + + Environment variables: + - X_CP_API_ID: CP API ID for v2 API + - X_CP_API_KEY: CP API Key for v2 API + - X_ECM_API_ID: ECM API ID for v2 API + - X_ECM_API_KEY: ECM API Key for v2 API + - NCM_API_TOKEN or TOKEN: Bearer token for v3 API + + :param api_keys: Dictionary of API credentials (apiv2). Optional. + :type api_keys: dict + :param api_key: API key for apiv3. Optional. + :type api_key: str + :param kwargs: Additional arguments passed to NcmClient + :return: NCM client instance + :rtype: NcmClientv2, NcmClientv3, or NcmClientv2v3 + """ + global _ncm_instance + + # Load from environment if not provided + if not api_keys and not api_key: + env_v2_keys, env_v3_key = _load_api_keys_from_env() + api_keys = env_v2_keys + api_key = env_v3_key + + # Create a new instance with the provided keys + # This uses the existing NcmClient logic which handles key validation + _ncm_instance = NcmClient(api_keys=api_keys, api_key=api_key, **kwargs) + return _ncm_instance + + +def set_ncm_instance(instance: Union['NcmClientv2', 'NcmClientv3', 'NcmClientv2v3']) -> None: + """ + Set the singleton NCM instance (useful for testing or custom configuration). + + :param instance: NCM client instance to use as singleton + :type instance: NcmClientv2, NcmClientv3, or NcmClientv2v3 + """ + global _ncm_instance + _ncm_instance = instance + + +def reset_ncm_instance() -> None: + """ + Reset the singleton NCM instance to None. + """ + global _ncm_instance + _ncm_instance = None + + +# Module-level function factory for direct method access +def _create_module_method(method_name: str) -> Any: + """ + Create a module-level function that delegates to the singleton instance. + + :param method_name: Name of the method to create module-level access for + :type method_name: str + :return: Function that delegates to the singleton instance method + :rtype: function + """ + def module_method(*args: Any, **kwargs: Any) -> Any: + instance = get_ncm_instance() + if not hasattr(instance, method_name): + raise AttributeError(f"NCM client has no method '{method_name}'") + return getattr(instance, method_name)(*args, **kwargs) + + module_method.__name__ = method_name + module_method.__doc__ = f"Module-level access to {method_name} method" + return module_method + + +# Module-level method delegation functions +def _delegate_to_instance(method_name: str, *args: Any, **kwargs: Any) -> Any: + """ + Delegate method calls to the singleton instance. + + :param method_name: Name of the method to call + :type method_name: str + :param args: Positional arguments for the method + :param kwargs: Keyword arguments for the method + :return: Result of the method call + :raises AttributeError: If the method doesn't exist on the instance + """ + instance = get_ncm_instance() + if not hasattr(instance, method_name): + # Provide a more helpful error message + if method_name == 'get_exchange_resources': + raise AttributeError(f"NCM client has no method '{method_name}'. This method requires a v3 API client. Please ensure you have a v3 API token configured.") + else: + raise AttributeError(f"NCM client has no method '{method_name}'") + return getattr(instance, method_name)(*args, **kwargs) + + +def _setup_all_module_methods(): + """ + Automatically create module-level functions for all methods in NCM client classes. + This makes all methods available as module-level functions (e.g., ncm.get_routers()). + """ + # Collect all public methods from the client classes + all_methods = set() + + # Get methods from NcmClientv2 + for name in dir(NcmClientv2): + if not name.startswith('_') and callable(getattr(NcmClientv2, name)): + all_methods.add(name) + + # Get methods from NcmClientv3 + for name in dir(NcmClientv3): + if not name.startswith('_') and callable(getattr(NcmClientv3, name)): + all_methods.add(name) + + # Get methods from NcmClientv2v3 + for name in dir(NcmClientv2v3): + if not name.startswith('_') and callable(getattr(NcmClientv2v3, name)): + all_methods.add(name) + + # Exclude methods that are already defined or are special methods + excluded = { + 'set_api_keys', 'get_ncm_instance', 'set_ncm_instance', 'reset_ncm_instance', + '__class__', '__dict__', '__doc__', '__module__', '__weakref__' + } + + # Create module-level functions for each method + for method_name in all_methods: + if method_name in excluded or method_name in globals(): + continue + + # Create a wrapper function that delegates to the instance + # Use default parameter to capture method_name in closure + def make_wrapper(name=method_name): + def wrapper(*args, **kwargs): + return _delegate_to_instance(name, *args, **kwargs) + wrapper.__name__ = name + wrapper.__doc__ = f"Module-level access to {name} method" + return wrapper + + # Set the function in the module's globals + globals()[method_name] = make_wrapper() + + +# Automatically set up all module-level methods +_setup_all_module_methods() + + +# Backward compatibility: Create a submodule-like structure +class _NcmModule: + """ + Backward compatibility class that provides the old import structure. + Allows scripts to use: from ncm import ncm + """ + + # Expose all the main classes + NcmClient = NcmClient + NcmClientv2 = NcmClientv2 + NcmClientv3 = NcmClientv3 + NcmClientv2v3 = NcmClientv2v3 + BaseNcmClient = BaseNcmClient + + # Expose utility functions as static methods to avoid self parameter issues + @staticmethod + def get_ncm_instance(api_keys: Optional[Dict[str, str]] = None, + api_key: Optional[str] = None, + **kwargs: Any) -> Union['NcmClientv2', 'NcmClientv3', 'NcmClientv2v3']: + """Module-level get_ncm_instance function for backward compatibility.""" + return globals()['get_ncm_instance'](api_keys, api_key, **kwargs) + + @staticmethod + def set_ncm_instance(instance: Union['NcmClientv2', 'NcmClientv3', 'NcmClientv2v3']) -> None: + """Module-level set_ncm_instance function for backward compatibility.""" + return globals()['set_ncm_instance'](instance) + + # Expose reset_ncm_instance as a static method to avoid self parameter issues + @staticmethod + def reset_ncm_instance() -> None: + """Module-level reset_ncm_instance function for backward compatibility.""" + return globals()['reset_ncm_instance']() + + # Expose set_api_keys as a static method to avoid self parameter issues + @staticmethod + def set_api_keys(api_keys: Optional[Dict[str, str]] = None, + api_key: Optional[str] = None, + **kwargs: Any) -> Union['NcmClientv2', 'NcmClientv3', 'NcmClientv2v3']: + """ + Module-level set_api_keys function for backward compatibility. + + :param api_keys: Dictionary of API credentials (apiv2). Optional. + :type api_keys: dict + :param api_key: API key for apiv3. Optional. + :type api_key: str + :param kwargs: Additional arguments passed to NcmClient + :return: NCM client instance + :rtype: NcmClientv2, NcmClientv3, or NcmClientv2v3 + """ + return globals()['set_api_keys'](api_keys, api_key, **kwargs) + + # Expose all module-level methods + def __getattr__(self, name: str) -> Any: + """ + Delegate to module-level functions. + + :param name: Name of the attribute to get + :type name: str + :return: The requested attribute + :raises AttributeError: If the attribute doesn't exist + """ + if hasattr(sys.modules[__name__], name): + return getattr(sys.modules[__name__], name) + raise AttributeError(f"module 'ncm.ncm' has no attribute '{name}'") + + def __dir__(self) -> list: + """ + Return available attributes. + + :return: List of available attribute names + :rtype: list + """ + return sorted(set(dir(sys.modules[__name__]))) + + +# Create the backward compatibility object +ncm = _NcmModule()