浏览代码

Merge pull request #5796 from afishbeck/roxieLdapUser

HPCC-11283 Use cluster ldap user when building queries using file cache

Reviewed-By: Gavin Halliday <gavin.halliday@lexisnexis.com>
Reviewed-By: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 11 年之前
父节点
当前提交
78a42538fe

+ 11 - 0
common/workunit/referencedfilelist.cpp

@@ -188,6 +188,12 @@ public:
         }
     }
 
+    ReferencedFileList(IUserDescriptor *userDesc, bool allowForeignFiles) : allowForeign(allowForeignFiles)
+    {
+        if (userDesc)
+            user.set(userDesc);
+    }
+
     void ensureFile(const char *ln, unsigned flags, const char *pkgid, const char *daliip=NULL, const char *srcCluster=NULL, const char *remotePrefix=NULL);
 
     virtual void addFile(const char *ln, const char *daliip=NULL, const char *srcCluster=NULL, const char *remotePrefix=NULL);
@@ -704,3 +710,8 @@ IReferencedFileList *createReferencedFileList(const char *user, const char *pw,
 {
     return new ReferencedFileList(user, pw, allowForeignFiles);
 }
+
+IReferencedFileList *createReferencedFileList(IUserDescriptor *user, bool allowForeignFiles)
+{
+    return new ReferencedFileList(user, allowForeignFiles);
+}

+ 1 - 0
common/workunit/referencedfilelist.hpp

@@ -67,6 +67,7 @@ interface IReferencedFileList : extends IInterface
 extern WORKUNIT_API const char *skipForeign(const char *name, StringBuffer *ip=NULL);
 
 extern WORKUNIT_API IReferencedFileList *createReferencedFileList(const char *user, const char *pw, bool allowForeignFiles);
+extern WORKUNIT_API IReferencedFileList *createReferencedFileList(IUserDescriptor *userDesc, bool allowForeignFiles);
 
 extern WORKUNIT_API void splitDfsLocation(const char *address, StringBuffer &cluster, StringBuffer &ip, StringBuffer &prefix, const char *defaultCluster);
 extern WORKUNIT_API void splitDerivedDfsLocation(const char *address, StringBuffer &cluster, StringBuffer &ip, StringBuffer &prefix, const char *defaultCluster, const char *baseCluster, const char *baseIP, const char *basePrefix);

+ 15 - 0
common/workunit/workunit.cpp

@@ -4330,8 +4330,11 @@ class CEnvironmentClusterInfo: public CInterface, implements IConstWUClusterInfo
     StringArray thorProcesses;
     StringArray primaryThorProcesses;
     StringAttr prefix;
+    StringAttr ldapUser;
+    StringBuffer ldapPassword;
     ClusterType platform;
     unsigned clusterWidth;
+
 public:
     IMPLEMENT_IINTERFACE;
     CEnvironmentClusterInfo(const char *_name, const char *_prefix, IPropertyTree *agent, IArrayOf<IPropertyTree> &thors, IPropertyTree *roxie)
@@ -4375,6 +4378,10 @@ public:
             clusterWidth = roxie->getPropInt("@numChannels", 1);
             platform = RoxieCluster;
             getRoxieProcessServers(roxie, roxieServers);
+            ldapUser.set(roxie->queryProp("@ldapUser"));
+            StringBuffer encPassword = roxie->queryProp("@ldapPassword");
+            if (encPassword.length())
+                decrypt(ldapPassword, encPassword);
         }
         else 
         {
@@ -4443,6 +4450,14 @@ public:
     {
         return roxieServers;
     }
+    const char *getLdapUser() const
+    {
+        return ldapUser.get();
+    }
+    virtual const char *getLdapPassword() const
+    {
+        return ldapPassword.str();
+    }
 };
 
 IStringVal &getProcessQueueNames(IStringVal &ret, const char *process, const char *type, const char *suffix)

+ 2 - 0
common/workunit/workunit.hpp

@@ -554,6 +554,8 @@ interface IConstWUClusterInfo : extends IInterface
     virtual const StringArray & getThorProcesses() const = 0;
     virtual const StringArray & getPrimaryThorProcesses() const = 0;
     virtual const SocketEndpointArray & getRoxieServers() const = 0;
+    virtual const char *getLdapUser() const = 0;
+    virtual const char *getLdapPassword() const = 0;
 };
 
 //! IWorkflowItem

+ 2 - 1
esp/services/ws_workunits/ws_workunitsQuerySets.cpp

@@ -339,7 +339,8 @@ void QueryFilesInUse::loadTarget(IPropertyTree *t, const char *target, unsigned
         if (pkgid && *pkgid)
             queryTree->setProp("@pkgid", pkgid);
 
-        Owned<IReferencedFileList> wufiles = createReferencedFileList(NULL, NULL, true);
+        IUserDescriptor **roxieUser = roxieUserMap.getValue(target);
+        Owned<IReferencedFileList> wufiles = createReferencedFileList(roxieUser ? *roxieUser : NULL, true);
         wufiles->addFilesFromQuery(cw, pm, queryid);
         if (aborting)
             return;

+ 20 - 0
esp/services/ws_workunits/ws_workunitsService.hpp

@@ -33,6 +33,9 @@
 class QueryFilesInUse : public CInterface, implements ISDSSubscription
 {
     mutable CriticalSection crit;
+    MapStringTo<IUserDescriptor *> roxieUserMap;
+    IArrayOf<IUserDescriptor> roxieUsers;
+
     Owned<IPropertyTree> tree;
     SubscriptionId qsChange;
     SubscriptionId pmChange;
@@ -44,6 +47,23 @@ public:
     QueryFilesInUse() : aborting(false), qsChange(0), pmChange(0), psChange(0)
     {
         tree.setown(createPTree("QueryFilesInUse"));
+        updateUsers();
+    }
+
+    void updateUsers()
+    {
+        Owned<IStringIterator> clusters = getTargetClusters("RoxieCluster", NULL);
+        ForEach(*clusters)
+        {
+            SCMStringBuffer target;
+            clusters->str(target);
+
+            Owned<IConstWUClusterInfo> info = getTargetClusterInfo(target.str());
+            Owned<IUserDescriptor> user = createUserDescriptor();
+            user->set(info->getLdapUser(), info->getLdapPassword());
+            roxieUserMap.setValue(target.str(), user);
+            roxieUsers.append(*user.getClear());
+        }
     }
 
     const char *getPackageMap(const char *target)