Implemented feature: Program runs as daemon
authorGuilherme Maciel Ferreira <guilherme.maciel.ferreira@intra2net.com>
Wed, 20 Apr 2011 09:32:14 +0000 (11:32 +0200)
committerGuilherme Maciel Ferreira <guilherme.maciel.ferreira@intra2net.com>
Wed, 20 Apr 2011 09:32:14 +0000 (11:32 +0200)
src/config/configuration.cpp
src/config/configuration.h
src/config/configurationreader.cpp
src/config/configurationreader.h
src/main.cpp

index 29937e7..b7f7c5e 100644 (file)
@@ -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;
index 4255a0f..4af5c32 100644 (file)
@@ -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<HostItem> &hosts_list );
 
 private:
+    bool Daemon;
     std::string ConfigFileName;
     std::string SourceNetworkInterface;
     std::string NameServer;
index d59d530..2172da6 100644 (file)
@@ -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<string>()->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 );
         }
 
     }
index 4aa5b9c..1206453 100644 (file)
@@ -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;
index b0d7c75..5a1a82e 100644 (file)
@@ -5,6 +5,8 @@
 #include <boost/foreach.hpp>
 #include <boost/shared_ptr.hpp>
 
+#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();