1 #include "otsdaq-core/CoreSupervisors/CorePropertySupervisorBase.h"
8 CorePropertySupervisorBase::CorePropertySupervisorBase(xdaq::Application* application)
10 , supervisorClass_ (application->getApplicationDescriptor()->getClassName())
11 , supervisorClassNoNamespace_ (supervisorClass_.substr(supervisorClass_.find_last_of(
":")+1, supervisorClass_.length()-supervisorClass_.find_last_of(
":")))
12 , supervisorContextUID_ (
"MUST BE INITIALIZED INSIDE THE CONTRUCTOR TO THROW EXCEPTIONS")
13 , supervisorApplicationUID_ (
"MUST BE INITIALIZED INSIDE THE CONTRUCTOR TO THROW EXCEPTIONS")
14 , supervisorConfigurationPath_ (
"MUST BE INITIALIZED INSIDE THE CONTRUCTOR TO THROW EXCEPTIONS")
15 , propertiesAreSetup_ (false)
17 INIT_MF(
"CorePropertySupervisorBase");
19 __SUP_COUTV__(application->getApplicationContext()->getContextDescriptor()->getURL());
20 __SUP_COUTV__(application->getApplicationDescriptor()->getLocalId());
21 __SUP_COUTV__(supervisorClass_);
22 __SUP_COUTV__(supervisorClassNoNamespace_);
25 allSupervisorInfo_.init(application->getApplicationContext());
27 if(allSupervisorInfo_.isWizardMode())
29 __SUP_COUT__ <<
"Wiz mode detected. So skipping configuration location work for supervisor of class '" <<
30 supervisorClass_ <<
"'" << __E__;
35 __SUP_COUT__ <<
"Getting configuration specific info for supervisor '" <<
36 (allSupervisorInfo_.getSupervisorInfo(application).getName()) <<
37 "' of class " << supervisorClass_ <<
"." << __E__;
43 CorePropertySupervisorBase::supervisorContextUID_ =
45 application->getApplicationContext()->getContextDescriptor()->getURL());
49 __SUP_COUT_ERR__ <<
"XDAQ Supervisor could not access it's configuration through the theConfigurationManager_." <<
51 ". The getApplicationContext()->getContextDescriptor()->getURL() = " <<
52 application->getApplicationContext()->getContextDescriptor()->getURL() << std::endl;
58 CorePropertySupervisorBase::supervisorApplicationUID_ =
61 application->getApplicationContext()->getContextDescriptor()->getURL(),
62 application->getApplicationDescriptor()->getLocalId()
67 __SUP_COUT_ERR__ <<
"XDAQ Supervisor could not access it's configuration through the theConfigurationManager_." <<
68 " The supervisorContextUID_ = " << supervisorContextUID_ <<
69 ". The supervisorApplicationUID = " << supervisorApplicationUID_ << std::endl;
73 CorePropertySupervisorBase::supervisorConfigurationPath_ =
"/" +
74 CorePropertySupervisorBase::supervisorContextUID_ +
"/LinkToApplicationConfiguration/" +
75 CorePropertySupervisorBase::supervisorApplicationUID_ +
"/LinkToSupervisorConfiguration";
77 __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
78 __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
79 __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
84 CorePropertySupervisorBase::~CorePropertySupervisorBase(
void)
92 void CorePropertySupervisorBase::setSupervisorPropertyDefaults(
void)
100 CorePropertySupervisorBase::setSupervisorProperty(CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold,
"*=1");
101 CorePropertySupervisorBase::setSupervisorProperty(CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed,
"");
102 CorePropertySupervisorBase::setSupervisorProperty(CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed,
"");
104 CorePropertySupervisorBase::setSupervisorProperty(CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.CheckUserLockRequestTypes,
"");
105 CorePropertySupervisorBase::setSupervisorProperty(CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.RequireUserLockRequestTypes,
"");
106 CorePropertySupervisorBase::setSupervisorProperty(CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AutomatedRequestTypes,
"");
107 CorePropertySupervisorBase::setSupervisorProperty(CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AllowNoLoginRequestTypes,
"");
109 CorePropertySupervisorBase::setSupervisorProperty(CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NoXmlWhiteSpaceRequestTypes,
"");
110 CorePropertySupervisorBase::setSupervisorProperty(CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NonXMLRequestTypes,
"");
130 void CorePropertySupervisorBase::extractPermissionsMapFromString(
const std::string& permissionsString,
131 std::map<std::string,WebUsers::permissionLevel_t>& permissionsMap)
133 permissionsMap.clear();
134 StringMacros::getMapFromString(
157 bool CorePropertySupervisorBase::doPermissionsGrantAccess(
158 std::map<std::string,WebUsers::permissionLevel_t>& permissionLevelsMap,
159 std::map<std::string,WebUsers::permissionLevel_t>& permissionThresholdsMap)
167 for(
const auto& permissionLevelGroupPair: permissionLevelsMap)
171 for(
const auto& permissionThresholdGroupPair: permissionThresholdsMap)
174 if(permissionLevelGroupPair.first == permissionThresholdGroupPair.first &&
175 permissionThresholdGroupPair.second &&
176 permissionLevelGroupPair.second >= permissionThresholdGroupPair.second)
187 void CorePropertySupervisorBase::checkSupervisorPropertySetup()
189 if(propertiesAreSetup_)
return;
194 propertiesAreSetup_ =
true;
197 CorePropertySupervisorBase::setSupervisorPropertyDefaults();
200 setSupervisorPropertyDefaults();
204 if(allSupervisorInfo_.isWizardMode())
205 __SUP_COUT__ <<
"Wiz mode detected. Skipping setup of supervisor properties for supervisor of class '" <<
209 CorePropertySupervisorBase::loadUserSupervisorProperties();
213 forceSupervisorPropertyValues();
217 CorePropertySupervisorBase::extractPermissionsMapFromString(
218 getSupervisorProperty(
219 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold),
220 propertyStruct_.UserPermissionsThreshold);
222 propertyStruct_.UserGroupsAllowed.clear();
223 StringMacros::getMapFromString(
224 getSupervisorProperty(
225 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed),
226 propertyStruct_.UserGroupsAllowed);
228 propertyStruct_.UserGroupsDisallowed.clear();
229 StringMacros::getMapFromString(
230 getSupervisorProperty(
231 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed),
232 propertyStruct_.UserGroupsDisallowed);
234 auto nameIt = SUPERVISOR_PROPERTIES.allSetNames_.begin();
235 auto setIt = propertyStruct_.allSets_.begin();
236 while(nameIt != SUPERVISOR_PROPERTIES.allSetNames_.end() &&
237 setIt != propertyStruct_.allSets_.end())
240 StringMacros::getSetFromString(
241 getSupervisorProperty(
249 __SUP_COUT__ <<
"Final supervisor property settings:" << std::endl;
250 for(
auto& property: propertyMap_)
251 __SUP_COUT__ <<
"\t" <<
property.first <<
" = " <<
property.second << __E__;
260 if(supervisorContextUID_ ==
"" || supervisorApplicationUID_ ==
"")
262 __SUP_SS__ <<
"Empty supervisorContextUID_ or supervisorApplicationUID_." << __E__;
265 return theConfigurationManager_->getSupervisorNode(
266 supervisorContextUID_, supervisorApplicationUID_);
270 __SUP_COUT_ERR__ <<
"XDAQ Supervisor could not access it's configuration node through theConfigurationManager_ " <<
271 "(Did you remember to initialize using CorePropertySupervisorBase::init()?)." <<
272 " The supervisorContextUID_ = " << supervisorContextUID_ <<
273 ". The supervisorApplicationUID = " << supervisorApplicationUID_ << std::endl;
280 void CorePropertySupervisorBase::loadUserSupervisorProperties(
void)
287 auto supervisorNode = CorePropertySupervisorBase::getSupervisorTreeNode();
291 auto children = supervisorNode.getNode(
"LinkToPropertyConfiguration").getChildren();
293 for(
auto& child:children)
295 if(child.second.getNode(
"Status").getValue<
bool>() ==
false)
continue;
297 auto propertyName = child.second.getNode(
"PropertyName").getValue();
298 setSupervisorProperty(propertyName, child.second.getNode(
"PropertyValue").getValue<std::string>());
303 __SUP_COUT__ <<
"No user supervisor property settings found in the configuration tree, going with the defaults." << __E__;
312 void CorePropertySupervisorBase::setSupervisorProperty(
const std::string& propertyName,
const std::string& propertyValue)
314 propertyMap_[propertyName] = propertyValue;
320 void CorePropertySupervisorBase::addSupervisorProperty(
const std::string& propertyName,
const std::string& propertyValue)
322 propertyMap_[propertyName] = propertyValue +
" | " + getSupervisorProperty(propertyName);
331 std::string CorePropertySupervisorBase::getSupervisorProperty(
const std::string& propertyName)
334 checkSupervisorPropertySetup ();
336 auto it = propertyMap_.find(propertyName);
337 if(it == propertyMap_.end())
339 __SUP_SS__ <<
"Could not find property named " << propertyName << __E__;
340 throw std::runtime_error(ss.str());
342 return StringMacros::validateValueForDefaultStringDataType(it->second);
348 WebUsers::permissionLevel_t CorePropertySupervisorBase::getSupervisorPropertyUserPermissionsThreshold(
349 const std::string& requestType)
352 checkSupervisorPropertySetup();
354 return StringMacros::getWildCardMatchFromMap(requestType,
355 propertyStruct_.UserPermissionsThreshold);
371 checkSupervisorPropertySetup();
375 userInfo.automatedCommand_ = StringMacros::inWildCardSet(userInfo.requestType_, propertyStruct_.AutomatedRequestTypes);
376 userInfo.NonXMLRequestType_ = StringMacros::inWildCardSet(userInfo.requestType_, propertyStruct_.NonXMLRequestTypes);
377 userInfo.NoXmlWhiteSpace_ = StringMacros::inWildCardSet(userInfo.requestType_, propertyStruct_.NoXmlWhiteSpaceRequestTypes);
382 userInfo.checkLock_ = StringMacros::inWildCardSet(userInfo.requestType_, propertyStruct_.CheckUserLockRequestTypes);
383 userInfo.requireLock_ = StringMacros::inWildCardSet(userInfo.requestType_, propertyStruct_.RequireUserLockRequestTypes);
384 userInfo.allowNoUser_ = StringMacros::inWildCardSet(userInfo.requestType_, propertyStruct_.AllowNoLoginRequestTypes);
388 userInfo.permissionsThreshold_ = -1;
391 userInfo.permissionsThreshold_ = CorePropertySupervisorBase::getSupervisorPropertyUserPermissionsThreshold(
392 userInfo.requestType_);
394 catch(std::runtime_error& e)
396 if(!userInfo.automatedCommand_)
397 __SUP_COUT__ <<
"No explicit permissions threshold for request '" <<
398 userInfo.requestType_ <<
"'... Defaulting to max threshold = " <<
399 (
unsigned int)userInfo.permissionsThreshold_ << __E__;
410 StringMacros::getSetFromString(
411 StringMacros::getWildCardMatchFromMap(userInfo.requestType_,
412 propertyStruct_.UserGroupsAllowed),
413 userInfo.groupsAllowed_);
415 catch(std::runtime_error& e)
417 userInfo.groupsAllowed_.clear();
425 StringMacros::getSetFromString(
426 StringMacros::getWildCardMatchFromMap(userInfo.requestType_,
427 propertyStruct_.UserGroupsDisallowed),
428 userInfo.groupsDisallowed_);
430 catch(std::runtime_error& e)
432 userInfo.groupsDisallowed_.clear();