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  }