diff options
author | Harrison Healey <harrisonmhealey@gmail.com> | 2018-06-21 10:30:20 -0400 |
---|---|---|
committer | Jesús Espino <jespinog@gmail.com> | 2018-06-21 16:30:20 +0200 |
commit | 07c785e294e70494ae6016d59749a71af3f74920 (patch) | |
tree | 9b5e8deb15a182aa6a890261bb77b2e6faebbaea /vendor/github.com/mattermost/viper/remote/remote.go | |
parent | 1f65f0e3d6d142b859f8dda52da99cb3d4a01c9c (diff) | |
download | chat-07c785e294e70494ae6016d59749a71af3f74920.tar.gz chat-07c785e294e70494ae6016d59749a71af3f74920.tar.bz2 chat-07c785e294e70494ae6016d59749a71af3f74920.zip |
MM-10730 Added support for empty environment variables to viper (#8973)
Diffstat (limited to 'vendor/github.com/mattermost/viper/remote/remote.go')
-rw-r--r-- | vendor/github.com/mattermost/viper/remote/remote.go | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/vendor/github.com/mattermost/viper/remote/remote.go b/vendor/github.com/mattermost/viper/remote/remote.go new file mode 100644 index 000000000..810d0702e --- /dev/null +++ b/vendor/github.com/mattermost/viper/remote/remote.go @@ -0,0 +1,105 @@ +// Copyright © 2015 Steve Francia <spf@spf13.com>. +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +// Package remote integrates the remote features of Viper. +package remote + +import ( + "bytes" + "io" + "os" + + "github.com/spf13/viper" + crypt "github.com/xordataexchange/crypt/config" +) + +type remoteConfigProvider struct{} + +func (rc remoteConfigProvider) Get(rp viper.RemoteProvider) (io.Reader, error) { + cm, err := getConfigManager(rp) + if err != nil { + return nil, err + } + b, err := cm.Get(rp.Path()) + if err != nil { + return nil, err + } + return bytes.NewReader(b), nil +} + +func (rc remoteConfigProvider) Watch(rp viper.RemoteProvider) (io.Reader, error) { + cm, err := getConfigManager(rp) + if err != nil { + return nil, err + } + resp, err := cm.Get(rp.Path()) + if err != nil { + return nil, err + } + + return bytes.NewReader(resp), nil +} + +func (rc remoteConfigProvider) WatchChannel(rp viper.RemoteProvider) (<-chan *viper.RemoteResponse, chan bool) { + cm, err := getConfigManager(rp) + if err != nil { + return nil, nil + } + quit := make(chan bool) + quitwc := make(chan bool) + viperResponsCh := make(chan *viper.RemoteResponse) + cryptoResponseCh := cm.Watch(rp.Path(), quit) + // need this function to convert the Channel response form crypt.Response to viper.Response + go func(cr <-chan *crypt.Response, vr chan<- *viper.RemoteResponse, quitwc <-chan bool, quit chan<- bool) { + for { + select { + case <-quitwc: + quit <- true + return + case resp := <-cr: + vr <- &viper.RemoteResponse{ + Error: resp.Error, + Value: resp.Value, + } + + } + + } + }(cryptoResponseCh, viperResponsCh, quitwc, quit) + + return viperResponsCh, quitwc +} + +func getConfigManager(rp viper.RemoteProvider) (crypt.ConfigManager, error) { + var cm crypt.ConfigManager + var err error + + if rp.SecretKeyring() != "" { + kr, err := os.Open(rp.SecretKeyring()) + defer kr.Close() + if err != nil { + return nil, err + } + if rp.Provider() == "etcd" { + cm, err = crypt.NewEtcdConfigManager([]string{rp.Endpoint()}, kr) + } else { + cm, err = crypt.NewConsulConfigManager([]string{rp.Endpoint()}, kr) + } + } else { + if rp.Provider() == "etcd" { + cm, err = crypt.NewStandardEtcdConfigManager([]string{rp.Endpoint()}) + } else { + cm, err = crypt.NewStandardConsulConfigManager([]string{rp.Endpoint()}) + } + } + if err != nil { + return nil, err + } + return cm, nil +} + +func init() { + viper.RemoteConfig = &remoteConfigProvider{} +} |