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