1 #include "otsdaq/CoreSupervisors/CorePropertySupervisorBase.h"
2 #include "otsdaq/MessageFacility/ITRACEController.h"
3 #include "otsdaq/MessageFacility/TRACEController.h"
5 #include <sys/statvfs.h>
6 #include <sys/sysinfo.h>
12 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES =
17 CorePropertySupervisorBase::CorePropertySupervisorBase(xdaq::Application* application)
18 : theConfigurationManager_(0)
19 , supervisorClass_(application->getApplicationDescriptor()->getClassName())
20 , supervisorClassNoNamespace_(
21 supervisorClass_.substr(supervisorClass_.find_last_of(
":") + 1, supervisorClass_.length() - supervisorClass_.find_last_of(
":")))
22 , supervisorContextUID_(
"UNINITIALIZED_supervisorContextUID")
23 , supervisorApplicationUID_(
"UNINITIALIZED_supervisorApplicationUID")
24 , supervisorConfigurationPath_(
"UNINITIALIZED_supervisorConfigurationPath")
25 , propertiesAreSetup_(false)
26 , theTRACEController_(nullptr)
27 , OTSDAQ_LOG_DIR(__ENV__(
"OTSDAQ_LOG_DIR"))
28 , OTSDAQ_DATA_DIR(__ENV__(
"OTSDAQ_DATA"))
34 __SUP_COUT_INFO__ <<
"Supervisor URL = " << application->getApplicationContext()->getContextDescriptor()->getURL() << __E__;
35 __SUP_COUT_INFO__ <<
"Supervisor LID = " << application->getApplicationDescriptor()->getLocalId() << __E__;
36 __SUP_COUT_INFO__ <<
"Supervisor Class = " << supervisorClass_ << __E__;
37 __SUP_COUTV__(supervisorClassNoNamespace_);
40 allSupervisorInfo_.init(application->getApplicationContext());
44 StringMacros::systemVariables_[
"ActiveStateMachine"][
"name"] = StringMacros::TBD;
45 StringMacros::systemVariables_[
"ActiveStateMachine"][
"windowName"] = StringMacros::TBD;
46 StringMacros::systemVariables_[
"ActiveStateMachine"][
"runAlias"] = StringMacros::TBD;
49 StringMacros::getConcurrencyCount();
51 struct sysinfo memInfo;
52 if(sysinfo(&memInfo) == 0)
55 static_cast<uint64_t
>(memInfo.totalram) * memInfo.mem_unit / (1024 * 1024);
56 StringMacros::systemVariables_[
"System"][
"totalMemoryMB"] =
57 std::to_string(totalMemMB);
61 StringMacros::systemVariables_[
"System"][
"totalMemoryMB"] =
"unknown";
68 StringMacros::loadPersistentSystemVariables();
70 __SUP_COUTV__(StringMacros::mapToString(StringMacros::systemVariables_));
72 if(allSupervisorInfo_.isMacroMakerMode())
75 __SUP_COUT__ <<
"Macro Maker mode detected. So skipping configuration location work for "
76 "supervisor of class '"
77 << supervisorClass_ <<
"'" << __E__;
79 supervisorContextUID_ =
"MacroMakerFEContext";
80 supervisorApplicationUID_ =
"MacroMakerFESupervisor";
81 supervisorConfigurationPath_ = CorePropertySupervisorBase::supervisorContextUID_ +
"/LinkToApplicationTable/" +
82 CorePropertySupervisorBase::supervisorApplicationUID_ +
"/LinkToSupervisorTable";
84 __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
85 __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
86 __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
93 else if(allSupervisorInfo_.isWizardMode())
95 __SUP_COUT__ <<
"Wiz mode detected. So skipping configuration location work for "
96 "supervisor of class '"
97 << supervisorClass_ <<
"'" << __E__;
98 supervisorContextUID_ =
"NO CONTEXT ID IN WIZ MODE";
99 supervisorApplicationUID_ = std::to_string(application->getApplicationDescriptor()->getLocalId());
100 supervisorConfigurationPath_ =
"NO APP PATH IN WIZ MODE";
102 __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
103 __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
104 __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
109 __SUP_COUT__ <<
"Getting configuration specific info for supervisor '" << (allSupervisorInfo_.getSupervisorInfo(application).getName()) <<
"' of class "
110 << supervisorClass_ <<
"." << __E__;
116 __SUP_COUTV__(application->getApplicationContext()->getContextDescriptor()->getURL());
118 CorePropertySupervisorBase::supervisorContextUID_ =
119 theConfigurationManager_->__GET_CONFIG__(
XDAQContextTable)->getContextUID(application->getApplicationContext()->getContextDescriptor()->getURL());
120 if(CorePropertySupervisorBase::supervisorContextUID_ ==
"")
122 __SUP_SS__ <<
"Illegal empty Supervisor Context UID identified - could not find a valid UID based on Supervisor's provided URL (" <<
123 application->getApplicationContext()->getContextDescriptor()->getURL() <<
"). Please try again or contact admins." << __E__;
129 __SUP_COUT_ERR__ <<
"XDAQ Supervisor could not access it's configuration through "
130 "the Configuration Manager."
131 <<
". The getApplicationContext()->getContextDescriptor()->getURL() = "
132 << application->getApplicationContext()->getContextDescriptor()->getURL() << __E__;
138 __SUP_COUTV__(application->getApplicationDescriptor()->getLocalId());
139 CorePropertySupervisorBase::supervisorApplicationUID_ = theConfigurationManager_->__GET_CONFIG__(
XDAQContextTable)
140 ->getApplicationUID(application->getApplicationContext()->getContextDescriptor()->getURL(),
141 application->getApplicationDescriptor()->getLocalId());
142 if(CorePropertySupervisorBase::supervisorApplicationUID_ ==
"")
144 __SUP_SS__ <<
"Illegal empty Supervisor Application UID identified. Please try again or contact admins." << __E__;
150 __SUP_COUT_ERR__ <<
"XDAQ Supervisor could not access it's configuration through "
151 "the Configuration Manager."
152 <<
" The supervisorContextUID_ = " << supervisorContextUID_ <<
". The supervisorApplicationUID = " << supervisorApplicationUID_
157 CorePropertySupervisorBase::supervisorConfigurationPath_ =
"/" + CorePropertySupervisorBase::supervisorContextUID_ +
"/LinkToApplicationTable/" +
158 CorePropertySupervisorBase::supervisorApplicationUID_ +
"/LinkToSupervisorTable";
160 __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
161 __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
162 __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
176 CorePropertySupervisorBase::indicateOtsAlive(
this);
178 theConfigurationManager_->setOwnerContext(CorePropertySupervisorBase::supervisorContextUID_);
179 theConfigurationManager_->setOwnerApp(CorePropertySupervisorBase::supervisorApplicationUID_);
181 CorePropertySupervisorBase::isFirstAppInContext_ = theConfigurationManager_->isOwnerFirstAppInContext();
186 CorePropertySupervisorBase::~CorePropertySupervisorBase(
void)
188 __SUP_COUT__ <<
"Destructor." << __E__;
190 CorePropertySupervisorBase::indicateOtsDead(
this);
192 if(theConfigurationManager_)
193 delete theConfigurationManager_;
197 __SUP_COUT__ <<
"Destroying TRACE Controller..." << __E__;
201 __SUP_COUT__ <<
"Destructed." << __E__;
207 void CorePropertySupervisorBase::getAvailableDiskSpace()
209 if(!isFirstAppInContext_)
213 if(t - lastDiskSpaceCheckTime_ <= 10)
216 struct statvfs logStat;
217 if(statvfs((OTSDAQ_LOG_DIR +
"/").c_str(), &logStat) != 0)
219 __SUP_SS__ <<
"Disk space retrieval failed for log directory: " << OTSDAQ_LOG_DIR
223 uint64_t availableLogSpaceKB =
224 (uint64_t)logStat.f_bavail * logStat.f_frsize / 1024;
225 __SUP_COUTTV__(availableLogSpaceKB);
227 struct statvfs dataStat;
228 if(statvfs((OTSDAQ_DATA_DIR +
"/").c_str(), &dataStat) != 0)
230 __SUP_SS__ <<
"Disk space retrieval failed for data directory: "
231 << OTSDAQ_DATA_DIR << __E__;
234 uint64_t availableDataSpaceKB =
235 (uint64_t)dataStat.f_bavail * dataStat.f_frsize / 1024;
236 __SUP_COUTTV__(availableDataSpaceKB);
238 availableLogSpaceKB_ = availableLogSpaceKB;
239 availableDataSpaceKB_ = availableDataSpaceKB;
241 lastDiskSpaceCheckTime_ = time(0);
245 void CorePropertySupervisorBase::indicateOtsAlive(
248 char portStr[100] =
"0";
249 std::string hostname =
"wiz";
258 unsigned int port = properties->getContextTreeNode()
259 .
getNode(properties->supervisorContextUID_)
266 port = atoi(__ENV__(
"OTS_MAIN_PORT"));
268 sprintf(portStr,
"%u", port);
270 hostname = properties->getContextTreeNode()
271 .
getNode(properties->supervisorContextUID_)
274 if(hostname ==
"DEFAULT")
275 hostname =
"http://" + std::string(__ENV__(
"HOSTNAME"));
277 size_t i = hostname.find(
"//");
278 if(i != std::string::npos)
279 hostname = hostname.substr(i + 2);
285 std::string filename = std::string(__ENV__(
"OTSDAQ_LOG_DIR")) +
"/otsdaq_is_alive-" +
286 hostname +
"-" + portStr +
".dat";
287 FILE* fp = fopen(filename.c_str(),
"w");
290 __SS__ <<
"Failed to open the ots-is-alive file: " << filename << __E__;
293 fprintf(fp,
"%s %s %ld\n", hostname.c_str(), portStr, time(0));
296 __COUT__ <<
"Marked alive: " << filename << __E__;
300 void CorePropertySupervisorBase::indicateOtsDead(
303 char portStr[100] =
"0";
304 std::string hostname =
"wiz";
313 unsigned int port = properties->getContextTreeNode()
314 .
getNode(properties->supervisorContextUID_)
321 port = atoi(__ENV__(
"OTS_MAIN_PORT"));
323 sprintf(portStr,
"%u", port);
325 hostname = properties->getContextTreeNode()
326 .
getNode(properties->supervisorContextUID_)
329 if(hostname ==
"DEFAULT")
330 hostname =
"http://" + std::string(__ENV__(
"HOSTNAME"));
332 size_t i = hostname.find(
"//");
333 if(i != std::string::npos)
334 hostname = hostname.substr(i + 2);
340 std::string filename = std::string(__ENV__(
"OTSDAQ_LOG_DIR")) +
"/otsdaq_is_alive-" +
341 hostname +
"-" + portStr +
".dat";
342 FILE* fp = fopen(filename.c_str(),
"w");
345 __SS__ <<
"Failed to open the ots-is-alive file: " << filename << __E__;
350 __COUT__ <<
"Marked dead: " << filename << __E__;
355 XDAQ_CONST_CALL xdaq::ApplicationDescriptor*
358 if(allSupervisorInfo_.isMacroMakerMode())
361 return allSupervisorInfo_.
isWizardMode() ? allSupervisorInfo_.getWizardDescriptor()
362 : allSupervisorInfo_.getGatewayDescriptor();
379 CorePropertySupervisorBase::setSupervisorProperty(
380 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold,
382 CorePropertySupervisorBase::setSupervisorProperty(
383 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed,
"");
384 CorePropertySupervisorBase::setSupervisorProperty(
385 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed,
"");
387 CorePropertySupervisorBase::setSupervisorProperty(
388 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.CheckUserLockRequestTypes,
"");
389 CorePropertySupervisorBase::setSupervisorProperty(
390 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.RequireUserLockRequestTypes,
392 CorePropertySupervisorBase::setSupervisorProperty(
393 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AutomatedRequestTypes,
"");
394 CorePropertySupervisorBase::setSupervisorProperty(
395 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AllowNoLoginRequestTypes,
"");
396 CorePropertySupervisorBase::setSupervisorProperty(
397 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.RequireSecurityRequestTypes,
400 CorePropertySupervisorBase::setSupervisorProperty(
401 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NoXmlWhiteSpaceRequestTypes,
403 CorePropertySupervisorBase::setSupervisorProperty(
404 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NonXMLRequestTypes,
"");
427 const std::string& permissionsString,
428 std::map<std::string, WebUsers::permissionLevel_t>& permissionsMap)
430 permissionsMap.clear();
432 if(permissionsMap.size() == 0)
433 permissionsMap.emplace(std::pair<std::string, WebUsers::permissionLevel_t>(
434 WebUsers::DEFAULT_USER_GROUP,
435 atoi(permissionsString.c_str()))
458 std::map<std::string, WebUsers::permissionLevel_t>& permissionLevelsMap,
459 std::map<std::string, WebUsers::permissionLevel_t>& permissionThresholdsMap)
468 for(
const auto& permissionLevelGroupPair : permissionLevelsMap)
473 for(
const auto& permissionThresholdGroupPair : permissionThresholdsMap)
477 if(permissionLevelGroupPair.first == permissionThresholdGroupPair.first &&
478 permissionThresholdGroupPair.second &&
479 permissionLevelGroupPair.second >= permissionThresholdGroupPair.second)
492 void CorePropertySupervisorBase::checkSupervisorPropertySetup()
494 if(propertiesAreSetup_)
500 propertiesAreSetup_ =
true;
502 __SUP_COUTT__ <<
"Setting up supervisor specific property DEFAULTS for supervisor..."
511 <<
"Done setting up supervisor specific property DEFAULTS for supervisor."
515 __SUP_COUT__ <<
"Wiz mode detected. Skipping setup of supervisor properties for "
516 "supervisor of class '"
517 << supervisorClass_ <<
"'" << __E__;
518 else if(allSupervisorInfo_.isMacroMakerMode())
520 <<
"Maker Maker mode detected. Skipping setup of supervisor properties for "
521 "supervisor of class '"
522 << supervisorClass_ <<
"'" << __E__;
528 readOnly_ = getSupervisorProperty(
"ReadOnly",
"0") ==
"1" ? true :
false;
529 __SUP_COUTV__(readOnly_);
531 __SUP_COUTT__ <<
"Setting up supervisor specific FORCED properties for supervisor..."
535 <<
"Done setting up supervisor specific FORCED properties for supervisor."
539 getSupervisorProperty(
540 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold),
541 propertyStruct_.UserPermissionsThreshold);
543 propertyStruct_.UserGroupsAllowed.clear();
545 getSupervisorProperty(
546 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed),
547 propertyStruct_.UserGroupsAllowed);
549 propertyStruct_.UserGroupsDisallowed.clear();
551 getSupervisorProperty(
552 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed),
553 propertyStruct_.UserGroupsDisallowed);
555 auto nameIt = SUPERVISOR_PROPERTIES.allSetNames_.begin();
556 auto setIt = propertyStruct_.allSets_.begin();
557 while(nameIt != SUPERVISOR_PROPERTIES.allSetNames_.end() &&
558 setIt != propertyStruct_.allSets_.end())
567 __SUP_COUT__ <<
"Final supervisor property settings:" << __E__;
568 for(
auto& property : propertyMap_)
569 __SUP_COUT__ <<
"\t" <<
property.first <<
" = " <<
property.second << __E__;
578 if(supervisorContextUID_ ==
"" || supervisorApplicationUID_ ==
"")
580 __SUP_SS__ <<
"Empty supervisorContextUID_ or supervisorApplicationUID_."
584 return theConfigurationManager_->getSupervisorNode(supervisorContextUID_,
585 supervisorApplicationUID_);
590 <<
"XDAQ Supervisor could not access it's configuration node through "
591 "theConfigurationManager_ "
592 <<
"(Did you remember to initialize using CorePropertySupervisorBase::init()?)."
593 <<
" The supervisorContextUID_ = " << supervisorContextUID_
594 <<
". The supervisorApplicationUID = " << supervisorApplicationUID_ << __E__;
613 supervisorNode.getNode(
"LinkToPropertyTable").getChildren();
615 for(
auto& child : children)
617 if(!child.second.status())
620 auto propertyName = child.second.getNode(
"PropertyName").getValue();
621 setSupervisorProperty(
623 child.second.getNode(
"PropertyValue").getValue<std::string>());
628 __SUP_COUT__ <<
"No user supervisor property settings found in the configuration "
629 "tree, going with the defaults."
639 void CorePropertySupervisorBase::setSupervisorProperty(
const std::string& propertyName,
640 const std::string& propertyValue)
642 propertyMap_[propertyName] = propertyValue;
648 void CorePropertySupervisorBase::addSupervisorProperty(
const std::string& propertyName,
649 const std::string& propertyValue)
651 propertyMap_[propertyName] =
652 propertyValue +
" | " + getSupervisorProperty(propertyName);
660 std::string CorePropertySupervisorBase::getSupervisorProperty(
661 const std::string& propertyName)
664 checkSupervisorPropertySetup();
666 auto it = propertyMap_.find(propertyName);
667 if(it == propertyMap_.end())
669 __SUP_SS__ <<
"Could not find property named " << propertyName << __E__;
677 std::string CorePropertySupervisorBase::getSupervisorProperty(
678 const std::string& propertyName,
const std::string& defaultValue)
681 checkSupervisorPropertySetup();
683 auto it = propertyMap_.find(propertyName);
684 if(it == propertyMap_.end())
695 WebUsers::permissionLevel_t
697 const std::string& requestType)
700 checkSupervisorPropertySetup();
703 requestType, propertyStruct_.UserPermissionsThreshold);
711 checkSupervisorPropertySetup();
713 __SUP_COUT_TYPE__(TLVL_DEBUG + 20)
714 << __COUT_HDR__ <<
"userInfo.requestType_ " << userInfo.requestType_ << __E__;
716 __SUP_COUT_TYPE__(TLVL_DEBUG + 20)
717 << __COUT_HDR__ <<
"propertyStruct_.AutomatedRequestTypes "
720 userInfo.requestType_,
721 propertyStruct_.AutomatedRequestTypes);
725 __SUP_COUT_TYPE__(TLVL_DEBUG + 21)
726 << __COUT_HDR__ <<
"propertyStruct_.NonXMLRequestTypes "
729 userInfo.requestType_, propertyStruct_.NonXMLRequestTypes);
734 __SUP_COUT_TYPE__(TLVL_DEBUG + 21)
735 << __COUT_HDR__ <<
"propertyStruct_.NoXmlWhiteSpaceRequestTypes "
739 userInfo.requestType_, propertyStruct_.NoXmlWhiteSpaceRequestTypes);
744 __SUP_COUT_TYPE__(TLVL_DEBUG + 20)
745 << __COUT_HDR__ <<
"propertyStruct_.CheckUserLockRequestTypes "
749 userInfo.requestType_, propertyStruct_.CheckUserLockRequestTypes);
750 __SUP_COUT_TYPE__(TLVL_DEBUG + 20)
751 << __COUT_HDR__ <<
"propertyStruct_.RequireUserLockRequestTypes "
755 userInfo.requestType_, propertyStruct_.RequireUserLockRequestTypes);
756 if(userInfo.requireLock_ && userInfo.automatedCommand_)
758 __SUP_COUTT__ <<
"Overriding requireLock_ because request '"
759 << userInfo.requestType_ <<
"' marked as automatedCommand_"
761 userInfo.requireLock_ =
false;
764 __SUP_COUT_TYPE__(TLVL_DEBUG + 21)
765 << __COUT_HDR__ <<
"propertyStruct_.AllowNoLoginRequestTypes "
769 userInfo.requestType_, propertyStruct_.AllowNoLoginRequestTypes);
770 __SUP_COUT_TYPE__(TLVL_DEBUG + 21)
771 << __COUT_HDR__ <<
"propertyStruct_.RequireSecurityRequestTypes "
775 userInfo.requestType_, propertyStruct_.RequireSecurityRequestTypes);
777 userInfo.permissionsThreshold_ = -1;
780 userInfo.permissionsThreshold_ =
782 userInfo.requestType_);
784 catch(std::runtime_error& e)
786 if(!userInfo.automatedCommand_)
787 __SUP_COUT__ <<
"No explicit permissions threshold for request '"
788 << userInfo.requestType_
789 <<
"'... Defaulting to max threshold = "
790 << (
unsigned int)userInfo.permissionsThreshold_ << __E__;
793 __SUP_COUTVS__(20, userInfo.requestType_);
794 __SUP_COUTVS__(20, userInfo.checkLock_);
795 __SUP_COUTVS__(20, userInfo.requireLock_);
796 __SUP_COUTVS__(20, userInfo.allowNoUser_);
797 __SUP_COUTVS__(20, userInfo.automatedCommand_);
798 __SUP_COUTVS__(20, userInfo.automatedCommand_);
799 __SUP_COUTVS__(20, (
unsigned int)userInfo.permissionsThreshold_);
805 propertyStruct_.UserGroupsAllowed),
806 userInfo.groupsAllowed_);
808 catch(std::runtime_error& e)
810 userInfo.groupsAllowed_.clear();
811 if(!userInfo.automatedCommand_)
812 __SUP_COUT_TYPE__(TLVL_DEBUG + 25)
813 << __COUT_HDR__ <<
"No explicit groups allowed for request '"
814 << userInfo.requestType_
815 <<
"'... Defaulting to empty groups allowed. " << __E__;
821 userInfo.requestType_, propertyStruct_.UserGroupsDisallowed),
822 userInfo.groupsDisallowed_);
824 catch(std::runtime_error& e)
826 userInfo.groupsDisallowed_.clear();
828 if(!userInfo.automatedCommand_)
829 __SUP_COUT_TYPE__(TLVL_DEBUG + 25)
830 << __COUT_HDR__ <<
"No explicit groups disallowed for request '"
831 << userInfo.requestType_
832 <<
"'... Defaulting to empty groups disallowed. " << __E__;
840 xoap::MessageReference CorePropertySupervisorBase::TRACESupervisorRequest(
841 xoap::MessageReference message)
843 __SUP_COUT__ <<
"$$$$$$$$$$$$$$$$$" << __E__;
847 parameters.addParameter(
"Request");
849 __SUP_COUT__ <<
"Received TRACE message: " << SOAPUtilities::translate(message)
852 SOAPUtilities::receive(message, parameters);
853 std::string request = parameters.getValue(
"Request");
855 __SUP_COUT__ <<
"request: " << request << __E__;
864 if(request ==
"GetTraceLevels")
866 retParameters.addParameter(
"TRACEList", getTraceLevels());
867 retParameters.addParameter(
"TRACEHostnameList", traceReturnHostString_);
868 return SOAPUtilities::makeSOAPMessageReference(
869 supervisorClassNoNamespace_ +
"Response", retParameters);
871 else if(request ==
"SetTraceLevels")
873 parameters.addParameter(
"IndividualValues");
874 parameters.addParameter(
"Host");
875 parameters.addParameter(
"SetMode");
876 parameters.addParameter(
"Labels");
877 parameters.addParameter(
"SetValueMSB");
878 parameters.addParameter(
"SetValueLSB");
879 SOAPUtilities::receive(message, parameters);
881 int individualValues = parameters.getValueAsInt(
"IndividualValues");
882 std::string host = parameters.getValue(
"Host");
883 std::string setMode = parameters.getValue(
"SetMode");
884 std::string labelsStr = parameters.getValue(
"Labels");
885 int setValueMSB = parameters.getValueAsInt(
"SetValueMSB");
886 int setValueLSB = parameters.getValueAsInt(
"SetValueLSB");
887 __SUP_COUTV__(individualValues);
889 __SUP_COUTV__(setMode);
890 __SUP_COUTV__(setValueMSB);
891 __SUP_COUTV__(setValueLSB);
892 __SUP_COUTV__(labelsStr);
895 retParameters.addParameter(
896 "TRACEList", setIndividualTraceLevels(host, setMode, labelsStr));
898 retParameters.addParameter(
900 setTraceLevels(host, setMode, labelsStr, setValueMSB, setValueLSB));
901 return SOAPUtilities::makeSOAPMessageReference(
902 supervisorClassNoNamespace_ +
"Response", retParameters);
904 else if(request ==
"GetTriggerStatus")
906 retParameters.addParameter(
"TRACETriggerStatus", getTraceTriggerStatus());
907 return SOAPUtilities::makeSOAPMessageReference(
908 supervisorClassNoNamespace_ +
"Response", retParameters);
910 else if(request ==
"SetTriggerEnable")
912 parameters.addParameter(
"Host");
913 parameters.addParameter(
"EntriesAfterTrigger");
914 SOAPUtilities::receive(message, parameters);
916 std::string host = parameters.getValue(
"Host");
917 int entriesAfterTrigger = parameters.getValueAsInt(
"EntriesAfterTrigger");
919 __SUP_COUTV__(entriesAfterTrigger);
920 retParameters.addParameter(
"TRACETriggerStatus",
921 setTraceTriggerEnable(host, entriesAfterTrigger));
922 return SOAPUtilities::makeSOAPMessageReference(
923 supervisorClassNoNamespace_ +
"Response", retParameters);
925 else if(request ==
"ResetTRACE")
927 parameters.addParameter(
"Host");
928 SOAPUtilities::receive(message, parameters);
930 std::string host = parameters.getValue(
"Host");
932 retParameters.addParameter(
"TRACETriggerStatus", resetTRACE(host));
933 return SOAPUtilities::makeSOAPMessageReference(
934 supervisorClassNoNamespace_ +
"Response", retParameters);
936 else if(request ==
"EnableTRACE")
938 parameters.addParameter(
"Host");
939 parameters.addParameter(
"SetEnable");
940 SOAPUtilities::receive(message, parameters);
942 std::string host = parameters.getValue(
"Host");
943 bool enable = parameters.getValueAsInt(
"SetEnable") ? true :
false;
945 __SUP_COUTV__(enable);
947 retParameters.addParameter(
"TRACETriggerStatus", enableTRACE(host, enable));
948 return SOAPUtilities::makeSOAPMessageReference(
949 supervisorClassNoNamespace_ +
"Response", retParameters);
951 else if(request ==
"GetSnapshot")
953 parameters.addParameter(
"Host");
954 parameters.addParameter(
"FilterForCSV");
955 parameters.addParameter(
"FilterOutCSV");
956 SOAPUtilities::receive(message, parameters);
958 std::string host = parameters.getValue(
"Host");
959 std::string filterFor = parameters.getValue(
"FilterForCSV");
960 std::string filterOut = parameters.getValue(
"FilterOutCSV");
962 __SUP_COUTV__(filterFor);
963 __SUP_COUTV__(filterOut);
964 retParameters.addParameter(
"TRACESnapshot",
965 getTraceSnapshot(host, filterFor, filterOut));
966 retParameters.addParameter(
"TRACETriggerStatus", getTraceTriggerStatus());
967 return SOAPUtilities::makeSOAPMessageReference(
968 supervisorClassNoNamespace_ +
"Response", retParameters);
972 __SUP_SS__ <<
"Unrecognized request received! '" << request <<
"'" << __E__;
976 catch(
const std::runtime_error& e)
978 __SUP_SS__ <<
"Error occurred handling request: " << e.what() << __E__;
979 __SUP_COUT_ERR__ << ss.str();
980 retParameters.addParameter(
"Error", ss.str());
984 __SUP_SS__ <<
"Error occurred handling request." << __E__;
989 catch(
const std::exception& e)
991 ss <<
"Exception message: " << e.what();
996 __SUP_COUT_ERR__ << ss.str();
997 retParameters.addParameter(
"Error", ss.str());
1000 return SOAPUtilities::makeSOAPMessageReference(
"TRACEFault", retParameters);
1005 const std::string& CorePropertySupervisorBase::getTraceLevels()
1007 __SUP_COUT__ <<
"getTraceLevels()" << __E__;
1009 traceReturnString_ =
"";
1010 traceReturnHostString_ =
"";
1014 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1019 ITRACEController::HostTraceLevelMap traceHostMap =
1022 __SUP_COUT__ <<
"TRACE controller returned " << traceHostMap.size() <<
" host key(s)."
1025 for(
const auto& traceMap : traceHostMap)
1027 __SUP_COUT__ <<
"host key '" << traceMap.first <<
"' with "
1028 << traceMap.second.size() <<
" label(s)." << __E__;
1037 traceReturnHostString_ +=
";" + traceMap.first;
1038 traceReturnString_ +=
";" + traceMap.first;
1040 for(
const auto& traceMask : traceMap.second)
1045 traceReturnString_ +=
1046 "," + traceMask.first +
1047 ",M:" + std::to_string((
unsigned int)(traceMask.second.M >> 32)) +
":" +
1048 std::to_string((
unsigned int)traceMask.second.M) +
1049 ":S:" + std::to_string((
unsigned int)(traceMask.second.S >> 32)) +
":" +
1050 std::to_string((
unsigned int)traceMask.second.S) +
1051 ":T:" + std::to_string((
unsigned int)(traceMask.second.T >> 32)) +
":" +
1052 std::to_string((
unsigned int)traceMask.second.T);
1055 __SUP_COUTTV__(traceReturnString_);
1056 __SUP_COUTV__(traceReturnHostString_);
1057 __SUP_COUT__ <<
"end getTraceLevels()" << __E__;
1058 return traceReturnString_;
1062 const std::string& CorePropertySupervisorBase::setTraceLevels(
1063 std::string
const& host,
1064 std::string
const& mode,
1065 std::string
const& labelsStr,
1066 uint32_t setValueMSB,
1067 uint32_t setValueLSB)
1069 __SUP_COUT__ <<
"setTraceLevels()" << __E__;
1073 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1078 bool allMode = mode ==
"ALL";
1079 if(allMode || mode ==
"FAST")
1080 setMask.M = ((uint64_t(setValueMSB)) << 32) | (uint64_t(uint32_t(setValueLSB)));
1081 if(allMode || mode ==
"SLOW")
1082 setMask.S = ((uint64_t(setValueMSB)) << 32) | (uint64_t(uint32_t(setValueLSB)));
1083 if(allMode || mode ==
"TRIGGER")
1084 setMask.T = ((uint64_t(setValueMSB)) << 32) | (uint64_t(uint32_t(setValueLSB)));
1086 std::vector<std::string > labels;
1088 for(
const auto& label : labels)
1090 __SUP_COUTV__(label);
1094 __SUP_COUT__ <<
"end setTraceLevels()" << __E__;
1095 return getTraceLevels();
1099 const std::string& CorePropertySupervisorBase::setIndividualTraceLevels(
1100 std::string
const& host, std::string
const& mode, std::string
const& labelValuesStr)
1102 __SUP_COUT__ <<
"setIndividualTraceLevels()" << __E__;
1106 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1111 bool allMode = mode ==
"ALL";
1112 bool fastMode = mode ==
"FAST";
1113 bool slowMode = mode ==
"SLOW";
1114 bool triggerMode = mode ==
"TRIGGER";
1116 std::vector<std::string > labelValues;
1118 for(
unsigned int i = 0; i < labelValues.size(); i += 3 )
1120 __SUP_COUT__ <<
"Label = " << labelValues[i] <<
" msb/lsb " << labelValues[i + 1]
1121 <<
"/" << labelValues[i + 2] << __E__;
1123 if(allMode || fastMode)
1124 setMask.M = ((uint64_t(atoi(labelValues[i + 1].c_str()))) << 32) |
1125 (uint64_t(uint32_t(atoi(labelValues[i + 2].c_str()))));
1126 if(allMode || slowMode)
1127 setMask.S = ((uint64_t(atoi(labelValues[i + 1].c_str()))) << 32) |
1128 (uint64_t(uint32_t(atoi(labelValues[i + 2].c_str()))));
1129 if(allMode || triggerMode)
1130 setMask.T = ((uint64_t(atoi(labelValues[i + 1].c_str()))) << 32) |
1131 (uint64_t(uint32_t(atoi(labelValues[i + 2].c_str()))));
1136 __SUP_COUT__ <<
"end setIndividualTraceLevels()" << __E__;
1137 return getTraceLevels();
1141 const std::string& CorePropertySupervisorBase::getTraceTriggerStatus()
1143 __SUP_COUT__ <<
"getTraceTriggerStatus()" << __E__;
1145 traceReturnString_ =
"";
1149 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1154 traceReturnString_ +=
1157 __SUP_COUT__ <<
"end getTraceTriggerStatus() " << traceReturnString_ << __E__;
1158 return traceReturnString_;
1162 const std::string& CorePropertySupervisorBase::setTraceTriggerEnable(
1163 std::string
const& host,
size_t entriesAfterTrigger)
1165 __SUP_COUT__ <<
"setTraceTriggerEnable() " << host << __E__;
1169 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1173 __SUP_COUT__ <<
"end setTraceTriggerEnable()" << __E__;
1174 return getTraceTriggerStatus();
1178 const std::string& CorePropertySupervisorBase::resetTRACE(std::string
const& host)
1180 __SUP_COUT__ <<
"resetTRACE() " << host << __E__;
1184 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1189 __SUP_COUT__ <<
"end resetTRACE()" << __E__;
1190 return getTraceTriggerStatus();
1194 const std::string& CorePropertySupervisorBase::enableTRACE(std::string
const& host,
1197 __SUP_COUT__ <<
"enableTRACE() " << host <<
" " << enable << __E__;
1201 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1205 __SUP_COUT__ <<
"end enableTRACE()" << __E__;
1206 return getTraceTriggerStatus();
1210 const std::string& CorePropertySupervisorBase::getTraceSnapshot(
1211 std::string
const& host, std::string
const& filterFor, std::string
const& filterOut)
1213 __SUP_COUT__ <<
"getTraceSnapshot()" << host << __E__;
1215 traceReturnString_ =
"";
1219 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1226 const size_t MAX_SZ = 200000;
1227 if(traceReturnString_.size() > MAX_SZ)
1229 __SUP_COUT__ <<
"Truncating from " << traceReturnString_.size() <<
" to "
1231 traceReturnString_.resize(MAX_SZ);
1232 traceReturnString_ +=
"\n...TRUNCATED";
1234 else if(traceReturnString_.size() == 0)
1236 __SUP_COUT__ <<
"Empty snapshot" << __E__;
1237 traceReturnString_ =
"Empty TRACE snapshot.";
1239 __SUP_COUT__ <<
"end getTraceSnapshot() Bytes = " << traceReturnString_.size()
1241 return traceReturnString_;
bool isWizardMode(void) const
BOOLs.
ConfigurationTree getNode(const std::string &nodeName, bool doNotThrowOnBrokenUIDLinks=false) const
navigating between nodes
void getValue(T &value) const
static void extractPermissionsMapFromString(const std::string &permissionsString, std::map< std::string, WebUsers::permissionLevel_t > &permissionsMap)
static bool doPermissionsGrantAccess(std::map< std::string, WebUsers::permissionLevel_t > &permissionLevelsMap, std::map< std::string, WebUsers::permissionLevel_t > &permissionThresholdsMap)
ITRACEController * theTRACEController_
only define for an app that receives a command
virtual void forceSupervisorPropertyValues(void)
override to force supervisor property values (and ignore user settings)
void loadUserSupervisorProperties(void)
ConfigurationTree getSupervisorTreeNode(void)
void getRequestUserInfo(WebUsers::RequestUserInfo &requestUserInfo)
WebUsers::permissionLevel_t getSupervisorPropertyUserPermissionsThreshold(const std::string &requestType)
XDAQ_CONST_CALL xdaq::ApplicationDescriptor * getGatewaySupervisorDescriptor(void)
will be wizard supervisor in wiz mode
virtual void setSupervisorPropertyDefaults(void)
override to control supervisor specific defaults
std::string getTraceBufferDump(std::string const &filterFor="", std::string const &filterOut="")
virtual void setTraceLevelMask(std::string const &name, TraceMasks const &lvl, std::string const &hostname="localhost", std::string const &mode="ALL")=0
pure virtual
virtual void resetTraceBuffer(void)=0
pure virtual
virtual bool getIsTriggered(void)=0
pure virtual
virtual const HostTraceLevelMap & getTraceLevels(void)=0
pure virtual
virtual void enableTrace(bool enable=true)=0
pure virtual
virtual void setTriggerEnable(size_t entriesAfterTrigger)=0
pure virtual
defines used also by OtsConfigurationWizardSupervisor
void INIT_MF(const char *name)
static void getVectorFromString(const std::string &inputString, std::vector< std::string > &listToReturn, const std::set< char > &delimiter={',', '|', '&'}, const std::set< char > &whitespace={' ', '\t', '\n', '\r'}, std::vector< char > *listOfDelimiters=0, bool decodeURIComponents=false)
static void getSetFromString(const std::string &inputString, std::set< std::string > &setToReturn, const std::set< char > &delimiter={',', '|', '&'}, const std::set< char > &whitespace={' ', '\t', '\n', '\r'})
static std::string setToString(const std::set< T > &setToReturn, const std::string &delimeter=", ")
setToString ~
static T validateValueForDefaultStringDataType(const std::string &value, bool doConvertEnvironmentVariables=true)
static T & getWildCardMatchFromMap(const std::string &needle, std::map< std::string, T > &haystack, std::string *foundKey=0)
defined in included .icc source
static bool inWildCardSet(const std::string &needle, const std::set< std::string > &haystack)
static void getMapFromString(const std::string &inputString, std::map< S, T > &mapToReturn, const std::set< char > &pairPairDelimiter={',', '|', '&'}, const std::set< char > &nameValueDelimiter={'=', ':'}, const std::set< char > &whitespace={' ', '\t', '\n', '\r'})
getMapFromString ~