DDS  ver. 1.6
dds-topology/src/Options.h
Go to the documentation of this file.
1 // Copyright 2014 GSI, Inc. All rights reserved.
2 //
3 //
4 //
5 #ifndef DDSOPTIONS_H
6 #define DDSOPTIONS_H
7 //=============================================================================
8 // BOOST
9 #include <boost/filesystem/operations.hpp>
10 #include <boost/filesystem/path.hpp>
11 #include <boost/program_options/options_description.hpp>
12 #include <boost/program_options/parsers.hpp>
13 // DDS
14 #include "BOOSTHelper.h"
15 #include "ProtocolCommands.h"
16 #include "Res.h"
17 #include "version.h"
18 //=============================================================================
19 namespace bpo = boost::program_options;
20 //=============================================================================
21 namespace dds
22 {
23  namespace topology_cmd
24  {
25  enum class ETopologyCmdType
26  {
27  UNKNOWN = -1,
28  UPDATE = 0,
29  ACTIVATE,
30  STOP,
31  VALIDATE
32  };
33 
35  typedef struct SOptions
36  {
38  : m_topologyCmd(ETopologyCmdType::UNKNOWN)
39  , m_verbose(false)
40  , m_bDisiableValidation(false)
41  {
42  }
43 
45  std::string m_sTopoFile;
46  bool m_verbose;
48  } SOptions_t;
49  //=============================================================================
50  inline void PrintVersion()
51  {
52  LOG(MiscCommon::log_stdout) << " v" << PROJECT_VERSION_STRING << "\n"
53  << "DDS configuration"
54  << " v" << USER_DEFAULTS_CFG_VERSION << "\n"
56  }
57  //=============================================================================
58  // Command line parser
59  inline bool ParseCmdLine(int _argc, char* _argv[], SOptions* _options) throw(std::exception)
60  {
61  if (nullptr == _options)
62  throw std::runtime_error("Internal error: options' container is empty.");
63 
64  // Generic options
65  bpo::options_description options("dds-agent-cmd options");
66  options.add_options()("help,h", "Produce help message");
67  options.add_options()("version,v", "Version information");
68  options.add_options()("update,u",
69  bpo::value<std::string>(&_options->m_sTopoFile),
70  "Define a topology to update currently active topology.");
71  options.add_options()("disable-validation",
72  bpo::bool_switch(&_options->m_bDisiableValidation),
73  "Disiable topology valiadation.");
74  options.add_options()("activate",
75  bpo::value<std::string>(&_options->m_sTopoFile),
76  "Request to activate agents, i.e. distribute and start user tasks.");
77  options.add_options()("stop", "Request to stop execution of user tasks.");
78  options.add_options()("validate",
79  bpo::value<std::string>(&_options->m_sTopoFile),
80  "Validate topology file against XSD schema.");
81  options.add_options()("verbose,V", "Verbose output");
82 
83  // Parsing command-line
84  bpo::variables_map vm;
85  bpo::store(bpo::command_line_parser(_argc, _argv).options(options).run(), vm);
86  bpo::notify(vm);
87 
88  MiscCommon::BOOSTHelper::conflicting_options(vm, "activate", "stop");
90  MiscCommon::BOOSTHelper::conflicting_options(vm, "update", "activate");
91 
92  if (vm.count("help") || vm.empty())
93  {
94  LOG(MiscCommon::log_stdout) << options;
95  return false;
96  }
97  if (vm.count("version"))
98  {
99  PrintVersion();
100  return false;
101  }
102  if (vm.count("verbose"))
103  {
104  _options->m_verbose = true;
105  }
106  if (vm.count("disable-validation"))
107  {
108  if (!vm.count("activate") && !vm.count("update"))
109  {
110  throw std::runtime_error("--disable-validation must be used together with --activate or --update");
111  }
112  }
113  if (vm.count("validate") && !_options->m_sTopoFile.empty())
114  {
115  _options->m_topologyCmd = ETopologyCmdType::VALIDATE;
116  // make absolute path
117  boost::filesystem::path pathTopoFile(_options->m_sTopoFile);
118  _options->m_sTopoFile = boost::filesystem::absolute(pathTopoFile).string();
119  return true;
120  }
121  if (vm.count("update") || vm.count("activate"))
122  {
123  // check, that topo file exists
124  if (!boost::filesystem::exists(_options->m_sTopoFile))
125  {
126  std::string sMsg("Can't find the topo file: ");
127  sMsg += _options->m_sTopoFile;
128  throw std::runtime_error(sMsg);
129  }
130 
131  if (vm.count("update"))
132  {
133  _options->m_topologyCmd = ETopologyCmdType::UPDATE;
134  }
135  else if (vm.count("activate"))
136  {
137  _options->m_topologyCmd = ETopologyCmdType::ACTIVATE;
138  }
139  // make absolute path
140  boost::filesystem::path pathTopoFile(_options->m_sTopoFile);
141  _options->m_sTopoFile = boost::filesystem::absolute(pathTopoFile).string();
142  return true;
143  }
144  else if (vm.count("stop"))
145  {
146  _options->m_topologyCmd = ETopologyCmdType::STOP;
147  _options->m_sTopoFile = "";
148  return true;
149  }
150  else
151  {
152  LOG(MiscCommon::log_stdout) << options;
153  return false;
154  }
155 
156  return true;
157  }
158  }
159 }
160 #endif
Definition: def.h:154
ETopologyCmdType m_topologyCmd
Definition: dds-topology/src/Options.h:44
struct dds::topology_cmd::SOptions SOptions_t
dds-agent-cmd&#39;s container of options
#define LOG(severity)
Definition: Logger.h:54
SOptions()
Definition: dds-topology/src/Options.h:37
bool m_verbose
Definition: dds-topology/src/Options.h:46
bool ParseCmdLine(int _argc, char *_argv[], SOptions *_options)
Definition: dds-topology/src/Options.h:59
const LPCSTR g_cszReportBugsAddr("Report bugs/comments to fairroot@gsi.de")
Definition: dds-agent/src/AgentConnectionManager.h:16
ETopologyCmdType
Definition: dds-topology/src/Options.h:25
dds-agent-cmd&#39;s container of options
Definition: dds-topology/src/Options.h:35
void PrintVersion()
Definition: dds-topology/src/Options.h:50
void conflicting_options(const boost::program_options::variables_map &_vm, const char *_opt1, const char *_opt2)
The conflicting_options function used to check that &#39;opt1&#39; and &#39;opt2&#39; are not specified at the same t...
Definition: BOOSTHelper.h:62
std::string m_sTopoFile
Definition: dds-topology/src/Options.h:45
bool m_bDisiableValidation
Definition: dds-topology/src/Options.h:47