The configuration supports more than one protocol per host.
authorGuilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com>
Sat, 25 Feb 2012 16:30:51 +0000 (14:30 -0200)
committerGuilherme Maciel Ferreira <guilherme.maciel.ferreira@gmail.com>
Sat, 25 Feb 2012 16:34:31 +0000 (14:34 -0200)
- The protocols must be separated by comma, like ping-protocol=ICMP,ICMPv6.

src/config/host.cpp
src/config/host.h
src/config/option/hostpingprotocoloption.cpp
src/config/option/hostpingprotocoloption.h
test/test_configurationcommandline.cpp
test/test_configurationfile.cpp
test/test_configurationoptions.cpp

index 9757205..5bb0bd9 100644 (file)
@@ -37,7 +37,7 @@ using namespace std;
 Host::Host( string address ) :
     Address( address ),
     Port( 0 ),
-    Protocol( PingProtocol_ICMP ),
+    ProtocolList(),
     IntervalInSec( 0 )
 {
 }
@@ -86,21 +86,23 @@ void Host::set_port( const uint16_t port )
 }
 
 /**
- * @return The protocol used to ping this host.
+ * @return The list of protocols used to ping this host.
  */
-PingProtocol Host::get_ping_protocol() const
+PingProtocolList Host::get_ping_protocol_list() const
 {
-    return Protocol;
+    return ProtocolList;
 }
 
 /**
- * @param ping_protocol The protocol to be used to ping this host.
+ * @param ping_protocol The list of protocols to be used to ping this host.
  */
