mirror of
				https://github.com/taigrr/wtf
				synced 2025-01-18 04:03:14 -08:00 
			
		
		
		
	Merge branch 'secret-store' of github.com:sam-github/wtf into sam-github-secret-store
This commit is contained in:
		
						commit
						c18bac3e27
					
				
							
								
								
									
										164
									
								
								cfg/secrets.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								cfg/secrets.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,164 @@
 | 
				
			|||||||
 | 
					package cfg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"errors"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"runtime"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/docker/docker-credential-helpers/client"
 | 
				
			||||||
 | 
						"github.com/docker/docker-credential-helpers/credentials"
 | 
				
			||||||
 | 
						"github.com/olebedev/config"
 | 
				
			||||||
 | 
						"github.com/wtfutil/wtf/logger"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Secret struct {
 | 
				
			||||||
 | 
						Service  string
 | 
				
			||||||
 | 
						Secret   string
 | 
				
			||||||
 | 
						Username string
 | 
				
			||||||
 | 
						Store    string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Configure the secret for a service.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Does not overwrite explicitly configured values, so is safe to call
 | 
				
			||||||
 | 
					// if username and secret were explicitly set in module config.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Input:
 | 
				
			||||||
 | 
					// * service: URL or identifier for service if configured by user. Not all
 | 
				
			||||||
 | 
					//   modules support or need this. Optional, defaults to serviceDefault.
 | 
				
			||||||
 | 
					// * serviceDefault: Default URL or identifier for service. Must be unique,
 | 
				
			||||||
 | 
					//   using the API URL is customary, but using the module name is reasonable.
 | 
				
			||||||
 | 
					//   Required, secrets cannot be stored unless associated with a service.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Output:
 | 
				
			||||||
 | 
					// * username: If a user/subdomain/identifier specific to the service is
 | 
				
			||||||
 | 
					//   configurable, it can be saved as a "username". Optional.
 | 
				
			||||||
 | 
					// * secret: The secret for service. Optional.
 | 
				
			||||||
 | 
					func ConfigureSecret(
 | 
				
			||||||
 | 
						globalConfig *config.Config,
 | 
				
			||||||
 | 
						service string,
 | 
				
			||||||
 | 
						serviceDefault string,
 | 
				
			||||||
 | 
						username *string,
 | 
				
			||||||
 | 
						secret *string, // unfortunate order dependency...
 | 
				
			||||||
 | 
					) {
 | 
				
			||||||
 | 
						notWanted := func(out *string) bool {
 | 
				
			||||||
 | 
							return out == nil && *out != ""
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Don't try to fetch from cred store if nothing is wanted.
 | 
				
			||||||
 | 
						if notWanted(secret) && notWanted(username) {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if service == "" {
 | 
				
			||||||
 | 
							service = serviceDefault
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if service == "" {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cred, err := FetchSecret(globalConfig, service)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							logger.Log(fmt.Sprintf("Loading secret failed: %s", err.Error()))
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if cred == nil {
 | 
				
			||||||
 | 
							// No secret store configued.
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if username != nil && *username == "" {
 | 
				
			||||||
 | 
							*username = cred.Username
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if secret != nil && *secret == "" {
 | 
				
			||||||
 | 
							*secret = cred.Secret
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Fetch secret for `service`. Service is customarily a URL, but can be any
 | 
				
			||||||
 | 
					// identifier uniquely used by wtf to identify the service, such as the name
 | 
				
			||||||
 | 
					// of the module.  nil is returned if the secretStore global property is not
 | 
				
			||||||
 | 
					// present or the secret is not found in that store.
 | 
				
			||||||
 | 
					func FetchSecret(globalConfig *config.Config, service string) (*Secret, error) {
 | 
				
			||||||
 | 
						prog := newProgram(globalConfig)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if prog == nil {
 | 
				
			||||||
 | 
							// No secret store configured.
 | 
				
			||||||
 | 
							return nil, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cred, err := client.Get(prog.runner, service)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, fmt.Errorf("get %v from %v: %w", service, prog.store, err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &Secret{
 | 
				
			||||||
 | 
							Service:  cred.ServerURL,
 | 
				
			||||||
 | 
							Secret:   cred.Secret,
 | 
				
			||||||
 | 
							Username: cred.Username,
 | 
				
			||||||
 | 
							Store:    prog.store,
 | 
				
			||||||
 | 
						}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func StoreSecret(globalConfig *config.Config, secret *Secret) error {
 | 
				
			||||||
 | 
						prog := newProgram(globalConfig)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if prog == nil {
 | 
				
			||||||
 | 
							return errors.New("Cannot store secrets: wtf.secretStore is not configured")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cred := &credentials.Credentials{
 | 
				
			||||||
 | 
							ServerURL: secret.Service,
 | 
				
			||||||
 | 
							Username:  secret.Username,
 | 
				
			||||||
 | 
							Secret:    secret.Secret,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// docker-credential requires a username, but it isn't necessary for
 | 
				
			||||||
 | 
						// all services. Use a default if a username was not set.
 | 
				
			||||||
 | 
						if cred.Username == "" {
 | 
				
			||||||
 | 
							cred.Username = "default"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := client.Store(prog.runner, cred)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return fmt.Errorf("store %v: %w", prog.store, err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type program struct {
 | 
				
			||||||
 | 
						store  string
 | 
				
			||||||
 | 
						runner client.ProgramFunc
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func newProgram(globalConfig *config.Config) *program {
 | 
				
			||||||
 | 
						secretStore := globalConfig.UString("wtf.secretStore", "(none)")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if secretStore == "(none)" {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if secretStore == "" {
 | 
				
			||||||
 | 
							switch runtime.GOOS {
 | 
				
			||||||
 | 
							case "windows":
 | 
				
			||||||
 | 
								secretStore = "winrt"
 | 
				
			||||||
 | 
							case "darwin":
 | 
				
			||||||
 | 
								secretStore = "osxkeychain"
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								secretStore = "secretservice"
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &program{
 | 
				
			||||||
 | 
							secretStore,
 | 
				
			||||||
 | 
							client.NewShellProgramFunc("docker-credential-" + secretStore),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -1,10 +1,13 @@
 | 
				
			|||||||
package flags
 | 
					package flags
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"bufio"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"path/filepath"
 | 
						"path/filepath"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/chzyer/readline"
 | 
				
			||||||
	goFlags "github.com/jessevdk/go-flags"
 | 
						goFlags "github.com/jessevdk/go-flags"
 | 
				
			||||||
	"github.com/olebedev/config"
 | 
						"github.com/olebedev/config"
 | 
				
			||||||
	"github.com/wtfutil/wtf/cfg"
 | 
						"github.com/wtfutil/wtf/cfg"
 | 
				
			||||||
@ -17,10 +20,29 @@ type Flags struct {
 | 
				
			|||||||
	Module  string `short:"m" long:"module" optional:"yes" description:"Display info about a specific module, i.e.: 'wtfutil -m=todo'"`
 | 
						Module  string `short:"m" long:"module" optional:"yes" description:"Display info about a specific module, i.e.: 'wtfutil -m=todo'"`
 | 
				
			||||||
	Profile bool   `short:"p" long:"profile" optional:"yes" description:"Profile application memory usage"`
 | 
						Profile bool   `short:"p" long:"profile" optional:"yes" description:"Profile application memory usage"`
 | 
				
			||||||
	Version bool   `short:"v" long:"version" description:"Show version info"`
 | 
						Version bool   `short:"v" long:"version" description:"Show version info"`
 | 
				
			||||||
 | 
						// Work-around go-flags misfeatures. If any sub-command is defined
 | 
				
			||||||
 | 
						// then `wtf` (no sub-commands, the common usage), is warned about.
 | 
				
			||||||
 | 
						Opt struct {
 | 
				
			||||||
 | 
							Cmd  string   `positional-arg-name:"command"`
 | 
				
			||||||
 | 
							Args []string `positional-arg-name:"args"`
 | 
				
			||||||
 | 
						} `positional-args:"yes"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	hasCustom bool
 | 
						hasCustom bool
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var EXTRA = `
 | 
				
			||||||
 | 
					Commands:
 | 
				
			||||||
 | 
					  save-secret <service> [secret [username]]
 | 
				
			||||||
 | 
					    service      Service URL or name for secret.
 | 
				
			||||||
 | 
					    secret       Secret to be saved for the service.
 | 
				
			||||||
 | 
					    username     Username to associate with the service.
 | 
				
			||||||
 | 
					  Save a secret into the secret store.  Requires wtf.secretStore
 | 
				
			||||||
 | 
					  to be configured.  See individual modules for information on what
 | 
				
			||||||
 | 
					  service, secret, and username means for their configuration. Not
 | 
				
			||||||
 | 
					  all modules use secrets, and not all secrets require a username.
 | 
				
			||||||
 | 
					  If secret or username is not provided, will prompt for them.
 | 
				
			||||||
 | 
					`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewFlags creates an instance of Flags
 | 
					// NewFlags creates an instance of Flags
 | 
				
			||||||
func NewFlags() *Flags {
 | 
					func NewFlags() *Flags {
 | 
				
			||||||
	flags := Flags{}
 | 
						flags := Flags{}
 | 
				
			||||||
@ -46,6 +68,71 @@ func (flags *Flags) RenderIf(version, date string, config *config.Config) {
 | 
				
			|||||||
		fmt.Println(fmt.Sprintf("%s (%s)", version, date))
 | 
							fmt.Println(fmt.Sprintf("%s (%s)", version, date))
 | 
				
			||||||
		os.Exit(0)
 | 
							os.Exit(0)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if flags.Opt.Cmd == "" {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch cmd := flags.Opt.Cmd; cmd {
 | 
				
			||||||
 | 
						case "save-secret":
 | 
				
			||||||
 | 
							var service, secret, username string
 | 
				
			||||||
 | 
							args := flags.Opt.Args
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if len(args) < 1 || args[0] == "" {
 | 
				
			||||||
 | 
								fmt.Fprintf(os.Stderr, "save-secret: service required, see `%s --help`\n", os.Args[0])
 | 
				
			||||||
 | 
								os.Exit(1)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							service = args[0]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if len(args) > 1 {
 | 
				
			||||||
 | 
								secret = args[1]
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								b, err := readline.Password("Secret (required): ")
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									fmt.Fprintf(os.Stderr, "Error: %v\n", err)
 | 
				
			||||||
 | 
									os.Exit(1)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								secret = string(b)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							secret = strings.TrimSpace(secret)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if secret == "" {
 | 
				
			||||||
 | 
								fmt.Fprintf(os.Stderr, "save-secret: secret required, see `%s --help`\n", os.Args[0])
 | 
				
			||||||
 | 
								os.Exit(1)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if len(args) > 2 {
 | 
				
			||||||
 | 
								username = args[2]
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								fmt.Printf("Username (optional): ")
 | 
				
			||||||
 | 
								reader := bufio.NewReader(os.Stdin)
 | 
				
			||||||
 | 
								var err error
 | 
				
			||||||
 | 
								username, err = reader.ReadString('\n')
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									fmt.Fprintf(os.Stderr, "Error: %v\n", err)
 | 
				
			||||||
 | 
									os.Exit(1)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							username = strings.TrimSpace(username)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							err := cfg.StoreSecret(config, &cfg.Secret{
 | 
				
			||||||
 | 
								Service:  service,
 | 
				
			||||||
 | 
								Secret:   secret,
 | 
				
			||||||
 | 
								Username: username,
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								fmt.Fprintf(os.Stderr, "Saving secret for service %q: %s\n", service, err.Error())
 | 
				
			||||||
 | 
								os.Exit(1)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							fmt.Printf("Saved secret for service %q (username %q)\n", service, username)
 | 
				
			||||||
 | 
							os.Exit(0)
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							fmt.Fprintf(os.Stderr, "Command `%s` is not supported, try `%s --help`\n", cmd, os.Args[0])
 | 
				
			||||||
 | 
							os.Exit(1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// HasCustomConfig returns TRUE if a config path was passed in, FALSE if one was not
 | 
					// HasCustomConfig returns TRUE if a config path was passed in, FALSE if one was not
 | 
				
			||||||
@ -68,6 +155,7 @@ func (flags *Flags) Parse() {
 | 
				
			|||||||
	parser := goFlags.NewParser(flags, goFlags.Default)
 | 
						parser := goFlags.NewParser(flags, goFlags.Default)
 | 
				
			||||||
	if _, err := parser.Parse(); err != nil {
 | 
						if _, err := parser.Parse(); err != nil {
 | 
				
			||||||
		if flagsErr, ok := err.(*goFlags.Error); ok && flagsErr.Type == goFlags.ErrHelp {
 | 
							if flagsErr, ok := err.(*goFlags.Error); ok && flagsErr.Type == goFlags.ErrHelp {
 | 
				
			||||||
 | 
								fmt.Println(EXTRA)
 | 
				
			||||||
			os.Exit(0)
 | 
								os.Exit(0)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							@ -15,9 +15,11 @@ require (
 | 
				
			|||||||
	github.com/andygrunwald/go-gerrit v0.0.0-20190825170856-5959a9bf9ff8
 | 
						github.com/andygrunwald/go-gerrit v0.0.0-20190825170856-5959a9bf9ff8
 | 
				
			||||||
	github.com/briandowns/openweathermap v0.0.0-20180804155945-5f41b7c9d92d
 | 
						github.com/briandowns/openweathermap v0.0.0-20180804155945-5f41b7c9d92d
 | 
				
			||||||
	github.com/cenkalti/backoff v2.2.1+incompatible // indirect
 | 
						github.com/cenkalti/backoff v2.2.1+incompatible // indirect
 | 
				
			||||||
 | 
						github.com/chzyer/readline v0.0.0-20171208011716-f6d7a1f6fbf3
 | 
				
			||||||
	github.com/digitalocean/godo v1.35.1
 | 
						github.com/digitalocean/godo v1.35.1
 | 
				
			||||||
	github.com/docker/distribution v2.7.1+incompatible // indirect
 | 
						github.com/docker/distribution v2.7.1+incompatible // indirect
 | 
				
			||||||
	github.com/docker/docker v1.13.1
 | 
						github.com/docker/docker v1.13.1
 | 
				
			||||||
 | 
						github.com/docker/docker-credential-helpers v0.6.3
 | 
				
			||||||
	github.com/docker/go-connections v0.4.0 // indirect
 | 
						github.com/docker/go-connections v0.4.0 // indirect
 | 
				
			||||||
	github.com/docker/go-units v0.4.0 // indirect
 | 
						github.com/docker/go-units v0.4.0 // indirect
 | 
				
			||||||
	github.com/dustin/go-humanize v1.0.0
 | 
						github.com/dustin/go-humanize v1.0.0
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										3
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								go.sum
									
									
									
									
									
								
							@ -101,6 +101,7 @@ github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QH
 | 
				
			|||||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
					github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
				
			||||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 | 
					github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 | 
				
			||||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 | 
					github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 | 
				
			||||||
 | 
					github.com/chzyer/readline v0.0.0-20171208011716-f6d7a1f6fbf3 h1:T7Bw4H6z3WAZ2khw+gfKdYmbKHyy5xiHtk9IHfZqm7g=
 | 
				
			||||||
github.com/chzyer/readline v0.0.0-20171208011716-f6d7a1f6fbf3/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
 | 
					github.com/chzyer/readline v0.0.0-20171208011716-f6d7a1f6fbf3/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
 | 
				
			||||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
 | 
					github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
 | 
				
			||||||
github.com/circonus-labs/circonus-gometrics v2.2.4+incompatible h1:+ZwGzyJGsOwSxIEDDOXzPagR167tQak/1P5wBwH+/dM=
 | 
					github.com/circonus-labs/circonus-gometrics v2.2.4+incompatible h1:+ZwGzyJGsOwSxIEDDOXzPagR167tQak/1P5wBwH+/dM=
 | 
				
			||||||
@ -141,6 +142,8 @@ github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BU
 | 
				
			|||||||
github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
 | 
					github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
 | 
				
			||||||
github.com/docker/docker v1.13.1 h1:IkZjBSIc8hBjLpqeAbeE5mca5mNgeatLHBy3GO78BWo=
 | 
					github.com/docker/docker v1.13.1 h1:IkZjBSIc8hBjLpqeAbeE5mca5mNgeatLHBy3GO78BWo=
 | 
				
			||||||
github.com/docker/docker v1.13.1/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 | 
					github.com/docker/docker v1.13.1/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
 | 
				
			||||||
 | 
					github.com/docker/docker-credential-helpers v0.6.3 h1:zI2p9+1NQYdnG6sMU26EX4aVGlqbInSQxQXLvzJ4RPQ=
 | 
				
			||||||
 | 
					github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y=
 | 
				
			||||||
github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
 | 
					github.com/docker/go-connections v0.3.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
 | 
				
			||||||
github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
 | 
					github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
 | 
				
			||||||
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
 | 
					github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
 | 
				
			||||||
 | 
				
			|||||||
@ -35,5 +35,13 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		projectName: ymlConfig.UString("projectName", os.Getenv("WTF_AZURE_DEVOPS_PROJECT_NAME")),
 | 
							projectName: ymlConfig.UString("projectName", os.Getenv("WTF_AZURE_DEVOPS_PROJECT_NAME")),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							settings.orgURL,
 | 
				
			||||||
 | 
							"",
 | 
				
			||||||
 | 
							&settings.projectName,
 | 
				
			||||||
 | 
							&settings.apiToken,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &settings
 | 
						return &settings
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -27,5 +27,13 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		subdomain: ymlConfig.UString("subdomain", os.Getenv("WTF_BAMBOO_HR_SUBDOMAIN")),
 | 
							subdomain: ymlConfig.UString("subdomain", os.Getenv("WTF_BAMBOO_HR_SUBDOMAIN")),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							"",
 | 
				
			||||||
 | 
							name,
 | 
				
			||||||
 | 
							&settings.subdomain,
 | 
				
			||||||
 | 
							&settings.apiKey,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &settings
 | 
						return &settings
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,10 +1,11 @@
 | 
				
			|||||||
package buildkite
 | 
					package buildkite
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/olebedev/config"
 | 
						"github.com/olebedev/config"
 | 
				
			||||||
	"github.com/wtfutil/wtf/cfg"
 | 
						"github.com/wtfutil/wtf/cfg"
 | 
				
			||||||
	"github.com/wtfutil/wtf/utils"
 | 
						"github.com/wtfutil/wtf/utils"
 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@ -35,6 +36,14 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		pipelines: buildPipelineSettings(ymlConfig),
 | 
							pipelines: buildPipelineSettings(ymlConfig),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							"",
 | 
				
			||||||
 | 
							name,
 | 
				
			||||||
 | 
							&settings.orgSlug,
 | 
				
			||||||
 | 
							&settings.apiKey,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &settings
 | 
						return &settings
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -26,5 +26,13 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		apiKey: ymlConfig.UString("apiKey", ymlConfig.UString("apikey", os.Getenv("WTF_CIRCLE_API_KEY"))),
 | 
							apiKey: ymlConfig.UString("apiKey", ymlConfig.UString("apikey", os.Getenv("WTF_CIRCLE_API_KEY"))),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							"",
 | 
				
			||||||
 | 
							name,
 | 
				
			||||||
 | 
							nil,
 | 
				
			||||||
 | 
							&settings.apiKey,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &settings
 | 
						return &settings
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -30,5 +30,21 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		tags:           ymlConfig.UList("monitors.tags"),
 | 
							tags:           ymlConfig.UList("monitors.tags"),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							"",
 | 
				
			||||||
 | 
							"datadog-api",
 | 
				
			||||||
 | 
							nil,
 | 
				
			||||||
 | 
							&settings.apiKey,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							"",
 | 
				
			||||||
 | 
							"datadog-app",
 | 
				
			||||||
 | 
							nil,
 | 
				
			||||||
 | 
							&settings.applicationKey,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &settings
 | 
						return &settings
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -31,5 +31,13 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		dateFormat: ymlConfig.UString("dateFormat", wtf.DateFormat),
 | 
							dateFormat: ymlConfig.UString("dateFormat", wtf.DateFormat),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							"",
 | 
				
			||||||
 | 
							name,
 | 
				
			||||||
 | 
							nil,
 | 
				
			||||||
 | 
							&settings.apiKey,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &settings
 | 
						return &settings
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -33,5 +33,14 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		matchesTo:     ymlConfig.UInt("matchesTo", 5),
 | 
							matchesTo:     ymlConfig.UInt("matchesTo", 5),
 | 
				
			||||||
		standingCount: ymlConfig.UInt("standingCount", 5),
 | 
							standingCount: ymlConfig.UInt("standingCount", 5),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							"",
 | 
				
			||||||
 | 
							name,
 | 
				
			||||||
 | 
							nil,
 | 
				
			||||||
 | 
							&settings.apiKey,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &settings
 | 
						return &settings
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -41,6 +41,14 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		verifyServerCertificate: ymlConfig.UBool("verifyServerCertificate", true),
 | 
							verifyServerCertificate: ymlConfig.UBool("verifyServerCertificate", true),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							settings.domain,
 | 
				
			||||||
 | 
							name,
 | 
				
			||||||
 | 
							nil, // Seems like it should be mandatory, but its optional above.
 | 
				
			||||||
 | 
							&settings.password,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	settings.colors.rows.even = ymlConfig.UString("colors.rows.even", "white")
 | 
						settings.colors.rows.even = ymlConfig.UString("colors.rows.even", "white")
 | 
				
			||||||
	settings.colors.rows.odd = ymlConfig.UString("colors.rows.odd", "blue")
 | 
						settings.colors.rows.odd = ymlConfig.UString("colors.rows.odd", "blue")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -17,6 +17,7 @@ type Settings struct {
 | 
				
			|||||||
	common *cfg.Common
 | 
						common *cfg.Common
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	apiKey        string        `help:"Your GitHub API token."`
 | 
						apiKey        string        `help:"Your GitHub API token."`
 | 
				
			||||||
 | 
						apiSecret     string        `help:"Secret store for your GitHub API token."`
 | 
				
			||||||
	baseURL       string        `help:"Your GitHub Enterprise API URL." optional:"true"`
 | 
						baseURL       string        `help:"Your GitHub Enterprise API URL." optional:"true"`
 | 
				
			||||||
	customQueries []customQuery `help:"Custom queries allow you to filter pull requests and issues however you like. Give the query a title and a filter. Filters can be copied directly from GitHub’s UI." optional:"true"`
 | 
						customQueries []customQuery `help:"Custom queries allow you to filter pull requests and issues however you like. Give the query a title and a filter. Filters can be copied directly from GitHub’s UI." optional:"true"`
 | 
				
			||||||
	enableStatus  bool          `help:"Display pull request mergeability status (‘dirty’, ‘clean’, ‘unstable’, ‘blocked’)." optional:"true"`
 | 
						enableStatus  bool          `help:"Display pull request mergeability status (‘dirty’, ‘clean’, ‘unstable’, ‘blocked’)." optional:"true"`
 | 
				
			||||||
@ -45,6 +46,14 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
	settings.repositories = cfg.ParseAsMapOrList(ymlConfig, "repositories")
 | 
						settings.repositories = cfg.ParseAsMapOrList(ymlConfig, "repositories")
 | 
				
			||||||
	settings.customQueries = parseCustomQueries(ymlConfig)
 | 
						settings.customQueries = parseCustomQueries(ymlConfig)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							settings.baseURL,
 | 
				
			||||||
 | 
							name,
 | 
				
			||||||
 | 
							&settings.username,
 | 
				
			||||||
 | 
							&settings.apiKey,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &settings
 | 
						return &settings
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -32,6 +32,14 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		username: ymlConfig.UString("username"),
 | 
							username: ymlConfig.UString("username"),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							settings.domain,
 | 
				
			||||||
 | 
							name,
 | 
				
			||||||
 | 
							&settings.username,
 | 
				
			||||||
 | 
							&settings.apiKey,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	settings.projects = cfg.ParseAsMapOrList(ymlConfig, "projects")
 | 
						settings.projects = cfg.ParseAsMapOrList(ymlConfig, "projects")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &settings
 | 
						return &settings
 | 
				
			||||||
 | 
				
			|||||||
@ -32,5 +32,13 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		showProject:   ymlConfig.UBool("showProject", true),
 | 
							showProject:   ymlConfig.UBool("showProject", true),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							settings.domain,
 | 
				
			||||||
 | 
							name,
 | 
				
			||||||
 | 
							nil,
 | 
				
			||||||
 | 
							&settings.apiKey,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &settings
 | 
						return &settings
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -30,5 +30,13 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		roomURI:          ymlConfig.UString("roomUri", "wtfutil/Lobby"),
 | 
							roomURI:          ymlConfig.UString("roomUri", "wtfutil/Lobby"),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							"https://api.gitter.im",
 | 
				
			||||||
 | 
							"",
 | 
				
			||||||
 | 
							&settings.apiToken,
 | 
				
			||||||
 | 
							nil,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &settings
 | 
						return &settings
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -40,6 +40,13 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		since:    ymlConfig.UString("since", ""),
 | 
							since:    ymlConfig.UString("since", ""),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							"https://haveibeenpwned.com/api",
 | 
				
			||||||
 | 
							"",
 | 
				
			||||||
 | 
							&settings.apiKey,
 | 
				
			||||||
 | 
							nil,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
	settings.colors.ok = ymlConfig.UString("colors.ok", "white")
 | 
						settings.colors.ok = ymlConfig.UString("colors.ok", "white")
 | 
				
			||||||
	settings.colors.pwned = ymlConfig.UString("colors.pwned", "red")
 | 
						settings.colors.pwned = ymlConfig.UString("colors.pwned", "red")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -36,5 +36,13 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		verifyServerCertificate: ymlConfig.UBool("verifyServerCertificate", true),
 | 
							verifyServerCertificate: ymlConfig.UBool("verifyServerCertificate", true),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							settings.url,
 | 
				
			||||||
 | 
							"",
 | 
				
			||||||
 | 
							&settings.user,
 | 
				
			||||||
 | 
							&settings.apiKey,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &settings
 | 
						return &settings
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -45,6 +45,14 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		verifyServerCertificate: ymlConfig.UBool("verifyServerCertificate", true),
 | 
							verifyServerCertificate: ymlConfig.UBool("verifyServerCertificate", true),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							settings.domain,
 | 
				
			||||||
 | 
							"",
 | 
				
			||||||
 | 
							&settings.username,
 | 
				
			||||||
 | 
							&settings.apiKey,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	settings.colors.rows.even = ymlConfig.UString("colors.even", "lightblue")
 | 
						settings.colors.rows.even = ymlConfig.UString("colors.even", "lightblue")
 | 
				
			||||||
	settings.colors.rows.odd = ymlConfig.UString("colors.odd", "white")
 | 
						settings.colors.rows.odd = ymlConfig.UString("colors.odd", "white")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -30,5 +30,13 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		applicationIDs: ymlConfig.UList("applicationIDs"),
 | 
							applicationIDs: ymlConfig.UList("applicationIDs"),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							"newrelic.com",
 | 
				
			||||||
 | 
							"",
 | 
				
			||||||
 | 
							nil,
 | 
				
			||||||
 | 
							&settings.apiKey,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &settings
 | 
						return &settings
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -33,6 +33,14 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		scheduleIdentifierType: ymlConfig.UString("scheduleIdentifierType", "id"),
 | 
							scheduleIdentifierType: ymlConfig.UString("scheduleIdentifierType", "id"),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							"https://opsgenie.com",
 | 
				
			||||||
 | 
							"",
 | 
				
			||||||
 | 
							nil,
 | 
				
			||||||
 | 
							&settings.apiKey,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	settings.schedule = settings.arrayifySchedules(ymlConfig, globalConfig)
 | 
						settings.schedule = settings.arrayifySchedules(ymlConfig, globalConfig)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &settings
 | 
						return &settings
 | 
				
			||||||
 | 
				
			|||||||
@ -37,5 +37,13 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		showSchedules:    ymlConfig.UBool("showSchedules", true),
 | 
							showSchedules:    ymlConfig.UBool("showSchedules", true),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							"https://pagerduty.com",
 | 
				
			||||||
 | 
							"",
 | 
				
			||||||
 | 
							&settings.myName,
 | 
				
			||||||
 | 
							&settings.apiKey,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &settings
 | 
						return &settings
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -34,5 +34,13 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		maxDomainWidth: ymlConfig.UInt("maxDomainWidth", 20),
 | 
							maxDomainWidth: ymlConfig.UInt("maxDomainWidth", 20),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							settings.apiUrl,
 | 
				
			||||||
 | 
							"",
 | 
				
			||||||
 | 
							nil,
 | 
				
			||||||
 | 
							&settings.token,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &settings
 | 
						return &settings
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -23,5 +23,13 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		consumerKey: ymlConfig.UString("consumerKey"),
 | 
							consumerKey: ymlConfig.UString("consumerKey"),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							"https://pocket.com",
 | 
				
			||||||
 | 
							"",
 | 
				
			||||||
 | 
							nil,
 | 
				
			||||||
 | 
							&settings.consumerKey,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &settings
 | 
						return &settings
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -34,5 +34,13 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		projectOwner:   ymlConfig.UString("projectOwner"),
 | 
							projectOwner:   ymlConfig.UString("projectOwner"),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							"https://rollbar.com",
 | 
				
			||||||
 | 
							"",
 | 
				
			||||||
 | 
							nil,
 | 
				
			||||||
 | 
							&settings.accessToken,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &settings
 | 
						return &settings
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -30,5 +30,13 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		secretKey:    ymlConfig.UString("secretKey", os.Getenv("SPOTIFY_SECRET")),
 | 
							secretKey:    ymlConfig.UString("secretKey", os.Getenv("SPOTIFY_SECRET")),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							"https://spotify.com",
 | 
				
			||||||
 | 
							"",
 | 
				
			||||||
 | 
							&settings.clientID,
 | 
				
			||||||
 | 
							&settings.secretKey,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &settings
 | 
						return &settings
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -30,5 +30,13 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		projects: utils.IntsToUints(utils.ToInts(ymlConfig.UList("projects"))),
 | 
							projects: utils.IntsToUints(utils.ToInts(ymlConfig.UList("projects"))),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							"https://todoist.com",
 | 
				
			||||||
 | 
							"",
 | 
				
			||||||
 | 
							nil,
 | 
				
			||||||
 | 
							&settings.apiKey,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &settings
 | 
						return &settings
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -35,5 +35,13 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		sort_by: ymlConfig.UString("sort_by", "id:desc"),
 | 
							sort_by: ymlConfig.UString("sort_by", "id:desc"),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							"https://travis.com",
 | 
				
			||||||
 | 
							"",
 | 
				
			||||||
 | 
							&settings.baseURL,
 | 
				
			||||||
 | 
							&settings.apiKey,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &settings
 | 
						return &settings
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -32,6 +32,14 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		username:    ymlConfig.UString("username"),
 | 
							username:    ymlConfig.UString("username"),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							"https://trello.com",
 | 
				
			||||||
 | 
							"",
 | 
				
			||||||
 | 
							&settings.accessToken,
 | 
				
			||||||
 | 
							&settings.apiKey,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	settings.list = buildLists(ymlConfig, globalConfig)
 | 
						settings.list = buildLists(ymlConfig, globalConfig)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &settings
 | 
						return &settings
 | 
				
			||||||
 | 
				
			|||||||
@ -29,5 +29,13 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		team:   ymlConfig.UString("team"),
 | 
							team:   ymlConfig.UString("team"),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							"https://victorops.com",
 | 
				
			||||||
 | 
							"",
 | 
				
			||||||
 | 
							&settings.apiID,
 | 
				
			||||||
 | 
							&settings.apiKey,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &settings
 | 
						return &settings
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -31,5 +31,13 @@ func NewSettingsFromYAML(name string, ymlConfig *config.Config, globalConfig *co
 | 
				
			|||||||
		username:  ymlConfig.UString("username"),
 | 
							username:  ymlConfig.UString("username"),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cfg.ConfigureSecret(
 | 
				
			||||||
 | 
							globalConfig,
 | 
				
			||||||
 | 
							"https://zendesk.com",
 | 
				
			||||||
 | 
							"",
 | 
				
			||||||
 | 
							&settings.subdomain,
 | 
				
			||||||
 | 
							&settings.apiKey,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return &settings
 | 
						return &settings
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user