started experimenting with DnsResolver; does send stuff but has not received anything yet
authorChristian Herdtweck <christian.herdtweck@intra2net.com>
Fri, 10 Apr 2015 16:34:30 +0000 (18:34 +0200)
committerChristian Herdtweck <christian.herdtweck@intra2net.com>
Mon, 4 May 2015 14:57:57 +0000 (16:57 +0200)
src/dns/dnscache.cpp
src/dns/dnsresolver.cpp
src/dns/dnsresolver.h
test/test_configurationoptions.cpp

index 23f2152..d180a89 100644 (file)
@@ -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();
 
index 71a79dc..c215b77 100644 (file)
@@ -27,6 +27,7 @@
 #include "dns/dnsresolver.h"
 
 #include <stdint.h>
+#include <sstream>
 
 #include <boost/foreach.hpp>
 #include <boost/bind.hpp>
@@ -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<resource_base_t> rr_item, *answers )
     {
-        GlobalLogger.debug() << std::showbase << std::hex
+        GlobalLogger.debug() << LogPrefix << std::showbase << std::hex
                              << static_cast<unsigned>(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();
     }
 }
index d622c47..a75ea7f 100644 (file)
@@ -90,6 +90,7 @@ private:
     std::size_t NextIpIndex;
     int RetryCount;
     bool IsResolving;
+    std::string LogPrefix;
 };
 
 #endif
index f545c59..5551f6b 100644 (file)
@@ -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 );