diff --git a/components/compat/compatcomponent.cpp b/components/compat/compatcomponent.cpp index 43fb808d9..f4e603388 100644 --- a/components/compat/compatcomponent.cpp +++ b/components/compat/compatcomponent.cpp @@ -181,6 +181,11 @@ void CompatComponent::DumpComments(ofstream& fp, const DynamicObject::Ptr& owner String id; Dictionary::Ptr comment; BOOST_FOREACH(tie(id, comment), comments) { + /* There's no way for us to dump comments that haven't been + * assigned a legacy ID yet. */ + if (!comment->Contains("legacy_id")) + continue; + if (!service) fp << "hostcomment {" << "\n"; else @@ -188,7 +193,7 @@ void CompatComponent::DumpComments(ofstream& fp, const DynamicObject::Ptr& owner << "\t" << "service_description=" << service->GetAlias() << "\n"; fp << "\t" << "host_name=" << host->GetName() << "\n" - << "\t" << "comment_id=" << id << "\n" + << "\t" << "comment_id=" << static_cast(comment->Get("legacy_id")) << "\n" << "\t" << "entry_time=" << static_cast(comment->Get("entry_time")) << "\n" << "\t" << "entry_type=" << static_cast(comment->Get("entry_type")) << "\n" << "\t" << "persistent=" << 1 << "\n" @@ -223,6 +228,11 @@ void CompatComponent::DumpDowntimes(ofstream& fp, const DynamicObject::Ptr& owne String id; Dictionary::Ptr downtime; BOOST_FOREACH(tie(id, downtime), downtimes) { + /* There's no way for us to dump downtimes that haven't been + * assigned a legacy ID yet. */ + if (!downtime->Contains("legacy_id")) + continue; + if (!service) fp << "hostdowntime {" << "\n"; else @@ -230,7 +240,7 @@ void CompatComponent::DumpDowntimes(ofstream& fp, const DynamicObject::Ptr& owne << "\t" << "service_description=" << service->GetAlias() << "\n"; fp << "\t" << "host_name=" << host->GetName() << "\n" - << "\t" << "downtime_id=" << id << "\n" + << "\t" << "downtime_id=" << static_cast(downtime->Get("legacy_id")) << "\n" << "\t" << "entry_time=" << static_cast(downtime->Get("entry_time")) << "\n" << "\t" << "start_time=" << static_cast(downtime->Get("start_time")) << "\n" << "\t" << "end_time=" << static_cast(downtime->Get("end_time")) << "\n" diff --git a/lib/icinga/commentprocessor.cpp b/lib/icinga/commentprocessor.cpp index d1b24e187..92a9b2946 100644 --- a/lib/icinga/commentprocessor.cpp +++ b/lib/icinga/commentprocessor.cpp @@ -22,7 +22,8 @@ using namespace icinga; int CommentProcessor::m_NextCommentID = 1; -map CommentProcessor::m_CommentCache; +map CommentProcessor::m_LegacyCommentCache; +map CommentProcessor::m_CommentCache; bool CommentProcessor::m_CommentCacheValid; int CommentProcessor::GetNextCommentID(void) @@ -30,7 +31,7 @@ int CommentProcessor::GetNextCommentID(void) return m_NextCommentID; } -int CommentProcessor::AddComment(const DynamicObject::Ptr& owner, +String CommentProcessor::AddComment(const DynamicObject::Ptr& owner, CommentType entryType, const String& author, const String& text, double expireTime) { @@ -46,10 +47,12 @@ int CommentProcessor::AddComment(const DynamicObject::Ptr& owner, if (!comments) comments = boost::make_shared(); - int id = m_NextCommentID; + int legacy_id = m_NextCommentID; m_NextCommentID++; + comment->Set("legacy_id", legacy_id); - comments->Set(Convert::ToString(id), comment); + String id = Utility::NewUUID(); + comments->Set(id, comment); owner->Set("comments", comments); return id; @@ -60,7 +63,7 @@ void CommentProcessor::RemoveAllComments(const DynamicObject::Ptr& owner) owner->Set("comments", Empty); } -void CommentProcessor::RemoveComment(int id) +void CommentProcessor::RemoveComment(const String& id) { DynamicObject::Ptr owner = GetOwnerByCommentID(id); @@ -70,19 +73,24 @@ void CommentProcessor::RemoveComment(int id) Dictionary::Ptr comments = owner->Get("comments"); if (comments) { - comments->Remove(Convert::ToString(id)); + comments->Remove(id); owner->Touch("comments"); } } -DynamicObject::Ptr CommentProcessor::GetOwnerByCommentID(int id) +String CommentProcessor::GetIDFromLegacyID(int id) +{ + return Convert::ToString(id); +} + +DynamicObject::Ptr CommentProcessor::GetOwnerByCommentID(const String& id) { ValidateCommentCache(); return m_CommentCache[id].lock(); } -Dictionary::Ptr CommentProcessor::GetCommentByID(int id) +Dictionary::Ptr CommentProcessor::GetCommentByID(const String& id) { DynamicObject::Ptr owner = GetOwnerByCommentID(id); @@ -92,7 +100,7 @@ Dictionary::Ptr CommentProcessor::GetCommentByID(int id) Dictionary::Ptr comments = owner->Get("comments"); if (comments) { - Dictionary::Ptr comment = comments->Get(Convert::ToString(id)); + Dictionary::Ptr comment = comments->Get(id); return comment; } @@ -103,6 +111,7 @@ void CommentProcessor::InvalidateCommentCache(void) { m_CommentCacheValid = false; m_CommentCache.clear(); + m_LegacyCommentCache.clear(); } void CommentProcessor::AddCommentsToCache(const DynamicObject::Ptr& owner) @@ -112,12 +121,17 @@ void CommentProcessor::AddCommentsToCache(const DynamicObject::Ptr& owner) if (!comments) return; - String sid; - BOOST_FOREACH(tie(sid, tuples::ignore), comments) { - int id = Convert::ToLong(sid); + String id; + Dictionary::Ptr comment; + BOOST_FOREACH(tie(id, comment), comments) { + if (comment->Contains("legacy_id")) { + int legacy_id = comment->Get("legacy_id"); - if (id > m_NextCommentID) - m_NextCommentID = id; + m_LegacyCommentCache[legacy_id] = id; + + if (legacy_id > m_NextCommentID) + m_NextCommentID = legacy_id; + } m_CommentCache[id] = owner; } @@ -129,6 +143,7 @@ void CommentProcessor::ValidateCommentCache(void) return; m_CommentCache.clear(); + m_LegacyCommentCache.clear(); DynamicObject::Ptr object; BOOST_FOREACH(tie(tuples::ignore, object), DynamicType::GetByName("Host")->GetObjects()) { diff --git a/lib/icinga/commentprocessor.h b/lib/icinga/commentprocessor.h index eac7fb48d..744e3e1a0 100644 --- a/lib/icinga/commentprocessor.h +++ b/lib/icinga/commentprocessor.h @@ -41,22 +41,24 @@ class I2_ICINGA_API CommentProcessor public: static int GetNextCommentID(void); - static int AddComment(const DynamicObject::Ptr& owner, + static String AddComment(const DynamicObject::Ptr& owner, CommentType entryType, const String& author, const String& text, double expireTime); static void RemoveAllComments(const DynamicObject::Ptr& owner); - static void RemoveComment(int id); + static void RemoveComment(const String& id); - static DynamicObject::Ptr GetOwnerByCommentID(int id); - static Dictionary::Ptr GetCommentByID(int id); + static String GetIDFromLegacyID(int id); + static DynamicObject::Ptr GetOwnerByCommentID(const String& id); + static Dictionary::Ptr GetCommentByID(const String& id); static void InvalidateCommentCache(void); private: static int m_NextCommentID; - static map m_CommentCache; + static map m_LegacyCommentCache; + static map m_CommentCache; static bool m_CommentCacheValid; CommentProcessor(void); diff --git a/lib/icinga/downtimeprocessor.cpp b/lib/icinga/downtimeprocessor.cpp index 0f2617254..08fdeb1c8 100644 --- a/lib/icinga/downtimeprocessor.cpp +++ b/lib/icinga/downtimeprocessor.cpp @@ -22,7 +22,8 @@ using namespace icinga; int DowntimeProcessor::m_NextDowntimeID = 1; -map DowntimeProcessor::m_DowntimeCache; +map DowntimeProcessor::m_LegacyDowntimeCache; +map DowntimeProcessor::m_DowntimeCache; bool DowntimeProcessor::m_DowntimeCacheValid; int DowntimeProcessor::GetNextDowntimeID(void) @@ -30,10 +31,10 @@ int DowntimeProcessor::GetNextDowntimeID(void) return m_NextDowntimeID; } -int DowntimeProcessor::AddDowntime(const DynamicObject::Ptr& owner, +String DowntimeProcessor::AddDowntime(const DynamicObject::Ptr& owner, const String& author, const String& comment, double startTime, double endTime, - bool fixed, int triggeredBy, double duration) + bool fixed, const String& triggeredBy, double duration) { Dictionary::Ptr downtime = boost::make_shared(); downtime->Set("entry_time", Utility::GetTime()); @@ -51,35 +52,42 @@ int DowntimeProcessor::AddDowntime(const DynamicObject::Ptr& owner, if (!downtimes) downtimes = boost::make_shared(); - int id = m_NextDowntimeID; + int legacy_id = m_NextDowntimeID; m_NextDowntimeID++; + downtime->Set("legacy_id", legacy_id); - downtimes->Set(Convert::ToString(id), downtime); + String id = Utility::NewUUID(); + downtimes->Set(id, downtime); owner->Set("downtimes", downtimes); return id; } -void DowntimeProcessor::RemoveDowntime(int id) +void DowntimeProcessor::RemoveDowntime(const String& id) { DynamicObject::Ptr owner = GetOwnerByDowntimeID(id); Dictionary::Ptr downtimes = owner->Get("downtimes"); if (downtimes) { - downtimes->Remove(Convert::ToString(id)); + downtimes->Remove(id); owner->Touch("downtimes"); } } -DynamicObject::Ptr DowntimeProcessor::GetOwnerByDowntimeID(int id) +String DowntimeProcessor::GetIDFromLegacyID(int id) +{ + return Convert::ToString(id); +} + +DynamicObject::Ptr DowntimeProcessor::GetOwnerByDowntimeID(const String& id) { ValidateDowntimeCache(); return m_DowntimeCache[id].lock(); } -Dictionary::Ptr DowntimeProcessor::GetDowntimeByID(int id) +Dictionary::Ptr DowntimeProcessor::GetDowntimeByID(const String& id) { DynamicObject::Ptr owner = GetOwnerByDowntimeID(id); @@ -89,7 +97,7 @@ Dictionary::Ptr DowntimeProcessor::GetDowntimeByID(int id) Dictionary::Ptr downtimes = owner->Get("downtimes"); if (downtimes) { - Dictionary::Ptr downtime = downtimes->Get(Convert::ToString(id)); + Dictionary::Ptr downtime = downtimes->Get(id); return downtime; } @@ -119,6 +127,7 @@ void DowntimeProcessor::InvalidateDowntimeCache(void) { m_DowntimeCacheValid = false; m_DowntimeCache.clear(); + m_LegacyDowntimeCache.clear(); } void DowntimeProcessor::AddDowntimesToCache(const DynamicObject::Ptr& owner) @@ -128,12 +137,17 @@ void DowntimeProcessor::AddDowntimesToCache(const DynamicObject::Ptr& owner) if (!downtimes) return; - String sid; - BOOST_FOREACH(tie(sid, tuples::ignore), downtimes) { - int id = Convert::ToLong(sid); + String id; + Dictionary::Ptr downtime; + BOOST_FOREACH(tie(id, downtime), downtimes) { + if (downtime->Contains("legacy_id")) { + int legacy_id = downtime->Get("legacy_id"); - if (id > m_NextDowntimeID) - m_NextDowntimeID = id; + m_LegacyDowntimeCache[legacy_id] = id; + + if (legacy_id > m_NextDowntimeID) + m_NextDowntimeID = legacy_id; + } m_DowntimeCache[id] = owner; } @@ -145,6 +159,7 @@ void DowntimeProcessor::ValidateDowntimeCache(void) return; m_DowntimeCache.clear(); + m_LegacyDowntimeCache.clear(); DynamicObject::Ptr object; BOOST_FOREACH(tie(tuples::ignore, object), DynamicType::GetByName("Host")->GetObjects()) { diff --git a/lib/icinga/downtimeprocessor.h b/lib/icinga/downtimeprocessor.h index 530a59686..9c2090d57 100644 --- a/lib/icinga/downtimeprocessor.h +++ b/lib/icinga/downtimeprocessor.h @@ -33,15 +33,16 @@ class I2_ICINGA_API DowntimeProcessor public: static int GetNextDowntimeID(void); - static int AddDowntime(const DynamicObject::Ptr& owner, + static String AddDowntime(const DynamicObject::Ptr& owner, const String& author, const String& comment, double startTime, double endTime, - bool fixed, int triggeredBy, double duration); + bool fixed, const String& triggeredBy, double duration); - static void RemoveDowntime(int id); + static void RemoveDowntime(const String& id); - static DynamicObject::Ptr GetOwnerByDowntimeID(int id); - static Dictionary::Ptr GetDowntimeByID(int id); + static String GetIDFromLegacyID(int id); + static DynamicObject::Ptr GetOwnerByDowntimeID(const String& id); + static Dictionary::Ptr GetDowntimeByID(const String& id); static bool IsDowntimeActive(const Dictionary::Ptr& downtime); @@ -50,7 +51,8 @@ public: private: static int m_NextDowntimeID; - static map m_DowntimeCache; + static map m_LegacyDowntimeCache; + static map m_DowntimeCache; static bool m_DowntimeCacheValid; DowntimeProcessor(void); diff --git a/lib/icinga/externalcommandprocessor.cpp b/lib/icinga/externalcommandprocessor.cpp index 139e52e90..252cd5d9b 100644 --- a/lib/icinga/externalcommandprocessor.cpp +++ b/lib/icinga/externalcommandprocessor.cpp @@ -622,11 +622,15 @@ void ExternalCommandProcessor::ScheduleSvcDowntime(double time, const vectorGetName()); + String triggeredBy; + int triggeredByLegacy = Convert::ToLong(arguments[5]); + if (triggeredByLegacy != 0) + triggeredBy = DowntimeProcessor::GetIDFromLegacyID(triggeredByLegacy); + Logger::Write(LogInformation, "icinga", "Creating downtime for service " + service->GetName()); (void) DowntimeProcessor::AddDowntime(service, arguments[7], arguments[8], Convert::ToDouble(arguments[2]), Convert::ToDouble(arguments[3]), - Convert::ToBool(arguments[4]), Convert::ToLong(arguments[5]), Convert::ToDouble(arguments[6])); + Convert::ToBool(arguments[4]), triggeredBy, Convert::ToDouble(arguments[6])); } void ExternalCommandProcessor::DelSvcDowntime(double time, const vector& arguments) @@ -634,9 +638,10 @@ void ExternalCommandProcessor::DelSvcDowntime(double time, const vector& if (arguments.size() < 1) throw_exception(invalid_argument("Expected 1 argument.")); - String id = arguments[0]; - Logger::Write(LogInformation, "icinga", "Removing downtime ID " + id); - DowntimeProcessor::RemoveDowntime(Convert::ToLong(id)); + int id = Convert::ToLong(arguments[0]); + Logger::Write(LogInformation, "icinga", "Removing downtime ID " + arguments[0]); + String rid = DowntimeProcessor::GetIDFromLegacyID(id); + DowntimeProcessor::RemoveDowntime(rid); } void ExternalCommandProcessor::ScheduleHostDowntime(double time, const vector& arguments) @@ -649,11 +654,15 @@ void ExternalCommandProcessor::ScheduleHostDowntime(double time, const vectorGetName()); + String triggeredBy; + int triggeredByLegacy = Convert::ToLong(arguments[4]); + if (triggeredByLegacy != 0) + triggeredBy = DowntimeProcessor::GetIDFromLegacyID(triggeredByLegacy); + Logger::Write(LogInformation, "icinga", "Creating downtime for host " + host->GetName()); (void) DowntimeProcessor::AddDowntime(host, arguments[6], arguments[7], Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]), - Convert::ToBool(arguments[3]), Convert::ToLong(arguments[4]), Convert::ToDouble(arguments[5])); + Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5])); } void ExternalCommandProcessor::DelHostDowntime(double time, const vector& arguments) @@ -661,9 +670,10 @@ void ExternalCommandProcessor::DelHostDowntime(double time, const vector if (arguments.size() < 1) throw_exception(invalid_argument("Expected 1 argument.")); - String id = arguments[0]; - Logger::Write(LogInformation, "icinga", "Removing downtime ID " + id); - DowntimeProcessor::RemoveDowntime(Convert::ToLong(id)); + int id = Convert::ToLong(arguments[0]); + Logger::Write(LogInformation, "icinga", "Removing downtime ID " + arguments[0]); + String rid = DowntimeProcessor::GetIDFromLegacyID(id); + DowntimeProcessor::RemoveDowntime(rid); } void ExternalCommandProcessor::ScheduleHostSvcDowntime(double time, const vector& arguments) @@ -676,16 +686,21 @@ void ExternalCommandProcessor::ScheduleHostSvcDowntime(double time, const vector Host::Ptr host = Host::GetByName(arguments[0]); + String triggeredBy; + int triggeredByLegacy = Convert::ToLong(arguments[4]); + if (triggeredByLegacy != 0) + triggeredBy = DowntimeProcessor::GetIDFromLegacyID(triggeredByLegacy); + Logger::Write(LogInformation, "icinga", "Creating downtime for host " + host->GetName()); (void) DowntimeProcessor::AddDowntime(host, arguments[6], arguments[7], Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]), - Convert::ToBool(arguments[3]), Convert::ToLong(arguments[4]), Convert::ToDouble(arguments[5])); + Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5])); BOOST_FOREACH(const Service::Ptr& service, host->GetServices()) { Logger::Write(LogInformation, "icinga", "Creating downtime for service " + service->GetName()); (void) DowntimeProcessor::AddDowntime(service, arguments[6], arguments[7], Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]), - Convert::ToBool(arguments[3]), Convert::ToLong(arguments[4]), Convert::ToDouble(arguments[5])); + Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5])); } } @@ -699,11 +714,16 @@ void ExternalCommandProcessor::ScheduleHostgroupHostDowntime(double time, const HostGroup::Ptr hg = HostGroup::GetByName(arguments[0]); + String triggeredBy; + int triggeredByLegacy = Convert::ToLong(arguments[4]); + if (triggeredByLegacy != 0) + triggeredBy = DowntimeProcessor::GetIDFromLegacyID(triggeredByLegacy); + BOOST_FOREACH(const Host::Ptr& host, hg->GetMembers()) { Logger::Write(LogInformation, "icinga", "Creating downtime for host " + host->GetName()); (void) DowntimeProcessor::AddDowntime(host, arguments[6], arguments[7], Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]), - Convert::ToBool(arguments[3]), Convert::ToLong(arguments[4]), Convert::ToDouble(arguments[5])); + Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5])); } } @@ -727,11 +747,16 @@ void ExternalCommandProcessor::ScheduleServicegroupSvcDowntime(double time, cons ServiceGroup::Ptr sg = ServiceGroup::GetByName(arguments[0]); + String triggeredBy; + int triggeredByLegacy = Convert::ToLong(arguments[4]); + if (triggeredByLegacy != 0) + triggeredBy = DowntimeProcessor::GetIDFromLegacyID(triggeredByLegacy); + BOOST_FOREACH(const Service::Ptr& service, sg->GetMembers()) { Logger::Write(LogInformation, "icinga", "Creating downtime for service " + service->GetName()); (void) DowntimeProcessor::AddDowntime(service, arguments[6], arguments[7], Convert::ToDouble(arguments[1]), Convert::ToDouble(arguments[2]), - Convert::ToBool(arguments[3]), Convert::ToLong(arguments[4]), Convert::ToDouble(arguments[5])); + Convert::ToBool(arguments[3]), triggeredBy, Convert::ToDouble(arguments[5])); } } @@ -754,9 +779,10 @@ void ExternalCommandProcessor::DelHostComment(double time, const vector& if (arguments.size() < 1) throw_exception(invalid_argument("Expected 1 argument.")); - String id = arguments[0]; - Logger::Write(LogInformation, "icinga", "Removing comment ID " + id); - CommentProcessor::RemoveComment(Convert::ToLong(id)); + int id = Convert::ToLong(arguments[0]); + Logger::Write(LogInformation, "icinga", "Removing comment ID " + arguments[0]); + String rid = CommentProcessor::GetIDFromLegacyID(id); + CommentProcessor::RemoveComment(rid); } void ExternalCommandProcessor::AddSvcComment(double time, const vector& arguments) @@ -778,9 +804,11 @@ void ExternalCommandProcessor::DelSvcComment(double time, const vector& if (arguments.size() < 1) throw_exception(invalid_argument("Expected 1 argument.")); - String id = arguments[0]; - Logger::Write(LogInformation, "icinga", "Removing comment ID " + id); - CommentProcessor::RemoveComment(Convert::ToLong(id)); + int id = Convert::ToLong(arguments[0]); + Logger::Write(LogInformation, "icinga", "Removing comment ID " + arguments[0]); + + String rid = CommentProcessor::GetIDFromLegacyID(id); + CommentProcessor::RemoveComment(rid); } void ExternalCommandProcessor::DelAllHostComments(double time, const vector& arguments) diff --git a/lib/icinga/host.cpp b/lib/icinga/host.cpp index 142261742..6bf67d07f 100644 --- a/lib/icinga/host.cpp +++ b/lib/icinga/host.cpp @@ -31,7 +31,8 @@ static AttributeDescription hostAttributes[] = { { "hostchecks", Attribute_Config }, { "acknowledgement", Attribute_Replicated }, { "acknowledgement_expiry", Attribute_Replicated }, - { "downtimes", Attribute_Replicated } + { "downtimes", Attribute_Replicated }, + { "comments", Attribute_Replicated } }; REGISTER_TYPE(Host, hostAttributes); diff --git a/lib/icinga/service.cpp b/lib/icinga/service.cpp index 2227d15ca..e7815f4cc 100644 --- a/lib/icinga/service.cpp +++ b/lib/icinga/service.cpp @@ -48,7 +48,8 @@ static AttributeDescription serviceAttributes[] = { { "force_next_check", Attribute_Replicated }, { "acknowledgement", Attribute_Replicated }, { "acknowledgement_expiry", Attribute_Replicated }, - { "downtimes", Attribute_Replicated } + { "downtimes", Attribute_Replicated }, + { "comments", Attribute_Replicated } }; REGISTER_TYPE(Service, serviceAttributes);