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