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