52 lines
1.7 KiB
Go
52 lines
1.7 KiB
Go
package cli
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
func (a App) ssh(ctx context.Context, args []string) error {
|
|
defaults := defaultConfig()
|
|
fs := newFlagSet("ssh", a.Stderr)
|
|
provider := fs.String("provider", defaults.Provider, providerHelpSSH())
|
|
id := fs.String("id", "", "lease id or slug")
|
|
reclaim := fs.Bool("reclaim", false, "claim this lease for the current repo")
|
|
showSecret := fs.Bool("show-secret", false, "print secret auth material for token-based SSH providers")
|
|
targetFlags := registerTargetFlags(fs, defaults)
|
|
networkFlags := registerNetworkModeFlag(fs, defaults)
|
|
if err := parseFlags(fs, args); err != nil {
|
|
return err
|
|
}
|
|
setIDFromFirstArg(fs, id)
|
|
cfg, err := loadLeaseTargetConfig(fs, *provider, targetFlags, networkFlags, leaseTargetConfigOptions{})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if err := requireLeaseID(*id, "crabbox ssh --id <lease-id-or-slug>", cfg); err != nil {
|
|
return err
|
|
}
|
|
server, target, leaseID, err := a.resolveNetworkLeaseTarget(ctx, cfg, *id, false)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if err := a.claimAndTouchLeaseTarget(ctx, cfg, server, leaseID, *reclaim); err != nil {
|
|
return err
|
|
}
|
|
if target.AuthSecret && !*showSecret {
|
|
fmt.Fprintf(a.Stderr, "warning: ssh auth user is secret; rerun with --show-secret to print a pasteable command\n")
|
|
}
|
|
fmt.Fprintln(a.Stdout, sshCommandLine(target, target.AuthSecret && !*showSecret))
|
|
return nil
|
|
}
|
|
|
|
func sshCommandLine(target SSHTarget, redactSecret bool) string {
|
|
renderTarget := target
|
|
if redactSecret {
|
|
renderTarget.User = "<token>"
|
|
}
|
|
args := append([]string{"ssh"}, sshBaseArgs(renderTarget)...)
|
|
args = append(args, renderTarget.User+"@"+renderTarget.Host)
|
|
return strings.Join(shellWords(args), " ")
|
|
}
|