]> granicus.if.org Git - icinga2/blob - lib/icinga/checkable.hpp
Fix notify flag is ignored in ACKNOWLEDGE_*_PROBLEM commands
[icinga2] / lib / icinga / checkable.hpp
1 /******************************************************************************
2  * Icinga 2                                                                   *
3  * Copyright (C) 2012-2015 Icinga Development Team (http://www.icinga.org)    *
4  *                                                                            *
5  * This program is free software; you can redistribute it and/or              *
6  * modify it under the terms of the GNU General Public License                *
7  * as published by the Free Software Foundation; either version 2             *
8  * of the License, or (at your option) any later version.                     *
9  *                                                                            *
10  * This program is distributed in the hope that it will be useful,            *
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *
13  * GNU General Public License for more details.                               *
14  *                                                                            *
15  * You should have received a copy of the GNU General Public License          *
16  * along with this program; if not, write to the Free Software Foundation     *
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.             *
18  ******************************************************************************/
19
20 #ifndef CHECKABLE_H
21 #define CHECKABLE_H
22
23 #include "icinga/i2-icinga.hpp"
24 #include "icinga/checkable.thpp"
25 #include "icinga/timeperiod.hpp"
26 #include "icinga/notification.hpp"
27 #include "icinga/comment.hpp"
28 #include "icinga/downtime.hpp"
29 #include "remote/endpoint.hpp"
30 #include "remote/messageorigin.hpp"
31
32 namespace icinga
33 {
34
35 /**
36  * The state of service flapping.
37  *
38  * @ingroup icinga
39  */
40 enum FlappingState
41 {
42         FlappingStarted = 0,
43         FlappingDisabled = 1,
44         FlappingStopped = 2,
45         FlappingEnabled = 3
46 };
47
48 /**
49  * @ingroup icinga
50  */
51 enum DependencyType
52 {
53         DependencyState,
54         DependencyCheckExecution,
55         DependencyNotification
56 };
57
58 /**
59  * Checkable Types
60  *
61  * @ingroup icinga
62  */
63 enum CheckableType
64 {
65         CheckableHost,
66         CheckableService
67 };
68
69 class CheckCommand;
70 class EventCommand;
71 class Dependency;
72
73 /**
74  * An Icinga service.
75  *
76  * @ingroup icinga
77  */
78 class I2_ICINGA_API Checkable : public ObjectImpl<Checkable>
79 {
80 public:
81         DECLARE_OBJECT(Checkable);
82         DECLARE_OBJECTNAME(Checkable);
83
84         Checkable(void);
85
86         std::set<Checkable::Ptr> GetParents(void) const;
87         std::set<Checkable::Ptr> GetChildren(void) const;
88
89         void AddGroup(const String& name);
90
91         //bool IsHostCheck(void) const;
92
93         bool IsReachable(DependencyType dt = DependencyState, intrusive_ptr<Dependency> *failedDependency = NULL, int rstack = 0) const;
94
95         AcknowledgementType GetAcknowledgement(void);
96
97         void AcknowledgeProblem(const String& author, const String& comment, AcknowledgementType type, bool notify = true, double expiry = 0, const MessageOrigin& origin = MessageOrigin());
98         void ClearAcknowledgement(const MessageOrigin& origin = MessageOrigin());
99
100         /* Checks */
101         intrusive_ptr<CheckCommand> GetCheckCommand(void) const;
102         void SetCheckCommand(const intrusive_ptr<CheckCommand>& command, const MessageOrigin& origin = MessageOrigin());
103
104         TimePeriod::Ptr GetCheckPeriod(void) const;
105         void SetCheckPeriod(const TimePeriod::Ptr& tp, const MessageOrigin& origin = MessageOrigin());
106
107         double GetCheckInterval(void) const;
108         void SetCheckInterval(double interval, const MessageOrigin& origin = MessageOrigin());
109
110         double GetRetryInterval(void) const;
111         void SetRetryInterval(double interval, const MessageOrigin& origin = MessageOrigin());
112
113         int GetMaxCheckAttempts(void) const;
114         void SetMaxCheckAttempts(int attempts, const MessageOrigin& origin = MessageOrigin());
115
116         long GetSchedulingOffset(void);
117         void SetSchedulingOffset(long offset);
118
119         void SetNextCheck(double nextCheck, const MessageOrigin& origin = MessageOrigin());
120         double GetNextCheck(void);
121         void UpdateNextCheck(void);
122
123         bool HasBeenChecked(void) const;
124
125         double GetLastCheck(void) const;
126
127         bool GetEnableActiveChecks(void) const;
128         void SetEnableActiveChecks(bool enabled, const MessageOrigin& origin = MessageOrigin());
129
130         bool GetEnablePassiveChecks(void) const;
131         void SetEnablePassiveChecks(bool enabled, const MessageOrigin& origin = MessageOrigin());
132
133         bool GetForceNextCheck(void) const;
134         void SetForceNextCheck(bool forced, const MessageOrigin& origin = MessageOrigin());
135
136         static void UpdateStatistics(const CheckResult::Ptr& cr, CheckableType type);
137
138         void ExecuteCheck(const Dictionary::Ptr& resolvedMacros = Dictionary::Ptr(),
139             bool useResolvedMacros = false);
140         void ProcessCheckResult(const CheckResult::Ptr& cr, const MessageOrigin& origin = MessageOrigin());
141
142         int GetModifiedAttributes(void) const;
143         void SetModifiedAttributes(int flags, const MessageOrigin& origin = MessageOrigin());
144
145         Endpoint::Ptr GetCommandEndpoint(void) const;
146
147         bool IsCheckPending(void) const;
148
149         static double CalculateExecutionTime(const CheckResult::Ptr& cr);
150         static double CalculateLatency(const CheckResult::Ptr& cr);
151
152         static boost::signals2::signal<void (const Checkable::Ptr&, double, const MessageOrigin&)> OnNextCheckChanged;
153         static boost::signals2::signal<void (const Checkable::Ptr&, bool, const MessageOrigin&)> OnForceNextCheckChanged;
154         static boost::signals2::signal<void (const Checkable::Ptr&, bool, const MessageOrigin&)> OnForceNextNotificationChanged;
155         static boost::signals2::signal<void (const Checkable::Ptr&, bool, const MessageOrigin&)> OnEnableActiveChecksChanged;
156         static boost::signals2::signal<void (const Checkable::Ptr&, bool, const MessageOrigin&)> OnEnablePassiveChecksChanged;
157         static boost::signals2::signal<void (const Checkable::Ptr&, bool, const MessageOrigin&)> OnEnableNotificationsChanged;
158         static boost::signals2::signal<void (const Checkable::Ptr&, bool, const MessageOrigin&)> OnEnableFlappingChanged;
159         static boost::signals2::signal<void (const Checkable::Ptr&, bool, const MessageOrigin&)> OnEnablePerfdataChanged;
160
161         static boost::signals2::signal<void (const Checkable::Ptr&, bool, const MessageOrigin&)> OnEnableEventHandlerChanged;
162         static boost::signals2::signal<void (const Checkable::Ptr&, double, const MessageOrigin&)> OnCheckIntervalChanged;
163         static boost::signals2::signal<void (const Checkable::Ptr&, double, const MessageOrigin&)> OnRetryIntervalChanged;
164         static boost::signals2::signal<void (const Checkable::Ptr&, int, const MessageOrigin&)> OnMaxCheckAttemptsChanged;
165         static boost::signals2::signal<void (const Checkable::Ptr&, const intrusive_ptr<EventCommand>&, const MessageOrigin&)> OnEventCommandChanged;
166         static boost::signals2::signal<void (const Checkable::Ptr&, const intrusive_ptr<CheckCommand>&, const MessageOrigin&)> OnCheckCommandChanged;
167         static boost::signals2::signal<void (const Checkable::Ptr&, const TimePeriod::Ptr&, const MessageOrigin&)> OnCheckPeriodChanged;
168
169         static boost::signals2::signal<void (const Checkable::Ptr&, const CheckResult::Ptr&, const MessageOrigin&)> OnNewCheckResult;
170         static boost::signals2::signal<void (const Checkable::Ptr&, const CheckResult::Ptr&, StateType, const MessageOrigin&)> OnStateChange;
171         static boost::signals2::signal<void (const Checkable::Ptr&, const CheckResult::Ptr&, std::set<Checkable::Ptr>, const MessageOrigin&)> OnReachabilityChanged;
172         static boost::signals2::signal<void (const Checkable::Ptr&, NotificationType, const CheckResult::Ptr&,
173             const String&, const String&)> OnNotificationsRequested;
174         static boost::signals2::signal<void (const Notification::Ptr&, const Checkable::Ptr&, const std::set<User::Ptr>&,
175             const NotificationType&, const CheckResult::Ptr&, const String&,
176             const String&)> OnNotificationSendStart;
177         static boost::signals2::signal<void (const Notification::Ptr&, const Checkable::Ptr&, const User::Ptr&,
178             const NotificationType&, const CheckResult::Ptr&, const String&,
179             const String&, const String&)> OnNotificationSentToUser;
180         static boost::signals2::signal<void (const Notification::Ptr&, const Checkable::Ptr&, const std::set<User::Ptr>&,
181             const NotificationType&, const CheckResult::Ptr&, const String&,
182             const String&)> OnNotificationSentToAllUsers;
183         static boost::signals2::signal<void (const Checkable::Ptr&, const Comment::Ptr&, const MessageOrigin&)> OnCommentAdded;
184         static boost::signals2::signal<void (const Checkable::Ptr&, const Comment::Ptr&, const MessageOrigin&)> OnCommentRemoved;
185         static boost::signals2::signal<void (const Checkable::Ptr&, const Downtime::Ptr&, const MessageOrigin&)> OnDowntimeAdded;
186         static boost::signals2::signal<void (const Checkable::Ptr&, const Downtime::Ptr&, const MessageOrigin&)> OnDowntimeRemoved;
187         static boost::signals2::signal<void (const Checkable::Ptr&, FlappingState)> OnFlappingChanged;
188         static boost::signals2::signal<void (const Checkable::Ptr&, const Downtime::Ptr&)> OnDowntimeTriggered;
189         static boost::signals2::signal<void (const Checkable::Ptr&, const String&, const String&, AcknowledgementType,
190                                              bool, double, const MessageOrigin&)> OnAcknowledgementSet;
191         static boost::signals2::signal<void (const Checkable::Ptr&, const MessageOrigin&)> OnAcknowledgementCleared;
192         static boost::signals2::signal<void (const Checkable::Ptr&)> OnEventCommandExecuted;
193
194         /* Downtimes */
195         static int GetNextDowntimeID(void);
196
197         int GetDowntimeDepth(void) const;
198
199         String AddDowntime(const String& author, const String& comment,
200             double startTime, double endTime, bool fixed,
201             const String& triggeredBy, double duration,
202             const String& scheduledBy = String(), const String& id = String(),
203             const MessageOrigin& origin = MessageOrigin());
204
205         static void RemoveDowntime(const String& id, bool cancelled, const MessageOrigin& origin = MessageOrigin());
206
207         void TriggerDowntimes(void);
208         static void TriggerDowntime(const String& id);
209
210         static String GetDowntimeIDFromLegacyID(int id);
211         static Checkable::Ptr GetOwnerByDowntimeID(const String& id);
212         static Downtime::Ptr GetDowntimeByID(const String& id);
213
214         static void StartDowntimesExpiredTimer(void);
215
216         bool IsInDowntime(void) const;
217         bool IsAcknowledged(void);
218
219         /* Comments */
220         static int GetNextCommentID(void);
221
222         String AddComment(CommentType entryType, const String& author,
223             const String& text, double expireTime, const String& id = String(), const MessageOrigin& origin = MessageOrigin());
224
225         void RemoveAllComments(void);
226         void RemoveCommentsByType(int type);
227         static void RemoveComment(const String& id, const MessageOrigin& origin = MessageOrigin());
228
229         static String GetCommentIDFromLegacyID(int id);
230         static Checkable::Ptr GetOwnerByCommentID(const String& id);
231         static Comment::Ptr GetCommentByID(const String& id);
232
233         /* Notifications */
234         bool GetEnableNotifications(void) const;
235         void SetEnableNotifications(bool enabled, const MessageOrigin& origin = MessageOrigin());
236
237         void SendNotifications(NotificationType type, const CheckResult::Ptr& cr, const String& author = "", const String& text = "");
238
239         std::set<Notification::Ptr> GetNotifications(void) const;
240         void AddNotification(const Notification::Ptr& notification);
241         void RemoveNotification(const Notification::Ptr& notification);
242
243         void SetForceNextNotification(bool force, const MessageOrigin& origin = MessageOrigin());
244         bool GetForceNextNotification(void) const;
245
246         void ResetNotificationNumbers(void);
247
248         /* Event Handler */
249         void ExecuteEventHandler(const Dictionary::Ptr& resolvedMacros = Dictionary::Ptr(),
250             bool useResolvedMacros = false);
251
252         intrusive_ptr<EventCommand> GetEventCommand(void) const;
253         void SetEventCommand(const intrusive_ptr<EventCommand>& command, const MessageOrigin& origin = MessageOrigin());
254
255         bool GetEnableEventHandler(void) const;
256         void SetEnableEventHandler(bool enabled, const MessageOrigin& origin = MessageOrigin());
257
258         /* Flapping Detection */
259         double GetFlappingCurrent(void) const;
260
261         bool GetEnableFlapping(void) const;
262         void SetEnableFlapping(bool enabled, const MessageOrigin& origin = MessageOrigin());
263
264         bool IsFlapping(void) const;
265         void UpdateFlappingStatus(bool stateChange);
266
267         /* Performance data */
268         bool GetEnablePerfdata(void) const;
269         void SetEnablePerfdata(bool enabled, const MessageOrigin& origin = MessageOrigin());
270
271         /* Dependencies */
272         void AddDependency(const intrusive_ptr<Dependency>& dep);
273         void RemoveDependency(const intrusive_ptr<Dependency>& dep);
274         std::set<intrusive_ptr<Dependency> > GetDependencies(void) const;
275
276         void AddReverseDependency(const intrusive_ptr<Dependency>& dep);
277         void RemoveReverseDependency(const intrusive_ptr<Dependency>& dep);
278         std::set<intrusive_ptr<Dependency> > GetReverseDependencies(void) const;
279
280         static void ValidateCheckInterval(const String& location, const Checkable::Ptr& object);
281
282 protected:
283         virtual void Start(void);
284
285         virtual void OnConfigLoaded(void);
286         virtual void OnStateLoaded(void);
287
288 private:
289         mutable boost::mutex m_CheckableMutex;
290         bool m_CheckRunning;
291         long m_SchedulingOffset;
292
293         /* Downtimes */
294         static void DowntimesExpireTimerHandler(void);
295         void RemoveExpiredDowntimes(void);
296         void AddDowntimesToCache(void);
297
298         /* Comments */
299         static void CommentsExpireTimerHandler(void);
300         void RemoveExpiredComments(void);
301         void AddCommentsToCache(void);
302
303         /* Notifications */
304         std::set<Notification::Ptr> m_Notifications;
305         mutable boost::mutex m_NotificationMutex;
306
307         /* Dependencies */
308         mutable boost::mutex m_DependencyMutex;
309         std::set<intrusive_ptr<Dependency> > m_Dependencies;
310         std::set<intrusive_ptr<Dependency> > m_ReverseDependencies;
311 };
312
313 }
314
315 #endif /* CHECKABLE_H */
316
317 #include "icinga/dependency.hpp"