void Checkable::RemoveDowntime(const String& id, bool cancelled, const MessageOrigin::Ptr& origin) { Checkable::Ptr owner = GetOwnerByDowntimeID(id); if (!owner) return; Dictionary::Ptr downtimes = owner->GetDowntimes(); Downtime::Ptr downtime = downtimes->Get(id); if (!downtime) return; int legacy_id = downtime->GetLegacyId(); String config_owner = downtime->GetConfigOwner(); if (!config_owner.IsEmpty()) { Log(LogWarning, "Checkable") << "Cannot remove downtime with ID '" << legacy_id << "'. It is owned by scheduled downtime object '" << config_owner << "'"; return; } downtimes->Remove(id); { boost::mutex::scoped_lock lock(l_DowntimeMutex); l_LegacyDowntimesCache.erase(legacy_id); l_DowntimesCache.erase(id); } downtime->SetWasCancelled(cancelled); Log(LogNotice, "Checkable") << "Removed downtime with ID '" << downtime->GetLegacyId() << "' from service '" << owner->GetName() << "'."; OnDowntimeRemoved(owner, downtime, origin); }
Value DowntimesTable::TriggeredByAccessor(const Value& row) { Downtime::Ptr downtime = static_cast<Downtime::Ptr>(row); String triggerDowntimeName = downtime->GetTriggeredBy(); Downtime::Ptr triggerDowntime = Downtime::GetByName(triggerDowntimeName); if (triggerDowntime) return triggerDowntime->GetLegacyId(); return Empty; }
void StatusDataWriter::DumpDowntimes(std::ostream& fp, const Checkable::Ptr& checkable) { Host::Ptr host; Service::Ptr service; tie(host, service) = GetHostService(checkable); for (const Downtime::Ptr& downtime : checkable->GetDowntimes()) { if (downtime->IsExpired()) continue; if (service) fp << "servicedowntime {" << "\n" "\t" "service_description=" << service->GetShortName() << "\n"; else fp << "hostdowntime {" "\n"; Downtime::Ptr triggeredByObj = Downtime::GetByName(downtime->GetTriggeredBy()); int triggeredByLegacy = 0; if (triggeredByObj) triggeredByLegacy = triggeredByObj->GetLegacyId(); fp << "\t" << "host_name=" << host->GetName() << "\n" "\t" "downtime_id=" << downtime->GetLegacyId() << "\n" "\t" "entry_time=" << downtime->GetEntryTime() << "\n" "\t" "start_time=" << downtime->GetStartTime() << "\n" "\t" "end_time=" << downtime->GetEndTime() << "\n" "\t" "triggered_by=" << triggeredByLegacy << "\n" "\t" "fixed=" << static_cast<long>(downtime->GetFixed()) << "\n" "\t" "duration=" << static_cast<long>(downtime->GetDuration()) << "\n" "\t" "is_in_effect=" << (downtime->IsInEffect() ? 1 : 0) << "\n" "\t" "author=" << downtime->GetAuthor() << "\n" "\t" "comment=" << downtime->GetComment() << "\n" "\t" "trigger_time=" << downtime->GetTriggerTime() << "\n" "\t" "}" "\n" "\n"; } }
Dictionary::Ptr ApiActions::ScheduleDowntime(const ConfigObject::Ptr& object, const Dictionary::Ptr& params) { Checkable::Ptr checkable = static_pointer_cast<Checkable>(object); if (!checkable) return ApiActions::CreateResult(404, "Can't schedule downtime for non-existent object."); if (!params->Contains("start_time") || !params->Contains("end_time") || !params->Contains("duration") || !params->Contains("author") || !params->Contains("comment")) { return ApiActions::CreateResult(404, "Options 'start_time', 'end_time', 'duration', 'author' and 'comment' are required"); } bool fixed = false; if (params->Contains("fixed")) fixed = HttpUtility::GetLastParameter(params, "fixed"); String downtime_id = Downtime::AddDowntime(checkable, HttpUtility::GetLastParameter(params, "author"), HttpUtility::GetLastParameter(params, "comment"), HttpUtility::GetLastParameter(params, "start_time"), HttpUtility::GetLastParameter(params, "end_time"), fixed, HttpUtility::GetLastParameter(params, "trigger_id"), HttpUtility::GetLastParameter(params, "duration")); Downtime::Ptr downtime = Downtime::GetByName(downtime_id); int legacy_id = downtime->GetLegacyId(); Dictionary::Ptr additional = new Dictionary(); additional->Set("downtime_id", downtime_id); additional->Set("legacy_id", legacy_id); return ApiActions::CreateResult(200, "Successfully scheduled downtime with id '" + downtime_id + "' for object '" + checkable->GetName() + "'.", additional); }
String Checkable::AddDowntime(const String& author, const String& comment, double startTime, double endTime, bool fixed, const String& triggeredBy, double duration, const String& scheduledBy, const String& id, const MessageOrigin::Ptr& origin) { String uid; if (id.IsEmpty()) uid = Utility::NewUniqueID(); else uid = id; Downtime::Ptr downtime = new Downtime(); downtime->SetId(uid); downtime->SetEntryTime(Utility::GetTime()); downtime->SetAuthor(author); downtime->SetComment(comment); downtime->SetStartTime(startTime); downtime->SetEndTime(endTime); downtime->SetFixed(fixed); downtime->SetDuration(duration); downtime->SetTriggeredBy(triggeredBy); downtime->SetScheduledBy(scheduledBy); if (!triggeredBy.IsEmpty()) { Downtime::Ptr triggerDowntime = GetDowntimeByID(triggeredBy); if (triggerDowntime) downtime->SetTriggeredByLegacyId(triggerDowntime->GetLegacyId()); } int legacy_id; { boost::mutex::scoped_lock lock(l_DowntimeMutex); legacy_id = l_NextDowntimeID++; } downtime->SetLegacyId(legacy_id); if (!triggeredBy.IsEmpty()) { Checkable::Ptr otherOwner = GetOwnerByDowntimeID(triggeredBy); Dictionary::Ptr otherDowntimes = otherOwner->GetDowntimes(); Downtime::Ptr otherDowntime = otherDowntimes->Get(triggeredBy); Dictionary::Ptr triggers = otherDowntime->GetTriggers(); triggers->Set(triggeredBy, triggeredBy); } GetDowntimes()->Set(uid, downtime); { boost::mutex::scoped_lock lock(l_DowntimeMutex); l_LegacyDowntimesCache[legacy_id] = uid; l_DowntimesCache[uid] = this; } Log(LogNotice, "Checkable") << "Added downtime with ID '" << downtime->GetLegacyId() << "' between '" << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S", startTime) << "' and '" << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S", endTime) << "'."; OnDowntimeAdded(this, downtime, origin); /* if this object is already in a NOT-OK state trigger * this downtime now *after* it has been added (important * for DB IDO, etc.) */ if (GetStateRaw() != ServiceOK) { Log(LogNotice, "Checkable") << "Checkable '" << GetName() << "' already in a NOT-OK state." << " Triggering downtime now."; TriggerDowntime(uid); } return uid; }
String Checkable::AddDowntime(const String& author, const String& comment, double startTime, double endTime, bool fixed, const String& triggeredBy, double duration, const String& scheduledBy, const String& id, const MessageOrigin& origin) { String uid; if (id.IsEmpty()) uid = Utility::NewUniqueID(); else uid = id; Downtime::Ptr downtime = make_shared<Downtime>(); downtime->SetId(uid); downtime->SetEntryTime(Utility::GetTime()); downtime->SetAuthor(author); downtime->SetComment(comment); downtime->SetStartTime(startTime); downtime->SetEndTime(endTime); downtime->SetFixed(fixed); downtime->SetDuration(duration); downtime->SetTriggeredBy(triggeredBy); downtime->SetScheduledBy(scheduledBy); if (!triggeredBy.IsEmpty()) { Downtime::Ptr triggerDowntime = GetDowntimeByID(triggeredBy); if (triggerDowntime) downtime->SetTriggeredByLegacyId(triggerDowntime->GetLegacyId()); } int legacy_id; { boost::mutex::scoped_lock lock(l_DowntimeMutex); legacy_id = l_NextDowntimeID++; } downtime->SetLegacyId(legacy_id); if (!triggeredBy.IsEmpty()) { Checkable::Ptr otherOwner = GetOwnerByDowntimeID(triggeredBy); Dictionary::Ptr otherDowntimes = otherOwner->GetDowntimes(); Downtime::Ptr otherDowntime = otherDowntimes->Get(triggeredBy); Dictionary::Ptr triggers = otherDowntime->GetTriggers(); triggers->Set(triggeredBy, triggeredBy); } GetDowntimes()->Set(uid, downtime); { boost::mutex::scoped_lock lock(l_DowntimeMutex); l_LegacyDowntimesCache[legacy_id] = uid; l_DowntimesCache[uid] = GetSelf(); } Log(LogNotice, "Checkable", "Added downtime with ID '" + Convert::ToString(downtime->GetLegacyId()) + "' between '" + Utility::FormatDateTime("%Y-%m-%d %H:%M:%S", startTime) + "' and '" + Utility::FormatDateTime("%Y-%m-%d %H:%M:%S", endTime) + "'."); OnDowntimeAdded(GetSelf(), downtime, origin); return uid; }
Value DowntimesTable::IdAccessor(const Value& row) { Downtime::Ptr downtime = static_cast<Downtime::Ptr>(row); return downtime->GetLegacyId(); }