1 #include "otsdaq-core/CoreSupervisors/CorePropertySupervisorBase.h"
6 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES =
10 CorePropertySupervisorBase::CorePropertySupervisorBase(xdaq::Application* application)
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_.isWizardMode())
43 __SUP_COUT__ <<
"Wiz mode detected. So skipping configuration location work for "
44 "supervisor of class '"
45 << supervisorClass_ <<
"'" << __E__;
46 supervisorContextUID_ =
"NO CONTEXT ID IN WIZ MODE";
47 supervisorApplicationUID_ =
48 std::to_string(application->getApplicationDescriptor()->getLocalId());
49 supervisorConfigurationPath_ =
"NO APP PATH IN WIZ MODE";
53 __SUP_COUT__ <<
"Getting configuration specific info for supervisor '"
54 << (allSupervisorInfo_.getSupervisorInfo(application).getName())
55 <<
"' of class " << supervisorClass_ <<
"." << __E__;
61 CorePropertySupervisorBase::supervisorContextUID_ =
63 ->getContextUID(application->getApplicationContext()
64 ->getContextDescriptor()
70 <<
"XDAQ Supervisor could not access it's configuration through "
71 "the Configuration Manager."
72 <<
". The getApplicationContext()->getContextDescriptor()->getURL() = "
73 << application->getApplicationContext()->getContextDescriptor()->getURL()
80 CorePropertySupervisorBase::supervisorApplicationUID_ =
83 application->getApplicationContext()
84 ->getContextDescriptor()
86 application->getApplicationDescriptor()->getLocalId());
90 __SUP_COUT_ERR__ <<
"XDAQ Supervisor could not access it's configuration through "
91 "the Configuration Manager."
92 <<
" The supervisorContextUID_ = " << supervisorContextUID_
93 <<
". The supervisorApplicationUID = "
94 << supervisorApplicationUID_ << __E__;
98 CorePropertySupervisorBase::supervisorConfigurationPath_ =
99 "/" + CorePropertySupervisorBase::supervisorContextUID_ +
100 "/LinkToApplicationTable/" +
101 CorePropertySupervisorBase::supervisorApplicationUID_ +
"/LinkToSupervisorTable";
103 __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
104 __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
105 __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
107 CorePropertySupervisorBase::indicateOtsAlive(
this);
112 CorePropertySupervisorBase::~CorePropertySupervisorBase(
void)
114 if(theConfigurationManager_)
115 delete theConfigurationManager_;
119 void CorePropertySupervisorBase::indicateOtsAlive(
122 char portStr[100] =
"0";
123 std::string hostname =
"wiz";
130 unsigned int port = properties->getContextTreeNode()
131 .getNode(properties->supervisorContextUID_)
133 .getValue<
unsigned int>();
134 sprintf(portStr,
"%u", port);
136 hostname = properties->getContextTreeNode()
137 .getNode(properties->supervisorContextUID_)
139 .getValue<std::string>();
141 size_t i = hostname.find(
"//");
142 if(i != std::string::npos)
143 hostname = hostname.substr(i + 2);
149 std::string filename = std::string(getenv(
"OTSDAQ_LOG_DIR")) +
"/otsdaq_is_alive-" +
150 hostname +
"-" + portStr +
".dat";
151 FILE* fp = fopen(filename.c_str(),
"w");
154 __SS__ <<
"Failed to open the ots-is-alive file: " << filename << __E__;
157 fprintf(fp,
"%s %s %ld\n", hostname.c_str(), portStr, time(0));
160 __COUT__ <<
"Marked alive: " << filename << __E__;
167 void CorePropertySupervisorBase::setSupervisorPropertyDefaults(
void)
177 CorePropertySupervisorBase::setSupervisorProperty(
178 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold,
180 CorePropertySupervisorBase::setSupervisorProperty(
181 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed,
"");
182 CorePropertySupervisorBase::setSupervisorProperty(
183 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed,
"");
185 CorePropertySupervisorBase::setSupervisorProperty(
186 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.CheckUserLockRequestTypes,
"");
187 CorePropertySupervisorBase::setSupervisorProperty(
188 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.RequireUserLockRequestTypes,
190 CorePropertySupervisorBase::setSupervisorProperty(
191 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AutomatedRequestTypes,
"");
192 CorePropertySupervisorBase::setSupervisorProperty(
193 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AllowNoLoginRequestTypes,
"");
195 CorePropertySupervisorBase::setSupervisorProperty(
196 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NoXmlWhiteSpaceRequestTypes,
198 CorePropertySupervisorBase::setSupervisorProperty(
199 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NonXMLRequestTypes,
"");
219 void CorePropertySupervisorBase::extractPermissionsMapFromString(
220 const std::string& permissionsString,
221 std::map<std::string, WebUsers::permissionLevel_t>& permissionsMap)
223 permissionsMap.clear();
224 StringMacros::getMapFromString(permissionsString, permissionsMap);
245 bool CorePropertySupervisorBase::doPermissionsGrantAccess(
246 std::map<std::string, WebUsers::permissionLevel_t>& permissionLevelsMap,
247 std::map<std::string, WebUsers::permissionLevel_t>& permissionThresholdsMap)
256 for(
const auto& permissionLevelGroupPair : permissionLevelsMap)
261 for(
const auto& permissionThresholdGroupPair : permissionThresholdsMap)
265 if(permissionLevelGroupPair.first == permissionThresholdGroupPair.first &&
266 permissionThresholdGroupPair.second &&
267 permissionLevelGroupPair.second >= permissionThresholdGroupPair.second)
279 void CorePropertySupervisorBase::checkSupervisorPropertySetup()
281 if(propertiesAreSetup_)
287 propertiesAreSetup_ =
true;
289 CorePropertySupervisorBase::setSupervisorPropertyDefaults();
294 setSupervisorPropertyDefaults();
299 if(allSupervisorInfo_.isWizardMode())
300 __SUP_COUT__ <<
"Wiz mode detected. Skipping setup of supervisor properties for "
301 "supervisor of class '"
302 << supervisorClass_ <<
"'" << __E__;
304 CorePropertySupervisorBase::loadUserSupervisorProperties();
310 forceSupervisorPropertyValues();
315 CorePropertySupervisorBase::extractPermissionsMapFromString(
316 getSupervisorProperty(
317 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold),
318 propertyStruct_.UserPermissionsThreshold);
320 propertyStruct_.UserGroupsAllowed.clear();
321 StringMacros::getMapFromString(
322 getSupervisorProperty(
323 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed),
324 propertyStruct_.UserGroupsAllowed);
326 propertyStruct_.UserGroupsDisallowed.clear();
327 StringMacros::getMapFromString(
328 getSupervisorProperty(
329 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed),
330 propertyStruct_.UserGroupsDisallowed);
332 auto nameIt = SUPERVISOR_PROPERTIES.allSetNames_.begin();
333 auto setIt = propertyStruct_.allSets_.begin();
334 while(nameIt != SUPERVISOR_PROPERTIES.allSetNames_.end() &&
335 setIt != propertyStruct_.allSets_.end())
338 StringMacros::getSetFromString(getSupervisorProperty(*(*nameIt)), *(*setIt));
344 __SUP_COUT__ <<
"Final supervisor property settings:" << __E__;
345 for(
auto& property : propertyMap_)
346 __SUP_COUT__ <<
"\t" <<
property.first <<
" = " <<
property.second << __E__;
354 if(supervisorContextUID_ ==
"" || supervisorApplicationUID_ ==
"")
356 __SUP_SS__ <<
"Empty supervisorContextUID_ or supervisorApplicationUID_."
360 return theConfigurationManager_->getSupervisorNode(supervisorContextUID_,
361 supervisorApplicationUID_);
366 <<
"XDAQ Supervisor could not access it's configuration node through "
367 "theConfigurationManager_ "
368 <<
"(Did you remember to initialize using CorePropertySupervisorBase::init()?)."
369 <<
" The supervisorContextUID_ = " << supervisorContextUID_
370 <<
". The supervisorApplicationUID = " << supervisorApplicationUID_ << __E__;
377 void CorePropertySupervisorBase::loadUserSupervisorProperties(
void)
384 auto supervisorNode = CorePropertySupervisorBase::getSupervisorTreeNode();
389 supervisorNode.getNode(
"LinkToPropertyTable").getChildren();
391 for(
auto& child : children)
393 if(child.second.getNode(
"Status").getValue<
bool>() ==
false)
396 auto propertyName = child.second.getNode(
"PropertyName").getValue();
397 setSupervisorProperty(
399 child.second.getNode(
"PropertyValue").getValue<std::string>());
404 __SUP_COUT__ <<
"No user supervisor property settings found in the configuration "
405 "tree, going with the defaults."
415 void CorePropertySupervisorBase::setSupervisorProperty(
const std::string& propertyName,
416 const std::string& propertyValue)
418 propertyMap_[propertyName] = propertyValue;
424 void CorePropertySupervisorBase::addSupervisorProperty(
const std::string& propertyName,
425 const std::string& propertyValue)
427 propertyMap_[propertyName] =
428 propertyValue +
" | " + getSupervisorProperty(propertyName);
436 std::string CorePropertySupervisorBase::getSupervisorProperty(
437 const std::string& propertyName)
440 checkSupervisorPropertySetup();
442 auto it = propertyMap_.find(propertyName);
443 if(it == propertyMap_.end())
445 __SUP_SS__ <<
"Could not find property named " << propertyName << __E__;
448 return StringMacros::validateValueForDefaultStringDataType(it->second);
454 WebUsers::permissionLevel_t
455 CorePropertySupervisorBase::getSupervisorPropertyUserPermissionsThreshold(
456 const std::string& requestType)
459 checkSupervisorPropertySetup();
461 return StringMacros::getWildCardMatchFromMap(
462 requestType, propertyStruct_.UserPermissionsThreshold);
479 checkSupervisorPropertySetup();
484 userInfo.automatedCommand_ = StringMacros::inWildCardSet(
485 userInfo.requestType_,
486 propertyStruct_.AutomatedRequestTypes);
489 userInfo.NonXMLRequestType_ = StringMacros::inWildCardSet(
490 userInfo.requestType_, propertyStruct_.NonXMLRequestTypes);
494 userInfo.NoXmlWhiteSpace_ = StringMacros::inWildCardSet(
495 userInfo.requestType_, propertyStruct_.NoXmlWhiteSpaceRequestTypes);
500 userInfo.checkLock_ = StringMacros::inWildCardSet(
501 userInfo.requestType_, propertyStruct_.CheckUserLockRequestTypes);
502 userInfo.requireLock_ = StringMacros::inWildCardSet(
503 userInfo.requestType_, propertyStruct_.RequireUserLockRequestTypes);
504 userInfo.allowNoUser_ = StringMacros::inWildCardSet(
505 userInfo.requestType_, propertyStruct_.AllowNoLoginRequestTypes);
507 userInfo.permissionsThreshold_ = -1;
510 userInfo.permissionsThreshold_ =
511 CorePropertySupervisorBase::getSupervisorPropertyUserPermissionsThreshold(
512 userInfo.requestType_);
514 catch(std::runtime_error& e)
516 if(!userInfo.automatedCommand_)
517 __SUP_COUT__ <<
"No explicit permissions threshold for request '"
518 << userInfo.requestType_
519 <<
"'... Defaulting to max threshold = "
520 << (
unsigned int)userInfo.permissionsThreshold_ << __E__;
531 StringMacros::getSetFromString(
532 StringMacros::getWildCardMatchFromMap(userInfo.requestType_,
533 propertyStruct_.UserGroupsAllowed),
534 userInfo.groupsAllowed_);
536 catch(std::runtime_error& e)
538 userInfo.groupsAllowed_.clear();
547 StringMacros::getSetFromString(
548 StringMacros::getWildCardMatchFromMap(
549 userInfo.requestType_, propertyStruct_.UserGroupsDisallowed),
550 userInfo.groupsDisallowed_);
552 catch(std::runtime_error& e)
554 userInfo.groupsDisallowed_.clear();
void init(xdaq::ApplicationContext *applicationContext)