otsdaq  3.06.00
CorePropertySupervisorBase.cc
1 #include "otsdaq/CoreSupervisors/CorePropertySupervisorBase.h"
2 #include "otsdaq/MessageFacility/ITRACEController.h"
3 #include "otsdaq/MessageFacility/TRACEController.h"
4 
5 #include <sys/statvfs.h> // for disk space checking with statvfs
6 
7 using namespace ots;
8 
10  CorePropertySupervisorBase::SUPERVISOR_PROPERTIES =
12 
13 // clang-format off
14 //==============================================================================
15 CorePropertySupervisorBase::CorePropertySupervisorBase(xdaq::Application* application)
16  : theConfigurationManager_(0) // new ConfigurationManager)
17  , supervisorClass_(application->getApplicationDescriptor()->getClassName())
18  , supervisorClassNoNamespace_(
19  supervisorClass_.substr(supervisorClass_.find_last_of(":") + 1, supervisorClass_.length() - supervisorClass_.find_last_of(":")))
20  , supervisorContextUID_("UNINITIALIZED_supervisorContextUID") // MUST BE INITIALIZED INSIDE THE CONTRUCTOR TO THROW EXCEPTIONS on bad conditions
21  , supervisorApplicationUID_("UNINITIALIZED_supervisorApplicationUID") // MUST BE INITIALIZED INSIDE THE CONTRUCTOR TO THROW EXCEPTIONS on bad conditions
22  , supervisorConfigurationPath_("UNINITIALIZED_supervisorConfigurationPath") // MUST BE INITIALIZED INSIDE THE CONTRUCTOR TO THROW EXCEPTIONS on bad conditions
23  , propertiesAreSetup_(false)
24  , theTRACEController_(nullptr)
25  , OTSDAQ_LOG_DIR(__ENV__("OTSDAQ_LOG_DIR"))
26  , OTSDAQ_DATA_DIR(__ENV__("OTSDAQ_DATA"))
27 {
28  INIT_MF("." /*directory used is USER_DATA/LOG/.*/);
29 
30 
31 
32  __SUP_COUT_INFO__ << "Supervisor URL = " << application->getApplicationContext()->getContextDescriptor()->getURL() << __E__;
33  __SUP_COUT_INFO__ << "Supervisor LID = " << application->getApplicationDescriptor()->getLocalId() << __E__;
34  __SUP_COUT_INFO__ << "Supervisor Class = " << supervisorClass_ << __E__;
35  __SUP_COUTV__(supervisorClassNoNamespace_);
36 
37  // get all supervisor info, and wiz mode, macroMaker mode, or not
38  allSupervisorInfo_.init(application->getApplicationContext());
39 
40  //---------------
41  { // init StringMacros::systemVariables_
42  StringMacros::systemVariables_["ActiveStateMachine"]["name"] = StringMacros::TBD;
43  StringMacros::systemVariables_["ActiveStateMachine"]["windowName"] = StringMacros::TBD;
44  StringMacros::systemVariables_["ActiveStateMachine"]["runAlias"] = StringMacros::TBD;
45  } // end init StringMacros::systemVariables_
46  __SUP_COUTV__(StringMacros::mapToString(StringMacros::systemVariables_));
47 
48  if(allSupervisorInfo_.isMacroMakerMode())
49  {
50  theConfigurationManager_ = new ConfigurationManager(false /*initForWriteAccess*/, true /*initializeFromFhicl*/);
51  __SUP_COUT__ << "Macro Maker mode detected. So skipping configuration location work for "
52  "supervisor of class '"
53  << supervisorClass_ << "'" << __E__;
54 
55  supervisorContextUID_ = "MacroMakerFEContext";
56  supervisorApplicationUID_ = "MacroMakerFESupervisor";
57  supervisorConfigurationPath_ = CorePropertySupervisorBase::supervisorContextUID_ + "/LinkToApplicationTable/" +
58  CorePropertySupervisorBase::supervisorApplicationUID_ + "/LinkToSupervisorTable";
59 
60  __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
61  __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
62  __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
63 
64  //move to after configure for MacroMaker mode
65  // CorePropertySupervisorBase::indicateOtsAlive(0);
66 
67  return;
68  }
69  else if(allSupervisorInfo_.isWizardMode())
70  {
71  __SUP_COUT__ << "Wiz mode detected. So skipping configuration location work for "
72  "supervisor of class '"
73  << supervisorClass_ << "'" << __E__;
74  supervisorContextUID_ = "NO CONTEXT ID IN WIZ MODE";
75  supervisorApplicationUID_ = std::to_string(application->getApplicationDescriptor()->getLocalId());
76  supervisorConfigurationPath_ = "NO APP PATH IN WIZ MODE";
77 
78  __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
79  __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
80  __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
81 
82  return;
83  }
84 
85  __SUP_COUT__ << "Getting configuration specific info for supervisor '" << (allSupervisorInfo_.getSupervisorInfo(application).getName()) << "' of class "
86  << supervisorClass_ << "." << __E__;
87 
88  // get configuration specific info for the application supervisor
89 
90  try
91  {
92  __SUP_COUTV__(application->getApplicationContext()->getContextDescriptor()->getURL());
93  theConfigurationManager_ = new ConfigurationManager();
94  CorePropertySupervisorBase::supervisorContextUID_ =
95  theConfigurationManager_->__GET_CONFIG__(XDAQContextTable)->getContextUID(application->getApplicationContext()->getContextDescriptor()->getURL());
96  if(CorePropertySupervisorBase::supervisorContextUID_ == "")
97  {
98  __SUP_SS__ << "Illegal empty Supervisor Context UID identified - could not find a valid UID based on Supervisor's provided URL (" <<
99  application->getApplicationContext()->getContextDescriptor()->getURL() << "). Please try again or contact admins." << __E__;
100  __SUP_SS_THROW__;
101  }
102  }
103  catch(...)
104  {
105  __SUP_COUT_ERR__ << "XDAQ Supervisor could not access it's configuration through "
106  "the Configuration Manager."
107  << ". The getApplicationContext()->getContextDescriptor()->getURL() = "
108  << application->getApplicationContext()->getContextDescriptor()->getURL() << __E__;
109  throw;
110  }
111 
112  try
113  {
114  __SUP_COUTV__(application->getApplicationDescriptor()->getLocalId());
115  CorePropertySupervisorBase::supervisorApplicationUID_ = theConfigurationManager_->__GET_CONFIG__(XDAQContextTable)
116  ->getApplicationUID(application->getApplicationContext()->getContextDescriptor()->getURL(),
117  application->getApplicationDescriptor()->getLocalId());
118  if(CorePropertySupervisorBase::supervisorApplicationUID_ == "")
119  {
120  __SUP_SS__ << "Illegal empty Supervisor Application UID identified. Please try again or contact admins." << __E__;
121  __SUP_SS_THROW__;
122  }
123  }
124  catch(...)
125  {
126  __SUP_COUT_ERR__ << "XDAQ Supervisor could not access it's configuration through "
127  "the Configuration Manager."
128  << " The supervisorContextUID_ = " << supervisorContextUID_ << ". The supervisorApplicationUID = " << supervisorApplicationUID_
129  << __E__;
130  throw;
131  }
132 
133  CorePropertySupervisorBase::supervisorConfigurationPath_ = "/" + CorePropertySupervisorBase::supervisorContextUID_ + "/LinkToApplicationTable/" +
134  CorePropertySupervisorBase::supervisorApplicationUID_ + "/LinkToSupervisorTable";
135 
136  __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
137  __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
138  __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
139 
140  //try to verify binding port for context was established
141  //All this code failed to do the trick
142  // {
143  // application->ptr_;
144 
145  // PeerTransportHTTP(this)
146  // const xdaq::NetGroup* netGroupPtr = application->getApplicationContext()->getNetGroup();
147  // auto netVector = netGroupPtr->getNetworks();
148  // __SUP_COUTV__(netVector.size());
149  // }
150 
151  //---------------
152  CorePropertySupervisorBase::indicateOtsAlive(this);
153 
154  theConfigurationManager_->setOwnerContext(CorePropertySupervisorBase::supervisorContextUID_);
155  theConfigurationManager_->setOwnerApp(CorePropertySupervisorBase::supervisorApplicationUID_);
156 
157  CorePropertySupervisorBase::isFirstAppInContext_ = theConfigurationManager_->isOwnerFirstAppInContext();
158 } // end constructor
159 // clang-format on
160 
161 //==============================================================================
162 CorePropertySupervisorBase::~CorePropertySupervisorBase(void)
163 {
164  __SUP_COUT__ << "Destructor." << __E__;
165 
166  CorePropertySupervisorBase::indicateOtsDead(this);
167 
168  if(theConfigurationManager_)
169  delete theConfigurationManager_;
170 
172  {
173  __SUP_COUT__ << "Destroying TRACE Controller..." << __E__;
174  delete theTRACEController_;
175  theTRACEController_ = nullptr;
176  }
177  __SUP_COUT__ << "Destructed." << __E__;
178 } // end destructor
179 
180 //==============================================================================
183 void CorePropertySupervisorBase::getAvailableDiskSpace()
184 {
185  if(!isFirstAppInContext_)
186  return;
187 
188  time_t t = time(0);
189  if(t - lastDiskSpaceCheckTime_ <= 10)
190  return; //only check every 10 seconds
191 
192  struct statvfs logStat;
193  if(statvfs((OTSDAQ_LOG_DIR + "/").c_str(), &logStat) != 0)
194  {
195  __SUP_SS__ << "Disk space retrieval failed for log directory: " << OTSDAQ_LOG_DIR
196  << __E__;
197  __SUP_SS_THROW__;
198  }
199  uint64_t availableLogSpaceKB =
200  (uint64_t)logStat.f_bavail * logStat.f_frsize / 1024; // in KB
201  __SUP_COUTTV__(availableLogSpaceKB);
202 
203  struct statvfs dataStat;
204  if(statvfs((OTSDAQ_DATA_DIR + "/").c_str(), &dataStat) != 0)
205  {
206  __SUP_SS__ << "Disk space retrieval failed for data directory: "
207  << OTSDAQ_DATA_DIR << __E__;
208  __SUP_SS_THROW__;
209  }
210  uint64_t availableDataSpaceKB =
211  (uint64_t)dataStat.f_bavail * dataStat.f_frsize / 1024; // in KB
212  __SUP_COUTTV__(availableDataSpaceKB);
213 
214  availableLogSpaceKB_ = availableLogSpaceKB;
215  availableDataSpaceKB_ = availableDataSpaceKB;
216 
217  lastDiskSpaceCheckTime_ = time(0);
218 } //end getAvailableDiskSpace()
219 
220 //==============================================================================
221 void CorePropertySupervisorBase::indicateOtsAlive(
222  const CorePropertySupervisorBase* properties)
223 {
224  char portStr[100] = "0";
225  std::string hostname = "wiz";
226 
227  /* Note: the environment variable __ENV__("HOSTNAME")
228  // fails in multinode ots systems started through ssh
229  // because it will change meaning from host to host
230  */
231 
232  if(properties)
233  {
234  unsigned int port = properties->getContextTreeNode()
235  .getNode(properties->supervisorContextUID_)
236  .getNode("Port")
237  .getValue<unsigned int>();
238 
239  // help the user out if the config has old defaults for port/address
240  // Same as XDAQContextTable_table.cc:extractContexts:L164
241  if(port == 0) // convert 0 to ${OTS_MAIN_PORT}
242  port = atoi(__ENV__("OTS_MAIN_PORT"));
243 
244  sprintf(portStr, "%u", port);
245 
246  hostname = properties->getContextTreeNode()
247  .getNode(properties->supervisorContextUID_)
248  .getNode("Address")
249  .getValue<std::string>();
250  if(hostname == "DEFAULT") // convert DEFAULT to http://${HOSTNAME}
251  hostname = "http://" + std::string(__ENV__("HOSTNAME"));
252 
253  size_t i = hostname.find("//");
254  if(i != std::string::npos)
255  hostname = hostname.substr(i + 2);
256 
257  __COUTV__(hostname);
258  }
259 
260  // indicate ots is alive (for ots script to verify launch was successful)
261  std::string filename = std::string(__ENV__("OTSDAQ_LOG_DIR")) + "/otsdaq_is_alive-" +
262  hostname + "-" + portStr + ".dat";
263  FILE* fp = fopen(filename.c_str(), "w");
264  if(!fp)
265  {
266  __SS__ << "Failed to open the ots-is-alive file: " << filename << __E__;
267  __SS_THROW__;
268  }
269  fprintf(fp, "%s %s %ld\n", hostname.c_str(), portStr, time(0));
270  fclose(fp);
271 
272  __COUT__ << "Marked alive: " << filename << __E__;
273 } // end indicateOtsAlive()
274 
275 //==============================================================================
276 void CorePropertySupervisorBase::indicateOtsDead(
277  const CorePropertySupervisorBase* properties)
278 {
279  char portStr[100] = "0";
280  std::string hostname = "wiz";
281 
282  /* Note: the environment variable __ENV__("HOSTNAME")
283  // fails in multinode ots systems started through ssh
284  // because it will change meaning from host to host
285  */
286 
287  if(properties)
288  {
289  unsigned int port = properties->getContextTreeNode()
290  .getNode(properties->supervisorContextUID_)
291  .getNode("Port")
292  .getValue<unsigned int>();
293 
294  // help the user out if the config has old defaults for port/address
295  // Same as XDAQContextTable_table.cc:extractContexts:L164
296  if(port == 0) // convert 0 to ${OTS_MAIN_PORT}
297  port = atoi(__ENV__("OTS_MAIN_PORT"));
298 
299  sprintf(portStr, "%u", port);
300 
301  hostname = properties->getContextTreeNode()
302  .getNode(properties->supervisorContextUID_)
303  .getNode("Address")
304  .getValue<std::string>();
305  if(hostname == "DEFAULT") // convert DEFAULT to http://${HOSTNAME}
306  hostname = "http://" + std::string(__ENV__("HOSTNAME"));
307 
308  size_t i = hostname.find("//");
309  if(i != std::string::npos)
310  hostname = hostname.substr(i + 2);
311 
312  __COUTV__(hostname);
313  }
314 
315  // indicate ots is dead (for ots script to verify launch was successful)
316  std::string filename = std::string(__ENV__("OTSDAQ_LOG_DIR")) + "/otsdaq_is_alive-" +
317  hostname + "-" + portStr + ".dat";
318  FILE* fp = fopen(filename.c_str(), "w");
319  if(!fp)
320  {
321  __SS__ << "Failed to open the ots-is-alive file: " << filename << __E__;
322  __SS_THROW__;
323  }
324  fclose(fp);
325 
326  __COUT__ << "Marked dead: " << filename << __E__;
327 } // end indicateOtsDead()
328 
329 //==============================================================================
331 XDAQ_CONST_CALL xdaq::ApplicationDescriptor*
333 {
334  if(allSupervisorInfo_.isMacroMakerMode())
335  return 0;
336 
337  return allSupervisorInfo_.isWizardMode() ? allSupervisorInfo_.getWizardDescriptor()
338  : allSupervisorInfo_.getGatewayDescriptor();
339 } // end getGatewaySupervisorDescriptor()
340 
341 //==============================================================================
346 {
347  // This can be done in the constructor because when you start xdaq it loads the
348  // configuration that can't be changed while running!
349 
350  //__SUP_COUT__ << "Setting up Core Supervisor Base property defaults for supervisor"
351  //<<
352  // "..." << __E__;
353 
354  // set core Supervisor base class defaults
355  CorePropertySupervisorBase::setSupervisorProperty(
356  CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold,
357  "*=1");
358  CorePropertySupervisorBase::setSupervisorProperty(
359  CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed, "");
360  CorePropertySupervisorBase::setSupervisorProperty(
361  CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed, "");
362 
363  CorePropertySupervisorBase::setSupervisorProperty(
364  CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.CheckUserLockRequestTypes, "");
365  CorePropertySupervisorBase::setSupervisorProperty(
366  CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.RequireUserLockRequestTypes,
367  "");
368  CorePropertySupervisorBase::setSupervisorProperty(
369  CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AutomatedRequestTypes, "");
370  CorePropertySupervisorBase::setSupervisorProperty(
371  CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AllowNoLoginRequestTypes, "");
372  CorePropertySupervisorBase::setSupervisorProperty(
373  CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.RequireSecurityRequestTypes,
374  "");
375 
376  CorePropertySupervisorBase::setSupervisorProperty(
377  CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NoXmlWhiteSpaceRequestTypes,
378  "");
379  CorePropertySupervisorBase::setSupervisorProperty(
380  CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NonXMLRequestTypes, "");
381 
382  // __SUP_COUT__ << "Done setting up Core Supervisor Base property defaults for
383  // supervisor" <<
384  // "..." << __E__;
385 } // end setSupervisorPropertyDefaults()
386 
387 //==============================================================================
403  const std::string& permissionsString,
404  std::map<std::string, WebUsers::permissionLevel_t>& permissionsMap)
405 {
406  permissionsMap.clear();
407  StringMacros::getMapFromString(permissionsString, permissionsMap);
408  if(permissionsMap.size() == 0) // do not allow empty permissions map
409  permissionsMap.emplace(std::pair<std::string, WebUsers::permissionLevel_t>(
410  WebUsers::DEFAULT_USER_GROUP,
411  atoi(permissionsString.c_str())) // convert to integer
412  );
413 } // end extractPermissionsMapFromString()
414 
415 //==============================================================================
434  std::map<std::string, WebUsers::permissionLevel_t>& permissionLevelsMap,
435  std::map<std::string, WebUsers::permissionLevel_t>& permissionThresholdsMap)
436 {
437  // return true if a permission level group name is found with a permission level
438  // greater than or equal to the permission level at a matching group name entry in
439  // the thresholds map.
440 
441  //__COUTV__(StringMacros::mapToString(permissionLevelsMap));
442  //__COUTV__(StringMacros::mapToString(permissionThresholdsMap));
443 
444  for(const auto& permissionLevelGroupPair : permissionLevelsMap)
445  {
446  //__COUTV__(permissionLevelGroupPair.first);
447  //__COUTV__(permissionLevelGroupPair.second);
448 
449  for(const auto& permissionThresholdGroupPair : permissionThresholdsMap)
450  {
451  //__COUTV__(permissionThresholdGroupPair.first);
452  //__COUTV__(permissionThresholdGroupPair.second);
453  if(permissionLevelGroupPair.first == permissionThresholdGroupPair.first &&
454  permissionThresholdGroupPair.second && // not explicitly disallowed
455  permissionLevelGroupPair.second >= permissionThresholdGroupPair.second)
456  return true; // access granted!
457  }
458  }
459  //__COUT__ << "Denied." << __E__;
460 
461  // if here, no access group match found
462  // so denied
463  return false;
464 } // end doPermissionsGrantAccess()
465 
466 //==============================================================================
468 void CorePropertySupervisorBase::checkSupervisorPropertySetup()
469 {
470  if(propertiesAreSetup_)
471  return;
472 
473  // Immediately mark properties as setup, (prevent infinite loops due to
474  // other launches from within this function, e.g. from getSupervisorProperty)
475  // only redo if Context configuration group changes
476  propertiesAreSetup_ = true;
477 
478  __SUP_COUTT__ << "Setting up supervisor specific property DEFAULTS for supervisor..."
479  << __E__;
480 
482  // version defaults
483 
484  setSupervisorPropertyDefaults(); // calls override version defaults
485 
486  __SUP_COUTT__
487  << "Done setting up supervisor specific property DEFAULTS for supervisor."
488  << __E__;
489 
490  if(allSupervisorInfo_.isWizardMode())
491  __SUP_COUT__ << "Wiz mode detected. Skipping setup of supervisor properties for "
492  "supervisor of class '"
493  << supervisorClass_ << "'" << __E__;
494  else if(allSupervisorInfo_.isMacroMakerMode())
495  __SUP_COUT__
496  << "Maker Maker mode detected. Skipping setup of supervisor properties for "
497  "supervisor of class '"
498  << supervisorClass_ << "'" << __E__;
499  else
501  // settings from
502  // configuration
503 
504  readOnly_ = getSupervisorProperty("ReadOnly", "0") == "1" ? true : false;
505  __SUP_COUTV__(readOnly_);
506 
507  __SUP_COUTT__ << "Setting up supervisor specific FORCED properties for supervisor..."
508  << __E__;
509  forceSupervisorPropertyValues(); // calls override forced values
510  __SUP_COUTT__
511  << "Done setting up supervisor specific FORCED properties for supervisor."
512  << __E__;
513 
515  getSupervisorProperty(
516  CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold),
517  propertyStruct_.UserPermissionsThreshold);
518 
519  propertyStruct_.UserGroupsAllowed.clear();
521  getSupervisorProperty(
522  CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed),
523  propertyStruct_.UserGroupsAllowed);
524 
525  propertyStruct_.UserGroupsDisallowed.clear();
527  getSupervisorProperty(
528  CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed),
529  propertyStruct_.UserGroupsDisallowed);
530 
531  auto nameIt = SUPERVISOR_PROPERTIES.allSetNames_.begin();
532  auto setIt = propertyStruct_.allSets_.begin();
533  while(nameIt != SUPERVISOR_PROPERTIES.allSetNames_.end() &&
534  setIt != propertyStruct_.allSets_.end())
535  {
536  (*setIt)->clear();
537  StringMacros::getSetFromString(getSupervisorProperty(*(*nameIt)), *(*setIt));
538 
539  ++nameIt;
540  ++setIt;
541  }
542 
543  __SUP_COUT__ << "Final supervisor property settings:" << __E__;
544  for(auto& property : propertyMap_)
545  __SUP_COUT__ << "\t" << property.first << " = " << property.second << __E__;
546 } // end checkSupervisorPropertySetup()
547 
548 //==============================================================================
552 try
553 {
554  if(supervisorContextUID_ == "" || supervisorApplicationUID_ == "")
555  {
556  __SUP_SS__ << "Empty supervisorContextUID_ or supervisorApplicationUID_."
557  << __E__;
558  __SUP_SS_THROW__;
559  }
560  return theConfigurationManager_->getSupervisorNode(supervisorContextUID_,
561  supervisorApplicationUID_);
562 } // end getSupervisorTreeNode()
563 catch(...)
564 {
565  __SUP_COUT_ERR__
566  << "XDAQ Supervisor could not access it's configuration node through "
567  "theConfigurationManager_ "
568  << "(Did you remember to initialize using CorePropertySupervisorBase::init()?)."
569  << " The supervisorContextUID_ = " << supervisorContextUID_
570  << ". The supervisorApplicationUID = " << supervisorApplicationUID_ << __E__;
571  throw;
572 } // end getSupervisorTreeNode() exception handling
573 
574 //==============================================================================
578 {
579  // __SUP_COUT__ << "Loading user properties for supervisor '" <<
580  // supervisorContextUID_ << "/" << supervisorApplicationUID_ <<
581  // "'..." << __E__;
582 
583  // re-acquire the configuration supervisor node, in case the config has changed
585 
586  try
587  {
588  auto /*map<name,node>*/ children =
589  supervisorNode.getNode("LinkToPropertyTable").getChildren();
590 
591  for(auto& child : children)
592  {
593  if(!child.second.status())
594  continue; // skip OFF properties
595 
596  auto propertyName = child.second.getNode("PropertyName").getValue();
597  setSupervisorProperty(
598  propertyName,
599  child.second.getNode("PropertyValue").getValue<std::string>());
600  }
601  }
602  catch(...)
603  {
604  __SUP_COUT__ << "No user supervisor property settings found in the configuration "
605  "tree, going with the defaults."
606  << __E__;
607  }
608 
609  // __SUP_COUT__ << "Done loading user properties for supervisor '" <<
610  // supervisorContextUID_ << "/" << supervisorApplicationUID_ <<
611  // "'" << __E__;
612 } // end loadUserSupervisorProperties()
613 
614 //==============================================================================
615 void CorePropertySupervisorBase::setSupervisorProperty(const std::string& propertyName,
616  const std::string& propertyValue)
617 {
618  propertyMap_[propertyName] = propertyValue;
619  // __SUP_COUT__ << "Set propertyMap_[" << propertyName <<
620  // "] = " << propertyMap_[propertyName] << __E__;
621 } // end setSupervisorProperty()
622 
623 //==============================================================================
624 void CorePropertySupervisorBase::addSupervisorProperty(const std::string& propertyName,
625  const std::string& propertyValue)
626 {
627  propertyMap_[propertyName] =
628  propertyValue + " | " + getSupervisorProperty(propertyName);
629  // __SUP_COUT__ << "Set propertyMap_[" << propertyName <<
630  // "] = " << propertyMap_[propertyName] << __E__;
631 } // end addSupervisorProperty()
632 
633 //==============================================================================
636 std::string CorePropertySupervisorBase::getSupervisorProperty(
637  const std::string& propertyName)
638 {
639  // check if need to setup properties
640  checkSupervisorPropertySetup();
641 
642  auto it = propertyMap_.find(propertyName);
643  if(it == propertyMap_.end())
644  {
645  __SUP_SS__ << "Could not find property named " << propertyName << __E__;
646  __SS_THROW__; //__SUP_SS_THROW__;
647  }
649 } // end getSupervisorProperty()
650 
651 //==============================================================================
653 std::string CorePropertySupervisorBase::getSupervisorProperty(
654  const std::string& propertyName, const std::string& defaultValue)
655 {
656  // check if need to setup properties
657  checkSupervisorPropertySetup();
658 
659  auto it = propertyMap_.find(propertyName);
660  if(it == propertyMap_.end())
661  {
662  // not found, so returning default value
663  return defaultValue;
664  }
666 } // end getSupervisorProperty()
667 
668 //==============================================================================
671 WebUsers::permissionLevel_t
673  const std::string& requestType)
674 {
675  // check if need to setup properties
676  checkSupervisorPropertySetup();
677 
679  requestType, propertyStruct_.UserPermissionsThreshold);
680 } // end getSupervisorPropertyUserPermissionsThreshold()
681 
682 //==============================================================================
686 {
687  checkSupervisorPropertySetup();
688 
689  __SUP_COUT_TYPE__(TLVL_DEBUG + 20)
690  << __COUT_HDR__ << "userInfo.requestType_ " << userInfo.requestType_ << __E__;
691 
692  __SUP_COUT_TYPE__(TLVL_DEBUG + 20)
693  << __COUT_HDR__ << "propertyStruct_.AutomatedRequestTypes "
694  << StringMacros::setToString(propertyStruct_.AutomatedRequestTypes) << __E__;
695  userInfo.automatedCommand_ = StringMacros::inWildCardSet(
696  userInfo.requestType_,
697  propertyStruct_.AutomatedRequestTypes); // automatic commands should not refresh
698  // cookie code.. only user initiated
699  // commands should!
700 
701  __SUP_COUT_TYPE__(TLVL_DEBUG + 21)
702  << __COUT_HDR__ << "propertyStruct_.NonXMLRequestTypes "
703  << StringMacros::setToString(propertyStruct_.NonXMLRequestTypes) << __E__;
704  userInfo.NonXMLRequestType_ = StringMacros::inWildCardSet(
705  userInfo.requestType_, propertyStruct_.NonXMLRequestTypes); // non-xml request
706  // types just return
707  // the request return
708  // string to client
709 
710  __SUP_COUT_TYPE__(TLVL_DEBUG + 21)
711  << __COUT_HDR__ << "propertyStruct_.NoXmlWhiteSpaceRequestTypes "
712  << StringMacros::setToString(propertyStruct_.NoXmlWhiteSpaceRequestTypes)
713  << __E__;
714  userInfo.NoXmlWhiteSpace_ = StringMacros::inWildCardSet(
715  userInfo.requestType_, propertyStruct_.NoXmlWhiteSpaceRequestTypes);
716 
717  //**** start LOGIN GATEWAY CODE ***//
718  // check cookieCode, sequence, userWithLock, and permissions access all in one shot!
719  {
720  __SUP_COUT_TYPE__(TLVL_DEBUG + 20)
721  << __COUT_HDR__ << "propertyStruct_.CheckUserLockRequestTypes "
722  << StringMacros::setToString(propertyStruct_.CheckUserLockRequestTypes)
723  << __E__;
724  userInfo.checkLock_ = StringMacros::inWildCardSet(
725  userInfo.requestType_, propertyStruct_.CheckUserLockRequestTypes);
726  __SUP_COUT_TYPE__(TLVL_DEBUG + 20)
727  << __COUT_HDR__ << "propertyStruct_.RequireUserLockRequestTypes "
728  << StringMacros::setToString(propertyStruct_.RequireUserLockRequestTypes)
729  << __E__;
730  userInfo.requireLock_ = StringMacros::inWildCardSet(
731  userInfo.requestType_, propertyStruct_.RequireUserLockRequestTypes);
732  if(userInfo.requireLock_ && userInfo.automatedCommand_)
733  {
734  __SUP_COUTT__ << "Overriding requireLock_ because request '"
735  << userInfo.requestType_ << "' marked as automatedCommand_"
736  << __E__;
737  userInfo.requireLock_ = false;
738  }
739 
740  __SUP_COUT_TYPE__(TLVL_DEBUG + 21)
741  << __COUT_HDR__ << "propertyStruct_.AllowNoLoginRequestTypes "
742  << StringMacros::setToString(propertyStruct_.AllowNoLoginRequestTypes)
743  << __E__;
744  userInfo.allowNoUser_ = StringMacros::inWildCardSet(
745  userInfo.requestType_, propertyStruct_.AllowNoLoginRequestTypes);
746  __SUP_COUT_TYPE__(TLVL_DEBUG + 21)
747  << __COUT_HDR__ << "propertyStruct_.RequireSecurityRequestTypes "
748  << StringMacros::setToString(propertyStruct_.RequireSecurityRequestTypes)
749  << __E__;
750  userInfo.requireSecurity_ = StringMacros::inWildCardSet(
751  userInfo.requestType_, propertyStruct_.RequireSecurityRequestTypes);
752 
753  userInfo.permissionsThreshold_ = -1; // default to max
754  try
755  {
756  userInfo.permissionsThreshold_ =
758  userInfo.requestType_);
759  }
760  catch(std::runtime_error& e)
761  {
762  if(!userInfo.automatedCommand_)
763  __SUP_COUT__ << "No explicit permissions threshold for request '"
764  << userInfo.requestType_
765  << "'... Defaulting to max threshold = "
766  << (unsigned int)userInfo.permissionsThreshold_ << __E__;
767  }
768 
769  __SUP_COUTVS__(20, userInfo.requestType_);
770  __SUP_COUTVS__(20, userInfo.checkLock_);
771  __SUP_COUTVS__(20, userInfo.requireLock_);
772  __SUP_COUTVS__(20, userInfo.allowNoUser_);
773  __SUP_COUTVS__(20, userInfo.automatedCommand_);
774  __SUP_COUTVS__(20, userInfo.automatedCommand_);
775  __SUP_COUTVS__(20, (unsigned int)userInfo.permissionsThreshold_);
776 
777  try
778  {
780  StringMacros::getWildCardMatchFromMap(userInfo.requestType_,
781  propertyStruct_.UserGroupsAllowed),
782  userInfo.groupsAllowed_);
783  }
784  catch(std::runtime_error& e)
785  {
786  userInfo.groupsAllowed_.clear();
787  if(!userInfo.automatedCommand_)
788  __SUP_COUT_TYPE__(TLVL_DEBUG + 25)
789  << __COUT_HDR__ << "No explicit groups allowed for request '"
790  << userInfo.requestType_
791  << "'... Defaulting to empty groups allowed. " << __E__;
792  }
793  try
794  {
797  userInfo.requestType_, propertyStruct_.UserGroupsDisallowed),
798  userInfo.groupsDisallowed_);
799  }
800  catch(std::runtime_error& e)
801  {
802  userInfo.groupsDisallowed_.clear();
803 
804  if(!userInfo.automatedCommand_)
805  __SUP_COUT_TYPE__(TLVL_DEBUG + 25)
806  << __COUT_HDR__ << "No explicit groups disallowed for request '"
807  << userInfo.requestType_
808  << "'... Defaulting to empty groups disallowed. " << __E__;
809  }
810  } //**** end LOGIN GATEWAY CODE ***//
811 
812  // completed user info, for the request type, is returned to caller
813 } // end getRequestUserInfo()
814 
815 //==============================================================================
816 xoap::MessageReference CorePropertySupervisorBase::TRACESupervisorRequest(
817  xoap::MessageReference message)
818 {
819  __SUP_COUT__ << "$$$$$$$$$$$$$$$$$" << __E__;
820 
821  // receive request parameters
822  SOAPParameters parameters;
823  parameters.addParameter("Request");
824 
825  __SUP_COUT__ << "Received TRACE message: " << SOAPUtilities::translate(message)
826  << __E__;
827 
828  SOAPUtilities::receive(message, parameters);
829  std::string request = parameters.getValue("Request");
830 
831  __SUP_COUT__ << "request: " << request << __E__;
832 
833  // request types:
834  // GetTraceLevels
835  // SetTraceLevels
836 
837  SOAPParameters retParameters;
838  try
839  {
840  if(request == "GetTraceLevels")
841  {
842  retParameters.addParameter("TRACEList", getTraceLevels());
843  retParameters.addParameter("TRACEHostnameList", traceReturnHostString_);
844  return SOAPUtilities::makeSOAPMessageReference(
845  supervisorClassNoNamespace_ + "Response", retParameters);
846  }
847  else if(request == "SetTraceLevels")
848  {
849  parameters.addParameter("IndividualValues");
850  parameters.addParameter("Host");
851  parameters.addParameter("SetMode");
852  parameters.addParameter("Labels");
853  parameters.addParameter("SetValueMSB");
854  parameters.addParameter("SetValueLSB");
855  SOAPUtilities::receive(message, parameters);
856 
857  int individualValues = parameters.getValueAsInt("IndividualValues");
858  std::string host = parameters.getValue("Host");
859  std::string setMode = parameters.getValue("SetMode");
860  std::string labelsStr = parameters.getValue("Labels");
861  int setValueMSB = parameters.getValueAsInt("SetValueMSB");
862  int setValueLSB = parameters.getValueAsInt("SetValueLSB");
863  __SUP_COUTV__(individualValues);
864  __SUP_COUTV__(host);
865  __SUP_COUTV__(setMode);
866  __SUP_COUTV__(setValueMSB);
867  __SUP_COUTV__(setValueLSB);
868  __SUP_COUTV__(labelsStr);
869 
870  if(individualValues)
871  retParameters.addParameter(
872  "TRACEList", setIndividualTraceLevels(host, setMode, labelsStr));
873  else
874  retParameters.addParameter(
875  "TRACEList",
876  setTraceLevels(host, setMode, labelsStr, setValueMSB, setValueLSB));
877  return SOAPUtilities::makeSOAPMessageReference(
878  supervisorClassNoNamespace_ + "Response", retParameters);
879  }
880  else if(request == "GetTriggerStatus")
881  {
882  retParameters.addParameter("TRACETriggerStatus", getTraceTriggerStatus());
883  return SOAPUtilities::makeSOAPMessageReference(
884  supervisorClassNoNamespace_ + "Response", retParameters);
885  }
886  else if(request == "SetTriggerEnable")
887  {
888  parameters.addParameter("Host");
889  parameters.addParameter("EntriesAfterTrigger");
890  SOAPUtilities::receive(message, parameters);
891 
892  std::string host = parameters.getValue("Host");
893  int entriesAfterTrigger = parameters.getValueAsInt("EntriesAfterTrigger");
894  __SUP_COUTV__(host);
895  __SUP_COUTV__(entriesAfterTrigger);
896  retParameters.addParameter("TRACETriggerStatus",
897  setTraceTriggerEnable(host, entriesAfterTrigger));
898  return SOAPUtilities::makeSOAPMessageReference(
899  supervisorClassNoNamespace_ + "Response", retParameters);
900  }
901  else if(request == "ResetTRACE")
902  {
903  parameters.addParameter("Host");
904  SOAPUtilities::receive(message, parameters);
905 
906  std::string host = parameters.getValue("Host");
907  __SUP_COUTV__(host);
908  retParameters.addParameter("TRACETriggerStatus", resetTRACE(host));
909  return SOAPUtilities::makeSOAPMessageReference(
910  supervisorClassNoNamespace_ + "Response", retParameters);
911  }
912  else if(request == "EnableTRACE")
913  {
914  parameters.addParameter("Host");
915  parameters.addParameter("SetEnable");
916  SOAPUtilities::receive(message, parameters);
917 
918  std::string host = parameters.getValue("Host");
919  bool enable = parameters.getValueAsInt("SetEnable") ? true : false;
920  __SUP_COUTV__(host);
921  __SUP_COUTV__(enable);
922 
923  retParameters.addParameter("TRACETriggerStatus", enableTRACE(host, enable));
924  return SOAPUtilities::makeSOAPMessageReference(
925  supervisorClassNoNamespace_ + "Response", retParameters);
926  }
927  else if(request == "GetSnapshot")
928  {
929  parameters.addParameter("Host");
930  parameters.addParameter("FilterForCSV");
931  parameters.addParameter("FilterOutCSV");
932  SOAPUtilities::receive(message, parameters);
933 
934  std::string host = parameters.getValue("Host");
935  std::string filterFor = parameters.getValue("FilterForCSV");
936  std::string filterOut = parameters.getValue("FilterOutCSV");
937  __SUP_COUTV__(host);
938  __SUP_COUTV__(filterFor);
939  __SUP_COUTV__(filterOut);
940  retParameters.addParameter("TRACESnapshot",
941  getTraceSnapshot(host, filterFor, filterOut));
942  retParameters.addParameter("TRACETriggerStatus", getTraceTriggerStatus());
943  return SOAPUtilities::makeSOAPMessageReference(
944  supervisorClassNoNamespace_ + "Response", retParameters);
945  }
946  else
947  {
948  __SUP_SS__ << "Unrecognized request received! '" << request << "'" << __E__;
949  __SUP_SS_THROW__;
950  }
951  }
952  catch(const std::runtime_error& e)
953  {
954  __SUP_SS__ << "Error occurred handling request: " << e.what() << __E__;
955  __SUP_COUT_ERR__ << ss.str();
956  retParameters.addParameter("Error", ss.str());
957  }
958  catch(...)
959  {
960  __SUP_SS__ << "Error occurred handling request." << __E__;
961  try
962  {
963  throw;
964  } //one more try to printout extra info
965  catch(const std::exception& e)
966  {
967  ss << "Exception message: " << e.what();
968  }
969  catch(...)
970  {
971  }
972  __SUP_COUT_ERR__ << ss.str();
973  retParameters.addParameter("Error", ss.str());
974  }
975 
976  return SOAPUtilities::makeSOAPMessageReference("TRACEFault", retParameters);
977 
978 } // end TRACESupervisorRequest()
979 
980 //==============================================================================
981 const std::string& CorePropertySupervisorBase::getTraceLevels()
982 {
983  __SUP_COUT__ << "getTraceLevels()" << __E__;
984 
985  traceReturnString_ = ""; // reset;
986  traceReturnHostString_ = ""; // reset;
987 
989  {
990  __SUP_COUT__ << "No TRACE Controller found, constructing!" << __E__;
992  }
993 
994  // typedef std::unordered_map<std::string, TraceLevelMap> HostTraceLevelMap =
995  ITRACEController::HostTraceLevelMap traceHostMap =
997  for(const auto& traceMap : traceHostMap)
998  {
999  //__COUTV__(traceMap.first);
1000 
1001  // NOTE: TRACE hostname resolution is not necessarily the same as xdaq context name resolution
1002  // so return TRACE hostname resolution so a map can be generated at the controller
1003 
1004  traceReturnHostString_ = ";" + traceMap.first;
1005  traceReturnString_ += ";" + traceMap.first;
1006 
1007  for(const auto& traceMask : traceMap.second)
1008  {
1009  //__COUTV__(traceMask.first);
1010  //__COUTV__(traceMask.second);
1011  // give in 32b chunks since javascript is 32-bit
1012  traceReturnString_ +=
1013  "," + traceMask.first +
1014  ",M:" + std::to_string((unsigned int)(traceMask.second.M >> 32)) + ":" +
1015  std::to_string((unsigned int)traceMask.second.M) +
1016  ":S:" + std::to_string((unsigned int)(traceMask.second.S >> 32)) + ":" +
1017  std::to_string((unsigned int)traceMask.second.S) +
1018  ":T:" + std::to_string((unsigned int)(traceMask.second.T >> 32)) + ":" +
1019  std::to_string((unsigned int)traceMask.second.T);
1020  } // end label loop
1021  } // end host loop
1022  __SUP_COUT__ << "end getTraceLevels()" << __E__;
1023  return traceReturnString_;
1024 } // end getTraceLevels()
1025 
1026 //==============================================================================
1027 const std::string& CorePropertySupervisorBase::setTraceLevels(
1028  std::string const& host,
1029  std::string const& mode,
1030  std::string const& labelsStr,
1031  uint32_t setValueMSB,
1032  uint32_t setValueLSB)
1033 {
1034  __SUP_COUT__ << "setTraceLevels()" << __E__;
1035 
1036  if(!theTRACEController_)
1037  {
1038  __SUP_COUT__ << "No TRACE Controller found, constructing!" << __E__;
1040  }
1041 
1043  bool allMode = mode == "ALL";
1044  if(allMode || mode == "FAST")
1045  setMask.M = ((uint64_t(setValueMSB)) << 32) | (uint64_t(uint32_t(setValueLSB)));
1046  if(allMode || mode == "SLOW")
1047  setMask.S = ((uint64_t(setValueMSB)) << 32) | (uint64_t(uint32_t(setValueLSB)));
1048  if(allMode || mode == "TRIGGER")
1049  setMask.T = ((uint64_t(setValueMSB)) << 32) | (uint64_t(uint32_t(setValueLSB)));
1050 
1051  std::vector<std::string /*labels*/> labels;
1052  StringMacros::getVectorFromString(labelsStr, labels, {','});
1053  for(const auto& label : labels)
1054  {
1055  __SUP_COUTV__(label);
1056  theTRACEController_->setTraceLevelMask(label, setMask, host, mode);
1057  }
1058 
1059  __SUP_COUT__ << "end setTraceLevels()" << __E__;
1060  return getTraceLevels();
1061 } // end setTraceLevels()
1062 
1063 //==============================================================================
1064 const std::string& CorePropertySupervisorBase::setIndividualTraceLevels(
1065  std::string const& host, std::string const& mode, std::string const& labelValuesStr)
1066 {
1067  __SUP_COUT__ << "setIndividualTraceLevels()" << __E__;
1068 
1069  if(!theTRACEController_)
1070  {
1071  __SUP_COUT__ << "No TRACE Controller found, constructing!" << __E__;
1073  }
1074 
1076  bool allMode = mode == "ALL";
1077  bool fastMode = mode == "FAST";
1078  bool slowMode = mode == "SLOW";
1079  bool triggerMode = mode == "TRIGGER";
1080 
1081  std::vector<std::string /*labels,msb,lsb*/> labelValues;
1082  StringMacros::getVectorFromString(labelValuesStr, labelValues, {','});
1083  for(unsigned int i = 0; i < labelValues.size(); i += 3 /*label,msb,lsb*/)
1084  {
1085  __SUP_COUT__ << "Label = " << labelValues[i] << " msb/lsb " << labelValues[i + 1]
1086  << "/" << labelValues[i + 2] << __E__;
1087 
1088  if(allMode || fastMode)
1089  setMask.M = ((uint64_t(atoi(labelValues[i + 1].c_str()))) << 32) |
1090  (uint64_t(uint32_t(atoi(labelValues[i + 2].c_str()))));
1091  if(allMode || slowMode)
1092  setMask.S = ((uint64_t(atoi(labelValues[i + 1].c_str()))) << 32) |
1093  (uint64_t(uint32_t(atoi(labelValues[i + 2].c_str()))));
1094  if(allMode || triggerMode)
1095  setMask.T = ((uint64_t(atoi(labelValues[i + 1].c_str()))) << 32) |
1096  (uint64_t(uint32_t(atoi(labelValues[i + 2].c_str()))));
1097 
1098  theTRACEController_->setTraceLevelMask(labelValues[i], setMask, host, mode);
1099  }
1100 
1101  __SUP_COUT__ << "end setIndividualTraceLevels()" << __E__;
1102  return getTraceLevels();
1103 } // end setTraceLevels()
1104 
1105 //==============================================================================
1106 const std::string& CorePropertySupervisorBase::getTraceTriggerStatus()
1107 {
1108  __SUP_COUT__ << "getTraceTriggerStatus()" << __E__;
1109 
1110  traceReturnString_ = ""; // reset;
1111 
1112  if(!theTRACEController_)
1113  {
1114  __SUP_COUT__ << "No TRACE Controller found, constructing!" << __E__;
1116  }
1117 
1118  bool isTriggered = theTRACEController_->getIsTriggered();
1119  traceReturnString_ +=
1120  ";" + theTRACEController_->getHostnameString() + "," + (isTriggered ? "1" : "0");
1121 
1122  __SUP_COUT__ << "end getTraceTriggerStatus() " << traceReturnString_ << __E__;
1123  return traceReturnString_;
1124 } // end getTraceTriggerStatus()
1125 
1126 //==============================================================================
1127 const std::string& CorePropertySupervisorBase::setTraceTriggerEnable(
1128  std::string const& host, size_t entriesAfterTrigger)
1129 {
1130  __SUP_COUT__ << "setTraceTriggerEnable() " << host << __E__;
1131 
1132  if(!theTRACEController_)
1133  {
1134  __SUP_COUT__ << "No TRACE Controller found, constructing!" << __E__;
1136  }
1137  theTRACEController_->setTriggerEnable(entriesAfterTrigger);
1138  __SUP_COUT__ << "end setTraceTriggerEnable()" << __E__;
1139  return getTraceTriggerStatus();
1140 } // end setTraceTriggerEnable()
1141 
1142 //==============================================================================
1143 const std::string& CorePropertySupervisorBase::resetTRACE(std::string const& host)
1144 {
1145  __SUP_COUT__ << "resetTRACE() " << host << __E__;
1146 
1147  if(!theTRACEController_)
1148  {
1149  __SUP_COUT__ << "No TRACE Controller found, constructing!" << __E__;
1151  }
1154  __SUP_COUT__ << "end resetTRACE()" << __E__;
1155  return getTraceTriggerStatus();
1156 } // end resetTRACE()
1157 
1158 //==============================================================================
1159 const std::string& CorePropertySupervisorBase::enableTRACE(std::string const& host,
1160  bool enable)
1161 {
1162  __SUP_COUT__ << "enableTRACE() " << host << " " << enable << __E__;
1163 
1164  if(!theTRACEController_)
1165  {
1166  __SUP_COUT__ << "No TRACE Controller found, constructing!" << __E__;
1168  }
1170  __SUP_COUT__ << "end enableTRACE()" << __E__;
1171  return getTraceTriggerStatus();
1172 } // end enableTRACE()
1173 
1174 //==============================================================================
1175 const std::string& CorePropertySupervisorBase::getTraceSnapshot(
1176  std::string const& host, std::string const& filterFor, std::string const& filterOut)
1177 {
1178  __SUP_COUT__ << "getTraceSnapshot()" << host << __E__;
1179 
1180  traceReturnString_ = ""; // reset;
1181 
1182  if(!theTRACEController_)
1183  {
1184  __SUP_COUT__ << "No TRACE Controller found, constructing!" << __E__;
1186  }
1187 
1188  traceReturnString_ = theTRACEController_->getTraceBufferDump(filterFor, filterOut);
1189  // std::cout << traceReturnString_ << __E__;
1190 
1191  const size_t MAX_SZ = 200000;
1192  if(traceReturnString_.size() > MAX_SZ)
1193  {
1194  __SUP_COUT__ << "Truncating from " << traceReturnString_.size() << " to "
1195  << MAX_SZ << __E__;
1196  traceReturnString_.resize(MAX_SZ);
1197  traceReturnString_ += "\n...TRUNCATED";
1198  }
1199  else if(traceReturnString_.size() == 0)
1200  {
1201  __SUP_COUT__ << "Empty snapshot" << __E__;
1202  traceReturnString_ = "Empty TRACE snapshot.";
1203  }
1204  __SUP_COUT__ << "end getTraceSnapshot() Bytes = " << traceReturnString_.size()
1205  << __E__;
1206  return traceReturnString_;
1207 } // end getTraceSnapshot()
bool isWizardMode(void) const
BOOLs.
ConfigurationTree getNode(const std::string &nodeName, bool doNotThrowOnBrokenUIDLinks=false) const
navigating between nodes
void getValue(T &value) const
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
std::string getTraceBufferDump(std::string const &filterFor="", std::string const &filterOut="")
virtual void setTraceLevelMask(std::string const &name, TraceMasks const &lvl, std::string const &hostname="localhost", std::string const &mode="ALL")=0
pure virtual
virtual void resetTraceBuffer(void)=0
pure virtual
virtual bool getIsTriggered(void)=0
pure virtual
virtual const HostTraceLevelMap & getTraceLevels(void)=0
pure virtual
virtual void enableTrace(bool enable=true)=0
pure virtual
virtual void setTriggerEnable(size_t entriesAfterTrigger)=0
pure virtual
defines used also by OtsConfigurationWizardSupervisor
void INIT_MF(const char *name)
static void getVectorFromString(const std::string &inputString, std::vector< std::string > &listToReturn, const std::set< char > &delimiter={',', '|', '&'}, const std::set< char > &whitespace={' ', '\t', '\n', '\r'}, std::vector< char > *listOfDelimiters=0, bool decodeURIComponents=false)
static void getSetFromString(const std::string &inputString, std::set< std::string > &setToReturn, const std::set< char > &delimiter={',', '|', '&'}, const std::set< char > &whitespace={' ', '\t', '\n', '\r'})
static std::string setToString(const std::set< T > &setToReturn, const std::string &delimeter=", ")
setToString ~
static T validateValueForDefaultStringDataType(const std::string &value, bool doConvertEnvironmentVariables=true)
static T & getWildCardMatchFromMap(const std::string &needle, std::map< std::string, T > &haystack, std::string *foundKey=0)
defined in included .icc source
static bool inWildCardSet(const std::string &needle, const std::set< std::string > &haystack)
static void getMapFromString(const std::string &inputString, std::map< S, T > &mapToReturn, const std::set< char > &pairPairDelimiter={',', '|', '&'}, const std::set< char > &nameValueDelimiter={'=', ':'}, const std::set< char > &whitespace={' ', '\t', '\n', '\r'})
getMapFromString ~