Skip to main content

Asynchronous client for the Aruba Instant REST API

Project description

aioarubainstant

aioarubainstant is a typed asynchronous Python client for the monitoring API on Aruba Instant controllers. It is designed for Home Assistant integrations but has no Home Assistant dependency or entity logic.

Version 0.1.0 supports Python 3.14 and Aruba Instant 8.6 monitoring commands.

Features

  • HTTPS communication with aiohttp on port 4343 by default
  • Configurable TLS certificate verification
  • SID authentication, reuse, and one automatic reauthentication attempt
  • Serialized controller commands to avoid overlapping CLI requests
  • Caller-provided aiohttp.ClientSession support
  • Async context-manager and explicit cleanup APIs
  • Typed immutable cluster, access-point, client, and snapshot models
  • Header-derived table parsing tolerant of reordered and additional columns
  • Sanitized raw command output retained privately for diagnostics

The supported commands are show aps, show client debug, show summary, and show version. The library never issues a per-client show client status <mac> request.

Controller setup

The REST API is disabled by default and is available only through the master AP in a cluster. Enable it from the Aruba Instant CLI:

(Instant AP)(config)# allow-rest-api
(Instant AP)(config)# end
(Instant AP)# commit-apply

The transport and response behavior follow the Aruba Instant 8.6.0.x REST API Guide. Command output formats follow the official Instant AOS-8.x CLI Reference Guide, including its Instant AOS-8.6 command history and examples.

Installation

python -m pip install aioarubainstant==0.1.0

Usage

import asyncio

from aioarubainstant import ArubaInstantClient


async def main() -> None:
    async with ArubaInstantClient(
        "192.0.2.1",
        "admin",
        "controller-password",
        verify_ssl=True,
    ) as client:
        snapshot = await client.async_get_snapshot()

    print(snapshot.cluster.name, snapshot.cluster.version)
    for access_point in snapshot.access_points:
        print(access_point.name, access_point.connected_clients)
    for wireless_client in snapshot.clients:
        print(wireless_client.hostname, wireless_client.associated_ap)


asyncio.run(main())

Controllers commonly use a private certificate. Prefer an ssl.SSLContext that trusts the controller CA. Set verify_ssl=False only when certificate verification is intentionally disabled.

For a caller-owned HTTP session:

import aiohttp

from aioarubainstant import ArubaInstantClient

async with aiohttp.ClientSession() as session:
    client = ArubaInstantClient(
        "controller.example.com",
        "admin",
        "controller-password",
        session=session,
    )
    snapshot = await client.async_get_snapshot()
    await client.async_close()

async_close() logs out but never closes a caller-provided session.

Public contract

The package exports:

  • ArubaInstantClient
  • async_get_snapshot()
  • ArubaInstantSnapshot
  • ArubaCluster
  • ArubaAccessPoint
  • ArubaClient

Model fields are immutable. A field is None when the controller did not report it; the package does not invent placeholder values. A snapshot contains one ArubaCluster, tuples of access points and clients, and private sanitized raw output for diagnostics.

Client counts are never derived by counting parsed records. The cluster total comes from the controller-reported value in show summary, and each AP's count comes from the Clients field in show aps. Parsed show client debug rows provide client details only.

The exception hierarchy is rooted at ArubaInstantError:

  • ArubaInstantAuthenticationError: login credentials were rejected
  • ArubaInstantConnectionError: controller connection or HTTP failure
  • ArubaInstantTimeoutError: request timeout; also a connection error
  • ArubaInstantRestDisabledError: REST API is not enabled
  • ArubaInstantNotMasterError: REST request was sent to a non-master AP
  • ArubaInstantSessionError: invalid or expired SID after the allowed retry
  • ArubaInstantCommandError: controller rejected or failed a command
  • ArubaInstantParseError: malformed JSON or unsupported command output

Passwords and session IDs are never logged. Do not place controller, GitHub, PyPI, or Codex credentials in this repository.

Home Assistant

