1 #include "otsdaq-core/CoreSupervisors/CorePropertySupervisorBase.h"
6 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES =
10 CorePropertySupervisorBase::CorePropertySupervisorBase(xdaq::Application* application)
11 : theConfigurationManager_(0)
12 , supervisorClass_(application->getApplicationDescriptor()->getClassName())
13 , supervisorClassNoNamespace_(supervisorClass_.substr(
14 supervisorClass_.find_last_of(
":") + 1,
15 supervisorClass_.length() - supervisorClass_.find_last_of(
":")))
16 , supervisorContextUID_(
17 "UNINITIALIZED_supervisorContextUID")
21 , supervisorApplicationUID_(
22 "UNINITIALIZED_supervisorApplicationUID")
25 , supervisorConfigurationPath_(
26 "UNINITIALIZED_supervisorConfigurationPath")
29 , propertiesAreSetup_(false)
31 INIT_MF(
"CorePropertySupervisorBase");
33 __SUP_COUTV__(application->getApplicationContext()->getContextDescriptor()->getURL());
34 __SUP_COUTV__(application->getApplicationDescriptor()->getLocalId());
35 __SUP_COUTV__(supervisorClass_);
36 __SUP_COUTV__(supervisorClassNoNamespace_);
39 allSupervisorInfo_.
init(application->getApplicationContext());
41 if(allSupervisorInfo_.isMacroMakerMode())
46 <<
"Macro Maker mode detected. So skipping configuration location work for "
47 "supervisor of class '"
48 << supervisorClass_ <<
"'" << __E__;
50 supervisorContextUID_ =
"MacroMakerFEContext";
51 supervisorApplicationUID_ =
"MacroMakerFESupervisor";
52 supervisorConfigurationPath_ =
53 CorePropertySupervisorBase::supervisorContextUID_ +
54 "/LinkToApplicationTable/" +
55 CorePropertySupervisorBase::supervisorApplicationUID_ +
56 "/LinkToSupervisorTable";
58 __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
59 __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
60 __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
64 else if(allSupervisorInfo_.isWizardMode())
66 __SUP_COUT__ <<
"Wiz mode detected. So skipping configuration location work for "
67 "supervisor of class '"
68 << supervisorClass_ <<
"'" << __E__;
69 supervisorContextUID_ =
"NO CONTEXT ID IN WIZ MODE";
70 supervisorApplicationUID_ =
71 std::to_string(application->getApplicationDescriptor()->getLocalId());
72 supervisorConfigurationPath_ =
"NO APP PATH IN WIZ MODE";
74 __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
75 __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
76 __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
81 __SUP_COUT__ <<
"Getting configuration specific info for supervisor '"
82 << (allSupervisorInfo_.getSupervisorInfo(application).getName())
83 <<
"' of class " << supervisorClass_ <<
"." << __E__;
90 CorePropertySupervisorBase::supervisorContextUID_ =
92 ->getContextUID(application->getApplicationContext()
93 ->getContextDescriptor()
99 <<
"XDAQ Supervisor could not access it's configuration through "
100 "the Configuration Manager."
101 <<
". The getApplicationContext()->getContextDescriptor()->getURL() = "
102 << application->getApplicationContext()->getContextDescriptor()->getURL()
109 CorePropertySupervisorBase::supervisorApplicationUID_ =
112 application->getApplicationContext()
113 ->getContextDescriptor()
115 application->getApplicationDescriptor()->getLocalId());
119 __SUP_COUT_ERR__ <<
"XDAQ Supervisor could not access it's configuration through "
120 "the Configuration Manager."
121 <<
" The supervisorContextUID_ = " << supervisorContextUID_
122 <<
". The supervisorApplicationUID = "
123 << supervisorApplicationUID_ << __E__;
127 CorePropertySupervisorBase::supervisorConfigurationPath_ =
128 "/" + CorePropertySupervisorBase::supervisorContextUID_ +
129 "/LinkToApplicationTable/" +
130 CorePropertySupervisorBase::supervisorApplicationUID_ +
"/LinkToSupervisorTable";
132 __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
133 __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
134 __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
136 CorePropertySupervisorBase::indicateOtsAlive(
this);
138 theConfigurationManager_->setOwnerContext(
139 CorePropertySupervisorBase::supervisorContextUID_);
140 theConfigurationManager_->setOwnerApp(
141 CorePropertySupervisorBase::supervisorApplicationUID_);
146 CorePropertySupervisorBase::~CorePropertySupervisorBase(
void)
148 if(theConfigurationManager_)
149 delete theConfigurationManager_;
153 void CorePropertySupervisorBase::indicateOtsAlive(
156 char portStr[100] =
"0";
157 std::string hostname =
"wiz";
164 unsigned int port = properties->getContextTreeNode()
165 .getNode(properties->supervisorContextUID_)
167 .getValue<
unsigned int>();
168 sprintf(portStr,
"%u", port);
170 hostname = properties->getContextTreeNode()
171 .getNode(properties->supervisorContextUID_)
173 .getValue<std::string>();
175 size_t i = hostname.find(
"//");
176 if(i != std::string::npos)
177 hostname = hostname.substr(i + 2);
183 std::string filename = std::string(__ENV__(
"OTSDAQ_LOG_DIR")) +
"/otsdaq_is_alive-" +
184 hostname +
"-" + portStr +
".dat";
185 FILE* fp = fopen(filename.c_str(),
"w");
188 __SS__ <<
"Failed to open the ots-is-alive file: " << filename << __E__;
191 fprintf(fp,
"%s %s %ld\n", hostname.c_str(), portStr, time(0));
194 __COUT__ <<
"Marked alive: " << filename << __E__;
201 void CorePropertySupervisorBase::setSupervisorPropertyDefaults(
void)
211 CorePropertySupervisorBase::setSupervisorProperty(
212 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold,
214 CorePropertySupervisorBase::setSupervisorProperty(
215 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed,
"");
216 CorePropertySupervisorBase::setSupervisorProperty(
217 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed,
"");
219 CorePropertySupervisorBase::setSupervisorProperty(
220 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.CheckUserLockRequestTypes,
"");
221 CorePropertySupervisorBase::setSupervisorProperty(
222 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.RequireUserLockRequestTypes,
224 CorePropertySupervisorBase::setSupervisorProperty(
225 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AutomatedRequestTypes,
"");
226 CorePropertySupervisorBase::setSupervisorProperty(
227 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AllowNoLoginRequestTypes,
"");
229 CorePropertySupervisorBase::setSupervisorProperty(
230 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NoXmlWhiteSpaceRequestTypes,
232 CorePropertySupervisorBase::setSupervisorProperty(
233 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NonXMLRequestTypes,
"");
253 void CorePropertySupervisorBase::extractPermissionsMapFromString(
254 const std::string& permissionsString,
255 std::map<std::string, WebUsers::permissionLevel_t>& permissionsMap)
257 permissionsMap.clear();
258 StringMacros::getMapFromString(permissionsString, permissionsMap);
279 bool CorePropertySupervisorBase::doPermissionsGrantAccess(
280 std::map<std::string, WebUsers::permissionLevel_t>& permissionLevelsMap,
281 std::map<std::string, WebUsers::permissionLevel_t>& permissionThresholdsMap)
290 for(
const auto& permissionLevelGroupPair : permissionLevelsMap)
295 for(
const auto& permissionThresholdGroupPair : permissionThresholdsMap)
299 if(permissionLevelGroupPair.first == permissionThresholdGroupPair.first &&
300 permissionThresholdGroupPair.second &&
301 permissionLevelGroupPair.second >= permissionThresholdGroupPair.second)
313 void CorePropertySupervisorBase::checkSupervisorPropertySetup()
315 if(propertiesAreSetup_)
321 propertiesAreSetup_ =
true;
323 CorePropertySupervisorBase::setSupervisorPropertyDefaults();
328 setSupervisorPropertyDefaults();
333 if(allSupervisorInfo_.isWizardMode())
334 __SUP_COUT__ <<
"Wiz mode detected. Skipping setup of supervisor properties for "
335 "supervisor of class '"
336 << supervisorClass_ <<
"'" << __E__;
337 else if(allSupervisorInfo_.isMacroMakerMode())
339 <<
"Maker Maker mode detected. Skipping setup of supervisor properties for "
340 "supervisor of class '"
341 << supervisorClass_ <<
"'" << __E__;
343 CorePropertySupervisorBase::loadUserSupervisorProperties();
349 forceSupervisorPropertyValues();
354 CorePropertySupervisorBase::extractPermissionsMapFromString(
355 getSupervisorProperty(
356 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold),
357 propertyStruct_.UserPermissionsThreshold);
359 propertyStruct_.UserGroupsAllowed.clear();
360 StringMacros::getMapFromString(
361 getSupervisorProperty(
362 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed),
363 propertyStruct_.UserGroupsAllowed);
365 propertyStruct_.UserGroupsDisallowed.clear();
366 StringMacros::getMapFromString(
367 getSupervisorProperty(
368 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed),
369 propertyStruct_.UserGroupsDisallowed);
371 auto nameIt = SUPERVISOR_PROPERTIES.allSetNames_.begin();
372 auto setIt = propertyStruct_.allSets_.begin();
373 while(nameIt != SUPERVISOR_PROPERTIES.allSetNames_.end() &&
374 setIt != propertyStruct_.allSets_.end())
377 StringMacros::getSetFromString(getSupervisorProperty(*(*nameIt)), *(*setIt));
383 __SUP_COUT__ <<
"Final supervisor property settings:" << __E__;
384 for(
auto& property : propertyMap_)
385 __SUP_COUT__ <<
"\t" <<
property.first <<
" = " <<
property.second << __E__;
393 if(supervisorContextUID_ ==
"" || supervisorApplicationUID_ ==
"")
395 __SUP_SS__ <<
"Empty supervisorContextUID_ or supervisorApplicationUID_."
399 return theConfigurationManager_->getSupervisorNode(supervisorContextUID_,
400 supervisorApplicationUID_);
405 <<
"XDAQ Supervisor could not access it's configuration node through "
406 "theConfigurationManager_ "
407 <<
"(Did you remember to initialize using CorePropertySupervisorBase::init()?)."
408 <<
" The supervisorContextUID_ = " << supervisorContextUID_
409 <<
". The supervisorApplicationUID = " << supervisorApplicationUID_ << __E__;
416 void CorePropertySupervisorBase::loadUserSupervisorProperties(
void)
423 auto supervisorNode = CorePropertySupervisorBase::getSupervisorTreeNode();
428 supervisorNode.getNode(
"LinkToPropertyTable").getChildren();
430 for(
auto& child : children)
432 if(child.second.getNode(
"Status").getValue<
bool>() ==
false)
435 auto propertyName = child.second.getNode(
"PropertyName").getValue();
436 setSupervisorProperty(
438 child.second.getNode(
"PropertyValue").getValue<std::string>());
443 __SUP_COUT__ <<
"No user supervisor property settings found in the configuration "
444 "tree, going with the defaults."
454 void CorePropertySupervisorBase::setSupervisorProperty(
const std::string& propertyName,
455 const std::string& propertyValue)
457 propertyMap_[propertyName] = propertyValue;
463 void CorePropertySupervisorBase::addSupervisorProperty(
const std::string& propertyName,
464 const std::string& propertyValue)
466 propertyMap_[propertyName] =
467 propertyValue +
" | " + getSupervisorProperty(propertyName);
475 std::string CorePropertySupervisorBase::getSupervisorProperty(
476 const std::string& propertyName)
479 checkSupervisorPropertySetup();
481 auto it = propertyMap_.find(propertyName);
482 if(it == propertyMap_.end())
484 __SUP_SS__ <<
"Could not find property named " << propertyName << __E__;
487 return StringMacros::validateValueForDefaultStringDataType(it->second);
493 WebUsers::permissionLevel_t
494 CorePropertySupervisorBase::getSupervisorPropertyUserPermissionsThreshold(
495 const std::string& requestType)
498 checkSupervisorPropertySetup();
500 return StringMacros::getWildCardMatchFromMap(
501 requestType, propertyStruct_.UserPermissionsThreshold);
518 checkSupervisorPropertySetup();
523 userInfo.automatedCommand_ = StringMacros::inWildCardSet(
524 userInfo.requestType_,
525 propertyStruct_.AutomatedRequestTypes);
528 userInfo.NonXMLRequestType_ = StringMacros::inWildCardSet(
529 userInfo.requestType_, propertyStruct_.NonXMLRequestTypes);
533 userInfo.NoXmlWhiteSpace_ = StringMacros::inWildCardSet(
534 userInfo.requestType_, propertyStruct_.NoXmlWhiteSpaceRequestTypes);
539 userInfo.checkLock_ = StringMacros::inWildCardSet(
540 userInfo.requestType_, propertyStruct_.CheckUserLockRequestTypes);
541 userInfo.requireLock_ = StringMacros::inWildCardSet(
542 userInfo.requestType_, propertyStruct_.RequireUserLockRequestTypes);
543 userInfo.allowNoUser_ = StringMacros::inWildCardSet(
544 userInfo.requestType_, propertyStruct_.AllowNoLoginRequestTypes);
546 userInfo.permissionsThreshold_ = -1;
549 userInfo.permissionsThreshold_ =
550 CorePropertySupervisorBase::getSupervisorPropertyUserPermissionsThreshold(
551 userInfo.requestType_);
553 catch(std::runtime_error& e)
555 if(!userInfo.automatedCommand_)
556 __SUP_COUT__ <<
"No explicit permissions threshold for request '"
557 << userInfo.requestType_
558 <<
"'... Defaulting to max threshold = "
559 << (
unsigned int)userInfo.permissionsThreshold_ << __E__;
570 StringMacros::getSetFromString(
571 StringMacros::getWildCardMatchFromMap(userInfo.requestType_,
572 propertyStruct_.UserGroupsAllowed),
573 userInfo.groupsAllowed_);
575 catch(std::runtime_error& e)
577 userInfo.groupsAllowed_.clear();
586 StringMacros::getSetFromString(
587 StringMacros::getWildCardMatchFromMap(
588 userInfo.requestType_, propertyStruct_.UserGroupsDisallowed),
589 userInfo.groupsDisallowed_);
591 catch(std::runtime_error& e)
593 userInfo.groupsDisallowed_.clear();
void init(xdaq::ApplicationContext *applicationContext)