- The protocols must be separated by comma, like ping-protocol=ICMP,ICMPv6.
Host::Host( string address ) :
Address( address ),
Port( 0 ),
- Protocol( PingProtocol_ICMP ),
+ ProtocolList(),
IntervalInSec( 0 )
{
}
}
/**
- * @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;
}
/**
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 );
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;
#include "config/option/hostpingprotocoloption.h"
+#include <iostream>
+#include <sstream>
#include <string>
#include <boost/assert.hpp>
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;
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;
+}
#include <boost/program_options.hpp>
#include "config/option/hostconfigurationoption.h"
+#include "host/pingprotocol.h"
//-----------------------------------------------------------------------------
// HostPingProtocolOption
Configuration *configuration
);
+private:
+ PingProtocolList parse_protocol_list(
+ const std::string &protocol_list_string
+ ) const;
+
};
#endif // HOST_PING_PROTOCOL_OPTION_H
BOOST_AUTO_TEST_CASE( normal_options )
{
- const int argc = 18;
+ const int argc = 22;
const char *argv[argc] = {
"./pingcheck",
"--daemon",
"--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;
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 )
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 );
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()
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;
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 )