mirror of
				https://github.com/Icinga/icinga2.git
				synced 2025-10-31 19:24:25 +01:00 
			
		
		
		
	Cluster-sync Notification#last_notified_state_per_user
This commit is contained in:
		
							parent
							
								
									66ba9f446a
								
							
						
					
					
						commit
						0ae2bdc444
					
				| @ -1514,6 +1514,42 @@ Message updates will be dropped when: | |||||||
| * Notification does not exist. | * Notification does not exist. | ||||||
| * Origin endpoint's zone is not allowed to access this checkable. | * Origin endpoint's zone is not allowed to access this checkable. | ||||||
| 
 | 
 | ||||||
|  | #### event::UpdateLastNotifiedStatePerUser <a id="technical-concepts-json-rpc-messages-event-updatelastnotifiedstateperuser"></a> | ||||||
|  | 
 | ||||||
|  | > Location: `clusterevents.cpp` | ||||||
|  | 
 | ||||||
|  | ##### Message Body | ||||||
|  | 
 | ||||||
|  | Key       | Value | ||||||
|  | ----------|--------- | ||||||
|  | jsonrpc   | 2.0 | ||||||
|  | method    | event::UpdateLastNotifiedStatePerUser | ||||||
|  | params    | Dictionary | ||||||
|  | 
 | ||||||
|  | ##### Params | ||||||
|  | 
 | ||||||
|  | Key          | Type   | Description | ||||||
|  | -------------|--------|------------------ | ||||||
|  | notification | String | Notification name | ||||||
|  | user         | String | User name | ||||||
|  | state        | Number | Checkable state the user just got a problem notification for | ||||||
|  | 
 | ||||||
|  | Used to sync the state of a notification object within the same HA zone. | ||||||
|  | 
 | ||||||
|  | ##### Functions | ||||||
|  | 
 | ||||||
|  | Event Sender: `Notification::OnLastNotifiedStatePerUserUpdated` | ||||||
|  | Event Receiver: `LastNotifiedStatePerUserUpdatedAPIHandler` | ||||||
|  | 
 | ||||||
|  | ##### Permissions | ||||||
|  | 
 | ||||||
|  | The receiver will not process messages from not configured endpoints. | ||||||
|  | 
 | ||||||
|  | Message updates will be dropped when: | ||||||
|  | 
 | ||||||
|  | * Notification does not exist. | ||||||
|  | * Origin endpoint is not within the local zone. | ||||||
|  | 
 | ||||||
| #### event::SetForceNextCheck <a id="technical-concepts-json-rpc-messages-event-setforcenextcheck"></a> | #### event::SetForceNextCheck <a id="technical-concepts-json-rpc-messages-event-setforcenextcheck"></a> | ||||||
| 
 | 
 | ||||||
