37 std::is_base_of_v<rtctk::componentFramework::CommandRequestor, CommandRequestorType>,
38 "'CommandRequestorType must extend 'rtctk::componentFramework::CommandRequestor'");
42 using std::chrono::duration;
43 using std::chrono::duration_cast;
44 using std::chrono::milliseconds;
45 using std::chrono::seconds;
48 LogConfigureTool(
"rtctkClient");
49 auto& logger = GetLogger(
"rtctk");
52 string cid = args[
"cid"].as<
string>();
53 string cmd = args[
"cmd"].as<
string>();
54 string cmd_arg = args[
"cmd_arg"].as<
string>();
55 Uri sde = args[
"sde"].as<Uri>();
58 std::optional<milliseconds> timeout;
59 if (args.count(
"timeout")) {
60 timeout = duration_cast<milliseconds>(duration<double>(args[
"timeout"].as<double>()));
64 if (cmd ==
"Listen") {
65 Uri subscribe_uri = serv_disc.GetPubSubEndpoint();
66 LOG4CPLUS_DEBUG(logger,
"Subscribe URI is '" << subscribe_uri <<
"'.");
69 [&](
const taiclock::TaiClock::time_point timestamp,
71 const string& state) {
72 LOG4CPLUS_INFO(logger,
73 name <<
" changed state to: " << state);
77 this_thread::sleep_for(seconds(1));
81 Uri request_uri = serv_disc.GetReqRepEndpoint();
82 LOG4CPLUS_DEBUG(logger,
"Request URI is '" << request_uri <<
"'.");
84 CommandRequestorType requestor(request_uri, timeout);
85 auto reply = requestor.SendCommandSync(cmd, cmd_arg);
86 cout << reply << endl;
88 }
catch (
const elt::mal::TimeoutException& e) {
89 LOG4CPLUS_ERROR(logger,
"Request timed out.");
91 }
catch (
const std::exception& e) {
92 LOG4CPLUS_FATAL(logger, e.what());
95 LOG4CPLUS_FATAL(logger,
"Unknown exception");
102boost::program_options::variables_map
ParseOptions(
int argc,
char* argv[]) {
104 namespace bpo = boost::program_options;
107 auto& logger = GetLogger(
"rtctk");
109 bpo::positional_options_description pos_opts_desc;
110 pos_opts_desc.add(
"cid", 1);
111 pos_opts_desc.add(
"cmd", 1);
112 pos_opts_desc.add(
"cmd_arg", -1);
114 bpo::options_description opts_desc(
"Options");
116 opts_desc.add_options()
117 (
"help,h",
"Print help messages")
118 (
"timeout,t", bpo::value<double>()->default_value(30.0),
"timeout [sec]")
119 (
"cid,i", bpo::value<string>(),
"component identity")
120 (
"cmd,c", bpo::value<string>(),
"command name")
121 (
"cmd_arg,a", bpo::value<string>()->default_value(
""),
"command arguments")
122 (
"sde,s", bpo::value<Uri>()->default_value(Uri(
"consul://localhost:8500")),
123 "service discovery endpoint");
127 bpo::variables_map vm;
130 bpo::command_line_parser(argc, argv).options(opts_desc).positional(pos_opts_desc).run(),
135 if (vm.count(
"help")) {
136 cout << opts_desc << endl;
139 if (vm.count(
"cid")) {
140 LOG4CPLUS_DEBUG(logger,
"Component identity is '" << vm[
"cid"].as<string>() <<
"'.");
142 LOG4CPLUS_FATAL(logger,
"Component identity not specified !");
145 if (vm.count(
"cmd")) {
146 LOG4CPLUS_DEBUG(logger,
"Command is '" << vm[
"cmd"].as<string>() <<
"'.");
148 LOG4CPLUS_FATAL(logger,
"Command name not specified !");
151 if (vm.count(
"cmd_arg")) {
152 LOG4CPLUS_DEBUG(logger,
"Command Arg is '" << vm[
"cmd_arg"].as<string>() <<
"'.");
154 if (vm.count(
"sde")) {
155 LOG4CPLUS_DEBUG(logger,
156 "Service Discovery Endpoint is '" << vm[
"sde"].as<Uri>() <<
"'.");
158 LOG4CPLUS_FATAL(logger,
"Service Discovery Endpoint not specified !");
161 if (vm.count(
"timeout")) {
162 LOG4CPLUS_DEBUG(logger,
163 "Request reply timeout is " << vm[
"timeout"].as<double>() <<
"s.");
168 }
catch (bpo::error& e) {
169 LOG4CPLUS_FATAL(logger, e.what() << endl << endl);
170 LOG4CPLUS_INFO(logger, opts_desc << endl);