1 // Copyright © 2015 Steve Francia <spf@spf13.com>.
3 // Use of this source code is governed by an MIT-style
4 // license that can be found in the LICENSE file.
6 // Package remote integrates the remote features of Viper.
11 "github.com/spf13/viper"
12 crypt "github.com/xordataexchange/crypt/config"
17 type remoteConfigProvider struct{}
19 func (rc remoteConfigProvider) Get(rp viper.RemoteProvider) (io.Reader, error) {
20 cm, err := getConfigManager(rp)
24 b, err := cm.Get(rp.Path())
28 return bytes.NewReader(b), nil
31 func (rc remoteConfigProvider) Watch(rp viper.RemoteProvider) (io.Reader, error) {
32 cm, err := getConfigManager(rp)
36 resp, err := cm.Get(rp.Path())
41 return bytes.NewReader(resp), nil
44 func (rc remoteConfigProvider) WatchChannel(rp viper.RemoteProvider) (<-chan *viper.RemoteResponse, chan bool) {
45 cm, err := getConfigManager(rp)
49 quit := make(chan bool)
50 quitwc := make(chan bool)
51 viperResponsCh := make(chan *viper.RemoteResponse)
52 cryptoResponseCh := cm.Watch(rp.Path(), quit)
53 // need this function to convert the Channel response form crypt.Response to viper.Response
54 go func(cr <-chan *crypt.Response, vr chan<- *viper.RemoteResponse, quitwc <-chan bool, quit chan<- bool) {
61 vr <- &viper.RemoteResponse{
69 }(cryptoResponseCh, viperResponsCh, quitwc, quit)
71 return viperResponsCh, quitwc
74 func getConfigManager(rp viper.RemoteProvider) (crypt.ConfigManager, error) {
75 var cm crypt.ConfigManager
78 if rp.SecretKeyring() != "" {
79 kr, err := os.Open(rp.SecretKeyring())
84 if rp.Provider() == "etcd" {
85 cm, err = crypt.NewEtcdConfigManager([]string{rp.Endpoint()}, kr)
87 cm, err = crypt.NewConsulConfigManager([]string{rp.Endpoint()}, kr)
90 if rp.Provider() == "etcd" {
91 cm, err = crypt.NewStandardEtcdConfigManager([]string{rp.Endpoint()})
93 cm, err = crypt.NewStandardConsulConfigManager([]string{rp.Endpoint()})
103 viper.RemoteConfig = &remoteConfigProvider{}