completed partial IPv6 compatibility in DNS; does retrieve and Cache IPv6 IPs
[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 40typedef std::pair<std::string, std::string> string_pair;
dbe986b9 41typedef std::pair<std::string, Cname> src_cname_pair;
e18c1337 42typedef std::pair<std::string, HostAddress> host_addr_pair;
ad83004d
CH
43
44
36ad976b
CH
45class DnsResolver : public ResolverBase
46{
36ad976b 47public:
96779587 48 ~DnsResolver();
36ad976b 49
96779587
CH
50// constructor accessible from friend DnsMaster
51public:
4e7b6ff9 52 friend ResolverItem& DnsMaster::get_resolver_for(
923626c0
CH
53 const std::string &hostname,
54 const DnsIpProtocol &protocol);
36ad976b 55private:
4e7b6ff9
CH
56 DnsResolver(IoServiceItem &io_serv,
57 const std::string &hostname,
923626c0 58 const DnsIpProtocol &protocol,
96779587 59 const DnsCacheItem cache,
96779587 60 const boost::asio::ip::address &name_server);
36ad976b 61
4e7b6ff9 62// only real public function (called from pingers)
36ad976b 63public:
26b0f687 64 HostAddress get_next_ip(const bool check_up_to_date=true);
923626c0 65 bool have_up_to_date_ip();
fd62d09f 66 int get_resolved_ip_count(const bool check_up_to_date=true);
e18c1337 67 void cancel_resolve();
72be9e7d
CH
68 bool is_resolving() const;
69 bool is_waiting_to_resolve() const;
4e7b6ff9
CH
70
71// implementation of ResolverBase::async_resolve
72protected:
cd71d095 73 void do_resolve(const int recursion_count);
36ad976b 74
c5b4902d 75// internal helper functions
36ad976b 76private:
cd71d095
CH
77 void handle_resolve_timeout(const int recursion_count,
78 const boost::system::error_code &error);
79 void handle_dns_result(const int recursion_count,
80 const boost::system::error_code &error,
36ad976b 81 const std::size_t bytes_transferred);
cd71d095
CH
82 void handle_unavailable(const int recursion_count);
83 void handle_ips(const int recursion_count,
84 const std::vector<host_addr_pair> &result_ips);
85 void handle_cname(const int recursion_count,
86 const std::vector<src_cname_pair> &result_cnames);
e18c1337 87 void cname_resolve_callback(const bool was_success,
cd71d095
CH
88 const int recursion_count);
89 void schedule_retry(const int recursion_count);
90 void finalize_resolve(const bool success, const int recursion_count);
72be9e7d 91 void stop_trying(const bool was_success);
cd71d095
CH
92 void wait_timer_timeout_handler(const int recursion_count,
93 const boost::system::error_code &error);
23f51766 94 void gather_results( const boost::net::dns::rr_list_t *rr_list,
e18c1337 95 std::vector<host_addr_pair> *result_ips,
dbe986b9 96 std::vector<src_cname_pair> *result_cnames,
ad83004d 97 std::vector<string_pair> *result_nameservers ) const;
36ad976b 98
c5b4902d 99// variables
36ad976b 100private:
96779587 101 boost::asio::ip::udp::socket Socket;
4e7b6ff9 102 boost::net::dns_buffer_t ReceiveBuffer;
ad83004d 103 boost::net::dns_buffer_t RequestBuffer;
96779587 104 boost::asio::ip::udp::endpoint NameServer;
36ad976b
CH
105 boost::asio::deadline_timer ResolveTimeoutTimer;
106 boost::asio::deadline_timer PauseBeforeRetryTimer;
107 boost::asio::deadline_timer StaleDataLongtermTimer;
4e7b6ff9 108 std::size_t NextIpIndex;
36ad976b 109 int RetryCount;
23f51766
CH
110 bool IsResolving; // true from async_resolve until finalize_resolve;
111 // false e.g. while waiting for StaleDataLongtermTimer
e91538f0 112 std::string LogPrefix;
ad83004d
CH
113 boost::uuids::random_generator RandomIdGenerator;
114 uint16_t RequestId;
e18c1337 115 bool OperationCancelled;
fd62d09f 116 bool LongtermTimerIsActive;
96779587 117};
36ad976b 118
36ad976b 119#endif
36ad976b 120