mirror of
https://github.com/spf13/viper
synced 2024-12-24 12:37:02 +00:00
1a0c4a370c
* Added method to write into TOML file. * Added functionality to export configuration based on config type. The feature supports JSON and TOML. * Added method to write into YAML file. * Fixed the issue of incorrect defer and error checking order. The error checking must be first otherwise it will cause panic. * Add WriteConfig methods * Add support for toml * Add shared write function and safe methods * Fix incorrectly modified imports * Remove extra comments * Fix spelling * Make marshal spelling consistent throughout * Add support for remaining configuration types This commit moves a significant portion of the code back to viper.go to facilitate having access to the object when reading the files. The purpose is to add properties to the viper object at read time, so that we can add the comments back to the file when writing. * Add tests for each written file type * Modify test for updated HCL specification * Modify to only support HCL write in Go 1.7 * Revert "Modify to only support HCL write in Go 1.7" This reverts commit 12b34bc4eb92cbf8ebfd56b79519f448607e3e51. * Need to truncate the file before writing * Write all settings including overrides * Use filename variable * Lint remote.go * Fix toml return count error
105 lines
2.4 KiB
Go
105 lines
2.4 KiB
Go
// 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{}
|
|
}
|