9 #include <boost/asio/ip/host_name.hpp>
10 #include <boost/functional/hash.hpp>
12 #include "control-node/buildinfo.h"
22 using namespace boost::asio::ip;
23 namespace opt = boost::program_options;
31 opt::options_description cmdline_options(
"Allowed options");
32 Initialize(
evm, cmdline_options);
35 return Process(argc, argv, cmdline_options);
36 }
catch (boost::program_options::error &e) {
37 cout <<
"Error " << e.what() << endl;
39 cout <<
"Options Parser: Caught fatal unknown exception" << endl;
49 opt::options_description &cmdline_options) {
50 boost::system::error_code error;
51 string hostname = host_name(error);
55 host_ip =
"127.0.0.1";
57 opt::options_description
generic(
"Generic options");
61 (
"conf_file", opt::value<string>()->default_value(
62 "/etc/contrail/contrail-control.conf"),
64 (
"help",
"help message")
65 (
"version",
"Display version information")
72 default_collector_server_list_.push_back(
"127.0.0.1:8086");
74 vector<string> default_config_db_server_list;
75 string default_config_db_server(host_ip +
":9042");
76 default_config_db_server_list.push_back(default_config_db_server);
78 vector<string> default_rabbitmq_server_list;
79 string default_rabbitmq_server(host_ip +
":5672");
80 default_rabbitmq_server_list.push_back(default_rabbitmq_server);
83 opt::options_description config(
"Configuration options");
85 (
"DEFAULT.bgp_config_file",
86 opt::value<string>()->default_value(
"bgp_config.xml"),
87 "BGP Configuration file")
89 opt::value<uint16_t>()->default_value(default_bgp_port),
91 (
"DEFAULT.collectors",
92 opt::value<vector<string> >()->default_value(
93 default_collector_server_list_,
"127.0.0.1:8086"),
94 "Collector server list")
96 (
"DEFAULT.gr_helper_bgp_disable",
97 opt::bool_switch(&gr_helper_bgp_disable_),
98 "Disable Graceful Restart Helper functionality for BGP peers")
99 (
"DEFAULT.gr_helper_xmpp_disable",
100 opt::bool_switch(&gr_helper_xmpp_disable_),
101 "Disable Graceful Restart Helper functionality for XMPP agents")
103 (
"DEFAULT.hostip", opt::value<string>()->default_value(host_ip),
104 "IP address of control-node")
105 (
"DEFAULT.hostname", opt::value<string>()->default_value(hostname),
106 "Hostname of control-node")
107 (
"DEFAULT.http_server_port",
108 opt::value<uint16_t>()->default_value(default_http_server_port),
109 "Sandesh HTTP listener port")
111 (
"DEFAULT.log_category",
112 opt::value<string>()->default_value(log_category_),
113 "Category filter for local logging of sandesh messages")
114 (
"DEFAULT.log_disable", opt::bool_switch(&log_disable_),
115 "Disable sandesh logging")
116 (
"DEFAULT.log_file", opt::value<string>()->default_value(
117 "/var/log/contrail/contrail-control.log"),
118 "Filename for the logs to be written to")
119 (
"DEFAULT.log_property_file", opt::value<string>()->default_value(
""),
120 "log4cplus property file name")
121 (
"DEFAULT.log_files_count",
122 opt::value<int>()->default_value(10),
123 "Maximum log file roll over index")
124 (
"DEFAULT.log_file_size",
125 opt::value<long>()->default_value(10*1024*1024),
126 "Maximum size of the log file")
127 (
"DEFAULT.log_level", opt::value<string>()->default_value(
"SYS_NOTICE"),
128 "Severity level for local logging of sandesh messages")
129 (
"DEFAULT.log_local",
130 opt::bool_switch(&log_local_)->default_value(
true),
131 "Enable local logging of sandesh messages")
132 (
"DEFAULT.mvpn_ipv4_enable", opt::bool_switch(&mvpn_ipv4_enable_),
133 "Enable NGEN Multicast VPN support for IPv4 routes")
134 (
"DEFAULT.use_syslog", opt::bool_switch(&
use_syslog_),
135 "Enable logging to syslog")
136 (
"DEFAULT.syslog_facility",
137 opt::value<string>()->default_value(
"LOG_LOCAL0"),
138 "Syslog facility to receive log lines")
139 (
"DEFAULT.task_track_run_time", opt::bool_switch(&task_track_run_time_),
140 "Enable tracking of run time per task id")
141 (
"DEFAULT.test_mode", opt::bool_switch(&test_mode_),
142 "Enable control-node to run in test-mode")
143 (
"DEFAULT.tcp_hold_time", opt::value<int>()->default_value(30),
144 "Configurable TCP hold time")
145 (
"DEFAULT.optimize_snat", opt::bool_switch(&optimize_snat_),
146 "Enable control-node optimizations for SNAT (deprecated)")
147 (
"DEFAULT.xmpp_server_port",
148 opt::value<uint16_t>()->default_value(default_xmpp_port),
149 "XMPP listener port")
150 (
"DEFAULT.xmpp_auth_enable", opt::bool_switch(&xmpp_auth_enable_),
151 "Enable authentication over Xmpp")
152 (
"DEFAULT.xmpp_server_cert",
153 opt::value<string>()->default_value(
154 "/etc/contrail/ssl/certs/server.pem"),
155 "XMPP Server ssl certificate")
156 (
"DEFAULT.xmpp_server_key",
157 opt::value<string>()->default_value(
158 "/etc/contrail/ssl/private/server-privkey.pem"),
159 "XMPP Server ssl private key")
160 (
"DEFAULT.xmpp_ca_cert",
161 opt::value<string>()->default_value(
162 "/etc/contrail/ssl/certs/ca-cert.pem"),
163 "XMPP CA ssl certificate")
165 (
"CONFIGDB.config_db_server_list",
166 opt::value<vector<string> >()->default_value(
167 default_config_db_server_list, default_config_db_server),
168 "Config database server list")
169 (
"CONFIGDB.config_db_username",
170 opt::value<string>()->default_value(
""),
172 (
"CONFIGDB.config_db_password",
173 opt::value<string>()->default_value(
""),
175 (
"CONFIGDB.config_db_use_ssl",
176 opt::value<bool>()->default_value(
false),
177 "Use SSL for Cassandra connection")
178 (
"CONFIGDB.config_db_ca_certs",
179 opt::value<string>()->default_value(
""),
180 "CA Certificate file for SSL Cassandra connection")
181 (
"CONFIGDB.rabbitmq_server_list",
182 opt::value<vector<string> >()->default_value(
183 default_rabbitmq_server_list, default_rabbitmq_server),
184 "RabbitMQ server list")
185 (
"CONFIGDB.rabbitmq_user",
186 opt::value<string>()->default_value(
"guest"),
188 (
"CONFIGDB.rabbitmq_password",
189 opt::value<string>()->default_value(
"guest"),
191 (
"CONFIGDB.rabbitmq_vhost",
192 opt::value<string>()->default_value(
""),
194 (
"CONFIGDB.rabbitmq_use_ssl",
195 opt::value<bool>()->default_value(
false),
196 "Use SSL for RabbitMQ connection")
197 (
"CONFIGDB.rabbitmq_ssl_version",
198 opt::value<string>()->default_value(
""),
199 "SSL version for RabbitMQ connection")
200 (
"CONFIGDB.rabbitmq_ssl_keyfile",
201 opt::value<string>()->default_value(
""),
202 "Keyfile for SSL RabbitMQ connection")
203 (
"CONFIGDB.rabbitmq_ssl_certfile",
204 opt::value<string>()->default_value(
""),
205 "Certificate file for SSL RabbitMQ connection")
206 (
"CONFIGDB.rabbitmq_ssl_ca_certs",
207 opt::value<string>()->default_value(
""),
208 "CA Certificate file for SSL RabbitMQ connection")
210 (
"CONFIGDB.config_db_use_etcd",
211 opt::value<bool>()->default_value(
false),
212 "Use etcd as the contrail DB client")
217 config_file_options_.add(config);
218 cmdline_options.add(
generic).add(config);
222 std::string concat_servers;
223 std::vector<std::string>::const_iterator iter;
224 for (iter = list.begin(); iter != list.end(); iter++) {
225 concat_servers += *iter;
227 boost::hash<std::string> string_hash;
228 return(string_hash(concat_servers));
234 boost::hash<std::string> string_hash;
245 opt::options_description &cmdline_options) {
247 opt::variables_map var_map;
248 opt::store(opt::parse_command_line(argc, argv, cmdline_options), var_map);
251 GetOptValue<string>(var_map, config_file_,
"conf_file");
252 ifstream config_file_in;
253 config_file_in.open(config_file_.c_str());
254 if (config_file_in.good()) {
255 opt::store(opt::parse_config_file(config_file_in, config_file_options_),
258 config_file_in.close();
260 opt::notify(var_map);
262 if (var_map.count(
"help")) {
263 cout << cmdline_options << endl;
267 if (var_map.count(
"version")) {
273 GetOptValue<string>(var_map, bgp_config_file_,
"DEFAULT.bgp_config_file");
274 GetOptValue<uint16_t>(var_map, bgp_port_,
"DEFAULT.bgp_port");
275 GetOptValue< vector<string> >(var_map, collector_server_list_,
276 "DEFAULT.collectors");
279 cout <<
"Invalid endpoint : " << error_msg;
283 collectors_configured_ = collector_server_list_.size();
284 if (collector_server_list_.size() == 1 &&
285 !collector_server_list_[0].compare(default_collector_server_list_[0])) {
286 collectors_configured_ =
false;
290 collector_chksum_ = GenerateHash(collector_server_list_);
291 randomized_collector_server_list_ = collector_server_list_;
292 std::random_shuffle(randomized_collector_server_list_.begin(),
293 randomized_collector_server_list_.end());
295 GetOptValue<string>(var_map, host_ip_,
"DEFAULT.hostip");
297 cout <<
"Invalid IP address: " << host_ip_ << error_msg;
301 GetOptValue<string>(var_map, hostname_,
"DEFAULT.hostname");
303 GetOptValue<uint16_t>(var_map, http_server_port_,
304 "DEFAULT.http_server_port");
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_,
"DEFAULT.log_property_file");
309 GetOptValue<int>(var_map, log_files_count_,
"DEFAULT.log_files_count");
310 GetOptValue<long>(var_map, log_file_size_,
"DEFAULT.log_file_size");
311 GetOptValue<string>(var_map, log_level_,
"DEFAULT.log_level");
312 GetOptValue<string>(var_map, syslog_facility_,
"DEFAULT.syslog_facility");
313 GetOptValue<int>(var_map, tcp_hold_time_,
"DEFAULT.tcp_hold_time");
314 GetOptValue<uint16_t>(var_map, xmpp_port_,
"DEFAULT.xmpp_server_port");
315 GetOptValue<string>(var_map, xmpp_server_cert_,
"DEFAULT.xmpp_server_cert");
316 GetOptValue<string>(var_map, xmpp_server_key_,
"DEFAULT.xmpp_server_key");
317 GetOptValue<string>(var_map, xmpp_ca_cert_,
"DEFAULT.xmpp_ca_cert");
319 ParseConfigOptions(var_map);
327 opt::variables_map var_map;
328 ifstream config_file_in;
329 config_file_in.open(config_file_.c_str());
330 if (config_file_in.good()) {
331 opt::store(opt::parse_config_file(config_file_in, config_file_options_),
334 config_file_in.close();
336 collector_server_list_.clear();
337 GetOptValue< vector<string> >(var_map, collector_server_list_,
338 "DEFAULT.collectors");
340 uint32_t new_chksum = GenerateHash(collector_server_list_);
341 if (collector_chksum_ != new_chksum) {
342 collector_chksum_ = new_chksum;
343 randomized_collector_server_list_.clear();
344 randomized_collector_server_list_ = collector_server_list_;
345 std::random_shuffle(randomized_collector_server_list_.begin(),
346 randomized_collector_server_list_.end());
352 uint32_t old_config_chksum = configdb_chksum_;
353 ParseConfigOptions(var_map);
354 if ((force_reinit || old_config_chksum != configdb_chksum_) &&
355 config_client_manager_) {
356 config_client_manager_->ReinitConfigClient(configdb_options());
362 configdb_options_.config_db_server_list.clear();
363 GetOptValue< vector<string> >(var_map,
364 configdb_options_.config_db_server_list,
365 "CONFIGDB.config_db_server_list");
366 GetOptValue<string>(var_map,
367 configdb_options_.config_db_username,
368 "CONFIGDB.config_db_username");
369 GetOptValue<string>(var_map,
370 configdb_options_.config_db_password,
371 "CONFIGDB.config_db_password");
372 GetOptValue<bool>(var_map,
373 configdb_options_.config_db_use_ssl,
374 "CONFIGDB.config_db_use_ssl");
375 GetOptValue<string>(var_map,
376 configdb_options_.config_db_ca_certs,
377 "CONFIGDB.config_db_ca_certs");
378 configdb_options_.rabbitmq_server_list.clear();
379 GetOptValue< vector<string> >(var_map,
380 configdb_options_.rabbitmq_server_list,
381 "CONFIGDB.rabbitmq_server_list");
382 GetOptValue<string>(var_map,
383 configdb_options_.rabbitmq_user,
384 "CONFIGDB.rabbitmq_user");
385 GetOptValue<string>(var_map,
386 configdb_options_.rabbitmq_password,
387 "CONFIGDB.rabbitmq_password");
388 GetOptValue<string>(var_map,
389 configdb_options_.rabbitmq_vhost,
390 "CONFIGDB.rabbitmq_vhost");
391 GetOptValue<bool>(var_map,
392 configdb_options_.rabbitmq_use_ssl,
393 "CONFIGDB.rabbitmq_use_ssl");
394 GetOptValue<string>(var_map,
395 configdb_options_.rabbitmq_ssl_version,
396 "CONFIGDB.rabbitmq_ssl_version");
397 GetOptValue<string>(var_map,
398 configdb_options_.rabbitmq_ssl_keyfile,
399 "CONFIGDB.rabbitmq_ssl_keyfile");
400 GetOptValue<string>(var_map,
401 configdb_options_.rabbitmq_ssl_certfile,
402 "CONFIGDB.rabbitmq_ssl_certfile");
403 GetOptValue<string>(var_map,
404 configdb_options_.rabbitmq_ssl_ca_certs,
405 "CONFIGDB.rabbitmq_ssl_ca_certs");
406 GetOptValue<bool>(var_map,
407 configdb_options_.config_db_use_etcd,
408 "CONFIGDB.config_db_use_etcd");
409 configdb_chksum_ = GenerateHash(configdb_options_);
std::string GetHostIp(boost::asio::io_context *io_service, const std::string &hostname)
bool ValidateServerEndpoints(std::vector< std::string > list, std::string *error_msg)
bool ValidateIPAddressString(std::string ip_address_str, std::string *error_msg)
static const uint16_t ControlBgp()
static const uint16_t HttpPortControl()
static const uint16_t ControlXmpp()
boost::asio::io_context * io_service()
void ParseConfigOptions(const boost::program_options::variables_map &var_map)
uint32_t GenerateHash(const std::vector< std::string > &list)
bool Process(int argc, char *argv[], boost::program_options::options_description &cmdline_options)
void Initialize(EventManager &evm, boost::program_options::options_description &options)
bool Parse(EventManager &evm, int argc, char **argv)
static void ReConfigCollectors(const std::vector< std::string > &collector_list)
void AddOptions(opt::options_description *sandesh_options, SandeshConfig *sandesh_config)
void ProcessOptions(const opt::variables_map &var_map, SandeshConfig *sandesh_config)
std::vector< std::string > config_db_server_list
std::string config_db_password
std::string config_db_username
std::string rabbitmq_password
std::vector< std::string > rabbitmq_server_list
std::string rabbitmq_user
const std::string BuildInfo