int main(int argc, const char** argv) { std::string camera_ip; std::uint32_t xmlrpc_port; std::string password; std::string infile; std::string json; try { o3d3xx::CmdLineOpts opts("o3d3xx Config"); po::options_description config_opts("Config Information"); config_opts.add_options() ("file,f", po::value<std::string>()->default_value("-"), "Input JSON configuration file"); opts.visible.add(config_opts); if (! opts.Parse(argc, argv, &camera_ip, &xmlrpc_port, &password)) { return 0; } infile.assign(opts.vm["file"].as<std::string>()); if (infile == "-") { std::string line; std::ostringstream buff; while (std::getline(std::cin, line)) { buff << line << std::endl; } json.assign(buff.str()); } else { std::ifstream ifs(infile, std::ios::in); if (! ifs) { throw o3d3xx::error_t(O3D3XX_IO_ERROR); } json.assign((std::istreambuf_iterator<char>(ifs)), (std::istreambuf_iterator<char>())); } o3d3xx::Camera::Ptr cam = std::make_shared<o3d3xx::Camera>(camera_ip, xmlrpc_port, password); cam->FromJSON(json); } catch (const std::exception& e) { std::cerr << "Failed to configure camera from JSON config '" << infile << "':" << std::endl << e.what() << std::endl; return 1; } return 0; }
po::variables_map parse_arguments(int argc, const char* argv[]) { //Command-line options po::options_description cmdline_opts("Generic options"); cmdline_opts.add_options() ("help", "Displays a list of available options") ("config,c", po::value<std::string>()->default_value("gateway.conf"), "Path to the configuration file"); po::positional_options_description pos; pos.add("config", 1); //Config file options po::options_description config_opts("Realm gateway configuration options"); config_opts.add_options() ("network.interface,", po::value<std::string>()->default_value("0.0.0.0")) ("network.port", po::value<unsigned short>()->default_value(8085)) ("realm_broadcast.interface,", po::value<std::string>()->default_value("0.0.0.0")) ("realm_broadcast.port", po::value<unsigned short>()->default_value(3749)) ("console_log.verbosity,", po::value<std::string>()->required()) ("remote_log.verbosity,", po::value<std::string>()->required()) ("remote_log.service_name,", po::value<std::string>()->required()) ("remote_log.host,", po::value<std::string>()->required()) ("remote_log.port,", po::value<unsigned short>()->required()) ("realmbridge.host,", po::value<std::string>()->required()) ("realmbridge.port,", po::value<unsigned short>()->required()) ("file_log.verbosity,", po::value<std::string>()->required()) ("file_log.path,", po::value<std::string>()->default_value("gateway.log")) ("file_log.timestamp_format,", po::value<std::string>()) ("file_log.mode,", po::value<std::string>()->required()) ("file_log.size_rotate,", po::value<std::uint32_t>()->required()) ("file_log.midnight_rotate,", po::bool_switch()->required()) ("file_log.log_timestamp,", po::bool_switch()->required()) ("file_log.log_severity,", po::bool_switch()->required()) ("database.username", po::value<std::string>()->required()) ("database.password", po::value<std::string>()->default_value("")) ("database.database", po::value<std::string>()->required()) ("database.host", po::value<std::string>()->required()) ("database.port", po::value<unsigned short>()->required()) ("database.min_connections", po::value<unsigned short>()->required()) ("database.max_connections", po::value<unsigned short>()->required()); po::variables_map options; po::store(po::command_line_parser(argc, argv).positional(pos).options(cmdline_opts).run(), options); po::notify(options); if(options.count("help")) { std::cout << cmdline_opts << "\n"; std::exit(0); } std::string config_path = options["config"].as<std::string>(); std::ifstream ifs(config_path); if(!ifs) { std::string message("Unable to open configuration file: " + config_path); throw std::invalid_argument(message); } po::store(po::parse_config_file(ifs, config_opts), options); po::notify(options); return std::move(options); }