ソースを参照

HPCC-22174 Add LDAP support in envgen2
Escape "=" with "[equal]" on envgen2 command-line parameter.
Refactor "selector" handling.
Fix envgen2 -in-file processing

xwang2713 6 年 前
コミット
5fabe0a7e6

+ 2 - 0
deployment/configenv/xml_jlibpt/CMakeLists.txt

@@ -48,6 +48,7 @@ set (    INCLUDES
          ComponentFromXSD.hpp
          environment.hpp
          SWBackupNode.hpp
+         SWLdapProcess.hpp
 
     )
 set (    SRCS
@@ -72,6 +73,7 @@ set (    SRCS
          SWTopology.cpp
          ComponentFromXSD.cpp
          SWBackupNode.cpp
+         SWLdapProcess.cpp
     )
 
 include_directories (

+ 8 - 1
deployment/configenv/xml_jlibpt/EnvHelper.cpp

@@ -316,7 +316,12 @@ const char* EnvHelper::getXMLTagName(const char* name)
    else if (!strcmp(nameLC, "dropzone"))
       return XML_TAG_DROPZONE;
    else if (!strcmp(nameLC, "eclcc"))
-      return "EclCCProcess";
+      // eclccserver define this as EclCCServer but buildset set it to EclCCServerProcess.
+      // Our default environment.xml and envgen generated one use EclCCServerProcess.
+      // Seems both EclCCServer and EclCCServerProcess work. Will keep EclCCServerProcess for now.
+      return "EclCCServerProcess";
+   else if (!strcmp(nameLC, "eclplus"))
+      return "EclPlusProcess";
    else if (!strcmp(nameLC, "eclccsrv") || !strcmp(nameLC, "eclccserver") || !strcmp(nameLC, "eclcc"))
       return XML_TAG_ECLCCSERVERPROCESS;
    else if (!strcmp(nameLC, "esp") || !strcmp(nameLC, "espprocess"))
@@ -341,6 +346,8 @@ const char* EnvHelper::getXMLTagName(const char* name)
       return "BackupNodeProcess";
    else if (!strcmp(nameLC, "spark") || !strcmp(nameLC, "sparkthor") || !strcmp(nameLC, "SparkThorProcess"))
       return "SparkThorProcess";
+   else if (!strcmp(nameLC, "ldap") || !strcmp(nameLC, "ldapserver") || !strcmp(nameLC, "LDAPServerProcess"))
+      return "LDAPServerProcess";
    else if (!strcmp(nameLC, "buildset"))
       return "BuildSet";
    else

+ 2 - 8
deployment/configenv/xml_jlibpt/SWBackupNode.cpp

@@ -25,15 +25,10 @@ SWBackupNode::SWBackupNode(const char* name, EnvHelper * envHelper):SWProcess(na
 {
 }
 
-unsigned SWBackupNode::add(IPropertyTree *params)
+void SWBackupNode::addOtherSelector(IPropertyTree *compTree, IPropertyTree *params)
 {
-   unsigned rc = SWProcess::add(params);
-
-   IPropertyTree * envTree = m_envHelper->getEnvTree();
-   const char* key = params->queryProp("@key");
    StringBuffer xpath;
-   xpath.clear().appendf(XML_TAG_SOFTWARE "/%s[@name=\"%s\"]", m_processName.str(), key);
-   IPropertyTree * compTree = envTree->queryPropTree(xpath.str());
+
    assert(compTree);
    const char* selector = params->queryProp("@selector");
    if (selector && !stricmp("NodeGroup", selector))
@@ -57,6 +52,5 @@ unsigned SWBackupNode::add(IPropertyTree *params)
        }
        compTree->addPropTree(selector, nodeGroup);
    }
-   return rc;
 }
 }

+ 1 - 1
deployment/configenv/xml_jlibpt/SWBackupNode.hpp

