Commit | Line | Data |
---|---|---|
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 | ||
96779587 CH |
23 | /** |
24 | * Two in one: a DNS resolver factory and a DNS cache | |
25 | * | |
26 | * Put these two things into one class because it is easier this way to avoid | |
27 | * sync problems if e.g. there are 2 resolvers for the same host name | |
28 | * | |
29 | * This class is a Singleton. In case there are problems with this approach, | |
30 | * there is an alternative: | |
31 | * give every ResolverBase object a DnsMasterItem as variable, that is set | |
32 | * during construction and call update / get_cached_results on that instance | |
33 | */ | |
34 | ||
36ad976b CH |
35 | #ifndef DNS_MASTER_H |
36 | #define DNS_MASTER_H | |
37 | ||
38 | #include <map> | |
923626c0 | 39 | #include <utility> // pair |
36ad976b | 40 | |
96779587 | 41 | #include <boost/shared_ptr.hpp> |
36ad976b | 42 | #include <boost/noncopyable.hpp> |
923626c0 | 43 | #include <boost/net/dns.hpp> |
36ad976b | 44 | |
96779587 | 45 | #include "host/pinger.h" // for IoserviceItem |
923626c0 | 46 | #include "host/pingprotocol.h" |
c5b4902d CH |
47 | #include "dns/dnscache.h" |
48 | #include "dns/resolverbase.h" | |
36ad976b CH |
49 | |
50 | class DnsMaster; | |
36ad976b | 51 | |
96779587 | 52 | typedef boost::shared_ptr<DnsMaster> DnsMasterItem; |
36ad976b | 53 | |
923626c0 | 54 | typedef boost::net::dns::type_t DnsIpProtocol; |
c5b4902d CH |
55 | const DnsIpProtocol DNS_IPv4 = boost::net::dns::type_a; |
56 | const DnsIpProtocol DNS_IPv6 = boost::net::dns::type_a6; | |
57 | const DnsIpProtocol DNS_IPALL = boost::net::dns::type_all; | |
923626c0 CH |
58 | |
59 | typedef std::pair<std::string, DnsIpProtocol> resolver_key_type; | |
60 | typedef std::map<resolver_key_type, ResolverItem> resolver_map_type; | |
36ad976b | 61 | |
e18c1337 | 62 | std::string to_string(const DnsIpProtocol &protocol); |
36ad976b | 63 | |
dbe986b9 CH |
64 | /** |
65 | * Factory and Cache of DNS resolvers | |
66 | * | |
67 | * to avoid having several resolvers resolving the same hostname which might | |
68 | * result in conflicts with caching, this class is a singleton factory and the | |
69 | * only place where Resolvers are constructed. They are remembered in an | |
70 | * internal cache by hostname and IP version requested (v4, v6 or both). | |
71 | * | |
72 | * During resolving, several different name servers will have to be queried for | |
73 | * the same hostname. These recursive resolvers are created using | |
74 | * get_recursor_for and are NOT cached, so they should only be used from another | |
75 | * "regular" resolver (created using get_resolver_for) | |
76 | * | |
77 | * The DnsMaster also remembers a few global variables that can be queried | |
78 | * using public getter functions and it creates the DnsCache used by all its | |
79 | * resolvers | |
80 | */ | |
36ad976b CH |
81 | class DnsMaster : boost::noncopyable |
82 | { | |
923626c0 | 83 | // Resolver factory |
96779587 | 84 | public: |
923626c0 CH |
85 | ResolverItem& get_resolver_for(const std::string &hostname, |
86 | const PingProtocol &ping_protocol); | |
87 | ResolverItem& get_resolver_for(const std::string &hostname, | |
e18c1337 | 88 | const DnsIpProtocol &protocol); |
36ad976b CH |
89 | |
90 | // implementation of singleton | |
91 | private: | |
92 | static DnsMasterItem TheOnlyInstance; | |
93 | ||
94 | DnsMaster(const IoServiceItem &io_serv, | |
ad83004d | 95 | const boost::asio::ip::address &default_name_server, |
923626c0 CH |
96 | const int resolved_ip_ttl_threshold, |
97 | const int max_address_resolution_attempts, | |
cd71d095 | 98 | const int max_recursion_count, |
4e7b6ff9 | 99 | const DnsCacheItem &cache); |
36ad976b | 100 | public: |
923626c0 | 101 | static void create_master(const IoServiceItem &io_serv, |
ad83004d CH |
102 | const boost::asio::ip::address &default_name_server, |
103 | const int resolved_ip_ttl_threshold, | |
f833126b | 104 | const int min_time_between_resolves, |
ad83004d | 105 | const int max_address_resolution_attempts, |
cd71d095 | 106 | const int max_recursion_count, |
ad83004d | 107 | const std::string &cache_file); |
8d26221d CH |
108 | static void create_master(const IoServiceItem &io_serv, |
109 | const boost::asio::ip::address &default_name_server, | |
110 | const int resolved_ip_ttl_threshold, | |
111 | const int max_address_resolution_attempts, | |
cd71d095 | 112 | const int max_recursion_count, |
8d26221d | 113 | const DnsCacheItem &cache); // needed for unit test |
96779587 | 114 | static DnsMasterItem& get_instance(); |
36ad976b CH |
115 | ~DnsMaster(); |
116 | ||
923626c0 CH |
117 | // storage of global variables |
118 | public: | |
dbe986b9 | 119 | //boost::asio::ip::address &get_default_name_server() const; // unused |
923626c0 CH |
120 | int get_resolved_ip_ttl_threshold() const; |
121 | int get_max_address_resolution_attempts() const; | |
cd71d095 | 122 | int get_max_recursion_count() const; |
923626c0 | 123 | |
36ad976b CH |
124 | // variables |
125 | private: | |
126 | IoServiceItem IoService; | |
ad83004d | 127 | const boost::asio::ip::address DefaultNameServer; |
923626c0 CH |
128 | const int ResolvedIpTtlThreshold; |
129 | const int MaxAddressResolutionAttempts; | |
cd71d095 | 130 | const int MaxRecursionCount; |
96779587 | 131 | DnsCacheItem Cache; |
36ad976b | 132 | resolver_map_type ResolverMap; |
36ad976b | 133 | |
923626c0 | 134 | // internal helper functions |
36ad976b | 135 | private: |
96779587 | 136 | bool is_ip(const std::string &hostname) const; |
923626c0 | 137 | static DnsIpProtocol ping2dns_protocol(const PingProtocol& pprot); |
36ad976b CH |
138 | }; |
139 | ||
140 | #endif | |
141 | ||
142 | // (created using vim -- the world's best text editor) | |
143 |