Added doxygen comments and changed member names.
[bpdyndnsd] / src / config.cpp
1 /** @file
2  * @brief Config class implementation. This class represents the actual configuration.
3  *
4  *
5  *
6  * @copyright Intra2net AG
7  * @license GPLv2
8 */
9
10 #include "config.h"
11
12 /**
13  * Default Constructor. Available command line arguments with their default values are defined here.
14  */
15 Config::Config()
16     : Daemon_mode(true)
17     , Loglevel(0)
18     , Syslog(true)
19 {
20     // Define valid command line parameters
21     Opt_desc_cmd = new po::options_description("Command line options");
22     Opt_desc_cmd->add_options()
23         ("help,?","Show help.")
24         ("version,v","Show version.")
25         ("protocol,q",po::value<string>(),"Set the service protocol type.")
26         ("host,h",po::value<string>(),"Set the hostname to update.")
27         ("login,l",po::value<string>(),"Set the login.")
28         ("password,p",po::value<string>(),"Set the password.")
29     ;
30
31     // Define valid config file main section parameters
32     Opt_desc_conf_main = new po::options_description("Config file main section options");
33     Opt_desc_conf_main->add_options()
34         ("main.daemon_mode",po::value<bool>()->default_value(false),"Run as system daemon.")
35         ("main.logfile",po::value<string>()->default_value("/var/log/bpdyndns.log"),"Where to log.")
36         ("main.loglevel",po::value<int>()->default_value(0),"Loglevel.")
37         ("main.syslog",po::value<bool>()->default_value(false),"Use syslog facility.")
38     ;
39
40     // Define valid config file main section parameters
41     Opt_desc_conf_service = new po::options_description("Config file service section options");
42     Opt_desc_conf_service->add_options()
43         ("service.protocol",po::value<string>(),"The service protocol.")
44         ("service.host",po::value<string>(),"The hostname to update.")
45         ("service.login",po::value<string>(),"Login name.")
46         ("service.password",po::value<string>(),"Corresponding password.")
47     ;
48 }
49
50
51 /**
52  * Default Destructor
53  */
54 Config::~Config()
55 {
56     delete Opt_desc_cmd;
57     delete Opt_desc_conf_main;
58     delete Opt_desc_conf_service;
59 }
60
61
62 /**
63  * Parses the command line arguments and does the needed actions.
64  * @param argc Command line argument number given to main.
65  * @param argv[] Pointer to command line argument array given to main.
66  * @return 0 if all is fine,
67  */
68 int Config::parse_cmd_line(int argc, char *argv[])
69 {
70     try
71     {
72         po::variables_map vm;
73         po::store(po::parse_command_line(argc, argv, *this->Opt_desc_cmd), vm);
74         po::notify(vm);
75
76         if(vm.count("help"))
77             return 1;
78         else if(vm.count("version"))
79             return 2;
80
81         // Are all needed options set to create a Service Object
82         if(vm.count("protocol") && vm.count("host") && vm.count("login") && vm.count("password"))
83         {
84             // Get the cmd parameter values for protocol host login and password
85             string protocol = vm["protocol"].as<string>();
86             string host = vm["host"].as<string>();
87             string login = vm["login"].as<string>();
88             string password = vm["password"].as<string>();
89
90             //TODO: convert protocol option to lowercase
91
92             // Create corresponding Service object TODO: swap to extra method
93             if(protocol == "dhs")
94             {
95                 Service * service = new DHS(host,login,password);
96                 this->services.push_back(service);
97             }
98             else if(protocol == "ods")
99             {
100                 Service * service = new ODS(host,login,password);
101                 this->services.push_back(service);
102             }
103         }
104         else
105         {
106             cout << "Not all needed options set!\n" << endl;
107             return 1;
108         }
109     }
110     catch(po::unknown_option e)
111     {
112         cout << "Unknown option set." << endl;
113         return 1;
114     }
115     return 0;
116 }
117
118
119 /**
120  * Loads the main and the service config file and does the needed action.
121  * @param config_path The path to the config directory.
122  * @return 0 if all is fine.
123  */
124 int Config::load_config_from_files(string config_path)
125 {
126     fs::path full_config_path = fs::system_complete(fs::path(config_path));
127
128     if( fs::exists(full_config_path) && fs::is_directory(full_config_path))
129     {
130         fs::directory_iterator end_iter;
131         for(fs::directory_iterator dir_itr(full_config_path); dir_itr != end_iter; ++dir_itr)
132         {
133             if( fs::is_regular_file(dir_itr->status()))
134             {
135                 string filename = dir_itr->path().filename();
136                 if(filename == "bpdyndnsd.conf")
137                 {
138                     cout << filename << endl;
139                 }
140             }
141         }
142
143     }
144     else
145     {
146         cout << "Path doesn't exist or is not a directory" << endl;
147         return 4;
148     }
149
150
151
152
153
154
155 /*
156
157     // first load the main config file bpdyndnsd.conf
158     string main_conf_file = config_path.append("/bpdyndnsd.conf");
159     ifstream config_file (main_conf_file.c_str(),ifstream::in);
160     if(config_file.is_open())
161     {
162         try
163         {
164             // parse the config file
165             po::variables_map vm;
166             po::parsed_options parsed = po::parse_config_file(config_file,*this->opt_desc_conf_main,true);
167             po::store(parsed,vm);
168             po::notify(vm);
169
170             if(vm.count("daemon_mode") && vm.count("logfile") && vm.count("loglevel") && vm.count("syslog"))
171             {
172                 // Get the options from main section
173                 this->daemon_mode = vm["main.daemon_mode"].as<bool>();
174                 this->logfile = vm["main.logfile"].as<string>();
175                 this->loglevel = vm["main.loglevel"].as<int>();
176                 this->syslog = vm["main.syslog"].as<bool>();
177             }
178         }
179         catch(po::unknown_option e)
180         {
181             // unknown option in config file detected
182             config_file.close();
183             cout << "Unknown option in config file detected!" << endl;
184             return 3;
185         }
186         config_file.close();
187     }
188     else
189     {
190         cout << "Can't open main config file for reading: " << main_conf_file << endl;
191         return 4;
192     }
193 */
194     // then load all service definition files in config path
195
196     // TODO: code to load service definition files in config path
197     return -1;
198 }
199
200
201 /**
202  * Getter method for Service list member.
203  * @return Pointer to a list of Service's.
204  */
205 list<Service*> Config::get_services()
206 {
207     return this->Services;
208 }
209
210
211 /**
212  * Prints out the usage to the command line.
213  */
214 void Config::print_usage()
215 {
216     cout << "Usage: bpdyndnsd [Command line options]" << "\n" << endl;
217     cout << *Opt_desc_cmd << endl;
218 }
219
220
221 /**
222  * Prints out the programm name and the given version string on stdout.
223  * @param version Version string.
224  */
225 void Config::print_version(string version)
226 {
227     cout << "Bullet proof dynamic dns daemon.\nbpdyndnsd " << version << endl;
228 }