mirror of https://github.com/Icinga/icinga2.git
parent
65a9ee0dbb
commit
d516d16c9a
|
@ -232,7 +232,7 @@ void ConfigObject::ModifyAttribute(const String& attr, const Value& value, bool
|
||||||
NotifyOriginalAttributes();
|
NotifyOriginalAttributes();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigObject::RestoreAttribute(const String& attr)
|
void ConfigObject::RestoreAttribute(const String& attr, bool updateVersion)
|
||||||
{
|
{
|
||||||
Type::Ptr type = GetReflectionType();
|
Type::Ptr type = GetReflectionType();
|
||||||
|
|
||||||
|
@ -344,6 +344,7 @@ void ConfigObject::RestoreAttribute(const String& attr)
|
||||||
original_attributes->Remove(attr);
|
original_attributes->Remove(attr);
|
||||||
SetField(fid, newValue);
|
SetField(fid, newValue);
|
||||||
|
|
||||||
|
if (updateVersion)
|
||||||
SetVersion(Utility::GetTime());
|
SetVersion(Utility::GetTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,7 @@ public:
|
||||||
void ClearExtension(const String& key);
|
void ClearExtension(const String& key);
|
||||||
|
|
||||||
void ModifyAttribute(const String& attr, const Value& value, bool updateVersion = true);
|
void ModifyAttribute(const String& attr, const Value& value, bool updateVersion = true);
|
||||||
void RestoreAttribute(const String& attr);
|
void RestoreAttribute(const String& attr, bool updateVersion = true);
|
||||||
bool IsAttributeModified(const String& attr) const;
|
bool IsAttributeModified(const String& attr) const;
|
||||||
|
|
||||||
void Register(void);
|
void Register(void);
|
||||||
|
|
|
@ -164,6 +164,28 @@ Value ApiListener::ConfigUpdateObjectAPIHandler(const MessageOrigin::Ptr& origin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* check whether original attributes changed and restore them locally */
|
||||||
|
Array::Ptr newOriginalAttributes = params->Get("original_attributes");
|
||||||
|
Dictionary::Ptr objOriginalAttributes = object->GetOriginalAttributes();
|
||||||
|
|
||||||
|
if (newOriginalAttributes && objOriginalAttributes) {
|
||||||
|
std::vector<String> restoreAttrs;
|
||||||
|
|
||||||
|
{
|
||||||
|
ObjectLock xlock(objOriginalAttributes);
|
||||||
|
BOOST_FOREACH(const Dictionary::Pair& kv, objOriginalAttributes) {
|
||||||
|
/* original attribute was removed, restore it */
|
||||||
|
if (!newOriginalAttributes->Contains(kv.first))
|
||||||
|
restoreAttrs.push_back(kv.first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_FOREACH(const String& key, restoreAttrs) {
|
||||||
|
/* do not update the object version yet. */
|
||||||
|
object->RestoreAttribute(key, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* keep the object version in sync with the sender */
|
/* keep the object version in sync with the sender */
|
||||||
object->SetVersion(objVersion, false, origin);
|
object->SetVersion(objVersion, false, origin);
|
||||||
|
|
||||||
|
@ -278,6 +300,7 @@ void ApiListener::UpdateConfigObject(const ConfigObject::Ptr& object, const Mess
|
||||||
|
|
||||||
Dictionary::Ptr original_attributes = object->GetOriginalAttributes();
|
Dictionary::Ptr original_attributes = object->GetOriginalAttributes();
|
||||||
Dictionary::Ptr modified_attributes = new Dictionary();
|
Dictionary::Ptr modified_attributes = new Dictionary();
|
||||||
|
Array::Ptr newOriginalAttributes = new Array();
|
||||||
|
|
||||||
if (original_attributes) {
|
if (original_attributes) {
|
||||||
ObjectLock olock(original_attributes);
|
ObjectLock olock(original_attributes);
|
||||||
|
@ -291,11 +314,16 @@ void ApiListener::UpdateConfigObject(const ConfigObject::Ptr& object, const Mess
|
||||||
}
|
}
|
||||||
|
|
||||||
modified_attributes->Set(kv.first, value);
|
modified_attributes->Set(kv.first, value);
|
||||||
|
|
||||||
|
newOriginalAttributes->Add(kv.first);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
params->Set("modified_attributes", modified_attributes);
|
params->Set("modified_attributes", modified_attributes);
|
||||||
|
|
||||||
|
/* only send the original attribute keys */
|
||||||
|
params->Set("original_attributes", newOriginalAttributes);
|
||||||
|
|
||||||
message->Set("params", params);
|
message->Set("params", params);
|
||||||
|
|
||||||
#ifdef I2_DEBUG
|
#ifdef I2_DEBUG
|
||||||
|
|
Loading…
Reference in New Issue