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_);
62 CorePropertySupervisorBase::indicateOtsAlive(0);
66 else if(allSupervisorInfo_.isWizardMode())
68 __SUP_COUT__ <<
"Wiz mode detected. So skipping configuration location work for "
69 "supervisor of class '"
70 << supervisorClass_ <<
"'" << __E__;
71 supervisorContextUID_ =
"NO CONTEXT ID IN WIZ MODE";
72 supervisorApplicationUID_ =
73 std::to_string(application->getApplicationDescriptor()->getLocalId());
74 supervisorConfigurationPath_ =
"NO APP PATH IN WIZ MODE";
76 __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
77 __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
78 __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
83 __SUP_COUT__ <<
"Getting configuration specific info for supervisor '"
84 << (allSupervisorInfo_.getSupervisorInfo(application).getName())
85 <<
"' of class " << supervisorClass_ <<
"." << __E__;
92 CorePropertySupervisorBase::supervisorContextUID_ =
94 ->getContextUID(application->getApplicationContext()
95 ->getContextDescriptor()
101 <<
"XDAQ Supervisor could not access it's configuration through "
102 "the Configuration Manager."
103 <<
". The getApplicationContext()->getContextDescriptor()->getURL() = "
104 << application->getApplicationContext()->getContextDescriptor()->getURL()
111 CorePropertySupervisorBase::supervisorApplicationUID_ =
114 application->getApplicationContext()
115 ->getContextDescriptor()
117 application->getApplicationDescriptor()->getLocalId());
121 __SUP_COUT_ERR__ <<
"XDAQ Supervisor could not access it's configuration through "
122 "the Configuration Manager."
123 <<
" The supervisorContextUID_ = " << supervisorContextUID_
124 <<
". The supervisorApplicationUID = "
125 << supervisorApplicationUID_ << __E__;
129 CorePropertySupervisorBase::supervisorConfigurationPath_ =
130 "/" + CorePropertySupervisorBase::supervisorContextUID_ +
131 "/LinkToApplicationTable/" +
132 CorePropertySupervisorBase::supervisorApplicationUID_ +
"/LinkToSupervisorTable";
134 __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
135 __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
136 __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
138 CorePropertySupervisorBase::indicateOtsAlive(
this);
140 theConfigurationManager_->setOwnerContext(
141 CorePropertySupervisorBase::supervisorContextUID_);
142 theConfigurationManager_->setOwnerApp(
143 CorePropertySupervisorBase::supervisorApplicationUID_);
148 CorePropertySupervisorBase::~CorePropertySupervisorBase(
void)
150 if(theConfigurationManager_)
151 delete theConfigurationManager_;
155 void CorePropertySupervisorBase::indicateOtsAlive(
158 char portStr[100] =
"0";
159 std::string hostname =
"wiz";
166 unsigned int port = properties->getContextTreeNode()
167 .getNode(properties->supervisorContextUID_)
169 .getValue<
unsigned int>();
170 sprintf(portStr,
"%u", port);
172 hostname = properties->getContextTreeNode()
173 .getNode(properties->supervisorContextUID_)
175 .getValue<std::string>();
177 size_t i = hostname.find(
"//");
178 if(i != std::string::npos)
179 hostname = hostname.substr(i + 2);
185 std::string filename = std::string(__ENV__(
"OTSDAQ_LOG_DIR")) +
"/otsdaq_is_alive-" +
186 hostname +
"-" + portStr +
".dat";
187 FILE* fp = fopen(filename.c_str(),
"w");
190 __SS__ <<
"Failed to open the ots-is-alive file: " << filename << __E__;
193 fprintf(fp,
"%s %s %ld\n", hostname.c_str(), portStr, time(0));
196 __COUT__ <<
"Marked alive: " << filename << __E__;
203 void CorePropertySupervisorBase::setSupervisorPropertyDefaults(
void)
213 CorePropertySupervisorBase::setSupervisorProperty(
214 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold,
216 CorePropertySupervisorBase::setSupervisorProperty(
217 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed,
"");
218 CorePropertySupervisorBase::setSupervisorProperty(
219 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed,
"");
221 CorePropertySupervisorBase::setSupervisorProperty(
222 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.CheckUserLockRequestTypes,
"");
223 CorePropertySupervisorBase::setSupervisorProperty(
224 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.RequireUserLockRequestTypes,
226 CorePropertySupervisorBase::setSupervisorProperty(
227 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AutomatedRequestTypes,
"");
228 CorePropertySupervisorBase::setSupervisorProperty(
229 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AllowNoLoginRequestTypes,
"");
231 CorePropertySupervisorBase::setSupervisorProperty(
232 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NoXmlWhiteSpaceRequestTypes,
234 CorePropertySupervisorBase::setSupervisorProperty(
235 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NonXMLRequestTypes,
"");
255 void CorePropertySupervisorBase::extractPermissionsMapFromString(
256 const std::string& permissionsString,
257 std::map<std::string, WebUsers::permissionLevel_t>& permissionsMap)
259 permissionsMap.clear();
260 StringMacros::getMapFromString(permissionsString, permissionsMap);
281 bool CorePropertySupervisorBase::doPermissionsGrantAccess(
282 std::map<std::string, WebUsers::permissionLevel_t>& permissionLevelsMap,
283 std::map<std::string, WebUsers::permissionLevel_t>& permissionThresholdsMap)
292 for(
const auto& permissionLevelGroupPair : permissionLevelsMap)
297 for(
const auto& permissionThresholdGroupPair : permissionThresholdsMap)
301 if(permissionLevelGroupPair.first == permissionThresholdGroupPair.first &&
302 permissionThresholdGroupPair.second &&
303 permissionLevelGroupPair.second >= permissionThresholdGroupPair.second)
315 void CorePropertySupervisorBase::checkSupervisorPropertySetup()
317 if(propertiesAreSetup_)
323 propertiesAreSetup_ =
true;
325 CorePropertySupervisorBase::setSupervisorPropertyDefaults();
330 setSupervisorPropertyDefaults();
335 if(allSupervisorInfo_.isWizardMode())
336 __SUP_COUT__ <<
"Wiz mode detected. Skipping setup of supervisor properties for "
337 "supervisor of class '"
338 << supervisorClass_ <<
"'" << __E__;
339 else if(allSupervisorInfo_.isMacroMakerMode())
341 <<
"Maker Maker mode detected. Skipping setup of supervisor properties for "
342 "supervisor of class '"
343 << supervisorClass_ <<
"'" << __E__;
345 CorePropertySupervisorBase::loadUserSupervisorProperties();
351 forceSupervisorPropertyValues();
356 CorePropertySupervisorBase::extractPermissionsMapFromString(
357 getSupervisorProperty(
358 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold),
359 propertyStruct_.UserPermissionsThreshold);
361 propertyStruct_.UserGroupsAllowed.clear();
362 StringMacros::getMapFromString(
363 getSupervisorProperty(
364 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed),
365 propertyStruct_.UserGroupsAllowed);
367 propertyStruct_.UserGroupsDisallowed.clear();
368 StringMacros::getMapFromString(
369 getSupervisorProperty(
370 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed),
371 propertyStruct_.UserGroupsDisallowed);
373 auto nameIt = SUPERVISOR_PROPERTIES.allSetNames_.begin();
374 auto setIt = propertyStruct_.allSets_.begin();
375 while(nameIt != SUPERVISOR_PROPERTIES.allSetNames_.end() &&
376 setIt != propertyStruct_.allSets_.end())
379 StringMacros::getSetFromString(getSupervisorProperty(*(*nameIt)), *(*setIt));
385 __SUP_COUT__ <<
"Final supervisor property settings:" << __E__;
386 for(
auto& property : propertyMap_)
387 __SUP_COUT__ <<
"\t" <<
property.first <<
" = " <<
property.second << __E__;
395 if(supervisorContextUID_ ==
"" || supervisorApplicationUID_ ==
"")
397 __SUP_SS__ <<
"Empty supervisorContextUID_ or supervisorApplicationUID_."
401 return theConfigurationManager_->getSupervisorNode(supervisorContextUID_,
402 supervisorApplicationUID_);
407 <<
"XDAQ Supervisor could not access it's configuration node through "
408 "theConfigurationManager_ "
409 <<
"(Did you remember to initialize using CorePropertySupervisorBase::init()?)."
410 <<
" The supervisorContextUID_ = " << supervisorContextUID_
411 <<
". The supervisorApplicationUID = " << supervisorApplicationUID_ << __E__;
418 void CorePropertySupervisorBase::loadUserSupervisorProperties(
void)
425 auto supervisorNode = CorePropertySupervisorBase::getSupervisorTreeNode();
430 supervisorNode.getNode(
"LinkToPropertyTable").getChildren();
432 for(
auto& child : children)
434 if(child.second.getNode(
"Status").getValue<
bool>() ==
false)
437 auto propertyName = child.second.getNode(
"PropertyName").getValue();
438 setSupervisorProperty(
440 child.second.getNode(
"PropertyValue").getValue<std::string>());
445 __SUP_COUT__ <<
"No user supervisor property settings found in the configuration "
446 "tree, going with the defaults."
456 void CorePropertySupervisorBase::setSupervisorProperty(
const std::string& propertyName,
457 const std::string& propertyValue)
459 propertyMap_[propertyName] = propertyValue;
465 void CorePropertySupervisorBase::addSupervisorProperty(
const std::string& propertyName,
466 const std::string& propertyValue)
468 propertyMap_[propertyName] =
469 propertyValue +
" | " + getSupervisorProperty(propertyName);
477 std::string CorePropertySupervisorBase::getSupervisorProperty(
478 const std::string& propertyName)
481 checkSupervisorPropertySetup();
483 auto it = propertyMap_.find(propertyName);
484 if(it == propertyMap_.end())
486 __SUP_SS__ <<
"Could not find property named " << propertyName << __E__;
489 return StringMacros::validateValueForDefaultStringDataType(it->second);
495 WebUsers::permissionLevel_t
496 CorePropertySupervisorBase::getSupervisorPropertyUserPermissionsThreshold(
497 const std::string& requestType)
500 checkSupervisorPropertySetup();
502 return StringMacros::getWildCardMatchFromMap(
503 requestType, propertyStruct_.UserPermissionsThreshold);
520 checkSupervisorPropertySetup();
525 userInfo.automatedCommand_ = StringMacros::inWildCardSet(
526 userInfo.requestType_,
527 propertyStruct_.AutomatedRequestTypes);
530 userInfo.NonXMLRequestType_ = StringMacros::inWildCardSet(
531 userInfo.requestType_, propertyStruct_.NonXMLRequestTypes);
535 userInfo.NoXmlWhiteSpace_ = StringMacros::inWildCardSet(
536 userInfo.requestType_, propertyStruct_.NoXmlWhiteSpaceRequestTypes);
541 userInfo.checkLock_ = StringMacros::inWildCardSet(
542 userInfo.requestType_, propertyStruct_.CheckUserLockRequestTypes);
543 userInfo.requireLock_ = StringMacros::inWildCardSet(
544 userInfo.requestType_, propertyStruct_.RequireUserLockRequestTypes);
545 userInfo.allowNoUser_ = StringMacros::inWildCardSet(
546 userInfo.requestType_, propertyStruct_.AllowNoLoginRequestTypes);
548 userInfo.permissionsThreshold_ = -1;
551 userInfo.permissionsThreshold_ =
552 CorePropertySupervisorBase::getSupervisorPropertyUserPermissionsThreshold(
553 userInfo.requestType_);
555 catch(std::runtime_error& e)
557 if(!userInfo.automatedCommand_)
558 __SUP_COUT__ <<
"No explicit permissions threshold for request '"
559 << userInfo.requestType_
560 <<
"'... Defaulting to max threshold = "
561 << (
unsigned int)userInfo.permissionsThreshold_ << __E__;
572 StringMacros::getSetFromString(
573 StringMacros::getWildCardMatchFromMap(userInfo.requestType_,
574 propertyStruct_.UserGroupsAllowed),
575 userInfo.groupsAllowed_);
577 catch(std::runtime_error& e)
579 userInfo.groupsAllowed_.clear();
588 StringMacros::getSetFromString(
589 StringMacros::getWildCardMatchFromMap(
590 userInfo.requestType_, propertyStruct_.UserGroupsDisallowed),
591 userInfo.groupsDisallowed_);
593 catch(std::runtime_error& e)
595 userInfo.groupsDisallowed_.clear();
void init(xdaq::ApplicationContext *applicationContext)