OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
dns_options.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #include <boost/asio/ip/host_name.hpp>
6 #include <boost/functional/hash.hpp>
7 #include <fstream>
8 #include <iostream>
9 
10 #include "base/contrail_ports.h"
11 #include "base/logging.h"
12 #include "base/misc_utils.h"
13 #include "base/util.h"
14 #include <base/options_util.h>
15 #include <base/address_util.h>
16 #include "cmn/buildinfo.h"
17 #include "cmn/dns_options.h"
18 #include "config_client_manager.h"
19 
20 using namespace std;
21 using namespace boost::asio::ip;
22 namespace opt = boost::program_options;
23 using namespace options::util;
24 
25 // Process command line options for dns.
27 }
28 
29 bool Options::Parse(EventManager &evm, int argc, char *argv[]) {
30  opt::options_description cmdline_options("Allowed options");
31  Initialize(evm, cmdline_options);
32 
33  Process(argc, argv, cmdline_options);
34  return true;
35 }
36 
37 // Initialize dns's command line option tags with appropriate default
38 // values. Options can from a config file as well. By default, we read
39 // options from /etc/contrail/contrail-dns.conf
41  opt::options_description &cmdline_options) {
42  boost::system::error_code error;
43  string hostname = host_name(error);
44  string host_ip = GetHostIp(evm.io_service(), hostname);
45  if (host_ip.empty()) {
46  cout << "Error! Cannot resolve host " << hostname <<
47  " to a valid IP address";
48  exit(-1);
49  }
50 
51  opt::options_description generic("Generic options");
52 
53  // Command line only options.
54  generic.add_options()
55  ("conf_file", opt::value<string>()->default_value(
56  "/etc/contrail/contrail-dns.conf"),
57  "Configuration file")
58  ("help", "help message")
59  ("version", "Display version information")
60  ;
61 
62  uint16_t default_dns_server_port = ContrailPorts::DnsServerPort();
63  uint16_t default_http_server_port = ContrailPorts::HttpPortDns();
64 
65  default_collector_server_list_.push_back("127.0.0.1:8086");
66 
67  vector<string> default_config_db_server_list;
68  string default_config_db_server(host_ip + ":9042");
69  default_config_db_server_list.push_back(default_config_db_server);
70 
71  vector<string> default_rabbitmq_server_list;
72  string default_rabbitmq_server(host_ip + ":5672");
73  default_rabbitmq_server_list.push_back(default_rabbitmq_server);
74 
75  // Command line and config file options.
76  opt::options_description config("Configuration options");
77  config.add_options()
78  ("DEFAULT.collectors",
79  opt::value<vector<string> >()->default_value(
80  default_collector_server_list_, "127.0.0.1:8086"),
81  "Collector server list")
82  ("DEFAULT.dns_config_file",
83  opt::value<string>()->default_value("dns_config.xml"),
84  "DNS Configuration file")
85 
86  ("DEFAULT.named_config_file",
87  opt::value<string>()->default_value("contrail-named.conf"),
88  "Named Configuration file")
89  ("DEFAULT.named_config_directory",
90  opt::value<string>()->default_value("/etc/contrail/dns"),
91  "Named Configuration directory")
92  ("DEFAULT.named_log_file",
93  opt::value<string>()->default_value("/var/log/contrail/contrail-named.log"),
94  "Named log file")
95  ("DEFAULT.rndc_config_file",
96  opt::value<string>()->default_value("contrail-rndc.conf"),
97  "Rndc Configuration file")
98  ("DEFAULT.rndc_secret",
99  opt::value<string>()->default_value("xvysmOR8lnUQRBcunkC6vg=="),
100  "RNDC secret")
101  ("DEFAULT.named_max_cache_size",
102  opt::value<string>()->default_value("32M"),
103  "Maximum cache size, in bytes, used by contrail-named (per view)")
104  ("DEFAULT.named_max_retransmissions",
105  opt::value<uint16_t>()->default_value(12),
106  "Maximum number of retries to named")
107  ("DEFAULT.named_retransmission_interval",
108  opt::value<uint16_t>()->default_value(1000),
109  "Retranmission interval in msec")
110 
111  ("DEFAULT.hostip", opt::value<string>()->default_value(host_ip),
112  "IP address of DNS Server")
113  ("DEFAULT.hostname", opt::value<string>()->default_value(hostname),
114  "Hostname of DNS Server")
115  ("DEFAULT.http_server_port",
116  opt::value<uint16_t>()->default_value(default_http_server_port),
117  "Sandesh HTTP listener port")
118  ("DEFAULT.dns_server_port",
119  opt::value<uint16_t>()->default_value(default_dns_server_port),
120  "DNS server port")
121 
122  ("DEFAULT.log_category",
123  opt::value<string>()->default_value(log_category_),
124  "Category filter for local logging of sandesh messages")
125  ("DEFAULT.log_disable", opt::bool_switch(&log_disable_),
126  "Disable sandesh logging")
127  ("DEFAULT.log_property_file", opt::value<string>()->default_value(""),
128  "log4cplus property file name")
129  ("DEFAULT.log_file", opt::value<string>()->default_value("<stdout>"),
130  "Filename for the logs to be written to")
131  ("DEFAULT.log_files_count",
132  opt::value<int>()->default_value(10),
133  "Maximum log file roll over index")
134  ("DEFAULT.log_file_size",
135  opt::value<long>()->default_value(1024*1024),
136  "Maximum size of the log file")
137  ("DEFAULT.log_level", opt::value<string>()->default_value("SYS_NOTICE"),
138  "Severity level for local logging of sandesh messages")
139  ("DEFAULT.log_local", opt::bool_switch(&log_local_),
140  "Enable local logging of sandesh messages")
141  ("DEFAULT.use_syslog", opt::bool_switch(&use_syslog_),
142  "Enable logging to syslog")
143  ("DEFAULT.syslog_facility", opt::value<string>()->default_value("LOG_LOCAL0"),
144  "Syslog facility to receive log lines")
145  ("DEFAULT.test_mode", opt::bool_switch(&test_mode_),
146  "Enable dns to run in test-mode")
147 
148  ("CONFIGDB.config_db_server_list",
149  opt::value<vector<string> >()->default_value(
150  default_config_db_server_list, default_config_db_server),
151  "Config database server list")
152  ("CONFIGDB.config_db_username",
153  opt::value<string>()->default_value(""),
154  "ConfigDB user")
155  ("CONFIGDB.config_db_password",
156  opt::value<string>()->default_value(""),
157  "ConfigDB password")
158  ("CONFIGDB.config_db_use_ssl",
159  opt::value<bool>()->default_value(false),
160  "Use SSL for Cassandra connection")
161  ("CONFIGDB.config_db_ca_certs",
162  opt::value<string>()->default_value(""),
163  "CA Certificate file for SSL Cassandra connection")
164  ("CONFIGDB.rabbitmq_server_list",
165  opt::value<vector<string> >()->default_value(
166  default_rabbitmq_server_list, default_rabbitmq_server),
167  "RabbitMQ server list")
168  ("CONFIGDB.rabbitmq_user",
169  opt::value<string>()->default_value("guest"),
170  "RabbitMQ user")
171  ("CONFIGDB.rabbitmq_password",
172  opt::value<string>()->default_value("guest"),
173  "RabbitMQ password")
174  ("CONFIGDB.rabbitmq_vhost",
175  opt::value<string>()->default_value(""),
176  "RabbitMQ vhost")
177  ("CONFIGDB.rabbitmq_use_ssl",
178  opt::value<bool>()->default_value(false),
179  "Use SSL for RabbitMQ connection")
180  ("CONFIGDB.rabbitmq_ssl_version",
181  opt::value<string>()->default_value(""),
182  "SSL version for RabbitMQ connection")
183  ("CONFIGDB.rabbitmq_ssl_keyfile",
184  opt::value<string>()->default_value(""),
185  "Keyfile for SSL RabbitMQ connection")
186  ("CONFIGDB.rabbitmq_ssl_certfile",
187  opt::value<string>()->default_value(""),
188  "Certificate file for SSL RabbitMQ connection")
189  ("CONFIGDB.rabbitmq_ssl_ca_certs",
190  opt::value<string>()->default_value(""),
191  "CA Certificate file for SSL RabbitMQ connection")
192 
193  ("DEFAULT.xmpp_dns_auth_enable", opt::bool_switch(&xmpp_auth_enable_),
194  "Enable authentication over Xmpp")
195  ("DEFAULT.xmpp_server_cert",
196  opt::value<string>()->default_value(
197  "/etc/contrail/ssl/certs/server.pem"),
198  "XMPP Server ssl certificate")
199  ("DEFAULT.xmpp_server_key",
200  opt::value<string>()->default_value(
201  "/etc/contrail/ssl/private/server-privkey.pem"),
202  "XMPP Server ssl private key")
203  ("DEFAULT.xmpp_ca_cert",
204  opt::value<string>()->default_value(
205  "/etc/contrail/ssl/certs/ca-cert.pem"),
206  "XMPP CA ssl certificate")
207  ;
208 
209  sandesh::options::AddOptions(&config, &sandesh_config_);
210 
211  config_file_options_.add(config);
212  cmdline_options.add(generic).add(config);
213 }
214 
215 uint32_t Options::GenerateHash(const std::vector<std::string> &list) {
216  std::string concat_servers;
217  std::vector<std::string>::const_iterator iter;
218  for (iter = list.begin(); iter != list.end(); iter++) {
219  concat_servers += *iter;
220  }
221  boost::hash<std::string> string_hash;
222  return(string_hash(concat_servers));
223 }
224 
225 uint32_t Options::GenerateHash(const ConfigClientOptions &config) {
226  uint32_t chk_sum = GenerateHash(config.config_db_server_list);
227  chk_sum += GenerateHash(config.rabbitmq_server_list);
228  boost::hash<std::string> string_hash;
229  chk_sum += string_hash(config.rabbitmq_user);
230  chk_sum += string_hash(config.rabbitmq_password);
231  chk_sum += string_hash(config.config_db_username);
232  chk_sum += string_hash(config.config_db_password);
233  return chk_sum;
234 }
235 
236 // Process command line options. They can come from a conf file as well. Options
237 // from command line always overrides those that come from the config file.
238 void Options::Process(int argc, char *argv[],
239  opt::options_description &cmdline_options) {
240  // Process options off command line first.
241  opt::variables_map var_map;
242  opt::store(opt::parse_command_line(argc, argv, cmdline_options), var_map);
243 
244  // Process options off configuration file.
245  GetOptValue<string>(var_map, config_file_, "conf_file");
246  ifstream config_file_in;
247  config_file_in.open(config_file_.c_str());
248  if (config_file_in.good()) {
249  opt::store(opt::parse_config_file(config_file_in, config_file_options_),
250  var_map);
251  }
252  config_file_in.close();
253 
254  opt::notify(var_map);
255 
256  if (var_map.count("help")) {
257  cout << cmdline_options << endl;
258  exit(0);
259  }
260 
261  if (var_map.count("version")) {
262  string build_info;
263  cout << MiscUtils::GetBuildInfo(MiscUtils::Dns, BuildInfo,
264  build_info) << endl;
265  exit(0);
266  }
267 
268  // Retrieve the options.
269  GetOptValue<string>(var_map, dns_config_file_, "DEFAULT.dns_config_file");
270  GetOptValue< vector<string> >(var_map, collector_server_list_,
271  "DEFAULT.collectors");
272  collectors_configured_ = collector_server_list_.size();
273  if (collector_server_list_.size() == 1 &&
274  !collector_server_list_[0].compare(default_collector_server_list_[0])) {
275  collectors_configured_ = false;
276  }
277 
278  // Randomize Collector List
279  collector_chksum_ = GenerateHash(collector_server_list_);
280  randomized_collector_server_list_ = collector_server_list_;
281  std::random_shuffle(randomized_collector_server_list_.begin(),
282  randomized_collector_server_list_.end());
283 
284  GetOptValue<string>(var_map, named_config_file_,
285  "DEFAULT.named_config_file");
286  GetOptValue<string>(var_map, named_config_dir_,
287  "DEFAULT.named_config_directory");
288  GetOptValue<string>(var_map, named_log_file_, "DEFAULT.named_log_file");
289  GetOptValue<string>(var_map, rndc_config_file_, "DEFAULT.rndc_config_file");
290  GetOptValue<string>(var_map, rndc_secret_, "DEFAULT.rndc_secret");
291  GetOptValue<string>(var_map, named_max_cache_size_,
292  "DEFAULT.named_max_cache_size");
293  GetOptValue<uint16_t>(var_map, named_max_retransmissions_,
294  "DEFAULT.named_max_retransmissions");
295  GetOptValue<uint16_t>(var_map, named_retransmission_interval_,
296  "DEFAULT.named_retransmission_interval");
297 
298  GetOptValue<string>(var_map, host_ip_, "DEFAULT.hostip");
299  GetOptValue<string>(var_map, hostname_, "DEFAULT.hostname");
300 
301  GetOptValue<uint16_t>(var_map, http_server_port_,
302  "DEFAULT.http_server_port");
303 
304  GetOptValue<uint16_t>(var_map, dns_server_port_, "DEFAULT.dns_server_port");
305 
306  GetOptValue<string>(var_map, log_category_, "DEFAULT.log_category");
307  GetOptValue<string>(var_map, log_file_, "DEFAULT.log_file");
308  GetOptValue<string>(var_map, log_property_file_,
309  "DEFAULT.log_property_file");
310  GetOptValue<int>(var_map, log_files_count_, "DEFAULT.log_files_count");
311  GetOptValue<long>(var_map, log_file_size_, "DEFAULT.log_file_size");
312  GetOptValue<string>(var_map, log_level_, "DEFAULT.log_level");
313  GetOptValue<bool>(var_map, use_syslog_, "DEFAULT.use_syslog");
314  GetOptValue<string>(var_map, syslog_facility_, "DEFAULT.syslog_facility");
315  GetOptValue<uint32_t>(var_map, send_ratelimit_,
316  "DEFAULT.sandesh_send_rate_limit");
317  GetOptValue< vector<string> >(var_map,
318  configdb_options_.config_db_server_list,
319  "CONFIGDB.config_db_server_list");
320  GetOptValue<string>(var_map,
321  configdb_options_.config_db_username,
322  "CONFIGDB.config_db_username");
323  GetOptValue<string>(var_map,
324  configdb_options_.config_db_password,
325  "CONFIGDB.config_db_password");
326  GetOptValue<bool>(var_map,
327  configdb_options_.config_db_use_ssl,
328  "CONFIGDB.config_db_use_ssl");
329  GetOptValue<string>(var_map,
330  configdb_options_.config_db_ca_certs,
331  "CONFIGDB.config_db_ca_certs");
332  GetOptValue< vector<string> >(var_map,
333  configdb_options_.rabbitmq_server_list,
334  "CONFIGDB.rabbitmq_server_list");
335  GetOptValue<string>(var_map,
336  configdb_options_.rabbitmq_user,
337  "CONFIGDB.rabbitmq_user");
338  GetOptValue<string>(var_map,
339  configdb_options_.rabbitmq_password,
340  "CONFIGDB.rabbitmq_password");
341  GetOptValue<string>(var_map,
342  configdb_options_.rabbitmq_vhost,
343  "CONFIGDB.rabbitmq_vhost");
344  GetOptValue<bool>(var_map,
345  configdb_options_.rabbitmq_use_ssl,
346  "CONFIGDB.rabbitmq_use_ssl");
347  GetOptValue<string>(var_map,
348  configdb_options_.rabbitmq_ssl_version,
349  "CONFIGDB.rabbitmq_ssl_version");
350  GetOptValue<string>(var_map,
351  configdb_options_.rabbitmq_ssl_keyfile,
352  "CONFIGDB.rabbitmq_ssl_keyfile");
353  GetOptValue<string>(var_map,
354  configdb_options_.rabbitmq_ssl_certfile,
355  "CONFIGDB.rabbitmq_ssl_certfile");
356  GetOptValue<string>(var_map,
357  configdb_options_.rabbitmq_ssl_ca_certs,
358  "CONFIGDB.rabbitmq_ssl_ca_certs");
359  ParseConfigOptions(var_map);
360 
361  GetOptValue<bool>(var_map, xmpp_auth_enable_, "DEFAULT.xmpp_dns_auth_enable");
362  GetOptValue<string>(var_map, xmpp_server_cert_, "DEFAULT.xmpp_server_cert");
363  GetOptValue<string>(var_map, xmpp_server_key_, "DEFAULT.xmpp_server_key");
364  GetOptValue<string>(var_map, xmpp_ca_cert_, "DEFAULT.xmpp_ca_cert");
365 
366  sandesh::options::ProcessOptions(var_map, &sandesh_config_);
367 }
368 
370  // ReParse the filtered config params
371  opt::variables_map var_map;
372  ifstream config_file_in;
373  config_file_in.open(config_file_.c_str());
374  if (config_file_in.good()) {
375  opt::store(opt::parse_config_file(config_file_in, config_file_options_),
376  var_map);
377  }
378  config_file_in.close();
379 
380  collector_server_list_.clear();
381  GetOptValue< vector<string> >(var_map, collector_server_list_,
382  "DEFAULT.collectors");
383 
384  uint32_t new_chksum = GenerateHash(collector_server_list_);
385  if (collector_chksum_ != new_chksum) {
386  collector_chksum_ = new_chksum;
387 
388  randomized_collector_server_list_.clear();
389  randomized_collector_server_list_ = collector_server_list_;
390  std::random_shuffle(randomized_collector_server_list_.begin(),
391  randomized_collector_server_list_.end());
392  }
393  // ReConnect Collectors irrespective of change list to achieve
394  // rebalance when older collector nodes are up again.
395  Sandesh::ReConfigCollectors(randomized_collector_server_list_);
396 
397  uint32_t old_config_chksum = configdb_chksum_;
398  ParseConfigOptions(var_map);
399  if ((old_config_chksum != configdb_chksum_) && config_client_manager_) {
400  config_client_manager_->ReinitConfigClient(configdb_options());
401  }
402 }
403 
404 void Options::ParseConfigOptions(const boost::program_options::variables_map
405  &var_map) {
406  configdb_options_.config_db_server_list.clear();
407  GetOptValue< vector<string> >(var_map,
408  configdb_options_.config_db_server_list,
409  "CONFIGDB.config_db_server_list");
410  GetOptValue<string>(var_map,
411  configdb_options_.config_db_username,
412  "CONFIGDB.config_db_username");
413  GetOptValue<string>(var_map,
414  configdb_options_.config_db_password,
415  "CONFIGDB.config_db_password");
416  GetOptValue<bool>(var_map,
417  configdb_options_.config_db_use_ssl,
418  "CONFIGDB.config_db_use_ssl");
419  GetOptValue<string>(var_map,
420  configdb_options_.config_db_ca_certs,
421  "CONFIGDB.config_db_ca_certs");
422  configdb_options_.rabbitmq_server_list.clear();
423  GetOptValue< vector<string> >(var_map,
424  configdb_options_.rabbitmq_server_list,
425  "CONFIGDB.rabbitmq_server_list");
426  GetOptValue<string>(var_map,
427  configdb_options_.rabbitmq_user,
428  "CONFIGDB.rabbitmq_user");
429  GetOptValue<string>(var_map,
430  configdb_options_.rabbitmq_password,
431  "CONFIGDB.rabbitmq_password");
432  GetOptValue<string>(var_map,
433  configdb_options_.rabbitmq_vhost,
434  "CONFIGDB.rabbitmq_vhost");
435  GetOptValue<bool>(var_map,
436  configdb_options_.rabbitmq_use_ssl,
437  "CONFIGDB.rabbitmq_use_ssl");
438  GetOptValue<string>(var_map,
439  configdb_options_.rabbitmq_ssl_version,
440  "CONFIGDB.rabbitmq_ssl_version");
441  GetOptValue<string>(var_map,
442  configdb_options_.rabbitmq_ssl_keyfile,
443  "CONFIGDB.rabbitmq_ssl_keyfile");
444  GetOptValue<string>(var_map,
445  configdb_options_.rabbitmq_ssl_certfile,
446  "CONFIGDB.rabbitmq_ssl_certfile");
447  GetOptValue<string>(var_map,
448  configdb_options_.rabbitmq_ssl_ca_certs,
449  "CONFIGDB.rabbitmq_ssl_ca_certs");
450  configdb_chksum_ = GenerateHash(configdb_options_);
451 }
bool Process(int argc, char *argv[], boost::program_options::options_description &cmdline_options)
uint32_t GenerateHash(const std::vector< std::string > &list)
Definition: options.cc:221
void ParseConfigOptions(const boost::program_options::variables_map &var_map)
Definition: options.cc:362
static void ReConfigCollectors(const std::vector< std::string > &collector_list)
Definition: sandesh.cc:230
boost::asio::io_context * io_service()
Definition: event_manager.h:42
static bool GetBuildInfo(BuildModule id, const std::string &build_info, std::string &result)
Definition: misc_utils.cc:99
void Initialize(EventManager &evm, boost::program_options::options_description &options)
static const uint16_t DnsServerPort()
void ParseReConfig()
Definition: dns_options.cc:369
Options()
Definition: options.cc:27
static bool use_syslog_
Definition: logging.cc:20
static const uint16_t HttpPortDns()
void ProcessOptions(const opt::variables_map &var_map, SandeshConfig *sandesh_config)
std::vector< std::string > config_db_server_list
std::string GetHostIp(boost::asio::io_context *io_service, const std::string &hostname)
std::vector< std::string > rabbitmq_server_list
void AddOptions(opt::options_description *sandesh_options, SandeshConfig *sandesh_config)
bool Parse(EventManager &evm, int argc, char **argv)
static EventManager evm