tested new DNS with internal server, make more robust against caching; works nicely now
[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:
73 void do_resolve();
36ad976b 74
c5b4902d 75// internal helper functions
36ad976b 76private:
36ad976b
CH
77 void handle_resolve_timeout(const boost::system::error_code &error);
78 void handle_dns_result(const boost::system::error_code &error,
79 const std::size_t bytes_transferred);
4e7b6ff9 80 void handle_unavailable();
e18c1337 81 void handle_ips(const std::vector<host_addr_pair> &result_ips);
dbe986b9 82 void handle_cname(const std::vector<src_cname_pair> &result_cnames);
e18c1337 83 void cname_resolve_callback(const bool was_success,
23f51766 84 const int cname_count);
dbe986b9 85 void schedule_retry();
23f51766 86 void finalize_resolve(const bool success, const int cname_count=0);
72be9e7d 87 void stop_trying(const bool was_success);
96779587 88 void wait_timer_timeout_handler(const boost::system::error_code &error);
23f51766 89 void gather_results( const boost::net::dns::rr_list_t *rr_list,
e18c1337 90 std::vector<host_addr_pair> *result_ips,
dbe986b9 91 std::vector<src_cname_pair> *result_cnames,
ad83004d 92 std::vector<string_pair> *result_nameservers ) const;
36ad976b 93
c5b4902d 94// variables
36ad976b 95private:
96779587 96 boost::asio::ip::udp::socket Socket;
4e7b6ff9 97 boost::net::dns_buffer_t ReceiveBuffer;
ad83004d 98 boost::net::dns_buffer_t RequestBuffer;
923626c0 99 DnsIpProtocol Protocol;
96779587 100 boost::asio::ip::udp::endpoint NameServer;
36ad976b
CH
101 boost::asio::deadline_timer ResolveTimeoutTimer;
102 boost::asio::deadline_timer PauseBeforeRetryTimer;
103 boost::asio::deadline_timer StaleDataLongtermTimer;
4e7b6ff9 104 std::size_t NextIpIndex;
36ad976b 105 int RetryCount;
23f51766
CH
106 bool IsResolving; // true from async_resolve until finalize_resolve;
107 // false e.g. while waiting for StaleDataLongtermTimer
e91538f0 108 std::string LogPrefix;
ad83004d
CH
109 boost::uuids::random_generator RandomIdGenerator;
110 uint16_t RequestId;
e18c1337 111 bool OperationCancelled;
fd62d09f 112 bool LongtermTimerIsActive;
96779587 113};
36ad976b 114
36ad976b
CH
115#endif
116// (created using vim -- the world's best text editor)
117