@@ -27,7 +27,7 @@ class SWBackupNode : public SWProcess
 {
 public:
     SWBackupNode(const char* name, EnvHelper * envHelper);
-    virtual unsigned add(IPropertyTree *params);
+    virtual void addOtherSelector(IPropertyTree *compTree, IPropertyTree *params);
 
 //protected:
 

+ 1 - 12
deployment/configenv/xml_jlibpt/SWEspProcess.cpp

@@ -26,16 +26,8 @@ SWEspProcess::SWEspProcess(const char* name, EnvHelper * envHelper):SWProcess(na
 {
 }
 
-unsigned SWEspProcess::add(IPropertyTree *params)
+void SWEspProcess::addOtherSelector(IPropertyTree *compTree, IPropertyTree *params)
 {
-   int rc = SWProcess::add(params);
-
-   IPropertyTree * envTree = m_envHelper->getEnvTree();
-   const char* key = params->queryProp("@key");
-   StringBuffer xpath;
-   xpath.clear().appendf(XML_TAG_SOFTWARE "/%s[@name=\"%s\"]",m_processName.str(), key);
-   IPropertyTree * compTree = envTree->queryPropTree(xpath.str());
-
    const char* selector = params->queryProp("@selector");
    if (selector && !stricmp(selector, "EspBinding"))
    {
@@ -45,9 +37,6 @@ unsigned SWEspProcess::add(IPropertyTree *params)
 
       addBinding(compTree, pAttrs);
    }
-
-   return rc;
-
 }
 
 void SWEspProcess::addBinding(IPropertyTree *parent, IPropertyTree * attrs)

+ 1 - 1
deployment/configenv/xml_jlibpt/SWEspProcess.hpp

@@ -28,7 +28,7 @@ class SWEspProcess : public SWProcess
 public:
     SWEspProcess(const char* name, EnvHelper * envHelper);
 
-    unsigned add(IPropertyTree *params);
+    virtual void addOtherSelector(IPropertyTree *compTree, IPropertyTree *params);
     //IPropertyTree * addComponent(IPropertyTree *params);
     void addBinding(IPropertyTree *parent, IPropertyTree * attrs);
 

+ 65 - 0
deployment/configenv/xml_jlibpt/SWLdapProcess.cpp

@@ -0,0 +1,65 @@
+/*##############################################################################
+
+    HPCC SYSTEMS software Copyright (C) 2018 HPCC Systems®.
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+############################################################################## */
+
+#include "SWLdapProcess.hpp"
+#include "deployutils.hpp"
+
+namespace ech
+{
+
+SWLdapProcess::SWLdapProcess(const char* name, EnvHelper * envHelper):SWProcess(name, envHelper)
+{
+}
+
+unsigned SWLdapProcess::add(IPropertyTree *params)
+{
+   int rc = SWProcess::add(params);
+
+   StringBuffer xpath;
+
+   IPropertyTree * envTree = m_envHelper->getEnvTree();
+
+   const char* key = (params->hasProp("@key"))? params->queryProp("@key") : "ldapserver";
+   xpath.clear().appendf(XML_TAG_SOFTWARE "/%s[@name=\"%s\"]",m_processName.str(), key);
+   IPropertyTree * compTree = envTree->queryPropTree(xpath.str());
+
+   //Add Esp Authentication
+   const char* espKey = (params->hasProp("@esp"))? params->queryProp("@esp") : "myesp";
+   if (compTree->hasProp("@esp"))
+   {
+      compTree->removeProp("@esp");
+   }
+   xpath.clear().appendf(XML_TAG_SOFTWARE "/EspProcess[@name=\"%s\"]",espKey);
+   IPropertyTree * espTree = envTree->queryPropTree(xpath.str());
+   IPropertyTree * oldAuthTree = espTree->queryPropTree("Authentication");
+   if (oldAuthTree)
+   {
+      espTree->removeTree(oldAuthTree);
+   }
+
+   IPropertyTree * newAuthTree = createPTree(XML_TAG_AUTHENTICATION);
+   newAuthTree->addProp("@htpasswdFile", "/etc/HPCCSystems/.htpasswd");
+   newAuthTree->addProp("@ldapAuthMethod", "simple");
+   newAuthTree->addProp("@ldapConnections", "10");
+   newAuthTree->addProp("@ldapServer", key);
+   newAuthTree->addProp("@method", "ldaps");
+   espTree->addPropTree(XML_TAG_AUTHENTICATION, newAuthTree);
+
+   return rc;
+}
+
+}

+ 36 - 0
deployment/configenv/xml_jlibpt/SWLdapProcess.hpp

@@ -0,0 +1,36 @@
+/*##############################################################################
+
+    HPCC SYSTEMS software Copyright (C) 2018 HPCC Systems®.
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+############################################################################## */
+#ifndef _SWLDAPPROCESS_HPP_
+#define _SWLDAPPROCESS_HPP_
+
+#include "EnvHelper.hpp"
+#include "SWProcess.hpp"
+
+namespace ech
+{
+
+class SWLdapProcess : public SWProcess
+{
+public:
+    SWLdapProcess(const char* name, EnvHelper * envHelper);
+
+    unsigned add(IPropertyTree *params);
+
+};
+
+}
+#endif

+ 26 - 2
deployment/configenv/xml_jlibpt/SWProcess.cpp

@@ -98,13 +98,37 @@ unsigned SWProcess::add(IPropertyTree *params)
      {
         addInstances(compTree, params);
      }
-     // Other selectors handled by concrete software process,
-     // For example, NodeGroup in BackupNodeProcess, EspBinding in EspProcess
+     else
+     {
+       // Following method can be overwritten.
+       // For example, NodeGroup in BackupNodeProcess, EspBinding in EspProcess
+       addOtherSelector(compTree, params);
+     }
+  }
+  else
+  {
+     IPropertyTree* pAttrs = params->queryPropTree("Attributes");
+     updateNode(compTree, pAttrs);
   }
 
   return rc;
 }
 
