1 #include "otsdaq/CoreSupervisors/CorePropertySupervisorBase.h"
2 #include "otsdaq/MessageFacility/ITRACEController.h"
3 #include "otsdaq/MessageFacility/TRACEController.h"
5 #include <sys/statvfs.h>
10 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES =
15 CorePropertySupervisorBase::CorePropertySupervisorBase(xdaq::Application* application)
16 : theConfigurationManager_(0)
17 , supervisorClass_(application->getApplicationDescriptor()->getClassName())
18 , supervisorClassNoNamespace_(
19 supervisorClass_.substr(supervisorClass_.find_last_of(
":") + 1, supervisorClass_.length() - supervisorClass_.find_last_of(
":")))
20 , supervisorContextUID_(
"UNINITIALIZED_supervisorContextUID")
21 , supervisorApplicationUID_(
"UNINITIALIZED_supervisorApplicationUID")
22 , supervisorConfigurationPath_(
"UNINITIALIZED_supervisorConfigurationPath")
23 , propertiesAreSetup_(false)
24 , theTRACEController_(nullptr)
25 , OTSDAQ_LOG_DIR(__ENV__(
"OTSDAQ_LOG_DIR"))
26 , OTSDAQ_DATA_DIR(__ENV__(
"OTSDAQ_DATA"))
32 __SUP_COUT_INFO__ <<
"Supervisor URL = " << application->getApplicationContext()->getContextDescriptor()->getURL() << __E__;
33 __SUP_COUT_INFO__ <<
"Supervisor LID = " << application->getApplicationDescriptor()->getLocalId() << __E__;
34 __SUP_COUT_INFO__ <<
"Supervisor Class = " << supervisorClass_ << __E__;
35 __SUP_COUTV__(supervisorClassNoNamespace_);
38 allSupervisorInfo_.init(application->getApplicationContext());
42 StringMacros::systemVariables_[
"ActiveStateMachine"][
"name"] = StringMacros::TBD;
43 StringMacros::systemVariables_[
"ActiveStateMachine"][
"windowName"] = StringMacros::TBD;
44 StringMacros::systemVariables_[
"ActiveStateMachine"][
"runAlias"] = StringMacros::TBD;
46 __SUP_COUTV__(StringMacros::mapToString(StringMacros::systemVariables_));
48 if(allSupervisorInfo_.isMacroMakerMode())
51 __SUP_COUT__ <<
"Macro Maker mode detected. So skipping configuration location work for "
52 "supervisor of class '"
53 << supervisorClass_ <<
"'" << __E__;
55 supervisorContextUID_ =
"MacroMakerFEContext";
56 supervisorApplicationUID_ =
"MacroMakerFESupervisor";
57 supervisorConfigurationPath_ = CorePropertySupervisorBase::supervisorContextUID_ +
"/LinkToApplicationTable/" +
58 CorePropertySupervisorBase::supervisorApplicationUID_ +
"/LinkToSupervisorTable";
60 __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
61 __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
62 __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
69 else if(allSupervisorInfo_.isWizardMode())
71 __SUP_COUT__ <<
"Wiz mode detected. So skipping configuration location work for "
72 "supervisor of class '"
73 << supervisorClass_ <<
"'" << __E__;
74 supervisorContextUID_ =
"NO CONTEXT ID IN WIZ MODE";
75 supervisorApplicationUID_ = std::to_string(application->getApplicationDescriptor()->getLocalId());
76 supervisorConfigurationPath_ =
"NO APP PATH IN WIZ MODE";
78 __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
79 __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
80 __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
85 __SUP_COUT__ <<
"Getting configuration specific info for supervisor '" << (allSupervisorInfo_.getSupervisorInfo(application).getName()) <<
"' of class "
86 << supervisorClass_ <<
"." << __E__;
92 __SUP_COUTV__(application->getApplicationContext()->getContextDescriptor()->getURL());
94 CorePropertySupervisorBase::supervisorContextUID_ =
95 theConfigurationManager_->__GET_CONFIG__(
XDAQContextTable)->getContextUID(application->getApplicationContext()->getContextDescriptor()->getURL());
96 if(CorePropertySupervisorBase::supervisorContextUID_ ==
"")
98 __SUP_SS__ <<
"Illegal empty Supervisor Context UID identified - could not find a valid UID based on Supervisor's provided URL (" <<
99 application->getApplicationContext()->getContextDescriptor()->getURL() <<
"). Please try again or contact admins." << __E__;
105 __SUP_COUT_ERR__ <<
"XDAQ Supervisor could not access it's configuration through "
106 "the Configuration Manager."
107 <<
". The getApplicationContext()->getContextDescriptor()->getURL() = "
108 << application->getApplicationContext()->getContextDescriptor()->getURL() << __E__;
114 __SUP_COUTV__(application->getApplicationDescriptor()->getLocalId());
115 CorePropertySupervisorBase::supervisorApplicationUID_ = theConfigurationManager_->__GET_CONFIG__(
XDAQContextTable)
116 ->getApplicationUID(application->getApplicationContext()->getContextDescriptor()->getURL(),
117 application->getApplicationDescriptor()->getLocalId());
118 if(CorePropertySupervisorBase::supervisorApplicationUID_ ==
"")
120 __SUP_SS__ <<
"Illegal empty Supervisor Application UID identified. Please try again or contact admins." << __E__;
126 __SUP_COUT_ERR__ <<
"XDAQ Supervisor could not access it's configuration through "
127 "the Configuration Manager."
128 <<
" The supervisorContextUID_ = " << supervisorContextUID_ <<
". The supervisorApplicationUID = " << supervisorApplicationUID_
133 CorePropertySupervisorBase::supervisorConfigurationPath_ =
"/" + CorePropertySupervisorBase::supervisorContextUID_ +
"/LinkToApplicationTable/" +
134 CorePropertySupervisorBase::supervisorApplicationUID_ +
"/LinkToSupervisorTable";
136 __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
137 __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
138 __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
152 CorePropertySupervisorBase::indicateOtsAlive(
this);
154 theConfigurationManager_->setOwnerContext(CorePropertySupervisorBase::supervisorContextUID_);
155 theConfigurationManager_->setOwnerApp(CorePropertySupervisorBase::supervisorApplicationUID_);
157 CorePropertySupervisorBase::isFirstAppInContext_ = theConfigurationManager_->isOwnerFirstAppInContext();
162 CorePropertySupervisorBase::~CorePropertySupervisorBase(
void)
164 __SUP_COUT__ <<
"Destructor." << __E__;
166 CorePropertySupervisorBase::indicateOtsDead(
this);
168 if(theConfigurationManager_)
169 delete theConfigurationManager_;
173 __SUP_COUT__ <<
"Destroying TRACE Controller..." << __E__;
177 __SUP_COUT__ <<
"Destructed." << __E__;
183 void CorePropertySupervisorBase::getAvailableDiskSpace()
185 if(!isFirstAppInContext_)
189 if(t - lastDiskSpaceCheckTime_ <= 10)
192 struct statvfs logStat;
193 if(statvfs((OTSDAQ_LOG_DIR +
"/").c_str(), &logStat) != 0)
195 __SUP_SS__ <<
"Disk space retrieval failed for log directory: " << OTSDAQ_LOG_DIR
199 uint64_t availableLogSpaceKB =
200 (uint64_t)logStat.f_bavail * logStat.f_frsize / 1024;
201 __SUP_COUTTV__(availableLogSpaceKB);
203 struct statvfs dataStat;
204 if(statvfs((OTSDAQ_DATA_DIR +
"/").c_str(), &dataStat) != 0)
206 __SUP_SS__ <<
"Disk space retrieval failed for data directory: "
207 << OTSDAQ_DATA_DIR << __E__;
210 uint64_t availableDataSpaceKB =
211 (uint64_t)dataStat.f_bavail * dataStat.f_frsize / 1024;
212 __SUP_COUTTV__(availableDataSpaceKB);
214 availableLogSpaceKB_ = availableLogSpaceKB;
215 availableDataSpaceKB_ = availableDataSpaceKB;
217 lastDiskSpaceCheckTime_ = time(0);
221 void CorePropertySupervisorBase::indicateOtsAlive(
224 char portStr[100] =
"0";
225 std::string hostname =
"wiz";
234 unsigned int port = properties->getContextTreeNode()
235 .
getNode(properties->supervisorContextUID_)
242 port = atoi(__ENV__(
"OTS_MAIN_PORT"));
244 sprintf(portStr,
"%u", port);
246 hostname = properties->getContextTreeNode()
247 .
getNode(properties->supervisorContextUID_)
250 if(hostname ==
"DEFAULT")
251 hostname =
"http://" + std::string(__ENV__(
"HOSTNAME"));
253 size_t i = hostname.find(
"//");
254 if(i != std::string::npos)
255 hostname = hostname.substr(i + 2);
261 std::string filename = std::string(__ENV__(
"OTSDAQ_LOG_DIR")) +
"/otsdaq_is_alive-" +
262 hostname +
"-" + portStr +
".dat";
263 FILE* fp = fopen(filename.c_str(),
"w");
266 __SS__ <<
"Failed to open the ots-is-alive file: " << filename << __E__;
269 fprintf(fp,
"%s %s %ld\n", hostname.c_str(), portStr, time(0));
272 __COUT__ <<
"Marked alive: " << filename << __E__;
276 void CorePropertySupervisorBase::indicateOtsDead(
279 char portStr[100] =
"0";
280 std::string hostname =
"wiz";
289 unsigned int port = properties->getContextTreeNode()
290 .
getNode(properties->supervisorContextUID_)
297 port = atoi(__ENV__(
"OTS_MAIN_PORT"));
299 sprintf(portStr,
"%u", port);
301 hostname = properties->getContextTreeNode()
302 .
getNode(properties->supervisorContextUID_)
305 if(hostname ==
"DEFAULT")
306 hostname =
"http://" + std::string(__ENV__(
"HOSTNAME"));
308 size_t i = hostname.find(
"//");
309 if(i != std::string::npos)
310 hostname = hostname.substr(i + 2);
316 std::string filename = std::string(__ENV__(
"OTSDAQ_LOG_DIR")) +
"/otsdaq_is_alive-" +
317 hostname +
"-" + portStr +
".dat";
318 FILE* fp = fopen(filename.c_str(),
"w");
321 __SS__ <<
"Failed to open the ots-is-alive file: " << filename << __E__;
326 __COUT__ <<
"Marked dead: " << filename << __E__;
331 XDAQ_CONST_CALL xdaq::ApplicationDescriptor*
334 if(allSupervisorInfo_.isMacroMakerMode())
337 return allSupervisorInfo_.
isWizardMode() ? allSupervisorInfo_.getWizardDescriptor()
338 : allSupervisorInfo_.getGatewayDescriptor();
355 CorePropertySupervisorBase::setSupervisorProperty(
356 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold,
358 CorePropertySupervisorBase::setSupervisorProperty(
359 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed,
"");
360 CorePropertySupervisorBase::setSupervisorProperty(
361 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed,
"");
363 CorePropertySupervisorBase::setSupervisorProperty(
364 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.CheckUserLockRequestTypes,
"");
365 CorePropertySupervisorBase::setSupervisorProperty(
366 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.RequireUserLockRequestTypes,
368 CorePropertySupervisorBase::setSupervisorProperty(
369 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AutomatedRequestTypes,
"");
370 CorePropertySupervisorBase::setSupervisorProperty(
371 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AllowNoLoginRequestTypes,
"");
372 CorePropertySupervisorBase::setSupervisorProperty(
373 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.RequireSecurityRequestTypes,
376 CorePropertySupervisorBase::setSupervisorProperty(
377 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NoXmlWhiteSpaceRequestTypes,
379 CorePropertySupervisorBase::setSupervisorProperty(
380 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NonXMLRequestTypes,
"");
403 const std::string& permissionsString,
404 std::map<std::string, WebUsers::permissionLevel_t>& permissionsMap)
406 permissionsMap.clear();
408 if(permissionsMap.size() == 0)
409 permissionsMap.emplace(std::pair<std::string, WebUsers::permissionLevel_t>(
410 WebUsers::DEFAULT_USER_GROUP,
411 atoi(permissionsString.c_str()))
434 std::map<std::string, WebUsers::permissionLevel_t>& permissionLevelsMap,
435 std::map<std::string, WebUsers::permissionLevel_t>& permissionThresholdsMap)
444 for(
const auto& permissionLevelGroupPair : permissionLevelsMap)
449 for(
const auto& permissionThresholdGroupPair : permissionThresholdsMap)
453 if(permissionLevelGroupPair.first == permissionThresholdGroupPair.first &&
454 permissionThresholdGroupPair.second &&
455 permissionLevelGroupPair.second >= permissionThresholdGroupPair.second)
468 void CorePropertySupervisorBase::checkSupervisorPropertySetup()
470 if(propertiesAreSetup_)
476 propertiesAreSetup_ =
true;
478 __SUP_COUTT__ <<
"Setting up supervisor specific property DEFAULTS for supervisor..."
487 <<
"Done setting up supervisor specific property DEFAULTS for supervisor."
491 __SUP_COUT__ <<
"Wiz mode detected. Skipping setup of supervisor properties for "
492 "supervisor of class '"
493 << supervisorClass_ <<
"'" << __E__;
494 else if(allSupervisorInfo_.isMacroMakerMode())
496 <<
"Maker Maker mode detected. Skipping setup of supervisor properties for "
497 "supervisor of class '"
498 << supervisorClass_ <<
"'" << __E__;
504 readOnly_ = getSupervisorProperty(
"ReadOnly",
"0") ==
"1" ? true :
false;
505 __SUP_COUTV__(readOnly_);
507 __SUP_COUTT__ <<
"Setting up supervisor specific FORCED properties for supervisor..."
511 <<
"Done setting up supervisor specific FORCED properties for supervisor."
515 getSupervisorProperty(
516 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold),
517 propertyStruct_.UserPermissionsThreshold);
519 propertyStruct_.UserGroupsAllowed.clear();
521 getSupervisorProperty(
522 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed),
523 propertyStruct_.UserGroupsAllowed);
525 propertyStruct_.UserGroupsDisallowed.clear();
527 getSupervisorProperty(
528 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed),
529 propertyStruct_.UserGroupsDisallowed);
531 auto nameIt = SUPERVISOR_PROPERTIES.allSetNames_.begin();
532 auto setIt = propertyStruct_.allSets_.begin();
533 while(nameIt != SUPERVISOR_PROPERTIES.allSetNames_.end() &&
534 setIt != propertyStruct_.allSets_.end())
543 __SUP_COUT__ <<
"Final supervisor property settings:" << __E__;
544 for(
auto& property : propertyMap_)
545 __SUP_COUT__ <<
"\t" <<
property.first <<
" = " <<
property.second << __E__;
554 if(supervisorContextUID_ ==
"" || supervisorApplicationUID_ ==
"")
556 __SUP_SS__ <<
"Empty supervisorContextUID_ or supervisorApplicationUID_."
560 return theConfigurationManager_->getSupervisorNode(supervisorContextUID_,
561 supervisorApplicationUID_);
566 <<
"XDAQ Supervisor could not access it's configuration node through "
567 "theConfigurationManager_ "
568 <<
"(Did you remember to initialize using CorePropertySupervisorBase::init()?)."
569 <<
" The supervisorContextUID_ = " << supervisorContextUID_
570 <<
". The supervisorApplicationUID = " << supervisorApplicationUID_ << __E__;
589 supervisorNode.getNode(
"LinkToPropertyTable").getChildren();
591 for(
auto& child : children)
593 if(!child.second.status())
596 auto propertyName = child.second.getNode(
"PropertyName").getValue();
597 setSupervisorProperty(
599 child.second.getNode(
"PropertyValue").getValue<std::string>());
604 __SUP_COUT__ <<
"No user supervisor property settings found in the configuration "
605 "tree, going with the defaults."
615 void CorePropertySupervisorBase::setSupervisorProperty(
const std::string& propertyName,
616 const std::string& propertyValue)
618 propertyMap_[propertyName] = propertyValue;
624 void CorePropertySupervisorBase::addSupervisorProperty(
const std::string& propertyName,
625 const std::string& propertyValue)
627 propertyMap_[propertyName] =
628 propertyValue +
" | " + getSupervisorProperty(propertyName);
636 std::string CorePropertySupervisorBase::getSupervisorProperty(
637 const std::string& propertyName)
640 checkSupervisorPropertySetup();
642 auto it = propertyMap_.find(propertyName);
643 if(it == propertyMap_.end())
645 __SUP_SS__ <<
"Could not find property named " << propertyName << __E__;
653 std::string CorePropertySupervisorBase::getSupervisorProperty(
654 const std::string& propertyName,
const std::string& defaultValue)
657 checkSupervisorPropertySetup();
659 auto it = propertyMap_.find(propertyName);
660 if(it == propertyMap_.end())
671 WebUsers::permissionLevel_t
673 const std::string& requestType)
676 checkSupervisorPropertySetup();
679 requestType, propertyStruct_.UserPermissionsThreshold);
687 checkSupervisorPropertySetup();
689 __SUP_COUT_TYPE__(TLVL_DEBUG + 20)
690 << __COUT_HDR__ <<
"userInfo.requestType_ " << userInfo.requestType_ << __E__;
692 __SUP_COUT_TYPE__(TLVL_DEBUG + 20)
693 << __COUT_HDR__ <<
"propertyStruct_.AutomatedRequestTypes "
696 userInfo.requestType_,
697 propertyStruct_.AutomatedRequestTypes);
701 __SUP_COUT_TYPE__(TLVL_DEBUG + 21)
702 << __COUT_HDR__ <<
"propertyStruct_.NonXMLRequestTypes "
705 userInfo.requestType_, propertyStruct_.NonXMLRequestTypes);
710 __SUP_COUT_TYPE__(TLVL_DEBUG + 21)
711 << __COUT_HDR__ <<
"propertyStruct_.NoXmlWhiteSpaceRequestTypes "
715 userInfo.requestType_, propertyStruct_.NoXmlWhiteSpaceRequestTypes);
720 __SUP_COUT_TYPE__(TLVL_DEBUG + 20)
721 << __COUT_HDR__ <<
"propertyStruct_.CheckUserLockRequestTypes "
725 userInfo.requestType_, propertyStruct_.CheckUserLockRequestTypes);
726 __SUP_COUT_TYPE__(TLVL_DEBUG + 20)
727 << __COUT_HDR__ <<
"propertyStruct_.RequireUserLockRequestTypes "
731 userInfo.requestType_, propertyStruct_.RequireUserLockRequestTypes);
732 if(userInfo.requireLock_ && userInfo.automatedCommand_)
734 __SUP_COUTT__ <<
"Overriding requireLock_ because request '"
735 << userInfo.requestType_ <<
"' marked as automatedCommand_"
737 userInfo.requireLock_ =
false;
740 __SUP_COUT_TYPE__(TLVL_DEBUG + 21)
741 << __COUT_HDR__ <<
"propertyStruct_.AllowNoLoginRequestTypes "
745 userInfo.requestType_, propertyStruct_.AllowNoLoginRequestTypes);
746 __SUP_COUT_TYPE__(TLVL_DEBUG + 21)
747 << __COUT_HDR__ <<
"propertyStruct_.RequireSecurityRequestTypes "
751 userInfo.requestType_, propertyStruct_.RequireSecurityRequestTypes);
753 userInfo.permissionsThreshold_ = -1;
756 userInfo.permissionsThreshold_ =
758 userInfo.requestType_);
760 catch(std::runtime_error& e)
762 if(!userInfo.automatedCommand_)
763 __SUP_COUT__ <<
"No explicit permissions threshold for request '"
764 << userInfo.requestType_
765 <<
"'... Defaulting to max threshold = "
766 << (
unsigned int)userInfo.permissionsThreshold_ << __E__;
769 __SUP_COUTVS__(20, userInfo.requestType_);
770 __SUP_COUTVS__(20, userInfo.checkLock_);
771 __SUP_COUTVS__(20, userInfo.requireLock_);
772 __SUP_COUTVS__(20, userInfo.allowNoUser_);
773 __SUP_COUTVS__(20, userInfo.automatedCommand_);
774 __SUP_COUTVS__(20, userInfo.automatedCommand_);
775 __SUP_COUTVS__(20, (
unsigned int)userInfo.permissionsThreshold_);
781 propertyStruct_.UserGroupsAllowed),
782 userInfo.groupsAllowed_);
784 catch(std::runtime_error& e)
786 userInfo.groupsAllowed_.clear();
787 if(!userInfo.automatedCommand_)
788 __SUP_COUT_TYPE__(TLVL_DEBUG + 25)
789 << __COUT_HDR__ <<
"No explicit groups allowed for request '"
790 << userInfo.requestType_
791 <<
"'... Defaulting to empty groups allowed. " << __E__;
797 userInfo.requestType_, propertyStruct_.UserGroupsDisallowed),
798 userInfo.groupsDisallowed_);
800 catch(std::runtime_error& e)
802 userInfo.groupsDisallowed_.clear();
804 if(!userInfo.automatedCommand_)
805 __SUP_COUT_TYPE__(TLVL_DEBUG + 25)
806 << __COUT_HDR__ <<
"No explicit groups disallowed for request '"
807 << userInfo.requestType_
808 <<
"'... Defaulting to empty groups disallowed. " << __E__;
816 xoap::MessageReference CorePropertySupervisorBase::TRACESupervisorRequest(
817 xoap::MessageReference message)
819 __SUP_COUT__ <<
"$$$$$$$$$$$$$$$$$" << __E__;
823 parameters.addParameter(
"Request");
825 __SUP_COUT__ <<
"Received TRACE message: " << SOAPUtilities::translate(message)
828 SOAPUtilities::receive(message, parameters);
829 std::string request = parameters.getValue(
"Request");
831 __SUP_COUT__ <<
"request: " << request << __E__;
840 if(request ==
"GetTraceLevels")
842 retParameters.addParameter(
"TRACEList", getTraceLevels());
843 retParameters.addParameter(
"TRACEHostnameList", traceReturnHostString_);
844 return SOAPUtilities::makeSOAPMessageReference(
845 supervisorClassNoNamespace_ +
"Response", retParameters);
847 else if(request ==
"SetTraceLevels")
849 parameters.addParameter(
"IndividualValues");
850 parameters.addParameter(
"Host");
851 parameters.addParameter(
"SetMode");
852 parameters.addParameter(
"Labels");
853 parameters.addParameter(
"SetValueMSB");
854 parameters.addParameter(
"SetValueLSB");
855 SOAPUtilities::receive(message, parameters);
857 int individualValues = parameters.getValueAsInt(
"IndividualValues");
858 std::string host = parameters.getValue(
"Host");
859 std::string setMode = parameters.getValue(
"SetMode");
860 std::string labelsStr = parameters.getValue(
"Labels");
861 int setValueMSB = parameters.getValueAsInt(
"SetValueMSB");
862 int setValueLSB = parameters.getValueAsInt(
"SetValueLSB");
863 __SUP_COUTV__(individualValues);
865 __SUP_COUTV__(setMode);
866 __SUP_COUTV__(setValueMSB);
867 __SUP_COUTV__(setValueLSB);
868 __SUP_COUTV__(labelsStr);
871 retParameters.addParameter(
872 "TRACEList", setIndividualTraceLevels(host, setMode, labelsStr));
874 retParameters.addParameter(
876 setTraceLevels(host, setMode, labelsStr, setValueMSB, setValueLSB));
877 return SOAPUtilities::makeSOAPMessageReference(
878 supervisorClassNoNamespace_ +
"Response", retParameters);
880 else if(request ==
"GetTriggerStatus")
882 retParameters.addParameter(
"TRACETriggerStatus", getTraceTriggerStatus());
883 return SOAPUtilities::makeSOAPMessageReference(
884 supervisorClassNoNamespace_ +
"Response", retParameters);
886 else if(request ==
"SetTriggerEnable")
888 parameters.addParameter(
"Host");
889 parameters.addParameter(
"EntriesAfterTrigger");
890 SOAPUtilities::receive(message, parameters);
892 std::string host = parameters.getValue(
"Host");
893 int entriesAfterTrigger = parameters.getValueAsInt(
"EntriesAfterTrigger");
895 __SUP_COUTV__(entriesAfterTrigger);
896 retParameters.addParameter(
"TRACETriggerStatus",
897 setTraceTriggerEnable(host, entriesAfterTrigger));
898 return SOAPUtilities::makeSOAPMessageReference(
899 supervisorClassNoNamespace_ +
"Response", retParameters);
901 else if(request ==
"ResetTRACE")
903 parameters.addParameter(
"Host");
904 SOAPUtilities::receive(message, parameters);
906 std::string host = parameters.getValue(
"Host");
908 retParameters.addParameter(
"TRACETriggerStatus", resetTRACE(host));
909 return SOAPUtilities::makeSOAPMessageReference(
910 supervisorClassNoNamespace_ +
"Response", retParameters);
912 else if(request ==
"EnableTRACE")
914 parameters.addParameter(
"Host");
915 parameters.addParameter(
"SetEnable");
916 SOAPUtilities::receive(message, parameters);
918 std::string host = parameters.getValue(
"Host");
919 bool enable = parameters.getValueAsInt(
"SetEnable") ? true :
false;
921 __SUP_COUTV__(enable);
923 retParameters.addParameter(
"TRACETriggerStatus", enableTRACE(host, enable));
924 return SOAPUtilities::makeSOAPMessageReference(
925 supervisorClassNoNamespace_ +
"Response", retParameters);
927 else if(request ==
"GetSnapshot")
929 parameters.addParameter(
"Host");
930 parameters.addParameter(
"FilterForCSV");
931 parameters.addParameter(
"FilterOutCSV");
932 SOAPUtilities::receive(message, parameters);
934 std::string host = parameters.getValue(
"Host");
935 std::string filterFor = parameters.getValue(
"FilterForCSV");
936 std::string filterOut = parameters.getValue(
"FilterOutCSV");
938 __SUP_COUTV__(filterFor);
939 __SUP_COUTV__(filterOut);
940 retParameters.addParameter(
"TRACESnapshot",
941 getTraceSnapshot(host, filterFor, filterOut));
942 retParameters.addParameter(
"TRACETriggerStatus", getTraceTriggerStatus());
943 return SOAPUtilities::makeSOAPMessageReference(
944 supervisorClassNoNamespace_ +
"Response", retParameters);
948 __SUP_SS__ <<
"Unrecognized request received! '" << request <<
"'" << __E__;
952 catch(
const std::runtime_error& e)
954 __SUP_SS__ <<
"Error occurred handling request: " << e.what() << __E__;
955 __SUP_COUT_ERR__ << ss.str();
956 retParameters.addParameter(
"Error", ss.str());
960 __SUP_SS__ <<
"Error occurred handling request." << __E__;
965 catch(
const std::exception& e)
967 ss <<
"Exception message: " << e.what();
972 __SUP_COUT_ERR__ << ss.str();
973 retParameters.addParameter(
"Error", ss.str());
976 return SOAPUtilities::makeSOAPMessageReference(
"TRACEFault", retParameters);
981 const std::string& CorePropertySupervisorBase::getTraceLevels()
983 __SUP_COUT__ <<
"getTraceLevels()" << __E__;
985 traceReturnString_ =
"";
986 traceReturnHostString_ =
"";
990 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
995 ITRACEController::HostTraceLevelMap traceHostMap =
997 for(
const auto& traceMap : traceHostMap)
1004 traceReturnHostString_ =
";" + traceMap.first;
1005 traceReturnString_ +=
";" + traceMap.first;
1007 for(
const auto& traceMask : traceMap.second)
1012 traceReturnString_ +=
1013 "," + traceMask.first +
1014 ",M:" + std::to_string((
unsigned int)(traceMask.second.M >> 32)) +
":" +
1015 std::to_string((
unsigned int)traceMask.second.M) +
1016 ":S:" + std::to_string((
unsigned int)(traceMask.second.S >> 32)) +
":" +
1017 std::to_string((
unsigned int)traceMask.second.S) +
1018 ":T:" + std::to_string((
unsigned int)(traceMask.second.T >> 32)) +
":" +
1019 std::to_string((
unsigned int)traceMask.second.T);
1022 __SUP_COUT__ <<
"end getTraceLevels()" << __E__;
1023 return traceReturnString_;
1027 const std::string& CorePropertySupervisorBase::setTraceLevels(
1028 std::string
const& host,
1029 std::string
const& mode,
1030 std::string
const& labelsStr,
1031 uint32_t setValueMSB,
1032 uint32_t setValueLSB)
1034 __SUP_COUT__ <<
"setTraceLevels()" << __E__;
1038 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1043 bool allMode = mode ==
"ALL";
1044 if(allMode || mode ==
"FAST")
1045 setMask.M = ((uint64_t(setValueMSB)) << 32) | (uint64_t(uint32_t(setValueLSB)));
1046 if(allMode || mode ==
"SLOW")
1047 setMask.S = ((uint64_t(setValueMSB)) << 32) | (uint64_t(uint32_t(setValueLSB)));
1048 if(allMode || mode ==
"TRIGGER")
1049 setMask.T = ((uint64_t(setValueMSB)) << 32) | (uint64_t(uint32_t(setValueLSB)));
1051 std::vector<std::string > labels;
1053 for(
const auto& label : labels)
1055 __SUP_COUTV__(label);
1059 __SUP_COUT__ <<
"end setTraceLevels()" << __E__;
1060 return getTraceLevels();
1064 const std::string& CorePropertySupervisorBase::setIndividualTraceLevels(
1065 std::string
const& host, std::string
const& mode, std::string
const& labelValuesStr)
1067 __SUP_COUT__ <<
"setIndividualTraceLevels()" << __E__;
1071 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1076 bool allMode = mode ==
"ALL";
1077 bool fastMode = mode ==
"FAST";
1078 bool slowMode = mode ==
"SLOW";
1079 bool triggerMode = mode ==
"TRIGGER";
1081 std::vector<std::string > labelValues;
1083 for(
unsigned int i = 0; i < labelValues.size(); i += 3 )
1085 __SUP_COUT__ <<
"Label = " << labelValues[i] <<
" msb/lsb " << labelValues[i + 1]
1086 <<
"/" << labelValues[i + 2] << __E__;
1088 if(allMode || fastMode)
1089 setMask.M = ((uint64_t(atoi(labelValues[i + 1].c_str()))) << 32) |
1090 (uint64_t(uint32_t(atoi(labelValues[i + 2].c_str()))));
1091 if(allMode || slowMode)
1092 setMask.S = ((uint64_t(atoi(labelValues[i + 1].c_str()))) << 32) |
1093 (uint64_t(uint32_t(atoi(labelValues[i + 2].c_str()))));
1094 if(allMode || triggerMode)
1095 setMask.T = ((uint64_t(atoi(labelValues[i + 1].c_str()))) << 32) |
1096 (uint64_t(uint32_t(atoi(labelValues[i + 2].c_str()))));
1101 __SUP_COUT__ <<
"end setIndividualTraceLevels()" << __E__;
1102 return getTraceLevels();
1106 const std::string& CorePropertySupervisorBase::getTraceTriggerStatus()
1108 __SUP_COUT__ <<
"getTraceTriggerStatus()" << __E__;
1110 traceReturnString_ =
"";
1114 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1119 traceReturnString_ +=
1122 __SUP_COUT__ <<
"end getTraceTriggerStatus() " << traceReturnString_ << __E__;
1123 return traceReturnString_;
1127 const std::string& CorePropertySupervisorBase::setTraceTriggerEnable(
1128 std::string
const& host,
size_t entriesAfterTrigger)
1130 __SUP_COUT__ <<
"setTraceTriggerEnable() " << host << __E__;
1134 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1138 __SUP_COUT__ <<
"end setTraceTriggerEnable()" << __E__;
1139 return getTraceTriggerStatus();
1143 const std::string& CorePropertySupervisorBase::resetTRACE(std::string
const& host)
1145 __SUP_COUT__ <<
"resetTRACE() " << host << __E__;
1149 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1154 __SUP_COUT__ <<
"end resetTRACE()" << __E__;
1155 return getTraceTriggerStatus();
1159 const std::string& CorePropertySupervisorBase::enableTRACE(std::string
const& host,
1162 __SUP_COUT__ <<
"enableTRACE() " << host <<
" " << enable << __E__;
1166 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1170 __SUP_COUT__ <<
"end enableTRACE()" << __E__;
1171 return getTraceTriggerStatus();
1175 const std::string& CorePropertySupervisorBase::getTraceSnapshot(
1176 std::string
const& host, std::string
const& filterFor, std::string
const& filterOut)
1178 __SUP_COUT__ <<
"getTraceSnapshot()" << host << __E__;
1180 traceReturnString_ =
"";
1184 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1191 const size_t MAX_SZ = 200000;
1192 if(traceReturnString_.size() > MAX_SZ)
1194 __SUP_COUT__ <<
"Truncating from " << traceReturnString_.size() <<
" to "
1196 traceReturnString_.resize(MAX_SZ);
1197 traceReturnString_ +=
"\n...TRUNCATED";
1199 else if(traceReturnString_.size() == 0)
1201 __SUP_COUT__ <<
"Empty snapshot" << __E__;
1202 traceReturnString_ =
"Empty TRACE snapshot.";
1204 __SUP_COUT__ <<
"end getTraceSnapshot() Bytes = " << traceReturnString_.size()
1206 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 ~