2014-02-26 09:43:49 -06:00
getdns API
2013-06-24 13:10:42 -05:00
==========
2013-06-11 07:37:29 -05:00
2014-06-02 17:02:10 -05:00
* Date: 2014-06-02
2014-02-26 09:43:37 -06:00
* GitHub: < https: // github . com / getdnsapi / getdns >
2013-06-11 07:51:35 -05:00
2014-05-22 13:16:34 -05:00
getdns is a [modern asynchronous DNS API ](http://www.vpnc.org/getdns-api/ )
intended to make all types of DNS information easily available as described by
Paul Hoffman. This implementation is licensed under the New BSD License
(BSD-new).
2013-09-11 17:41:23 -05:00
2014-05-22 13:16:34 -05:00
The [getdns-api mailing list ](http://www.vpnc.org/mailman/listinfo/getdns-api )
is a good place to engage in discussions regarding the design of the API.
2013-06-24 13:10:42 -05:00
2014-05-22 13:16:34 -05:00
If you are just getting started with the library take a look at the section
below that describes building and handling external dependencies for the
library. Once it is built you should take a look at src/examples to see how
the library is used.
2014-02-10 18:59:45 -06:00
2014-05-22 13:16:34 -05:00
This file captures the goals and direction of the project and the current state
of the implementation.
2013-06-24 13:10:42 -05:00
2013-07-02 16:00:20 -05:00
The goals of this implementation of the getdns API are:
2013-06-24 13:10:42 -05:00
2013-07-02 16:00:20 -05:00
* Provide an open source implementation, in C, of the formally described getdns API by Paul Hoffman at < http: // www . vpnc . org / getdns-api />
2014-02-25 20:17:33 -06:00
* Initial support for FreeBSD, OSX, Linux (CentOS/RHEL, Ubuntu) via functional "configure" script
2013-06-28 07:44:23 -05:00
* Initial support to include the Android platform
2013-06-24 13:10:42 -05:00
* Include examples and tests as part of the build
* Document code using doxygen
* Leverage github as much as possible for project coordination
2013-07-19 15:19:22 -05:00
* Coding style/standards follow the BSD coding style < ftp: // ftp . netbsd . org / pub / NetBSD / NetBSD-current / src / share / misc / style >
2014-02-25 20:05:18 -06:00
2014-02-10 18:59:45 -06:00
Non-goals (things we will not be doing at least initially) include:
2013-07-02 16:00:20 -05:00
* implementation of the traditional DNS related routines (gethostbyname, etc.)
2014-02-25 20:06:13 -06:00
## Language Bindings
2014-05-22 13:16:34 -05:00
In parallel, the team is actively developing bindings for various languages.
For more information, visit the
[wiki ](https://github.com/getdnsapi/getdns/wiki/Language-Bindings ).
2014-02-10 18:59:45 -06:00
2014-02-25 20:05:18 -06:00
Motivation for providing the API
================================
2014-05-22 13:16:34 -05:00
The developers are of the opinion that DNSSEC offers a unique global
infrastructure for establishing and enhancing cryptographic trust relations.
With the development of this API we intend to offer application developers a
modern and flexible way that enables end-to-end trust in the DNS architecture
and will inspire application developers towards innovative security solutions
in their applications.
2014-02-25 20:05:18 -06:00
2013-11-03 07:47:19 -06:00
Releases
========
2014-05-22 13:16:34 -05:00
Release numbering follows the [Semantic Versioning ](http://semver.org/ )
approach. The code is currently under active development.
2013-11-03 07:47:19 -06:00
2014-02-25 20:05:18 -06:00
The following requirements were met as conditions for the present release:
2013-11-03 07:47:19 -06:00
2014-05-22 13:16:34 -05:00
* code compiles cleanly on at least the primary target platforms: OSX, RHEL/CentOS Linux, FreeBSD
* examples must compile and run clean
2013-11-04 13:59:42 -06:00
* clearly document supported/unsupported elements of the API
2013-11-03 07:47:19 -06:00
2014-02-10 18:59:45 -06:00
2013-11-03 07:47:19 -06:00
Tickets/Bug Reports
===================
2014-02-26 09:44:39 -06:00
Tickets and bug reports should be reported via the [GitHub issues list ](https://github.com/getdnsapi/getdns/issues ).
2013-11-03 07:47:19 -06:00
2014-02-25 20:05:18 -06:00
Additionally, we have a mailing list at users@getdns.net.
2013-06-24 13:10:42 -05:00
2013-11-03 15:40:24 -06:00
2014-02-25 20:05:18 -06:00
Building/External Dependencies
==============================
2013-11-03 07:47:19 -06:00
External dependencies are linked outside the getdns API build tree (we rely on configure to find them). We would like to keep the dependency tree short.
2013-06-24 13:10:42 -05:00
2014-02-20 08:17:27 -06:00
* [libldns from NLnet Labs ](https://www.nlnetlabs.nl/projects/ldns/ ) version 1.6.11 or later (ldns requires openssl headers and libraries)
* [libunbound from NLnet Labs ](http://www.nlnetlabs.nl/projects/unbound/ ) version 1.4.16 or later
2013-11-29 08:41:06 -06:00
* [libexpat ](http://expat.sourceforge.net/ ) for libunbound.
2013-11-25 19:44:20 -06:00
* [libidn from the FSF ](http://www.gnu.org/software/libidn/ ) version 1.
2013-11-03 15:40:24 -06:00
* Doxygen is used to generate documentation, while this is not technically necessary for the build it makes things a lot more pleasant.
2013-11-29 08:41:06 -06:00
You have to install the library and also the library-devel (or -dev) for your
package management system to install the compile time files. If you checked
out our git; the configure script is built with autoreconf --install.
2014-02-25 20:05:18 -06:00
## Extensions / Event loop dependencies
2014-02-26 09:44:39 -06:00
The implementation works with a variety of event loops, each built as a separate shared library. See [the wiki ](https://github.com/getdnsapi/getdns/wiki/Asynchronous-Support#wiki-included-event-loop-integrations ) for more details.
2014-02-25 20:05:18 -06:00
* [libevent ](http://libevent.org ). Note: the examples *require* this and should work with either libevent 1.x or 2.x. 2.x is preferred.
* [libuv ](https://github.com/joyent/libuv )
* [libev ](http://software.schmorp.de/pkg/libev.html )
2014-02-10 18:59:45 -06:00
##Regression Tests
A suite of regression tests are included with the library, if you make changes or just
want to sanity check things on your system take a look at src/test. You will need
to install [libcheck ](http://check.sourceforge.net/ ). Check is also available from
many of the package repositories for the more popular operating systems.
2014-02-20 08:17:27 -06:00
## DNSSEC
For the library to be DNSSEC capable, it needs to know the root trust anchor.
The library will try to load the root trust anchor from
`/etc/unbound/getdns-root.key` by default. This file is expected to have one
or more `DS` or `DNSKEY` resource records in presentation (i.e. zone file)
format. Note that this is different than the format of BIND.keys.
The best way to setup or update the root trust anchor is by using
[`unbound-anchor` ](http://www.unbound.net/documentation/unbound-anchor.html ).
To setup the library with the root trust anchor at the default location,
execute the following steps as root:
2014-02-26 07:35:45 -06:00
# mkdir -p /etc/unbound
# unbound-anchor -a /etc/unbound/getdns-root.key
2014-02-20 08:17:27 -06:00
2014-02-10 18:59:45 -06:00
#Unsupported Features
2013-12-04 12:26:11 -06:00
The following API calls are documented in getDNS but *not supported* by the implementation at this time:
* Support for OPT Records in `getdns_general` and variants via the `extensions` parameter.
* EDNS options
* `getdns_context_set_edns_do_bit`
* `getdns_context_set_edns_version`
* `getdns_context_set_edns_extended_rcode`
* `GETDNS_CONTEXT_TCP_ONLY_KEEP_CONNECTIONS_OPEN` with `getdns_context_set_dns_transport`
2013-12-06 09:01:37 -06:00
* DNS Search suffixes / local file support
* `getdns_context_set_append_name`
* `getdns_context_set_suffix`
* Setting root servers via `getdns_context_set_dns_root_servers`
2014-02-20 08:17:27 -06:00
* `getdns_context_set_dnssec_trust_anchors`
2013-12-04 12:26:11 -06:00
* Detecting changes to resolv.conf and hosts
2014-02-10 18:59:45 -06:00
* MDNS and NetBIOS namespaces (only DNS and LOCALFILES are supported)
Some platform specific features are not implemented in the first public release of getdns, however they are on the radar. These include:
* Respecting settings in /etc/nsswitch.conf (linux and some other OSes), for the first release we simply check local files (/etc/hosts) before checking the DNS.
* Search suffixes specified in /etc/resolv.conf
2013-12-04 12:26:11 -06:00
2014-02-20 07:45:10 -06:00
#Known Issues
There are a few known issues which we have summarized below - the most recent
and helpful list is being maintained in the git issues list in the repository.
2014-06-02 17:02:10 -05:00
Other known issues are being managed in the git repository issue list.
2014-02-20 07:45:10 -06:00
* (#113) Changing the resolution type between stub and recursive after a query has been issued with a context will not work - the previous resolution type will continue to be used. If you want to change the resolution type you will need to create a new context and set the resolution type for that context.
2014-06-02 17:02:10 -05:00
* older versions of libtool and ranlib may have problems with the way we leverage features specific to exported symbols. If you see error messages during linking it may be due to an older version of libtool in your PATH. This can be fixed by updating your libtool or adding the getdns build directory to the beginning of your path so that our libtool/ranlib are preferred.
2014-05-23 11:15:53 -05:00
2013-11-03 07:47:19 -06:00
#Supported Platforms
The primary platforms targeted are Linux and FreeBSD, other platform are supported as we get time. The names listed here are intended to help ensure that we catch platform specific breakage, not to limit the work that folks are doing.
2014-06-02 17:02:10 -05:00
* RHEL/CentOS 6.4
* OSX 10.8
* Ubuntu 13.10
2013-11-03 07:47:19 -06:00
2014-02-24 13:53:14 -06:00
For most platforms where we have provided a binary distribution as a compressed tar you
can simply untar the file and run "make install". Bear in mind that any dependencies
will need to be resolved before you can get the library to do it's work.
In some cases we have provided binaries that use the native packaging for the platform,
where possible dependencies are identified using the method specific to the platform.
2013-11-03 07:47:19 -06:00
2014-02-10 18:59:45 -06:00
We intend to add MS-Windows, Android and other platforms to the releases as we have time to port it.
2014-05-22 13:16:34 -05:00
##Platform Specific Build Reports
2013-11-03 07:47:19 -06:00
2014-02-26 10:08:27 -06:00
[![Build Status ](https://travis-ci.org/getdnsapi/getdns.png?branch=master )](https://travis-ci.org/getdnsapi/getdns)
2014-02-25 17:35:54 -06:00
2014-03-04 07:16:26 -06:00
###FreeBSD
If you're using [FreeBSD ](http://www.freebsd.org/ ), you may install getdns via the [ports tree ](http://www.freshports.org/dns/getdns/ ) by running: `cd /usr/ports/dns/getdns && make install clean`
2014-06-02 17:02:10 -05:00
If you are using FreeBSD 10 getdns can be intalled via 'pkg install getdns'. There may be some problems building getdns on FreeBSD 10 using libevent.
2014-05-22 13:16:34 -05:00
2014-02-25 17:35:54 -06:00
###CentOS/RHEL 6.5
We rely on the most excellent package manager fpm to build the linux packages which
means that the packaging platform requires ruby 2.1.0. There are other ways to
build the packages, this is simplythe one we chose to use.
2014-02-26 07:35:45 -06:00
# cat /etc/redhat-release
CentOS release 6.5 (Final)
# uname -a
Linux host-10-1-1-6 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
# cd getdns-0.1.0
# ./configure --prefix=/home/deploy/build
# make; make install
# cd /home/deploy/build
# mv lib lib64
# . /usr/local/rvm/config/alias
# fpm -x "*.la" -a native -s dir -t rpm -n getdns -v 0.1.0 -d "unbound" -d "ldns" -d "libevent" -d "libidn" --prefix /usr --vendor "Verisign Inc., NLnet Labs" --license "BSD New" --url "http://www.getdnsapi.net" --description "Modern asynchronous API to the DNS" .
2014-02-25 17:35:54 -06:00
###OSX
2014-02-26 07:35:45 -06:00
# sw_vers
ProductName: Mac OS X
ProductVersion: 10.8.5
BuildVersion: 12F45
2014-02-28 08:08:54 -06:00
2014-04-02 08:19:56 -05:00
Built using PackageMaker, libevent2.
2014-04-18 15:55:07 -05:00
# ./configure --with-libevent --prefix=$HOME/getdnsosx/export
2014-04-02 08:19:56 -05:00
# make
# make install
edit/fix hardcoded paths in lib/*.la to reference /usr/local
update getdns.pmdoc to match release info
build package using PackageMaker
create dmg
2013-11-03 07:47:19 -06:00
2014-02-28 08:08:54 -06:00
#### Homebrew
2014-04-01 12:58:11 -05:00
If you're using [Homebrew ](http://brew.sh/ ), you may run `brew install getdns` . By default, this will only build the core library without any 3rd party event loop support.
To install the [event loop integration libraries ](https://github.com/getdnsapi/getdns/wiki/Asynchronous-Support ) that enable support for libevent, libuv, and libev, run: `brew install getdns --with-libevent --with-libuv --with-libev` . All switches are optional.
Note that in order to compile the examples, the `--with-libevent` switch is required.
2014-02-28 08:08:54 -06:00
2013-11-03 07:47:19 -06:00
Contributors
============
2014-02-26 08:33:17 -06:00
* Craig Despeaux, Verisign, Inc.
2013-11-03 07:47:19 -06:00
* Neel Goyal, Verisign, Inc.
2014-02-26 10:27:53 -06:00
* Olaf Kolkman, NLnet Labs
2014-02-25 20:05:18 -06:00
* Allison Mankin, Verisign, Inc. - Verisign Labs.
2013-11-03 07:47:19 -06:00
* Melinda Shore, No Mountain Software LLC
2014-02-24 08:26:20 -06:00
* Willem Toorop, NLnet Labs
* Wouter Wijngaards, NLnet Labs
2014-02-26 08:33:17 -06:00
* Glen Wiley, Verisign, Inc.
2013-06-24 13:10:42 -05:00
2014-02-25 20:05:18 -06:00
Acknowledgements
================
2014-02-26 07:35:45 -06:00
The development team explicitly acknowledges Paul Hoffman for his initiative and efforts to develop a consensus based DNS API. We would like to thank the participants of the [mailing list ](http://www.vpnc.org/mailman/listinfo/getdns-api ) for their contributions.