mirror of https://github.com/Icinga/icinga2.git
Implement object config sync permissions and modified attributes based on version
refs #9927
This commit is contained in:
parent
6fa58a520c
commit
f9c058eca2
|
@ -59,6 +59,29 @@ Value ApiListener::ConfigUpdateObjectAPIHandler(const MessageOrigin::Ptr& origin
|
||||||
Log(LogWarning, "ApiListener")
|
Log(LogWarning, "ApiListener")
|
||||||
<< "Received update for object: " << JsonEncode(params);
|
<< "Received update for object: " << JsonEncode(params);
|
||||||
|
|
||||||
|
/* check permissions */
|
||||||
|
ApiListener::Ptr listener = ApiListener::GetInstance();
|
||||||
|
|
||||||
|
if (!listener) {
|
||||||
|
Log(LogCritical, "ApiListener", "No instance available.");
|
||||||
|
return Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!listener->GetAcceptConfig()) {
|
||||||
|
Log(LogWarning, "ApiListener")
|
||||||
|
<< "Ignoring config update. '" << listener->GetName() << "' does not accept config.";
|
||||||
|
return Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
Endpoint::Ptr endpoint = origin->FromClient->GetEndpoint();
|
||||||
|
|
||||||
|
if (!endpoint) {
|
||||||
|
Log(LogNotice, "ApiListener")
|
||||||
|
<< "Discarding 'config update object' message from '" << origin->FromClient->GetIdentity() << "': Invalid endpoint origin (client not allowed).";
|
||||||
|
return Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* update the object */
|
||||||
ConfigType::Ptr dtype = ConfigType::GetByName(params->Get("type"));
|
ConfigType::Ptr dtype = ConfigType::GetByName(params->Get("type"));
|
||||||
|
|
||||||
if (!dtype) {
|
if (!dtype) {
|
||||||
|
@ -82,6 +105,30 @@ Value ApiListener::ConfigUpdateObjectAPIHandler(const MessageOrigin::Ptr& origin
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO-MA: modified attributes, same version
|
//TODO-MA: modified attributes, same version
|
||||||
|
} else {
|
||||||
|
/* object exists, update its attributes if version was changed */
|
||||||
|
if (params->Get("version") > object->GetVersion()) {
|
||||||
|
Log(LogInformation, "ApiListener")
|
||||||
|
<< "Processing config update for object '" << object->GetName()
|
||||||
|
<< "': Object version '" << object->GetVersion()
|
||||||
|
<< "' is older than the received version '" << params->Get("version") << "'.";
|
||||||
|
|
||||||
|
Dictionary::Ptr modified_attributes = params->Get("modified_attributes");
|
||||||
|
|
||||||
|
if (modified_attributes) {
|
||||||
|
ObjectLock olock(modified_attributes);
|
||||||
|
BOOST_FOREACH(const Dictionary::Pair& kv, modified_attributes) {
|
||||||
|
int fid = object->GetReflectionType()->GetFieldId(kv.first);
|
||||||
|
static_cast<Object::Ptr>(object)->SetField(fid, kv.second, false, origin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Log(LogWarning, "ApiListener")
|
||||||
|
<< "Skipping config update for object '" << object->GetName()
|
||||||
|
<< "': Object version '" << object->GetVersion()
|
||||||
|
<< "' is more recent than the received version '" << params->Get("version") << "'.";
|
||||||
|
return Empty;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Empty;
|
return Empty;
|
||||||
|
|
Loading…
Reference in New Issue