Skip to main content

Imperative UniFi homelab actions the Integration API can't express

Project description

unifictl

Imperative UniFi homelab actions that the official Integration API can't express. Companion to unifi-mcp (reads): same gateway, same API key, but unifictl hits the private controller API to do things — starting with toggling switch-port link aggregation (LACP LAGs).

Status: set lag implemented. The first feature works end-to-end against the private controller API (API-key auth). See SPEC.md for the design and decisions/ for the architecture decision records.

Install

uv tool install unifictl        # or: pipx install unifictl

Usage

unifictl set lag off            # dissolve the LAGs on the leader ports
unifictl set lag on             # restore the LACP bonds
unifictl set lag off --dry-run  # print the computed change, apply nothing

A real apply prints the diff, prompts for confirmation, and snapshots the switch's current port_overrides to a timestamped backup before writing.

Shell completion

unifictl ships bash, zsh, and fish completion. The Homebrew formula installs it automatically. For uv tool/pipx installs, run:

unifictl completion install          # detects your shell from $SHELL
unifictl completion install --shell zsh

Or print a script to wire up manually. For zsh, write it as _unifictl into a directory on your $fpath — the default is ~/.zfunc:

unifictl completion zsh > ~/.zfunc/_unifictl
# then in ~/.zshrc:  fpath+=~/.zfunc && autoload -U compinit && compinit

Completion covers the command tree, set lag on|off, and — when your controller is reachable — switch MACs (--switch) and port indices (show port, set lag --leader). A slow or unreachable controller yields no candidates rather than blocking your shell.

Configuration

Connection and secrets come from the environment or a selected profile (see Profiles & credentials below); env vars are never committed and take precedence over profile values. Matching unifi-mcp:

Variable Purpose
UNIFI_BASE_URL Gateway address, e.g. https://192.168.1.1
UNIFI_API_KEY Integration API key (also authenticates the private endpoints)
UNIFI_SITE Controller site (default default)
UNIFI_CA_CERT Optional path to the controller CA certificate (PEM)
UNIFI_INSECURE_TLS Last-resort TLS bypass
UNIFI_TIMEOUT_MS Per-request timeout (default 30000)

LAG leader ports live in an XDG TOML file at ~/.config/unifictl/config.toml (leaders = [1, 2]); CLI flags override them. The switch MAC is a profile field (see below), not a config.toml setting.

Profiles & credentials

Point unifictl at different targets with named profiles. Non-secret config lives one-file-per-profile under ~/.config/unifictl/profiles/; the API key lives in a separate ~/.config/unifictl/credentials.toml (0600, the only secret file):

# ~/.config/unifictl/profiles/home.toml   (safe to share)
base_url = "https://192.168.1.1"
switch   = "aa:bb:cc:dd:ee:ff"
# credential = "default"      # which credentials.toml section holds the key
# ~/.config/unifictl/credentials.toml      (chmod 600)
[default]
api_key = "…"

A profile's credential defaults to default, so one controller/key backs many per-switch profiles with no duplication. Select a profile with --profile NAME, UNIFI_PROFILE, or profile activate NAME (writes default_profile). Fields resolve CLI > env > profile > built-in; the api_key resolves UNIFI_API_KEY > credentials[credential] > error.

unifictl profile create home        # opens $VISUAL or $EDITOR for the non-secret
                                     # fields, then prompts (hidden) for the API key
unifictl profile list
unifictl profile describe home       # fields + redacted key
unifictl profile set home switch aa:bb:cc:dd:ee:ff
unifictl profile activate home
unifictl credential set default      # rotate the shared key, once
unifictl credential list

Development

uv sync                 # create the venv and install deps
task dev:check          # lint, format-check, typecheck, import boundaries, tests
task dev:hooks-install  # install git hooks (prek)

See SPEC.md for the build reference and decisions/ for the architecture decision records.

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

unifictl-0.5.1.tar.gz (170.0 kB view details)

Uploaded Source

Built Distribution

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

unifictl-0.5.1-py3-none-any.whl (39.4 kB view details)

Uploaded Python 3

File details

Details for the file unifictl-0.5.1.tar.gz.

File metadata

  • Download URL: unifictl-0.5.1.tar.gz
  • Upload date:
  • Size: 170.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for unifictl-0.5.1.tar.gz
Algorithm Hash digest
SHA256 2ca2724dfd81abd51c15d714d4b8cf8a53389e8c83ccfd416aaaf3de2ec74ce8
MD5 a0d90d79e81e065ff1581ea656e095fe
BLAKE2b-256 b0780bec05c656d813d03124710aee4d8212de98d8b45e17c6b9cd8ab7ef90a5

See more details on using hashes here.

Provenance

The following attestation bundles were made for unifictl-0.5.1.tar.gz:

Publisher: release.yaml on yo61/unifictl

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

File details

Details for the file unifictl-0.5.1-py3-none-any.whl.

File metadata

  • Download URL: unifictl-0.5.1-py3-none-any.whl
  • Upload date:
  • Size: 39.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for unifictl-0.5.1-py3-none-any.whl
Algorithm Hash digest
SHA256 886317bb08dbe03530cc380669c10b53f1a615d3c9254900b992417884b885ef
MD5 af37b21c8eb8e58bf6fbbaff9be56038
BLAKE2b-256 adc389772cc5b9000bc6064a94044bd33fdebf2c4351ba851ce993256de3cefe

See more details on using hashes here.

Provenance

The following attestation bundles were made for unifictl-0.5.1-py3-none-any.whl:

Publisher: release.yaml on yo61/unifictl

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