changed how dns deals with cnames and recursion: remember cnames and implement recurs...
[pingcheck] / src / dns / dnsresolver.h
CommitLineData
36ad976b
CH
1/*
2 The software in this package is distributed under the GNU General
3 Public License version 2 (with a special exception described below).
4
5 A copy of GNU General Public License (GPL) is included in this distribution,
6 in the file COPYING.GPL.
7
8 As a special exception, if other files instantiate templates or use macros
9 or inline functions from this file, or you compile this file and link it
10 with other works to produce a work based on this file, this file
11 does not by itself cause the resulting work to be covered
12 by the GNU General Public License.
13
14 However the source code for this file must still be made available
15 in accordance with section (3) of the GNU General Public License.
16
17 This exception does not invalidate any other reasons why a work based
18 on this file might be covered by the GNU General Public License.
19
20 Christian Herdtweck, Intra2net AG 2015
21 */
22
23#ifndef DNS_RESOLVER_H
24#define DNS_RESOLVER_H
25
c5b4902d 26#include "dns/dnsmaster.h"
36ad976b 27
36ad976b 28#include <boost/asio/deadline_timer.hpp>
96779587
CH
29#include <boost/asio/ip/udp.hpp>
30#include <boost/asio/ip/address.hpp>
36ad976b 31#include <boost/system/error_code.hpp>
946356e1 32#include <boost/net/network_array.hpp> // dns_buffer_t
ad83004d 33#include <boost/uuid/uuid_generators.hpp>
36ad976b 34
c5b4902d
CH
35#include "dns/resolverbase.h"
36#include "dns/dnsmaster.h"
37#include "dns/dnscache.h"
36ad976b 38
36ad976b 39
ad83004d
CH
40typedef std::pair<std::string, std::string> string_pair;
41
42
36ad976b
CH
43class DnsResolver : public ResolverBase
44{
36ad976b 45public:
96779587 46 ~DnsResolver();
36ad976b 47
96779587
CH
48// constructor accessible from friend DnsMaster
49public:
4e7b6ff9 50 friend ResolverItem& DnsMaster::get_resolver_for(
923626c0
CH
51 const std::string &hostname,
52 const DnsIpProtocol &protocol);
36ad976b 53private:
4e7b6ff9
CH
54 DnsResolver(IoServiceItem &io_serv,
55 const std::string &hostname,
923626c0 56 const DnsIpProtocol &protocol,
96779587 57 const DnsCacheItem cache,
96779587 58 const boost::asio::ip::address &name_server);
36ad976b 59
4e7b6ff9 60// only real public function (called from pingers)
36ad976b 61public:
4e7b6ff9 62 HostAddress get_next_ip();
923626c0
CH
63 bool have_up_to_date_ip();
64 int get_resolved_ip_count();
4e7b6ff9
CH
65
66// implementation of ResolverBase::async_resolve
67protected:
68 void do_resolve();
36ad976b 69
c5b4902d 70// internal helper functions
36ad976b 71private:
36ad976b
CH
72 void handle_resolve_timeout(const boost::system::error_code &error);
73 void handle_dns_result(const boost::system::error_code &error,
74 const std::size_t bytes_transferred);
4e7b6ff9
CH
75 void handle_unavailable();
76 void handle_ips(const HostAddressVec &ips);
77 void handle_cname(const std::string &canonical_name);
ad83004d 78 void handle_recurse(const HostAddress &name_server);
4e7b6ff9 79 void cname_resolve_callback(const std::string &canonical_name,
36ad976b 80 const bool was_success,
ad83004d
CH
81 const int recursion_count);
82 void recursive_resolve_callback(const uint32_t min_ttl,
83 const bool was_success,
84 const int recursion_count);
85 void finalize_resolve(const bool success, const int recursion_count=0);
96779587
CH
86 void stop_trying();
87 void wait_timer_timeout_handler(const boost::system::error_code &error);
ad83004d
CH
88 void gather_results( const boost::net::dns::rr_list_t *answers,
89 HostAddressVec *result_ips,
90 std::vector<string_pair> *result_cnames,
91 std::vector<string_pair> *result_nameservers ) const;
36ad976b 92
c5b4902d 93// variables
36ad976b 94private:
96779587 95 boost::asio::ip::udp::socket Socket;
4e7b6ff9 96 boost::net::dns_buffer_t ReceiveBuffer;
ad83004d 97 boost::net::dns_buffer_t RequestBuffer;
923626c0 98 DnsIpProtocol Protocol;
96779587 99 boost::asio::ip::udp::endpoint NameServer;
36ad976b
CH
100 boost::asio::deadline_timer ResolveTimeoutTimer;
101 boost::asio::deadline_timer PauseBeforeRetryTimer;
102 boost::asio::deadline_timer StaleDataLongtermTimer;
4e7b6ff9 103 std::size_t NextIpIndex;
36ad976b
CH
104 int RetryCount;
105 bool IsResolving;
e91538f0 106 std::string LogPrefix;
ad83004d
CH
107 boost::uuids::random_generator RandomIdGenerator;
108 uint16_t RequestId;
109 ResolverItem Recursor;
96779587 110};
36ad976b 111
36ad976b
CH
112#endif
113// (created using vim -- the world's best text editor)
114