+void SWProcess::addOtherSelector(IPropertyTree *compTree, IPropertyTree *params)
+{
+   const char* selector = params->queryProp("@selector");
+   IPropertyTree* selectorTree = compTree->queryPropTree(selector);
+   if (!selectorTree)
+   {
+      selectorTree = createPTree(selector);
+      compTree->addPropTree(selector, selectorTree);
+   }
+
+   IPropertyTree* pAttrs = params->queryPropTree("Attributes");
+   if (pAttrs)
+     updateNode(selectorTree, pAttrs);
+}
+
 //int SWProcess::addNode(IPropertyTree *params, const char* xpath, bool merge)
 //{
 //   return 0;

+ 1 - 0
deployment/configenv/xml_jlibpt/SWProcess.hpp

@@ -32,6 +32,7 @@ public:
 
    virtual void create(IPropertyTree *params);
    virtual unsigned add(IPropertyTree *params);
+   virtual void addOtherSelector(IPropertyTree *compTree, IPropertyTree *params);
    virtual void modify(IPropertyTree *params);
    //virtual void remove(IPropertyTree *params);
    virtual IPropertyTree * addComponent(IPropertyTree *params);

+ 18 - 0
deployment/configenv/xml_jlibpt/Software.cpp

@@ -28,6 +28,7 @@
 #include "SWTopology.hpp"
 #include "deployutils.hpp"
 #include "ComponentBase.hpp"
