From 04279ce8c6751ada1161463680a0e91df40cf1e8 Mon Sep 17 00:00:00 2001 From: phil Date: Tue, 6 May 2025 01:35:57 +0200 Subject: [PATCH] Get device info with a device_id or WAN MAC address --- pyproject.toml | 1 + src/gacsco/main.py | 5 ++++- src/gacsco/server.py | 10 +++++++++- uv.lock | 13 ++++++++++++- 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 58a3829..c3e71bb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,6 +6,7 @@ readme = "README.md" requires-python = ">=3.13" dependencies = [ "httpx>=0.28.1", + "netaddr>=1.3.0", "pydantic-settings[yaml]>=2.9.1", "typer>=0.15.3", ] diff --git a/src/gacsco/main.py b/src/gacsco/main.py index 601e97f..50cf21a 100644 --- a/src/gacsco/main.py +++ b/src/gacsco/main.py @@ -40,7 +40,10 @@ def reset(): ... @app.command(help="Get info on the device") -async def info(device_id: Annotated[str, typer.Argument()]): +async def info( + device_id: Annotated[str, typer.Argument(help="device_id or WAN MAC address")], +): + """Get device info, from its device_id or WAN interface MAC address""" try: resp = await server.get_device_info(device_id) print(dumps(resp)) diff --git a/src/gacsco/server.py b/src/gacsco/server.py index eed16a6..79f4dd3 100644 --- a/src/gacsco/server.py +++ b/src/gacsco/server.py @@ -3,6 +3,7 @@ from json import dumps from urllib.parse import quote import httpx +from netaddr import EUI, AddrFormatError from gacsco.config import conf from gacsco.utils import GacscoError @@ -41,8 +42,15 @@ class Server: return resp.json() async def get_device_info(self, device_id: str): - async with httpx.AsyncClient(cookies=self.cookies) as client: + try: + EUI(device_id) + except AddrFormatError: query = {"_id": device_id} + else: + query = { + "InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.MACAddress": device_id + } + async with httpx.AsyncClient(cookies=self.cookies) as client: resp = await client.get( f"{self.url}/devices/?", params={"query": dumps(query)}, diff --git a/uv.lock b/uv.lock index 00a77ec..6af65d7 100644 --- a/uv.lock +++ b/uv.lock @@ -94,10 +94,11 @@ wheels = [ ] [[package]] -name = "genieacs-commander" +name = "gacsco" source = { editable = "." } dependencies = [ { name = "httpx" }, + { name = "netaddr" }, { name = "pydantic-settings", extra = ["yaml"] }, { name = "typer" }, ] @@ -111,6 +112,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "httpx", specifier = ">=0.28.1" }, + { name = "netaddr", specifier = ">=1.3.0" }, { name = "pydantic-settings", extras = ["yaml"], specifier = ">=2.9.1" }, { name = "typer", specifier = ">=0.15.3" }, ] @@ -258,6 +260,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] +[[package]] +name = "netaddr" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/90/188b2a69654f27b221fba92fda7217778208532c962509e959a9cee5229d/netaddr-1.3.0.tar.gz", hash = "sha256:5c3c3d9895b551b763779ba7db7a03487dc1f8e3b385af819af341ae9ef6e48a", size = 2260504, upload-time = "2024-05-28T21:30:37.743Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/cc/f4fe2c7ce68b92cbf5b2d379ca366e1edae38cccaad00f69f529b460c3ef/netaddr-1.3.0-py3-none-any.whl", hash = "sha256:c2c6a8ebe5554ce33b7d5b3a306b71bbb373e000bbbf2350dd5213cc56e3dbbe", size = 2262023, upload-time = "2024-05-28T21:30:34.191Z" }, +] + [[package]] name = "packaging" version = "25.0"