From e91538f0c4d702df207eb8e783f91bf89a56659b Mon Sep 17 00:00:00 2001 From: Christian Herdtweck Date: Fri, 10 Apr 2015 18:34:30 +0200 Subject: [PATCH] started experimenting with DnsResolver; does send stuff but has not received anything yet --- src/dns/dnscache.cpp | 2 + src/dns/dnsresolver.cpp | 111 ++++++++++++++++++++++++------------ src/dns/dnsresolver.h | 1 + test/test_configurationoptions.cpp | 3 +- 4 files changed, 79 insertions(+), 38 deletions(-) diff --git a/src/dns/dnscache.cpp b/src/dns/dnscache.cpp index 23f2152..d180a89 100644 --- a/src/dns/dnscache.cpp +++ b/src/dns/dnscache.cpp @@ -65,6 +65,8 @@ DnsCache::DnsCache(const IoServiceItem &io_serv, DnsCache::~DnsCache() { + GlobalLogger.info() << "Dns Cache is being destructed"; + // save one last time without re-scheduling the next save save_to_cachefile(); diff --git a/src/dns/dnsresolver.cpp b/src/dns/dnsresolver.cpp index 71a79dc..c215b77 100644 --- a/src/dns/dnsresolver.cpp +++ b/src/dns/dnsresolver.cpp @@ -27,6 +27,7 @@ #include "dns/dnsresolver.h" #include +#include #include #include @@ -55,7 +56,8 @@ DnsResolver::DnsResolver(IoServiceItem &io_serv, const DnsCacheItem cache, const boost::asio::ip::address &name_server) : ResolverBase( io_serv, hostname, cache ) - , Socket( *io_serv ) + , Socket( *io_serv, ip::udp::endpoint(ip::udp::v4(), 0)) + // just connect to anything, will specify sender/receiver later , ReceiveBuffer() , Protocol( protocol ) , NameServer( name_server, Config::DNS_PORT ) @@ -65,21 +67,26 @@ DnsResolver::DnsResolver(IoServiceItem &io_serv, , NextIpIndex( 0 ) , RetryCount( 0 ) , IsResolving( false ) -{ } + , LogPrefix( "DnsResolver" ) +{ + std::stringstream temp; + temp << "Dns(" << ResolverBase::Hostname << "): "; + LogPrefix = temp.str(); +} DnsResolver::~DnsResolver() { boost::system::error_code error; - Socket.shutdown(boost::asio::ip::udp::socket::shutdown_both, error); //both=send&receive + Socket.shutdown(boost::asio::ip::udp::socket::shutdown_both, error); if ( error ) - GlobalLogger.warning() << "Received error " << error + GlobalLogger.warning() << LogPrefix << "Received error " << error << " when shutting down socket for DNS"; // in IcmpPinger always gave an error system:9 // (probably EBADF: Bad file descriptor) Socket.close(error); if ( error ) - GlobalLogger.warning() << "Received error " << error + GlobalLogger.warning() << LogPrefix << "Received error " << error << " when closing socket for DNS"; } @@ -98,11 +105,13 @@ void DnsResolver::do_resolve() // check if resolving already if (IsResolving) { - GlobalLogger.info() + GlobalLogger.info() << LogPrefix << "Call to do_resolve ignored since resolving already"; return; } + GlobalLogger.info() << LogPrefix << "start resolving"; + // just to be sure: cancel timers ResolveTimeoutTimer.cancel(); PauseBeforeRetryTimer.cancel(); @@ -135,8 +144,30 @@ void DnsResolver::do_resolve() this, boost::asio::placeholders::error) ); // send dns request - Socket.send_to( boost::asio::buffer(request_buffer.get_array()), - NameServer ); + size_t bytes_sent; + try + { + bytes_sent = Socket.send_to( + boost::asio::buffer(request_buffer.get_array()), + NameServer ); + } + catch (boost::system::system_error &err) + { + GlobalLogger.warning() << LogPrefix + << "Sending of DNS request message failed: " + << err.what(); + handle_unavailable(); + return; + } + + if ( bytes_sent == 0 ) + { + GlobalLogger.warning() << LogPrefix << "Empty DNS request sent!"; + handle_unavailable(); + return; + } + + GlobalLogger.info() << LogPrefix << "resolving under way"; } @@ -145,14 +176,15 @@ void DnsResolver::handle_dns_result(const boost::system::error_code &error, { if ( error == boost::asio::error::operation_aborted ) // cancelled { - GlobalLogger.info() << "DNS resolve operation was cancelled"; + GlobalLogger.info() << LogPrefix + << "DNS resolve operation was cancelled"; bool was_success = false; finalize_resolve(was_success); } else if (error) { - GlobalLogger.info() << "DNS resolve resulted in error " << error - << " --> treat like unavailable"; + GlobalLogger.info() << LogPrefix << "DNS resolve resulted in error " + << error << " --> treat like unavailable"; handle_unavailable(); return; } @@ -176,7 +208,7 @@ void DnsResolver::handle_dns_result(const boost::system::error_code &error, using boost::net::dns::resource_base_t; BOOST_FOREACH( boost::shared_ptr rr_item, *answers ) { - GlobalLogger.debug() << std::showbase << std::hex + GlobalLogger.debug() << LogPrefix << std::showbase << std::hex << static_cast(rr_item->rtype()) << ": "; uint32_t ttl = rr_item->ttl(); boost::net::dns::type_t rr_type = rr_item->rtype(); @@ -185,8 +217,8 @@ void DnsResolver::handle_dns_result(const boost::system::error_code &error, { // 'A' resource records carry IPv4 addresses if (Protocol == DNS_IPv6) { - GlobalLogger.info() << "Ignoring IPv4 address because resolver " - << "was configured to only use IPv6."; + GlobalLogger.info() << LogPrefix << "Ignoring IPv4 address " + << "because resolver was configured to only use IPv6."; continue; } boost::asio::ip::address_v4 ip = @@ -198,8 +230,8 @@ void DnsResolver::handle_dns_result(const boost::system::error_code &error, { // 'AAAA' resource records carry IPv6 addresses if (Protocol == DNS_IPv4) { - GlobalLogger.info() << "Ignoring IPv6 address because resolver " - << "was configured to only use IPv4."; + GlobalLogger.info() << LogPrefix << "Ignoring IPv6 address " + << "because resolver was configured to only use IPv4."; continue; } boost::asio::ip::address_v6 ip = @@ -215,34 +247,35 @@ void DnsResolver::handle_dns_result(const boost::system::error_code &error, result_cnames.push_back( cname ); } else if (rr_type == boost::net::dns::type_ns) - GlobalLogger.debug() << "NS resource"; + GlobalLogger.debug() << LogPrefix << "NS resource"; else if (rr_type == boost::net::dns::type_soa) - GlobalLogger.debug() << "SOA resource"; + GlobalLogger.debug() << LogPrefix << "SOA resource"; else if (rr_type == boost::net::dns::type_ptr) - GlobalLogger.debug() << "ptr resource"; + GlobalLogger.debug() << LogPrefix << "ptr resource"; else if (rr_type == boost::net::dns::type_hinfo) - GlobalLogger.debug() << "hinfo resource"; + GlobalLogger.debug() << LogPrefix << "hinfo resource"; else if (rr_type == boost::net::dns::type_mx) - GlobalLogger.debug() << "mx resource"; + GlobalLogger.debug() << LogPrefix << "mx resource"; else if (rr_type == boost::net::dns::type_txt) - GlobalLogger.debug() << "txt resource"; + GlobalLogger.debug() << LogPrefix << "txt resource"; else if (rr_type == boost::net::dns::type_srv) - GlobalLogger.debug() << "srv resource"; + GlobalLogger.debug() << LogPrefix << "srv resource"; else if (rr_type == boost::net::dns::type_axfr) - GlobalLogger.debug() << "axfr resource"; + GlobalLogger.debug() << LogPrefix << "axfr resource"; else - GlobalLogger.debug() << "unknown resource type"; + GlobalLogger.debug() << LogPrefix << "unknown resource type"; } - GlobalLogger.info() << "Have " << result_ips.size() << " IPs and " - << result_cnames.size() << " CNAMEs"; + GlobalLogger.info() << LogPrefix << "Have " << result_ips.size() + << " IPs and " << result_cnames.size() << " CNAMEs"; // We expect either one single CNAME and no IPs or a list of IPs. // But deal with other cases as well if (result_ips.empty() && result_cnames.empty()) handle_unavailable(); // we just got crap, this is a dead end else if ( !result_ips.empty() && !result_cnames.empty()) - GlobalLogger.warning() << "Have CNAMEs AND IPs --> deal with both!"; + GlobalLogger.warning() << LogPrefix << "Have CNAMEs AND IPs " + << "--> deal with both!"; BOOST_FOREACH( const std::string &cname, result_cnames ) handle_cname(cname); // will schedule another DNS call @@ -301,7 +334,7 @@ void DnsResolver::cname_resolve_callback(const std::string &canonical_name, ResolverBase::update_cache( ResolverBase::get_cached_results(canonical_name) ); else - GlobalLogger.info() << "Cname resolution failed"; + GlobalLogger.info() << LogPrefix << "Cname resolution failed"; finalize_resolve(was_success, cname_count+1); } @@ -319,7 +352,7 @@ void DnsResolver::finalize_resolve(const bool was_success, ResolverBase::schedule_callbacks(was_success, cname_count); // finalize - GlobalLogger.notice() << "Done resolving" + GlobalLogger.notice() << LogPrefix << "Done resolving" << " with success = " << was_success << " and cname_count = " << cname_count; IsResolving = false; @@ -328,7 +361,7 @@ void DnsResolver::finalize_resolve(const bool was_success, void DnsResolver::stop_trying() { // cancel timers - GlobalLogger.debug() << "Cancelling timers"; + GlobalLogger.debug() << LogPrefix << "Cancelling timers"; ResolveTimeoutTimer.cancel(); PauseBeforeRetryTimer.cancel(); StaleDataLongtermTimer.cancel(); @@ -341,17 +374,19 @@ void DnsResolver::handle_resolve_timeout(const boost::system::error_code &error) { if ( error == boost::asio::error::operation_aborted ) // cancelled { - GlobalLogger.warning() << "Resolve timeout timer was cancelled!"; + GlobalLogger.warning() << LogPrefix + << "Resolve timeout timer was cancelled!"; return; } else if (error) { - GlobalLogger.warning() << "resolve timeout handler received error " + GlobalLogger.warning() << LogPrefix + << "resolve timeout handler received error " << error; return; } - GlobalLogger.notice() << "DNS resolving timed out"; + GlobalLogger.notice() << LogPrefix << "DNS resolving timed out"; // increment timer ++RetryCount; @@ -376,13 +411,15 @@ void DnsResolver::wait_timer_timeout_handler( const boost::system::error_code &error) { if ( error == boost::asio::error::operation_aborted ) // cancelled - GlobalLogger.warning() << "Resolve timeout timer was cancelled!"; + GlobalLogger.warning() << LogPrefix + << "Resolve timeout timer was cancelled!"; else if (error) - GlobalLogger.warning() << "resolve timeout handler received error " + GlobalLogger.warning() << LogPrefix + << "resolve timeout handler received error " << error; else { - GlobalLogger.info() << "Done waiting --> re-try resolve"; + GlobalLogger.info() << LogPrefix << "Done waiting --> re-try resolve"; do_resolve(); } } diff --git a/src/dns/dnsresolver.h b/src/dns/dnsresolver.h index d622c47..a75ea7f 100644 --- a/src/dns/dnsresolver.h +++ b/src/dns/dnsresolver.h @@ -90,6 +90,7 @@ private: std::size_t NextIpIndex; int RetryCount; bool IsResolving; + std::string LogPrefix; }; #endif diff --git a/test/test_configurationoptions.cpp b/test/test_configurationoptions.cpp index f545c59..5551f6b 100644 --- a/test/test_configurationoptions.cpp +++ b/test/test_configurationoptions.cpp @@ -122,7 +122,7 @@ BOOST_AUTO_TEST_CASE( get_configuration_options ) // if this assert fails, you must add or remove one of the options in the // test below. Will probably find them all in // src/config/configurationoptions.cpp constructor - BOOST_CHECK_EQUAL( options.size(), 16 ); + BOOST_CHECK_EQUAL( options.size(), 17 ); BOOST_CHECK_EQUAL( option_present( options, "hosts-down-limit" ), true ); BOOST_CHECK_EQUAL( option_present( options, "link-down-interval" ), true ); @@ -134,6 +134,7 @@ BOOST_AUTO_TEST_CASE( get_configuration_options ) BOOST_CHECK_EQUAL( option_present( options, "ping-reply-timeout" ), true ); BOOST_CHECK_EQUAL( option_present( options, "max-address-resolution-attempts" ), true ); BOOST_CHECK_EQUAL( option_present( options, "resolved-ip-ttl-threshold" ), true ); + BOOST_CHECK_EQUAL( option_present( options, "dns-cache-file" ), true ); BOOST_CHECK_EQUAL( option_present( options, "ratio-random-hosts" ), true ); BOOST_CHECK_EQUAL( option_present( options, "host.name" ), true ); BOOST_CHECK_EQUAL( option_present( options, "host.port" ), true ); -- 1.7.1