Declared all non member manipulating methods as const, so compiler can optimize.
[bpdyndnsd] / src / updater.cpp
1 /** @file
2  * @brief The updater class implementation. This class implements the updater logic.
3  *
4  *
5  *
6  * @copyright Intra2net AG
7  * @license GPLv2
8 */
9
10 #include "updater.h"
11
12 #include <boost/foreach.hpp>
13
14 using namespace std;
15
16 /**
17  * Default constructor which initializes the member Conf.
18  */
19 Updater::Updater()
20 {
21     // Initialize program wide Logger, at this point we don't know where to log and with which loglevel.
22     Logger::Ptr _log(new Logger);
23     Log = _log;
24
25     // initialize Config
26     Config::Ptr _config(new Config(Log));
27     Conf = _config;
28 }
29
30
31 /**
32  * Default destructor.
33  */
34 Updater::~Updater()
35 {
36 }
37
38
39 /**
40  * Parse the command line arguments and initialize corresponding options.
41  * @param argc Number command line arguments.
42  * @param argv[] Array with arguments.
43  * @return 0 if cmd options successfully parsed, 1 if usage or version.
44  */
45 int Updater::init_config_from_cmd(int argc, char *argv[])
46 {
47     // Load the command line parameters
48     if( Conf->parse_cmd_line( argc, argv ) != 0)
49         return -1;
50
51     // If we have loaded the cmd options we need to init the log facility immediately in case debugging is enabled from cmd.
52     init_log_facility();
53
54     // successful parsed
55     Log->print_cmd_parsed();
56     return 0;
57 }
58
59
60 /**
61  * Load the main config and the service definition files in config path.
62  * @return 0 if all is fine, 
63  */
64 int Updater::init_config_from_files()
65 {
66     // Load the main and service config files in config path
67     if ( Conf->load_config_from_files() != 0 )
68         return -1;
69
70     // Re-init log facility, perhaps new config file options for logger are set.
71     // These config file options will only overwrite the cmd options if the SIGHUP (reload config) is caught.
72     init_log_facility();
73
74     // Here we are. All Service Objects should be initialized, so it is time to deserialize the old service objects and compare them.
75     if ( Conf->deserialize_services() != 0 )
76         return -1;
77
78     // successful loaded
79     Log->print_conf_files_parsed();
80     return 0;
81 }
82
83
84 /**
85  * Getter for member Config.
86  * @return Member Config.
87  */
88 Config::Ptr Updater::get_config() const
89 {
90     return Conf;
91 }
92
93
94 /**
95  * Getter for member Logger.
96  * @return Member Logger.
97  */
98 Logger::Ptr Updater::get_logger() const
99 {
100     return Log;
101 }
102
103
104 /**
105  * Reloading the config. Delete all Service objects and then init new Service objects from config files.
106  */
107 int Updater::reload_config()
108 {
109     // serialize all service objects
110     if ( Conf->serialize_services() != 0 )
111         return -1;
112
113     // delete all service objects
114     Conf->delete_services();
115
116     // delete the actual Variables_map, perhaps with old cmd options which would overwrite new config file options.
117     Conf->delete_variables_map();
118
119     // load only config files
120     if ( init_config_from_files() != 0 )
121         return -1;
122
123     return 0;
124 }
125
126
127 /**
128  * Initialize the logging facility with loglevel and syslog.
129  */
130 void Updater::init_log_facility()
131 {
132     Log->set_log_facility(Conf->get_loglevel(),Conf->get_syslog());
133     Log->print_init_log_facility();
134 }
135
136
137 /**
138  * Update all configured services.
139  */
140 void Updater::update_services()
141 {
142     list<Service::Ptr> services = this->Conf->get_services();
143
144     string ip = "192.168.1.1";
145
146     BOOST_FOREACH(Service::Ptr &service, services )
147     {
148         // TODO: only update if IP differs.
149         service->update(ip);
150     }
151 }