abra/cli/server/list.go

87 lines
1.9 KiB
Go

package server
import (
"context"
"strings"
"coopcloud.tech/abra/cli/internal"
"coopcloud.tech/abra/pkg/config"
contextPkg "coopcloud.tech/abra/pkg/context"
"coopcloud.tech/abra/pkg/formatter"
"coopcloud.tech/abra/pkg/log"
"github.com/docker/cli/cli/connhelper/ssh"
"github.com/urfave/cli/v3"
)
var serverListCommand = cli.Command{
Name: "list",
Aliases: []string{"ls"},
Usage: "List managed servers",
UsageText: "abra server list [options]",
HideHelpCommand: true,
Flags: []cli.Flag{
internal.DebugFlag,
internal.MachineReadableFlag,
internal.OfflineFlag,
},
Before: internal.SubCommandBefore,
Action: func(ctx context.Context, cmd *cli.Command) error {
dockerContextStore := contextPkg.NewDefaultDockerContextStore()
contexts, err := dockerContextStore.Store.List()
if err != nil {
log.Fatal(err)
}
tableColumns := []string{"name", "host"}
table := formatter.CreateTable(tableColumns)
serverNames, err := config.ReadServerNames()
if err != nil {
log.Fatal(err)
}
for _, serverName := range serverNames {
var row []string
for _, dockerCtx := range contexts {
endpoint, err := contextPkg.GetContextEndpoint(dockerCtx)
if err != nil && strings.Contains(err.Error(), "does not exist") {
// No local context found, we can continue safely
continue
}
if dockerCtx.Name == serverName {
sp, err := ssh.ParseURL(endpoint)
if err != nil {
log.Fatal(err)
}
if sp.Host == "" {
sp.Host = "unknown"
}
row = []string{serverName, sp.Host}
}
}
if len(row) == 0 {
if serverName == "default" {
row = []string{serverName, "local"}
} else {
row = []string{serverName, "unknown"}
}
}
table.Append(row)
}
if internal.MachineReadable {
table.JSONRender()
return nil
}
table.Render()
return nil
},
}