From 93c5fc5b82b26d1a53eb5847a060135ebbcd9516 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Wed, 25 Nov 2015 17:41:03 +0100 Subject: [PATCH] Use the ZoneName and NodeName constants for 'node setup' and 'node wizard' refs #10716 --- lib/base/configwriter.cpp | 11 +++++ lib/base/configwriter.hpp | 18 ++++++++ lib/cli/nodesetupcommand.cpp | 10 ++-- lib/cli/nodeutility.cpp | 87 +++++++++-------------------------- lib/cli/nodeutility.hpp | 8 ++-- lib/cli/nodewizardcommand.cpp | 5 +- 6 files changed, 63 insertions(+), 76 deletions(-) diff --git a/lib/base/configwriter.cpp b/lib/base/configwriter.cpp index f43e68da3..19cc8c1bf 100644 --- a/lib/base/configwriter.cpp +++ b/lib/base/configwriter.cpp @@ -122,6 +122,8 @@ void ConfigWriter::EmitValue(std::ostream& fp, int indentLevel, const Value& val EmitArray(fp, indentLevel, val); else if (val.IsObjectType()) EmitScope(fp, indentLevel, val); + else if (val.IsObjectType()) + EmitIdentifier(fp, static_cast(val)->GetName(), false); else if (val.IsString()) EmitString(fp, val); else if (val.IsNumber()) @@ -260,3 +262,12 @@ const std::vector& ConfigWriter::GetKeywords(void) return keywords; } + +ConfigIdentifier::ConfigIdentifier(const String& identifier) + : m_Name(identifier) +{ } + +String ConfigIdentifier::GetName(void) const +{ + return m_Name; +} diff --git a/lib/base/configwriter.hpp b/lib/base/configwriter.hpp index f6ab2c9c2..db02735c1 100644 --- a/lib/base/configwriter.hpp +++ b/lib/base/configwriter.hpp @@ -28,6 +28,24 @@ 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. * diff --git a/lib/cli/nodesetupcommand.cpp b/lib/cli/nodesetupcommand.cpp index 90f00f1e5..2ec07859f 100644 --- a/lib/cli/nodesetupcommand.cpp +++ b/lib/cli/nodesetupcommand.cpp @@ -154,13 +154,11 @@ int NodeSetupCommand::SetupMaster(const boost::program_options::variables_map& v << "'api' feature already enabled.\n"; } - NodeUtility::GenerateNodeMasterIcingaConfig(cn); - - /* read zones.conf and update with zone + endpoint information */ + /* write zones.conf and update with zone + endpoint information */ Log(LogInformation, "cli", "Generating zone and object configuration."); - NodeUtility::GenerateNodeMasterIcingaConfig(cn); + NodeUtility::GenerateNodeMasterIcingaConfig(); /* 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::UpdateConstant("NodeName", cn); + NodeUtility::UpdateConstant("ZoneName", cn); 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."); - NodeUtility::GenerateNodeIcingaConfig(vm["endpoint"].as >(), cn, vm["zone"].as()); + NodeUtility::GenerateNodeIcingaConfig(vm["endpoint"].as >()); /* update constants.conf with NodeName = CN */ 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::UpdateConstant("NodeName", cn); + NodeUtility::UpdateConstant("ZoneName", vm["zone"].as()); /* tell the user to reload icinga2 */ diff --git a/lib/cli/nodeutility.cpp b/lib/cli/nodeutility.cpp index fd44710b0..2f119bd27 100644 --- a/lib/cli/nodeutility.cpp +++ b/lib/cli/nodeutility.cpp @@ -33,6 +33,7 @@ #include "base/objectlock.hpp" #include "base/console.hpp" #include "base/exception.hpp" +#include "base/configwriter.hpp" #include #include #include @@ -254,7 +255,7 @@ void NodeUtility::CollectNodes(const String& node_file, std::vector& endpoints, const String& nodename, const String& zonename) +int NodeUtility::GenerateNodeIcingaConfig(const std::vector& endpoints) { Array::Ptr my_config = new Array(); @@ -306,17 +307,16 @@ int NodeUtility::GenerateNodeIcingaConfig(const std::vector& endpoi Dictionary::Ptr my_endpoint = 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"); 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("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); /* store the local config */ @@ -331,7 +331,7 @@ int NodeUtility::GenerateNodeIcingaConfig(const std::vector& endpoi return 0; } -int NodeUtility::GenerateNodeMasterIcingaConfig(const String& nodename) +int NodeUtility::GenerateNodeMasterIcingaConfig(void) { Array::Ptr my_config = new Array(); @@ -340,16 +340,13 @@ int NodeUtility::GenerateNodeMasterIcingaConfig(const String& nodename) Dictionary::Ptr my_master_zone = new Dictionary(); 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_zone_members->Add(nodename); + my_master_zone_members->Add(new ConfigIdentifier("NodeName")); - String zonename = VariableUtility::GetVariable("ZoneName"); - - my_master_zone->Set("__name", zonename); + my_master_zone->Set("__name", new ConfigIdentifier("ZoneName")); 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); /* store the local config */ @@ -364,10 +361,6 @@ int NodeUtility::GenerateNodeMasterIcingaConfig(const String& nodename) 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) { Log(LogInformation, "cli") @@ -403,10 +396,7 @@ bool NodeUtility::WriteNodeConfigObjects(const String& filename, const Array::Pt ObjectLock olock(objects); BOOST_FOREACH(const Dictionary::Ptr& object, objects) { - String name = object->Get("__name"); - String type = object->Get("__type"); - - SerializeObject(fp, name, type, object); + SerializeObject(fp, object); } fp << std::endl; @@ -622,58 +612,27 @@ bool NodeUtility::CreateBackupFile(const String& target, bool is_private) 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); BOOST_FOREACH(const Dictionary::Pair& kv, object) { if (kv.first == "__type" || kv.first == "__name") continue; - fp << "\t" << kv.first << " = "; - FormatValue(fp, kv.second); - fp << "\n"; - } - fp << "}\n\n"; -} - -void NodeUtility::FormatValue(std::ostream& fp, const Value& val) -{ - if (val.IsObjectType()) { - FormatArray(fp, val); - return; - } - - if (val.IsString()) { - fp << "\"" << Convert::ToString(val) << "\""; - return; + fp << "\t"; + ConfigWriter::EmitIdentifier(fp, kv.first, true); + fp << " = "; + ConfigWriter::EmitValue(fp, 1, kv.second); + fp << ";\n"; } - 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 << "]"; + fp << "}\n\n"; } void NodeUtility::UpdateConstant(const String& name, const String& value) diff --git a/lib/cli/nodeutility.hpp b/lib/cli/nodeutility.hpp index 90eab3410..aab3d820c 100644 --- a/lib/cli/nodeutility.hpp +++ b/lib/cli/nodeutility.hpp @@ -59,8 +59,8 @@ public: static void UpdateConstant(const String& name, const String& value); /* node setup helpers */ - static int GenerateNodeIcingaConfig(const std::vector& endpoints, const String& nodename, const String& zonename); - static int GenerateNodeMasterIcingaConfig(const String& nodename); + static int GenerateNodeIcingaConfig(const std::vector& endpoints); + static int GenerateNodeMasterIcingaConfig(void); /* black/whitelist */ static String GetBlackAndWhiteListPath(const String& type); @@ -79,9 +79,7 @@ private: static Dictionary::Ptr LoadNodeFile(const String& node_file); static void CollectNodes(const String& node_file, std::vector& nodes); - static void SerializeObject(std::ostream& fp, const String& name, const String& type, const Dictionary::Ptr& object); - static void FormatValue(std::ostream& fp, const Value& val); - static void FormatArray(std::ostream& fp, const Array::Ptr& arr); + static void SerializeObject(std::ostream& fp, const Dictionary::Ptr& object); }; } diff --git a/lib/cli/nodewizardcommand.cpp b/lib/cli/nodewizardcommand.cpp index f89b6e347..4e4e3c768 100644 --- a/lib/cli/nodewizardcommand.cpp +++ b/lib/cli/nodewizardcommand.cpp @@ -420,7 +420,7 @@ wizard_ticket: /* apilistener config */ Log(LogInformation, "cli", "Generating local zones.conf."); - NodeUtility::GenerateNodeIcingaConfig(endpoints, cn, local_zone); + NodeUtility::GenerateNodeIcingaConfig(endpoints); if (cn != Utility::GetFQDN()) { Log(LogWarning, "cli") @@ -471,7 +471,7 @@ wizard_ticket: else std::cout << "'api' feature already enabled.\n"; - NodeUtility::GenerateNodeMasterIcingaConfig(cn); + NodeUtility::GenerateNodeMasterIcingaConfig(); /* apilistener config */ 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::UpdateConstant("NodeName", cn); + NodeUtility::UpdateConstant("ZoneName", cn); String salt = RandomString(16); -- 2.40.0