Files
threshold/internal/cmd/commands/connect/redis.go
T
Justin Nguyen 4548028efe ICU-14484: redis connect helper (#6001)
* add redis connect support
* Setup redis in docker for e2e testing
* Update docs and changelog
* Commenting out e2e tests for now, will revisit in a separate task
2025-09-19 16:20:11 -05:00

83 lines
2.3 KiB
Go

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package connect
import (
"fmt"
"strings"
"github.com/hashicorp/boundary/api/proxy"
"github.com/hashicorp/boundary/internal/cmd/base"
"github.com/posener/complete"
)
const (
redisSynopsis = "Authorize a session against a target and invoke a redis client to connect"
)
func redisOptions(c *Command, set *base.FlagSets) {
f := set.NewFlagSet("Redis Options")
f.StringVar(&base.StringVar{
Name: "style",
Target: &c.flagRedisStyle,
EnvVar: "BOUNDARY_CONNECT_REDIS_STYLE",
Completion: complete.PredictSet("redis-cli"),
Default: "redis-cli",
Usage: `Specifies how the CLI will attempt to invoke a Redis client. This will also set a suitable default for -exec if a value was not specified. Currently-understood values are "redis-cli".`,
})
f.StringVar(&base.StringVar{
Name: "username",
Target: &c.flagUsername,
EnvVar: "BOUNDARY_CONNECT_USERNAME",
Completion: complete.PredictNothing,
Usage: `Specifies the username to pass through to the client. May be overridden by credentials sourced from a credential store.`,
})
}
type redisFlags struct {
flagRedisStyle string
}
func (r *redisFlags) defaultExec() string {
return strings.ToLower(r.flagRedisStyle)
}
func (r *redisFlags) buildArgs(c *Command, port, ip, _ string, creds proxy.Credentials) (args, envs []string, retCreds proxy.Credentials, retErr error) {
var username, password string
retCreds = creds
if len(retCreds.UsernamePassword) > 0 {
// Mark credential as consumed, such that it is not printed to the user
retCreds.UsernamePassword[0].Consumed = true
// Grab the first available username/password credential brokered
username = retCreds.UsernamePassword[0].Username
password = retCreds.UsernamePassword[0].Password
}
switch r.flagRedisStyle {
case "redis-cli":
args = append(args, "-h", ip)
if port != "" {
args = append(args, "-p", port)
}
switch {
case username != "":
args = append(args, "--user", username)
case c.flagUsername != "":
args = append(args, "--user", c.flagUsername, "--askpass")
}
// Password is read by redis-cli via environment variable. The password disappears after the command exits.
if password != "" {
envs = append(envs, fmt.Sprintf("REDISCLI_AUTH=%s", password))
}
}
return args, envs, retCreds, retErr
}