mirror of https://github.com/Icinga/icinga2.git
Cli: Repository should validate if object exists before add/remove
fixes #7461
This commit is contained in:
parent
7c1cd4c506
commit
78140fa1c8
|
@ -155,13 +155,6 @@ void RepositoryUtility::PrintObjects(std::ostream& fp, const String& type)
|
||||||
}
|
}
|
||||||
|
|
||||||
fp << "\n";
|
fp << "\n";
|
||||||
|
|
||||||
/*
|
|
||||||
Dictionary::Ptr obj = GetObjectFromRepository(object); //TODO: config parser not implemented yet!
|
|
||||||
|
|
||||||
if (obj)
|
|
||||||
fp << JsonEncode(obj);
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -259,6 +252,15 @@ bool RepositoryUtility::AddObject(const String& name, const String& type, const
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (CheckChangeExists(change)) {
|
||||||
|
Log(LogWarning, "cli")
|
||||||
|
<< "Change '" << change->Get("command") << "' for type '"
|
||||||
|
<< change->Get("type") << "' and name '" << change->Get("name")
|
||||||
|
<< "' already exists.";
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return WriteObjectToRepositoryChangeLog(path, change);
|
return WriteObjectToRepositoryChangeLog(path, change);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -275,6 +277,15 @@ bool RepositoryUtility::RemoveObject(const String& name, const String& type, con
|
||||||
change->Set("command", "remove");
|
change->Set("command", "remove");
|
||||||
change->Set("attrs", attrs); //required for service->host_name
|
change->Set("attrs", attrs); //required for service->host_name
|
||||||
|
|
||||||
|
if (CheckChangeExists(change)) {
|
||||||
|
Log(LogWarning, "cli")
|
||||||
|
<< "Change '" << change->Get("command") << "' for type '"
|
||||||
|
<< change->Get("type") << "' and name '" << change->Get("name")
|
||||||
|
<< "' already exists.";
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return WriteObjectToRepositoryChangeLog(path, change);
|
return WriteObjectToRepositoryChangeLog(path, change);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,6 +295,32 @@ bool RepositoryUtility::SetObjectAttribute(const String& name, const String& typ
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool RepositoryUtility::CheckChangeExists(const Dictionary::Ptr& change)
|
||||||
|
{
|
||||||
|
Array::Ptr changelog = make_shared<Array>();
|
||||||
|
|
||||||
|
GetChangeLog(boost::bind(RepositoryUtility::CollectChange, _1, boost::ref(changelog)));
|
||||||
|
|
||||||
|
ObjectLock olock(changelog);
|
||||||
|
BOOST_FOREACH(const Dictionary::Ptr& entry, changelog) {
|
||||||
|
if (entry->Get("type") != change->Get("type"))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (entry->Get("name") != change->Get("name"))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (entry->Get("command") != change->Get("command"))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* only works for add/remove commands (no set) */
|
||||||
|
if (change->Get("command") == "add" || change->Get("command") == "remove") {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool RepositoryUtility::ClearChangeLog(void)
|
bool RepositoryUtility::ClearChangeLog(void)
|
||||||
{
|
{
|
||||||
GetChangeLog(boost::bind(RepositoryUtility::ClearChange, _1, _2));
|
GetChangeLog(boost::bind(RepositoryUtility::ClearChange, _1, _2));
|
||||||
|
@ -369,6 +406,10 @@ bool RepositoryUtility::RemoveObjectInternal(const String& name, const String& t
|
||||||
|
|
||||||
bool success = RemoveObjectFileInternal(path);
|
bool success = RemoveObjectFileInternal(path);
|
||||||
|
|
||||||
|
if (success)
|
||||||
|
Log(LogInformation, "cli")
|
||||||
|
<< "Removing config object '" << name << "' in file '" << path << "'";
|
||||||
|
|
||||||
/* special treatment for hosts -> remove the services too */
|
/* special treatment for hosts -> remove the services too */
|
||||||
if (type == "Host") {
|
if (type == "Host") {
|
||||||
path = GetRepositoryObjectConfigPath(type, attrs) + "/" + name;
|
path = GetRepositoryObjectConfigPath(type, attrs) + "/" + name;
|
||||||
|
@ -446,7 +487,7 @@ bool RepositoryUtility::SetObjectAttributeInternal(const String& name, const Str
|
||||||
bool RepositoryUtility::WriteObjectToRepository(const String& path, const String& name, const String& type, const Dictionary::Ptr& item)
|
bool RepositoryUtility::WriteObjectToRepository(const String& path, const String& name, const String& type, const Dictionary::Ptr& item)
|
||||||
{
|
{
|
||||||
Log(LogInformation, "cli")
|
Log(LogInformation, "cli")
|
||||||
<< "Dumping config object '" << name << "' to file '" << path << "'";
|
<< "Writing config object '" << name << "' to file '" << path << "'";
|
||||||
|
|
||||||
Utility::MkDirP(Utility::DirName(path), 0755);
|
Utility::MkDirP(Utility::DirName(path), 0755);
|
||||||
|
|
||||||
|
@ -607,9 +648,7 @@ void RepositoryUtility::FormatChangelogEntry(std::ostream& fp, const Dictionary:
|
||||||
Dictionary::Ptr attrs = change->Get("attrs");
|
Dictionary::Ptr attrs = change->Get("attrs");
|
||||||
|
|
||||||
fp << " " << ConsoleColorTag(Console_ForegroundMagenta | Console_Bold) << type << ConsoleColorTag(Console_Normal) << " '";
|
fp << " " << ConsoleColorTag(Console_ForegroundMagenta | Console_Bold) << type << ConsoleColorTag(Console_Normal) << " '";
|
||||||
fp << ConsoleColorTag(Console_ForegroundBlue | Console_Bold) << change->Get("name") << ConsoleColorTag(Console_Normal) << "'";
|
fp << ConsoleColorTag(Console_ForegroundBlue | Console_Bold) << change->Get("name") << ConsoleColorTag(Console_Normal) << "'\n";
|
||||||
|
|
||||||
fp << ": \n";
|
|
||||||
|
|
||||||
BOOST_FOREACH(const Dictionary::Pair& kv, attrs) {
|
BOOST_FOREACH(const Dictionary::Pair& kv, attrs) {
|
||||||
/* skip the name */
|
/* skip the name */
|
||||||
|
|
|
@ -53,6 +53,8 @@ public:
|
||||||
static bool AddObject(const String& name, const String& type, const Dictionary::Ptr& attrs);
|
static bool AddObject(const String& name, const String& type, const Dictionary::Ptr& attrs);
|
||||||
static bool RemoveObject(const String& name, const String& type, const Dictionary::Ptr& attrs);
|
static bool RemoveObject(const String& name, const String& type, const Dictionary::Ptr& attrs);
|
||||||
|
|
||||||
|
static bool CheckChangeExists(const Dictionary::Ptr& change);
|
||||||
|
|
||||||
static bool SetObjectAttribute(const String& name, const String& type, const String& attr, const Value& val);
|
static bool SetObjectAttribute(const String& name, const String& type, const String& attr, const Value& val);
|
||||||
|
|
||||||
static bool CommitChangeLog(void);
|
static bool CommitChangeLog(void);
|
||||||
|
|
Loading…
Reference in New Issue