| > Location: `clusterevents.cpp` | > Location: `clusterevents.cpp` | ||||||
|  | |||||||
| @ -29,6 +29,7 @@ REGISTER_APIFUNCTION(SetStateBeforeSuppression, event, &ClusterEvents::StateBefo | |||||||
| REGISTER_APIFUNCTION(SetSuppressedNotifications, event, &ClusterEvents::SuppressedNotificationsChangedAPIHandler); | REGISTER_APIFUNCTION(SetSuppressedNotifications, event, &ClusterEvents::SuppressedNotificationsChangedAPIHandler); | ||||||
| REGISTER_APIFUNCTION(SetSuppressedNotificationTypes, event, &ClusterEvents::SuppressedNotificationTypesChangedAPIHandler); | REGISTER_APIFUNCTION(SetSuppressedNotificationTypes, event, &ClusterEvents::SuppressedNotificationTypesChangedAPIHandler); | ||||||
| REGISTER_APIFUNCTION(SetNextNotification, event, &ClusterEvents::NextNotificationChangedAPIHandler); | REGISTER_APIFUNCTION(SetNextNotification, event, &ClusterEvents::NextNotificationChangedAPIHandler); | ||||||
|  | REGISTER_APIFUNCTION(UpdateLastNotifiedStatePerUser, event, &ClusterEvents::LastNotifiedStatePerUserUpdatedAPIHandler); | ||||||
| REGISTER_APIFUNCTION(SetForceNextCheck, event, &ClusterEvents::ForceNextCheckChangedAPIHandler); | REGISTER_APIFUNCTION(SetForceNextCheck, event, &ClusterEvents::ForceNextCheckChangedAPIHandler); | ||||||
| REGISTER_APIFUNCTION(SetForceNextNotification, event, &ClusterEvents::ForceNextNotificationChangedAPIHandler); | REGISTER_APIFUNCTION(SetForceNextNotification, event, &ClusterEvents::ForceNextNotificationChangedAPIHandler); | ||||||
| REGISTER_APIFUNCTION(SetAcknowledgement, event, &ClusterEvents::AcknowledgementSetAPIHandler); | REGISTER_APIFUNCTION(SetAcknowledgement, event, &ClusterEvents::AcknowledgementSetAPIHandler); | ||||||
| @ -50,6 +51,7 @@ void ClusterEvents::StaticInitialize() | |||||||
| 	Checkable::OnSuppressedNotificationsChanged.connect(&ClusterEvents::SuppressedNotificationsChangedHandler); | 	Checkable::OnSuppressedNotificationsChanged.connect(&ClusterEvents::SuppressedNotificationsChangedHandler); | ||||||
| 	Notification::OnSuppressedNotificationsChanged.connect(&ClusterEvents::SuppressedNotificationTypesChangedHandler); | 	Notification::OnSuppressedNotificationsChanged.connect(&ClusterEvents::SuppressedNotificationTypesChangedHandler); | ||||||
| 	Notification::OnNextNotificationChanged.connect(&ClusterEvents::NextNotificationChangedHandler); | 	Notification::OnNextNotificationChanged.connect(&ClusterEvents::NextNotificationChangedHandler); | ||||||
|  | 	Notification::OnLastNotifiedStatePerUserUpdated.connect(&ClusterEvents::LastNotifiedStatePerUserUpdatedHandler); | ||||||
| 	Checkable::OnForceNextCheckChanged.connect(&ClusterEvents::ForceNextCheckChangedHandler); | 	Checkable::OnForceNextCheckChanged.connect(&ClusterEvents::ForceNextCheckChangedHandler); | ||||||
| 	Checkable::OnForceNextNotificationChanged.connect(&ClusterEvents::ForceNextNotificationChangedHandler); | 	Checkable::OnForceNextNotificationChanged.connect(&ClusterEvents::ForceNextNotificationChangedHandler); | ||||||
| 	Checkable::OnNotificationsRequested.connect(&ClusterEvents::SendNotificationsHandler); | 	Checkable::OnNotificationsRequested.connect(&ClusterEvents::SendNotificationsHandler); | ||||||
| @ -529,6 +531,64 @@ Value ClusterEvents::NextNotificationChangedAPIHandler(const MessageOrigin::Ptr& | |||||||
| 	return Empty; | 	return Empty; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void ClusterEvents::LastNotifiedStatePerUserUpdatedHandler(const Notification::Ptr& notification, const String& user, uint_fast8_t state, const MessageOrigin::Ptr& origin) | ||||||
|  | { | ||||||
|  | 	auto listener (ApiListener::GetInstance()); | ||||||
|  | 
 | ||||||
|  | 	if (!listener) { | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	Dictionary::Ptr params = new Dictionary(); | ||||||
|  | 	params->Set("notification", notification->GetName()); | ||||||
|  | 	params->Set("user", user); | ||||||
|  | 	params->Set("state", state); | ||||||
|  | 
 | ||||||
|  | 	Dictionary::Ptr message = new Dictionary(); | ||||||
|  | 	message->Set("jsonrpc", "2.0"); | ||||||
|  | 	message->Set("method", "event::UpdateLastNotifiedStatePerUser"); | ||||||
|  | 	message->Set("params", params); | ||||||
|  | 
 | ||||||
|  | 	listener->RelayMessage(origin, notification, message, true); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Value ClusterEvents::LastNotifiedStatePerUserUpdatedAPIHandler(const MessageOrigin::Ptr& origin, const Dictionary::Ptr& params) | ||||||
|  | { | ||||||
|  | 	auto endpoint (origin->FromClient->GetEndpoint()); | ||||||
|  | 
 | ||||||
|  | 	if (!endpoint) { | ||||||
|  | 		Log(LogNotice, "ClusterEvents") | ||||||
|  | 			<< "Discarding 'last notified state of user updated' message from '" << origin->FromClient->GetIdentity() << "': Invalid endpoint origin (client not allowed)."; | ||||||
|  | 
 | ||||||
|  | 		return Empty; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (origin->FromZone && origin->FromZone != Zone::GetLocalZone()) { | ||||||
|  | 		Log(LogNotice, "ClusterEvents") | ||||||
|  | 			<< "Discarding 'last notified state of user updated' message from '" | ||||||
|  | 			<< origin->FromClient->GetIdentity() << "': Unauthorized access."; | ||||||
|  | 
 | ||||||
|  | 		return Empty; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	auto notification (Notification::GetByName(params->Get("notification"))); | ||||||
|  | 
 | ||||||
|  | 	if (!notification) { | ||||||
|  | 		return Empty; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	auto state (params->Get("state")); | ||||||
|  | 
 | ||||||
|  | 	if (!state.IsNumber()) { | ||||||
|  | 		return Empty; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	notification->GetLastNotifiedStatePerUser()->Set(params->Get("user"), state); | ||||||
|  | 	Notification::OnLastNotifiedStatePerUserUpdated(notification, params->Get("user"), state, origin); | ||||||
|  | 
 | ||||||
|  | 	return Empty; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void ClusterEvents::ForceNextCheckChangedHandler(const Checkable::Ptr& checkable, const MessageOrigin::Ptr& origin) | void ClusterEvents::ForceNextCheckChangedHandler(const Checkable::Ptr& checkable, const MessageOrigin::Ptr& origin) | ||||||
| { | { | ||||||
| 	ApiListener::Ptr listener = ApiListener::GetInstance(); | 	ApiListener::Ptr listener = ApiListener::GetInstance(); | ||||||
|  | |||||||
| @ -41,6 +41,9 @@ public: | |||||||
| 	static void NextNotificationChangedHandler(const Notification::Ptr& notification, const MessageOrigin::Ptr& origin); | 	static void NextNotificationChangedHandler(const Notification::Ptr& notification, const MessageOrigin::Ptr& origin); | ||||||
| 	static Value NextNotificationChangedAPIHandler(const MessageOrigin::Ptr& origin, const Dictionary::Ptr& params); | 	static Value NextNotificationChangedAPIHandler(const MessageOrigin::Ptr& origin, const Dictionary::Ptr& params); | ||||||
| 
 | 
 | ||||||
|  | 	static void LastNotifiedStatePerUserUpdatedHandler(const Notification::Ptr& notification, const String& user, uint_fast8_t state, const MessageOrigin::Ptr& origin); | ||||||
|  | 	static Value LastNotifiedStatePerUserUpdatedAPIHandler(const MessageOrigin::Ptr& origin, const Dictionary::Ptr& params); | ||||||
|  | 
 | ||||||
| 	static void ForceNextCheckChangedHandler(const Checkable::Ptr& checkable, const MessageOrigin::Ptr& origin); | 	static void ForceNextCheckChangedHandler(const Checkable::Ptr& checkable, const MessageOrigin::Ptr& origin); | ||||||
| 	static Value ForceNextCheckChangedAPIHandler(const MessageOrigin::Ptr& origin, const Dictionary::Ptr& params); | 	static Value ForceNextCheckChangedAPIHandler(const MessageOrigin::Ptr& origin, const Dictionary::Ptr& params); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -23,6 +23,7 @@ std::map<String, int> Notification::m_StateFilterMap; | |||||||
| std::map<String, int> Notification::m_TypeFilterMap; | std::map<String, int> Notification::m_TypeFilterMap; | ||||||
| 
 | 
 | ||||||
| boost::signals2::signal<void (const Notification::Ptr&, const MessageOrigin::Ptr&)> Notification::OnNextNotificationChanged; | boost::signals2::signal<void (const Notification::Ptr&, const MessageOrigin::Ptr&)> Notification::OnNextNotificationChanged; | ||||||
|  | boost::signals2::signal<void (const Notification::Ptr&, const String&, uint_fast8_t, const MessageOrigin::Ptr&)> Notification::OnLastNotifiedStatePerUserUpdated; | ||||||
| 
 | 
 | ||||||
| String NotificationNameComposer::MakeName(const String& shortName, const Object::Ptr& context) const | String NotificationNameComposer::MakeName(const String& shortName, const Object::Ptr& context) const | ||||||
| { | { | ||||||
| @ -456,7 +457,12 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe | |||||||
| 			case NotificationProblem: | 			case NotificationProblem: | ||||||
| 			case NotificationRecovery: { | 			case NotificationRecovery: { | ||||||
| 				auto [host, service] = GetHostService(checkable); | 				auto [host, service] = GetHostService(checkable); | ||||||
| 				GetLastNotifiedStatePerUser()->Set(userName, service ? service->GetState() : host->GetState()); | 				uint_fast8_t state = service ? service->GetState() : host->GetState(); | ||||||
|  | 
 | ||||||
|  | 				if (state != (uint_fast8_t)GetLastNotifiedStatePerUser()->Get(userName)) { | ||||||
|  | 					GetLastNotifiedStatePerUser()->Set(userName, state); | ||||||
|  | 					OnLastNotifiedStatePerUserUpdated(this, userName, state, nullptr); | ||||||
|  | 				} | ||||||
| 			} | 			} | ||||||
| 			default: | 			default: | ||||||
| 				; | 				; | ||||||
|  | |||||||
| @ -13,6 +13,7 @@ | |||||||
| #include "remote/endpoint.hpp" | #include "remote/endpoint.hpp" | ||||||
| #include "remote/messageorigin.hpp" | #include "remote/messageorigin.hpp" | ||||||
| #include "base/array.hpp" | #include "base/array.hpp" | ||||||
|  | #include <cstdint> | ||||||
| 
 | 
 | ||||||
| namespace icinga | namespace icinga | ||||||
| { | { | ||||||
| @ -92,6 +93,7 @@ public: | |||||||
| 	static String NotificationHostStateToString(HostState state); | 	static String NotificationHostStateToString(HostState state); | ||||||
| 
 | 
 | ||||||
| 	static boost::signals2::signal<void (const Notification::Ptr&, const MessageOrigin::Ptr&)> OnNextNotificationChanged; | 	static boost::signals2::signal<void (const Notification::Ptr&, const MessageOrigin::Ptr&)> OnNextNotificationChanged; | ||||||
|  | 	static boost::signals2::signal<void (const Notification::Ptr&, const String&, uint_fast8_t, const MessageOrigin::Ptr&)> OnLastNotifiedStatePerUserUpdated; | ||||||
| 
 | 
 | ||||||
| 	void Validate(int types, const ValidationUtils& utils) override; | 	void Validate(int types, const ValidationUtils& utils) override; | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user