Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 195a9f7a9f | |||
| ecbf4d447c | |||
| 438d422b53 |
@@ -2,6 +2,11 @@
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## v0.2.1 - 2026-01-05
|
||||
### Changed
|
||||
- Minor LSP improvements to tests
|
||||
- Refactor entire project edgeos -> toughswitch
|
||||
|
||||
## [v0.2.0] - 2026-01-04
|
||||
### Added
|
||||
- Thread-safe `Add` and `Del` methods to `Client` for dynamic host management.
|
||||
@@ -21,4 +26,4 @@ All notable changes to this project will be documented in this file.
|
||||
## [v0.1.0] - 2026-01-04
|
||||
### Added
|
||||
- Initial CI pipeline setup.
|
||||
- Initial release of Ubiquiti EdgeOS Go Client.
|
||||
- Initial release of Ubiquiti toughswitch Go Client.
|
||||
|
||||
17
README.md
17
README.md
@@ -1,6 +1,7 @@
|
||||
# edgeos
|
||||
# toughswitch
|
||||
|
||||
A Go client library for interacting with Ubiquiti EdgeOS devices (specifically tested with EdgeSwitch XP / ToughSwitch) via their internal REST API.
|
||||
A Go client library for interacting with Ubiquiti toughswitch devices (specifically tested with
|
||||
ToughSwitch POE Pro (TS-8-PRO)) via their internal REST API.
|
||||
|
||||
**⚠️ Disclaimer: This library is based on reverse-engineered API calls. It is not an official Ubiquiti product and is subject to change if the device firmware changes.**
|
||||
|
||||
@@ -19,7 +20,7 @@ A Go client library for interacting with Ubiquiti EdgeOS devices (specifically t
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
go get gitea.libretechconsulting.com/rmcguire/edgeos-client/pkg/edgeos
|
||||
go get gitea.libretechconsulting.com/rmcguire/toughswitch-client/pkg/toughswitch
|
||||
```
|
||||
|
||||
## Usage
|
||||
@@ -35,14 +36,14 @@ import (
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"gitea.libretechconsulting.com/rmcguire/edgeos-client/pkg/edgeos"
|
||||
"gitea.libretechconsulting.com/rmcguire/toughswitch-client/pkg/toughswitch"
|
||||
)
|
||||
|
||||
func main() {
|
||||
ctx := context.Background()
|
||||
|
||||
// Configure your device(s)
|
||||
configs := []edgeos.Config{
|
||||
configs := []toughswitch.Config{
|
||||
{
|
||||
Host: "192.168.1.1",
|
||||
Username: "ubnt",
|
||||
@@ -53,7 +54,7 @@ func main() {
|
||||
}
|
||||
|
||||
// Initialize the client
|
||||
client := edgeos.MustNew(ctx, configs)
|
||||
client := toughswitch.MustNew(ctx, configs)
|
||||
|
||||
// Fetch system information
|
||||
deviceHost := "192.168.1.1"
|
||||
@@ -108,11 +109,11 @@ for _, stat := range stats {
|
||||
The client is designed to handle multiple devices concurrently.
|
||||
|
||||
```go
|
||||
configs := []edgeos.Config{
|
||||
configs := []toughswitch.Config{
|
||||
{Host: "192.168.1.1", ...},
|
||||
{Host: "192.168.1.2", ...},
|
||||
}
|
||||
client := edgeos.MustNew(ctx, configs)
|
||||
client := toughswitch.MustNew(ctx, configs)
|
||||
|
||||
// Get info for all configured devices in parallel
|
||||
allSystems, err := client.GetAllSystems(ctx)
|
||||
|
||||
2
go.mod
2
go.mod
@@ -1,3 +1,3 @@
|
||||
module gitea.libretechconsulting.com/rmcguire/edgeos-client
|
||||
module gitea.libretechconsulting.com/rmcguire/toughswitch-client
|
||||
|
||||
go 1.25.5
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package edgeos
|
||||
package toughswitch
|
||||
|
||||
import (
|
||||
"context"
|
||||
@@ -1,10 +1,10 @@
|
||||
/*
|
||||
Package edgeos provides a client for interacting with Ubiquiti EdgeOS devices
|
||||
Package toughswitch provides a client for interacting with Ubiquiti toughswitch devices
|
||||
via their REST API. It supports authentication, token management, and
|
||||
retrieval of system, interface, VLAN, and discovery information from
|
||||
one or more devices.
|
||||
*/
|
||||
package edgeos
|
||||
package toughswitch
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
@@ -19,7 +19,7 @@ import (
|
||||
"sync"
|
||||
)
|
||||
|
||||
// Client handles communication with EdgeOS devices.
|
||||
// Client handles communication with toughswitch devices.
|
||||
type Client struct {
|
||||
mu sync.RWMutex
|
||||
devices map[string]*deviceClient
|
||||
@@ -1,4 +1,4 @@
|
||||
package edgeos
|
||||
package toughswitch
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
@@ -34,11 +34,9 @@ func TestClient_ThreadSafety(t *testing.T) {
|
||||
start := make(chan struct{})
|
||||
|
||||
// Writer: Adds and deletes hosts
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
wg.Go(func() {
|
||||
<-start
|
||||
for i := 0; i < 100; i++ {
|
||||
for i := range 100 {
|
||||
host := fmt.Sprintf("host-%d", i)
|
||||
cfg := &Config{
|
||||
Host: host,
|
||||
@@ -54,20 +52,18 @@ func TestClient_ThreadSafety(t *testing.T) {
|
||||
t.Logf("Del error: %v", err)
|
||||
}
|
||||
}
|
||||
}()
|
||||
})
|
||||
|
||||
// Reader: Iterates hosts
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
wg.Go(func() {
|
||||
<-start
|
||||
for i := 0; i < 10; i++ {
|
||||
for range 10 {
|
||||
// GetAllInterfaces iterates keys.
|
||||
// With mock transport, this will succeed (returning empty structs)
|
||||
// checking for race conditions.
|
||||
_, _ = client.GetAllInterfaces(ctx)
|
||||
}
|
||||
}()
|
||||
})
|
||||
|
||||
close(start)
|
||||
wg.Wait()
|
||||
@@ -1,11 +1,10 @@
|
||||
package edgeos
|
||||
package toughswitch
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"time"
|
||||
)
|
||||
|
||||
// Config represents the configuration for an EdgeOS device.
|
||||
type Config struct {
|
||||
Host string
|
||||
Scheme string
|
||||
@@ -13,6 +12,6 @@ type Config struct {
|
||||
Username string
|
||||
Password string
|
||||
Timeout time.Duration
|
||||
// Transport allows customizing the http transport (useful for testing)
|
||||
// Transport allows customizing the http transport (useful for testing or client middleware)
|
||||
Transport http.RoundTripper
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package edgeos
|
||||
package toughswitch
|
||||
|
||||
// LoginResponse represents the response from the login endpoint.
|
||||
type LoginResponse struct {
|
||||
Reference in New Issue
Block a user