-void Host::set_ping_protocol( const PingProtocol ping_protocol )
+void Host::set_ping_protocol_list( const PingProtocolList &ping_protocol_list )
 {
-    BOOST_ASSERT( ( PingProtocol_First <= ping_protocol ) && ( ping_protocol <= PingProtocol_Last ) );
+    BOOST_ASSERT( 0 < ping_protocol_list.size() );
+    BOOST_ASSERT( (PingProtocol_First <= ping_protocol_list.front()) && (ping_protocol_list.front() <= PingProtocol_Last) );
+    BOOST_ASSERT( (PingProtocol_First <= ping_protocol_list.back()) && (ping_protocol_list.back() <= PingProtocol_Last) );
 
-    this->Protocol = ping_protocol;
+    this->ProtocolList = ping_protocol_list;
 }
 
 /**
index 7f59aff..8e5969f 100644 (file)
@@ -48,8 +48,8 @@ public:
     uint16_t get_port() const;
     void set_port( const uint16_t port );
 
-    PingProtocol get_ping_protocol() const;
-    void set_ping_protocol( const PingProtocol ping_protocol );
+    PingProtocolList get_ping_protocol_list() const;
+    void set_ping_protocol_list( const PingProtocolList &ping_protocol );
 
     int get_interval_in_sec() const;
     void set_interval_in_sec( const int interval_in_sec );
@@ -59,8 +59,8 @@ private:
     std::string Address;
     /// The port of the host
     uint16_t Port;
-    /// The protocol to ping
-    PingProtocol Protocol;
+    /// The list of protocols used to ping
+    PingProtocolList ProtocolList;
     /// The interval between each ping to the host
     int IntervalInSec;
 
index ff690c1..aac7025 100644 (file)
@@ -20,6 +20,8 @@
 
 #include "config/option/hostpingprotocoloption.h"
 
+#include <iostream>
+#include <sstream>
 #include <string>
 
 #include <boost/assert.hpp>
@@ -70,17 +72,17 @@ bool HostPingProtocolOption::parse(
 
         BOOST_ASSERT( hosts_count >= hosts_protocols_count );
 
-        BOOST_FOREACH( string protocol_string, hosts_protocols_list )
+        BOOST_FOREACH( string protocols_string, hosts_protocols_list )
         {
-            BOOST_ASSERT( !protocol_string.empty() );
+            BOOST_ASSERT( !protocols_string.empty() );
 
             HostItem host_item = *hosts_list_iterator;
-            PingProtocol host_protocol = get_ping_protocol_from_string( protocol_string );
-            host_item->set_ping_protocol( host_protocol );
+            PingProtocolList host_protocols = parse_protocol_list( protocols_string );
+            host_item->set_ping_protocol_list( host_protocols );
             ++hosts_list_iterator;
 
             GlobalLogger.info() << get_command_string() << "="
-                    << protocol_string << endl;
+                    << protocols_string << endl;
         }
 
         parsed_success = true;
@@ -92,3 +94,30 @@ bool HostPingProtocolOption::parse(
 
     return parsed_success;
 }
+
+PingProtocolList HostPingProtocolOption::parse_protocol_list(
+        const std::string &protocol_list_string
+) const
+{
+    BOOST_ASSERT( !protocol_list_string.empty() );
+
+    PingProtocolList protocol_list;
+    string protocol_string;
+    istringstream iss( protocol_list_string );
+
+    while ( getline( iss, protocol_string, ',' ) )
+    {
+        BOOST_ASSERT( !protocol_string.empty());
+
+        PingProtocol protocol = get_ping_protocol_from_string( protocol_string );
+        protocol_list.push_back( protocol );
+
+        GlobalLogger.debug() << "- " << protocol_string;
+
+        BOOST_ASSERT( ( PingProtocol_First <= protocol ) && ( protocol <= PingProtocol_Last ) );
+    }
+
+    BOOST_ASSERT( 0 < protocol_list.size() );
+
+    return protocol_list;
+}
index 5f5a2f6..a920318 100644 (file)
@@ -24,6 +24,7 @@
 #include <boost/program_options.hpp>
 
 #include "config/option/hostconfigurationoption.h"
+#include "host/pingprotocol.h"
 
 //-----------------------------------------------------------------------------
 // HostPingProtocolOption
@@ -43,6 +44,11 @@ public:
             Configuration *configuration
     );
 
+private:
+    PingProtocolList parse_protocol_list(
+            const std::string &protocol_list_string
+    ) const;
+
 };
 
 #endif // HOST_PING_PROTOCOL_OPTION_H
index 127e781..9400c9c 100644 (file)
@@ -32,7 +32,7 @@ BOOST_AUTO_TEST_SUITE( TestConfigurationCommandLine )
 
 BOOST_AUTO_TEST_CASE( normal_options )
 {
-    const int argc = 18;
+    const int argc = 22;
     const char *argv[argc] = {
         "./pingcheck",
         "--daemon",
@@ -54,6 +54,11 @@ BOOST_AUTO_TEST_CASE( normal_options )
         "--host.port=25",
         "--host.interval=1000",
         "--host.ping-protocol=ICMP",
+        // 3rd host
+        "--host.name=www.kernel.org",
+        "--host.port=80",
+        "--host.interval=1000",
+        "--host.ping-protocol=ICMP,ICMPv6",
     };
     boost::program_options::variables_map vm;
     Configuration config;
@@ -75,17 +80,26 @@ BOOST_AUTO_TEST_CASE( normal_options )
     BOOST_CHECK_EQUAL( config.get_link_up_interval_in_min(), 10 );
     BOOST_CHECK_EQUAL( config.get_link_down_interval_in_min(), 10 );
 
-    BOOST_CHECK_EQUAL( config.get_hosts().size(), 2 );
+    BOOST_CHECK_EQUAL( config.get_hosts().size(), 3 );
     HostItem host1 = config.get_hosts().at(0);
     BOOST_CHECK_EQUAL( host1->get_address(), "www.intra2net.com" );
     BOOST_CHECK_EQUAL( host1->get_port(), 80 );
     BOOST_CHECK_EQUAL( host1->get_interval_in_sec(), 4000 );
-    BOOST_CHECK_EQUAL( host1->get_ping_protocol(), PingProtocol_TCP );
+    BOOST_CHECK_EQUAL( host1->get_ping_protocol_list().size(), 1 );
+    BOOST_CHECK_EQUAL( host1->get_ping_protocol_list().front(), PingProtocol_TCP );
     HostItem host2 = config.get_hosts().at(1);
     BOOST_CHECK_EQUAL( host2->get_address(), "www.ufsc.br" );
     BOOST_CHECK_EQUAL( host2->get_port(), 25 );
     BOOST_CHECK_EQUAL( host2->get_interval_in_sec(), 1000 );
-    BOOST_CHECK_EQUAL( host2->get_ping_protocol(), PingProtocol_ICMP );
+    BOOST_CHECK_EQUAL( host2->get_ping_protocol_list().size(), 1 );
+    BOOST_CHECK_EQUAL( host2->get_ping_protocol_list().front(), PingProtocol_ICMP );
+    HostItem host3 = config.get_hosts().at(2);
+    BOOST_CHECK_EQUAL( host3->get_address(), "www.kernel.org" );
+    BOOST_CHECK_EQUAL( host3->get_port(), 80 );
+    BOOST_CHECK_EQUAL( host3->get_interval_in_sec(), 1000 );
+    BOOST_CHECK_EQUAL( host3->get_ping_protocol_list().size(), 2 );
+    BOOST_CHECK_EQUAL( host3->get_ping_protocol_list().front(), PingProtocol_ICMP );
+    BOOST_CHECK_EQUAL( host3->get_ping_protocol_list().back(), PingProtocol_ICMPv6 );
 }
 
 BOOST_AUTO_TEST_CASE( version_option )
index 6367f40..f4f249c 100644 (file)
@@ -61,6 +61,12 @@ BOOST_AUTO_TEST_CASE( normal_options )
     file << "port=25\n";
     file << "interval=1000\n";
     file << "ping-protocol=ICMP\n";
+    // 3rd host
+    file << "[host]\n";
+    file << "name=www.kernel.org\n";
+    file << "port=80\n";
+    file << "interval=1000\n";
+    file << "ping-protocol=TCP,TCP_IPv6\n";
     file.close();
 
     ConfigurationFile configuration_file( file_name );
@@ -78,17 +84,26 @@ BOOST_AUTO_TEST_CASE( normal_options )
     BOOST_CHECK_EQUAL( config.get_link_up_interval_in_min(), 10 );
     BOOST_CHECK_EQUAL( config.get_link_down_interval_in_min(), 10 );
 
-    BOOST_CHECK_EQUAL( config.get_hosts().size(), 2 );
+    BOOST_CHECK_EQUAL( config.get_hosts().size(), 3 );
     HostItem host1 = config.get_hosts().at(0);
     BOOST_CHECK_EQUAL( host1->get_address(), "www.intra2net.com" );
     BOOST_CHECK_EQUAL( host1->get_port(), 80 );
     BOOST_CHECK_EQUAL( host1->get_interval_in_sec(), 4000 );
-    BOOST_CHECK_EQUAL( host1->get_ping_protocol(), PingProtocol_TCP );
+    BOOST_CHECK_EQUAL( host1->get_ping_protocol_list().size(), 1 );
+    BOOST_CHECK_EQUAL( host1->get_ping_protocol_list().front(), PingProtocol_TCP );
     HostItem host2 = config.get_hosts().at(1);
     BOOST_CHECK_EQUAL( host2->get_address(), "www.ufsc.br" );
     BOOST_CHECK_EQUAL( host2->get_port(), 25 );
     BOOST_CHECK_EQUAL( host2->get_interval_in_sec(), 1000 );
-    BOOST_CHECK_EQUAL( host2->get_ping_protocol(), PingProtocol_ICMP );
+    BOOST_CHECK_EQUAL( host2->get_ping_protocol_list().size(), 1 );
+    BOOST_CHECK_EQUAL( host2->get_ping_protocol_list().front(), PingProtocol_ICMP );
+    HostItem host3 = config.get_hosts().at(2);
+    BOOST_CHECK_EQUAL( host3->get_address(), "www.kernel.org" );
+    BOOST_CHECK_EQUAL( host3->get_port(), 80 );
+    BOOST_CHECK_EQUAL( host3->get_interval_in_sec(), 1000 );
+    BOOST_CHECK_EQUAL( host3->get_ping_protocol_list().size(), 2 );
+    BOOST_CHECK_EQUAL( host3->get_ping_protocol_list().front(), PingProtocol_TCP );
+    BOOST_CHECK_EQUAL( host3->get_ping_protocol_list().back(), PingProtocol_TCP_IPv6 );
 }
 
 BOOST_AUTO_TEST_SUITE_END()
index 4ed317c..0fecaf7 100644 (file)
@@ -202,6 +202,16 @@ BOOST_AUTO_TEST_CASE( parse_hosts_options )
     hosts_ports.push_back( 64 );
     hosts_ping_protocols.push_back( "TCP_IPv6" );
     hosts_intervals.push_back( 74 );
+    // host 5
+    hosts_names.push_back( "www.kernel.org" );
+    hosts_ports.push_back( 64 );
+    hosts_ping_protocols.push_back( "TCP,ICMP" );
+    hosts_intervals.push_back( 75 );
+    // host 6
+    hosts_names.push_back( "www.linux.com" );
+    hosts_ports.push_back( 64 );
+    hosts_ping_protocols.push_back( "ICMPv6,TCP_IPv6" );
+    hosts_intervals.push_back( 76 );
 
     ConfigurationOptions config_options;
     Configuration configuration;
@@ -217,26 +227,42 @@ BOOST_AUTO_TEST_CASE( parse_hosts_options )
      HostItem host1 = configuration.get_hosts().at(0);
     BOOST_CHECK_EQUAL( host1->get_address(), "www.fazenda.gov.br" );
     BOOST_CHECK_EQUAL( host1->get_port(), 61 );
-    BOOST_CHECK_EQUAL( host1->get_ping_protocol(), PingProtocol_TCP );
+    BOOST_CHECK_EQUAL( host1->get_ping_protocol_list().front(), PingProtocol_TCP );
     BOOST_CHECK_EQUAL( host1->get_interval_in_sec(), 71 );
     // host 2
      HostItem host2 = configuration.get_hosts().at(1);
     BOOST_CHECK_EQUAL( host2->get_address(), "www.intra2net.de" );
     BOOST_CHECK_EQUAL( host2->get_port(), 62 );
-    BOOST_CHECK_EQUAL( host2->get_ping_protocol(), PingProtocol_ICMP );
+    BOOST_CHECK_EQUAL( host2->get_ping_protocol_list().front(), PingProtocol_ICMP );
     BOOST_CHECK_EQUAL( host2->get_interval_in_sec(), 72 );
     // host 3
      HostItem host3 = configuration.get_hosts().at(2);
     BOOST_CHECK_EQUAL( host3->get_address(), "www.ufsc.br" );
     BOOST_CHECK_EQUAL( host3->get_port(), 63 );
-    BOOST_CHECK_EQUAL( host3->get_ping_protocol(), PingProtocol_ICMPv6 );
+    BOOST_CHECK_EQUAL( host3->get_ping_protocol_list().front(), PingProtocol_ICMPv6 );
     BOOST_CHECK_EQUAL( host3->get_interval_in_sec(), 73 );
     // host 4
-     HostItem host4 = configuration.get_hosts().at(3);
+    HostItem host4 = configuration.get_hosts().at(3);
     BOOST_CHECK_EQUAL( host4->get_address(), "www.google.com" );
     BOOST_CHECK_EQUAL( host4->get_port(), 64 );
-    BOOST_CHECK_EQUAL( host4->get_ping_protocol(), PingProtocol_TCP_IPv6 );
+    BOOST_CHECK_EQUAL( host4->get_ping_protocol_list().front(), PingProtocol_TCP_IPv6 );
     BOOST_CHECK_EQUAL( host4->get_interval_in_sec(), 74 );
+    // host 5
+    HostItem host5 = configuration.get_hosts().at(4);
+    BOOST_CHECK_EQUAL( host5->get_address(), "www.kernel.org" );
+    BOOST_CHECK_EQUAL( host5->get_port(), 64 );
+    BOOST_CHECK_EQUAL( host5->get_ping_protocol_list().size(), 2 );
+    BOOST_CHECK_EQUAL( host5->get_ping_protocol_list().front(), PingProtocol_TCP );
+    BOOST_CHECK_EQUAL( host5->get_ping_protocol_list().back(), PingProtocol_ICMP );
+    BOOST_CHECK_EQUAL( host5->get_interval_in_sec(), 75 );
+    // host 6
+    HostItem host6 = configuration.get_hosts().at(5);
+    BOOST_CHECK_EQUAL( host6->get_address(), "www.linux.com" );
+    BOOST_CHECK_EQUAL( host6->get_port(), 64 );
+    BOOST_CHECK_EQUAL( host6->get_ping_protocol_list().size(), 2 );
+    BOOST_CHECK_EQUAL( host6->get_ping_protocol_list().front(), PingProtocol_ICMPv6 );
+    BOOST_CHECK_EQUAL( host6->get_ping_protocol_list().back(), PingProtocol_TCP_IPv6 );
+    BOOST_CHECK_EQUAL( host6->get_interval_in_sec(), 76 );
 }
 
 BOOST_AUTO_TEST_CASE( halt_on_generic_options )