Use this exact manifest dependency for version 0.1.0:

"requirements": ["aioarubainstant==0.1.0"]

Home Assistant can rely on immutable snapshots, stable MAC-address client identity, AP/client association, master resolution, explicit zero-client collections, and the exception contract above.

Development

Open the repository in VS Code and run Dev Containers: Rebuild and Reopen in Container. The container provides Python 3.14, uv, Ruff, mypy, pytest, build tools, PDF inspection utilities, and GitHub CLI.

The host ${HOME}/.codex directory is bind-mounted to /home/vscode/.codex. The uv cache is persisted separately in a named volume. No authentication data is copied into the image or repository.

Run the complete local checks with:

uv sync --all-extras --dev
uv run ruff check src tests
uv run ruff format --check src tests
uv run mypy src tests
uv run pytest
uv build
uv run twine check dist/*

Real-controller smoke test

The real-controller test is a separate local developer tool. It is not run by CI or by the release workflow. Invoke it explicitly when an Aruba Instant AP is available:

uv run python scripts/check_real_ap.py controller.example.com admin

The script prompts for the controller password without placing it in shell history or process arguments. TLS certificate verification is enabled by default. Use --ca-file controller-ca.pem for a private controller CA, or --insecure only for an intentional local test. By default it validates each supported command independently, validates the combined snapshot, and prints a privacy-safe structural report without raw output, passwords, or session IDs.

To validate one command in isolation:

uv run python scripts/check_real_ap.py controller.example.com admin --insecure \
  --validate-command "show client debug"

Focused command validation prints that command's raw output before the validation result. The default all-command validation remains privacy-safe and does not print raw output.

To print only the controller's raw show summary output for manual inspection:

uv run python scripts/check_real_ap.py controller.example.com admin --insecure --show-summary

Use --show-command to inspect another supported command, for example:

uv run python scripts/check_real_ap.py controller.example.com admin --insecure \
  --show-command "show client debug"

Raw command output may contain controller names, network addresses, client MAC addresses, or other private data. Do not publish it without reviewing and redacting those values.

Release publishing

GitHub releases trigger .github/workflows/release.yml, which builds and validates the distributions before publishing through PyPI trusted publishing. Configure the PyPI project with owner apaperclip, repository aioarubainstant, workflow release.yml, and environment pypi. No PyPI token is stored in GitHub or this repository.

License

Apache License 2.0. See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aioarubainstant-0.1.0.tar.gz (79.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

aioarubainstant-0.1.0-py3-none-any.whl (18.5 kB view details)

Uploaded Python 3

File details

Details for the file aioarubainstant-0.1.0.tar.gz.

File metadata

  • Download URL: aioarubainstant-0.1.0.tar.gz
  • Upload date:
  • Size: 79.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for aioarubainstant-0.1.0.tar.gz
Algorithm Hash digest
SHA256 49d952f6e9aa122277cd04ca8878d03bce8032412ce0fc6e2e49f749552a4934
MD5 b452e9ba6796de30f2a1c4b9ffcce35e
BLAKE2b-256 217fc6bc1382a704c8432c40b247a11e54c993a3d30eb0c98b4688d4e0096890

See more details on using hashes here.

Provenance

The following attestation bundles were made for aioarubainstant-0.1.0.tar.gz:

Publisher: release.yml on apaperclip/aioarubainstant

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aioarubainstant-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: aioarubainstant-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 18.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for aioarubainstant-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 dcb3480e7b3c7643ca4e6cab47b9d3fb4f10caf686a30e0f2898f6545fc61e69
MD5 096cc536d1bf646579c9131bdc6ceb2f
BLAKE2b-256 fc9664e617bbf62200592ef3889b745adf69ec3986cf677cbdc8faa511dbada0

See more details on using hashes here.

Provenance

The following attestation bundles were made for aioarubainstant-0.1.0-py3-none-any.whl:

Publisher: release.yml on apaperclip/aioarubainstant

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page