-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathresolver.go
92 lines (71 loc) · 1.87 KB
/
resolver.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package main
import (
"context"
"net"
"time"
"github.com/sirupsen/logrus"
"github.com/spf13/viper"
)
const (
DNSResolverType = "dns"
StaticResolverType = "static"
UnknownResolverTypeErr Error = "unknown resolver type"
HostNotFoundErr Error = "host not found"
)
type (
Resolver interface {
Resolve(string) (string, error)
}
DNSResolver struct {
logger logrus.FieldLogger
resolver net.Resolver
}
StaticResolver struct {
logger logrus.FieldLogger
hosts map[string]string
}
)
func NewResolverFromConfig(l logrus.FieldLogger, v *viper.Viper) (Resolver, error) {
t := v.GetString("resolver.type")
l.WithField("resolver_type", t).Info("init resolver")
switch t {
case DNSResolverType:
return NewDNSResolver(l, v)
case StaticResolverType:
return NewStaticResolver(l, v)
}
return nil, UnknownResolverTypeErr
}
func NewDNSResolver(l logrus.FieldLogger, v *viper.Viper) (Resolver, error) {
r := &DNSResolver{
logger: l,
resolver: net.Resolver{},
}
if s := v.GetString("resolver.config.dns_server"); s != "" {
r.resolver.PreferGo = true
timeout := time.Duration(v.GetInt("resolver.config.timeout")) * time.Second
r.resolver.Dial = func(ctx context.Context, network, _ string) (conn net.Conn, e error) {
d := net.Dialer{Timeout: timeout}
return d.DialContext(ctx, network, s)
}
}
return r, nil
}
func NewStaticResolver(l logrus.FieldLogger, v *viper.Viper) (Resolver, error) {
return &StaticResolver{
logger: l,
hosts: v.GetStringMapString("resolver.config.hosts"),
}, nil
}
func (r *DNSResolver) Resolve(h string) (string, error) {
r.logger.WithField("host", h).Debug("resolve")
return r.resolver.LookupCNAME(context.Background(), h)
}
func (r *StaticResolver) Resolve(h string) (string, error) {
r.logger.WithField("host", h).Debug("resolve")
res, ok := r.hosts[h]
if !ok {
return "", HostNotFoundErr
}
return res, nil
}