]> granicus.if.org Git - icinga2/commitdiff
Use the ZoneName and NodeName constants for 'node setup' and 'node wizard'
authorGunnar Beutner <gunnar@beutner.name>
Wed, 25 Nov 2015 16:41:03 +0000 (17:41 +0100)
committerGunnar Beutner <gunnar@beutner.name>
Wed, 25 Nov 2015 16:43:12 +0000 (17:43 +0100)
refs #10716

lib/base/configwriter.cpp
lib/base/configwriter.hpp
lib/cli/nodesetupcommand.cpp
lib/cli/nodeutility.cpp
lib/cli/nodeutility.hpp
lib/cli/nodewizardcommand.cpp

index f43e68da3d89e46ba25da29666382d0bbce99d90..19cc8c1bf9d0428c564b8fb944885aef55991161 100644 (file)
@@ -122,6 +122,8 @@ void ConfigWriter::EmitValue(std::ostream& fp, int indentLevel, const Value& val
                EmitArray(fp, indentLevel, val);
        else if (val.IsObjectType<Dictionary>())
                EmitScope(fp, indentLevel, val);
+       else if (val.IsObjectType<ConfigIdentifier>())
+               EmitIdentifier(fp, static_cast<ConfigIdentifier::Ptr>(val)->GetName(), false);
        else if (val.IsString())
                EmitString(fp, val);
        else if (val.IsNumber())
@@ -260,3 +262,12 @@ const std::vector<String>& ConfigWriter::GetKeywords(void)
 
        return keywords;
 }
+
+ConfigIdentifier::ConfigIdentifier(const String& identifier)
+    : m_Name(identifier)
+{ }
+
+String ConfigIdentifier::GetName(void) const
+{
+       return m_Name;
+}
index f6ab2c9c20f762b52e72398b8113053bcd97daa1..db02735c1e3d235fa591a6608333eb932ff76f3a 100644 (file)
 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.
  *
index 90f00f1e5385f645630e2e29a4f14e15f271ca39..2ec07859ffbb0bf4c8e68588178cbe6f0e430ce9 100644 (file)
@@ -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<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 */
        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<std::string>());
 
        /* tell the user to reload icinga2 */
 
index fd44710b09ef5616520d7d41d324b289e92dd9a7..2f119bd275cdb7e0c3eb6313dd69defec9b88921 100644 (file)
@@ -33,6 +33,7 @@
 #include "base/objectlock.hpp"
 #include "base/console.hpp"
 #include "base/exception.hpp"
+#include "base/configwriter.hpp"
 #include <boost/foreach.hpp>
 #include <boost/algorithm/string/classification.hpp>
 #include <boost/algorithm/string/join.hpp>
@@ -254,7 +255,7 @@ void NodeUtility::CollectNodes(const String& node_file, std::vector<Dictionary::
  * 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();
 
@@ -306,17 +307,16 @@ int NodeUtility::GenerateNodeIcingaConfig(const std::vector<std::string>& 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<std::string>& 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<Array>()) {
-               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)
index 90eab3410f2ea72eed3e27904ef98d6a6642aa63..aab3d820c359f60f7b622e22f862978ce6ef8389 100644 (file)
@@ -59,8 +59,8 @@ public:
        static void UpdateConstant(const String& name, const String& value);
 
        /* node setup helpers */
-       static int GenerateNodeIcingaConfig(const std::vector<std::string>& endpoints, const String& nodename, const String& zonename);
-       static int GenerateNodeMasterIcingaConfig(const String& nodename);
+       static int GenerateNodeIcingaConfig(const std::vector<std::string>& 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<Dictionary::Ptr>& 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);
 };
 
 }
index f89b6e3470b4b0037a54c00949dd5be9be9c84be..4e4e3c76894ce8124e1966fff623c2ff704f6b84 100644 (file)
@@ -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);