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_COUTV__(application->getApplicationContext()->getContextDescriptor()->getURL());
33 __SUP_COUTV__(application->getApplicationDescriptor()->getLocalId());
34 __SUP_COUTV__(supervisorClass_);
35 __SUP_COUTV__(supervisorClassNoNamespace_);
38 allSupervisorInfo_.init(application->getApplicationContext());
40 if(allSupervisorInfo_.isMacroMakerMode())
43 __SUP_COUT__ <<
"Macro Maker mode detected. So skipping configuration location work for "
44 "supervisor of class '"
45 << supervisorClass_ <<
"'" << __E__;
47 supervisorContextUID_ =
"MacroMakerFEContext";
48 supervisorApplicationUID_ =
"MacroMakerFESupervisor";
49 supervisorConfigurationPath_ = CorePropertySupervisorBase::supervisorContextUID_ +
"/LinkToApplicationTable/" +
50 CorePropertySupervisorBase::supervisorApplicationUID_ +
"/LinkToSupervisorTable";
52 __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
53 __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
54 __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
61 else if(allSupervisorInfo_.isWizardMode())
63 __SUP_COUT__ <<
"Wiz mode detected. So skipping configuration location work for "
64 "supervisor of class '"
65 << supervisorClass_ <<
"'" << __E__;
66 supervisorContextUID_ =
"NO CONTEXT ID IN WIZ MODE";
67 supervisorApplicationUID_ = std::to_string(application->getApplicationDescriptor()->getLocalId());
68 supervisorConfigurationPath_ =
"NO APP PATH IN WIZ MODE";
70 __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
71 __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
72 __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
77 __SUP_COUT__ <<
"Getting configuration specific info for supervisor '" << (allSupervisorInfo_.getSupervisorInfo(application).getName()) <<
"' of class "
78 << supervisorClass_ <<
"." << __E__;
84 __SUP_COUTV__(application->getApplicationContext()->getContextDescriptor()->getURL());
86 CorePropertySupervisorBase::supervisorContextUID_ =
87 theConfigurationManager_->__GET_CONFIG__(
XDAQContextTable)->getContextUID(application->getApplicationContext()->getContextDescriptor()->getURL());
88 if(CorePropertySupervisorBase::supervisorContextUID_ ==
"")
90 __SUP_SS__ <<
"Illegal empty Supervisor Context UID identified. Please try again or contact admins." << __E__;
96 __SUP_COUT_ERR__ <<
"XDAQ Supervisor could not access it's configuration through "
97 "the Configuration Manager."
98 <<
". The getApplicationContext()->getContextDescriptor()->getURL() = "
99 << application->getApplicationContext()->getContextDescriptor()->getURL() << __E__;
105 __SUP_COUTV__(application->getApplicationDescriptor()->getLocalId());
106 CorePropertySupervisorBase::supervisorApplicationUID_ = theConfigurationManager_->__GET_CONFIG__(
XDAQContextTable)
107 ->getApplicationUID(application->getApplicationContext()->getContextDescriptor()->getURL(),
108 application->getApplicationDescriptor()->getLocalId());
109 if(CorePropertySupervisorBase::supervisorApplicationUID_ ==
"")
111 __SUP_SS__ <<
"Illegal empty Supervisor Application UID identified. Please try again or contact admins." << __E__;
117 __SUP_COUT_ERR__ <<
"XDAQ Supervisor could not access it's configuration through "
118 "the Configuration Manager."
119 <<
" The supervisorContextUID_ = " << supervisorContextUID_ <<
". The supervisorApplicationUID = " << supervisorApplicationUID_
124 CorePropertySupervisorBase::supervisorConfigurationPath_ =
"/" + CorePropertySupervisorBase::supervisorContextUID_ +
"/LinkToApplicationTable/" +
125 CorePropertySupervisorBase::supervisorApplicationUID_ +
"/LinkToSupervisorTable";
127 __SUP_COUTV__(CorePropertySupervisorBase::supervisorContextUID_);
128 __SUP_COUTV__(CorePropertySupervisorBase::supervisorApplicationUID_);
129 __SUP_COUTV__(CorePropertySupervisorBase::supervisorConfigurationPath_);
144 StringMacros::systemVariables_[
"ActiveStateMachine"][
"name"] = StringMacros::TBD;
145 StringMacros::systemVariables_[
"ActiveStateMachine"][
"runAlias"] = StringMacros::TBD;
146 StringMacros::systemVariables_[
"ActiveStateMachine"][
"fileNameAlias"] = StringMacros::TBD;
148 __SUP_COUTV__(StringMacros::mapToString(StringMacros::systemVariables_));
150 CorePropertySupervisorBase::indicateOtsAlive(
this);
152 theConfigurationManager_->setOwnerContext(CorePropertySupervisorBase::supervisorContextUID_);
153 theConfigurationManager_->setOwnerApp(CorePropertySupervisorBase::supervisorApplicationUID_);
155 CorePropertySupervisorBase::isFirstAppInContext_ = theConfigurationManager_->isOwnerFirstAppInContext();
160 CorePropertySupervisorBase::~CorePropertySupervisorBase(
void)
162 __SUP_COUT__ <<
"Destructor." << __E__;
164 CorePropertySupervisorBase::indicateOtsDead(
this);
166 if(theConfigurationManager_)
167 delete theConfigurationManager_;
171 __SUP_COUT__ <<
"Destroying TRACE Controller..." << __E__;
175 __SUP_COUT__ <<
"Destructed." << __E__;
181 void CorePropertySupervisorBase::getAvailableDiskSpace()
183 if(!isFirstAppInContext_)
187 if(t - lastDiskSpaceCheckTime_ <= 10)
190 struct statvfs logStat;
191 if(statvfs((OTSDAQ_LOG_DIR +
"/").c_str(), &logStat) != 0)
193 __SUP_SS__ <<
"Disk space retrieval failed for log directory: " << OTSDAQ_LOG_DIR
197 uint64_t availableLogSpaceKB =
198 (uint64_t)logStat.f_bavail * logStat.f_frsize / 1024;
199 __SUP_COUTTV__(availableLogSpaceKB);
201 struct statvfs dataStat;
202 if(statvfs((OTSDAQ_DATA_DIR +
"/").c_str(), &dataStat) != 0)
204 __SUP_SS__ <<
"Disk space retrieval failed for data directory: "
205 << OTSDAQ_DATA_DIR << __E__;
208 uint64_t availableDataSpaceKB =
209 (uint64_t)dataStat.f_bavail * dataStat.f_frsize / 1024;
210 __SUP_COUTTV__(availableDataSpaceKB);
212 availableLogSpaceKB_ = availableLogSpaceKB;
213 availableDataSpaceKB_ = availableDataSpaceKB;
215 lastDiskSpaceCheckTime_ = time(0);
219 void CorePropertySupervisorBase::indicateOtsAlive(
222 char portStr[100] =
"0";
223 std::string hostname =
"wiz";
232 unsigned int port = properties->getContextTreeNode()
233 .
getNode(properties->supervisorContextUID_)
240 port = atoi(__ENV__(
"OTS_MAIN_PORT"));
242 sprintf(portStr,
"%u", port);
244 hostname = properties->getContextTreeNode()
245 .
getNode(properties->supervisorContextUID_)
248 if(hostname ==
"DEFAULT")
249 hostname =
"http://" + std::string(__ENV__(
"HOSTNAME"));
251 size_t i = hostname.find(
"//");
252 if(i != std::string::npos)
253 hostname = hostname.substr(i + 2);
259 std::string filename = std::string(__ENV__(
"OTSDAQ_LOG_DIR")) +
"/otsdaq_is_alive-" +
260 hostname +
"-" + portStr +
".dat";
261 FILE* fp = fopen(filename.c_str(),
"w");
264 __SS__ <<
"Failed to open the ots-is-alive file: " << filename << __E__;
267 fprintf(fp,
"%s %s %ld\n", hostname.c_str(), portStr, time(0));
270 __COUT__ <<
"Marked alive: " << filename << __E__;
274 void CorePropertySupervisorBase::indicateOtsDead(
277 char portStr[100] =
"0";
278 std::string hostname =
"wiz";
287 unsigned int port = properties->getContextTreeNode()
288 .
getNode(properties->supervisorContextUID_)
295 port = atoi(__ENV__(
"OTS_MAIN_PORT"));
297 sprintf(portStr,
"%u", port);
299 hostname = properties->getContextTreeNode()
300 .
getNode(properties->supervisorContextUID_)
303 if(hostname ==
"DEFAULT")
304 hostname =
"http://" + std::string(__ENV__(
"HOSTNAME"));
306 size_t i = hostname.find(
"//");
307 if(i != std::string::npos)
308 hostname = hostname.substr(i + 2);
314 std::string filename = std::string(__ENV__(
"OTSDAQ_LOG_DIR")) +
"/otsdaq_is_alive-" +
315 hostname +
"-" + portStr +
".dat";
316 FILE* fp = fopen(filename.c_str(),
"w");
319 __SS__ <<
"Failed to open the ots-is-alive file: " << filename << __E__;
324 __COUT__ <<
"Marked dead: " << filename << __E__;
329 XDAQ_CONST_CALL xdaq::ApplicationDescriptor*
332 if(allSupervisorInfo_.isMacroMakerMode())
335 return allSupervisorInfo_.
isWizardMode() ? allSupervisorInfo_.getWizardDescriptor()
336 : allSupervisorInfo_.getGatewayDescriptor();
353 CorePropertySupervisorBase::setSupervisorProperty(
354 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold,
356 CorePropertySupervisorBase::setSupervisorProperty(
357 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed,
"");
358 CorePropertySupervisorBase::setSupervisorProperty(
359 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed,
"");
361 CorePropertySupervisorBase::setSupervisorProperty(
362 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.CheckUserLockRequestTypes,
"");
363 CorePropertySupervisorBase::setSupervisorProperty(
364 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.RequireUserLockRequestTypes,
366 CorePropertySupervisorBase::setSupervisorProperty(
367 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AutomatedRequestTypes,
"");
368 CorePropertySupervisorBase::setSupervisorProperty(
369 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.AllowNoLoginRequestTypes,
"");
370 CorePropertySupervisorBase::setSupervisorProperty(
371 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.RequireSecurityRequestTypes,
374 CorePropertySupervisorBase::setSupervisorProperty(
375 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NoXmlWhiteSpaceRequestTypes,
377 CorePropertySupervisorBase::setSupervisorProperty(
378 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.NonXMLRequestTypes,
"");
401 const std::string& permissionsString,
402 std::map<std::string, WebUsers::permissionLevel_t>& permissionsMap)
404 permissionsMap.clear();
406 if(permissionsMap.size() == 0)
407 permissionsMap.emplace(std::pair<std::string, WebUsers::permissionLevel_t>(
408 WebUsers::DEFAULT_USER_GROUP,
409 atoi(permissionsString.c_str()))
432 std::map<std::string, WebUsers::permissionLevel_t>& permissionLevelsMap,
433 std::map<std::string, WebUsers::permissionLevel_t>& permissionThresholdsMap)
442 for(
const auto& permissionLevelGroupPair : permissionLevelsMap)
447 for(
const auto& permissionThresholdGroupPair : permissionThresholdsMap)
451 if(permissionLevelGroupPair.first == permissionThresholdGroupPair.first &&
452 permissionThresholdGroupPair.second &&
453 permissionLevelGroupPair.second >= permissionThresholdGroupPair.second)
466 void CorePropertySupervisorBase::checkSupervisorPropertySetup()
468 if(propertiesAreSetup_)
474 propertiesAreSetup_ =
true;
476 __SUP_COUTT__ <<
"Setting up supervisor specific property DEFAULTS for supervisor..."
485 <<
"Done setting up supervisor specific property DEFAULTS for supervisor."
489 __SUP_COUT__ <<
"Wiz mode detected. Skipping setup of supervisor properties for "
490 "supervisor of class '"
491 << supervisorClass_ <<
"'" << __E__;
492 else if(allSupervisorInfo_.isMacroMakerMode())
494 <<
"Maker Maker mode detected. Skipping setup of supervisor properties for "
495 "supervisor of class '"
496 << supervisorClass_ <<
"'" << __E__;
502 readOnly_ = getSupervisorProperty(
"ReadOnly",
"0") ==
"1" ? true :
false;
503 __SUP_COUTV__(readOnly_);
505 __SUP_COUTT__ <<
"Setting up supervisor specific FORCED properties for supervisor..."
509 <<
"Done setting up supervisor specific FORCED properties for supervisor."
513 getSupervisorProperty(
514 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserPermissionsThreshold),
515 propertyStruct_.UserPermissionsThreshold);
517 propertyStruct_.UserGroupsAllowed.clear();
519 getSupervisorProperty(
520 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsAllowed),
521 propertyStruct_.UserGroupsAllowed);
523 propertyStruct_.UserGroupsDisallowed.clear();
525 getSupervisorProperty(
526 CorePropertySupervisorBase::SUPERVISOR_PROPERTIES.UserGroupsDisallowed),
527 propertyStruct_.UserGroupsDisallowed);
529 auto nameIt = SUPERVISOR_PROPERTIES.allSetNames_.begin();
530 auto setIt = propertyStruct_.allSets_.begin();
531 while(nameIt != SUPERVISOR_PROPERTIES.allSetNames_.end() &&
532 setIt != propertyStruct_.allSets_.end())
541 __SUP_COUT__ <<
"Final supervisor property settings:" << __E__;
542 for(
auto& property : propertyMap_)
543 __SUP_COUT__ <<
"\t" <<
property.first <<
" = " <<
property.second << __E__;
552 if(supervisorContextUID_ ==
"" || supervisorApplicationUID_ ==
"")
554 __SUP_SS__ <<
"Empty supervisorContextUID_ or supervisorApplicationUID_."
558 return theConfigurationManager_->getSupervisorNode(supervisorContextUID_,
559 supervisorApplicationUID_);
564 <<
"XDAQ Supervisor could not access it's configuration node through "
565 "theConfigurationManager_ "
566 <<
"(Did you remember to initialize using CorePropertySupervisorBase::init()?)."
567 <<
" The supervisorContextUID_ = " << supervisorContextUID_
568 <<
". The supervisorApplicationUID = " << supervisorApplicationUID_ << __E__;
587 supervisorNode.getNode(
"LinkToPropertyTable").getChildren();
589 for(
auto& child : children)
591 if(!child.second.status())
594 auto propertyName = child.second.getNode(
"PropertyName").getValue();
595 setSupervisorProperty(
597 child.second.getNode(
"PropertyValue").getValue<std::string>());
602 __SUP_COUT__ <<
"No user supervisor property settings found in the configuration "
603 "tree, going with the defaults."
613 void CorePropertySupervisorBase::setSupervisorProperty(
const std::string& propertyName,
614 const std::string& propertyValue)
616 propertyMap_[propertyName] = propertyValue;
622 void CorePropertySupervisorBase::addSupervisorProperty(
const std::string& propertyName,
623 const std::string& propertyValue)
625 propertyMap_[propertyName] =
626 propertyValue +
" | " + getSupervisorProperty(propertyName);
634 std::string CorePropertySupervisorBase::getSupervisorProperty(
635 const std::string& propertyName)
638 checkSupervisorPropertySetup();
640 auto it = propertyMap_.find(propertyName);
641 if(it == propertyMap_.end())
643 __SUP_SS__ <<
"Could not find property named " << propertyName << __E__;
651 std::string CorePropertySupervisorBase::getSupervisorProperty(
652 const std::string& propertyName,
const std::string& defaultValue)
655 checkSupervisorPropertySetup();
657 auto it = propertyMap_.find(propertyName);
658 if(it == propertyMap_.end())
669 WebUsers::permissionLevel_t
671 const std::string& requestType)
674 checkSupervisorPropertySetup();
677 requestType, propertyStruct_.UserPermissionsThreshold);
685 checkSupervisorPropertySetup();
687 __SUP_COUT_TYPE__(TLVL_DEBUG + 20)
688 << __COUT_HDR__ <<
"userInfo.requestType_ " << userInfo.requestType_ << __E__;
690 __SUP_COUT_TYPE__(TLVL_DEBUG + 20)
691 << __COUT_HDR__ <<
"propertyStruct_.AutomatedRequestTypes "
694 userInfo.requestType_,
695 propertyStruct_.AutomatedRequestTypes);
699 __SUP_COUT_TYPE__(TLVL_DEBUG + 21)
700 << __COUT_HDR__ <<
"propertyStruct_.NonXMLRequestTypes "
703 userInfo.requestType_, propertyStruct_.NonXMLRequestTypes);
708 __SUP_COUT_TYPE__(TLVL_DEBUG + 21)
709 << __COUT_HDR__ <<
"propertyStruct_.NoXmlWhiteSpaceRequestTypes "
713 userInfo.requestType_, propertyStruct_.NoXmlWhiteSpaceRequestTypes);
718 __SUP_COUT_TYPE__(TLVL_DEBUG + 20)
719 << __COUT_HDR__ <<
"propertyStruct_.CheckUserLockRequestTypes "
723 userInfo.requestType_, propertyStruct_.CheckUserLockRequestTypes);
724 __SUP_COUT_TYPE__(TLVL_DEBUG + 20)
725 << __COUT_HDR__ <<
"propertyStruct_.RequireUserLockRequestTypes "
729 userInfo.requestType_, propertyStruct_.RequireUserLockRequestTypes);
730 if(userInfo.requireLock_ && userInfo.automatedCommand_)
732 __SUP_COUTT__ <<
"Overriding requireLock_ because request '"
733 << userInfo.requestType_ <<
"' marked as automatedCommand_"
735 userInfo.requireLock_ =
false;
738 __SUP_COUT_TYPE__(TLVL_DEBUG + 21)
739 << __COUT_HDR__ <<
"propertyStruct_.AllowNoLoginRequestTypes "
743 userInfo.requestType_, propertyStruct_.AllowNoLoginRequestTypes);
744 __SUP_COUT_TYPE__(TLVL_DEBUG + 21)
745 << __COUT_HDR__ <<
"propertyStruct_.RequireSecurityRequestTypes "
749 userInfo.requestType_, propertyStruct_.RequireSecurityRequestTypes);
751 userInfo.permissionsThreshold_ = -1;
754 userInfo.permissionsThreshold_ =
756 userInfo.requestType_);
758 catch(std::runtime_error& e)
760 if(!userInfo.automatedCommand_)
761 __SUP_COUT__ <<
"No explicit permissions threshold for request '"
762 << userInfo.requestType_
763 <<
"'... Defaulting to max threshold = "
764 << (
unsigned int)userInfo.permissionsThreshold_ << __E__;
767 __SUP_COUTVS__(20, userInfo.requestType_);
768 __SUP_COUTVS__(20, userInfo.checkLock_);
769 __SUP_COUTVS__(20, userInfo.requireLock_);
770 __SUP_COUTVS__(20, userInfo.allowNoUser_);
771 __SUP_COUTVS__(20, userInfo.automatedCommand_);
772 __SUP_COUTVS__(20, userInfo.automatedCommand_);
773 __SUP_COUTVS__(20, (
unsigned int)userInfo.permissionsThreshold_);
779 propertyStruct_.UserGroupsAllowed),
780 userInfo.groupsAllowed_);
782 catch(std::runtime_error& e)
784 userInfo.groupsAllowed_.clear();
785 if(!userInfo.automatedCommand_)
786 __SUP_COUT_TYPE__(TLVL_DEBUG + 25)
787 << __COUT_HDR__ <<
"No explicit groups allowed for request '"
788 << userInfo.requestType_
789 <<
"'... Defaulting to empty groups allowed. " << __E__;
795 userInfo.requestType_, propertyStruct_.UserGroupsDisallowed),
796 userInfo.groupsDisallowed_);
798 catch(std::runtime_error& e)
800 userInfo.groupsDisallowed_.clear();
802 if(!userInfo.automatedCommand_)
803 __SUP_COUT_TYPE__(TLVL_DEBUG + 25)
804 << __COUT_HDR__ <<
"No explicit groups disallowed for request '"
805 << userInfo.requestType_
806 <<
"'... Defaulting to empty groups disallowed. " << __E__;
814 xoap::MessageReference CorePropertySupervisorBase::TRACESupervisorRequest(
815 xoap::MessageReference message)
817 __SUP_COUT__ <<
"$$$$$$$$$$$$$$$$$" << __E__;
821 parameters.addParameter(
"Request");
823 __SUP_COUT__ <<
"Received TRACE message: " << SOAPUtilities::translate(message)
826 SOAPUtilities::receive(message, parameters);
827 std::string request = parameters.getValue(
"Request");
829 __SUP_COUT__ <<
"request: " << request << __E__;
838 if(request ==
"GetTraceLevels")
840 retParameters.addParameter(
"TRACEList", getTraceLevels());
841 retParameters.addParameter(
"TRACEHostnameList", traceReturnHostString_);
842 return SOAPUtilities::makeSOAPMessageReference(
843 supervisorClassNoNamespace_ +
"Response", retParameters);
845 else if(request ==
"SetTraceLevels")
847 parameters.addParameter(
"IndividualValues");
848 parameters.addParameter(
"Host");
849 parameters.addParameter(
"SetMode");
850 parameters.addParameter(
"Labels");
851 parameters.addParameter(
"SetValueMSB");
852 parameters.addParameter(
"SetValueLSB");
853 SOAPUtilities::receive(message, parameters);
855 int individualValues = parameters.getValueAsInt(
"IndividualValues");
856 std::string host = parameters.getValue(
"Host");
857 std::string setMode = parameters.getValue(
"SetMode");
858 std::string labelsStr = parameters.getValue(
"Labels");
859 int setValueMSB = parameters.getValueAsInt(
"SetValueMSB");
860 int setValueLSB = parameters.getValueAsInt(
"SetValueLSB");
861 __SUP_COUTV__(individualValues);
863 __SUP_COUTV__(setMode);
864 __SUP_COUTV__(setValueMSB);
865 __SUP_COUTV__(setValueLSB);
866 __SUP_COUTV__(labelsStr);
869 retParameters.addParameter(
870 "TRACEList", setIndividualTraceLevels(host, setMode, labelsStr));
872 retParameters.addParameter(
874 setTraceLevels(host, setMode, labelsStr, setValueMSB, setValueLSB));
875 return SOAPUtilities::makeSOAPMessageReference(
876 supervisorClassNoNamespace_ +
"Response", retParameters);
878 else if(request ==
"GetTriggerStatus")
880 retParameters.addParameter(
"TRACETriggerStatus", getTraceTriggerStatus());
881 return SOAPUtilities::makeSOAPMessageReference(
882 supervisorClassNoNamespace_ +
"Response", retParameters);
884 else if(request ==
"SetTriggerEnable")
886 parameters.addParameter(
"Host");
887 parameters.addParameter(
"EntriesAfterTrigger");
888 SOAPUtilities::receive(message, parameters);
890 std::string host = parameters.getValue(
"Host");
891 int entriesAfterTrigger = parameters.getValueAsInt(
"EntriesAfterTrigger");
893 __SUP_COUTV__(entriesAfterTrigger);
894 retParameters.addParameter(
"TRACETriggerStatus",
895 setTraceTriggerEnable(host, entriesAfterTrigger));
896 return SOAPUtilities::makeSOAPMessageReference(
897 supervisorClassNoNamespace_ +
"Response", retParameters);
899 else if(request ==
"ResetTRACE")
901 parameters.addParameter(
"Host");
902 SOAPUtilities::receive(message, parameters);
904 std::string host = parameters.getValue(
"Host");
906 retParameters.addParameter(
"TRACETriggerStatus", resetTRACE(host));
907 return SOAPUtilities::makeSOAPMessageReference(
908 supervisorClassNoNamespace_ +
"Response", retParameters);
910 else if(request ==
"EnableTRACE")
912 parameters.addParameter(
"Host");
913 parameters.addParameter(
"SetEnable");
914 SOAPUtilities::receive(message, parameters);
916 std::string host = parameters.getValue(
"Host");
917 bool enable = parameters.getValueAsInt(
"SetEnable") ? true :
false;
919 __SUP_COUTV__(enable);
921 retParameters.addParameter(
"TRACETriggerStatus", enableTRACE(host, enable));
922 return SOAPUtilities::makeSOAPMessageReference(
923 supervisorClassNoNamespace_ +
"Response", retParameters);
925 else if(request ==
"GetSnapshot")
927 parameters.addParameter(
"Host");
928 parameters.addParameter(
"FilterForCSV");
929 parameters.addParameter(
"FilterOutCSV");
930 SOAPUtilities::receive(message, parameters);
932 std::string host = parameters.getValue(
"Host");
933 std::string filterFor = parameters.getValue(
"FilterForCSV");
934 std::string filterOut = parameters.getValue(
"FilterOutCSV");
936 __SUP_COUTV__(filterFor);
937 __SUP_COUTV__(filterOut);
938 retParameters.addParameter(
"TRACESnapshot",
939 getTraceSnapshot(host, filterFor, filterOut));
940 retParameters.addParameter(
"TRACETriggerStatus", getTraceTriggerStatus());
941 return SOAPUtilities::makeSOAPMessageReference(
942 supervisorClassNoNamespace_ +
"Response", retParameters);
946 __SUP_SS__ <<
"Unrecognized request received! '" << request <<
"'" << __E__;
950 catch(
const std::runtime_error& e)
952 __SUP_SS__ <<
"Error occurred handling request: " << e.what() << __E__;
953 __SUP_COUT_ERR__ << ss.str();
954 retParameters.addParameter(
"Error", ss.str());
958 __SUP_SS__ <<
"Error occurred handling request." << __E__;
963 catch(
const std::exception& e)
965 ss <<
"Exception message: " << e.what();
970 __SUP_COUT_ERR__ << ss.str();
971 retParameters.addParameter(
"Error", ss.str());
974 return SOAPUtilities::makeSOAPMessageReference(
"TRACEFault", retParameters);
979 const std::string& CorePropertySupervisorBase::getTraceLevels()
981 __SUP_COUT__ <<
"getTraceLevels()" << __E__;
983 traceReturnString_ =
"";
984 traceReturnHostString_ =
"";
988 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
993 ITRACEController::HostTraceLevelMap traceHostMap =
995 for(
const auto& traceMap : traceHostMap)
1002 traceReturnHostString_ =
";" + traceMap.first;
1003 traceReturnString_ +=
";" + traceMap.first;
1005 for(
const auto& traceMask : traceMap.second)
1010 traceReturnString_ +=
1011 "," + traceMask.first +
1012 ",M:" + std::to_string((
unsigned int)(traceMask.second.M >> 32)) +
":" +
1013 std::to_string((
unsigned int)traceMask.second.M) +
1014 ":S:" + std::to_string((
unsigned int)(traceMask.second.S >> 32)) +
":" +
1015 std::to_string((
unsigned int)traceMask.second.S) +
1016 ":T:" + std::to_string((
unsigned int)(traceMask.second.T >> 32)) +
":" +
1017 std::to_string((
unsigned int)traceMask.second.T);
1020 __SUP_COUT__ <<
"end getTraceLevels()" << __E__;
1021 return traceReturnString_;
1025 const std::string& CorePropertySupervisorBase::setTraceLevels(
1026 std::string
const& host,
1027 std::string
const& mode,
1028 std::string
const& labelsStr,
1029 uint32_t setValueMSB,
1030 uint32_t setValueLSB)
1032 __SUP_COUT__ <<
"setTraceLevels()" << __E__;
1036 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1041 bool allMode = mode ==
"ALL";
1042 if(allMode || mode ==
"FAST")
1043 setMask.M = ((uint64_t(setValueMSB)) << 32) | (uint64_t(uint32_t(setValueLSB)));
1044 if(allMode || mode ==
"SLOW")
1045 setMask.S = ((uint64_t(setValueMSB)) << 32) | (uint64_t(uint32_t(setValueLSB)));
1046 if(allMode || mode ==
"TRIGGER")
1047 setMask.T = ((uint64_t(setValueMSB)) << 32) | (uint64_t(uint32_t(setValueLSB)));
1049 std::vector<std::string > labels;
1051 for(
const auto& label : labels)
1053 __SUP_COUTV__(label);
1057 __SUP_COUT__ <<
"end setTraceLevels()" << __E__;
1058 return getTraceLevels();
1062 const std::string& CorePropertySupervisorBase::setIndividualTraceLevels(
1063 std::string
const& host, std::string
const& mode, std::string
const& labelValuesStr)
1065 __SUP_COUT__ <<
"setIndividualTraceLevels()" << __E__;
1069 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1074 bool allMode = mode ==
"ALL";
1075 bool fastMode = mode ==
"FAST";
1076 bool slowMode = mode ==
"SLOW";
1077 bool triggerMode = mode ==
"TRIGGER";
1079 std::vector<std::string > labelValues;
1081 for(
unsigned int i = 0; i < labelValues.size(); i += 3 )
1083 __SUP_COUT__ <<
"Label = " << labelValues[i] <<
" msb/lsb " << labelValues[i + 1]
1084 <<
"/" << labelValues[i + 2] << __E__;
1086 if(allMode || fastMode)
1087 setMask.M = ((uint64_t(atoi(labelValues[i + 1].c_str()))) << 32) |
1088 (uint64_t(uint32_t(atoi(labelValues[i + 2].c_str()))));
1089 if(allMode || slowMode)
1090 setMask.S = ((uint64_t(atoi(labelValues[i + 1].c_str()))) << 32) |
1091 (uint64_t(uint32_t(atoi(labelValues[i + 2].c_str()))));
1092 if(allMode || triggerMode)
1093 setMask.T = ((uint64_t(atoi(labelValues[i + 1].c_str()))) << 32) |
1094 (uint64_t(uint32_t(atoi(labelValues[i + 2].c_str()))));
1099 __SUP_COUT__ <<
"end setIndividualTraceLevels()" << __E__;
1100 return getTraceLevels();
1104 const std::string& CorePropertySupervisorBase::getTraceTriggerStatus()
1106 __SUP_COUT__ <<
"getTraceTriggerStatus()" << __E__;
1108 traceReturnString_ =
"";
1112 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1117 traceReturnString_ +=
1120 __SUP_COUT__ <<
"end getTraceTriggerStatus() " << traceReturnString_ << __E__;
1121 return traceReturnString_;
1125 const std::string& CorePropertySupervisorBase::setTraceTriggerEnable(
1126 std::string
const& host,
size_t entriesAfterTrigger)
1128 __SUP_COUT__ <<
"setTraceTriggerEnable() " << host << __E__;
1132 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1136 __SUP_COUT__ <<
"end setTraceTriggerEnable()" << __E__;
1137 return getTraceTriggerStatus();
1141 const std::string& CorePropertySupervisorBase::resetTRACE(std::string
const& host)
1143 __SUP_COUT__ <<
"resetTRACE() " << host << __E__;
1147 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1152 __SUP_COUT__ <<
"end resetTRACE()" << __E__;
1153 return getTraceTriggerStatus();
1157 const std::string& CorePropertySupervisorBase::enableTRACE(std::string
const& host,
1160 __SUP_COUT__ <<
"enableTRACE() " << host <<
" " << enable << __E__;
1164 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1168 __SUP_COUT__ <<
"end enableTRACE()" << __E__;
1169 return getTraceTriggerStatus();
1173 const std::string& CorePropertySupervisorBase::getTraceSnapshot(
1174 std::string
const& host, std::string
const& filterFor, std::string
const& filterOut)
1176 __SUP_COUT__ <<
"getTraceSnapshot()" << host << __E__;
1178 traceReturnString_ =
"";
1182 __SUP_COUT__ <<
"No TRACE Controller found, constructing!" << __E__;
1189 const size_t MAX_SZ = 200000;
1190 if(traceReturnString_.size() > MAX_SZ)
1192 __SUP_COUT__ <<
"Truncating from " << traceReturnString_.size() <<
" to "
1194 traceReturnString_.resize(MAX_SZ);
1195 traceReturnString_ +=
"\n...TRUNCATED";
1197 else if(traceReturnString_.size() == 0)
1199 __SUP_COUT__ <<
"Empty snapshot" << __E__;
1200 traceReturnString_ =
"Empty TRACE snapshot.";
1202 __SUP_COUT__ <<
"end getTraceSnapshot() Bytes = " << traceReturnString_.size()
1204 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 ~