network/preseem/cmd_services.go
2026-07-19 14:42:02 -05:00

93 lines
2.3 KiB
Go

package main
import (
"encoding/json"
"fmt"
"strings"
)
func cmdServices(args []string) error {
if len(args) == 0 {
return fmt.Errorf("services: expected 'list' or 'get'")
}
c, err := NewClient()
if err != nil {
return err
}
switch args[0] {
case "list", "ls":
return cmdServicesList(c, args[1:])
case "get":
return cmdServicesGet(c, args[1:])
default:
return fmt.Errorf("services: unknown verb %q (want: list, get)", args[0])
}
}
func attachmentSummary(s Service) string {
if len(s.Attachments) == 0 {
return "-"
}
parts := make([]string, 0, len(s.Attachments))
for _, a := range s.Attachments {
switch {
case a.CPEMac != "":
parts = append(parts, a.CPEMac)
case a.CPESerial != "":
parts = append(parts, "sn:"+a.CPESerial)
case a.CPEIMSI != "":
parts = append(parts, "imsi:"+a.CPEIMSI)
case a.Username != "":
parts = append(parts, "u:"+a.Username)
case len(a.NetworkPrefixes) > 0:
parts = append(parts, a.NetworkPrefixes[0])
}
}
return strings.Join(parts, ",")
}
func cmdServicesList(c *Client, args []string) error {
o, _, err := parseListFlags("services list", args)
if err != nil {
return err
}
items, p, raw, err := c.fetchList("/services", o)
if err != nil {
return err
}
return emitList(items, p, raw, o, func(items []json.RawMessage) error {
tw := newTab()
fmt.Fprintln(tw, "ID\tACCOUNT\tPACKAGE\tUP_KBPS\tDOWN_KBPS\tPARENT\tATTACHMENTS")
for _, rm := range items {
var s Service
_ = json.Unmarshal(rm, &s)
fmt.Fprintf(tw, "%s\t%s\t%s\t%s\t%s\t%s\t%s\n",
s.ID, s.Account, s.Package,
fmtSpeed(s.UpSpeed), fmtSpeed(s.DownSpeed),
s.ParentDeviceID, attachmentSummary(s))
}
return tw.Flush()
})
}
func cmdServicesGet(c *Client, args []string) error {
jsonMode, id, err := parseGetFlags("services get", args)
if err != nil {
return err
}
var s Service
var raw []byte
if err := c.get(apiPrefix+"/services/"+pathID(id), &s, &raw); err != nil {
return err
}
if jsonMode {
return printJSON(raw)
}
tw := newTab()
fmt.Fprintln(tw, "ID\tACCOUNT\tPACKAGE\tUP_KBPS\tDOWN_KBPS\tPARENT\tATTACHMENTS")
fmt.Fprintf(tw, "%s\t%s\t%s\t%s\t%s\t%s\t%s\n",
s.ID, s.Account, s.Package,
fmtSpeed(s.UpSpeed), fmtSpeed(s.DownSpeed),
s.ParentDeviceID, attachmentSummary(s))
return tw.Flush()
}