DDS  ver. 3.6
dds-info/src/Options.h
Go to the documentation of this file.
1 // Copyright 2014 GSI, Inc. All rights reserved.
2 //
3 //
4 //
5 #ifndef _DDS_OPTIONS_H_
6 #define _DDS_OPTIONS_H_
7 //=============================================================================
8 // BOOST
9 #include <boost/program_options/options_description.hpp>
10 #include <boost/program_options/parsers.hpp>
11 // DDS
12 #include "ProtocolCommands.h"
13 #include "Version.h"
14 // STD
15 #include <string>
16 //=============================================================================
17 namespace bpo = boost::program_options;
18 //=============================================================================
19 namespace dds
20 {
21  namespace info_cmd
22  {
24  typedef struct SOptions
25  {
26  bool m_bNeedCommanderPid{ false };
27  bool m_bNeedStatus{ false };
28  bool m_bNeedAgentList{ false };
29  bool m_bNeedSlotList{ false };
30  bool m_bNeedActiveTopology{ false };
31  bool m_bNeedActiveCount{ false };
32  bool m_bNeedIdleCount{ false };
33  bool m_bNeedExecutingCount{ false };
34  uint32_t m_nWaitCount{ 0 };
35  boost::uuids::uuid m_sid{ boost::uuids::nil_uuid() };
36  } SOptions_t;
37 
38  // Command line parser
39  inline bool ParseCmdLine(int _argc, char* _argv[], SOptions* _options)
40  {
41  if (nullptr == _options)
42  throw std::runtime_error("Internal error: options' container is empty.");
43 
44  // Generic options
45  bpo::options_description options("dds-info options");
46  options.add_options()("help,h", "Produce help message");
47  options.add_options()("version,v", "Version information");
48  options.add_options()("session,s", bpo::value<std::string>(), "DDS Session ID");
49  options.add_options()("commander-pid",
50  bpo::bool_switch(&_options->m_bNeedCommanderPid),
51  "Return the pid of the commander server");
52  options.add_options()(
53  "status", bpo::bool_switch(&_options->m_bNeedStatus), "Query current status of DDS commander server");
54  options.add_options()("agent-list,l",
55  bpo::bool_switch(&_options->m_bNeedAgentList),
56  "Show detailed info about all online agents");
57  options.add_options()(
58  "slot-list", bpo::bool_switch(&_options->m_bNeedSlotList), "Show detailed info about all online slots");
59  options.add_options()("active-count,n",
60  bpo::bool_switch(&_options->m_bNeedActiveCount),
61  "Returns a number of online agents.");
62  options.add_options()(
63  "idle-count", bpo::bool_switch(&_options->m_bNeedIdleCount), "Returns a number of idle agents.");
64  options.add_options()("executing-count",
65  bpo::bool_switch(&_options->m_bNeedExecutingCount),
66  "Returns a number of executing agents.");
67  options.add_options()("wait",
68  bpo::value<uint32_t>(&_options->m_nWaitCount),
69  "The command will block infinitely until a required number of agents are available. "
70  "Must be used together with --active-count, --idle-count or --executing-count");
71  options.add_options()("active-topology",
72  bpo::bool_switch(&_options->m_bNeedActiveTopology),
73  "Returns the name of the active topology");
74 
75  // Parsing command-line
76  bpo::variables_map vm;
77  bpo::store(bpo::command_line_parser(_argc, _argv).options(options).run(), vm);
78  bpo::notify(vm);
79 
80  // check for non-defaulted arguments
81  auto found{ find_if(vm.begin(),
82  vm.end(),
83  [](const bpo::variables_map::value_type& _v) { return (!_v.second.defaulted()); }) };
84 
85  if (vm.count("help") || vm.end() == found)
86  {
87  LOG(dds::misc::log_stdout) << options;
88  return false;
89  }
90  if (vm.count("version"))
91  {
92  LOG(dds::misc::log_stdout) << dds::misc::DDSVersionInfoString();
93  return false;
94  }
95  if (vm.count("session"))
96  _options->m_sid = boost::uuids::string_generator()(vm["session"].as<std::string>());
97 
98  int numCounters{ _options->m_bNeedActiveCount + _options->m_bNeedIdleCount +
99  _options->m_bNeedExecutingCount };
100  if (numCounters > 1)
101  {
102  LOG(dds::misc::log_stderr) << "--active-count, --idle-count, --executing-count can't be used together.";
103  return false;
104  }
105 
106  bool needCount{ _options->m_bNeedActiveCount || _options->m_bNeedIdleCount ||
107  _options->m_bNeedExecutingCount };
108  if (vm.count("wait") && !needCount)
109  {
111  << "Option --wait must be used together with --active-count, --idle-count or --executing-count.";
112  return false;
113  }
114 
115  if (vm.count("wait") && _options->m_nWaitCount <= 0)
116  {
117  LOG(dds::misc::log_stderr) << "A number of agents to wait must be higher than 0.";
118  return false;
119  }
120 
121  return true;
122  }
123  } // namespace info_cmd
124 } // namespace dds
125 #endif // _DDS_OPTIONS_H_
dds-info command line options
Definition: dds-info/src/Options.h:24
bool m_bNeedIdleCount
Definition: dds-info/src/Options.h:32
bool m_bNeedActiveTopology
Definition: dds-info/src/Options.h:30
bool m_bNeedAgentList
Definition: dds-info/src/Options.h:28
#define LOG(severity)
Definition: Logger.h:34
Definition: def.h:151
boost::uuids::uuid m_sid
Definition: dds-info/src/Options.h:35
Miscellaneous functions and helpers are located here.
Definition: AgentConnectionManager.h:13
bool m_bNeedActiveCount
Definition: dds-info/src/Options.h:31
bool m_bNeedSlotList
Definition: dds-info/src/Options.h:29
uint32_t m_nWaitCount
Definition: dds-info/src/Options.h:34
struct dds::info_cmd::SOptions SOptions_t
dds-info command line options
bool m_bNeedExecutingCount
Definition: dds-info/src/Options.h:33
Definition: def.h:153
bool m_bNeedStatus
Definition: dds-info/src/Options.h:27
bool m_bNeedCommanderPid
Definition: dds-info/src/Options.h:26
bool ParseCmdLine(int _argc, char *_argv[], SOptions *_options)
Definition: dds-info/src/Options.h:39