tdaq-develop-2025-02-12
CorePropertySupervisorBase.h
1 #ifndef _ots_CorePropertySupervisorBase_h_
2 #define _ots_CorePropertySupervisorBase_h_
3 
4 #include "otsdaq/ConfigurationInterface/ConfigurationManager.h"
5 #include "otsdaq/ConfigurationInterface/ConfigurationTree.h"
6 #include "otsdaq/Macros/CoutMacros.h"
7 #include "otsdaq/MessageFacility/MessageFacility.h"
8 #include "otsdaq/SupervisorInfo/AllSupervisorInfo.h"
9 #include "otsdaq/TableCore/TableGroupKey.h"
10 #include "otsdaq/TablePlugins/XDAQContextTable/XDAQContextTable.h"
11 
12 #include "otsdaq/WebUsersUtilities/WebUsers.h" //for WebUsers::RequestUserInfo
13 
14 // #pragma GCC diagnostic push
15 // #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
16 // #include <xdaq/Application.h>
17 // #pragma GCC diagnostic pop
18 
19 #include "otsdaq/SOAPUtilities/SOAPMessenger.h"
20 #include "otsdaq/WorkLoopManager/WorkLoopManager.h"
21 
22 #include "otsdaq/CoreSupervisors/CorePropertySupervisorBase.h"
23 
24 #include "otsdaq/CgiDataUtilities/CgiDataUtilities.h"
25 #include "otsdaq/SOAPUtilities/SOAPUtilities.h"
26 #include "otsdaq/XmlUtilities/HttpXmlDocument.h"
27 
28 #include "otsdaq/FiniteStateMachine/VStateMachine.h"
29 
30 #include "otsdaq/MessageFacility/ITRACEController.h"
31 #include "otsdaq/WebUsersUtilities/RemoteWebUsers.h"
32 
33 #pragma GCC diagnostic push
34 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
35 #include <xdaq/Application.h>
36 #pragma GCC diagnostic pop
37 #include "otsdaq/Macros/XDAQApplicationMacros.h"
38 #include "xgi/Method.h"
39 
40 #include <toolbox/fsm/FailedEvent.h>
41 
42 #include <xdaq/NamespaceURI.h>
43 #include <xoap/Method.h>
44 
45 namespace ots
46 {
47 // clang-format off
48 
49 class ITRACEController;
50 
55 {
56  friend class GatewaySupervisor;
57 
58  public:
59  CorePropertySupervisorBase(xdaq::Application* application);
60  virtual ~CorePropertySupervisorBase(void);
61 
62  AllSupervisorInfo allSupervisorInfo_;
63  ConfigurationManager* theConfigurationManager_;
64 
65  XDAQ_CONST_CALL xdaq::ApplicationDescriptor* getGatewaySupervisorDescriptor (void);
66 
67  virtual void setSupervisorPropertyDefaults (void);
68  virtual void forceSupervisorPropertyValues (void){;}
69 
70  void getRequestUserInfo (WebUsers::RequestUserInfo& requestUserInfo);
71 
74  static void extractPermissionsMapFromString (const std::string& permissionsString, std::map<std::string, WebUsers::permissionLevel_t>& permissionsMap);
75  static bool doPermissionsGrantAccess (std::map<std::string, WebUsers::permissionLevel_t>& permissionLevelsMap, std::map<std::string, WebUsers::permissionLevel_t>& permissionThresholdsMap);
76 
77  ConfigurationTree getContextTreeNode (void) const
78  {
79  return theConfigurationManager_->getNode(
80  theConfigurationManager_->__GET_CONFIG__(XDAQContextTable)->getTableName());
81  }
82  ConfigurationTree getSupervisorTableNode (void) const
83  {
84  return getContextTreeNode().getNode(supervisorConfigurationPath_);
85  }
86 
87  const std::string& getContextUID (void) const { return supervisorContextUID_; }
88  const std::string& getSupervisorUID (void) const { return supervisorApplicationUID_; }
89  const std::string& getSupervisorConfigurationPath (void) const
90  {
91  return supervisorConfigurationPath_;
92  }
93 
94  protected:
95  const std::string supervisorClass_;
96  const std::string supervisorClassNoNamespace_;
97 
98  static void indicateOtsAlive (const CorePropertySupervisorBase* properties = 0);
99  static void indicateOtsDead (const CorePropertySupervisorBase* properties = 0);
100 
101  private:
102 
103  std::string supervisorContextUID_;
104  std::string supervisorApplicationUID_;
105  std::string supervisorConfigurationPath_;
106 
107 
108  protected:
109  xoap::MessageReference TRACESupervisorRequest (xoap::MessageReference message);
110  const std::string& getTraceLevels (void);
111  const std::string& setTraceLevels (std::string const& host, std::string const& mode, std::string const& labelsStr, uint32_t setValueMSB, uint32_t setValueLSB);
112  const std::string& setIndividualTraceLevels (std::string const& host, std::string const& mode, std::string const& labelValuesStr);
113  const std::string& getTraceTriggerStatus (void);
114  const std::string& setTraceTriggerEnable (std::string const& host, size_t entriesAfterTrigger);
115  const std::string& resetTRACE (std::string const& host);
116  const std::string& enableTRACE (std::string const& host, bool enable);
117  const std::string& getTraceSnapshot (std::string const& host, std::string const& filterFor, std::string const& filterOut);
118 
122  static const struct SupervisorProperties
123  {
125  : allSetNames_({&CheckUserLockRequestTypes,
126  &RequireUserLockRequestTypes,
127  &AutomatedRequestTypes,
128  &AllowNoLoginRequestTypes,
129  &RequireSecurityRequestTypes,
130  &NoXmlWhiteSpaceRequestTypes,
131  &NonXMLRequestTypes})
132  {
133  }
134 
135  const std::string UserPermissionsThreshold = "UserPermissionsThreshold";
136  const std::string UserGroupsAllowed = "UserGroupsAllowed";
137  const std::string UserGroupsDisallowed = "UserGroupsDisallowed";
138 
139  const std::string CheckUserLockRequestTypes = "CheckUserLockRequestTypes";
140  const std::string RequireUserLockRequestTypes = "RequireUserLockRequestTypes";
141  const std::string AutomatedRequestTypes = "AutomatedRequestTypes";
142  const std::string AllowNoLoginRequestTypes = "AllowNoLoginRequestTypes";
143  const std::string RequireSecurityRequestTypes = "RequireSecurityRequestTypes";
144 
145  const std::string NoXmlWhiteSpaceRequestTypes = "NoXmlWhiteSpaceRequestTypes";
146  const std::string NonXMLRequestTypes = "NonXMLRequestTypes";
147 
148  const std::set<const std::string*> allSetNames_;
149  } SUPERVISOR_PROPERTIES;
150 
151  private:
153  void checkSupervisorPropertySetup (void);
154  volatile bool propertiesAreSetup_;
155 
159  std::map<std::string, std::string> propertyMap_;
160  struct CoreSupervisorPropertyStruct
161  {
162  CoreSupervisorPropertyStruct()
163  : allSets_({&CheckUserLockRequestTypes,
164  &RequireUserLockRequestTypes,
165  &AutomatedRequestTypes,
166  &AllowNoLoginRequestTypes,
167  &RequireSecurityRequestTypes,
168  &NoXmlWhiteSpaceRequestTypes,
169  &NonXMLRequestTypes})
170  {
171  }
172 
173  std::map<std::string, WebUsers::permissionLevel_t> UserPermissionsThreshold;
174  std::map<std::string, std::string> UserGroupsAllowed;
175  std::map<std::string, std::string> UserGroupsDisallowed;
176 
177  std::set<std::string> CheckUserLockRequestTypes;
178  std::set<std::string> RequireUserLockRequestTypes;
179  std::set<std::string> AutomatedRequestTypes;
180  std::set<std::string> AllowNoLoginRequestTypes;
181  std::set<std::string> RequireSecurityRequestTypes;
182 
183  std::set<std::string> NoXmlWhiteSpaceRequestTypes;
184  std::set<std::string> NonXMLRequestTypes;
185 
186  std::set<std::set<std::string>*> allSets_;
187  } propertyStruct_;
188 
189  public:
190  void resetPropertiesAreSetup (void)
191  {
192  propertiesAreSetup_ = false;
193  } // forces reload of properties from configuration
194  ConfigurationTree getSupervisorTreeNode(void);
195 
196  void loadUserSupervisorProperties (void);
197  template<class T>
198  void setSupervisorProperty (
199  const std::string& propertyName, const T& propertyValue)
200  {
201  std::stringstream ss;
202  ss << propertyValue;
203  setSupervisorProperty(propertyName, ss.str());
204  } //end setSupervisorProperty()
205  void setSupervisorProperty (const std::string& propertyName,
206  const std::string& propertyValue);
207  template<class T>
208  void addSupervisorProperty (
209  const std::string& propertyName, const T& propertyValue)
210  {
211  // prepend new values.. since map/set extraction takes the first value encountered
212  std::stringstream ss;
213  ss << propertyValue << " | " << getSupervisorProperty(propertyName);
214  setSupervisorProperty(propertyName, ss.str());
215  } //end addSupervisorProperty()
216  void addSupervisorProperty (const std::string& propertyName, const std::string& propertyValue);
217  template<class T>
218  T getSupervisorProperty (
219  const std::string& propertyName)
220  {
221  // check if need to setup properties
222  checkSupervisorPropertySetup();
223 
224  auto it = propertyMap_.find(propertyName);
225  if(it == propertyMap_.end())
226  {
227  __SS__ << "Could not find property named " << propertyName << __E__;
228  __SS_THROW__;
229  }
230  return StringMacros::validateValueForDefaultStringDataType<T>(it->second);
231  } //end getSupervisorProperty()
232  template<class T>
233  T getSupervisorProperty (
234  const std::string& propertyName, const T& defaultValue)
235  {
236  // check if need to setup properties
237  checkSupervisorPropertySetup();
238 
239  auto it = propertyMap_.find(propertyName);
240  if(it == propertyMap_.end())
241  {
242  //not found, so returning default value
243  return defaultValue;
244  }
245  return StringMacros::validateValueForDefaultStringDataType<T>(it->second);
246  } //end getSupervisorProperty()
247  std::string getSupervisorProperty (const std::string& propertyName);
248  std::string getSupervisorProperty (const std::string& propertyName, const std::string& defaultValue);
249  WebUsers::permissionLevel_t getSupervisorPropertyUserPermissionsThreshold (const std::string& requestType);
250 
251  time_t getSupervisorUptime (void) const { return time(0) - constructedTime_;}
252 
253  protected:
255  private:
256  std::string traceReturnString_, traceReturnHostString_;
257  bool readOnly_;
258  const time_t constructedTime_ = time(0);
259 };
260 
261 // clang-format on
262 
263 } // namespace ots
264 
265 #endif
ConfigurationTree getNode(const std::string &nodeString, bool doNotThrowOnBrokenUIDLinks=false) const
"root/parent/parent/"
ConfigurationTree getNode(const std::string &nodeName, bool doNotThrowOnBrokenUIDLinks=false) const
navigating between nodes
static void extractPermissionsMapFromString(const std::string &permissionsString, std::map< std::string, WebUsers::permissionLevel_t > &permissionsMap)
static bool doPermissionsGrantAccess(std::map< std::string, WebUsers::permissionLevel_t > &permissionLevelsMap, std::map< std::string, WebUsers::permissionLevel_t > &permissionThresholdsMap)
ITRACEController * theTRACEController_
only define for an app that receives a command
virtual void forceSupervisorPropertyValues(void)
override to force supervisor property values (and ignore user settings)
void getRequestUserInfo(WebUsers::RequestUserInfo &requestUserInfo)
WebUsers::permissionLevel_t getSupervisorPropertyUserPermissionsThreshold(const std::string &requestType)
XDAQ_CONST_CALL xdaq::ApplicationDescriptor * getGatewaySupervisorDescriptor(void)
will be wizard supervisor in wiz mode
virtual void setSupervisorPropertyDefaults(void)
override to control supervisor specific defaults