+ Log(LogWarning, "ApiListener")
+ << "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;
+ }
+
+ /* delete the object */
+ ConfigType::Ptr dtype = ConfigType::GetByName(params->Get("type"));
+
+ if (!dtype) {
+ Log(LogCritical, "ApiListener")
+ << "Config type '" << params->Get("type") << "' does not exist.";
+ return Empty;
+ }
+
+ ConfigObject::Ptr object = dtype->GetObject(params->Get("name"));
+
+ if (object) {
+
+ if (object->GetPackage() != "_api") {
+ Log(LogCritical, "ApiListener")
+ << "Could not delete object '" << object->GetName() << "': Not created by the API.";
+ return Empty;
+ }
+
+ Array::Ptr errors = new Array();
+ bool cascade = true; //TODO pass that through the cluster
+ if (!ConfigObjectUtility::DeleteObject(object, cascade, errors)) {
+ Log(LogCritical, "ApiListener", "Could not delete object:");
+
+ ObjectLock olock(errors);
+ BOOST_FOREACH(const String& error, errors) {
+ Log(LogCritical, "ApiListener", error);
+ }
+ }
+ } else {
+ Log(LogWarning, "ApiListener")
+ << "Could not delete non-existing object '" << params->Get("name") << "'.";
+ }
+