1 #include "otsdaq/CoreSupervisors/CorePropertySupervisorBase.h"
2 #include "otsdaq/MessageFacility/ITRACEController.h"
3 #include "otsdaq/MessageFacility/TRACEController.h"
8 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES =
13 CorePropertySupervisorBase::CorePropertySupervisorBase(xdaq::Application* application)
14 : theConfigurationManager_(0)
15 , supervisorClass_(application->getApplicationDescriptor()->getClassName())
16 , supervisorClassNoNamespace_(
17 supervisorClass_.substr(supervisorClass_.find_last_of(
":") + 1, supervisorClass_.length() - supervisorClass_.find_last_of(
":")))
18 , supervisorContextUID_(
"UNINITIALIZED_supervisorContextUID")
19 , supervisorApplicationUID_(
"UNINITIALIZED_supervisorApplicationUID")
20 , supervisorConfigurationPath_(
"UNINITIALIZED_supervisorConfigurationPath")
21 , propertiesAreSetup_(false)
22 , theTRACEController_(nullptr)
28 __SUP_COUTV__(application->getApplicationContext()->getContextDescriptor()->getURL());
29 __SUP_COUTV__(application->getApplicationDescriptor()->getLocalId());
30 __SUP_COUTV__(supervisorClass_);
31 __SUP_COUTV__(supervisorClassNoNamespace_);
34 allSupervisorInfo_.init(application->getApplicationContext());
36 if(allSupervisorInfo_.isMacroMakerMode())
39 __SUP_COUT__ <<
"Macro Maker mode detected. So skipping configuration location work for "
40 "supervisor of class '"
41 << supervisorClass_ <<
"'" << __E__;
43 supervisorContextUID_ =
"MacroMakerFEContext";
44 supervisorApplicationUID_ =
"MacroMakerFESupervisor";
45 supervisorConfigurationPath_ = CorePropertySupervisorBase::supervisorContextUID_ +
"/LinkToApplicationTable/" +
46 CorePropertySupervisorBase::supervisorApplicationUID_ +
"/LinkToSupervisorTable";
48 __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
49 __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
50 __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
57 else if(allSupervisorInfo_.isWizardMode())
59 __SUP_COUT__ <<
"Wiz mode detected. So skipping configuration location work for "
60 "supervisor of class '"
61 << supervisorClass_ <<
"'" << __E__;
62 supervisorContextUID_ =
"NO CONTEXT ID IN WIZ MODE";
63 supervisorApplicationUID_ = std::to_string(application->getApplicationDescriptor()->getLocalId());
64 supervisorConfigurationPath_ =
"NO APP PATH IN WIZ MODE";
66 __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
67 __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
68 __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
73 __SUP_COUT__ <<
"Getting configuration specific info for supervisor '" << (allSupervisorInfo_.getSupervisorInfo(application).getName()) <<
"' of class "
74 << supervisorClass_ <<
"." << __E__;
80 __SUP_COUTV__(application->getApplicationContext()->getContextDescriptor()->getURL());
82 CorePropertySupervisorBase::supervisorContextUID_ =
83 theConfigurationManager_->__GET_CONFIG__(
XDAQContextTable)->getContextUID(application->getApplicationContext()->getContextDescriptor()->getURL());
84 if(CorePropertySupervisorBase::supervisorContextUID_ ==
"")
86 __SUP_SS__ <<
"Illegal empty Supervisor Context UID identified. Please try again or contact admins." << __E__;
92 __SUP_COUT_ERR__ <<
"XDAQ Supervisor could not access it's configuration through "
93 "the Configuration Manager."
94 <<
". The getApplicationContext()->getContextDescriptor()->getURL() = "
95 << application->getApplicationContext()->getContextDescriptor()->getURL() << __E__;
101 __SUP_COUTV__(application->getApplicationDescriptor()->getLocalId());
102 CorePropertySupervisorBase::supervisorApplicationUID_ = theConfigurationManager_->__GET_CONFIG__(
XDAQContextTable)
103 ->getApplicationUID(application->getApplicationContext()->getContextDescriptor()->getURL(),
104 application->getApplicationDescriptor()->getLocalId());
105 if(CorePropertySupervisorBase::supervisorApplicationUID_ ==
"")
107 __SUP_SS__ <<
"Illegal empty Supervisor Application UID identified. Please try again or contact admins." << __E__;
113 __SUP_COUT_ERR__ <<
"XDAQ Supervisor could not access it's configuration through "
114 "the Configuration Manager."
115 <<
" The supervisorContextUID_ = " << supervisorContextUID_ <<
". The supervisorApplicationUID = " << supervisorApplicationUID_
120 CorePropertySupervisorBase::supervisorConfigurationPath_ =
"/" + CorePropertySupervisorBase::supervisorContextUID_ +
"/LinkToApplicationTable/" +
121 CorePropertySupervisorBase::supervisorApplicationUID_ +
"/LinkToSupervisorTable";
123 __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
124 __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
125 __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
138 CorePropertySupervisorBase::indicateOtsAlive(
this);
140 theConfigurationManager_->setOwnerContext(CorePropertySupervisorBase::supervisorContextUID_);
141 theConfigurationManager_->setOwnerApp(CorePropertySupervisorBase::supervisorApplicationUID_);
147 CorePropertySupervisorBase::~CorePropertySupervisorBase(
void)
149 __SUP_COUT__ <<
"Destructor." << __E__;
151 CorePropertySupervisorBase::indicateOtsDead(
this);
153 if(theConfigurationManager_)
154 delete theConfigurationManager_;
158 __SUP_COUT__ <<
"Destroying TRACE Controller..." << __E__;
162 __SUP_COUT__ <<
"Destructed." << __E__;
166 void CorePropertySupervisorBase::indicateOtsAlive(
169 char portStr[100] =
"0";
170 std::string hostname =
"wiz";
179 unsigned int port = properties->getContextTreeNode()
180 .
getNode(properties->supervisorContextUID_)
187 port = atoi(__ENV__(
"OTS_MAIN_PORT"));
189 sprintf(portStr,
"%u", port);
191 hostname = properties->getContextTreeNode()
192 .
getNode(properties->supervisorContextUID_)
195 if(hostname ==
"DEFAULT")
196 hostname =
"http://" + std::string(__ENV__(
"HOSTNAME"));
198 size_t i = hostname.find(
"//");
199 if(i != std::string::npos)
200 hostname = hostname.substr(i + 2);
206 std::string filename = std::string(__ENV__(
"OTSDAQ_LOG_DIR")) +
"/otsdaq_is_alive-" +
207 hostname +
"-" + portStr +
".dat";
208 FILE* fp = fopen(filename.c_str(),
"w");
211 __SS__ <<
"Failed to open the ots-is-alive file: " << filename << __E__;
214 fprintf(fp,
"%s %s %ld\n", hostname.c_str(), portStr, time(0));
217 __COUT__ <<
"Marked alive: " << filename << __E__;
221 void CorePropertySupervisorBase::indicateOtsDead(
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__;
271 __COUT__ <<
"Marked dead: " << filename << __E__;
276 XDAQ_CONST_CALL xdaq::ApplicationDescriptor*
279 if(allSupervisorInfo_.isMacroMakerMode())
282 return allSupervisorInfo_.
isWizardMode() ? allSupervisorInfo_.getWizardDescriptor()
283 : allSupervisorInfo_.getGatewayDescriptor();
300 CorePropertySupervisorBase::setSupervisorProperty(
301 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold,
303 CorePropertySupervisorBase::setSupervisorProperty(
304 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed,
"");
305 CorePropertySupervisorBase::setSupervisorProperty(
306 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed,
"");
308 CorePropertySupervisorBase::setSupervisorProperty(
309 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.CheckUserLockRequestTypes,
"");
310 CorePropertySupervisorBase::setSupervisorProperty(
311 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.RequireUserLockRequestTypes,
313 CorePropertySupervisorBase::setSupervisorProperty(
314 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AutomatedRequestTypes,
"");
315 CorePropertySupervisorBase::setSupervisorProperty(
316 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AllowNoLoginRequestTypes,
"");
317 CorePropertySupervisorBase::setSupervisorProperty(
318 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.RequireSecurityRequestTypes,
321 CorePropertySupervisorBase::setSupervisorProperty(
322 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NoXmlWhiteSpaceRequestTypes,
324 CorePropertySupervisorBase::setSupervisorProperty(
325 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NonXMLRequestTypes,
"");
348 const std::string& permissionsString,
349 std::map<std::string, WebUsers::permissionLevel_t>& permissionsMap)
351 permissionsMap.clear();
353 if(permissionsMap.size() == 0)
354 permissionsMap.emplace(std::pair<std::string, WebUsers::permissionLevel_t>(
355 WebUsers::DEFAULT_USER_GROUP,
356 atoi(permissionsString.c_str()))
379 std::map<std::string, WebUsers::permissionLevel_t>& permissionLevelsMap,
380 std::map<std::string, WebUsers::permissionLevel_t>& permissionThresholdsMap)
389 for(
const auto& permissionLevelGroupPair : permissionLevelsMap)
394 for(
const auto& permissionThresholdGroupPair : permissionThresholdsMap)
398 if(permissionLevelGroupPair.first == permissionThresholdGroupPair.first &&
399 permissionThresholdGroupPair.second &&
400 permissionLevelGroupPair.second >= permissionThresholdGroupPair.second)
412 void CorePropertySupervisorBase::checkSupervisorPropertySetup()
414 if(propertiesAreSetup_)
420 propertiesAreSetup_ =
true;
422 __SUP_COUTT__ <<
"Setting up supervisor specific property DEFAULTS for supervisor..."
431 <<
"Done setting up supervisor specific property DEFAULTS for supervisor."
435 __SUP_COUT__ <<
"Wiz mode detected. Skipping setup of supervisor properties for "
436 "supervisor of class '"
437 << supervisorClass_ <<
"'" << __E__;
438 else if(allSupervisorInfo_.isMacroMakerMode())
440 <<
"Maker Maker mode detected. Skipping setup of supervisor properties for "
441 "supervisor of class '"
442 << supervisorClass_ <<
"'" << __E__;
448 readOnly_ = getSupervisorProperty(
"ReadOnly",
"0") ==
"1" ? true :
false;
449 __SUP_COUTV__(readOnly_);
459 getSupervisorProperty(
460 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold),
461 propertyStruct_.UserPermissionsThreshold);
463 propertyStruct_.UserGroupsAllowed.clear();
465 getSupervisorProperty(
466 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed),
467 propertyStruct_.UserGroupsAllowed);
469 propertyStruct_.UserGroupsDisallowed.clear();
471 getSupervisorProperty(
472 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed),
473 propertyStruct_.UserGroupsDisallowed);
475 auto nameIt = SUPERVISOR_PROPERTIES.allSetNames_.begin();
476 auto setIt = propertyStruct_.allSets_.begin();
477 while(nameIt != SUPERVISOR_PROPERTIES.allSetNames_.end() &&
478 setIt != propertyStruct_.allSets_.end())
487 __SUP_COUT__ <<
"Final supervisor property settings:" << __E__;
488 for(
auto& property : propertyMap_)
489 __SUP_COUT__ <<
"\t" <<
property.first <<
" = " <<
property.second << __E__;
498 if(supervisorContextUID_ ==
"" || supervisorApplicationUID_ ==
"")
500 __SUP_SS__ <<
"Empty supervisorContextUID_ or supervisorApplicationUID_."
504 return theConfigurationManager_->getSupervisorNode(supervisorContextUID_,
505 supervisorApplicationUID_);
510 <<
"XDAQ Supervisor could not access it's configuration node through "
511 "theConfigurationManager_ "
512 <<
"(Did you remember to initialize using CorePropertySupervisorBase::init()?)."
513 <<
" The supervisorContextUID_ = " << supervisorContextUID_
514 <<
". The supervisorApplicationUID = " << supervisorApplicationUID_ << __E__;
533 supervisorNode.getNode(
"LinkToPropertyTable").getChildren();
535 for(
auto& child : children)
537 if(!child.second.status())
540 auto propertyName = child.second.getNode(
"PropertyName").getValue();
541 setSupervisorProperty(
543 child.second.getNode(
"PropertyValue").getValue<std::string>());
548 __SUP_COUT__ <<
"No user supervisor property settings found in the configuration "
549 "tree, going with the defaults."
559 void CorePropertySupervisorBase::setSupervisorProperty(
const std::string& propertyName,
560 const std::string& propertyValue)
562 propertyMap_[propertyName] = propertyValue;
568 void CorePropertySupervisorBase::addSupervisorProperty(
const std::string& propertyName,
569 const std::string& propertyValue)
571 propertyMap_[propertyName] =
572 propertyValue +
" | " + getSupervisorProperty(propertyName);
580 std::string CorePropertySupervisorBase::getSupervisorProperty(
581 const std::string& propertyName)
584 checkSupervisorPropertySetup();
586 auto it = propertyMap_.find(propertyName);
587 if(it == propertyMap_.end())
589 __SUP_SS__ <<
"Could not find property named " << propertyName << __E__;
597 std::string CorePropertySupervisorBase::getSupervisorProperty(
598 const std::string& propertyName,
const std::string& defaultValue)
601 checkSupervisorPropertySetup();
603 auto it = propertyMap_.find(propertyName);
604 if(it == propertyMap_.end())
615 WebUsers::permissionLevel_t
617 const std::string& requestType)
620 checkSupervisorPropertySetup();
623 requestType, propertyStruct_.UserPermissionsThreshold);
631 checkSupervisorPropertySetup();
633 __SUP_COUT_TYPE__(TLVL_DEBUG + 20)
634 << __COUT_HDR__ <<
"userInfo.requestType_ " << userInfo.requestType_ << __E__;
636 __SUP_COUT_TYPE__(TLVL_DEBUG + 20)
637 << __COUT_HDR__ <<
"propertyStruct_.AutomatedRequestTypes "
640 userInfo.requestType_,
641 propertyStruct_.AutomatedRequestTypes);
645 __SUP_COUT_TYPE__(TLVL_DEBUG + 21)
646 << __COUT_HDR__ <<
"propertyStruct_.NonXMLRequestTypes "
649 userInfo.requestType_, propertyStruct_.NonXMLRequestTypes);
654 __SUP_COUT_TYPE__(TLVL_DEBUG + 21)
655 << __COUT_HDR__ <<
"propertyStruct_.NoXmlWhiteSpaceRequestTypes "
659 userInfo.requestType_, propertyStruct_.NoXmlWhiteSpaceRequestTypes);
664 __SUP_COUT_TYPE__(TLVL_DEBUG + 20)
665 << __COUT_HDR__ <<
"propertyStruct_.CheckUserLockRequestTypes "
669 userInfo.requestType_, propertyStruct_.CheckUserLockRequestTypes);
670 __SUP_COUT_TYPE__(TLVL_DEBUG + 20)
671 << __COUT_HDR__ <<
"propertyStruct_.RequireUserLockRequestTypes "
675 userInfo.requestType_, propertyStruct_.RequireUserLockRequestTypes);
676 if(userInfo.requireLock_ && userInfo.automatedCommand_)
678 __SUP_COUTT__ <<
"Overriding requireLock_ because request '"
679 << userInfo.requestType_ <<
"' marked as automatedCommand_"
681 userInfo.requireLock_ =
false;
684 __SUP_COUT_TYPE__(TLVL_DEBUG + 21)
685 << __COUT_HDR__ <<
"propertyStruct_.AllowNoLoginRequestTypes "
689 userInfo.requestType_, propertyStruct_.AllowNoLoginRequestTypes);
690 __SUP_COUT_TYPE__(TLVL_DEBUG + 21)
691 << __COUT_HDR__ <<
"propertyStruct_.RequireSecurityRequestTypes "
695 userInfo.requestType_, propertyStruct_.RequireSecurityRequestTypes);
697 userInfo.permissionsThreshold_ = -1;
700 userInfo.permissionsThreshold_ =
702 userInfo.requestType_);
704 catch(std::runtime_error& e)
706 if(!userInfo.automatedCommand_)
707 __SUP_COUT__ <<
"No explicit permissions threshold for request '"
708 << userInfo.requestType_
709 <<
"'... Defaulting to max threshold = "
710 << (
unsigned int)userInfo.permissionsThreshold_ << __E__;
713 __SUP_COUTVS__(20, userInfo.requestType_);
714 __SUP_COUTVS__(20, userInfo.checkLock_);
715 __SUP_COUTVS__(20, userInfo.requireLock_);
716 __SUP_COUTVS__(20, userInfo.allowNoUser_);
717 __SUP_COUTVS__(20, userInfo.automatedCommand_);
718 __SUP_COUTVS__(20, userInfo.automatedCommand_);
719 __SUP_COUTVS__(20, (
unsigned int)userInfo.permissionsThreshold_);
725 propertyStruct_.UserGroupsAllowed),
726 userInfo.groupsAllowed_);
728 catch(std::runtime_error& e)
730 userInfo.groupsAllowed_.clear();
731 if(!userInfo.automatedCommand_)
732 __SUP_COUT_TYPE__(TLVL_DEBUG + 25)
733 << __COUT_HDR__ <<
"No explicit groups allowed for request '"
734 << userInfo.requestType_
735 <<
"'... Defaulting to empty groups allowed. " << __E__;
741 userInfo.requestType_, propertyStruct_.UserGroupsDisallowed),
742 userInfo.groupsDisallowed_);
744 catch(std::runtime_error& e)
746 userInfo.groupsDisallowed_.clear();
748 if(!userInfo.automatedCommand_)
749 __SUP_COUT_TYPE__(TLVL_DEBUG + 25)
750 << __COUT_HDR__ <<
"No explicit groups disallowed for request '"
751 << userInfo.requestType_
752 <<
"'... Defaulting to empty groups disallowed. " << __E__;
760 xoap::MessageReference CorePropertySupervisorBase::TRACESupervisorRequest(
761 xoap::MessageReference message)
763 __SUP_COUT__ <<
"$$$$$$$$$$$$$$$$$" << __E__;
767 parameters.addParameter(
"Request");
769 __SUP_COUT__ <<
"Received TRACE message: " << SOAPUtilities::translate(message)
772 SOAPUtilities::receive(message, parameters);
773 std::string request = parameters.getValue(
"Request");
775 __SUP_COUT__ <<
"request: " << request << __E__;
784 if(request ==
"GetTraceLevels")
786 retParameters.addParameter(
"TRACEList", getTraceLevels());
787 retParameters.addParameter(
"TRACEHostnameList", traceReturnHostString_);
788 return SOAPUtilities::makeSOAPMessageReference(
789 supervisorClassNoNamespace_ +
"Response", retParameters);
791 else if(request ==
"SetTraceLevels")
793 parameters.addParameter(
"IndividualValues");
794 parameters.addParameter(
"Host");
795 parameters.addParameter(
"SetMode");
796 parameters.addParameter(
"Labels");
797 parameters.addParameter(
"SetValueMSB");
798 parameters.addParameter(
"SetValueLSB");
799 SOAPUtilities::receive(message, parameters);
801 int individualValues = parameters.getValueAsInt(
"IndividualValues");
802 std::string host = parameters.getValue(
"Host");
803 std::string setMode = parameters.getValue(
"SetMode");
804 std::string labelsStr = parameters.getValue(
"Labels");
805 int setValueMSB = parameters.getValueAsInt(
"SetValueMSB");
806 int setValueLSB = parameters.getValueAsInt(
"SetValueLSB");
807 __SUP_COUTV__(individualValues);
809 __SUP_COUTV__(setMode);
810 __SUP_COUTV__(setValueMSB);
811 __SUP_COUTV__(setValueLSB);
812 __SUP_COUTV__(labelsStr);
815 retParameters.addParameter(
816 "TRACEList", setIndividualTraceLevels(host, setMode, labelsStr));
818 retParameters.addParameter(
820 setTraceLevels(host, setMode, labelsStr, setValueMSB, setValueLSB));
821 return SOAPUtilities::makeSOAPMessageReference(
822 supervisorClassNoNamespace_ +
"Response", retParameters);
824 else if(request ==
"GetTriggerStatus")
826 retParameters.addParameter(
"TRACETriggerStatus", getTraceTriggerStatus());
827 return SOAPUtilities::makeSOAPMessageReference(
828 supervisorClassNoNamespace_ +
"Response", retParameters);
830 else if(request ==
"SetTriggerEnable")
832 parameters.addParameter(
"Host");
833 parameters.addParameter(
"EntriesAfterTrigger");
834 SOAPUtilities::receive(message, parameters);
836 std::string host = parameters.getValue(
"Host");
837 int entriesAfterTrigger = parameters.getValueAsInt(
"EntriesAfterTrigger");
839 __SUP_COUTV__(entriesAfterTrigger);
840 retParameters.addParameter(
"TRACETriggerStatus",
841 setTraceTriggerEnable(host, entriesAfterTrigger));
842 return SOAPUtilities::makeSOAPMessageReference(
843 supervisorClassNoNamespace_ +
"Response", retParameters);
845 else if(request ==
"ResetTRACE")
847 parameters.addParameter(
"Host");
848 SOAPUtilities::receive(message, parameters);
850 std::string host = parameters.getValue(
"Host");
852 retParameters.addParameter(
"TRACETriggerStatus", resetTRACE(host));
853 return SOAPUtilities::makeSOAPMessageReference(
854 supervisorClassNoNamespace_ +
"Response", retParameters);
856 else if(request ==
"EnableTRACE")
858 parameters.addParameter(
"Host");
859 parameters.addParameter(
"SetEnable");
860 SOAPUtilities::receive(message, parameters);
862 std::string host = parameters.getValue(
"Host");
863 bool enable = parameters.getValueAsInt(
"SetEnable") ? true :
false;
865 __SUP_COUTV__(enable);
867 retParameters.addParameter(
"TRACETriggerStatus", enableTRACE(host, enable));
868 return SOAPUtilities::makeSOAPMessageReference(
869 supervisorClassNoNamespace_ +
"Response", retParameters);
871 else if(request ==
"GetSnapshot")
873 parameters.addParameter(
"Host");
874 parameters.addParameter(
"FilterForCSV");
875 parameters.addParameter(
"FilterOutCSV");
876 SOAPUtilities::receive(message, parameters);
878 std::string host = parameters.getValue(
"Host");
879 std::string filterFor = parameters.getValue(
"FilterForCSV");
880 std::string filterOut = parameters.getValue(
"FilterOutCSV");
882 __SUP_COUTV__(filterFor);
883 __SUP_COUTV__(filterOut);
884 retParameters.addParameter(
"TRACESnapshot",
885 getTraceSnapshot(host, filterFor, filterOut));
886 retParameters.addParameter(
"TRACETriggerStatus", getTraceTriggerStatus());
887 return SOAPUtilities::makeSOAPMessageReference(
888 supervisorClassNoNamespace_ +
"Response", retParameters);
892 __SUP_SS__ <<
"Unrecognized request received! '" << request <<
"'" << __E__;
896 catch(
const std::runtime_error& e)
898 __SUP_SS__ <<
"Error occurred handling request: " << e.what() << __E__;
899 __SUP_COUT_ERR__ << ss.str();
900 retParameters.addParameter(
"Error", ss.str());
904 __SUP_SS__ <<
"Error occurred handling request." << __E__;
909 catch(
const std::exception& e)
911 ss <<
"Exception message: " << e.what();
916 __SUP_COUT_ERR__ << ss.str();
917 retParameters.addParameter(
"Error", ss.str());
920 return SOAPUtilities::makeSOAPMessageReference(
"TRACEFault", retParameters);
925 const std::string& CorePropertySupervisorBase::getTraceLevels()
927 __SUP_COUT__ <<
"getTraceLevels()" << __E__;
929 traceReturnString_ =
"";
930 traceReturnHostString_ =
"";
934 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
939 ITRACEController::HostTraceLevelMap traceHostMap =
941 for(
const auto& traceMap : traceHostMap)
948 traceReturnHostString_ =
";" + traceMap.first;
949 traceReturnString_ +=
";" + traceMap.first;
951 for(
const auto& traceMask : traceMap.second)
956 traceReturnString_ +=
957 "," + traceMask.first +
958 ",M:" + std::to_string((
unsigned int)(traceMask.second.M >> 32)) +
":" +
959 std::to_string((
unsigned int)traceMask.second.M) +
960 ":S:" + std::to_string((
unsigned int)(traceMask.second.S >> 32)) +
":" +
961 std::to_string((
unsigned int)traceMask.second.S) +
962 ":T:" + std::to_string((
unsigned int)(traceMask.second.T >> 32)) +
":" +
963 std::to_string((
unsigned int)traceMask.second.T);
966 __SUP_COUT__ <<
"end getTraceLevels()" << __E__;
967 return traceReturnString_;
971 const std::string& CorePropertySupervisorBase::setTraceLevels(
972 std::string
const& host,
973 std::string
const& mode,
974 std::string
const& labelsStr,
975 uint32_t setValueMSB,
976 uint32_t setValueLSB)
978 __SUP_COUT__ <<
"setTraceLevels()" << __E__;
982 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
987 bool allMode = mode ==
"ALL";
988 if(allMode || mode ==
"FAST")
989 setMask.M = ((uint64_t(setValueMSB)) << 32) | (uint64_t(uint32_t(setValueLSB)));
990 if(allMode || mode ==
"SLOW")
991 setMask.S = ((uint64_t(setValueMSB)) << 32) | (uint64_t(uint32_t(setValueLSB)));
992 if(allMode || mode ==
"TRIGGER")
993 setMask.T = ((uint64_t(setValueMSB)) << 32) | (uint64_t(uint32_t(setValueLSB)));
995 std::vector<std::string > labels;
997 for(
const auto& label : labels)
999 __SUP_COUTV__(label);
1003 __SUP_COUT__ <<
"end setTraceLevels()" << __E__;
1004 return getTraceLevels();
1008 const std::string& CorePropertySupervisorBase::setIndividualTraceLevels(
1009 std::string
const& host, std::string
const& mode, std::string
const& labelValuesStr)
1011 __SUP_COUT__ <<
"setIndividualTraceLevels()" << __E__;
1015 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1020 bool allMode = mode ==
"ALL";
1021 bool fastMode = mode ==
"FAST";
1022 bool slowMode = mode ==
"SLOW";
1023 bool triggerMode = mode ==
"TRIGGER";
1025 std::vector<std::string > labelValues;
1027 for(
unsigned int i = 0; i < labelValues.size(); i += 3 )
1029 __SUP_COUT__ <<
"Label = " << labelValues[i] <<
" msb/lsb " << labelValues[i + 1]
1030 <<
"/" << labelValues[i + 2] << __E__;
1032 if(allMode || fastMode)
1033 setMask.M = ((uint64_t(atoi(labelValues[i + 1].c_str()))) << 32) |
1034 (uint64_t(uint32_t(atoi(labelValues[i + 2].c_str()))));
1035 if(allMode || slowMode)
1036 setMask.S = ((uint64_t(atoi(labelValues[i + 1].c_str()))) << 32) |
1037 (uint64_t(uint32_t(atoi(labelValues[i + 2].c_str()))));
1038 if(allMode || triggerMode)
1039 setMask.T = ((uint64_t(atoi(labelValues[i + 1].c_str()))) << 32) |
1040 (uint64_t(uint32_t(atoi(labelValues[i + 2].c_str()))));
1045 __SUP_COUT__ <<
"end setIndividualTraceLevels()" << __E__;
1046 return getTraceLevels();
1050 const std::string& CorePropertySupervisorBase::getTraceTriggerStatus()
1052 __SUP_COUT__ <<
"getTraceTriggerStatus()" << __E__;
1054 traceReturnString_ =
"";
1058 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1063 traceReturnString_ +=
1066 __SUP_COUT__ <<
"end getTraceTriggerStatus() " << traceReturnString_ << __E__;
1067 return traceReturnString_;
1071 const std::string& CorePropertySupervisorBase::setTraceTriggerEnable(
1072 std::string
const& host,
size_t entriesAfterTrigger)
1074 __SUP_COUT__ <<
"setTraceTriggerEnable() " << host << __E__;
1078 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1082 __SUP_COUT__ <<
"end setTraceTriggerEnable()" << __E__;
1083 return getTraceTriggerStatus();
1087 const std::string& CorePropertySupervisorBase::resetTRACE(std::string
const& host)
1089 __SUP_COUT__ <<
"resetTRACE() " << host << __E__;
1093 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1098 __SUP_COUT__ <<
"end resetTRACE()" << __E__;
1099 return getTraceTriggerStatus();
1103 const std::string& CorePropertySupervisorBase::enableTRACE(std::string
const& host,
1106 __SUP_COUT__ <<
"enableTRACE() " << host <<
" " << enable << __E__;
1110 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1114 __SUP_COUT__ <<
"end enableTRACE()" << __E__;
1115 return getTraceTriggerStatus();
1119 const std::string& CorePropertySupervisorBase::getTraceSnapshot(
1120 std::string
const& host, std::string
const& filterFor, std::string
const& filterOut)
1122 __SUP_COUT__ <<
"getTraceSnapshot()" << host << __E__;
1124 traceReturnString_ =
"";
1128 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1135 const size_t MAX_SZ = 200000;
1136 if(traceReturnString_.size() > MAX_SZ)
1138 __SUP_COUT__ <<
"Truncating from " << traceReturnString_.size() <<
" to "
1140 traceReturnString_.resize(MAX_SZ);
1141 traceReturnString_ +=
"\n...TRUNCATED";
1143 else if(traceReturnString_.size() == 0)
1145 __SUP_COUT__ <<
"Empty snapshot" << __E__;
1146 traceReturnString_ =
"Empty TRACE snapshot.";
1148 __SUP_COUT__ <<
"end getTraceSnapshot() Bytes = " << traceReturnString_.size()
1150 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
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 ~