aboutsummaryrefslogtreecommitdiff
path: root/core/setup/etcd.go
diff options
context:
space:
mode:
Diffstat (limited to 'core/setup/etcd.go')
-rw-r--r--core/setup/etcd.go197
1 files changed, 0 insertions, 197 deletions
diff --git a/core/setup/etcd.go b/core/setup/etcd.go
deleted file mode 100644
index b90297abd..000000000
--- a/core/setup/etcd.go
+++ /dev/null
@@ -1,197 +0,0 @@
-package setup
-
-import (
- "crypto/tls"
- "crypto/x509"
- "io/ioutil"
- "net"
- "net/http"
- "time"
-
- "github.com/miekg/coredns/middleware"
- "github.com/miekg/coredns/middleware/etcd"
- "github.com/miekg/coredns/middleware/proxy"
- "github.com/miekg/coredns/singleflight"
-
- etcdc "github.com/coreos/etcd/client"
- "golang.org/x/net/context"
-)
-
-const defaultEndpoint = "http://localhost:2379"
-
-// Etcd sets up the etcd middleware.
-func Etcd(c *Controller) (middleware.Middleware, error) {
- etcd, stubzones, err := etcdParse(c)
- if err != nil {
- return nil, err
- }
- if stubzones {
- c.Startup = append(c.Startup, func() error {
- etcd.UpdateStubZones()
- return nil
- })
- }
-
- return func(next middleware.Handler) middleware.Handler {
- etcd.Next = next
- return etcd
- }, nil
-}
-
-func etcdParse(c *Controller) (*etcd.Etcd, bool, error) {
- stub := make(map[string]proxy.Proxy)
- etc := etcd.Etcd{
- Proxy: proxy.New([]string{"8.8.8.8:53", "8.8.4.4:53"}),
- PathPrefix: "skydns",
- Ctx: context.Background(),
- Inflight: &singleflight.Group{},
- Stubmap: &stub,
- }
- var (
- client etcdc.KeysAPI
- tlsCertFile = ""
- tlsKeyFile = ""
- tlsCAcertFile = ""
- endpoints = []string{defaultEndpoint}
- stubzones = false
- )
- for c.Next() {
- if c.Val() == "etcd" {
- etc.Client = client
- etc.Zones = c.RemainingArgs()
- if len(etc.Zones) == 0 {
- etc.Zones = c.ServerBlockHosts
- }
- middleware.Zones(etc.Zones).FullyQualify()
- if c.NextBlock() {
- // TODO(miek): 2 switches?
- switch c.Val() {
- case "stubzones":
- stubzones = true
- case "debug":
- etc.Debug = true
- case "path":
- if !c.NextArg() {
- return &etcd.Etcd{}, false, c.ArgErr()
- }
- etc.PathPrefix = c.Val()
- case "endpoint":
- args := c.RemainingArgs()
- if len(args) == 0 {
- return &etcd.Etcd{}, false, c.ArgErr()
- }
- endpoints = args
- case "upstream":
- args := c.RemainingArgs()
- if len(args) == 0 {
- return &etcd.Etcd{}, false, c.ArgErr()
- }
- for i := 0; i < len(args); i++ {
- h, p, e := net.SplitHostPort(args[i])
- if e != nil && p == "" {
- args[i] = h + ":53"
- }
- }
- endpoints = args
- etc.Proxy = proxy.New(args)
- case "tls": // cert key cacertfile
- args := c.RemainingArgs()
- if len(args) != 3 {
- return &etcd.Etcd{}, false, c.ArgErr()
- }
- tlsCertFile, tlsKeyFile, tlsCAcertFile = args[0], args[1], args[2]
- }
- for c.Next() {
- switch c.Val() {
- case "stubzones":
- stubzones = true
- case "debug":
- etc.Debug = true
- case "path":
- if !c.NextArg() {
- return &etcd.Etcd{}, false, c.ArgErr()
- }
- etc.PathPrefix = c.Val()
- case "endpoint":
- args := c.RemainingArgs()
- if len(args) == 0 {
- return &etcd.Etcd{}, false, c.ArgErr()
- }
- endpoints = args
- case "upstream":
- args := c.RemainingArgs()
- if len(args) == 0 {
- return &etcd.Etcd{}, false, c.ArgErr()
- }
- for i := 0; i < len(args); i++ {
- h, p, e := net.SplitHostPort(args[i])
- if e != nil && p == "" {
- args[i] = h + ":53"
- }
- }
- etc.Proxy = proxy.New(args)
- case "tls": // cert key cacertfile
- args := c.RemainingArgs()
- if len(args) != 3 {
- return &etcd.Etcd{}, false, c.ArgErr()
- }
- tlsCertFile, tlsKeyFile, tlsCAcertFile = args[0], args[1], args[2]
- }
- }
- }
- client, err := newEtcdClient(endpoints, tlsCertFile, tlsKeyFile, tlsCAcertFile)
- if err != nil {
- return &etcd.Etcd{}, false, err
- }
- etc.Client = client
- return &etc, stubzones, nil
- }
- }
- return &etcd.Etcd{}, false, nil
-}
-
-func newEtcdClient(endpoints []string, tlsCert, tlsKey, tlsCACert string) (etcdc.KeysAPI, error) {
- etcdCfg := etcdc.Config{
- Endpoints: endpoints,
- Transport: newHTTPSTransport(tlsCert, tlsKey, tlsCACert),
- }
- cli, err := etcdc.New(etcdCfg)
- if err != nil {
- return nil, err
- }
- return etcdc.NewKeysAPI(cli), nil
-}
-
-func newHTTPSTransport(tlsCertFile, tlsKeyFile, tlsCACertFile string) etcdc.CancelableTransport {
- var cc *tls.Config = nil
-
- if tlsCertFile != "" && tlsKeyFile != "" {
- var rpool *x509.CertPool
- if tlsCACertFile != "" {
- if pemBytes, err := ioutil.ReadFile(tlsCACertFile); err == nil {
- rpool = x509.NewCertPool()
- rpool.AppendCertsFromPEM(pemBytes)
- }
- }
-
- if tlsCert, err := tls.LoadX509KeyPair(tlsCertFile, tlsKeyFile); err == nil {
- cc = &tls.Config{
- RootCAs: rpool,
- Certificates: []tls.Certificate{tlsCert},
- InsecureSkipVerify: true,
- }
- }
- }
-
- tr := &http.Transport{
- Proxy: http.ProxyFromEnvironment,
- Dial: (&net.Dialer{
- Timeout: 30 * time.Second,
- KeepAlive: 30 * time.Second,
- }).Dial,
- TLSHandshakeTimeout: 10 * time.Second,
- TLSClientConfig: cc,
- }
-
- return tr
-}