merged PingRotate into PingScheduler; fixed save/load of cache to/from file; started...
[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
CH
65 bool have_up_to_date_ip();
66 int get_resolved_ip_count();
e18c1337
CH
67 void cancel_resolve();
68 bool is_resolving();
4e7b6ff9
CH
69
70// implementation of ResolverBase::async_resolve
71protected:
72 void do_resolve();
36ad976b 73
c5b4902d 74// internal helper functions
36ad976b 75private:
36ad976b
CH
76 void handle_resolve_timeout(const boost::system::error_code &error);
77 void handle_dns_result(const boost::system::error_code &error,
78 const std::size_t bytes_transferred);
4e7b6ff9 79 void handle_unavailable();
e18c1337 80 void handle_ips(const std::vector<host_addr_pair> &result_ips);
dbe986b9 81 void handle_cname(const std::vector<src_cname_pair> &result_cnames);
e18c1337 82 void cname_resolve_callback(const bool was_success,
23f51766 83 const int cname_count);
dbe986b9 84 void schedule_retry();
23f51766 85 void finalize_resolve(const bool success, const int cname_count=0);
96779587
CH
86 void stop_trying();
87 void wait_timer_timeout_handler(const boost::system::error_code &error);
23f51766 88 void gather_results( const boost::net::dns::rr_list_t *rr_list,
e18c1337 89 std::vector<host_addr_pair> *result_ips,
dbe986b9 90 std::vector<src_cname_pair> *result_cnames,
ad83004d 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 104 int RetryCount;
23f51766
CH
105 bool IsResolving; // true from async_resolve until finalize_resolve;
106 // false e.g. while waiting for StaleDataLongtermTimer
e91538f0 107 std::string LogPrefix;
ad83004d
CH
108 boost::uuids::random_generator RandomIdGenerator;
109 uint16_t RequestId;
e18c1337 110 bool OperationCancelled;
96779587 111};
36ad976b 112
36ad976b
CH
113#endif
114// (created using vim -- the world's best text editor)
115