1 #include "otsdaq/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,
"");
230 CorePropertySupervisorBase::setSupervisorProperty(
231 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.RequireSecurityRequestTypes,
234 CorePropertySupervisorBase::setSupervisorProperty(
235 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NoXmlWhiteSpaceRequestTypes,
237 CorePropertySupervisorBase::setSupervisorProperty(
238 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NonXMLRequestTypes,
"");
258 void CorePropertySupervisorBase::extractPermissionsMapFromString(
259 const std::string& permissionsString,
260 std::map<std::string, WebUsers::permissionLevel_t>& permissionsMap)
262 permissionsMap.clear();
263 StringMacros::getMapFromString(permissionsString, permissionsMap);
284 bool CorePropertySupervisorBase::doPermissionsGrantAccess(
285 std::map<std::string, WebUsers::permissionLevel_t>& permissionLevelsMap,
286 std::map<std::string, WebUsers::permissionLevel_t>& permissionThresholdsMap)
295 for(
const auto& permissionLevelGroupPair : permissionLevelsMap)
300 for(
const auto& permissionThresholdGroupPair : permissionThresholdsMap)
304 if(permissionLevelGroupPair.first == permissionThresholdGroupPair.first &&
305 permissionThresholdGroupPair.second &&
306 permissionLevelGroupPair.second >= permissionThresholdGroupPair.second)
318 void CorePropertySupervisorBase::checkSupervisorPropertySetup()
320 if(propertiesAreSetup_)
326 propertiesAreSetup_ =
true;
328 CorePropertySupervisorBase::setSupervisorPropertyDefaults();
333 setSupervisorPropertyDefaults();
338 if(allSupervisorInfo_.isWizardMode())
339 __SUP_COUT__ <<
"Wiz mode detected. Skipping setup of supervisor properties for "
340 "supervisor of class '"
341 << supervisorClass_ <<
"'" << __E__;
342 else if(allSupervisorInfo_.isMacroMakerMode())
344 <<
"Maker Maker mode detected. Skipping setup of supervisor properties for "
345 "supervisor of class '"
346 << supervisorClass_ <<
"'" << __E__;
348 CorePropertySupervisorBase::loadUserSupervisorProperties();
354 forceSupervisorPropertyValues();
359 CorePropertySupervisorBase::extractPermissionsMapFromString(
360 getSupervisorProperty(
361 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold),
362 propertyStruct_.UserPermissionsThreshold);
364 propertyStruct_.UserGroupsAllowed.clear();
365 StringMacros::getMapFromString(
366 getSupervisorProperty(
367 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed),
368 propertyStruct_.UserGroupsAllowed);
370 propertyStruct_.UserGroupsDisallowed.clear();
371 StringMacros::getMapFromString(
372 getSupervisorProperty(
373 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed),
374 propertyStruct_.UserGroupsDisallowed);
376 auto nameIt = SUPERVISOR_PROPERTIES.allSetNames_.begin();
377 auto setIt = propertyStruct_.allSets_.begin();
378 while(nameIt != SUPERVISOR_PROPERTIES.allSetNames_.end() &&
379 setIt != propertyStruct_.allSets_.end())
382 StringMacros::getSetFromString(getSupervisorProperty(*(*nameIt)), *(*setIt));
388 __SUP_COUT__ <<
"Final supervisor property settings:" << __E__;
389 for(
auto& property : propertyMap_)
390 __SUP_COUT__ <<
"\t" <<
property.first <<
" = " <<
property.second << __E__;
398 if(supervisorContextUID_ ==
"" || supervisorApplicationUID_ ==
"")
400 __SUP_SS__ <<
"Empty supervisorContextUID_ or supervisorApplicationUID_."
404 return theConfigurationManager_->getSupervisorNode(supervisorContextUID_,
405 supervisorApplicationUID_);
410 <<
"XDAQ Supervisor could not access it's configuration node through "
411 "theConfigurationManager_ "
412 <<
"(Did you remember to initialize using CorePropertySupervisorBase::init()?)."
413 <<
" The supervisorContextUID_ = " << supervisorContextUID_
414 <<
". The supervisorApplicationUID = " << supervisorApplicationUID_ << __E__;
421 void CorePropertySupervisorBase::loadUserSupervisorProperties(
void)
428 auto supervisorNode = CorePropertySupervisorBase::getSupervisorTreeNode();
433 supervisorNode.getNode(
"LinkToPropertyTable").getChildren();
435 for(
auto& child : children)
437 if(child.second.getNode(
"Status").getValue<
bool>() ==
false)
440 auto propertyName = child.second.getNode(
"PropertyName").getValue();
441 setSupervisorProperty(
443 child.second.getNode(
"PropertyValue").getValue<std::string>());
448 __SUP_COUT__ <<
"No user supervisor property settings found in the configuration "
449 "tree, going with the defaults."
459 void CorePropertySupervisorBase::setSupervisorProperty(
const std::string& propertyName,
460 const std::string& propertyValue)
462 propertyMap_[propertyName] = propertyValue;
468 void CorePropertySupervisorBase::addSupervisorProperty(
const std::string& propertyName,
469 const std::string& propertyValue)
471 propertyMap_[propertyName] =
472 propertyValue +
" | " + getSupervisorProperty(propertyName);
480 std::string CorePropertySupervisorBase::getSupervisorProperty(
481 const std::string& propertyName)
484 checkSupervisorPropertySetup();
486 auto it = propertyMap_.find(propertyName);
487 if(it == propertyMap_.end())
489 __SUP_SS__ <<
"Could not find property named " << propertyName << __E__;
492 return StringMacros::validateValueForDefaultStringDataType(it->second);
495 std::string CorePropertySupervisorBase::getSupervisorProperty(
496 const std::string& propertyName,
const std::string& defaultValue)
499 checkSupervisorPropertySetup();
501 auto it = propertyMap_.find(propertyName);
502 if(it == propertyMap_.end())
507 return StringMacros::validateValueForDefaultStringDataType(it->second);
513 WebUsers::permissionLevel_t
514 CorePropertySupervisorBase::getSupervisorPropertyUserPermissionsThreshold(
515 const std::string& requestType)
518 checkSupervisorPropertySetup();
520 return StringMacros::getWildCardMatchFromMap(
521 requestType, propertyStruct_.UserPermissionsThreshold);
538 checkSupervisorPropertySetup();
543 userInfo.automatedCommand_ = StringMacros::inWildCardSet(
544 userInfo.requestType_,
545 propertyStruct_.AutomatedRequestTypes);
548 userInfo.NonXMLRequestType_ = StringMacros::inWildCardSet(
549 userInfo.requestType_, propertyStruct_.NonXMLRequestTypes);
553 userInfo.NoXmlWhiteSpace_ = StringMacros::inWildCardSet(
554 userInfo.requestType_, propertyStruct_.NoXmlWhiteSpaceRequestTypes);
559 userInfo.checkLock_ = StringMacros::inWildCardSet(
560 userInfo.requestType_, propertyStruct_.CheckUserLockRequestTypes);
561 userInfo.requireLock_ = StringMacros::inWildCardSet(
562 userInfo.requestType_, propertyStruct_.RequireUserLockRequestTypes);
563 userInfo.allowNoUser_ = StringMacros::inWildCardSet(
564 userInfo.requestType_, propertyStruct_.AllowNoLoginRequestTypes);
565 userInfo.requireSecurity_ = StringMacros::inWildCardSet(
566 userInfo.requestType_, propertyStruct_.RequireSecurityRequestTypes);
568 userInfo.permissionsThreshold_ = -1;
571 userInfo.permissionsThreshold_ =
572 CorePropertySupervisorBase::getSupervisorPropertyUserPermissionsThreshold(
573 userInfo.requestType_);
575 catch(std::runtime_error& e)
577 if(!userInfo.automatedCommand_)
578 __SUP_COUT__ <<
"No explicit permissions threshold for request '"
579 << userInfo.requestType_
580 <<
"'... Defaulting to max threshold = "
581 << (
unsigned int)userInfo.permissionsThreshold_ << __E__;
592 StringMacros::getSetFromString(
593 StringMacros::getWildCardMatchFromMap(userInfo.requestType_,
594 propertyStruct_.UserGroupsAllowed),
595 userInfo.groupsAllowed_);
597 catch(std::runtime_error& e)
599 userInfo.groupsAllowed_.clear();
608 StringMacros::getSetFromString(
609 StringMacros::getWildCardMatchFromMap(
610 userInfo.requestType_, propertyStruct_.UserGroupsDisallowed),
611 userInfo.groupsDisallowed_);
613 catch(std::runtime_error& e)
615 userInfo.groupsDisallowed_.clear();