Path: blob/main/components/gitpod-cli/cmd/idp-login-vault.go
3603 views
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.1// Licensed under the GNU Affero General Public License (AGPL).2// See License.AGPL.txt in the project root for license information.34package cmd56import (7"context"8"encoding/json"9"fmt"10"os"11"os/exec"12"time"1314"github.com/spf13/cobra"15)1617const (18idpAudienceVault = "vault.hashicorp.com"19)2021var idpLoginVaultOpts struct {22Role string23Audience []string24}2526var idpLoginVaultCmd = &cobra.Command{27Use: "vault",28Short: "Login to HashiCorp's Vault",29RunE: func(cmd *cobra.Command, args []string) error {30cmd.SilenceUsage = true3132ctx, cancel := context.WithTimeout(cmd.Context(), 5*time.Second)33defer cancel()3435tkn, err := idpToken(ctx, idpLoginVaultOpts.Audience, idpLoginOpts.Scope)36if err != nil {37return err38}3940// vault write auth/jwt/login role=demo jwt=$TKN -format=json41out, err := exec.Command("vault", "write", "-format=json", "auth/jwt/login", "role="+idpLoginVaultOpts.Role, "jwt="+tkn).CombinedOutput()42if err != nil {43return fmt.Errorf("%w: %s", err, string(out))44}4546var result struct {47Auth struct {48ClientToken string `json:"client_token"`49} `json:"auth"`50}51err = json.Unmarshal(out, &result)52if err != nil {53return err54}5556vaultCmd := exec.Command("vault", "login", result.Auth.ClientToken)57vaultCmd.Stdout = os.Stdout58vaultCmd.Stderr = os.Stderr59return vaultCmd.Run()60},61}6263func init() {64idpLoginCmd.AddCommand(idpLoginVaultCmd)6566idpLoginVaultCmd.Flags().StringArrayVar(&idpLoginVaultOpts.Audience, "audience", []string{idpAudienceVault}, "audience of the ID token")67idpLoginVaultCmd.Flags().StringVar(&idpLoginVaultOpts.Role, "role", os.Getenv("IDP_VAULT_ROLE"), "Vault role to assume (defaults to IDP_VAULT_ROLE env var)")68}697071