From 32b58bd8dc74623000b8b946dfd5308e6c751580 Mon Sep 17 00:00:00 2001 From: "W. Trevor King" Date: Thu, 7 May 2015 15:09:08 -0700 Subject: [PATCH] core/commands/dns: Add 'ipfs dns ...' for resolving DNS references This lets users resolve (recursively or not) DNS links without pulling in the other protocols. That makes an easier, more isolated target for alternative implemenations, since they don't need to understand IPNS, proquint, etc. to handle these resolutions. --- core/commands/dns.go | 82 +++++++++++++++++++++++++++++++++++++++++++ core/commands/root.go | 2 ++ 2 files changed, 84 insertions(+) create mode 100644 core/commands/dns.go diff --git a/core/commands/dns.go b/core/commands/dns.go new file mode 100644 index 00000000000..b9887d85481 --- /dev/null +++ b/core/commands/dns.go @@ -0,0 +1,82 @@ +package commands + +import ( + "io" + "strings" + + cmds "github.com/ipfs/go-ipfs/commands" + namesys "github.com/ipfs/go-ipfs/namesys" + util "github.com/ipfs/go-ipfs/util" +) + +var DNSCmd = &cmds.Command{ + Helptext: cmds.HelpText{ + Tagline: "DNS link resolver", + ShortDescription: ` +Multihashes are hard to remember, but domain names are usually easy to +remember. To create memorable aliases for multihashes, DNS TXT +records can point to other DNS links, IPFS objects, IPNS keys, etc. +This command resolves those links to the referenced object. +`, + LongDescription: ` +Multihashes are hard to remember, but domain names are usually easy to +remember. To create memorable aliases for multihashes, DNS TXT +records can point to other DNS links, IPFS objects, IPNS keys, etc. +This command resolves those links to the referenced object. + +For example, with this DNS TXT record: + + ipfs.io. TXT "dnslink=/ipfs/QmRzTuh2Lpuz7Gr39stNr6mTFdqAghsZec1JoUnfySUzcy ..." + +The resolver will give: + + > ipfs dns ipfs.io + /ipfs/QmRzTuh2Lpuz7Gr39stNr6mTFdqAghsZec1JoUnfySUzcy + +And with this DNS TXT record: + + ipfs.ipfs.io. TXT "dnslink=/dnslink/ipfs.io ..." + +The resolver will give: + + > ipfs dns ipfs.io + /dnslink/ipfs.io + > ipfs dns --recursive + /ipfs/QmRzTuh2Lpuz7Gr39stNr6mTFdqAghsZec1JoUnfySUzcy +`, + }, + + Arguments: []cmds.Argument{ + cmds.StringArg("domain-name", true, false, "The domain-name name to resolve.").EnableStdin(), + }, + Options: []cmds.Option{ + cmds.BoolOption("recursive", "r", "Resolve until the result is not a DNS link"), + }, + Run: func(req cmds.Request, res cmds.Response) { + + recursive, _, _ := req.Option("recursive").Bool() + name := req.Arguments()[0] + var resolver namesys.DNSResolver + + depth := 1 + if recursive { + depth = 0 + } + output, err := resolver.Resolve(req.Context().Context, name, depth) + if err != nil { + res.SetError(err, cmds.ErrNormal) + return + } + res.SetOutput(&ResolvedPath{output}) + }, + Marshalers: cmds.MarshalerMap{ + cmds.Text: func(res cmds.Response) (io.Reader, error) { + output, ok := res.Output().(*ResolvedPath) + if !ok { + return nil, util.ErrCast() + } + return strings.NewReader(output.Path.String()), nil + }, + }, + Type: ResolvedPath{}, +} diff --git a/core/commands/root.go b/core/commands/root.go index 5b1ef364d48..41daa00b029 100644 --- a/core/commands/root.go +++ b/core/commands/root.go @@ -41,6 +41,7 @@ ADVANCED COMMANDS daemon Start a long-running daemon process mount Mount an ipfs read-only mountpoint name Publish or resolve IPNS names + dns Resolve DNS links pin Pin objects to local storage repo gc Garbage collect unpinned objects @@ -84,6 +85,7 @@ var rootSubcommands = map[string]*cmds.Command{ "config": ConfigCmd, "dht": DhtCmd, "diag": DiagCmd, + "dns": DNSCmd, "get": GetCmd, "id": IDCmd, "log": LogCmd,