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