cli/config.go (91 lines of code) (raw):
// Copyright 2016 Google, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package cli
import (
"context"
"encoding/csv"
"flag"
"fmt"
"os"
"strings"
"github.com/GoogleCloudPlatform/docker-credential-gcr/v2/config"
"github.com/google/subcommands"
)
const (
tokenSourceFlag = "token-source"
resetAllFlag = "unset-all"
)
type configCmd struct {
cmd
tokenSources string
resetAll bool
}
// NewConfigSubcommand returns a subcommands.Command which allows for user
// configuration of cred helper behavior.
func NewConfigSubcommand() subcommands.Command {
return &configCmd{
cmd{
name: "config",
synopsis: "configure the credential helper",
},
// Because only specified flags are iterated by FlagSet.Visit,
// these values will always be explicitly set by the user if visited.
"unused",
false,
}
}
func (c *configCmd) SetFlags(fs *flag.FlagSet) {
srcs := make([]string, 0, len(config.SupportedGCRTokenSources))
for src := range config.SupportedGCRTokenSources {
srcs = append(srcs, src)
}
supportedSources := strings.Join(srcs, ", ")
defaultSources := strings.Join(config.DefaultTokenSources[:], ", ")
fs.StringVar(&c.tokenSources, tokenSourceFlag, defaultSources, "The source(s), in order, to search for credentials. Supported sources are: "+supportedSources)
fs.BoolVar(&c.resetAll, resetAllFlag, false, "Resets all settings to default")
}
func (c *configCmd) Execute(_ context.Context, flags *flag.FlagSet, _ ...interface{}) subcommands.ExitStatus {
if c.resetAll {
if err := resetAll(); err != nil {
printError(resetAllFlag, err)
return subcommands.ExitFailure
}
printSuccess("Config reset.")
return subcommands.ExitSuccess
}
result := subcommands.ExitSuccess
flags.Visit(func(f *flag.Flag) {
if f.Name == tokenSourceFlag {
if err := setTokenSources(c.tokenSources); err != nil {
printError(tokenSourceFlag, err)
result = subcommands.ExitFailure
return
}
printSuccess("Token source(s) set.")
result = subcommands.ExitSuccess
}
})
return result
}
func resetAll() error {
cfg, err := config.LoadUserConfig()
if err != nil {
return err
}
return cfg.ResetAll()
}
func setTokenSources(rawSource string) error {
cfg, err := config.LoadUserConfig()
if err != nil {
return err
}
strReader := strings.NewReader(rawSource)
sources, err := csv.NewReader(strReader).Read()
if err != nil {
return err
}
for i, src := range sources {
sources[i] = strings.TrimSpace(src)
}
return cfg.SetTokenSources(sources)
}
func printSuccess(msg string) {
fmt.Fprintf(os.Stdout, "Success: %s\n", msg)
}
func printError(flag string, err error) {
fmt.Fprintf(os.Stderr, "Failure: %s: %v\n", flag, err)
}