+#include "SWLdapProcess.hpp"
 
 namespace ech
 {
@@ -174,6 +175,11 @@ void Software::getSWCompName(const char *inputName, StringBuffer& out)
    {
       out.append("eclccserver");
    }
+   else if (!stricmp(compNameLC, "eclplus") || !stricmp(compNameLC, "eclplusserver") ||
+            !stricmp(compNameLC, "EclPlusProcess"))
+   {
+      out.append("eclplus");
+   }
    else if (!stricmp(compNameLC, "sch") || !stricmp(compNameLC, "eclsch") ||
             !stricmp(compNameLC, "scheduler") || !stricmp(compNameLC, "EclCCSchedulerProcess"))
    {
@@ -196,6 +202,10 @@ void Software::getSWCompName(const char *inputName, StringBuffer& out)
    {
       out.append("sparkthor");
    }
+   else if (!stricmp(compNameLC, "ldap") || !stricmp(compNameLC, "ldapserver") || !stricmp(compNameLC, "LDAPServerProcess"))
+   {
+      out.append("ldapServer");
+   }
    else
    {
       out.append(compNameLC);
@@ -280,6 +290,10 @@ IConfigComp* Software::getSWComp(const char *compName)
    {
       pComp = (IConfigComp*) new SWProcess(buildSetName, m_envHelper);
    }
+   else if (!stricmp(buildSetName, "eclplus"))
+   {
+      pComp = (IConfigComp*) new SWProcess(buildSetName, m_envHelper);
+   }
    else if (!stricmp(buildSetName, "eclscheduler"))
    {
       pComp = (IConfigComp*) new SWProcess(buildSetName, m_envHelper);
@@ -300,6 +314,10 @@ IConfigComp* Software::getSWComp(const char *compName)
    {
       pComp = (IConfigComp*) new SWBackupNode(buildSetName, m_envHelper);
    }
+   else if (!stricmp(buildSetName, "ldapServer"))
+   {
+      pComp = (IConfigComp*) new SWLdapProcess(buildSetName, m_envHelper);
+   }
    else
    {
       pComp = (IConfigComp*) new SWProcess(buildSetName, m_envHelper);

+ 15 - 5
deployment/envgen2/EnvGen.cpp

@@ -482,12 +482,21 @@ void CEnvGen::addUpdateAttributesFromString(IPropertyTree *updateTree, const cha
 
      StringArray keyValues;
      keyValues.appendList(saAttrs[i], "=");
+
      pAttr->addProp("@name", keyValues[0]);
+     StringBuffer sbValue;
+     sbValue.clear().appendf("%s", keyValues[1]);
+     sbValue.replaceString("[equal]", "=");
 
      StringArray newOldValues;
-     newOldValues.appendList(keyValues[1], ATTR_V_SEP);
-     pAttr->addProp("@value", newOldValues[0]);
-     if (newOldValues.ordinality() > 1) pAttr->addProp("@oldValue", newOldValues[1]);
+     if (strcmp(keyValues[1], ""))
+     {
+        newOldValues.appendList(sbValue.str(), ATTR_V_SEP);
+        pAttr->addProp("@value", newOldValues[0]);
+        if (newOldValues.ordinality() > 1) pAttr->addProp("@oldValue", newOldValues[1]);
+     }
+     else
+        pAttr->addProp("@value", "");
    }
 }
 
@@ -922,7 +931,8 @@ void CEnvGen::addUpdateTaskFromFile(const char * inFile)
    }
 
    // add Config attributies to params
-   IPropertyTree *pCfg = inPTree->queryPropTree("Config");
+   IPropertyTree *pCfg = m_params->queryPropTree("Config");
+   assert(pCfg);
    Owned<IAttributeIterator> attrIter = inPTree->getAttributes();
    ForEach(*attrIter)
    {
@@ -933,7 +943,7 @@ void CEnvGen::addUpdateTaskFromFile(const char * inFile)
    }
 
    // add Tasks to params
-   Owned<IPropertyTreeIterator> taskIter = pCfg->getElements("Task");
+   Owned<IPropertyTreeIterator> taskIter = inPTree->getElements("Task");
    ForEach(*taskIter)
    {
       IPropertyTree* task = &taskIter->query();