diff --git a/CHANGELOG.md b/CHANGELOG.md index ccca162..8b98138 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,4 +21,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. diff --git a/README.md b/README.md index a842159..a10ce1e 100644 --- a/README.md +++ b/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" @@ -71,9 +72,9 @@ func main() { } for _, iface := range ifaces { - fmt.Printf("Interface %s: %s (POE: %s)\n", - iface.Identification.ID, - iface.Status.Speed, + fmt.Printf("Interface %s: %s (POE: %s)\n", + iface.Identification.ID, + iface.Status.Speed, iface.Port.POE, ) } @@ -91,10 +92,10 @@ if err != nil { 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", + fmt.Printf("[%s] Rx: %d bps, Tx: %d bps\n", iface.Name, iface.Statistics.RxRate, iface.Statistics.TxRate, @@ -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) diff --git a/go.mod b/go.mod index 3badb0d..5ed77bd 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ -module gitea.libretechconsulting.com/rmcguire/edgeos-client +module gitea.libretechconsulting.com/rmcguire/toughswitch-client go 1.25.5 diff --git a/pkg/edgeos/api.go b/pkg/edgeos/api.go index c62f81a..2adbabd 100644 --- a/pkg/edgeos/api.go +++ b/pkg/edgeos/api.go @@ -1,4 +1,4 @@ -package edgeos +package toughswitch import ( "context" diff --git a/pkg/edgeos/client.go b/pkg/edgeos/client.go index 1df1aba..9038dd1 100644 --- a/pkg/edgeos/client.go +++ b/pkg/edgeos/client.go @@ -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 diff --git a/pkg/edgeos/client_test.go b/pkg/edgeos/client_test.go index f7ec7cf..a8a687a 100644 --- a/pkg/edgeos/client_test.go +++ b/pkg/edgeos/client_test.go @@ -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() @@ -106,4 +102,4 @@ func TestClient_AddDel(t *testing.T) { if err := client.Del("test-host"); err == nil { t.Fatal("Expected error deleting non-existent host, got nil") } -} \ No newline at end of file +} diff --git a/pkg/edgeos/config.go b/pkg/edgeos/config.go index f18652a..84cae4b 100644 --- a/pkg/edgeos/config.go +++ b/pkg/edgeos/config.go @@ -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 } diff --git a/pkg/edgeos/types.go b/pkg/edgeos/types.go index dcfa72c..229f14a 100644 --- a/pkg/edgeos/types.go +++ b/pkg/edgeos/types.go @@ -1,4 +1,4 @@ -package edgeos +package toughswitch // LoginResponse represents the response from the login endpoint. type LoginResponse struct {