otsdaq-utilities  3.06.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  {
80  }
83  {
84  if(this != &other)
85  {
86  parameters_ = other.parameters_;
87  feMacroRunDone_.store(other.feMacroRunDone_.load());
88  }
89  return *this;
90  }
91 
92  runFEMacroParameterStruct parameters_;
93  std::atomic<bool> feMacroRunDone_ = false;
94  std::unique_ptr<ProgressBar> bar_;
95  }; //end runFEMacroStruct struct
96 
99  {
100  uint64_t groupID_ = 0;
101  time_t startTime_ = time(0);
102  time_t completeTime_ = 0;
103  std::string historyFeClassSelected_;
104  std::string historyFeUIDSelected_;
105  std::string historyMacroType_;
106  std::string historyMacroName_;
107  std::string historyInputArgs_;
108  std::string historyOutputArgs_;
109  bool historySaveOutputs_ = false;
110  std::string historyUsername_;
111  bool historySaved_ = false;
112  std::vector<std::shared_ptr<runFEMacroStruct>> tasks_;
113 
114  bool allDone() const
115  {
116  for(const auto& t : tasks_)
117  if(!t->feMacroRunDone_)
118  return false;
119  return !tasks_.empty();
120  }
121  }; //end runFEMacroGroupStruct struct
122 
123  MacroMakerSupervisor(xdaq::ApplicationStub* s);
124  virtual ~MacroMakerSupervisor(void);
125 
126  void init(void);
127  void destroy(void);
128 
129  virtual void request(const std::string& requestType,
130  cgicc::Cgicc& cgiIn,
131  HttpXmlDocument& xmlOut,
132  const WebUsers::RequestUserInfo& userInfo) override;
133 
134  virtual void forceSupervisorPropertyValues(void) override;
135 
136  private:
138  void generateURL(void);
139  void verification(xgi::Input* in, xgi::Output* out);
140  void requestIcons(xgi::Input* in, xgi::Output* out);
141  void tooltipRequest(xgi::Input* in, xgi::Output* out);
142  void requestWrapper(xgi::Input* in, xgi::Output* out);
144 
145  static void RemoteControlWorkLoop(MacroMakerSupervisor* supervisorPtr);
146 
147  void handleRequest(const std::string Command,
148  HttpXmlDocument& xmldoc,
149  cgicc::Cgicc& cgi,
150  const WebUsers::RequestUserInfo& userInfo);
151 
152  xoap::MessageReference frontEndCommunicationRequest(xoap::MessageReference message);
153  xoap::MessageReference supervisorSequenceCheck(xoap::MessageReference message);
154 
155  void getFElist(HttpXmlDocument& xmldoc);
156  void getFEMacroList(HttpXmlDocument& xmldoc, const std::string& username);
157 
158  void writeData(HttpXmlDocument& xmldoc,
159  cgicc::Cgicc& cgi,
160  const std::string& username);
161  void readData(HttpXmlDocument& xmldoc,
162  cgicc::Cgicc& cgi,
163  const std::string& username);
164  void createMacro(HttpXmlDocument& xmldoc,
165  cgicc::Cgicc& cgi,
166  const std::string& username);
167  void loadMacro(const std::string& macroName,
168  std::string& macroString,
169  const std::string& username = "");
170  void loadMacros(HttpXmlDocument& xmldoc, const std::string& username);
171  void loadMacroNames(
172  const std::string& username,
173  std::pair<std::vector<std::string> /*public macros*/,
174  std::vector<std::string> /*private macros*/>& returnMacroNames);
175  void appendCommandToHistory(std::string command,
176  std::string Format,
177  std::string time,
178  std::string interfaces,
179  const std::string& username);
180  void appendCommandToHistory(std::string feClass,
181  std::string feUID,
182  std::string macroType,
183  std::string macroName,
184  std::string inputArgs,
185  std::string outputArgs,
186  bool saveOutputs,
187  const std::string& username,
188  time_t launchTime = 0,
189  time_t completeTime = 0);
190  void loadFEMacroSequences(HttpXmlDocument& xmldoc, const std::string& username);
191  void saveFEMacroSequence(cgicc::Cgicc& cgi, const std::string& username);
192  void getFEMacroSequence(HttpXmlDocument& xmldoc,
193  cgicc::Cgicc& cgi,
194  const std::string& username);
195  void runFEMacroSequence(HttpXmlDocument& xmldoc,
196  cgicc::Cgicc& cgi,
197  const std::string& username);
198  void deleteFEMacroSequence(cgicc::Cgicc& cgi, const std::string& username);
199  void makeSequencePublic(cgicc::Cgicc& cgi, const std::string& username);
200  void loadHistory(HttpXmlDocument& xmldoc, const std::string& username);
201  void loadFEHistory(HttpXmlDocument& xmldoc, const std::string& username);
202  void deleteMacro(HttpXmlDocument& xmldoc,
203  cgicc::Cgicc& cgi,
204  const std::string& username);
205  void editMacro(HttpXmlDocument& xmldoc,
206  cgicc::Cgicc& cgi,
207  const std::string& username);
208  void clearHistory(const std::string& username);
209  void clearFEHistory(const std::string& username);
210  void exportMacro(HttpXmlDocument& xmldoc,
211  cgicc::Cgicc& cgi,
212  const std::string& username);
213  void exportFEMacro(HttpXmlDocument& xmldoc,
214  cgicc::Cgicc& cgi,
215  const std::string& username);
216  void runFEMacro(HttpXmlDocument& xmldoc,
217  cgicc::Cgicc& cgi,
218  const WebUsers::RequestUserInfo& userInfo);
219  void runFEMacro(HttpXmlDocument& xmldoc,
220  std::string feClassSelected,
221  std::string feUIDSelected,
222  const std::string& macroType,
223  const std::string& macroName,
224  const std::string& inputArgs,
225  const std::string outputArgs,
226  bool saveOutputs,
227  const std::string& username,
228  const std::string& userGroupPermissions,
229  bool saveToHistory = true);
230  static void runFEMacroGroupSchedulerThread(std::shared_ptr<runFEMacroGroupStruct> group,
231  MacroMakerSupervisor* mmSupervisor);
232  static void runFEMacroThread(std::shared_ptr<runFEMacroStruct> feMacroRunThreadStruct,
233  MacroMakerSupervisor* mmSupervisor);
234 
235  std::string generateHexArray(const std::string& sourceHexString, int& numOfBytes);
236  bool isArgumentVariable(const std::string& argumentString);
237  void createCode(std::ostream& out,
238  const std::vector<std::string>& commands,
239  const std::string& tabOffset = "",
240  bool forFeMacro = false,
241  std::set<std::string>* inArgNames = 0,
242  std::set<std::string>* outArgNames = 0);
243 
244  SupervisorInfoMap allFESupervisorInfo_;
245  std::map<std::string /*FE UID*/, unsigned int /*superivisor index*/> FEtoSupervisorMap_;
246  std::map<std::string /*FE Type*/, std::set<std::string> /*FE UIDs*/> FEPluginTypetoFEsMap_;
247  std::map<std::string /*FE UID*/, std::string /*FE Type*/> FEtoPluginTypeMap_;
248 
249  std::string securityCode_;
250  bool defaultSequence_;
251 
252  std::map<std::string /* username */,
253  std::vector<std::string> /* last command */>
254  lastFeCommandToHistory_;
255 
256  std::vector<std::shared_ptr<runFEMacroGroupStruct>> feMacroRunThreadStruct_;
257  std::atomic<uint64_t> feMacroRunGroupIDCounter_{0};
258 
259  std::mutex feMacroRunThreadStructMutex_;
260 
261 }; // end MacroMakerSupervisor declaration
262 } // namespace ots
263 
264 #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.