otsdaq-utilities  3.08.00
MacroMakerSupervisor.h
1 #ifndef _ots_MacroMakerSupervisor_h_
2 #define _ots_MacroMakerSupervisor_h_
3 
4 #include "otsdaq/CoreSupervisors/CoreSupervisorBase.h"
5 #include "otsdaq/ProgressBar/ProgressBar.h"
6 
7 #include <atomic>
8 #include <memory>
9 #include <mutex>
10 
11 namespace ots
12 {
18 {
19  public:
20  XDAQ_INSTANTIATOR();
21 
25  {
29  {
30  HttpXmlDocument xmldoc_;
31  std::string feClassSelected_;
32  std::string feUIDSelected_;
33  std::string macroType_;
34  std::string macroName_;
35  std::string inputArgs_;
36  std::string outputArgs_;
37  bool saveOutputs_;
38  std::string runningUsername_;
39  std::string userGroupPermissions_;
40 
41  time_t startTime_ = time(0);
42  time_t doneTime_ = -1;
43  std::string feMacroRunError_ = "";
44  uint64_t threadID_ = 0; //Note: std::thread::id() is invalid thread id;
45  }; // end runFEMacroParameterStruct struct
46 
48  const HttpXmlDocument& xmldoc,
49  const std::string& feClassSelected,
50  const std::string& feUIDSelected,
51  const std::string& macroType,
52  const std::string& macroName,
53  const std::string& inputArgs,
54  const std::string& outputArgs,
55  bool saveOutputs,
56  const std::string& runningUsername,
57  const std::string& userGroupPermissions)
58  {
59  parameters_.xmldoc_ = xmldoc;
60  parameters_.feClassSelected_ = feClassSelected;
61  parameters_.feUIDSelected_ = feUIDSelected;
62  parameters_.macroType_ = macroType;
63  parameters_.macroName_ = macroName;
64  parameters_.inputArgs_ = inputArgs;
65  parameters_.outputArgs_ = outputArgs;
66  parameters_.saveOutputs_ = saveOutputs;
67  parameters_.runningUsername_ = runningUsername;
68  parameters_.userGroupPermissions_ = userGroupPermissions;
69  } //end runFEMacroStruct() constructor
70 
73  runFEMacroStruct& operator=(const runFEMacroStruct&) = delete;
74 
77  : parameters_(other.parameters_)
78  , feMacroRunDone_(other.feMacroRunDone_.load())
79  , realProgress_(other.realProgress_.load())
80  {
81  }
84  {
85  if(this != &other)
86  {
87  parameters_ = other.parameters_;
88  feMacroRunDone_.store(other.feMacroRunDone_.load());
89  realProgress_.store(other.realProgress_.load());
90  }
91  return *this;
92  }
93 
94  runFEMacroParameterStruct parameters_;
95  std::atomic<bool> feMacroRunDone_ = false;
96  std::atomic<int> realProgress_ = -1;
97  std::unique_ptr<ProgressBar> bar_;
98  }; //end runFEMacroStruct struct
99 
102  {
103  uint64_t groupID_ = 0;
104  time_t startTime_ = time(0);
105  time_t completeTime_ = 0;
106  std::string historyFeClassSelected_;
107  std::string historyFeUIDSelected_;
108  std::string historyMacroType_;
109  std::string historyMacroName_;
110  std::string historyInputArgs_;
111  std::string historyOutputArgs_;
112  bool historySaveOutputs_ = false;
113  std::string historyUsername_;
114  bool historySaved_ = false;
115  std::vector<std::shared_ptr<runFEMacroStruct>> tasks_;
116 
117  bool allDone() const
118  {
119  for(const auto& t : tasks_)
120  if(!t->feMacroRunDone_)
121  return false;
122  return !tasks_.empty();
123  }
124  }; //end runFEMacroGroupStruct struct
125 
126  MacroMakerSupervisor(xdaq::ApplicationStub* s);
127  virtual ~MacroMakerSupervisor(void);
128 
129  void init(void);
130  void destroy(void);
131 
132  virtual void request(const std::string& requestType,
133  cgicc::Cgicc& cgiIn,
134  HttpXmlDocument& xmlOut,
135  const WebUsers::RequestUserInfo& userInfo) override;
136 
137  virtual void forceSupervisorPropertyValues(void) override;
138 
139  private:
141  void generateURL(void);
142  void verification(xgi::Input* in, xgi::Output* out);
143  void requestIcons(xgi::Input* in, xgi::Output* out);
144  void tooltipRequest(xgi::Input* in, xgi::Output* out);
145  void requestWrapper(xgi::Input* in, xgi::Output* out);
147 
148  static void RemoteControlWorkLoop(MacroMakerSupervisor* supervisorPtr);
149 
150  void handleRequest(const std::string Command,
151  HttpXmlDocument& xmldoc,
152  cgicc::Cgicc& cgi,
153  const WebUsers::RequestUserInfo& userInfo);
154 
155  xoap::MessageReference frontEndCommunicationRequest(xoap::MessageReference message);
156  xoap::MessageReference supervisorSequenceCheck(xoap::MessageReference message);
157 
158  void getFElist(HttpXmlDocument& xmldoc);
159  void getFEMacroList(HttpXmlDocument& xmldoc, const std::string& username);
160 
161  void writeData(HttpXmlDocument& xmldoc,
162  cgicc::Cgicc& cgi,
163  const std::string& username);
164  void readData(HttpXmlDocument& xmldoc,
165  cgicc::Cgicc& cgi,
166  const std::string& username);
167  void createMacro(HttpXmlDocument& xmldoc,
168  cgicc::Cgicc& cgi,
169  const std::string& username);
170  void loadMacro(const std::string& macroName,
171  std::string& macroString,
172  const std::string& username = "");
173  void loadMacros(HttpXmlDocument& xmldoc, const std::string& username);
174  void loadMacroNames(
175  const std::string& username,
176  std::pair<std::vector<std::string> /*public macros*/,
177  std::vector<std::string> /*private macros*/>& returnMacroNames);
178  void appendCommandToHistory(std::string command,
179  std::string Format,
180  std::string time,
181  std::string interfaces,
182  const std::string& username);
183  void appendCommandToHistory(std::string feClass,
184  std::string feUID,
185  std::string macroType,
186  std::string macroName,
187  std::string inputArgs,
188  std::string outputArgs,
189  bool saveOutputs,
190  const std::string& username,
191  time_t launchTime = 0,
192  time_t completeTime = 0);
193  void loadFEMacroSequences(HttpXmlDocument& xmldoc, const std::string& username);
194  void saveFEMacroSequence(cgicc::Cgicc& cgi, const std::string& username);
195  void getFEMacroSequence(HttpXmlDocument& xmldoc,
196  cgicc::Cgicc& cgi,
197  const std::string& username);
198  void runFEMacroSequence(HttpXmlDocument& xmldoc,
199  cgicc::Cgicc& cgi,
200  const std::string& username);
201  void deleteFEMacroSequence(cgicc::Cgicc& cgi, const std::string& username);
202  void makeSequencePublic(cgicc::Cgicc& cgi, const std::string& username);
203  void loadHistory(HttpXmlDocument& xmldoc, const std::string& username);
204  void loadFEHistory(HttpXmlDocument& xmldoc, const std::string& username);
205  void deleteMacro(HttpXmlDocument& xmldoc,
206  cgicc::Cgicc& cgi,
207  const std::string& username);
208  void editMacro(HttpXmlDocument& xmldoc,
209  cgicc::Cgicc& cgi,
210  const std::string& username);
211  void clearHistory(const std::string& username);
212  void clearFEHistory(const std::string& username);
213  void exportMacro(HttpXmlDocument& xmldoc,
214  cgicc::Cgicc& cgi,
215  const std::string& username);
216  void exportFEMacro(HttpXmlDocument& xmldoc,
217  cgicc::Cgicc& cgi,
218  const std::string& username);
219  void runFEMacro(HttpXmlDocument& xmldoc,
220  cgicc::Cgicc& cgi,
221  const WebUsers::RequestUserInfo& userInfo);
222  void runFEMacro(HttpXmlDocument& xmldoc,
223  std::string feClassSelected,
224  std::string feUIDSelected,
225  const std::string& macroType,
226  const std::string& macroName,
227  const std::string& inputArgs,
228  const std::string outputArgs,
229  bool saveOutputs,
230  const std::string& username,
231  const std::string& userGroupPermissions,
232  bool saveToHistory = true,
233  std::atomic<int>* realProgressOut = nullptr);
234  static void runFEMacroGroupSchedulerThread(std::shared_ptr<runFEMacroGroupStruct> group,
235  MacroMakerSupervisor* mmSupervisor);
236  static void runFEMacroThread(std::shared_ptr<runFEMacroStruct> feMacroRunThreadStruct,
237  MacroMakerSupervisor* mmSupervisor);
238 
239  std::string generateHexArray(const std::string& sourceHexString, int& numOfBytes);
240  bool isArgumentVariable(const std::string& argumentString);
241  void createCode(std::ostream& out,
242  const std::vector<std::string>& commands,
243  const std::string& tabOffset = "",
244  bool forFeMacro = false,
245  std::set<std::string>* inArgNames = 0,
246  std::set<std::string>* outArgNames = 0);
247 
248  SupervisorInfoMap allFESupervisorInfo_;
249  std::map<std::string /*FE UID*/, unsigned int /*superivisor index*/> FEtoSupervisorMap_;
250  std::map<std::string /*FE Type*/, std::set<std::string> /*FE UIDs*/> FEPluginTypetoFEsMap_;
251  std::map<std::string /*FE UID*/, std::string /*FE Type*/> FEtoPluginTypeMap_;
252 
253  std::string securityCode_;
254  bool defaultSequence_;
255 
256  std::map<std::string /* username */,
257  std::vector<std::string> /* last command */>
258  lastFeCommandToHistory_;
259 
260  std::vector<std::shared_ptr<runFEMacroGroupStruct>> feMacroRunThreadStruct_;
261  std::atomic<uint64_t> feMacroRunGroupIDCounter_{0};
262 
263  std::mutex feMacroRunThreadStructMutex_;
264 
265 }; // end MacroMakerSupervisor declaration
266 } // namespace ots
267 
268 #endif
friend friend class MacroMakerSupervisor
virtual void forceSupervisorPropertyValues(void) override
override to force supervisor property values (and ignore user settings)
runFEMacroGroupStruct groups per-UID tasks launched in parallel under one NotDoneID
runFEMacroStruct(runFEMacroStruct &&other) noexcept
Allow move constructor because std::atomic is not copyable.
runFEMacroStruct(const runFEMacroStruct &)=delete
Delete copy constructor because std::atomic is not copyable.
runFEMacroStruct & operator=(runFEMacroStruct &&other) noexcept
Allow move constructor because std::atomic is not copyable, for vector erase.