From: Guilherme Maciel Ferreira Date: Sat, 25 Feb 2012 16:30:51 +0000 (-0200) Subject: The configuration supports more than one protocol per host. X-Git-Tag: v1.5~1^2~29 X-Git-Url: http://developer.intra2net.com/git/?a=commitdiff_plain;h=47f51204ab2db7505718d55b22efa7139ed0d0ec;p=pingcheck The configuration supports more than one protocol per host. - The protocols must be separated by comma, like ping-protocol=ICMP,ICMPv6. --- diff --git a/src/config/host.cpp b/src/config/host.cpp index 9757205..5bb0bd9 100644 --- a/src/config/host.cpp +++ b/src/config/host.cpp @@ -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; } /** diff --git a/src/config/host.h b/src/config/host.h index 7f59aff..8e5969f 100644 --- a/src/config/host.h +++ b/src/config/host.h @@ -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; diff --git a/src/config/option/hostpingprotocoloption.cpp b/src/config/option/hostpingprotocoloption.cpp index ff690c1..aac7025 100644 --- a/src/config/option/hostpingprotocoloption.cpp +++ b/src/config/option/hostpingprotocoloption.cpp @@ -20,6 +20,8 @@ #include "config/option/hostpingprotocoloption.h" +#include +#include #include #include @@ -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; +} diff --git a/src/config/option/hostpingprotocoloption.h b/src/config/option/hostpingprotocoloption.h index 5f5a2f6..a920318 100644 --- a/src/config/option/hostpingprotocoloption.h +++ b/src/config/option/hostpingprotocoloption.h @@ -24,6 +24,7 @@ #include #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 diff --git a/test/test_configurationcommandline.cpp b/test/test_configurationcommandline.cpp index 127e781..9400c9c 100644 --- a/test/test_configurationcommandline.cpp +++ b/test/test_configurationcommandline.cpp @@ -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 ) diff --git a/test/test_configurationfile.cpp b/test/test_configurationfile.cpp index 6367f40..f4f249c 100644 --- a/test/test_configurationfile.cpp +++ b/test/test_configurationfile.cpp @@ -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() diff --git a/test/test_configurationoptions.cpp b/test/test_configurationoptions.cpp index 4ed317c..0fecaf7 100644 --- a/test/test_configurationoptions.cpp +++ b/test/test_configurationoptions.cpp @@ -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 )