ReadBufConfig
diff --git a/viper.go b/viper.go
index 73bc6f3..bd41301 100644
--- a/viper.go
+++ b/viper.go
@@ -36,6 +36,8 @@
jww "github.com/spf13/jwalterweatherman"
"github.com/spf13/pflag"
crypt "github.com/xordataexchange/crypt/config"
+
+ // log "github.com/oliveagle/seelog"
)
var v *Viper
@@ -268,6 +270,8 @@
v.remoteProviders = append(v.remoteProviders, rp)
}
}
+
+ // log.Info("remoteProviders", v.remoteProviders)
return nil
}
@@ -716,6 +720,13 @@
return nil
}
+func ReadBufConfig(buf *bytes.Buffer) error { return v.ReadBufConfig(buf) }
+func (v *Viper) ReadBufConfig(buf *bytes.Buffer) error {
+ v.config = make(map[string]interface{})
+ v.marshalReader(buf, v.config)
+ return nil
+}
+
// Attempts to get configuration from a remote source
// and read it in the remote configuration registry.
func ReadRemoteConfig() error { return v.ReadRemoteConfig() }
@@ -727,6 +738,15 @@
return nil
}
+func WatchRemoteConfig() error { return v.WatchRemoteConfig() }
+func (v *Viper) WatchRemoteConfig() error {
+ err := v.watchKeyValueConfig()
+ if err != nil {
+ return err
+ }
+ return nil
+}
+
// Marshall a Reader into a map
// Should probably be an unexported function
func marshalReader(in io.Reader, c map[string]interface{}) { v.marshalReader(in, c) }
@@ -788,6 +808,61 @@
return v.kvstore, err
}
+// retrieve the first found remote configuration
+func (v *Viper) watchKeyValueConfig() error {
+ // log.Info("ahahahah==========================================")
+ // log.Info("remoteProviders", v.remoteProviders)
+
+ for _, rp := range v.remoteProviders {
+ val, err := v.watchRemoteConfig(rp)
+ if err != nil {
+ continue
+ }
+ v.kvstore = val
+ return nil
+ }
+ return RemoteConfigError("No Files Found")
+}
+
+func (v *Viper) watchRemoteConfig(provider *remoteProvider) (map[string]interface{}, error) {
+ // defer log.Flush()
+ // log.Info("ahahahah==========================================")
+ var cm crypt.ConfigManager
+ var err error
+
+ if provider.secretKeyring != "" {
+ kr, err := os.Open(provider.secretKeyring)
+ defer kr.Close()
+ if err != nil {
+ return nil, err
+ }
+ if provider.provider == "etcd" {
+ cm, err = crypt.NewEtcdConfigManager([]string{provider.endpoint}, kr)
+ } else {
+ cm, err = crypt.NewConsulConfigManager([]string{provider.endpoint}, kr)
+ }
+ } else {
+ if provider.provider == "etcd" {
+ cm, err = crypt.NewStandardEtcdConfigManager([]string{provider.endpoint})
+ } else {
+ cm, err = crypt.NewStandardConsulConfigManager([]string{provider.endpoint})
+ }
+ }
+ if err != nil {
+ return nil, err
+ }
+ resp := <-cm.Watch(provider.path, nil)
+ // b, err := cm.Watch(provider.path, nil)
+ err = resp.Error
+ if err != nil {
+ return nil, err
+ }
+
+ reader := bytes.NewReader(resp.Value)
+ v.marshalReader(reader, v.kvstore)
+ return v.kvstore, err
+}
+
// Return all keys regardless where they are set
func AllKeys() []string { return v.AllKeys() }
func (v *Viper) AllKeys() []string {