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 CH |
61 | |
62 | ||
63 | class DnsMaster : boost::noncopyable | |
64 | { | |
923626c0 | 65 | // Resolver factory |
96779587 | 66 | public: |
923626c0 CH |
67 | ResolverItem& get_resolver_for(const std::string &hostname, |
68 | const PingProtocol &ping_protocol); | |
69 | ResolverItem& get_resolver_for(const std::string &hostname, | |
ad83004d CH |
70 | const DnsIpProtocol &protocol) |
71 | ResolverItem get_recursor_for(const std::string &hostname, | |
72 | const DnsIpProtocol &protocol, | |
73 | const boost::asio::ip::address &name_server); | |
36ad976b CH |
74 | |
75 | // implementation of singleton | |
76 | private: | |
77 | static DnsMasterItem TheOnlyInstance; | |
78 | ||
79 | DnsMaster(const IoServiceItem &io_serv, | |
ad83004d | 80 | const boost::asio::ip::address &default_name_server, |
923626c0 CH |
81 | const int resolved_ip_ttl_threshold, |
82 | const int max_address_resolution_attempts, | |
4e7b6ff9 | 83 | const DnsCacheItem &cache); |
36ad976b | 84 | public: |
923626c0 | 85 | static void create_master(const IoServiceItem &io_serv, |
ad83004d CH |
86 | const boost::asio::ip::address &default_name_server, |
87 | const int resolved_ip_ttl_threshold, | |
88 | const int max_address_resolution_attempts, | |
89 | const std::string &cache_file); | |
96779587 | 90 | static DnsMasterItem& get_instance(); |
36ad976b CH |
91 | ~DnsMaster(); |
92 | ||
923626c0 CH |
93 | // storage of global variables |
94 | public: | |
95 | //boost::asio::ip::address &get_name_server() const; // currently unused | |
96 | int get_resolved_ip_ttl_threshold() const; | |
97 | int get_max_address_resolution_attempts() const; | |
98 | ||
36ad976b CH |
99 | // variables |
100 | private: | |
101 | IoServiceItem IoService; | |
ad83004d | 102 | const boost::asio::ip::address DefaultNameServer; |
923626c0 CH |
103 | const int ResolvedIpTtlThreshold; |
104 | const int MaxAddressResolutionAttempts; | |
96779587 | 105 | DnsCacheItem Cache; |
36ad976b | 106 | resolver_map_type ResolverMap; |
36ad976b | 107 | |
923626c0 | 108 | // internal helper functions |
36ad976b | 109 | private: |
96779587 | 110 | bool is_ip(const std::string &hostname) const; |
923626c0 | 111 | static DnsIpProtocol ping2dns_protocol(const PingProtocol& pprot); |
36ad976b CH |
112 | }; |
113 | ||
114 | #endif | |
115 | ||
116 | // (created using vim -- the world's best text editor) | |
117 |