mirror of https://github.com/Icinga/icinga2.git
Fix syncing zones.d from etc/ to var/lib in a recursive manner
Missing mkdir -p basically. Introducing Utility::MkDirP() which still requires Win32 implementation. refs #6328
This commit is contained in:
parent
9e026959db
commit
2acf6a063e
|
@ -23,6 +23,7 @@
|
||||||
#include "base/logger_fwd.hpp"
|
#include "base/logger_fwd.hpp"
|
||||||
#include "base/exception.hpp"
|
#include "base/exception.hpp"
|
||||||
#include "base/socket.hpp"
|
#include "base/socket.hpp"
|
||||||
|
#include "base/utility.hpp"
|
||||||
#include <mmatch.h>
|
#include <mmatch.h>
|
||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
#include <boost/foreach.hpp>
|
#include <boost/foreach.hpp>
|
||||||
|
@ -670,6 +671,31 @@ bool Utility::GlobRecursive(const String& path, const String& pattern, const boo
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Utility::MkDirP(const String& path, int flags)
|
||||||
|
{
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
/* TODO */
|
||||||
|
return 0;
|
||||||
|
#else /* _WIN32 */
|
||||||
|
|
||||||
|
if (path.IsEmpty()) {
|
||||||
|
errno = EINVAL;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (path.GetLength() == 1 && path[0] == '.')
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
String dir = DirName(path);
|
||||||
|
|
||||||
|
MkDirP(dir, flags);
|
||||||
|
|
||||||
|
return mkdir(dir.CStr(), flags);
|
||||||
|
#endif /* _WIN32 */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
void Utility::SetNonBlocking(int fd)
|
void Utility::SetNonBlocking(int fd)
|
||||||
{
|
{
|
||||||
|
|
|
@ -81,6 +81,7 @@ public:
|
||||||
|
|
||||||
static bool Glob(const String& pathSpec, const boost::function<void (const String&)>& callback, int type = GlobFile | GlobDirectory);
|
static bool Glob(const String& pathSpec, const boost::function<void (const String&)>& callback, int type = GlobFile | GlobDirectory);
|
||||||
static bool GlobRecursive(const String& path, const String& pattern, const boost::function<void (const String&)>& callback, int type = GlobFile | GlobDirectory);
|
static bool GlobRecursive(const String& path, const String& pattern, const boost::function<void (const String&)>& callback, int type = GlobFile | GlobDirectory);
|
||||||
|
static int MkDirP(const String& path, int flags);
|
||||||
|
|
||||||
static void QueueAsyncCallback(const boost::function<void (void)>& callback);
|
static void QueueAsyncCallback(const boost::function<void (void)>& callback);
|
||||||
|
|
||||||
|
|
|
@ -35,10 +35,12 @@ bool ApiListener::IsConfigMaster(const Zone::Ptr& zone) const
|
||||||
return Utility::PathExists(path);
|
return Utility::PathExists(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ApiListener::ConfigGlobHandler(const Dictionary::Ptr& config, const String& path, const String& file)
|
void ApiListener::ConfigGlobHandler(Dictionary::Ptr& config, const String& path, const String& file)
|
||||||
{
|
{
|
||||||
CONTEXT("Creating config update for file '" + file + "'");
|
CONTEXT("Creating config update for file '" + file + "'");
|
||||||
|
|
||||||
|
Log(LogNotice, "ApiListener", "Creating config update for file '" + file + "'");
|
||||||
|
|
||||||
std::ifstream fp(file.CStr());
|
std::ifstream fp(file.CStr());
|
||||||
if (!fp)
|
if (!fp)
|
||||||
return;
|
return;
|
||||||
|
@ -50,7 +52,7 @@ void ApiListener::ConfigGlobHandler(const Dictionary::Ptr& config, const String&
|
||||||
Dictionary::Ptr ApiListener::LoadConfigDir(const String& dir)
|
Dictionary::Ptr ApiListener::LoadConfigDir(const String& dir)
|
||||||
{
|
{
|
||||||
Dictionary::Ptr config = make_shared<Dictionary>();
|
Dictionary::Ptr config = make_shared<Dictionary>();
|
||||||
Utility::GlobRecursive(dir, "*.conf", boost::bind(&ApiListener::ConfigGlobHandler, config, dir, _1), GlobFile);
|
Utility::GlobRecursive(dir, "*.conf", boost::bind(&ApiListener::ConfigGlobHandler, boost::ref(config), dir, _1), GlobFile);
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,6 +76,8 @@ bool ApiListener::UpdateConfigDir(const Dictionary::Ptr& oldConfig, const Dictio
|
||||||
String path = configDir + "/" + kv.first;
|
String path = configDir + "/" + kv.first;
|
||||||
Log(LogInformation, "ApiListener", "Updating configuration file: " + path);
|
Log(LogInformation, "ApiListener", "Updating configuration file: " + path);
|
||||||
|
|
||||||
|
//TODO mkdir -p?
|
||||||
|
Utility::MkDirP(path, 0755);
|
||||||
std::ofstream fp(path.CStr(), std::ofstream::out | std::ostream::trunc);
|
std::ofstream fp(path.CStr(), std::ofstream::out | std::ostream::trunc);
|
||||||
fp << kv.second;
|
fp << kv.second;
|
||||||
fp.close();
|
fp.close();
|
||||||
|
|
|
@ -110,7 +110,7 @@ private:
|
||||||
void SyncZoneDir(const Zone::Ptr& zone) const;
|
void SyncZoneDir(const Zone::Ptr& zone) const;
|
||||||
|
|
||||||
bool IsConfigMaster(const Zone::Ptr& zone) const;
|
bool IsConfigMaster(const Zone::Ptr& zone) const;
|
||||||
static void ConfigGlobHandler(const Dictionary::Ptr& config, const String& path, const String& file);
|
static void ConfigGlobHandler(Dictionary::Ptr& config, const String& path, const String& file);
|
||||||
void SendConfigUpdate(const ApiClient::Ptr& aclient);
|
void SendConfigUpdate(const ApiClient::Ptr& aclient);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue