github.com/tomarron/viper@v0.0.0-20160605220307-c1ccc378a054/remote/remote.go (about) 1 // Copyright © 2015 Steve Francia <spf@spf13.com>. 2 // 3 // Use of this source code is governed by an MIT-style 4 // license that can be found in the LICENSE file. 5 6 // Package remote integrates the remote features of Viper. 7 package remote 8 9 import ( 10 "bytes" 11 "github.com/spf13/viper" 12 crypt "github.com/xordataexchange/crypt/config" 13 "io" 14 "os" 15 ) 16 17 type remoteConfigProvider struct{} 18 19 func (rc remoteConfigProvider) Get(rp viper.RemoteProvider) (io.Reader, error) { 20 cm, err := getConfigManager(rp) 21 if err != nil { 22 return nil, err 23 } 24 b, err := cm.Get(rp.Path()) 25 if err != nil { 26 return nil, err 27 } 28 return bytes.NewReader(b), nil 29 } 30 31 func (rc remoteConfigProvider) Watch(rp viper.RemoteProvider) (io.Reader, error) { 32 cm, err := getConfigManager(rp) 33 if err != nil { 34 return nil, err 35 } 36 resp := <-cm.Watch(rp.Path(), nil) 37 err = resp.Error 38 if err != nil { 39 return nil, err 40 } 41 42 return bytes.NewReader(resp.Value), nil 43 } 44 45 func getConfigManager(rp viper.RemoteProvider) (crypt.ConfigManager, error) { 46 47 var cm crypt.ConfigManager 48 var err error 49 50 if rp.SecretKeyring() != "" { 51 kr, err := os.Open(rp.SecretKeyring()) 52 defer kr.Close() 53 if err != nil { 54 return nil, err 55 } 56 if rp.Provider() == "etcd" { 57 cm, err = crypt.NewEtcdConfigManager([]string{rp.Endpoint()}, kr) 58 } else { 59 cm, err = crypt.NewConsulConfigManager([]string{rp.Endpoint()}, kr) 60 } 61 } else { 62 if rp.Provider() == "etcd" { 63 cm, err = crypt.NewStandardEtcdConfigManager([]string{rp.Endpoint()}) 64 } else { 65 cm, err = crypt.NewStandardConsulConfigManager([]string{rp.Endpoint()}) 66 } 67 } 68 if err != nil { 69 return nil, err 70 } 71 return cm, nil 72 73 } 74 75 func init() { 76 viper.RemoteConfig = &remoteConfigProvider{} 77 }