explicit construction of DNS resolver
vyzo committed
Apr 12, 2021 at 13:46 UTC
543c5da34a9678b72dfeaaa28bcb66e8d57cd263
9 files changed
+60
-14
core/commands/dns.go
+6
-1
@@ -61,9 +61,14 @@ The resolver can recursively resolve:
61
cmds.BoolOption(dnsRecursiveOptionName, "r", "Resolve until the result is not a DNS link.").WithDefault(true),
62
},
63
Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
64
+ node, err := cmdenv.GetNode(env)
65
+ if err != nil {
66
+ return err
67
+ }
68
+
69
recursive, _ := req.Options[dnsRecursiveOptionName].(bool)
70
name := req.Arguments[0]
66
- resolver := namesys.NewDNSResolver()
71
+ resolver := namesys.NewDNSResolver(node.DNSResolver.LookupTXT)
72
73
var routing []nsopts.ResolveOpt
74
if !recursive {
core/commands/swarm.go
+16
-6
@@ -360,6 +360,11 @@ ipfs swarm connect /ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N
360
cmds.StringArg("address", true, true, "Address of peer to connect to.").EnableStdin(),
361
},
362
Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
363
+ node, err := cmdenv.GetNode(env)
364
+ if err != nil {
365
+ return err
366
+ }
367
+
368
api, err := cmdenv.GetApi(env, req)
369
if err != nil {
370
return err
@@ -367,7 +372,7 @@ ipfs swarm connect /ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N
372
373
addrs := req.Arguments
374
370
- pis, err := parseAddresses(req.Context, addrs)
375
+ pis, err := parseAddresses(req.Context, addrs, node.DNSResolver)
376
if err != nil {
377
return err
378
}
@@ -408,12 +413,17 @@ it will reconnect.
413
cmds.StringArg("address", true, true, "Address of peer to disconnect from.").EnableStdin(),
414
},
415
Run: func(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Environment) error {
416
+ node, err := cmdenv.GetNode(env)
417
+ if err != nil {
418
+ return err
419
+ }
420
+
421
api, err := cmdenv.GetApi(env, req)
422
if err != nil {
423
return err
424
}
425
416
- addrs, err := parseAddresses(req.Context, req.Arguments)
426
+ addrs, err := parseAddresses(req.Context, req.Arguments, node.DNSResolver)
427
if err != nil {
428
return err
429
}
@@ -453,9 +463,9 @@ it will reconnect.
463
464
// parseAddresses is a function that takes in a slice of string peer addresses
465
// (multiaddr + peerid) and returns a slice of properly constructed peers
456
-func parseAddresses(ctx context.Context, addrs []string) ([]peer.AddrInfo, error) {
466
+func parseAddresses(ctx context.Context, addrs []string, rslv *madns.Resolver) ([]peer.AddrInfo, error) {
467
// resolve addresses
458
- maddrs, err := resolveAddresses(ctx, addrs)
468
+ maddrs, err := resolveAddresses(ctx, addrs, rslv)
469
if err != nil {
470
return nil, err
471
}
@@ -464,7 +474,7 @@ func parseAddresses(ctx context.Context, addrs []string) ([]peer.AddrInfo, error
474
}
475
476
// resolveAddresses resolves addresses parallelly
467
-func resolveAddresses(ctx context.Context, addrs []string) ([]ma.Multiaddr, error) {
477
+func resolveAddresses(ctx context.Context, addrs []string, rslv *madns.Resolver) ([]ma.Multiaddr, error) {
478
ctx, cancel := context.WithTimeout(ctx, dnsResolveTimeout)
479
defer cancel()
480
@@ -488,7 +498,7 @@ func resolveAddresses(ctx context.Context, addrs []string) ([]ma.Multiaddr, erro
498
wg.Add(1)
499
go func(maddr ma.Multiaddr) {
500
defer wg.Done()
491
- raddrs, err := madns.Resolve(ctx, maddr)
501
+ raddrs, err := rslv.Resolve(ctx, maddr)
502
if err != nil {
503
resolveErrC <- err
504
return
core/core.go
+2
@@ -40,6 +40,7 @@ import (
40
"github.com/libp2p/go-libp2p/p2p/discovery"
41
p2pbhost "github.com/libp2p/go-libp2p/p2p/host/basic"
42
ma "github.com/multiformats/go-multiaddr"
43
+ madns "github.com/multiformats/go-multiaddr-dns"
44
45
"github.com/ipfs/go-ipfs/core/bootstrap"
46
"github.com/ipfs/go-ipfs/core/node"
@@ -88,6 +89,7 @@ type IpfsNode struct {
89
Filters *ma.Filters `optional:"true"`
90
Bootstrapper io.Closer `optional:"true"` // the periodic bootstrapper
91
Routing routing.Routing `optional:"true"` // the routing system. recommend ipfs-dht
92
+ DNSResolver *madns.Resolver // the DNS resolver
93
Exchange exchange.Interface // the block exchange + strategy (bitswap)
94
Namesys namesys.NameSystem // the name system, resolves paths to hashes
95
Provider provider.System // the value provider system
core/coreapi/coreapi.go
+6
-3
@@ -36,6 +36,7 @@ import (
36
routing "github.com/libp2p/go-libp2p-core/routing"
37
pubsub "github.com/libp2p/go-libp2p-pubsub"
38
record "github.com/libp2p/go-libp2p-record"
39
+ madns "github.com/multiformats/go-multiaddr-dns"
40
41
"github.com/ipfs/go-ipfs/core"
42
"github.com/ipfs/go-ipfs/core/node"
@@ -62,8 +63,9 @@ type CoreAPI struct {
63
recordValidator record.Validator
64
exchange exchange.Interface
65
65
- namesys namesys.NameSystem
66
- routing routing.Routing
66
+ namesys namesys.NameSystem
67
+ routing routing.Routing
68
+ dnsResolver *madns.Resolver
69
70
provider provider.System
71
@@ -174,6 +176,7 @@ func (api *CoreAPI) WithOptions(opts ...options.ApiOption) (coreiface.CoreAPI, e
176
recordValidator: n.RecordValidator,
177
exchange: n.Exchange,
178
routing: n.Routing,
179
+ dnsResolver: n.DNSResolver,
180
181
provider: n.Provider,
182
@@ -212,7 +215,7 @@ func (api *CoreAPI) WithOptions(opts ...options.ApiOption) (coreiface.CoreAPI, e
215
}
216
217
subApi.routing = offlineroute.NewOfflineRouter(subApi.repo.Datastore(), subApi.recordValidator)
215
- subApi.namesys = namesys.NewNameSystem(subApi.routing, subApi.repo.Datastore(), cs)
218
+ subApi.namesys = namesys.NewNameSystem(subApi.routing, subApi.repo.Datastore(), subApi.dnsResolver, cs)
219
subApi.provider = provider.NewOfflineProvider()
220
221
subApi.peerstore = nil
core/coreapi/name.go
+1
-1
@@ -95,7 +95,7 @@ func (api *NameAPI) Search(ctx context.Context, name string, opts ...caopts.Name
95
var resolver namesys.Resolver = api.namesys
96
97
if !options.Cache {
98
- resolver = namesys.NewNameSystem(api.routing, api.repo.Datastore(), 0)
98
+ resolver = namesys.NewNameSystem(api.routing, api.repo.Datastore(), api.dnsResolver, 0)
99
}
100
101
if !strings.HasPrefix(name, "/ipns/") {
core/node/dns.go
new
+11
@@ -0,0 +1,11 @@
1
+package node
2
+
3
+import (
4
+ config "github.com/ipfs/go-ipfs-config"
5
+ madns "github.com/multiformats/go-multiaddr-dns"
6
+)
7
+
8
+func DNSResolver(cfg *config.Config) (*madns.Resolver, error) {
9
+ // TODO custom resolvers from config
10
+ return madns.DefaultResolver, nil
11
+}
core/node/groups.go
+3
@@ -30,6 +30,7 @@ var BaseLibP2P = fx.Options(
30
fx.Provide(libp2p.PNet),
31
fx.Provide(libp2p.ConnectionManager),
32
fx.Provide(libp2p.Host),
33
+ fx.Provide(libp2p.MultiaddrResolver),
34
35
fx.Provide(libp2p.DiscoveryHandler),
36
@@ -264,6 +265,7 @@ func Online(bcfg *BuildCfg, cfg *config.Config) fx.Option {
265
return fx.Options(
266
fx.Provide(OnlineExchange(shouldBitswapProvide)),
267
maybeProvide(Graphsync, cfg.Experimental.GraphsyncEnabled),
268
+ fx.Provide(DNSResolver),
269
fx.Provide(Namesys(ipnsCacheSize)),
270
fx.Provide(Peering),
271
PeerWith(cfg.Peering.Peers...),
@@ -281,6 +283,7 @@ func Online(bcfg *BuildCfg, cfg *config.Config) fx.Option {
283
func Offline(cfg *config.Config) fx.Option {
284
return fx.Options(
285
fx.Provide(offline.Exchange),
286
+ fx.Provide(DNSResolver),
287
fx.Provide(Namesys(0)),
288
fx.Provide(offroute.NewOfflineRouter),
289
OfflineProviders(cfg.Experimental.StrategicProviding, cfg.Reprovider.Strategy, cfg.Reprovider.Interval),
core/node/ipns.go
+4
-3
@@ -10,6 +10,7 @@ import (
10
"github.com/libp2p/go-libp2p-core/peerstore"
11
"github.com/libp2p/go-libp2p-core/routing"
12
"github.com/libp2p/go-libp2p-record"
13
+ madns "github.com/multiformats/go-multiaddr-dns"
14
15
"github.com/ipfs/go-ipfs/repo"
16
"github.com/ipfs/go-namesys"
@@ -27,9 +28,9 @@ func RecordValidator(ps peerstore.Peerstore) record.Validator {
28
}
29
30
// Namesys creates new name system
30
-func Namesys(cacheSize int) func(rt routing.Routing, repo repo.Repo) (namesys.NameSystem, error) {
31
- return func(rt routing.Routing, repo repo.Repo) (namesys.NameSystem, error) {
32
- return namesys.NewNameSystem(rt, repo.Datastore(), cacheSize), nil
31
+func Namesys(cacheSize int) func(rt routing.Routing, rslv *madns.Resolver, repo repo.Repo) (namesys.NameSystem, error) {
32
+ return func(rt routing.Routing, rslv *madns.Resolver, repo repo.Repo) (namesys.NameSystem, error) {
33
+ return namesys.NewNameSystem(rt, repo.Datastore(), rslv, cacheSize), nil
34
}
35
}
36
core/node/libp2p/dns.go
new
+11
@@ -0,0 +1,11 @@
1
+package libp2p
2
+
3
+import (
4
+ "github.com/libp2p/go-libp2p"
5
+ madns "github.com/multiformats/go-multiaddr-dns"
6
+)
7
+
8
+func MultiaddrResolver(rslv *madns.Resolver) (opts Libp2pOpts, err error) {
9
+ opts.Opts = append(opts.Opts, libp2p.MultiaddrResolver(rslv))
10
+ return opts, nil
11
+}