DNS library for Elixir. Currently, the package provides:
- Elixir structs to interface with
inet_dns
module. - DNS.Server behavior
- DNS client
Note: the inet_dns
module is considered internal to Erlang and subject to
change. If this happened this library will be updated to accommodate for that,
but for now inet_dns
is simple and worked for me.
The package is available in Hex and can be installed as:
-
Add dns to your list of dependencies in
mix.exs
:def deps do [{:dns, "~> 0.0.3"}] end
-
Ensure dns is started before your application:
def application do [applications: [:dns]] end
iex> DNS.resolve("google.com")
{216, 58, 221, 110}
iex> DNS.query("google.com")
%DNS.Record{anlist: [%DNS.Resource{bm: [], class: :in, cnt: 0,
data: {216, 58, 221, 110}, domain: 'google.com', func: false, tm: :undefined,
ttl: 129, type: :a}], arlist: [],
header: %DNS.Header{aa: false, id: 0, opcode: :query, pr: false, qr: true,
ra: true, rcode: 0, rd: false, tc: false}, nslist: [],
qdlist: [%DNS.Query{class: :in, domain: 'google.com', type: :a}]}
iex> DNS.resolve("google.com", {"8.8.8.8", 53})
...
defmodule TestServer do
use Application
@behaviour DNS.Server
def start(_args, _opts) do
import Supervisor.Spec, warn: false
port = Application.get_env(:dns, :server)[:port]
children = [
worker(Task, [DNS.Server, :accept, [port, __MODULE__]])
]
opts = [strategy: :one_for_one, name: DNS.Server.Supervisor]
Supervisor.start_link(children, opts)
end
def handle(record, {ip, _}) do
query = hd(record.qdlist)
resource = %DNS.Resource{
domain: query.domain,
class: query.class,
type: query.type,
ttl: 0,
data: {127, 0, 0, 1}
}
%{record | anlist: [resource]}
end
end
For more information, see API Reference
BSD-3-Clauses