mirror of https://github.com/Icinga/icinga2.git
Use the ZoneName and NodeName constants for 'node setup' and 'node wizard'
refs #10716
This commit is contained in:
parent
65018fb75b
commit
93c5fc5b82
|
@ -122,6 +122,8 @@ void ConfigWriter::EmitValue(std::ostream& fp, int indentLevel, const Value& val
|
||||||
EmitArray(fp, indentLevel, val);
|
EmitArray(fp, indentLevel, val);
|
||||||
else if (val.IsObjectType<Dictionary>())
|
else if (val.IsObjectType<Dictionary>())
|
||||||
EmitScope(fp, indentLevel, val);
|
EmitScope(fp, indentLevel, val);
|
||||||
|
else if (val.IsObjectType<ConfigIdentifier>())
|
||||||
|
EmitIdentifier(fp, static_cast<ConfigIdentifier::Ptr>(val)->GetName(), false);
|
||||||
else if (val.IsString())
|
else if (val.IsString())
|
||||||
EmitString(fp, val);
|
EmitString(fp, val);
|
||||||
else if (val.IsNumber())
|
else if (val.IsNumber())
|
||||||
|
@ -260,3 +262,12 @@ const std::vector<String>& ConfigWriter::GetKeywords(void)
|
||||||
|
|
||||||
return keywords;
|
return keywords;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ConfigIdentifier::ConfigIdentifier(const String& identifier)
|
||||||
|
: m_Name(identifier)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
String ConfigIdentifier::GetName(void) const
|
||||||
|
{
|
||||||
|
return m_Name;
|
||||||
|
}
|
||||||
|
|
|
@ -28,6 +28,24 @@
|
||||||
namespace icinga
|
namespace icinga
|
||||||
{
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A config identifier.
|
||||||
|
*
|
||||||
|
* @ingroup base
|
||||||
|
*/
|
||||||
|
class I2_BASE_API ConfigIdentifier : public Object
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DECLARE_PTR_TYPEDEFS(ConfigIdentifier);
|
||||||
|
|
||||||
|
ConfigIdentifier(const String& name);
|
||||||
|
|
||||||
|
String GetName(void) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
String m_Name;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A configuration writer.
|
* A configuration writer.
|
||||||
*
|
*
|
||||||
|
|
|
@ -154,13 +154,11 @@ int NodeSetupCommand::SetupMaster(const boost::program_options::variables_map& v
|
||||||
<< "'api' feature already enabled.\n";
|
<< "'api' feature already enabled.\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
NodeUtility::GenerateNodeMasterIcingaConfig(cn);
|
/* write zones.conf and update with zone + endpoint information */
|
||||||
|
|
||||||
/* read zones.conf and update with zone + endpoint information */
|
|
||||||
|
|
||||||
Log(LogInformation, "cli", "Generating zone and object configuration.");
|
Log(LogInformation, "cli", "Generating zone and object configuration.");
|
||||||
|
|
||||||
NodeUtility::GenerateNodeMasterIcingaConfig(cn);
|
NodeUtility::GenerateNodeMasterIcingaConfig();
|
||||||
|
|
||||||
/* update the ApiListener config - SetupMaster() will always enable it */
|
/* update the ApiListener config - SetupMaster() will always enable it */
|
||||||
|
|
||||||
|
@ -220,6 +218,7 @@ int NodeSetupCommand::SetupMaster(const boost::program_options::variables_map& v
|
||||||
NodeUtility::CreateBackupFile(Application::GetSysconfDir() + "/icinga2/constants.conf");
|
NodeUtility::CreateBackupFile(Application::GetSysconfDir() + "/icinga2/constants.conf");
|
||||||
|
|
||||||
NodeUtility::UpdateConstant("NodeName", cn);
|
NodeUtility::UpdateConstant("NodeName", cn);
|
||||||
|
NodeUtility::UpdateConstant("ZoneName", cn);
|
||||||
|
|
||||||
String salt = RandomString(16);
|
String salt = RandomString(16);
|
||||||
|
|
||||||
|
@ -433,7 +432,7 @@ int NodeSetupCommand::SetupNode(const boost::program_options::variables_map& vm,
|
||||||
|
|
||||||
Log(LogInformation, "cli", "Generating zone and object configuration.");
|
Log(LogInformation, "cli", "Generating zone and object configuration.");
|
||||||
|
|
||||||
NodeUtility::GenerateNodeIcingaConfig(vm["endpoint"].as<std::vector<std::string> >(), cn, vm["zone"].as<std::string>());
|
NodeUtility::GenerateNodeIcingaConfig(vm["endpoint"].as<std::vector<std::string> >());
|
||||||
|
|
||||||
/* update constants.conf with NodeName = CN */
|
/* update constants.conf with NodeName = CN */
|
||||||
if (cn != Utility::GetFQDN()) {
|
if (cn != Utility::GetFQDN()) {
|
||||||
|
@ -446,6 +445,7 @@ int NodeSetupCommand::SetupNode(const boost::program_options::variables_map& vm,
|
||||||
NodeUtility::CreateBackupFile(Application::GetSysconfDir() + "/icinga2/constants.conf");
|
NodeUtility::CreateBackupFile(Application::GetSysconfDir() + "/icinga2/constants.conf");
|
||||||
|
|
||||||
NodeUtility::UpdateConstant("NodeName", cn);
|
NodeUtility::UpdateConstant("NodeName", cn);
|
||||||
|
NodeUtility::UpdateConstant("ZoneName", vm["zone"].as<std::string>());
|
||||||
|
|
||||||
/* tell the user to reload icinga2 */
|
/* tell the user to reload icinga2 */
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include "base/objectlock.hpp"
|
#include "base/objectlock.hpp"
|
||||||
#include "base/console.hpp"
|
#include "base/console.hpp"
|
||||||
#include "base/exception.hpp"
|
#include "base/exception.hpp"
|
||||||
|
#include "base/configwriter.hpp"
|
||||||
#include <boost/foreach.hpp>
|
#include <boost/foreach.hpp>
|
||||||
#include <boost/algorithm/string/classification.hpp>
|
#include <boost/algorithm/string/classification.hpp>
|
||||||
#include <boost/algorithm/string/join.hpp>
|
#include <boost/algorithm/string/join.hpp>
|
||||||
|
@ -254,7 +255,7 @@ void NodeUtility::CollectNodes(const String& node_file, std::vector<Dictionary::
|
||||||
* Node Setup helpers
|
* Node Setup helpers
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int NodeUtility::GenerateNodeIcingaConfig(const std::vector<std::string>& endpoints, const String& nodename, const String& zonename)
|
int NodeUtility::GenerateNodeIcingaConfig(const std::vector<std::string>& endpoints)
|
||||||
{
|
{
|
||||||
Array::Ptr my_config = new Array();
|
Array::Ptr my_config = new Array();
|
||||||
|
|
||||||
|
@ -306,17 +307,16 @@ int NodeUtility::GenerateNodeIcingaConfig(const std::vector<std::string>& endpoi
|
||||||
Dictionary::Ptr my_endpoint = new Dictionary();
|
Dictionary::Ptr my_endpoint = new Dictionary();
|
||||||
Dictionary::Ptr my_zone = new Dictionary();
|
Dictionary::Ptr my_zone = new Dictionary();
|
||||||
|
|
||||||
my_endpoint->Set("__name", nodename);
|
my_endpoint->Set("__name", new ConfigIdentifier("NodeName"));
|
||||||
my_endpoint->Set("__type", "Endpoint");
|
my_endpoint->Set("__type", "Endpoint");
|
||||||
|
|
||||||
Array::Ptr my_zone_members = new Array();
|
Array::Ptr my_zone_members = new Array();
|
||||||
my_zone_members->Add(nodename);
|
my_zone_members->Add(new ConfigIdentifier("NodeName"));
|
||||||
|
|
||||||
my_zone->Set("__name", zonename);
|
my_zone->Set("__name", new ConfigIdentifier("ZoneName"));
|
||||||
my_zone->Set("__type", "Zone");
|
my_zone->Set("__type", "Zone");
|
||||||
my_zone->Set("parent", master_zone_name); //set the master zone as parent
|
my_zone->Set("parent", master_zone_name); //set the master zone as parent
|
||||||
|
|
||||||
my_zone->Set("// This is the local node", nodename);
|
|
||||||
my_zone->Set("endpoints", my_zone_members);
|
my_zone->Set("endpoints", my_zone_members);
|
||||||
|
|
||||||
/* store the local config */
|
/* store the local config */
|
||||||
|
@ -331,7 +331,7 @@ int NodeUtility::GenerateNodeIcingaConfig(const std::vector<std::string>& endpoi
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int NodeUtility::GenerateNodeMasterIcingaConfig(const String& nodename)
|
int NodeUtility::GenerateNodeMasterIcingaConfig(void)
|
||||||
{
|
{
|
||||||
Array::Ptr my_config = new Array();
|
Array::Ptr my_config = new Array();
|
||||||
|
|
||||||
|
@ -340,16 +340,13 @@ int NodeUtility::GenerateNodeMasterIcingaConfig(const String& nodename)
|
||||||
Dictionary::Ptr my_master_zone = new Dictionary();
|
Dictionary::Ptr my_master_zone = new Dictionary();
|
||||||
Array::Ptr my_master_zone_members = new Array();
|
Array::Ptr my_master_zone_members = new Array();
|
||||||
|
|
||||||
my_master_endpoint->Set("__name", nodename);
|
my_master_endpoint->Set("__name", new ConfigIdentifier("NodeName"));
|
||||||
my_master_endpoint->Set("__type", "Endpoint");
|
my_master_endpoint->Set("__type", "Endpoint");
|
||||||
|
|
||||||
my_master_zone_members->Add(nodename);
|
my_master_zone_members->Add(new ConfigIdentifier("NodeName"));
|
||||||
|
|
||||||
String zonename = VariableUtility::GetVariable("ZoneName");
|
my_master_zone->Set("__name", new ConfigIdentifier("ZoneName"));
|
||||||
|
|
||||||
my_master_zone->Set("__name", zonename);
|
|
||||||
my_master_zone->Set("__type", "Zone");
|
my_master_zone->Set("__type", "Zone");
|
||||||
my_master_zone->Set("// This is the local master zone", zonename);
|
|
||||||
my_master_zone->Set("endpoints", my_master_zone_members);
|
my_master_zone->Set("endpoints", my_master_zone_members);
|
||||||
|
|
||||||
/* store the local config */
|
/* store the local config */
|
||||||
|
@ -364,10 +361,6 @@ int NodeUtility::GenerateNodeMasterIcingaConfig(const String& nodename)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* This is ugly and requires refactoring into a generic config writer class.
|
|
||||||
* TODO.
|
|
||||||
*/
|
|
||||||
bool NodeUtility::WriteNodeConfigObjects(const String& filename, const Array::Ptr& objects)
|
bool NodeUtility::WriteNodeConfigObjects(const String& filename, const Array::Ptr& objects)
|
||||||
{
|
{
|
||||||
Log(LogInformation, "cli")
|
Log(LogInformation, "cli")
|
||||||
|
@ -403,10 +396,7 @@ bool NodeUtility::WriteNodeConfigObjects(const String& filename, const Array::Pt
|
||||||
|
|
||||||
ObjectLock olock(objects);
|
ObjectLock olock(objects);
|
||||||
BOOST_FOREACH(const Dictionary::Ptr& object, objects) {
|
BOOST_FOREACH(const Dictionary::Ptr& object, objects) {
|
||||||
String name = object->Get("__name");
|
SerializeObject(fp, object);
|
||||||
String type = object->Get("__type");
|
|
||||||
|
|
||||||
SerializeObject(fp, name, type, object);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fp << std::endl;
|
fp << std::endl;
|
||||||
|
@ -622,60 +612,29 @@ bool NodeUtility::CreateBackupFile(const String& target, bool is_private)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NodeUtility::SerializeObject(std::ostream& fp, const String& name, const String& type, const Dictionary::Ptr& object)
|
void NodeUtility::SerializeObject(std::ostream& fp, const Dictionary::Ptr& object)
|
||||||
{
|
{
|
||||||
fp << "object " << type << " \"" << name << "\" {\n";
|
fp << "object ";
|
||||||
|
ConfigWriter::EmitIdentifier(fp, object->Get("__type"), false);
|
||||||
|
fp << " ";
|
||||||
|
ConfigWriter::EmitValue(fp, 0, object->Get("__name"));
|
||||||
|
fp << " {\n";
|
||||||
|
|
||||||
ObjectLock olock(object);
|
ObjectLock olock(object);
|
||||||
BOOST_FOREACH(const Dictionary::Pair& kv, object) {
|
BOOST_FOREACH(const Dictionary::Pair& kv, object) {
|
||||||
if (kv.first == "__type" || kv.first == "__name")
|
if (kv.first == "__type" || kv.first == "__name")
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
fp << "\t" << kv.first << " = ";
|
fp << "\t";
|
||||||
FormatValue(fp, kv.second);
|
ConfigWriter::EmitIdentifier(fp, kv.first, true);
|
||||||
fp << "\n";
|
fp << " = ";
|
||||||
|
ConfigWriter::EmitValue(fp, 1, kv.second);
|
||||||
|
fp << ";\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
fp << "}\n\n";
|
fp << "}\n\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
void NodeUtility::FormatValue(std::ostream& fp, const Value& val)
|
|
||||||
{
|
|
||||||
if (val.IsObjectType<Array>()) {
|
|
||||||
FormatArray(fp, val);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (val.IsString()) {
|
|
||||||
fp << "\"" << Convert::ToString(val) << "\"";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
fp << Convert::ToString(val);
|
|
||||||
}
|
|
||||||
|
|
||||||
void NodeUtility::FormatArray(std::ostream& fp, const Array::Ptr& arr)
|
|
||||||
{
|
|
||||||
bool first = true;
|
|
||||||
|
|
||||||
fp << "[ ";
|
|
||||||
|
|
||||||
if (arr) {
|
|
||||||
ObjectLock olock(arr);
|
|
||||||
BOOST_FOREACH(const Value& value, arr) {
|
|
||||||
if (first)
|
|
||||||
first = false;
|
|
||||||
else
|
|
||||||
fp << ", ";
|
|
||||||
|
|
||||||
FormatValue(fp, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!first)
|
|
||||||
fp << " ";
|
|
||||||
|
|
||||||
fp << "]";
|
|
||||||
}
|
|
||||||
|
|
||||||
void NodeUtility::UpdateConstant(const String& name, const String& value)
|
void NodeUtility::UpdateConstant(const String& name, const String& value)
|
||||||
{
|
{
|
||||||
String constantsFile = Application::GetSysconfDir() + "/icinga2/constants.conf";
|
String constantsFile = Application::GetSysconfDir() + "/icinga2/constants.conf";
|
||||||
|
|
|
@ -59,8 +59,8 @@ public:
|
||||||
static void UpdateConstant(const String& name, const String& value);
|
static void UpdateConstant(const String& name, const String& value);
|
||||||
|
|
||||||
/* node setup helpers */
|
/* node setup helpers */
|
||||||
static int GenerateNodeIcingaConfig(const std::vector<std::string>& endpoints, const String& nodename, const String& zonename);
|
static int GenerateNodeIcingaConfig(const std::vector<std::string>& endpoints);
|
||||||
static int GenerateNodeMasterIcingaConfig(const String& nodename);
|
static int GenerateNodeMasterIcingaConfig(void);
|
||||||
|
|
||||||
/* black/whitelist */
|
/* black/whitelist */
|
||||||
static String GetBlackAndWhiteListPath(const String& type);
|
static String GetBlackAndWhiteListPath(const String& type);
|
||||||
|
@ -79,9 +79,7 @@ private:
|
||||||
static Dictionary::Ptr LoadNodeFile(const String& node_file);
|
static Dictionary::Ptr LoadNodeFile(const String& node_file);
|
||||||
static void CollectNodes(const String& node_file, std::vector<Dictionary::Ptr>& nodes);
|
static void CollectNodes(const String& node_file, std::vector<Dictionary::Ptr>& nodes);
|
||||||
|
|
||||||
static void SerializeObject(std::ostream& fp, const String& name, const String& type, const Dictionary::Ptr& object);
|
static void SerializeObject(std::ostream& fp, const Dictionary::Ptr& object);
|
||||||
static void FormatValue(std::ostream& fp, const Value& val);
|
|
||||||
static void FormatArray(std::ostream& fp, const Array::Ptr& arr);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -420,7 +420,7 @@ wizard_ticket:
|
||||||
/* apilistener config */
|
/* apilistener config */
|
||||||
Log(LogInformation, "cli", "Generating local zones.conf.");
|
Log(LogInformation, "cli", "Generating local zones.conf.");
|
||||||
|
|
||||||
NodeUtility::GenerateNodeIcingaConfig(endpoints, cn, local_zone);
|
NodeUtility::GenerateNodeIcingaConfig(endpoints);
|
||||||
|
|
||||||
if (cn != Utility::GetFQDN()) {
|
if (cn != Utility::GetFQDN()) {
|
||||||
Log(LogWarning, "cli")
|
Log(LogWarning, "cli")
|
||||||
|
@ -471,7 +471,7 @@ wizard_ticket:
|
||||||
else
|
else
|
||||||
std::cout << "'api' feature already enabled.\n";
|
std::cout << "'api' feature already enabled.\n";
|
||||||
|
|
||||||
NodeUtility::GenerateNodeMasterIcingaConfig(cn);
|
NodeUtility::GenerateNodeMasterIcingaConfig();
|
||||||
|
|
||||||
/* apilistener config */
|
/* apilistener config */
|
||||||
std::cout << ConsoleColorTag(Console_Bold) << "Please specify the API bind host/port (optional):\n";
|
std::cout << ConsoleColorTag(Console_Bold) << "Please specify the API bind host/port (optional):\n";
|
||||||
|
@ -543,6 +543,7 @@ wizard_ticket:
|
||||||
NodeUtility::CreateBackupFile(constants_file);
|
NodeUtility::CreateBackupFile(constants_file);
|
||||||
|
|
||||||
NodeUtility::UpdateConstant("NodeName", cn);
|
NodeUtility::UpdateConstant("NodeName", cn);
|
||||||
|
NodeUtility::UpdateConstant("ZoneName", cn);
|
||||||
|
|
||||||
String salt = RandomString(16);
|
String salt = RandomString(16);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue