Ryan D McGuire 7661bff6f1
All checks were successful
Publish / release (push) Successful in 19s
update CHANGELOG
2026-01-14 11:15:45 -05:00
2026-01-04 13:32:09 -05:00
2026-01-14 11:11:34 -05:00
2026-01-14 11:15:45 -05:00
2026-01-14 11:11:34 -05:00
2026-01-14 11:11:34 -05:00

ubiquiti-clients

Go client libraries for interacting with Ubiquiti network devices via their REST APIs.

⚠️ Disclaimer: These libraries are based on reverse-engineered API calls. They are not official Ubiquiti products and are subject to change if the device firmware changes.

Packages

toughswitch

A client library for interacting with Ubiquiti ToughSwitch devices (specifically tested with ToughSwitch POE Pro (TS-8-PRO)) via their internal REST API.

Features

  • Authentication: Handles login and session token management automatically.
  • Multi-Device Support: Manage multiple devices with a single client instance.
  • Data Retrieval:
    • System Information: Hostname, uptime, firmware version, etc.
    • Interfaces: Status, POE settings, link speed, statistics.
    • VLANs: Configuration and trunk information.
    • Services: SSH, Telnet, Web Server, NTP, SNMP, etc.
    • Statistics: Real-time throughput, errors, and resource usage.
    • Discovery: Neighbor discovery via UBNT protocol.

edgeos

A client library for interacting with Ubiquiti EdgeOS devices (EdgeRouter, EdgeSwitch) via their REST API.

Features

  • Authentication: Handles login and session management automatically.
  • Multi-Device Support: Manage multiple devices with a single client instance.
  • Data Retrieval:
    • System Configuration: Hostname, domain name, and other system settings.
    • Interface Configuration: Ethernet and switch interface settings, including PoE.
    • VLAN Configuration: VLAN assignments, PVID, and tagged VLANs.
    • Device Information: Model, ports, PoE capabilities, and features.

Installation

# For ToughSwitch
go get gitea.libretechconsulting.com/rmcguire/toughswitch-client/pkg/toughswitch

# For EdgeOS
go get gitea.libretechconsulting.com/rmcguire/toughswitch-client/pkg/edgeos

Usage

ToughSwitch Basic Example

package main

import (
	"context"
	"fmt"
	"log"
	"time"

	"gitea.libretechconsulting.com/rmcguire/toughswitch-client/pkg/toughswitch"
)

func main() {
	ctx := context.Background()

	// Configure your device(s)
	configs := []toughswitch.Config{
		{
			Host:     "192.168.1.1",
			Username: "ubnt",
			Password: "password",
			Insecure: true, // Set to true if using self-signed certs
			Timeout:  10 * time.Second,
		},
	}

	// Initialize the client
	client := toughswitch.MustNew(ctx, configs)

	// Fetch system information
	deviceHost := "192.168.1.1"
	system, err := client.GetSystem(ctx, deviceHost)
	if err != nil {
		log.Fatalf("Failed to get system info: %v", err)
	}

	fmt.Printf("Connected to: %s (Timezone: %s)\n", system.Hostname, system.Timezone)

	// Fetch interfaces
	ifaces, err := client.GetInterfaces(ctx, deviceHost)
	if err != nil {
		log.Fatalf("Failed to get interfaces: %v", err)
	}

	for _, iface := range ifaces {
		fmt.Printf("Interface %s: %s (POE: %s)\n",
			iface.Identification.ID,
			iface.Status.Speed,
			iface.Port.POE,
		)
	}
}

EdgeOS Basic Example

package main

import (
	"context"
	"fmt"
	"log"
	"time"

	"gitea.libretechconsulting.com/rmcguire/toughswitch-client/pkg/edgeos"
)

func main() {
	ctx := context.Background()

	// Configure your device(s)
	configs := []edgeos.Config{
		{
			Host:     "192.168.1.1",
			Username: "ubnt",
			Password: "ubnt",
			Insecure: true, // Set to true if using self-signed certs
			Timeout:  10 * time.Second,
		},
	}

	// Initialize the client
	client := edgeos.MustNew(ctx, configs)

	// Fetch device information
	deviceHost := "192.168.1.1"
	authInfo, err := client.GetAuthInfo(ctx, deviceHost)
	if err != nil {
		log.Fatalf("Failed to get auth info: %v", err)
	}

	fmt.Printf("Connected to: %s (%s) with %d ports\n",
		authInfo.ModelName, authInfo.Model, authInfo.Ports)

	// Fetch system configuration
	system, err := client.GetSystem(ctx, deviceHost)
	if err != nil {
		log.Fatalf("Failed to get system config: %v", err)
	}

	fmt.Printf("Hostname: %s, Domain: %s\n", system.HostName, system.DomainName)

	// Fetch interfaces
	interfaces, err := client.GetInterfaces(ctx, deviceHost)
	if err != nil {
		log.Fatalf("Failed to get interfaces: %v", err)
	}

	for name, config := range interfaces.Ethernet {
		fmt.Printf("Interface %s: %s (Speed: %s, Duplex: %s)\n",
			name,
			config.Description,
			config.Speed,
			config.Duplex,
		)
	}
}

ToughSwitch: Retrieving Statistics

stats, err := client.GetStatistics(ctx, "192.168.1.1")
if err != nil {
    log.Fatal(err)
}

for _, stat := range stats {
    // Device level stats
    fmt.Printf("CPU Usage: %d%%\n", stat.Device.CPU[0].Usage)

    // Per-interface stats
    for _, iface := range stat.Interfaces {
        fmt.Printf("[%s] Rx: %d bps, Tx: %d bps\n",
            iface.Name,
            iface.Statistics.RxRate,
            iface.Statistics.TxRate,
        )
    }
}

Working with Multiple Devices

Both clients are designed to handle multiple devices concurrently.

// ToughSwitch example
configs := []toughswitch.Config{
    {Host: "192.168.1.1", ...},
    {Host: "192.168.1.2", ...},
}
client := toughswitch.MustNew(ctx, configs)

// Get info for all configured devices in parallel
allSystems, err := client.GetAllSystems(ctx)
if err != nil {
    log.Printf("Error fetching some systems: %v", err)
}

for host, sys := range allSystems {
    fmt.Printf("[%s] Hostname: %s\n", host, sys.Hostname)
}

// EdgeOS example
edgeConfigs := []edgeos.Config{
    {Host: "192.168.2.1", ...},
    {Host: "192.168.2.2", ...},
}
edgeClient := edgeos.MustNew(ctx, edgeConfigs)

// Get config for all configured devices in parallel
allConfigs, err := edgeClient.GetAllConfigs(ctx)
if err != nil {
    log.Printf("Error fetching some configs: %v", err)
}

for host, cfg := range allConfigs {
    fmt.Printf("[%s] Hostname: %s\n", host, cfg.System.HostName)
}

Supported Endpoints

ToughSwitch

Method Description
GetSystem General system configuration and status
GetInterfaces Interface configuration and status
GetVLANs VLAN and Trunk configuration
GetServices State of running services (SSH, NTP, etc.)
GetStatistics Performance metrics
GetNeighbors Discovered UBNT neighbors
GetDevice Hardware and capabilities info

All methods have corresponding GetAll* variants for multi-device operations.

EdgeOS

Method Description
GetConfig Complete device configuration
GetAuthInfo Device authentication and feature information
GetInterfaces Interface configuration (ethernet and switch)
GetSystem System configuration (hostname, domain)

All methods have corresponding GetAll* variants for multi-device operations.

License

MIT

Description
Go client package and types for Ubiquiti devices that lack documented APIs or existing open-source support.
Readme 116 KiB
Languages
Go 100%