<< "\t" << "scheduled_downtime_depth=" << attrs->Get("scheduled_downtime_depth") << "\n"
<< "\t" << "last_notification=" << static_cast<long>(attrs->Get("last_notification")) << "\n"
<< "\t" << "next_notification=" << static_cast<long>(attrs->Get("next_notification")) << "\n"
- << "\t" << "current_notification_number=" << attrs->Get("current_notification_number") << "\n";
+ << "\t" << "current_notification_number=" << attrs->Get("current_notification_number") << "\n"
+ << "\t" << "modified_attributes=" << attrs->Get("modified_attributes") << "\n";
}
void StatusDataWriter::DumpServiceStatus(std::ostream& fp, const Service::Ptr& service)
attr->Set("last_notification", last_notification);
attr->Set("next_notification", next_notification);
attr->Set("current_notification_number", notification_number);
+ attr->Set("modified_attributes", service->GetModifiedAttributes());
return attr;
}
RegisterCommand("DISABLE_PERFORMANCE_DATA", &ExternalCommandProcessor::DisablePerformanceData);
RegisterCommand("START_EXECUTING_SVC_CHECKS", &ExternalCommandProcessor::StartExecutingSvcChecks);
RegisterCommand("STOP_EXECUTING_SVC_CHECKS", &ExternalCommandProcessor::StopExecutingSvcChecks);
+ RegisterCommand("CHANGE_SVC_MODATTR", &ExternalCommandProcessor::ChangeSvcModAttr);
}
void ExternalCommandProcessor::RegisterCommand(const String& command, const ExternalCommandProcessor::Callback& callback)
IcingaApplication::GetInstance()->SetEnableChecks(false);
}
+
+void ExternalCommandProcessor::ChangeSvcModAttr(double time, const std::vector<String>& arguments)
+{
+ if (arguments.size() < 3)
+ BOOST_THROW_EXCEPTION(std::invalid_argument("Expected 3 arguments."));
+
+ Service::Ptr service = Service::GetByNamePair(arguments[0], arguments[1]);
+
+ if (!service)
+ BOOST_THROW_EXCEPTION(std::invalid_argument("Cannot update modified attributes for non-existent service '" + arguments[1] + "' on host '" + arguments[0] + "'"));
+
+ int modifiedAttributes = Convert::ToLong(arguments[2]);
+
+ Log(LogInformation, "icinga", "Updating modified attributes for service '" + arguments[1] + "'");
+
+ {
+ ObjectLock olock(service);
+
+ service->SetModifiedAttributes(modifiedAttributes);
+ }
+}
\ No newline at end of file
static void DisablePerformanceData(double time, const std::vector<String>& arguments);
static void StartExecutingSvcChecks(double time, const std::vector<String>& arguments);
static void StopExecutingSvcChecks(double time, const std::vector<String>& arguments);
+ static void ChangeSvcModAttr(double time, const std::vector<String>& arguments);
};
}
%attribute number "check_interval",
%attribute number "retry_interval",
+ %attribute number "enable_active_checks",
+ %attribute number "enable_passive_checks",
+
%attribute name(EventCommand) "event_command",
%attribute number "enable_flapping",
bool Service::GetEnableActiveChecks(void) const
{
- if (m_EnableActiveChecks.IsEmpty())
- return true;
- else
+ if (!m_OverrideEnableActiveChecks.IsEmpty())
+ return m_OverrideEnableActiveChecks;
+ else if (!m_EnableActiveChecks.IsEmpty())
return m_EnableActiveChecks;
+ else
+ return true;
}
void Service::SetEnableActiveChecks(bool enabled, const String& authority)
{
- m_EnableActiveChecks = enabled ? 1 : 0;
+ m_OverrideEnableActiveChecks = enabled ? 1 : 0;
Utility::QueueAsyncCallback(boost::bind(boost::ref(OnEnableActiveChecksChanged), GetSelf(), enabled, authority));
}
bool Service::GetEnablePassiveChecks(void) const
{
- if (m_EnablePassiveChecks.IsEmpty())
- return true;
- else
+ if (!m_OverrideEnablePassiveChecks.IsEmpty())
+ return m_OverrideEnablePassiveChecks;
+ if (!m_EnablePassiveChecks.IsEmpty())
return m_EnablePassiveChecks;
+ else
+ return true;
}
void Service::SetEnablePassiveChecks(bool enabled, const String& authority)
{
- m_EnablePassiveChecks = enabled ? 1 : 0;
+ m_OverrideEnablePassiveChecks = enabled ? 1 : 0;
Utility::QueueAsyncCallback(boost::bind(boost::ref(OnEnablePassiveChecksChanged), GetSelf(), enabled, authority));
}
return m_EnablePerfdata;
}
+int Service::GetModifiedAttributes(void) const
+{
+ int attrs = 0;
+
+ if (!m_OverrideEnableActiveChecks.IsEmpty())
+ attrs |= ModAttrActiveChecksEnabled;
+
+ if (!m_OverrideEnablePassiveChecks.IsEmpty())
+ attrs |= ModAttrPassiveChecksEnabled;
+
+ // TODO: finish
+
+ return attrs;
+}
+
+void Service::SetModifiedAttributes(int flags)
+{
+ if ((flags & ModAttrActiveChecksEnabled) == 0)
+ m_OverrideEnableActiveChecks = Empty;
+
+ if ((flags & ModAttrPassiveChecksEnabled) == 0)
+ m_OverrideEnablePassiveChecks = Empty;
+}
+
bool Service::ResolveMacro(const String& macro, const Dictionary::Ptr& cr, String *result) const
{
if (macro == "SERVICEDESC") {
bag->Set("enable_flapping", m_EnableFlapping);
bag->Set("enable_perfdata", m_EnablePerfdata);
bag->Set("enable_event_handlers", m_EnableEventHandlers);
+ bag->Set("override_enable_active_checks", m_OverrideEnableActiveChecks);
+ bag->Set("override_enable_passive_checks", m_OverrideEnablePassiveChecks);
}
}
m_HostName = bag->Get("host");
m_FlappingThreshold = bag->Get("flapping_threshold");
m_NotificationDescriptions = bag->Get("notifications");
+ m_EnableActiveChecks = bag->Get("enable_active_checks");
+ m_EnablePassiveChecks = bag->Get("enable_passive_checks");
}
if (attributeTypes & Attribute_State) {
m_LastStateUnknown = bag->Get("last_state_unknown");
m_LastStateUnreachable = bag->Get("last_state_unreachable");
m_LastInDowntime = bag->Get("last_in_downtime");
- m_EnableActiveChecks = bag->Get("enable_active_checks");
- m_EnablePassiveChecks = bag->Get("enable_passive_checks");
m_ForceNextCheck = bag->Get("force_next_check");
m_Acknowledgement = bag->Get("acknowledgement");
m_AcknowledgementExpiry = bag->Get("acknowledgement_expiry");
m_EnableFlapping = bag->Get("enable_flapping");
m_EnablePerfdata = bag->Get("enable_perfdata");
m_EnableEventHandlers = bag->Get("enable_event_handlers");
+ m_OverrideEnableActiveChecks = bag->Get("override_enable_active_checks");
+ m_OverrideEnablePassiveChecks = bag->Get("override_enable_passive_checks");
}
}
DowntimeChangedDeleted = 2
};
+/**
+ * Modified attributes.
+ *
+ * @ingroup icinga
+ */
+enum ModifiedAttributeType
+{
+ ModAttrNotificationsEnabled = 1,
+ ModAttrActiveChecksEnabled = 2,
+ ModAttrPassiveChecksEnabled = 4,
+ ModAttrEventHandlerEnabled = 8,
+ ModAttrFlapDetectionEnabled = 16,
+ ModAttrFailurePredictionEnabled = 32,
+ ModAttrPerformanceDataEnabled = 64,
+ ModAttrObsessiveHandlerEnabled = 128,
+ ModAttrEventHandlerCommand = 256,
+ ModAttrCheckCommand = 512,
+ ModAttrNormalCheckInterval = 1024,
+ ModAttrRetryCheckInterval = 2048,
+ ModAttrMaxCheckAttempts = 4096,
+ ModAttrFreshnessChecksEnabled = 8192,
+ ModAttrCheckTimeperiod = 16384,
+ ModAttrCustomVariable = 32768,
+ ModAttrNotificationTimeperiod = 65536
+};
+
class CheckCommand;
class EventCommand;
void ExecuteCheck(void);
void ProcessCheckResult(const Dictionary::Ptr& cr, const String& authority = String());
+ int GetModifiedAttributes(void) const;
+ void SetModifiedAttributes(int flags);
+
static double CalculateExecutionTime(const Dictionary::Ptr& cr);
static double CalculateLatency(const Dictionary::Ptr& cr);
Value m_LastStateUnreachable;
bool m_LastInDowntime;
Value m_EnableActiveChecks;
+ Value m_OverrideEnableActiveChecks;
Value m_EnablePassiveChecks;
+ Value m_OverrideEnablePassiveChecks;
Value m_ForceNextCheck;
bool m_CheckRunning;