DDS  ver. 3.6
dds-session/src/Options.h
Go to the documentation of this file.
1 // Copyright 2018 GSI, Inc. All rights reserved.
2 //
3 //
4 //
5 #ifndef DDSOPTIONS_H
6 #define DDSOPTIONS_H
7 //=============================================================================
8 // BOOST
9 #include <boost/program_options/options_description.hpp>
10 #include <boost/program_options/parsers.hpp>
11 // DDS
12 #include "BoostHelper.h"
13 #include "SysHelper.h"
14 #include "Version.h"
15 
16 namespace bpo = boost::program_options;
17 
18 namespace dds
19 {
20  namespace session_cmd
21  {
23  {
24  enum ETypes
25  {
29  };
30  SSessionsSorting(const std::string& _val)
31  : m_value(_val)
32  {
33  if (_val == "all")
35  else if (_val == "run")
37  else
39  }
40  std::string m_value;
42  };
43 
44  /* void validate(boost::any& _v, std::vector<std::string> const& _values, SSessionsSorting*, int)
45  {
46  // Make sure no previous assignment to 'v' was made.
47  bpo::validators::check_first_occurrence(_v);
48 
49  // Extract the first string from 'values'. If there is more than
50  // one string, it's an error, and exception will be thrown.
51  const std::string& s = bpo::validators::get_single_string(_values);
52 
53  if (s == "all" || s == "run")
54  {
55  _v = boost::any(SSessionsSorting(s));
56  }
57  else
58  {
59  throw bpo::validation_error(bpo::validation_error::invalid_option_value);
60  }
61  }*/
62 
64  typedef struct SOptions
65  {
66  enum ECommands
67  {
75  };
76 
79  , m_ListSessions("")
80  , m_bForce(false)
81  , m_bMixed(false)
82  {
83  }
84  static ECommands getCommandByName(const std::string& _name)
85  {
86  if ("start" == _name)
87  return cmd_start;
88  if ("stop" == _name)
89  return cmd_stop;
90  if ("stop-all" == _name)
91  return cmd_stop_all;
92  if ("list" == _name)
93  return cmd_list;
94  if ("set-default" == _name)
95  return cmd_set_default;
96  if ("clean" == _name)
97  return cmd_clean;
98 
99  return cmd_unknown;
100  }
103  bool m_bForce;
104  std::string m_sSessionID;
105  bool m_bMixed;
106  } SOptions_t;
107 
108  // Command line parser
109  inline bool ParseCmdLine(int _argc, char* _argv[], SOptions* _options)
110  {
111  if (nullptr == _options)
112  throw std::runtime_error("Internal error: options' container is empty.");
113 
114  // Generic options
115  bpo::options_description options("dds-session options");
116  options.add_options()("help,h", "Produce help message");
117  options.add_options()("version,v", "Version information");
118  options.add_options()(
119  "command",
120  bpo::value<std::vector<std::string>>(),
121  "The command is a name of a dds-sessions command."
122  " Can be one of the following: start, stop, stop-all, list, set-default, and remove.\n\n"
123  "For user's convenience it is allowed to call dds-session without \"--command\" option"
124  " by just specifying the command name directly, like:\ndds-session start or dds-session stop.\n\n"
125  "Commands:\n"
126  " start : \tStart a new DDS session\n"
127  " stop : \tStop a given DDS session\n"
128  " Argument:\n"
129  " <session id>: a session ID to stop\n"
130  " stop-all : \tStop All running DDS sessions\n"
131  " list : \tList DDS sessions.\n"
132  " Arguments:\n"
133  " all: list all sessions\n"
134  " run: list only running sessions\n"
135  " set-default : \tSet a giving ID as a default DDS session\n"
136  " Argument:\n"
137  " <session id>: a session ID to set as default\n"
138  " clean : \tRemove all STOPPED DDS sessions\n");
139 
140  options.add_options()("force,f",
141  bpo::bool_switch(&_options->m_bForce),
142  "Force commands without prompting for a confirmation.\n"
143  "Can be used only with the \"remove\" command.");
144  options.add_options()("mixed",
145  bpo::bool_switch(&_options->m_bMixed),
146  "Use worker package for a mixed environment - workes on Linux and on OS X.\n"
147  "Can be used only with the \"start\" command.");
148 
149  //...positional
150  bpo::positional_options_description pd;
151  pd.add("command", 2);
152 
153  // Parsing command-line
154  bpo::variables_map vm;
155  bpo::store(bpo::command_line_parser(_argc, _argv).options(options).positional(pd).run(), vm);
156  bpo::notify(vm);
157 
158  // check for non-defaulted arguments
159  bpo::variables_map::const_iterator found =
160  find_if(vm.begin(),
161  vm.end(),
162  [](const bpo::variables_map::value_type& _v) { return (!_v.second.defaulted()); });
163 
164  if (vm.count("help") || vm.end() == found)
165  {
166  LOG(dds::misc::log_stdout) << options;
167  return false;
168  }
169  if (vm.count("version"))
170  {
171  LOG(dds::misc::log_stdout) << dds::misc::DDSVersionInfoString();
172  return false;
173  }
174 
175  // Command
176  if (vm.count("command"))
177  {
178  std::vector<std::string> commands = vm["command"].as<std::vector<std::string>>();
179  _options->m_Command = SOptions::getCommandByName(commands[0]);
180  if (SOptions::cmd_unknown == _options->m_Command)
181  {
182  LOG(dds::misc::log_stderr) << "unknown command: " << commands[0] << "\n\n" << options;
183  return false;
184  }
185 
186  if (SOptions::cmd_stop == _options->m_Command)
187  {
188  if (commands.size() > 1)
189  _options->m_sSessionID = commands[1];
190  }
191  else if (SOptions::cmd_set_default == _options->m_Command)
192  {
193  if (commands.size() < 2)
194  {
196  << "Missing argument. The set-default command requares a sessions ID\n\n";
197  return false;
198  }
199  _options->m_sSessionID = commands[1];
200  }
201  else if (SOptions::cmd_list == _options->m_Command)
202  {
203  if (commands.size() < 2)
204  {
205  LOG(dds::misc::log_stderr) << "Missing argument. Specify type of sorting.\n\n";
206  return false;
207  }
208  SSessionsSorting sortType(commands[1]);
210  {
211  LOG(dds::misc::log_stderr) << "Bad argument. Unknown type of sorting.\n\n";
212  return false;
213  }
214  _options->m_ListSessions = sortType;
215  }
216  }
217  else
218  {
219  LOG(dds::misc::log_stderr) << "Nothing to do\n\n" << options;
220  return false;
221  }
222 
223  if (SOptions_t::cmd_set_default == _options->m_Command && _options->m_sSessionID.empty())
224  {
225  LOG(dds::misc::log_stderr) << "Session ID argument is missing or empty";
226  return false;
227  }
228 
229  return true;
230  }
231  } // namespace session_cmd
232 } // namespace dds
233 #endif
SSessionsSorting m_ListSessions
Definition: dds-session/src/Options.h:102
Definition: dds-session/src/Options.h:73
bool m_bMixed
Definition: dds-session/src/Options.h:105
Definition: dds-session/src/Options.h:28
SSessionsSorting(const std::string &_val)
Definition: dds-session/src/Options.h:30
Definition: dds-session/src/Options.h:71
ETypes m_typedValue
Definition: dds-session/src/Options.h:41
Definition: dds-session/src/Options.h:22
Definition: dds-session/src/Options.h:27
bool ParseCmdLine(int _argc, char *_argv[], SOptions *_options)
Definition: dds-session/src/Options.h:109
Definition: dds-session/src/Options.h:68
Definition: dds-session/src/Options.h:69
#define LOG(severity)
Definition: Logger.h:34
Definition: def.h:151
Definition: dds-session/src/Options.h:26
Miscellaneous functions and helpers are located here.
Definition: AgentConnectionManager.h:13
struct dds::session_cmd::SOptions SOptions_t
dds-session's container of options
std::string m_sSessionID
Definition: dds-session/src/Options.h:104
Definition: dds-session/src/Options.h:70
SOptions()
Definition: dds-session/src/Options.h:77
std::string m_value
Definition: dds-session/src/Options.h:40
Definition: def.h:153
ECommands m_Command
Definition: dds-session/src/Options.h:101
bool m_bForce
Definition: dds-session/src/Options.h:103
ETypes
Definition: dds-session/src/Options.h:24
static ECommands getCommandByName(const std::string &_name)
Definition: dds-session/src/Options.h:84
dds-session's container of options
Definition: dds-session/src/Options.h:64
Definition: dds-session/src/Options.h:72
Definition: dds-session/src/Options.h:74
ECommands
Definition: dds-session/src/Options.h:66