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";
65 __SUP_COUTV__(StringMacros::mapToString(StringMacros::systemVariables_));
67 if(allSupervisorInfo_.isMacroMakerMode())
70 __SUP_COUT__ <<
"Macro Maker mode detected. So skipping configuration location work for "
71 "supervisor of class '"
72 << supervisorClass_ <<
"'" << __E__;
74 supervisorContextUID_ =
"MacroMakerFEContext";
75 supervisorApplicationUID_ =
"MacroMakerFESupervisor";
76 supervisorConfigurationPath_ = CorePropertySupervisorBase::supervisorContextUID_ +
"/LinkToApplicationTable/" +
77 CorePropertySupervisorBase::supervisorApplicationUID_ +
"/LinkToSupervisorTable";
79 __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
80 __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
81 __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
88 else if(allSupervisorInfo_.isWizardMode())
90 __SUP_COUT__ <<
"Wiz mode detected. So skipping configuration location work for "
91 "supervisor of class '"
92 << supervisorClass_ <<
"'" << __E__;
93 supervisorContextUID_ =
"NO CONTEXT ID IN WIZ MODE";
94 supervisorApplicationUID_ = std::to_string(application->getApplicationDescriptor()->getLocalId());
95 supervisorConfigurationPath_ =
"NO APP PATH IN WIZ MODE";
97 __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
98 __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
99 __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
104 __SUP_COUT__ <<
"Getting configuration specific info for supervisor '" << (allSupervisorInfo_.getSupervisorInfo(application).getName()) <<
"' of class "
105 << supervisorClass_ <<
"." << __E__;
111 __SUP_COUTV__(application->getApplicationContext()->getContextDescriptor()->getURL());
113 CorePropertySupervisorBase::supervisorContextUID_ =
114 theConfigurationManager_->__GET_CONFIG__(
XDAQContextTable)->getContextUID(application->getApplicationContext()->getContextDescriptor()->getURL());
115 if(CorePropertySupervisorBase::supervisorContextUID_ ==
"")
117 __SUP_SS__ <<
"Illegal empty Supervisor Context UID identified - could not find a valid UID based on Supervisor's provided URL (" <<
118 application->getApplicationContext()->getContextDescriptor()->getURL() <<
"). Please try again or contact admins." << __E__;
124 __SUP_COUT_ERR__ <<
"XDAQ Supervisor could not access it's configuration through "
125 "the Configuration Manager."
126 <<
". The getApplicationContext()->getContextDescriptor()->getURL() = "
127 << application->getApplicationContext()->getContextDescriptor()->getURL() << __E__;
133 __SUP_COUTV__(application->getApplicationDescriptor()->getLocalId());
134 CorePropertySupervisorBase::supervisorApplicationUID_ = theConfigurationManager_->__GET_CONFIG__(
XDAQContextTable)
135 ->getApplicationUID(application->getApplicationContext()->getContextDescriptor()->getURL(),
136 application->getApplicationDescriptor()->getLocalId());
137 if(CorePropertySupervisorBase::supervisorApplicationUID_ ==
"")
139 __SUP_SS__ <<
"Illegal empty Supervisor Application UID identified. Please try again or contact admins." << __E__;
145 __SUP_COUT_ERR__ <<
"XDAQ Supervisor could not access it's configuration through "
146 "the Configuration Manager."
147 <<
" The supervisorContextUID_ = " << supervisorContextUID_ <<
". The supervisorApplicationUID = " << supervisorApplicationUID_
152 CorePropertySupervisorBase::supervisorConfigurationPath_ =
"/" + CorePropertySupervisorBase::supervisorContextUID_ +
"/LinkToApplicationTable/" +
153 CorePropertySupervisorBase::supervisorApplicationUID_ +
"/LinkToSupervisorTable";
155 __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
156 __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
157 __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
171 CorePropertySupervisorBase::indicateOtsAlive(
this);
173 theConfigurationManager_->setOwnerContext(CorePropertySupervisorBase::supervisorContextUID_);
174 theConfigurationManager_->setOwnerApp(CorePropertySupervisorBase::supervisorApplicationUID_);
176 CorePropertySupervisorBase::isFirstAppInContext_ = theConfigurationManager_->isOwnerFirstAppInContext();
181 CorePropertySupervisorBase::~CorePropertySupervisorBase(
void)
183 __SUP_COUT__ <<
"Destructor." << __E__;
185 CorePropertySupervisorBase::indicateOtsDead(
this);
187 if(theConfigurationManager_)
188 delete theConfigurationManager_;
192 __SUP_COUT__ <<
"Destroying TRACE Controller..." << __E__;
196 __SUP_COUT__ <<
"Destructed." << __E__;
202 void CorePropertySupervisorBase::getAvailableDiskSpace()
204 if(!isFirstAppInContext_)
208 if(t - lastDiskSpaceCheckTime_ <= 10)
211 struct statvfs logStat;
212 if(statvfs((OTSDAQ_LOG_DIR +
"/").c_str(), &logStat) != 0)
214 __SUP_SS__ <<
"Disk space retrieval failed for log directory: " << OTSDAQ_LOG_DIR
218 uint64_t availableLogSpaceKB =
219 (uint64_t)logStat.f_bavail * logStat.f_frsize / 1024;
220 __SUP_COUTTV__(availableLogSpaceKB);
222 struct statvfs dataStat;
223 if(statvfs((OTSDAQ_DATA_DIR +
"/").c_str(), &dataStat) != 0)
225 __SUP_SS__ <<
"Disk space retrieval failed for data directory: "
226 << OTSDAQ_DATA_DIR << __E__;
229 uint64_t availableDataSpaceKB =
230 (uint64_t)dataStat.f_bavail * dataStat.f_frsize / 1024;
231 __SUP_COUTTV__(availableDataSpaceKB);
233 availableLogSpaceKB_ = availableLogSpaceKB;
234 availableDataSpaceKB_ = availableDataSpaceKB;
236 lastDiskSpaceCheckTime_ = time(0);
240 void CorePropertySupervisorBase::indicateOtsAlive(
243 char portStr[100] =
"0";
244 std::string hostname =
"wiz";
253 unsigned int port = properties->getContextTreeNode()
254 .
getNode(properties->supervisorContextUID_)
261 port = atoi(__ENV__(
"OTS_MAIN_PORT"));
263 sprintf(portStr,
"%u", port);
265 hostname = properties->getContextTreeNode()
266 .
getNode(properties->supervisorContextUID_)
269 if(hostname ==
"DEFAULT")
270 hostname =
"http://" + std::string(__ENV__(
"HOSTNAME"));
272 size_t i = hostname.find(
"//");
273 if(i != std::string::npos)
274 hostname = hostname.substr(i + 2);
280 std::string filename = std::string(__ENV__(
"OTSDAQ_LOG_DIR")) +
"/otsdaq_is_alive-" +
281 hostname +
"-" + portStr +
".dat";
282 FILE* fp = fopen(filename.c_str(),
"w");
285 __SS__ <<
"Failed to open the ots-is-alive file: " << filename << __E__;
288 fprintf(fp,
"%s %s %ld\n", hostname.c_str(), portStr, time(0));
291 __COUT__ <<
"Marked alive: " << filename << __E__;
295 void CorePropertySupervisorBase::indicateOtsDead(
298 char portStr[100] =
"0";
299 std::string hostname =
"wiz";
308 unsigned int port = properties->getContextTreeNode()
309 .
getNode(properties->supervisorContextUID_)
316 port = atoi(__ENV__(
"OTS_MAIN_PORT"));
318 sprintf(portStr,
"%u", port);
320 hostname = properties->getContextTreeNode()
321 .
getNode(properties->supervisorContextUID_)
324 if(hostname ==
"DEFAULT")
325 hostname =
"http://" + std::string(__ENV__(
"HOSTNAME"));
327 size_t i = hostname.find(
"//");
328 if(i != std::string::npos)
329 hostname = hostname.substr(i + 2);
335 std::string filename = std::string(__ENV__(
"OTSDAQ_LOG_DIR")) +
"/otsdaq_is_alive-" +
336 hostname +
"-" + portStr +
".dat";
337 FILE* fp = fopen(filename.c_str(),
"w");
340 __SS__ <<
"Failed to open the ots-is-alive file: " << filename << __E__;
345 __COUT__ <<
"Marked dead: " << filename << __E__;
350 XDAQ_CONST_CALL xdaq::ApplicationDescriptor*
353 if(allSupervisorInfo_.isMacroMakerMode())
356 return allSupervisorInfo_.
isWizardMode() ? allSupervisorInfo_.getWizardDescriptor()
357 : allSupervisorInfo_.getGatewayDescriptor();
374 CorePropertySupervisorBase::setSupervisorProperty(
375 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold,
377 CorePropertySupervisorBase::setSupervisorProperty(
378 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed,
"");
379 CorePropertySupervisorBase::setSupervisorProperty(
380 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed,
"");
382 CorePropertySupervisorBase::setSupervisorProperty(
383 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.CheckUserLockRequestTypes,
"");
384 CorePropertySupervisorBase::setSupervisorProperty(
385 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.RequireUserLockRequestTypes,
387 CorePropertySupervisorBase::setSupervisorProperty(
388 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AutomatedRequestTypes,
"");
389 CorePropertySupervisorBase::setSupervisorProperty(
390 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AllowNoLoginRequestTypes,
"");
391 CorePropertySupervisorBase::setSupervisorProperty(
392 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.RequireSecurityRequestTypes,
395 CorePropertySupervisorBase::setSupervisorProperty(
396 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NoXmlWhiteSpaceRequestTypes,
398 CorePropertySupervisorBase::setSupervisorProperty(
399 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NonXMLRequestTypes,
"");
422 const std::string& permissionsString,
423 std::map<std::string, WebUsers::permissionLevel_t>& permissionsMap)
425 permissionsMap.clear();
427 if(permissionsMap.size() == 0)
428 permissionsMap.emplace(std::pair<std::string, WebUsers::permissionLevel_t>(
429 WebUsers::DEFAULT_USER_GROUP,
430 atoi(permissionsString.c_str()))
453 std::map<std::string, WebUsers::permissionLevel_t>& permissionLevelsMap,
454 std::map<std::string, WebUsers::permissionLevel_t>& permissionThresholdsMap)
463 for(
const auto& permissionLevelGroupPair : permissionLevelsMap)
468 for(
const auto& permissionThresholdGroupPair : permissionThresholdsMap)
472 if(permissionLevelGroupPair.first == permissionThresholdGroupPair.first &&
473 permissionThresholdGroupPair.second &&
474 permissionLevelGroupPair.second >= permissionThresholdGroupPair.second)
487 void CorePropertySupervisorBase::checkSupervisorPropertySetup()
489 if(propertiesAreSetup_)
495 propertiesAreSetup_ =
true;
497 __SUP_COUTT__ <<
"Setting up supervisor specific property DEFAULTS for supervisor..."
506 <<
"Done setting up supervisor specific property DEFAULTS for supervisor."
510 __SUP_COUT__ <<
"Wiz mode detected. Skipping setup of supervisor properties for "
511 "supervisor of class '"
512 << supervisorClass_ <<
"'" << __E__;
513 else if(allSupervisorInfo_.isMacroMakerMode())
515 <<
"Maker Maker mode detected. Skipping setup of supervisor properties for "
516 "supervisor of class '"
517 << supervisorClass_ <<
"'" << __E__;
523 readOnly_ = getSupervisorProperty(
"ReadOnly",
"0") ==
"1" ? true :
false;
524 __SUP_COUTV__(readOnly_);
526 __SUP_COUTT__ <<
"Setting up supervisor specific FORCED properties for supervisor..."
530 <<
"Done setting up supervisor specific FORCED properties for supervisor."
534 getSupervisorProperty(
535 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold),
536 propertyStruct_.UserPermissionsThreshold);
538 propertyStruct_.UserGroupsAllowed.clear();
540 getSupervisorProperty(
541 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed),
542 propertyStruct_.UserGroupsAllowed);
544 propertyStruct_.UserGroupsDisallowed.clear();
546 getSupervisorProperty(
547 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed),
548 propertyStruct_.UserGroupsDisallowed);
550 auto nameIt = SUPERVISOR_PROPERTIES.allSetNames_.begin();
551 auto setIt = propertyStruct_.allSets_.begin();
552 while(nameIt != SUPERVISOR_PROPERTIES.allSetNames_.end() &&
553 setIt != propertyStruct_.allSets_.end())
562 __SUP_COUT__ <<
"Final supervisor property settings:" << __E__;
563 for(
auto& property : propertyMap_)
564 __SUP_COUT__ <<
"\t" <<
property.first <<
" = " <<
property.second << __E__;
573 if(supervisorContextUID_ ==
"" || supervisorApplicationUID_ ==
"")
575 __SUP_SS__ <<
"Empty supervisorContextUID_ or supervisorApplicationUID_."
579 return theConfigurationManager_->getSupervisorNode(supervisorContextUID_,
580 supervisorApplicationUID_);
585 <<
"XDAQ Supervisor could not access it's configuration node through "
586 "theConfigurationManager_ "
587 <<
"(Did you remember to initialize using CorePropertySupervisorBase::init()?)."
588 <<
" The supervisorContextUID_ = " << supervisorContextUID_
589 <<
". The supervisorApplicationUID = " << supervisorApplicationUID_ << __E__;
608 supervisorNode.getNode(
"LinkToPropertyTable").getChildren();
610 for(
auto& child : children)
612 if(!child.second.status())
615 auto propertyName = child.second.getNode(
"PropertyName").getValue();
616 setSupervisorProperty(
618 child.second.getNode(
"PropertyValue").getValue<std::string>());
623 __SUP_COUT__ <<
"No user supervisor property settings found in the configuration "
624 "tree, going with the defaults."
634 void CorePropertySupervisorBase::setSupervisorProperty(
const std::string& propertyName,
635 const std::string& propertyValue)
637 propertyMap_[propertyName] = propertyValue;
643 void CorePropertySupervisorBase::addSupervisorProperty(
const std::string& propertyName,
644 const std::string& propertyValue)
646 propertyMap_[propertyName] =
647 propertyValue +
" | " + getSupervisorProperty(propertyName);
655 std::string CorePropertySupervisorBase::getSupervisorProperty(
656 const std::string& propertyName)
659 checkSupervisorPropertySetup();
661 auto it = propertyMap_.find(propertyName);
662 if(it == propertyMap_.end())
664 __SUP_SS__ <<
"Could not find property named " << propertyName << __E__;
672 std::string CorePropertySupervisorBase::getSupervisorProperty(
673 const std::string& propertyName,
const std::string& defaultValue)
676 checkSupervisorPropertySetup();
678 auto it = propertyMap_.find(propertyName);
679 if(it == propertyMap_.end())
690 WebUsers::permissionLevel_t
692 const std::string& requestType)
695 checkSupervisorPropertySetup();
698 requestType, propertyStruct_.UserPermissionsThreshold);
706 checkSupervisorPropertySetup();
708 __SUP_COUT_TYPE__(TLVL_DEBUG + 20)
709 << __COUT_HDR__ <<
"userInfo.requestType_ " << userInfo.requestType_ << __E__;
711 __SUP_COUT_TYPE__(TLVL_DEBUG + 20)
712 << __COUT_HDR__ <<
"propertyStruct_.AutomatedRequestTypes "
715 userInfo.requestType_,
716 propertyStruct_.AutomatedRequestTypes);
720 __SUP_COUT_TYPE__(TLVL_DEBUG + 21)
721 << __COUT_HDR__ <<
"propertyStruct_.NonXMLRequestTypes "
724 userInfo.requestType_, propertyStruct_.NonXMLRequestTypes);
729 __SUP_COUT_TYPE__(TLVL_DEBUG + 21)
730 << __COUT_HDR__ <<
"propertyStruct_.NoXmlWhiteSpaceRequestTypes "
734 userInfo.requestType_, propertyStruct_.NoXmlWhiteSpaceRequestTypes);
739 __SUP_COUT_TYPE__(TLVL_DEBUG + 20)
740 << __COUT_HDR__ <<
"propertyStruct_.CheckUserLockRequestTypes "
744 userInfo.requestType_, propertyStruct_.CheckUserLockRequestTypes);
745 __SUP_COUT_TYPE__(TLVL_DEBUG + 20)
746 << __COUT_HDR__ <<
"propertyStruct_.RequireUserLockRequestTypes "
750 userInfo.requestType_, propertyStruct_.RequireUserLockRequestTypes);
751 if(userInfo.requireLock_ && userInfo.automatedCommand_)
753 __SUP_COUTT__ <<
"Overriding requireLock_ because request '"
754 << userInfo.requestType_ <<
"' marked as automatedCommand_"
756 userInfo.requireLock_ =
false;
759 __SUP_COUT_TYPE__(TLVL_DEBUG + 21)
760 << __COUT_HDR__ <<
"propertyStruct_.AllowNoLoginRequestTypes "
764 userInfo.requestType_, propertyStruct_.AllowNoLoginRequestTypes);
765 __SUP_COUT_TYPE__(TLVL_DEBUG + 21)
766 << __COUT_HDR__ <<
"propertyStruct_.RequireSecurityRequestTypes "
770 userInfo.requestType_, propertyStruct_.RequireSecurityRequestTypes);
772 userInfo.permissionsThreshold_ = -1;
775 userInfo.permissionsThreshold_ =
777 userInfo.requestType_);
779 catch(std::runtime_error& e)
781 if(!userInfo.automatedCommand_)
782 __SUP_COUT__ <<
"No explicit permissions threshold for request '"
783 << userInfo.requestType_
784 <<
"'... Defaulting to max threshold = "
785 << (
unsigned int)userInfo.permissionsThreshold_ << __E__;
788 __SUP_COUTVS__(20, userInfo.requestType_);
789 __SUP_COUTVS__(20, userInfo.checkLock_);
790 __SUP_COUTVS__(20, userInfo.requireLock_);
791 __SUP_COUTVS__(20, userInfo.allowNoUser_);
792 __SUP_COUTVS__(20, userInfo.automatedCommand_);
793 __SUP_COUTVS__(20, userInfo.automatedCommand_);
794 __SUP_COUTVS__(20, (
unsigned int)userInfo.permissionsThreshold_);
800 propertyStruct_.UserGroupsAllowed),
801 userInfo.groupsAllowed_);
803 catch(std::runtime_error& e)
805 userInfo.groupsAllowed_.clear();
806 if(!userInfo.automatedCommand_)
807 __SUP_COUT_TYPE__(TLVL_DEBUG + 25)
808 << __COUT_HDR__ <<
"No explicit groups allowed for request '"
809 << userInfo.requestType_
810 <<
"'... Defaulting to empty groups allowed. " << __E__;
816 userInfo.requestType_, propertyStruct_.UserGroupsDisallowed),
817 userInfo.groupsDisallowed_);
819 catch(std::runtime_error& e)
821 userInfo.groupsDisallowed_.clear();
823 if(!userInfo.automatedCommand_)
824 __SUP_COUT_TYPE__(TLVL_DEBUG + 25)
825 << __COUT_HDR__ <<
"No explicit groups disallowed for request '"
826 << userInfo.requestType_
827 <<
"'... Defaulting to empty groups disallowed. " << __E__;
835 xoap::MessageReference CorePropertySupervisorBase::TRACESupervisorRequest(
836 xoap::MessageReference message)
838 __SUP_COUT__ <<
"$$$$$$$$$$$$$$$$$" << __E__;
842 parameters.addParameter(
"Request");
844 __SUP_COUT__ <<
"Received TRACE message: " << SOAPUtilities::translate(message)
847 SOAPUtilities::receive(message, parameters);
848 std::string request = parameters.getValue(
"Request");
850 __SUP_COUT__ <<
"request: " << request << __E__;
859 if(request ==
"GetTraceLevels")
861 retParameters.addParameter(
"TRACEList", getTraceLevels());
862 retParameters.addParameter(
"TRACEHostnameList", traceReturnHostString_);
863 return SOAPUtilities::makeSOAPMessageReference(
864 supervisorClassNoNamespace_ +
"Response", retParameters);
866 else if(request ==
"SetTraceLevels")
868 parameters.addParameter(
"IndividualValues");
869 parameters.addParameter(
"Host");
870 parameters.addParameter(
"SetMode");
871 parameters.addParameter(
"Labels");
872 parameters.addParameter(
"SetValueMSB");
873 parameters.addParameter(
"SetValueLSB");
874 SOAPUtilities::receive(message, parameters);
876 int individualValues = parameters.getValueAsInt(
"IndividualValues");
877 std::string host = parameters.getValue(
"Host");
878 std::string setMode = parameters.getValue(
"SetMode");
879 std::string labelsStr = parameters.getValue(
"Labels");
880 int setValueMSB = parameters.getValueAsInt(
"SetValueMSB");
881 int setValueLSB = parameters.getValueAsInt(
"SetValueLSB");
882 __SUP_COUTV__(individualValues);
884 __SUP_COUTV__(setMode);
885 __SUP_COUTV__(setValueMSB);
886 __SUP_COUTV__(setValueLSB);
887 __SUP_COUTV__(labelsStr);
890 retParameters.addParameter(
891 "TRACEList", setIndividualTraceLevels(host, setMode, labelsStr));
893 retParameters.addParameter(
895 setTraceLevels(host, setMode, labelsStr, setValueMSB, setValueLSB));
896 return SOAPUtilities::makeSOAPMessageReference(
897 supervisorClassNoNamespace_ +
"Response", retParameters);
899 else if(request ==
"GetTriggerStatus")
901 retParameters.addParameter(
"TRACETriggerStatus", getTraceTriggerStatus());
902 return SOAPUtilities::makeSOAPMessageReference(
903 supervisorClassNoNamespace_ +
"Response", retParameters);
905 else if(request ==
"SetTriggerEnable")
907 parameters.addParameter(
"Host");
908 parameters.addParameter(
"EntriesAfterTrigger");
909 SOAPUtilities::receive(message, parameters);
911 std::string host = parameters.getValue(
"Host");
912 int entriesAfterTrigger = parameters.getValueAsInt(
"EntriesAfterTrigger");
914 __SUP_COUTV__(entriesAfterTrigger);
915 retParameters.addParameter(
"TRACETriggerStatus",
916 setTraceTriggerEnable(host, entriesAfterTrigger));
917 return SOAPUtilities::makeSOAPMessageReference(
918 supervisorClassNoNamespace_ +
"Response", retParameters);
920 else if(request ==
"ResetTRACE")
922 parameters.addParameter(
"Host");
923 SOAPUtilities::receive(message, parameters);
925 std::string host = parameters.getValue(
"Host");
927 retParameters.addParameter(
"TRACETriggerStatus", resetTRACE(host));
928 return SOAPUtilities::makeSOAPMessageReference(
929 supervisorClassNoNamespace_ +
"Response", retParameters);
931 else if(request ==
"EnableTRACE")
933 parameters.addParameter(
"Host");
934 parameters.addParameter(
"SetEnable");
935 SOAPUtilities::receive(message, parameters);
937 std::string host = parameters.getValue(
"Host");
938 bool enable = parameters.getValueAsInt(
"SetEnable") ? true :
false;
940 __SUP_COUTV__(enable);
942 retParameters.addParameter(
"TRACETriggerStatus", enableTRACE(host, enable));
943 return SOAPUtilities::makeSOAPMessageReference(
944 supervisorClassNoNamespace_ +
"Response", retParameters);
946 else if(request ==
"GetSnapshot")
948 parameters.addParameter(
"Host");
949 parameters.addParameter(
"FilterForCSV");
950 parameters.addParameter(
"FilterOutCSV");
951 SOAPUtilities::receive(message, parameters);
953 std::string host = parameters.getValue(
"Host");
954 std::string filterFor = parameters.getValue(
"FilterForCSV");
955 std::string filterOut = parameters.getValue(
"FilterOutCSV");
957 __SUP_COUTV__(filterFor);
958 __SUP_COUTV__(filterOut);
959 retParameters.addParameter(
"TRACESnapshot",
960 getTraceSnapshot(host, filterFor, filterOut));
961 retParameters.addParameter(
"TRACETriggerStatus", getTraceTriggerStatus());
962 return SOAPUtilities::makeSOAPMessageReference(
963 supervisorClassNoNamespace_ +
"Response", retParameters);
967 __SUP_SS__ <<
"Unrecognized request received! '" << request <<
"'" << __E__;
971 catch(
const std::runtime_error& e)
973 __SUP_SS__ <<
"Error occurred handling request: " << e.what() << __E__;
974 __SUP_COUT_ERR__ << ss.str();
975 retParameters.addParameter(
"Error", ss.str());
979 __SUP_SS__ <<
"Error occurred handling request." << __E__;
984 catch(
const std::exception& e)
986 ss <<
"Exception message: " << e.what();
991 __SUP_COUT_ERR__ << ss.str();
992 retParameters.addParameter(
"Error", ss.str());
995 return SOAPUtilities::makeSOAPMessageReference(
"TRACEFault", retParameters);
1000 const std::string& CorePropertySupervisorBase::getTraceLevels()
1002 __SUP_COUT__ <<
"getTraceLevels()" << __E__;
1004 traceReturnString_ =
"";
1005 traceReturnHostString_ =
"";
1009 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1014 ITRACEController::HostTraceLevelMap traceHostMap =
1017 __SUP_COUT__ <<
"TRACE controller returned " << traceHostMap.size() <<
" host key(s)."
1020 for(
const auto& traceMap : traceHostMap)
1022 __SUP_COUT__ <<
"host key '" << traceMap.first <<
"' with "
1023 << traceMap.second.size() <<
" label(s)." << __E__;
1032 traceReturnHostString_ +=
";" + traceMap.first;
1033 traceReturnString_ +=
";" + traceMap.first;
1035 for(
const auto& traceMask : traceMap.second)
1040 traceReturnString_ +=
1041 "," + traceMask.first +
1042 ",M:" + std::to_string((
unsigned int)(traceMask.second.M >> 32)) +
":" +
1043 std::to_string((
unsigned int)traceMask.second.M) +
1044 ":S:" + std::to_string((
unsigned int)(traceMask.second.S >> 32)) +
":" +
1045 std::to_string((
unsigned int)traceMask.second.S) +
1046 ":T:" + std::to_string((
unsigned int)(traceMask.second.T >> 32)) +
":" +
1047 std::to_string((
unsigned int)traceMask.second.T);
1050 __SUP_COUTTV__(traceReturnString_);
1051 __SUP_COUTV__(traceReturnHostString_);
1052 __SUP_COUT__ <<
"end getTraceLevels()" << __E__;
1053 return traceReturnString_;
1057 const std::string& CorePropertySupervisorBase::setTraceLevels(
1058 std::string
const& host,
1059 std::string
const& mode,
1060 std::string
const& labelsStr,
1061 uint32_t setValueMSB,
1062 uint32_t setValueLSB)
1064 __SUP_COUT__ <<
"setTraceLevels()" << __E__;
1068 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1073 bool allMode = mode ==
"ALL";
1074 if(allMode || mode ==
"FAST")
1075 setMask.M = ((uint64_t(setValueMSB)) << 32) | (uint64_t(uint32_t(setValueLSB)));
1076 if(allMode || mode ==
"SLOW")
1077 setMask.S = ((uint64_t(setValueMSB)) << 32) | (uint64_t(uint32_t(setValueLSB)));
1078 if(allMode || mode ==
"TRIGGER")
1079 setMask.T = ((uint64_t(setValueMSB)) << 32) | (uint64_t(uint32_t(setValueLSB)));
1081 std::vector<std::string > labels;
1083 for(
const auto& label : labels)
1085 __SUP_COUTV__(label);
1089 __SUP_COUT__ <<
"end setTraceLevels()" << __E__;
1090 return getTraceLevels();
1094 const std::string& CorePropertySupervisorBase::setIndividualTraceLevels(
1095 std::string
const& host, std::string
const& mode, std::string
const& labelValuesStr)
1097 __SUP_COUT__ <<
"setIndividualTraceLevels()" << __E__;
1101 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1106 bool allMode = mode ==
"ALL";
1107 bool fastMode = mode ==
"FAST";
1108 bool slowMode = mode ==
"SLOW";
1109 bool triggerMode = mode ==
"TRIGGER";
1111 std::vector<std::string > labelValues;
1113 for(
unsigned int i = 0; i < labelValues.size(); i += 3 )
1115 __SUP_COUT__ <<
"Label = " << labelValues[i] <<
" msb/lsb " << labelValues[i + 1]
1116 <<
"/" << labelValues[i + 2] << __E__;
1118 if(allMode || fastMode)
1119 setMask.M = ((uint64_t(atoi(labelValues[i + 1].c_str()))) << 32) |
1120 (uint64_t(uint32_t(atoi(labelValues[i + 2].c_str()))));
1121 if(allMode || slowMode)
1122 setMask.S = ((uint64_t(atoi(labelValues[i + 1].c_str()))) << 32) |
1123 (uint64_t(uint32_t(atoi(labelValues[i + 2].c_str()))));
1124 if(allMode || triggerMode)
1125 setMask.T = ((uint64_t(atoi(labelValues[i + 1].c_str()))) << 32) |
1126 (uint64_t(uint32_t(atoi(labelValues[i + 2].c_str()))));
1131 __SUP_COUT__ <<
"end setIndividualTraceLevels()" << __E__;
1132 return getTraceLevels();
1136 const std::string& CorePropertySupervisorBase::getTraceTriggerStatus()
1138 __SUP_COUT__ <<
"getTraceTriggerStatus()" << __E__;
1140 traceReturnString_ =
"";
1144 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1149 traceReturnString_ +=
1152 __SUP_COUT__ <<
"end getTraceTriggerStatus() " << traceReturnString_ << __E__;
1153 return traceReturnString_;
1157 const std::string& CorePropertySupervisorBase::setTraceTriggerEnable(
1158 std::string
const& host,
size_t entriesAfterTrigger)
1160 __SUP_COUT__ <<
"setTraceTriggerEnable() " << host << __E__;
1164 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1168 __SUP_COUT__ <<
"end setTraceTriggerEnable()" << __E__;
1169 return getTraceTriggerStatus();
1173 const std::string& CorePropertySupervisorBase::resetTRACE(std::string
const& host)
1175 __SUP_COUT__ <<
"resetTRACE() " << host << __E__;
1179 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1184 __SUP_COUT__ <<
"end resetTRACE()" << __E__;
1185 return getTraceTriggerStatus();
1189 const std::string& CorePropertySupervisorBase::enableTRACE(std::string
const& host,
1192 __SUP_COUT__ <<
"enableTRACE() " << host <<
" " << enable << __E__;
1196 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1200 __SUP_COUT__ <<
"end enableTRACE()" << __E__;
1201 return getTraceTriggerStatus();
1205 const std::string& CorePropertySupervisorBase::getTraceSnapshot(
1206 std::string
const& host, std::string
const& filterFor, std::string
const& filterOut)
1208 __SUP_COUT__ <<
"getTraceSnapshot()" << host << __E__;
1210 traceReturnString_ =
"";
1214 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1221 const size_t MAX_SZ = 200000;
1222 if(traceReturnString_.size() > MAX_SZ)
1224 __SUP_COUT__ <<
"Truncating from " << traceReturnString_.size() <<
" to "
1226 traceReturnString_.resize(MAX_SZ);
1227 traceReturnString_ +=
"\n...TRUNCATED";
1229 else if(traceReturnString_.size() == 0)
1231 __SUP_COUT__ <<
"Empty snapshot" << __E__;
1232 traceReturnString_ =
"Empty TRACE snapshot.";
1234 __SUP_COUT__ <<
"end getTraceSnapshot() Bytes = " << traceReturnString_.size()
1236 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 ~