博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
config.go
阅读量:5241 次
发布时间:2019-06-14

本文共 2505 字,大约阅读时间需要 8 分钟。

 
package clientv3
 
import (
    "crypto/tls"
    "crypto/x509"
    "io/ioutil"
    "time"
 
    "github.com/coreos/etcd/pkg/tlsutil"
    "github.com/ghodss/yaml"
)
 
type Config struct {
    // Endpoints is a list of URLs
    Endpoints []string
 
    // AutoSyncInterval is the interval to update endpoints with its latest members.
    // 0 disables auto-sync. By default auto-sync is disabled.
    AutoSyncInterval time.Duration
 
    // DialTimeout is the timeout for failing to establish a connection.
    DialTimeout time.Duration
 
    // TLS holds the client secure credentials, if any.
    TLS *tls.Config
 
    // Username is a username for authentication
    Username string
 
    // Password is a password for authentication
    Password string
}
 
type yamlConfig struct {
    Endpoints             []string      `json:"endpoints"`
    AutoSyncInterval      time.Duration `json:"auto-sync-interval"`
    DialTimeout           time.Duration `json:"dial-timeout"`
    InsecureTransport     bool          `json:"insecure-transport"`
    InsecureSkipTLSVerify bool          `json:"insecure-skip-tls-verify"`
    Certfile              string        `json:"cert-file"`
    Keyfile               string        `json:"key-file"`
    CAfile                string        `json:"ca-file"`
}
 
func configFromFile(fpath string) (*Config, error) {
    b, err := ioutil.ReadFile(fpath)
    if err != nil {
        return nil, err
    }
 
    yc := &yamlConfig{}
 
    err = yaml.Unmarshal(b, yc)
    if err != nil {
        return nil, err
    }
 
    cfg := &Config{
        Endpoints:        yc.Endpoints,
        AutoSyncInterval: yc.AutoSyncInterval,
        DialTimeout:      yc.DialTimeout,
    }
 
    if yc.InsecureTransport {
        cfg.TLS = nil
        return cfg, nil
    }
 
    var (
        cert *tls.Certificate
        cp   *x509.CertPool
    )
 
    if yc.Certfile != "" && yc.Keyfile != "" {
        cert, err = tlsutil.NewCert(yc.Certfile, yc.Keyfile, nil)
        if err != nil {
            return nil, err
        }
    }
 
    if yc.CAfile != "" {
        cp, err = tlsutil.NewCertPool([]string{yc.CAfile})
        if err != nil {
            return nil, err
        }
    }
 
    tlscfg := &tls.Config{
        MinVersion:         tls.VersionTLS10,
        InsecureSkipVerify: yc.InsecureSkipTLSVerify,
        RootCAs:            cp,
    }
    if cert != nil {
        tlscfg.Certificates = []tls.Certificate{*cert}
    }
    cfg.TLS = tlscfg
 
    return cfg, nil
}
 

转载于:https://www.cnblogs.com/zhangboyu/p/7452674.html

你可能感兴趣的文章
手机端自动跳转
查看>>
react中进入某个详情页URL路劲参数Id获取问题
查看>>
首届.NET Core开源峰会
查看>>
ViewPager的onPageChangeListener里面的一些方法参数:
查看>>
python pdf转word
查看>>
poj 2182 Lost Cows
查看>>
OpenFlow 交换机与控制器交互步骤
查看>>
java-内存模型
查看>>
文本相似度比较(网页版)
查看>>
Jenkins关闭、重启,Jenkins服务的启动、停止方法。
查看>>
2019.01.13 bzoj4538: [Hnoi2016]网络(树链剖分)
查看>>
codeforces 315 308
查看>>
BZOJ3998 [TJOI2015]弦论 【后缀自动机】
查看>>
CF E2 - Array and Segments (Hard version) (线段树)
查看>>
svn 架设
查看>>
k8s部署rocketmq 双主
查看>>
Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
查看>>
SIGPIPE并产生一个信号处理
查看>>
CentOS
查看>>
Explicit keyword
查看>>