From 8ef29e4afcd7ec56b58f2554fccda3e921ac1fc3 Mon Sep 17 00:00:00 2001 From: Guilherme Maciel Ferreira Date: Wed, 20 Apr 2011 11:32:14 +0200 Subject: [PATCH] Implemented feature: Program runs as daemon --- src/config/configuration.cpp | 11 +++++++++++ src/config/configuration.h | 4 ++++ src/config/configurationreader.cpp | 30 ++++++++++++++++++++---------- src/config/configurationreader.h | 10 ++++++---- src/main.cpp | 7 +++++++ 5 files changed, 48 insertions(+), 14 deletions(-) diff --git a/src/config/configuration.cpp b/src/config/configuration.cpp index 29937e7..b7f7c5e 100644 --- a/src/config/configuration.cpp +++ b/src/config/configuration.cpp @@ -9,6 +9,7 @@ using namespace std; //----------------------------------------------------------------------------- Configuration::Configuration() : + Daemon( false ), ConfigFileName( "" ), SourceNetworkInterface( "" ), NameServer( "" ), @@ -30,6 +31,16 @@ Configuration::~Configuration() { } +bool Configuration::get_daemon() const +{ + return Daemon; +} + +void Configuration::set_daemon( bool daemon ) +{ + Daemon = daemon; +} + string Configuration::get_config_file_name() const { return ConfigFileName; diff --git a/src/config/configuration.h b/src/config/configuration.h index 4255a0f..4af5c32 100644 --- a/src/config/configuration.h +++ b/src/config/configuration.h @@ -18,6 +18,9 @@ public: Configuration(); virtual ~Configuration(); + bool get_daemon() const; + void set_daemon( bool daemon ); + std::string get_config_file_name() const; void set_config_file_name( const std::string &config_file_name ); @@ -45,6 +48,7 @@ public: void set_hosts( const std::vector &hosts_list ); private: + bool Daemon; std::string ConfigFileName; std::string SourceNetworkInterface; std::string NameServer; diff --git a/src/config/configurationreader.cpp b/src/config/configurationreader.cpp index d59d530..2172da6 100644 --- a/src/config/configurationreader.cpp +++ b/src/config/configurationreader.cpp @@ -20,10 +20,12 @@ using boost::program_options::variables_map; ConfigurationReader::ConfigurationReader() : Config(), - VersionCmdStr( "version" ), - VersionCmdDesc( "Print the version string and exit." ), HelpCmdStr( "help" ), HelpCmdDesc( "Print this help and exit." ), + VersionCmdStr( "version" ), + VersionCmdDesc( "Print the version string and exit." ), + DaemonCmdStr( "daemon" ), + DaemonCmdDesc( "Run the program as a deamon." ), DefaultConfigFileName( "pingcheck.conf" ), ConfigFileCmdStr( "config-file" ), ConfigFileCmdDesc( "Name of the configuration file." ), @@ -84,8 +86,9 @@ options_description ConfigurationReader::get_generic_options() const { options_description options( "Generic options" ); options.add_options() - ( VersionCmdStr.c_str(), VersionCmdDesc.c_str() ) ( HelpCmdStr.c_str(), HelpCmdDesc.c_str() ) + ( VersionCmdStr.c_str(), VersionCmdDesc.c_str() ) + ( DaemonCmdStr.c_str(), DaemonCmdDesc.c_str() ) ( ConfigFileCmdStr.c_str(), value()->default_value( DefaultConfigFileName ), ConfigFileCmdDesc.c_str() ) ; @@ -96,7 +99,8 @@ bool ConfigurationReader::is_generic_options( const variables_map &vm ) const { bool is_help = ( vm.count( HelpCmdStr ) > 0 ); bool is_version = ( vm.count( VersionCmdStr ) > 0 ); - bool is_a_generic_option = is_help || is_version; + bool is_daemon = ( vm.count( DaemonCmdStr ) > 0 ); + bool is_a_generic_option = is_help || is_version || is_daemon; return is_a_generic_option; } @@ -104,17 +108,25 @@ bool ConfigurationReader::is_generic_options( const variables_map &vm ) const bool ConfigurationReader::parse_generic_options( const variables_map& vm, const options_description& visible_options -) const +) { + // TODO how to make clear that returning false makes the application abort + // and returning true lets it continue processing the configuration file? if ( vm.count( HelpCmdStr ) ) { cout << visible_options << endl; - return true; + return false; } if ( vm.count( VersionCmdStr ) ) { cout << PROJECT_NAME << " version " << VERSION_STRING << endl; + return false; + } + + if ( vm.count( DaemonCmdStr ) ) + { + Config.set_daemon( true ); return true; } @@ -260,7 +272,7 @@ bool ConfigurationReader::process_command_line( const int argc, char *argv[], variables_map &vm -) const +) { try { @@ -283,9 +295,7 @@ bool ConfigurationReader::process_command_line( if ( is_generic_options( vm ) ) { - (void) parse_generic_options( vm, visible ); - - return false; + return parse_generic_options( vm, visible ); } } diff --git a/src/config/configurationreader.h b/src/config/configurationreader.h index 4aa5b9c..1206453 100644 --- a/src/config/configurationreader.h +++ b/src/config/configurationreader.h @@ -31,7 +31,7 @@ private: bool parse_generic_options( const boost::program_options::variables_map &vm, const boost::program_options::options_description &visible_options - ) const; + ); boost::program_options::options_description get_configuration_options() const; bool parse_configuration_options( @@ -42,7 +42,7 @@ private: const int argc, char *argv[], boost::program_options::variables_map &vm - ) const; + ); bool process_configuration_file( boost::program_options::variables_map &vm ); @@ -54,10 +54,12 @@ private: private: Configuration Config; - const std::string VersionCmdStr; - const std::string VersionCmdDesc; const std::string HelpCmdStr; const std::string HelpCmdDesc; + const std::string VersionCmdStr; + const std::string VersionCmdDesc; + const std::string DaemonCmdStr; + const std::string DaemonCmdDesc; const std::string DefaultConfigFileName; const std::string ConfigFileCmdStr; const std::string ConfigFileCmdDesc; diff --git a/src/main.cpp b/src/main.cpp index b0d7c75..5a1a82e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,6 +5,8 @@ #include #include +#include "daemonfunc.hpp" + #include "config/configurationreader.h" #include "config/host.h" #include "link/linkstatusanalyzer.h" @@ -25,6 +27,11 @@ int main( int argc, char* argv[] ) Configuration config = config_reader.get_configuration(); + bool daemon_mode = config.get_daemon(); + if ( daemon_mode ) + { + I2n::Daemon::daemonize(); + } int ping_fail_limit = config.get_ping_fail_limit(); int link_up_interval_in_min = config.get_link_up_interval_in_min(); -- 1.7.1