package agent import ( "os" "forge.cadoles.com/Cadoles/emissary/internal/command/client/apierr" clientFlag "forge.cadoles.com/Cadoles/emissary/internal/command/client/flag" "forge.cadoles.com/Cadoles/emissary/internal/datastore" "forge.cadoles.com/Cadoles/emissary/pkg/client" "github.com/pkg/errors" "github.com/urfave/cli/v2" "gitlab.com/wpetit/goweb/cli/format" ) func QueryCommand() *cli.Command { return &cli.Command{ Name: "query", Usage: "Query agents", Flags: clientFlag.ComposeFlags( &cli.StringSliceFlag{ Name: "thumbprints", Usage: "use `THUMBPRINTS` as query filter", Value: nil, }, &cli.Int64SliceFlag{ Name: "statuses", Usage: "use `STATUSES` as query filter", }, &cli.Int64SliceFlag{ Name: "ids", Usage: "use `IDS` as query filter", }, ), Action: func(ctx *cli.Context) error { baseFlags := clientFlag.GetBaseFlags(ctx) token, err := clientFlag.GetToken(baseFlags) if err != nil { return errors.WithStack(apierr.Wrap(err)) } options := make([]client.QueryAgentsOptionFunc, 0) thumbprints := ctx.StringSlice("thumbprints") if thumbprints != nil { options = append(options, client.WithQueryAgentsThumbprints(thumbprints...)) } rawIDs := ctx.Int64Slice("ids") if rawIDs != nil { agentIDs := func(ids []int64) []datastore.AgentID { agentIDs := make([]datastore.AgentID, len(ids)) for i, id := range ids { agentIDs[i] = datastore.AgentID(id) } return agentIDs }(rawIDs) options = append(options, client.WithQueryAgentsID(agentIDs...)) } rawStatuses := ctx.Int64Slice("statuses") if rawStatuses != nil { statuses := func(rawStatuses []int64) []datastore.AgentStatus { statuses := make([]datastore.AgentStatus, len(rawStatuses)) for i, status := range rawStatuses { statuses[i] = datastore.AgentStatus(status) } return statuses }(rawStatuses) options = append(options, client.WithQueryAgentsStatus(statuses...)) } client := client.New(baseFlags.ServerURL, client.WithToken(token)) agents, _, err := client.QueryAgents(ctx.Context, options...) if err != nil { return errors.WithStack(apierr.Wrap(err)) } hints := agentHints(baseFlags.OutputMode) if err := format.Write(baseFlags.Format, os.Stdout, hints, clientFlag.AsAnySlice(agents)...); err != nil { return errors.WithStack(err) } return nil }, } }