Browse Source

Merge remote-tracking branch 'origin/candidate-5.0.0' into closedown-5.0.x

Conflicts:
	version.cmake

Signed-off-by: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 11 years ago
parent
commit
d4ba0ae80f
100 changed files with 2980 additions and 1074 deletions
  1. 24 8
      common/environment/dalienv.cpp
  2. 10 128
      common/environment/environment.cpp
  3. 0 3
      common/environment/environment.hpp
  4. 15 34
      common/thorhelper/layouttrans.cpp
  5. 1 3
      common/thorhelper/layouttrans.hpp
  6. 3 7
      common/thorhelper/layouttrans.ipp
  7. 3 1
      common/workunit/CMakeLists.txt
  8. 70 39
      common/workunit/workunit.cpp
  9. 1 0
      dali/base/dadfs.cpp
  10. 140 148
      dali/base/dautils.cpp
  11. 5 3
      dali/base/dautils.hpp
  12. 0 17
      dali/dafilesrv/dafscontrol.cpp
  13. 5 3
      dali/dfuplus/main.cpp
  14. 1 0
      docs/CMakeLists.txt
  15. 10 1
      docs/ECLLanguageReference/ECLR_mods/BltInFunc-BUILD.xml
  16. 34 5
      docs/ECLLanguageReference/ECLR_mods/BltInFunc-OUTPUT.xml
  17. 46 0
      docs/ECLLanguageReference/ECLR_mods/BltInFunc-SOAPCALL.xml
  18. 9 2
      docs/ECLLanguageReference/ECLR_mods/ResrvdKywds-IMPORT.xml
  19. 49 0
      docs/ECLLanguageReference/ECLR_mods/Templ-OPTION.xml
  20. 1 1
      docs/ECLStandardLibraryReference/SLR-Mods/SprayVariable.xml
  21. 10 7
      docs/HPCCCertify/Cert-Mods/CertPreflight.xml
  22. 18 0
      docs/HPCCSystemAdmin/CMakeLists.txt
  23. 1465 0
      docs/HPCCSystemAdmin/HPCCSystemAdministratorsGuide.xml
  24. 373 0
      docs/HPCCSystemAdmin/SA-Mods/SysAdminConfigMod.xml
  25. BIN
      docs/images/CS-1912.jpg
  26. BIN
      docs/images/CS-sysfail.jpg
  27. BIN
      docs/images/CSimg01.jpg
  28. BIN
      docs/images/CSimg02.jpg
  29. BIN
      docs/images/CSimg03.jpg
  30. BIN
      docs/images/CSimg04.jpg
  31. BIN
      docs/images/CSimg05.jpg
  32. BIN
      docs/images/CSimg06.jpg
  33. BIN
      docs/images/CSimg07.jpg
  34. BIN
      docs/images/CSimg08.jpg
  35. BIN
      docs/images/CSimg09.jpg
  36. BIN
      docs/images/SA002.jpg
  37. BIN
      docs/images/SA003.jpg
  38. BIN
      docs/images/SA004.jpg
  39. BIN
      docs/images/SA005.jpg
  40. BIN
      docs/images/SA006.jpg
  41. BIN
      docs/images/SA008.jpg
  42. 7 2
      ecl/hql/hqlparse.cpp
  43. 2 2
      ecl/hthor/hthor.cpp
  44. 1 1
      ecl/regress/demangle.ecl
  45. 1 1
      ecl/regress/err2201.ecl
  46. 1 1
      ecl/regress/err2203.ecl
  47. 1 1
      ecl/regress/err2204.ecl
  48. 1 1
      ecl/regress/err2205.ecl
  49. 1 1
      ecl/regress/err2206.ecl
  50. 1 1
      ecl/regress/err2208.ecl
  51. 1 1
      ecl/regress/err2209.ecl
  52. 1 1
      ecl/regress/err2210.ecl
  53. 1 1
      ecl/regress/errextrabreak.ecl
  54. 1 1
      ecl/regress/errextraelse.ecl
  55. 1 1
      ecl/regress/errextraend.ecl
  56. 1 1
      ecl/regress/errisvalid.ecl
  57. 1 1
      ecl/regress/errloop2.ecl
  58. 1 1
      ecl/regress/errloop3.ecl
  59. 1 1
      ecl/regress/errloop4.ecl
  60. 1 1
      ecl/regress/errloop5.ecl
  61. 1 1
      ecl/regress/errloop6.ecl
  62. 1 1
      ecl/regress/errloop7.ecl
  63. 1 1
      ecl/regress/errloop8.ecl
  64. 1 1
      ecl/regress/errmissingend.ecl
  65. 1 1
      ecl/regress/errmissingend1.ecl
  66. 1 1
      ecl/regress/errmissingend2.ecl
  67. 1 1
      ecl/regress/errmissingend3.ecl
  68. 1 1
      ecl/regress/errmissingend4.ecl
  69. 1 1
      ecl/regress/errnestedhashif.ecl
  70. 1 1
      ecl/regress/export2.ecl
  71. 1 1
      ecl/regress/export3.ecl
  72. 1 1
      ecl/regress/export4.ecl
  73. 1 1
      ecl/regress/gch2.ecl
  74. 1 1
      ecl/regress/hashelseif2.ecl
  75. 1 1
      ecl/regress/mangle.ecl
  76. 1 1
      ecl/regress/memleak9.ecl
  77. 1 1
      ecl/regress/mluber36.ecl
  78. 1 1
      ecl/regress/mluber63.ecl
  79. 1 1
      ecl/regress/mluber66.ecl
  80. 1 1
      ecl/regress/round.ecl
  81. 1 1
      ecl/regress/round2.ecl
  82. 1 1
      ecl/regress/rtaylor22.ecl
  83. 1 1
      ecl/regress/textsearch.ecl
  84. 1 1
      ecl/regress/tmptcall1.ecl
  85. 1 1
      ecl/regress/tmptcall2.ecl
  86. 1 1
      ecl/regress/tmptcall3.ecl
  87. 1 1
      ecl/regress/tmptcall4.ecl
  88. 2 12
      esp/build.sh
  89. 150 150
      esp/eclwatch/ws_XSLT/nls/bs/hpcc.xml
  90. 148 148
      esp/eclwatch/ws_XSLT/nls/hr/hpcc.xml
  91. 155 155
      esp/eclwatch/ws_XSLT/nls/sr/hpcc.xml
  92. 0 30
      esp/platform/espcfg.cpp
  93. 90 99
      esp/profiles/eclwatch.profile.js
  94. 11 2
      esp/scm/ws_dfu.ecm
  95. 7 1
      esp/scm/ws_workunits.ecm
  96. 68 14
      esp/services/ws_dfu/ws_dfuService.cpp
  97. 2 0
      esp/services/ws_dfu/ws_dfuService.hpp
  98. 1 1
      esp/services/ws_ecl/ws_ecl_service.cpp
  99. 0 4
      esp/services/ws_fileio/ws_fileioservice.cpp
  100. 0 0
      esp/services/ws_fs/ws_fsBinding.cpp

+ 24 - 8
common/environment/dalienv.cpp

@@ -379,6 +379,8 @@ bool getRemoteRunInfo(const char * keyName, const char * exeName, const char * v
     // first get machine by IP
     StringBuffer ips;
     ip.getIpText(ips);
+
+    //Cannot use getEnvironmentFactory() since it is using a remotedali
     StringBuffer xpath;
     xpath.appendf("Environment/Hardware/Computer[@netAddress=\"%s\"]", ips.str());
     Owned<IPropertyTreeIterator> iter = querySDS().getElementsRaw(xpath,remotedali,timeout);
@@ -393,6 +395,7 @@ bool getRemoteRunInfo(const char * keyName, const char * exeName, const char * v
         ERRLOG("Unable to find domain for %s on dali %s", ips.str(),dalis.str());
         return false;
     }
+
     xpath.clear().appendf("Environment/Software/%s",keyName);
     if (version)
         xpath.appendf("[@version='%s']",version);
@@ -441,15 +444,21 @@ bool getRemoteRunInfo(const char * keyName, const char * exeName, const char * v
     return false;
 }
 
-#define SDS_CONNECT_TIMEOUT 30000
 bool envGetConfigurationDirectory(const char *category, const char *component,const char *instance, StringBuffer &dirout)
 {
     SessionId sessid = myProcessSession();
     if (!sessid)
         return false;
-    Owned<IRemoteConnection> conn = querySDS().connect("/Environment/Software/Directories",sessid, 0, SDS_CONNECT_TIMEOUT);
-    if (conn) 
-        return getConfigurationDirectory(conn->queryRoot(),category,component,instance,dirout);
+
+    Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
+    Owned<IConstEnvironment> env = factory->openEnvironment();
+    if (env)
+    {
+        Owned<IPropertyTree> root = &env->getPTree();
+        IPropertyTree * child = root->queryPropTree("Software/Directories");
+        if (child)
+            return getConfigurationDirectory(child,category,component,instance,dirout);
+    }
     return false;
 }
 
@@ -483,10 +492,17 @@ IPropertyTree *envGetNASConfiguration()
     SessionId sessid = myProcessSession();
     if (!sessid)
         return NULL;
-    Owned<IRemoteConnection> conn = querySDS().connect("/Environment/Hardware", sessid, 0, SDS_CONNECT_TIMEOUT);
-    if (!conn)
-        return NULL;
-    return envGetNASConfiguration(conn->queryRoot());
+
+    Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
+    Owned<IConstEnvironment> env = factory->openEnvironment();
+    if (env)
+    {
+        Owned<IPropertyTree> root = &env->getPTree();
+        IPropertyTree * hardware = root->queryPropTree("Hardware");
+        if (hardware)
+            return envGetNASConfiguration(hardware);
+    }
+    return NULL;
 }
 
 IPropertyTree *envGetInstallNASHooks(SocketEndpoint *myEp)

+ 10 - 128
common/environment/environment.cpp

@@ -30,16 +30,11 @@
 #include "dasds.hpp"
 #include "dalienv.hpp"
 
-#define SDS_LOCK_TIMEOUT  10000
+#define SDS_LOCK_TIMEOUT  30000
 
 
 static int environmentTraceLevel = 1;
-static char sEnvironmentConfFile[1024];
-static char sEnvironmentXMLFile[1024];
-static StringBuffer sEnvironmentConf;
 static Owned <IConstEnvironment> cache;
-static CDateTime confFileCacheTime;
-static CDateTime xmlFileCacheTime;
 
 class CConstInstanceInfo;
 
@@ -334,10 +329,10 @@ class CEnvironmentFactory : public CInterface,
 {
 public:
     IMPLEMENT_IINTERFACE;
-   MAKEValueArray(SubscriptionId, SubscriptionIDs);
-   SubscriptionIDs subIDs;
+    MAKEValueArray(SubscriptionId, SubscriptionIDs);
+    SubscriptionIDs subIDs;
     Mutex mutex;
-   Owned<CSdsSubscription> subscription;
+    Owned<CSdsSubscription> subscription;
     
     CEnvironmentFactory()
     {
@@ -350,119 +345,6 @@ public:
         close(); //just in case it was not explicitly closed
     }
 
-    //Create the first environment cache from a file
-    virtual IConstEnvironment* createEnvironmentByFile(const char* environmentConfFile, const char* environmentXMLFile)
-    {
-        sEnvironmentConfFile[0] = 0;
-        sEnvironmentXMLFile[0] = 0;
-        sEnvironmentConf.clear();
-
-        if (environmentConfFile && *environmentConfFile)
-        {  
-            strcpy(sEnvironmentConfFile, environmentConfFile);
-
-            IFile * pFile = createIFile(sEnvironmentConfFile);
-            if (pFile->exists( ))
-            {       
-                CDateTime fcreated, fmodified, faccessed;
-                if (pFile->getTime(&fcreated, &fmodified, &faccessed)) 
-                {
-                    xmlFileCacheTime = fmodified;
-                    Owned<IFileIO> pFileIO = pFile->openShared(IFOread, IFSHfull);
-                    if (pFileIO)
-                    {
-                        StringBuffer tmpBuf;
-                        offset_t fileSize = pFile->size();
-                        tmpBuf.ensureCapacity((unsigned)fileSize);
-                        tmpBuf.setLength((unsigned)fileSize);
-
-                        size32_t nRead = pFileIO->read(0, (size32_t) fileSize, (char*)tmpBuf.str());
-                        if (nRead == fileSize)
-                        {
-                            sEnvironmentConf = tmpBuf;
-                        }
-                    }
-                }
-            }
-        }
-
-        if (!environmentXMLFile || !*environmentXMLFile)
-            return NULL;
-
-        strcpy(sEnvironmentXMLFile, environmentXMLFile);
-
-        IFile * ifile = createIFile(sEnvironmentXMLFile);
-        if (!ifile->exists( ))
-            return NULL;
-    
-        CDateTime fcreated, fmodified, faccessed;
-        if (!ifile->getTime(&fcreated, &fmodified, &faccessed)) 
-            return NULL;
-
-        xmlFileCacheTime = fmodified;
-        cache.setown(new CLocalEnvironment(sEnvironmentXMLFile));
-
-        return cache.getLink();
-    }
-
-    virtual const char* getEnvironmentConf()
-    {
-        if (!sEnvironmentConfFile || !*sEnvironmentConfFile)
-            return NULL;
-
-        IFile * pFile = createIFile(sEnvironmentConfFile);
-        if (pFile->exists( ))
-        {       
-            CDateTime fcreated, fmodified, faccessed;
-            if (pFile->getTime(&fcreated, &fmodified, &faccessed)) 
-            {
-                if ((sEnvironmentConf.length() < 1) || (xmlFileCacheTime != fmodified))
-                {
-                    xmlFileCacheTime = fmodified;
-                    Owned<IFileIO> pFileIO = pFile->openShared(IFOread, IFSHfull);
-                    if (pFileIO)
-                    {
-                        StringBuffer tmpBuf;
-                        offset_t fileSize = pFile->size();
-                        tmpBuf.ensureCapacity((unsigned)fileSize);
-                        tmpBuf.setLength((unsigned)fileSize);
-
-                        size32_t nRead = pFileIO->read(0, (size32_t) fileSize, (char*)tmpBuf.str());
-                        if (nRead == fileSize)
-                        {
-                            sEnvironmentConf = tmpBuf;
-                        }
-                    }
-                }
-            }
-        }
-        return sEnvironmentConf.str();
-    }
-
-    virtual IConstEnvironment* openEnvironmentByFile()
-    {
-        //For cackward compatible
-        if (!sEnvironmentXMLFile || !*sEnvironmentXMLFile)
-            return openEnvironment();
-        
-        synchronized procedure(mutex);
-
-        IFile * ifile = createIFile(sEnvironmentXMLFile);
-        if (!ifile->exists( ))
-            return openEnvironment();
-    
-        CDateTime fcreated, fmodified, faccessed;
-        if (!ifile->getTime(&fcreated, &fmodified, &faccessed)) 
-            return openEnvironment();
-
-        if (!cache || (xmlFileCacheTime != fmodified))
-        {
-            xmlFileCacheTime = fmodified;
-            cache.setown(new CLocalEnvironment(sEnvironmentXMLFile));
-        }
-        return cache.getLink();
-    }
-
     virtual IConstEnvironment* openEnvironment()
     {
         synchronized procedure(mutex);
@@ -476,9 +358,9 @@ public:
         return cache.getLink();
     }
 
-   virtual IEnvironment* updateEnvironment()
+    virtual IEnvironment* updateEnvironment()
     {
-      Owned<IConstEnvironment> pConstEnv = openEnvironment();
+        Owned<IConstEnvironment> pConstEnv = openEnvironment();
 
         synchronized procedure(mutex);
         return &pConstEnv->lock();
@@ -530,7 +412,7 @@ public:
 
         synchronized procedure(mutex);
         subIDs.append(sub_id);
-      return sub_id;
+        return sub_id;
    }
          
    virtual void unsubscribe(SubscriptionId sub_id)
@@ -547,10 +429,10 @@ public:
 
    virtual void validateCache()
    {
-      if (!subscription)
-         subscription.setown( new CSdsSubscription() );
+        if (!subscription)
+            subscription.setown( new CSdsSubscription() );
       
-      subscription->handleEnvironmentChange();
+        subscription->handleEnvironmentChange();
    }
 
 private:

+ 0 - 3
common/environment/environment.hpp

@@ -130,9 +130,6 @@ interface IEnvironment : extends IConstEnvironment
 interface IEnvironmentFactory : extends IInterface
 {
     virtual IConstEnvironment * openEnvironment() = 0;
-    virtual IConstEnvironment * createEnvironmentByFile(const char * environmentConfFile, const char * environmentXMLFile) = 0;
-    virtual IConstEnvironment * openEnvironmentByFile() = 0;
-    virtual const char * getEnvironmentConf() = 0;
     virtual IEnvironment * updateEnvironment() = 0;
     virtual IEnvironment * loadLocalEnvironmentFile(const char * filename) = 0;
     virtual IEnvironment * loadLocalEnvironment(const char * xml) = 0;

+ 15 - 34
common/thorhelper/layouttrans.cpp

@@ -380,7 +380,7 @@ void RowTransformer::generateCopies(unsigned & seq, CIArrayOf<RowRecord> const &
     }
 }
 
-void RowTransformer::transform(IRecordLayoutTranslator::RowTransformContext * ctx, byte const * in, size32_t inSize, size32_t & inOffset, byte * out, size32_t outBuffSize, size32_t & outOffset) const
+void RowTransformer::transform(IRecordLayoutTranslator::RowTransformContext * ctx, byte const * in, size32_t inSize, size32_t & inOffset, IMemoryBlock & out, size32_t & outOffset) const
 {
     ctx->set(sequence, 0, 0, in+inOffset);
     for(unsigned varIdx = 1; varIdx <= diskVarFieldRelOffsets.ordinality(); ++varIdx)
@@ -402,7 +402,7 @@ void RowTransformer::transform(IRecordLayoutTranslator::RowTransformContext * ct
     inOffset += finalFixedSize;
 
     ForEachItemIn(copyIdx, copies)
-        copies.item(copyIdx).copy(ctx, out, outBuffSize, outOffset);
+        copies.item(copyIdx).copy(ctx, out, outOffset);
 }
 
 void RowTransformer::getFposOut(IRecordLayoutTranslator::RowTransformContext const * ctx, offset_t & fpos) const
@@ -435,17 +435,16 @@ void RowTransformer::createRowTransformContext(IRecordLayoutTranslator::RowTrans
     }
 }
 
-void FieldCopy::copy(IRecordLayoutTranslator::RowTransformContext * ctx, byte * out, size32_t outBuffSize, size32_t & outOffset) const
+void FieldCopy::copy(IRecordLayoutTranslator::RowTransformContext * ctx, IMemoryBlock & out, size32_t & outOffset) const
 {
     if(sequence == static_cast<unsigned>(-1))
     {
-        if(outOffset+fixedSize > outBuffSize)
-            throw MakeStringException(0, "Activity row exceeded expected size limit during record layout translation");
+        byte * target = out.ensure(outOffset+fixedSize);
         // integer field in row is big-endian
 #if __BYTE_ORDER == __BIG_ENDIAN
-        memcpy(out+outOffset, reinterpret_cast<byte const *>(ctx->queryFposIn()) + sizeof(offset_t) - fixedSize, fixedSize);
+        memcpy(target+outOffset, reinterpret_cast<byte const *>(ctx->queryFposIn()) + sizeof(offset_t) - fixedSize, fixedSize);
 #else
-        _cpyrevn(out+outOffset, ctx->queryFposIn(), fixedSize);
+        _cpyrevn(target+outOffset, ctx->queryFposIn(), fixedSize);
 #endif
         outOffset += fixedSize;
         return;
@@ -459,18 +458,20 @@ void FieldCopy::copy(IRecordLayoutTranslator::RowTransformContext * ctx, byte *
     if(childTransformer)
     {
         size32_t inOffset = sizeof(size32_t);
-        size32_t * outSizePtr = reinterpret_cast<size32_t *>(out+outOffset);
+        size32_t sizeOutOffset = outOffset;
         outOffset += sizeof(size32_t);
         size32_t startOutOffset = outOffset;
         while(inOffset < diskFieldSize)
-            childTransformer->transform(ctx, in, diskFieldSize, inOffset, out, outBuffSize, outOffset);
+            childTransformer->transform(ctx, in, diskFieldSize, inOffset, out, outOffset);
+
+        //Now patch the length up - transform may have resized out...
+        size32_t * outSizePtr = reinterpret_cast<size32_t *>(out.getMem()+sizeOutOffset);
         *outSizePtr = outOffset-startOutOffset;
     }
     else
     {
-        if(outOffset+diskFieldSize > outBuffSize)
-            throw MakeStringException(0, "Activity row exceeded expected size limit during record layout translation");
-        memcpy(out+outOffset, in, diskFieldSize);
+        byte * target = out.ensure(outOffset+diskFieldSize);
+        memcpy(target+outOffset, in, diskFieldSize);
         outOffset += diskFieldSize;
     }
 }
@@ -499,26 +500,10 @@ IRecordLayoutTranslator::RowTransformContext::~RowTransformContext()
     delete [] ptrs;
 }
 
-size32_t calcMetaSize(IDefRecordMeta const * meta)
-{
-    IDefRecordElement * record = meta->queryRecord();
-    size32_t size = record->getMaxSize();
-    unsigned numFields = record->numChildren();
-    if(meta->numKeyedFields() < numFields)
-    {
-        ITypeInfo * lastFieldType = record->queryChild(numFields-1)->queryType();
-        if(lastFieldType->isInteger())
-            size -= lastFieldType->getSize();
-    }
-    return size;
-}
-
 CRecordLayoutTranslator::CRecordLayoutTranslator(IDefRecordMeta const * _diskMeta, IDefRecordMeta const * _activityMeta) : diskMeta(const_cast<IDefRecordMeta *>(_diskMeta)), activityMeta(const_cast<IDefRecordMeta *>(_activityMeta)), activityKeySizes(NULL)
 {
     numKeyedDisk = diskMeta->numKeyedFields();
     numKeyedActivity = activityMeta->numKeyedFields();
-    diskMetaSize = calcMetaSize(diskMeta);
-    activityMetaSize = calcMetaSize(activityMeta);
     MappingLevel topMappingLevel(mappings);
     numTransformers = 0;
     try
@@ -620,10 +605,6 @@ void CRecordLayoutTranslator::createDiskSegmentMonitors(SegmentMonitorContext co
 
 void CRecordLayoutTranslator::checkSizes(char const * filename, size32_t activitySize, size32_t diskSize) const
 {
-    if(activityMetaSize != activitySize)
-        throw MakeStringException(0, "Key size mismatch during translation of index %s: ECL indicates size %u, ECL record meta has size %u", filename, activitySize, activityMetaSize);
-    if(diskMetaSize != diskSize)
-        throw MakeStringException(0, "Key size mismatch during translation of index %s: index indicates size %u, index record meta has size %u", filename, diskSize, diskMetaSize);
 }
 
 IRecordLayoutTranslator::RowTransformContext * CRecordLayoutTranslator::getRowTransformContext()
@@ -633,12 +614,12 @@ IRecordLayoutTranslator::RowTransformContext * CRecordLayoutTranslator::getRowTr
     return ctx.getClear();
 }
 
-size32_t CRecordLayoutTranslator::transformRow(RowTransformContext * ctx, byte const * in, size32_t inSize, byte * out, size32_t outBuffSize, offset_t & fpos) const
+size32_t CRecordLayoutTranslator::transformRow(RowTransformContext * ctx, byte const * in, size32_t inSize, IMemoryBlock & out, offset_t & fpos) const
 {
     size32_t inOffset = 0;
     size32_t outOffset = 0;
     ctx->setFposIn(fpos);
-    transformer.transform(ctx, in, inSize, inOffset, out, outBuffSize, outOffset);
+    transformer.transform(ctx, in, inSize, inOffset, out, outOffset);
     transformer.getFposOut(ctx, fpos);
     return outOffset;
 }

+ 1 - 3
common/thorhelper/layouttrans.hpp

@@ -68,14 +68,12 @@ public:
 
     virtual bool querySuccess() const = 0;
     virtual Failure const & queryFailure() const = 0;
-    virtual size32_t queryActivityKeySize() const = 0;
-    virtual size32_t queryDiskKeySize() const = 0;
     virtual void checkSizes(char const * filename, size32_t activitySize, size32_t diskSize) const = 0;
     virtual bool queryKeysTransformed() const = 0;
     virtual SegmentMonitorContext * getSegmentMonitorContext() = 0;
     virtual void createDiskSegmentMonitors(SegmentMonitorContext const & in, IIndexReadContext & out) = 0;
     virtual RowTransformContext * getRowTransformContext() = 0;
-    virtual size32_t transformRow(RowTransformContext * ctx, byte const * in, size32_t inSize, byte * out, size32_t outBuffSize, offset_t & fpos) const = 0;
+    virtual size32_t transformRow(RowTransformContext * ctx, byte const * in, size32_t inSize, IMemoryBlock & out, offset_t & fpos) const = 0;
 #ifdef DEBUG_HELPERS_REQUIRED
     virtual StringBuffer & getMappingsAsString(StringBuffer & out) const = 0;
 #endif

+ 3 - 7
common/thorhelper/layouttrans.ipp

@@ -120,7 +120,7 @@ public:
     RowTransformer() {}
     RowTransformer(unsigned & seq, FieldMapping::List const & mappings) { build(seq, mappings); }
     void build(unsigned & seq, FieldMapping::List const & mappings);
-    void transform(IRecordLayoutTranslator::RowTransformContext * ctx, byte const * in, size32_t inSize, size32_t & inOffset, byte * out, size32_t outBuffSize, size32_t & outOffset) const;
+    void transform(IRecordLayoutTranslator::RowTransformContext * ctx, byte const * in, size32_t inSize, size32_t & inOffset, IMemoryBlock & out, size32_t & outOffset) const;
     void getFposOut(IRecordLayoutTranslator::RowTransformContext const * ctx, offset_t & fpos) const;
     void createRowTransformContext(IRecordLayoutTranslator::RowTransformContext * ctx) const;
 
@@ -178,7 +178,7 @@ public:
     void addVarField(unsigned base) { varFields.append(base); }
     void setChildTransformer(RowTransformer * _transformer) { assertex(!childTransformer); childTransformer.setown(_transformer); }
     RowTransformer const * queryChildTransformer() const { return childTransformer; }
-    void copy(IRecordLayoutTranslator::RowTransformContext * ctx, byte * out, size32_t outBuffSize, size32_t & outOffset) const;
+    void copy(IRecordLayoutTranslator::RowTransformContext * ctx, IMemoryBlock & out, size32_t & outOffset) const;
 private:
     unsigned sequence;
     size32_t relOffset;
@@ -196,14 +196,12 @@ public:
     IMPLEMENT_IINTERFACE;
     virtual bool querySuccess() const { return !failure; }
     virtual Failure const & queryFailure() const { return *failure; }
-    virtual size32_t queryActivityKeySize() const { return activityMetaSize; }
-    virtual size32_t queryDiskKeySize() const { return diskMetaSize; }
     virtual void checkSizes(char const * filename, size32_t activitySize, size32_t diskSize) const;
     virtual bool queryKeysTransformed() const { return keysTransformed; }
     virtual SegmentMonitorContext * getSegmentMonitorContext() { return new ExpandedSegmentMonitorList(this); }
     virtual void createDiskSegmentMonitors(SegmentMonitorContext const & in, IIndexReadContext & out);
     virtual RowTransformContext * getRowTransformContext();
-    virtual size32_t transformRow(RowTransformContext * ctx, byte const * in, size32_t inSize, byte * out, size32_t outBuffSize, offset_t & fpos) const;
+    virtual size32_t transformRow(RowTransformContext * ctx, byte const * in, size32_t inSize, IMemoryBlock & out, offset_t & fpos) const;
 #ifdef DEBUG_HELPERS_REQUIRED
     virtual StringBuffer & getMappingsAsString(StringBuffer & out) const;
 #endif
@@ -217,8 +215,6 @@ private:
 
     Linked<IDefRecordMeta> diskMeta;
     Linked<IDefRecordMeta> activityMeta;
-    size32_t activityMetaSize;
-    size32_t diskMetaSize;
     bool success;
     Owned<Failure> failure;
     FieldMapping::List mappings;

+ 3 - 1
common/workunit/CMakeLists.txt

@@ -41,6 +41,7 @@ set (    SRCS
     )
 
 include_directories ( 
+         ./../../common/environment
          ./../../common/workunit
          ./../../system/mp 
          ./../../dali/ft 
@@ -68,7 +69,8 @@ target_link_libraries ( workunit
          dllserver 
          nbcd 
          eclrtl 
-         deftype 
+         deftype
+         environment
     )
 
 

+ 70 - 39
common/workunit/workunit.cpp

@@ -45,6 +45,7 @@
 
 #include "wuerror.hpp"
 #include "wujobq.hpp"
+#include "environment.hpp"
 
 #define GLOBAL_WORKUNIT "global"
 
@@ -4352,10 +4353,12 @@ void getRoxieProcessServers(IPropertyTree *roxie, SocketEndpointArray &endpoints
 
 void getRoxieProcessServers(const char *process, SocketEndpointArray &servers)
 {
-    Owned<IRemoteConnection> conn = querySDS().connect("Environment", myProcessSession(), RTM_LOCK_READ, SDS_LOCK_TIMEOUT);
-    if (!conn)
+    Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
+    Owned<IConstEnvironment> env = factory->openEnvironment();
+    if (!env)
         return;
-    getRoxieProcessServers(queryRoxieProcessTree(conn->queryRoot(), process), servers);
+    Owned<IPropertyTree> root = &env->getPTree();
+    getRoxieProcessServers(queryRoxieProcessTree(root, process), servers);
 }
 
 class CEnvironmentClusterInfo: public CInterface, implements IConstWUClusterInfo
@@ -4503,13 +4506,15 @@ IStringVal &getProcessQueueNames(IStringVal &ret, const char *process, const cha
 {
     if (process)
     {
-        Owned<IRemoteConnection> conn = querySDS().connect("Environment", myProcessSession(), RTM_LOCK_READ, SDS_LOCK_TIMEOUT);
-        if (conn)
+        Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
+        Owned<IConstEnvironment> env = factory->openEnvironment();
+        if (env)
         {
+            Owned<IPropertyTree> root = &env->getPTree();
             StringBuffer queueNames;
             StringBuffer xpath;
             xpath.appendf("%s[@process=\"%s\"]", type, process);
-            Owned<IPropertyTreeIterator> targets = conn->queryRoot()->getElements("Software/Topology/Cluster");
+            Owned<IPropertyTreeIterator> targets = root->getElements("Software/Topology/Cluster");
             ForEach(*targets)
             {
                 IPropertyTree &target = targets->query();
@@ -4570,11 +4575,16 @@ extern WORKUNIT_API StringBuffer &getClusterThorQueueName(StringBuffer &ret, con
 
 extern WORKUNIT_API StringBuffer &getClusterThorGroupName(StringBuffer &ret, const char *cluster)
 {
-    StringBuffer path;
-    Owned<IRemoteConnection> conn = querySDS().connect(path.append("Environment/Software/ThorCluster[@name=\"").append(cluster).append("\"]").str(), myProcessSession(), RTM_LOCK_READ, SDS_LOCK_TIMEOUT);
-    if (conn)
+    Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
+    Owned<IConstEnvironment> env = factory->openEnvironment();
+    if (env)
     {
-        getClusterGroupName(*conn->queryRoot(), ret);
+        Owned<IPropertyTree> root = &env->getPTree();
+        StringBuffer path;
+        path.append("Software/ThorCluster[@name=\"").append(cluster).append("\"]");
+        IPropertyTree * child = root->queryPropTree(path);
+        if (child)
+            getClusterGroupName(*child, ret);
     }
 
     return ret;
@@ -4602,15 +4612,17 @@ extern WORKUNIT_API StringBuffer &getClusterEclAgentQueueName(StringBuffer &ret,
 
 extern WORKUNIT_API IStringIterator *getTargetClusters(const char *processType, const char *processName)
 {
-    Owned<IRemoteConnection> conn = querySDS().connect("Environment", myProcessSession(), RTM_LOCK_READ, SDS_LOCK_TIMEOUT);
     Owned<CStringArrayIterator> ret = new CStringArrayIterator;
-    if (conn)
+    Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
+    Owned<IConstEnvironment> env = factory->openEnvironment();
+    if (env)
     {
+        Owned<IPropertyTree> root = &env->getPTree();
         StringBuffer xpath;
         xpath.appendf("%s", processType ? processType : "*");
         if (processName && *processName)
             xpath.appendf("[@process=\"%s\"]", processName);
-        Owned<IPropertyTreeIterator> targets = conn->queryRoot()->getElements("Software/Topology/Cluster");
+        Owned<IPropertyTreeIterator> targets = root->getElements("Software/Topology/Cluster");
         ForEach(*targets)
         {
             IPropertyTree &target = targets->query();
@@ -4627,11 +4639,14 @@ extern WORKUNIT_API bool isProcessCluster(const char *process)
 {
     if (!process || !*process)
         return false;
-    Owned<IRemoteConnection> conn = querySDS().connect("Environment", myProcessSession(), RTM_LOCK_READ, SDS_LOCK_TIMEOUT);
-    if (!conn)
+    Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
+    Owned<IConstEnvironment> env = factory->openEnvironment();
+    if (!env)
         return false;
+
+    Owned<IPropertyTree> root = &env->getPTree();
     VStringBuffer xpath("Software/*Cluster[@name=\"%s\"]", process);
-    return conn->queryRoot()->hasProp(xpath.str());
+    return root->hasProp(xpath.str());
 }
 
 extern WORKUNIT_API bool isProcessCluster(const char *remoteDali, const char *process)
@@ -4644,6 +4659,7 @@ extern WORKUNIT_API bool isProcessCluster(const char *remoteDali, const char *pr
     if (!remote)
         return false;
 
+    //Cannot use getEnvironmentFactory() since it is using a remotedali
     VStringBuffer xpath("Environment/Software/*Cluster[@name=\"%s\"]/@name", process);
     try
     {
@@ -4696,41 +4712,46 @@ IConstWUClusterInfo* getTargetClusterInfo(IPropertyTree *environment, IPropertyT
     return new CEnvironmentClusterInfo(clustname, prefix, agent, thors, queryRoxieProcessTree(environment, roxieName));
 }
 
-IPropertyTree* getTopologyCluster(Owned<IRemoteConnection> &conn, const char *clustname)
+IPropertyTree* getTopologyCluster(Owned<IPropertyTree> &envRoot, const char *clustname)
 {
     if (!clustname || !*clustname)
         return NULL;
-    conn.setown(querySDS().connect("Environment", myProcessSession(), RTM_LOCK_READ, SDS_LOCK_TIMEOUT));
-    if (!conn)
+    Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
+    Owned<IConstEnvironment> env = factory->openEnvironment();
+    if (!env)
         return NULL;
+
+    envRoot.setown(&env->getPTree());
     StringBuffer xpath;
     xpath.appendf("Software/Topology/Cluster[@name=\"%s\"]", clustname);
-    return conn->queryRoot()->getPropTree(xpath.str());
+    return envRoot->getPropTree(xpath.str());
 }
 
 bool validateTargetClusterName(const char *clustname)
 {
-    Owned<IRemoteConnection> conn;
-    Owned<IPropertyTree> cluster = getTopologyCluster(conn, clustname);
+    Owned<IPropertyTree> envRoot;
+    Owned<IPropertyTree> cluster = getTopologyCluster(envRoot, clustname);
     return (cluster.get()!=NULL);
 }
 
 IConstWUClusterInfo* getTargetClusterInfo(const char *clustname)
 {
-    Owned<IRemoteConnection> conn;
-    Owned<IPropertyTree> cluster = getTopologyCluster(conn, clustname);
+    Owned<IPropertyTree> envRoot;
+    Owned<IPropertyTree> cluster = getTopologyCluster(envRoot, clustname);
     if (!cluster)
         return NULL;
-    return getTargetClusterInfo(conn->queryRoot(), cluster);
+    return getTargetClusterInfo(envRoot, cluster);
 }
 
 unsigned getEnvironmentClusterInfo(CConstWUClusterInfoArray &clusters)
 {
-    Owned<IRemoteConnection> conn = querySDS().connect("Environment", myProcessSession(), RTM_LOCK_READ, SDS_LOCK_TIMEOUT);
-    if (!conn)
+    Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
+    Owned<IConstEnvironment> env = factory->openEnvironment();
+    if (!env)
         return 0;
 
-    return getEnvironmentClusterInfo(conn->queryRoot(), clusters);
+    Owned<IPropertyTree> root = &env->getPTree();
+    return getEnvironmentClusterInfo(root, clusters);
 }
 
 unsigned getEnvironmentClusterInfo(IPropertyTree* environmentRoot, CConstWUClusterInfoArray &clusters)
@@ -4752,13 +4773,17 @@ const char *getTargetClusterComponentName(const char *clustname, const char *pro
 {
     if (!clustname)
         return NULL;
-    Owned<IRemoteConnection> conn = querySDS().connect("Environment", myProcessSession(), RTM_LOCK_READ, SDS_LOCK_TIMEOUT);
-    if (!conn)
+
+    Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
+    Owned<IConstEnvironment> env = factory->openEnvironment();
+    if (!env)
         return NULL;
+
+    Owned<IPropertyTree> root = &env->getPTree();
     StringBuffer xpath;
 
     xpath.appendf("Software/Topology/Cluster[@name=\"%s\"]", clustname);
-    Owned<IPropertyTree> cluster = conn->queryRoot()->getPropTree(xpath.str());
+    Owned<IPropertyTree> cluster = root->getPropTree(xpath.str());
     if (!cluster) 
         return NULL;
 
@@ -4770,10 +4795,13 @@ const char *getTargetClusterComponentName(const char *clustname, const char *pro
 
 unsigned getEnvironmentThorClusterNames(StringArray &thorNames, StringArray &groupNames, StringArray &targetNames, StringArray &queueNames)
 {
-    Owned<IRemoteConnection> conn = querySDS().connect("Environment", myProcessSession(), RTM_LOCK_READ, SDS_LOCK_TIMEOUT);
-    if (!conn)
+    Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
+    Owned<IConstEnvironment> env = factory->openEnvironment();
+    if (!env)
         return 0;
-    Owned<IPropertyTreeIterator> allTargets = conn->queryRoot()->getElements("Software/Topology/Cluster");
+
+    Owned<IPropertyTree> root = &env->getPTree();
+    Owned<IPropertyTreeIterator> allTargets = root->getElements("Software/Topology/Cluster");
     ForEach(*allTargets)
     {
         IPropertyTree &target = allTargets->query();
@@ -4785,7 +4813,7 @@ unsigned getEnvironmentThorClusterNames(StringArray &thorNames, StringArray &gro
             {
                 const char *thorName = thorClusters->query().queryProp("@process");
                 VStringBuffer query("Software/ThorCluster[@name=\"%s\"]",thorName);
-                IPropertyTree *thorCluster = conn->queryRoot()->queryPropTree(query.str());
+                IPropertyTree *thorCluster = root->queryPropTree(query.str());
                 if (thorCluster)
                 {
                     const char *groupName = thorCluster->queryProp("@nodeGroup");
@@ -4806,17 +4834,20 @@ unsigned getEnvironmentThorClusterNames(StringArray &thorNames, StringArray &gro
 
 unsigned getEnvironmentHThorClusterNames(StringArray &eclAgentNames, StringArray &groupNames, StringArray &targetNames)
 {
-    Owned<IRemoteConnection> conn = querySDS().connect("Environment", myProcessSession(), RTM_LOCK_READ, SDS_LOCK_TIMEOUT);
-    if (!conn)
+    Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
+    Owned<IConstEnvironment> env = factory->openEnvironment();
+    if (!env)
         return 0;
-    Owned<IPropertyTreeIterator> allEclAgents = conn->queryRoot()->getElements("Software/EclAgentProcess");
+
+    Owned<IPropertyTree> root = &env->getPTree();
+    Owned<IPropertyTreeIterator> allEclAgents = root->getElements("Software/EclAgentProcess");
     ForEach(*allEclAgents)
     {
         IPropertyTree &eclAgent = allEclAgents->query();
         const char *eclAgentName = eclAgent.queryProp("@name");
         if (eclAgentName && *eclAgentName)
         {
-            Owned<IPropertyTreeIterator> allTargets = conn->queryRoot()->getElements("Software/Topology/Cluster");
+            Owned<IPropertyTreeIterator> allTargets = root->getElements("Software/Topology/Cluster");
             ForEach(*allTargets)
             {
                 IPropertyTree &target = allTargets->query();

+ 1 - 0
dali/base/dadfs.cpp

@@ -9033,6 +9033,7 @@ class CInitGroups
 
     bool loadMachineMap()
     {
+        //GH->JCS This can't be changed to use getEnvironmentFactory() unless that moved inside dalibase;
         Owned<IRemoteConnection> conn = querySDS().connect("/Environment/Hardware", myProcessSession(), RTM_LOCK_READ, SDS_CONNECT_TIMEOUT);
         if (!conn) {
             WARNLOG("Cannot connect to /Environment/Hardware");

+ 140 - 148
dali/base/dautils.cpp

@@ -115,6 +115,7 @@ public:
                 s = lfn.str();
             }
             CDfsLogicalFileName lfn;
+            lfn.setAllowWild(true);
             lfn.set(s);
             dlfns.push_back(lfn);
             if (expanded && (strchr(s,'*') || strchr(s,'?')))
@@ -229,6 +230,7 @@ public:
 CDfsLogicalFileName::CDfsLogicalFileName()
 {
     allowospath = false;
+    allowWild = false;
     multi = NULL;
     clear();
 }
@@ -311,7 +313,7 @@ void CDfsLogicalFileName::expand(IUserDescriptor *user)
                     full.append(',');
                 const CDfsLogicalFileName &item = multi->item(i1);
                 StringAttr norm;
-                normalizeName(item.get(), norm);
+                normalizeName(item.get(), norm, false);
                 full.append(norm);
                 if (item.isExternal())
                     external = external || item.isExternal();
@@ -330,46 +332,81 @@ void CDfsLogicalFileName::expand(IUserDescriptor *user)
     }
 }
 
-void CDfsLogicalFileName::normalizeName(const char * name, StringAttr &res)
+inline void normalizeScope(const char *name, const char *scope, unsigned len, StringBuffer &res, bool strict)
 {
+    bool scopeStarted=false;
+    bool scopeEnded=false;
+    const char *s2=scope;
+    while (len--)
+    {
+        if (isspace(*s2))
+        {
+            if (strict)
+               throw MakeStringException(-1, "Scope contains spaces in file name '%s'", name);
+            if (scopeStarted) // ignore leading spaces if !strict
+                scopeEnded = true;
+        }
+        else
+        {
+            if (scopeEnded)
+               throw MakeStringException(-1, "Scope contains spaces in file name '%s'", name);
+            scopeStarted = true;
+            res.append(*s2);
+        }
+        ++s2;
+    }
+}
+
+void CDfsLogicalFileName::normalizeName(const char *name, StringAttr &res, bool strict)
+{
+    // NB: If !strict(default) allows spaces to exist either side of scopes (no idea why would want to permit that, but preserving for bwrd compat.)
     StringBuffer str;
     StringBuffer nametmp;
-    const char *s = name;
-    const char *ct = NULL;
+    const char *ct = NULL;    
     bool wilddetected = false;
-    while (*s) {
-        switch (*s) {
-        case '@': ct = s; break;
-        case ':': ct = NULL; break;
-        case '?':
-        case '*': wilddetected = true; break;
-        case '~':
-            if (s==name) { // leading ~ not allowed
-                name++;
-                skipSp(name);
-                s = name;
-                continue;
-            }
-            break;
-        }
-        s++;
+    if ('~' == *name) // allowed 1 leading ~
+    {
+        name++;
+        if (!strict)
+            skipSp(name);
     }
-    if (wilddetected)
+    const char *s = name;
+    char c = *s;
+    while (c)
     {
-        res.set(name);
-        return;
+        switch (c)
+        {
+            case '@': ct = s; break;
+            case ':': ct = NULL; break;
+            case '?':
+            case '*': wilddetected = true; break;
+            case '~':
+                throw MakeStringException(-1, "Unexpected character '%c' in logical name '%s' detected", *s, name);
+            case '>':
+            {
+                c = '\0'; // will cause break out of loop
+                continue; // can't validate query syntax
+            }
+            default:
+            {
+                if (!validFNameChar(c))
+                    throw MakeStringException(-1, "Unexpected character '%c' in logical name '%s' detected", *s, name);
+            }
+        }
+        c = *s++;
     }
-
     bool isext = memicmp(name,EXTERNAL_SCOPE "::",sizeof(EXTERNAL_SCOPE "::")-1)==0;
-    if (!isext&&wilddetected)
-        throw MakeStringException(-1,"Wildcards not allowed in filename (%s)",name);
+    if (!isext && !allowWild && wilddetected)
+        throw MakeStringException(-1, "Wildcards not allowed in filename (%s)", name);
     if (!isext&&ct&&(ct-name>=1)) // trailing @
     {
-        if ((ct[1]=='@')||(ct[1]=='^')) { // escape
+        if ((ct[1]=='@')||(ct[1]=='^')) // escape
+        {
             nametmp.append(ct-name,name).append(ct+1);
             name = nametmp.str();
         }
-        else {
+        else
+        {
             nametmp.append(ct+1);
             nametmp.trim().toLowerCase();
             if (nametmp.length())
@@ -381,95 +418,108 @@ void CDfsLogicalFileName::normalizeName(const char * name, StringAttr &res)
     if (!*name)
         name = ".::_blank_";
     s=strstr(name,"::");
-    if (s) {
-        if (s==name)
+    if (s)
+    {
+        if (s==name) // JCS: meaning name leads with "::", would have thought should be treated as invalid
             str.append('.');
-        else {
-            str.append(s-name,name).clip();
-            if (isext) {    // normalize node
+        else
+        {
+            normalizeScope(name, name, s-name, str, strict);
+            bool isForeign = 0 == stricmp(str.str(),FOREIGN_SCOPE);
+            if (isext || isForeign) // normalize node
+            {
                 const char *s1 = s+2;
                 const char *ns1 = strstr(s1,"::");
-                if (ns1) {                                          // TBD accept groupname here
-                    skipSp(s1);
+                if (ns1) // TBD accept groupname here (in the case of isext)
+                {
+                    if (!strict)
+                        skipSp(s1);
                     StringBuffer nodename;
-                    nodename.append(ns1-s1,s1).clip();
+                    nodename.append(ns1-s1,s1);
+                    if (!strict)
+                        nodename.clip();
                     SocketEndpoint ep(nodename.str());
-                    if (!ep.isNull()) {
+                    if (!ep.isNull())
+                    {
                         ep.getUrlStr(str.append("::"));
                         s = ns1;
-                        external = true;
-                        if (s[2]=='>') {
-                            str.append("::");
-                            tailpos = str.length();
-                            str.append(s+2);
-                            res.set(str);
-                            return;
+                        if (isext)
+                        {
+                            external = true;
+                            if (s[2]=='>')
+                            {
+                                str.append("::");
+                                tailpos = str.length();
+                                str.append(s+2);
+                                res.set(str);
+                                return;
+                            }
+                        }
+                        else
+                        {
+                            dbgassertex(isForeign);
+                            localpos = str.length()+2;
                         }
-
-                    }
-                }
-            }
-            else if (stricmp(str.str(),FOREIGN_SCOPE)==0) { // normalize node
-                const char *s1 = s+2;
-                const char *ns1 = strstr(s1,"::");
-                if (ns1) {
-                    skipSp(s1);
-                    StringBuffer nodename;
-                    nodename.append(ns1-s1,s1).clip();
-                    SocketEndpoint ep(nodename.str());
-                    if (!ep.isNull()) {
-                        ep.getUrlStr(str.append("::"));
-                        s = ns1;
-                        localpos = str.length()+2;
                     }
                 }
             }
         }
-        loop {
+        loop
+        {
             s+=2;
             const char *ns = strstr(s,"::");
             if (!ns)
                 break;
-            skipSp(s);
-            str.append("::").append(ns-s,s).clip();
+            str.append("::");
+            normalizeScope(name, s, ns-s, str, strict);
             s = ns;
         }
     }
-    else {
+    else
+    {
         s = name;
         str.append(".");
     }
     str.append("::");
     tailpos = str.length();
-    if (strstr(s,"::")!=NULL) {
+    if (strstr(s,"::")!=NULL)
         ERRLOG("Tail contains '::'!");
-    }
-    skipSp(s);
-    str.append(s).clip().toLowerCase();
+    normalizeScope(name, s, strlen(name)-(s-name), str, strict);
+    str.toLowerCase();
     res.set(str);
 }
 
 
-void CDfsLogicalFileName::set(const char *name)
+void CDfsLogicalFileName::set(const char *name, bool removeForeign)
 {
     clear();
-    StringBuffer str;
     if (!name)
         return;
     skipSp(name);
-    try {
+    if (allowospath&&(isAbsolutePath(name)||(stdIoHandle(name)>=0)||(strstr(name,"::")==NULL)))
+    {
+        RemoteFilename rfn;
+        rfn.setRemotePath(name);
+        setExternal(rfn);
+        return;
+    }
+    try
+    {
         multi = CMultiDLFN::create(name);
     }
-    catch (IException *e) {
+    catch (IException *e)
+    {
         StringBuffer err;
         e->errorMessage(err);
         WARNLOG("CDfsLogicalFileName::set %s",err.str());
         e->Release();
     }
-    if (multi) {
+    if (multi)
+    {
         StringBuffer full;
         full.append('{');
-        ForEachItemIn(i1,*multi) {
+        ForEachItemIn(i1,*multi)
+        {
             if (i1)
                 full.append(',');
             const CDfsLogicalFileName &item = multi->item(i1);
@@ -481,86 +531,27 @@ void CDfsLogicalFileName::set(const char *name)
         lfn.set(full);
         return;
     }
-    if (allowospath&&(isAbsolutePath(name)||(stdIoHandle(name)>=0)||(strstr(name,"::")==NULL))) {
-        RemoteFilename rfn;
-        rfn.setRemotePath(name);
-        setExternal(rfn);
-        return;
+    normalizeName(name, lfn, false);
+    if (removeForeign)
+    {
+        const char *_lfn = get(true);
+        lfn.clear();
+        lfn.set(_lfn);
     }
-    normalizeName(name, lfn);
 }
-bool CDfsLogicalFileName::setValidate(const char *lfn,bool removeforeign)
+
+bool CDfsLogicalFileName::setValidate(const char *lfn, bool removeForeign)
 {
-    // NB will allows multi
-    const char *s = lfn;
-    if (!s)
-        return false;
-    skipSp(s);
-    if (*s=='~') {  // allowed 1 leading ~
-        s++;
-        skipSp(s);
-    }
-    if (*s=='~')
-        return false;
-    if (allowospath&&(isAbsolutePath(s)||(stdIoHandle(s)>=0)||(strstr(lfn,"::")==NULL))) {
-        set(lfn);
+    try
+    {
+        set(lfn, removeForeign);
         return true;
     }
-
-    const char *ns = skipScope(s,FOREIGN_SCOPE);
-    if (ns) {
-        while (*ns&&((*ns!=':')||(ns[1]!=':'))) // remove IP
-            ns++;
-        if (*ns) {
-            s = ns+2;
-            if (removeforeign) {
-                lfn = s;
-                skipSp(s);
-            }
-        }
-    }
-    const char *es = ns?NULL:skipScope(s,EXTERNAL_SCOPE);
-    if (es) { 
-        while (*es&&((*es!=':')||(es[1]!=':'))) // remove IP
-            es++;
-        if (*es) {
-            if (es[2]=='>') { // query
-                set(lfn);
-                return true;
-            }
-            s = es+2;
-        }
-    }
-    unsigned sc=0;
-    int inmulti = 0;
-    loop {
-        while(*s!=':') {
-            if (!*s) {
-                if (sc==0)
-                    return false;
-                set(lfn);
-                return true;
-            }
-            if (!validFNameChar(*s)) {
-                if (!inmulti||((*s!='?')&&(*s!='*')))
-                    return false;
-            }
-            if (*s=='{')
-                inmulti++;
-            else if (inmulti&&(*s=='}'))
-                inmulti--;
-            if (*s!=' ')
-                sc++;
-            s++;
-        }
-        if (sc==0)
-            break;
-        if (s[1]!=':')
-            break;
-        s += 2;
-        sc = 0;
+    catch (IException *e)
+    {
+        e->Release();
+        return false;
     }
-    return false;
 }
 
 
@@ -3087,3 +3078,4 @@ bool traceAllTransactions(bool on)
     transactionLoggingOn = on;
     return ret;
 }
+

+ 5 - 3
dali/base/dautils.hpp

@@ -59,15 +59,16 @@ class da_decl CDfsLogicalFileName
     CMultiDLFN *multi;   // for temp superfile
     bool external;
     bool allowospath;
+    bool allowWild;
 
 public:
     CDfsLogicalFileName();
     ~CDfsLogicalFileName();
 
     CDfsLogicalFileName & operator = (CDfsLogicalFileName const &from);
-    void set(const char *lfn);
+    void set(const char *lfn, bool removeForeign=false); // throws an exception on invalid filenames
+    bool setValidate(const char *lfn, bool removeForeign=false); // returns false for invalid filenames
     void set(const CDfsLogicalFileName &lfn);
-    bool setValidate(const char *lfn,bool removeforeign=false); // checks for invalid chars
     void set(const char *scopes,const char *tail);
     bool setFromMask(const char *partmask,const char *rootdir=NULL);
     void clear();
@@ -134,9 +135,10 @@ public:
     const void resolveWild();  // only for multi
     IPropertyTree *createSuperTree() const;
     void allowOsPath(bool allow=true) { allowospath = allow; } // allow local OS path to be specified
+    void setAllowWild(bool b=true) { allowWild = b; } // allow wildcards
     bool isExpanded() const;
     void expand(IUserDescriptor *user);
-    void normalizeName(const char * name, StringAttr &res);
+    void normalizeName(const char * name, StringAttr &res, bool strict);
 };
 
 // abstract class, define getCmdText to return tracing text of commands

+ 0 - 17
dali/dafilesrv/dafscontrol.cpp

@@ -85,23 +85,6 @@ bool getCluster(const char *clustername,SocketEndpointArray &eps)
     return eps.ordinality()!=0;
 }
 
-bool getAllClusters(SocketEndpointArray &eps)
-{
-    Owned<IRemoteConnection> conn = querySDS().connect("/Environment/Software", myProcessSession(), RTM_LOCK_READ, SDS_CONNECT_TIMEOUT);
-    if (!conn) 
-        return false;
-    IPropertyTree* root = conn->queryRoot();
-    Owned<IPropertyTreeIterator> clusters= root->getElements("ThorCluster");
-    if (clusters->first()) {
-        do {
-            IPropertyTree &cluster = clusters->query();
-            if (!getCluster(cluster.queryProp("@name"),eps))
-                ERRLOG("Cluster %s not found",cluster.queryProp("@name"));
-        } while (clusters->next());
-    }
-    return eps.ordinality()!=0;
-}
-
 unsigned applyNodes(const char *grpip, ApplyMode mode, unsigned ver, bool isdali, bool quiet)
 {
     SocketEndpointArray eps;

+ 5 - 3
dali/dfuplus/main.cpp

@@ -34,9 +34,10 @@ void handleSyntax()
     StringBuffer out;
 
     out.append("Usage:\n");
-    out.append("    dfuplus action=[spray|replicate|despray|copy|remove|rename|list|\n");
+    out.append("    dfuplus [-v|--version] | action=[spray|replicate|despray|copy|remove|rename|list|\n");
     out.append("                    addsuper|removesuper|listsuper|copysuper|dafilesrv|\n");
-    out.append("                    savexml|add|status|abort|resubmit|monitor] {<options>}\n");
+    out.append("                    savexml|add|status|abort|resubmit|monitor] {<options>}\n\n");
+    out.append("        -v | --version -- display version info\n\n");
     out.append("    general options:\n");
     out.append("        server=<esp-server-url> \n");
     out.append("        username=<user-name>\n");
@@ -265,7 +266,8 @@ int main(int argc, const char* argv[])
 {
     InitModuleObjects();
 
-    if ((argc >= 2) && ((stricmp(argv[1], "/version") == 0) || (stricmp(argv[1], "-version") == 0))) 
+    if ((argc >= 2) && ((stricmp(argv[1], "/version") == 0) || (stricmp(argv[1], "-v") == 0)
+        || (stricmp(argv[1], "--version") == 0)))
     {
         printVersion();
         return 0;

+ 1 - 0
docs/CMakeLists.txt

@@ -56,6 +56,7 @@ add_subdirectory(HPCCCertify)
 add_subdirectory(HPCCDataHandling)
 add_subdirectory(HPCCDataTutorial)
 add_subdirectory(HPCCMonitoring)
+add_subdirectory(HPCCSystemAdmin)
 add_subdirectory(IMDB)
 add_subdirectory(InstantCloud)
 add_subdirectory(Installing_and_RunningTheHPCCPlatform)

+ 10 - 1
docs/ECLLanguageReference/ECLR_mods/BltInFunc-BUILD.xml

@@ -158,7 +158,9 @@
       </indexterm>( </emphasis><emphasis>basedataset</emphasis><emphasis
     role="bold"> )] [, OVERWRITE<indexterm>
         <primary>OVERWRITE</primary>
-      </indexterm>]</emphasis><emphasis role="bold"> <emphasis
+      </indexterm>]</emphasis><emphasis role="bold"> [, UPDATE<indexterm>
+        <primary>UPDATE</primary>
+      </indexterm>]<emphasis
     role="bold">[</emphasis><emphasis>,</emphasis><emphasis
     role="bold">EXPIRE<indexterm>
         <primary>EXPIRE</primary>
@@ -278,6 +280,13 @@
             </row>
 
             <row>
+              <entry><emphasis role="bold">UPDATE</emphasis></entry>
+
+              <entry>Specifies that the file should be rewritten only if the
+              code or input data has changed.</entry>
+            </row>
+
+            <row>
               <entry><emphasis role="bold">EXPIRE</emphasis></entry>
 
               <entry>Optional. Specifies the file is a temporary file that may

+ 34 - 5
docs/ECLLanguageReference/ECLR_mods/BltInFunc-OUTPUT.xml

@@ -312,7 +312,9 @@
       </indexterm>] [</emphasis><emphasis>,</emphasis><emphasis
     role="bold">OVERWRITE<indexterm>
         <primary>OVERWRITE</primary>
-      </indexterm>]</emphasis><emphasis role="bold">
+      </indexterm>]<emphasis role="bold">[, UPDATE<indexterm>
+        <primary>UPDATE</primary>
+      </indexterm>]</emphasis></emphasis><emphasis role="bold">
     [</emphasis><emphasis>,</emphasis><emphasis role="bold">EXPIRE<indexterm>
         <primary>EXPIRE</primary>
       </indexterm>( [</emphasis><emphasis> days </emphasis><emphasis
@@ -378,6 +380,13 @@
             </row>
 
             <row>
+              <entry><emphasis role="bold">UPDATE</emphasis></entry>
+
+              <entry>Specifies that the file should be rewritten only if the
+              code or input data has changed.</entry>
+            </row>
+
+            <row>
               <entry><emphasis role="bold">EXPIRE</emphasis></entry>
 
               <entry>Optional. Specifies the file is a temporary file that may
@@ -459,8 +468,11 @@ OUTPUT(People(Attr1=FALSE));
     <para><emphasis role="bold">[</emphasis><emphasis>,</emphasis><emphasis
     role="bold"> OVERWRITE<indexterm>
         <primary>OVERWRITE</primary>
-      </indexterm> ]</emphasis><emphasis role="bold">
-    [</emphasis><emphasis>,</emphasis><emphasis role="bold"> EXPIRE<indexterm>
+      </indexterm> ]</emphasis><emphasis role="bold"><emphasis role="bold">[,
+    UPDATE<indexterm>
+        <primary>UPDATE</primary>
+      </indexterm>]</emphasis> [</emphasis><emphasis>,</emphasis><emphasis
+    role="bold"> EXPIRE<indexterm>
         <primary>EXPIRE</primary>
       </indexterm>( [ </emphasis><emphasis>days </emphasis><emphasis
     role="bold">] ) ] )</emphasis></para>
@@ -518,6 +530,13 @@ OUTPUT(People(Attr1=FALSE));
             </row>
 
             <row>
+              <entry><emphasis role="bold">UPDATE</emphasis></entry>
+
+              <entry>Specifies that the file should be rewritten only if the
+              code or input data has changed.</entry>
+            </row>
+
+            <row>
               <entry><emphasis role="bold">EXPIRE</emphasis></entry>
 
               <entry>Optional. Specifies the file is a temporary file that may
@@ -704,8 +723,11 @@ OUTPUT(XMLds,,'~thor::outdata.xml',CSV(HEADING('&lt;XML&gt;','&lt;/XML&gt;')));
     role="bold">) ] [</emphasis><emphasis>,</emphasis><emphasis role="bold">
     OVERWRITE<indexterm>
         <primary>OVERWRITE</primary>
-      </indexterm> ]</emphasis><emphasis role="bold">
-    [</emphasis><emphasis>,</emphasis><emphasis role="bold"> EXPIRE<indexterm>
+      </indexterm> ]</emphasis><emphasis role="bold"><emphasis role="bold">[,
+    UPDATE<indexterm>
+        <primary>UPDATE</primary>
+      </indexterm>]</emphasis> [</emphasis><emphasis>,</emphasis><emphasis
+    role="bold"> EXPIRE<indexterm>
         <primary>EXPIRE</primary>
       </indexterm>( [ </emphasis><emphasis>days </emphasis><emphasis
     role="bold">] ) ] )</emphasis></para>
@@ -763,6 +785,13 @@ OUTPUT(XMLds,,'~thor::outdata.xml',CSV(HEADING('&lt;XML&gt;','&lt;/XML&gt;')));
             </row>
 
             <row>
+              <entry><emphasis role="bold">UPDATE</emphasis></entry>
+
+              <entry>Specifies that the file should be rewritten only if the
+              code or input data has changed.</entry>
+            </row>
+
+            <row>
               <entry><emphasis role="bold">EXPIRE</emphasis></entry>
 
               <entry>Optional. Specifies the file is a temporary file that may

+ 46 - 0
docs/ECLLanguageReference/ECLR_mods/BltInFunc-SOAPCALL.xml

@@ -248,6 +248,16 @@
           </row>
 
           <row>
+            <entry><emphasis role="bold">RESPONSE
+            </emphasis>(<emphasis>NOTRIM</emphasis>) <indexterm>
+                <primary>NOTRIM</primary>
+              </indexterm></entry>
+
+            <entry>Sets flag to prevent space stripping on the
+            response.</entry>
+          </row>
+
+          <row>
             <entry><emphasis role="bold">NAMESPACE<indexterm>
                 <primary>NAMESPACE</primary>
               </indexterm> </emphasis>(<emphasis>namespace</emphasis>)</entry>
@@ -275,6 +285,42 @@
             containing a URN or URL that is required by the web
             <emphasis>service</emphasis> for proper interoperability.</entry>
           </row>
+
+          <row>
+            <entry><emphasis role="bold">LOG<indexterm>
+                <primary>LOG</primary>
+              </indexterm></emphasis></entry>
+
+            <entry>If specified, writes details to the log file of the engine
+            (hThor, Thor, or Roxie) to which the SOAPCALL is
+            submitted.</entry>
+          </row>
+
+          <row>
+            <entry><emphasis role="bold">LOG
+            </emphasis>(<emphasis>MIN</emphasis>)</entry>
+
+            <entry>Specifies to write minimal details of the SOAPCALL to a log
+            file.</entry>
+          </row>
+
+          <row>
+            <entry><emphasis role="bold">LOG
+            </emphasis>(<emphasis>expression</emphasis>)</entry>
+
+            <entry>Specifies to add the expression to the log when performing
+            a SOAPCALL.</entry>
+          </row>
+
+          <row>
+            <entry><emphasis role="bold">ENCODING</emphasis><indexterm>
+                <primary>ENCODING</primary>
+              </indexterm></entry>
+
+            <entry>Specifies that the Web service being called requires a
+            different message format, where type information is embedded in
+            the XML.</entry>
+          </row>
         </tbody>
       </tgroup>
     </informaltable></para>

+ 9 - 2
docs/ECLLanguageReference/ECLR_mods/ResrvdKywds-IMPORT.xml

@@ -33,7 +33,8 @@
 
           <entry>A comma-delimited list of folder or file names in the
           repository. The dollar sign ($) makes all definitions in the current
-          folder available.</entry>
+          folder available. The caret symbol (^) can be used as shorthand for
+          the container of the current folder.</entry>
         </row>
 
         <row>
@@ -103,11 +104,17 @@ IMPORT $, Std;                          //makes the standard library functions a
 
 IMPORT MyModule;                        //makes available the definitions from MyModule folder
 
+IMPORT $.^.MyOtherModule                //makes available the definitions from MyOtherModule folder,
+                                        //which is located in the same container as the current folder
+
+IMPORT $.^.^.SomeOtherModule            //makes available the definitions from SomeOtherModule folder,
+                                        //which is located in the grandparent folder of current folder
+
 IMPORT SomeFolder.SomeFile;             //make the specific file available
 
 IMPORT SomeReallyLongFolderName AS SN;  //alias the long name as "SN"
 
-IMPORT Def1,Def2 FROM Fred;             //makes Def1 and Def2 from Fred available, unqualified
+IMPORT Def1,Def2 FROM Fred;             //makes Def1 and Def2 from Fred folder available, unqualified
 
 IMPORT * FROM Fred;                     //makes everything from Fred available, unqualified
 

+ 49 - 0
docs/ECLLanguageReference/ECLR_mods/Templ-OPTION.xml

@@ -412,6 +412,55 @@
               programmer as suggestions for the use of the INDEPENDENT
               Workflow Service.</entry>
             </row>
+
+            <row>
+              <entry><emphasis>defaultSkewError</emphasis></entry>
+
+              <entry>Default: none</entry>
+
+              <entry>A value between 0.0 and 1.0 that determines the amount of
+              skew needed to generate a skew error. This value is ignored if
+              the ECL has provided a SKEW attribute.</entry>
+            </row>
+
+            <row>
+              <entry><emphasis>defaultSkewWarning</emphasis></entry>
+
+              <entry>Default: none</entry>
+
+              <entry>A value between 0.0 and 1.0 that determines the amount of
+              skew needed to generate a skew warning. If set higher than
+              defaultSkewError, then the value is ignored.</entry>
+            </row>
+
+            <row>
+              <entry><emphasis>overrideSkewError</emphasis></entry>
+
+              <entry>Default: none</entry>
+
+              <entry>If set to a value between 0.0 and 1.0, it overrides any
+              ECL SKEW(nn) attribute values in the current job.</entry>
+            </row>
+
+            <row>
+              <entry><emphasis>defaultSkewThreshold</emphasis></entry>
+
+              <entry>Default: 1GB</entry>
+
+              <entry>The size of the dataset (in bytes) local to a single node
+              needed before Skew errors/warnings are generated if no
+              THRESHOLD(nn) was supplied in ECL.</entry>
+            </row>
+
+            <row>
+              <entry><emphasis>overrideSkewThreshold</emphasis></entry>
+
+              <entry>Default: none</entry>
+
+              <entry>The size of the dataset (in bytes) local to a single node
+              needed before Skew errors/warnings are generated. Overrides any
+              ECL THRESHOLD(nn) attribute values in the current job.</entry>
+            </row>
           </tbody>
         </tgroup>
       </informaltable></para>

+ 1 - 1
docs/ECLStandardLibraryReference/SLR-Mods/SprayVariable.xml

@@ -106,7 +106,7 @@
           <entry><emphasis>srcCSVquote</emphasis></entry>
 
           <entry>Optional. A null-terminated string containing the CSV quoted
-          field delimiter. If omitted, the default is '\''</entry>
+          field delimiter. If omitted, the default is '\"'</entry>
         </row>
 
         <row>

+ 10 - 7
docs/HPCCCertify/Cert-Mods/CertPreflight.xml

@@ -8,7 +8,7 @@
   configured properly is to run a preflight check on the components. This
   ensures that all machines are operating and have the proper executables
   running. This also confirms there is adequate disk space, available memory,
-  and acceptable available CPU % values.</para>
+  and acceptable available CPU % values. </para>
 
   <itemizedlist mark="bullet">
     <listitem>
@@ -50,8 +50,9 @@
       <listitem>
         <?dbfo keep-together="always"?>
 
-        <para>Click on the <emphasis role="bold">System Servers</emphasis>
-        link under Topology.</para>
+        <para>Click on the <emphasis role="bold">Operations</emphasis> icon
+        then click on the <emphasis role="bold">System Servers</emphasis>
+        link. </para>
 
         <para><figure>
             <title>System Servers link</title>
@@ -143,8 +144,9 @@
 
     <orderedlist>
       <listitem>
-        <para>Click on the <emphasis role="bold">Cluster Processes</emphasis>
-        link under Topology.</para>
+        <para>Click on the <emphasis role="bold">Operations</emphasis> icon
+        then click on the <emphasis role="bold">Cluster Processes</emphasis>
+        link.</para>
 
         <para><figure>
             <title>Cluster Processes Link</title>
@@ -258,8 +260,9 @@
 
     <orderedlist>
       <listitem>
-        <para>Click on the <emphasis role="bold">Cluster Processes</emphasis>
-        link under Topology.</para>
+        <para>Click on the <emphasis role="bold">Operations</emphasis> icon
+        then click on the <emphasis role="bold">Cluster Processes</emphasis>
+        link.</para>
 
         <para><figure>
             <title>Cluster Processes Link</title>

+ 18 - 0
docs/HPCCSystemAdmin/CMakeLists.txt

@@ -0,0 +1,18 @@
+################################################################################
+#    HPCC SYSTEMS software Copyright (C) 2012 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.
+################################################################################
+
+DOCBOOK_TO_PDF( ${FO_XSL} HPCCSystemAdministratorsGuide.xml "HPCCSystemAdministratorsGuide" "SA-Mods")
+

File diff suppressed because it is too large
+ 1465 - 0
docs/HPCCSystemAdmin/HPCCSystemAdministratorsGuide.xml


+ 373 - 0
docs/HPCCSystemAdmin/SA-Mods/SysAdminConfigMod.xml

@@ -0,0 +1,373 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+<book xml:base="../">
+  
+  <chapter id="Usin-HPCC-ConfigMgr">
+    <title>Using Configuration Manager</title>
+
+    <para id="cfgmgr_introP0">Configuration Manager is the utility with which
+    we configure the HPCC platform. The HPCC platform's configuration is
+    stored in an XML file named <emphasis
+    role="bold">environment.xml</emphasis>. Once you generate an environment
+    (xml) file, it gets saved into a source directory (default is <emphasis
+    role="bold">/etc/HPCCSystems/source</emphasis>). You then need to stop the
+    system to copy it into the active HPCC directory, then distribute it into
+    place on to each node and restart the HPCC system. At no time during
+    configuration do you work on the live environment file.</para>
+
+    <para id="cfgmgr_introP1">When you install the HPCC system package, a
+    default single-node environment.xml file is generated. After that, you can
+    use the Configuration Manager to modify it and/or create a different
+    environment file to configure components, or add nodes. There is a
+    Configuration Manager wizard to help create an environment file. Give any
+    environment file you create a descriptive name that would indicate what it
+    is for in the source. For example, you might create an environment without
+    a Roxie, you could call that file
+    <emphasis>environmentNoRoxie.xml</emphasis>.</para>
+
+    <para id="cfgmgr_p1b">You would then copy the new configuration file you
+    generate from the source directory to the <emphasis
+    role="bold">/etc/HPCCSystems</emphasis> directory. Rename the file to
+    environment.xml, and restart the system in order to reconfigure your
+    system.</para>
+
+    <para id="cfgmgr_introP2">Configuration Manager also offers an <emphasis
+    role="bold">Advanced View</emphasis> which allows more granularity for you
+    to add instances of components or change the default settings of
+    components for more advanced users. Even if you plan to use the Advanced
+    View, it is a good idea to start with a wizard generated configuration
+    file and use Advanced View to edit it.</para>
+
+    <para id="cfgmgr_introP3">More information and specific details for each
+    Configuration Manager component and attributes of those components is
+    detailed in <emphasis>Using Configuration Manager</emphasis>.</para>
+
+    <para>The following sections will provide the details for configuring an
+    HPCC environment using the Configuration Manager.</para>
+
+    <sect1 id="configuring-a-multi-node-system">
+      <title>Running the Configuration Manager</title>
+
+      <para>This section will guide you through configuring an HPCC
+      environment using the Configuration Manager.</para>
+
+      <para>The HPCC package should already be installed on ALL nodes.</para>
+
+      <para>You can use any tool or shell script you choose.</para>
+
+      <orderedlist>
+        <listitem>
+          <para>SSH to a node in your environment and login as a user with
+          sudo privileges. We would suggest that it would be the first node,
+          and that it is a support node, however that is up to your
+          discretion.</para>
+        </listitem>
+
+        <listitem>
+          <para>Start the Configuration Manager service on the node (again we
+          would suggest that it should be on a support node, and further that
+          you use the same node to start the Configuration Manager every time,
+          but this is also entirely up to you).</para>
+
+          <programlisting>sudo /opt/HPCCSystems/sbin/configmgr</programlisting>
+
+          <para><graphic
+          fileref="../../images/gs_img_configmgrStart.jpg" /></para>
+        </listitem>
+
+        <listitem>
+          <para>Using a Web browser, go to the Configuration Manager's
+          interface:</para>
+
+          <programlisting>http://&lt;<emphasis>ip of installed system</emphasis>&gt;:8015</programlisting>
+
+          <para>The Configuration Manager startup wizard displays.</para>
+        </listitem>
+      </orderedlist>
+
+      <para>There are different ways to configure your HPCC system. You can
+      use the <emphasis role="bold">Generate environment wizard</emphasis> and
+      use that environment or experienced users can then use the <emphasis
+      role="bold">Advanced View</emphasis> for more specific customization.
+      There is also the option of using <emphasis role="bold">Create blank
+      environment</emphasis> to generate an empty environment that you could
+      then go in and add only the components you would want.</para>
+
+      <sect2 id="Env_Wizard">
+        <title>Environment Wizard</title>
+
+        <orderedlist>
+          <listitem>
+            <?dbfo keep-together="always"?>
+
+            <para>To use the wizard select the <emphasis role="bold">Generate
+            new environment using wizard</emphasis> button.</para>
+
+            <para><graphic fileref="../../images/GS_ConfigMgrWizStart.jpg"
+            vendor="configmgrSS" /></para>
+          </listitem>
+
+          <listitem>
+            <para>Provide a name for the environment file.</para>
+
+            <para>This will then be the name of the configuration XML file.
+            For example, we will name our environment
+            <emphasis>NewEnvironment</emphasis> and this will produce a
+            configuration XML file named
+            <emphasis>NewEnvironment.xml</emphasis> that we will
+            use.<emphasis> </emphasis></para>
+          </listitem>
+
+          <listitem>
+            <para>Press the Next button.</para>
+
+            <para>Next you will need to define the IP addresses that your HPCC
+            system will be using.</para>
+          </listitem>
+
+          <listitem>
+            <?dbfo keep-together="always"?>
+
+            <para>Enter the IP addresses.</para>
+
+            <para>IP Addresses can be specified individually using semi-colon
+            delimiters. You can also specify a range of IPs using a hyphen
+            (for example, nnn.nnn.nnn.x-y). In the image below, we specified
+            the IP addresses 10.239.219.1 through 10.239.219.100 using the
+            range syntax, and also a single IP 10.239.219.111.</para>
+
+            <para><graphic fileref="../../images/GS_ConfigMgrWiz002.jpg"
+            vendor="configmgrSS" /></para>
+          </listitem>
+
+          <listitem>
+            <para>Press the Next button.</para>
+
+            <para>Now you will define how many nodes to use for the Roxie and
+            Thor clusters.</para>
+          </listitem>
+
+          <listitem>
+            <?dbfo keep-together="always"?>
+
+            <para>Enter the appropriate values as indicated.</para>
+
+            <para><graphic fileref="../../images/GS_CMWiz003.jpg"
+            vendor="configmgrSS" /></para>
+
+            <variablelist>
+              <varlistentry>
+                <term>Number of support nodes:</term>
+
+                <listitem>
+                  <para>Specify the number of nodes to use for support
+                  components. The default is 1.</para>
+                </listitem>
+              </varlistentry>
+
+              <varlistentry>
+                <term>Number of nodes for Roxie cluster:</term>
+
+                <listitem>
+                  <para>Specify the number of nodes to use for your Roxie
+                  cluster. Enter zero (0) if you do not want a Roxie
+                  cluster.</para>
+                </listitem>
+              </varlistentry>
+
+              <varlistentry>
+                <term>Number of slave nodes for Thor cluster</term>
+
+                <listitem>
+                  <para>Specify the number of slave nodes to use in your Thor
+                  cluster. A Thor master node will be added automatically.
+                  Enter zero (0) if you do not want any Thor slaves.</para>
+                </listitem>
+              </varlistentry>
+
+              <varlistentry>
+                <term>Number of Thor slaves per node (default 1)</term>
+
+                <listitem>
+                  <para>Specify the number of Thor slave processes to
+                  instantiate on each slave node. Enter zero (0) if you do not
+                  want a Thor cluster.</para>
+                </listitem>
+              </varlistentry>
+
+              <varlistentry>
+                <term>Enable Roxie on demand</term>
+
+                <listitem>
+                  <para>Specify whether or not to allow queries to be run
+                  immediately on Roxie. This must be enabled to run the
+                  debugger. (Default is true)</para>
+                </listitem>
+              </varlistentry>
+            </variablelist>
+          </listitem>
+
+          <listitem>
+            <para>Press the <emphasis role="bold">Next</emphasis>
+            button</para>
+
+            <para>The wizard displays the configuration parameters.</para>
+          </listitem>
+
+          <listitem>
+            <?dbfo keep-together="always"?>
+
+            <para>Press the <emphasis role="bold">Finish</emphasis> button to
+            accept these values or press the <emphasis role="bold">Advanced
+            View</emphasis> button to edit in advanced mode.</para>
+
+            <graphic fileref="../../images/GS_ConfigMgrWiz004.jpg" />
+          </listitem>
+        </orderedlist>
+
+        <para>You will now be notified that you have completed the
+        wizard.</para>
+
+        <para><graphic fileref="../../images/GS_ConfigMgrWiz005.jpg" /></para>
+
+        <para>At this point, you have created a file named NewEnvironment.xml
+        in the <emphasis role="bold">/etc/HPCCSystems/source</emphasis>
+        directory</para>
+
+        <informaltable colsep="1" frame="all" rowsep="1">
+          <?dbfo keep-together="always"?>
+
+          <tgroup cols="2">
+            <colspec colwidth="49.50pt" />
+
+            <colspec />
+
+            <tbody>
+              <row>
+                <entry><inlinegraphic
+                fileref="../../images/OSSgr3.png" /></entry>
+
+                <entry>Keep in mind, that your HPCC configuration may be
+                different depending on your needs. For example, you may not
+                need a Roxie or you may need several smaller Roxie clusters.
+                In addition, in a production [Thor] system, you would ensure
+                that Thor and Roxie nodes are dedicated and have no other
+                processes running on them. This document is intended to show
+                you how to use the configuration tools. Capacity planning and
+                system design is covered in a training module.</entry>
+              </row>
+            </tbody>
+          </tgroup>
+        </informaltable>
+
+        <sect3 id="Distrib_Conf" role="brk">
+          <title>Distribute the Configuration</title>
+
+          <orderedlist>
+            <listitem>
+              <?dbfo keep-together="always"?>
+
+              <para>Stop the HPCC system.</para>
+
+              <para>If it is running stop the HPCC system (on every node),
+              using a command such as this:</para>
+
+              <para><programlisting>sudo /sbin/service hpcc-init stop</programlisting></para>
+
+              <variablelist>
+                <varlistentry>
+                  <term>Note:</term>
+
+                  <listitem>
+                    <para>You may have a multi-node system and a custom script
+                    such as the one illustrated in Appendix of the <emphasis
+                    role="bluebold">Installing and Running the HPCC
+                    Platform</emphasis> document to start and stop your
+                    system. If that is the case please use the appropriate
+                    command for stopping your system on every node.</para>
+                  </listitem>
+                </varlistentry>
+              </variablelist>
+
+              <para><informaltable colsep="1" frame="all" rowsep="1">
+                  <tgroup cols="2">
+                    <colspec colwidth="49.50pt" />
+
+                    <colspec />
+
+                    <tbody>
+                      <row>
+                        <entry><inlinegraphic
+                        fileref="../../images/caution.png" /></entry>
+
+                        <entry>Be sure HPCC is stopped before attempting to
+                        copy the environment.xml file.</entry>
+                      </row>
+                    </tbody>
+                  </tgroup>
+                </informaltable></para>
+            </listitem>
+
+            <listitem>
+              <para>Back up the original environment.xml file.</para>
+
+              <programlisting># For example
+sudo -u hpcc cp /etc/HPCCSystems/environment.xml /etc/HPCCSystems/source/environment-date.xml </programlisting>
+
+              <variablelist>
+                <varlistentry>
+                  <term>Note:</term>
+
+                  <listitem>
+                    <para>The live environment.xml file is located in your
+                    <emphasis role="bold">/etc/HPCCSystems/</emphasis>
+                    directory. Configuration Manager works on files in
+                    <emphasis role="bold">/etc/HPCCSystems/source</emphasis>
+                    directory. You must copy from this location to make an
+                    environment.xml file active.</para>
+                  </listitem>
+                </varlistentry>
+              </variablelist>
+
+              <para>You can also choose to give the environment file a more
+              descriptive name, to help differentiate any differences.</para>
+
+              <para>Having environment files under source control is a good
+              way to archive your environment settings.</para>
+            </listitem>
+
+            <listitem>
+              <para>Copy the new .xml file from the source directory to the
+              /etc/HPCCSystems and rename the file to
+              <emphasis>environment.xml</emphasis></para>
+
+              <programlisting># for example
+sudo -u hpcc cp /etc/HPCCSystems/source/NewEnvironment.xml /etc/HPCCSystems/environment.xml</programlisting>
+
+              <para></para>
+            </listitem>
+
+            <listitem>
+              <para>Copy the <emphasis
+              role="bold">/etc/HPCCSystems/environment.xml</emphasis> to the
+              <emphasis role="bold">/etc/HPCCSystems/</emphasis> on to
+              <emphasis>every</emphasis> node.</para>
+
+              <para>You may want to use a script to push out the XML file to
+              all nodes. See the <emphasis>Example Scripts</emphasis> section
+              in the Appendix of the <emphasis role="bluebold">Installing and
+              Running the HPCC Platform</emphasis> document. You can use the
+              scripts as a model to create your own script to copy the
+              environment.xml file out to all your nodes.</para>
+            </listitem>
+
+            <listitem>
+              <para>Restart the HPCC platform on all nodes.</para>
+            </listitem>
+          </orderedlist>
+        </sect3>
+      </sect2>
+    </sect1>
+  </chapter>
+</book>

BIN
docs/images/CS-1912.jpg


BIN
docs/images/CS-sysfail.jpg


BIN
docs/images/CSimg01.jpg


BIN
docs/images/CSimg02.jpg


BIN
docs/images/CSimg03.jpg


BIN
docs/images/CSimg04.jpg


BIN
docs/images/CSimg05.jpg


BIN
docs/images/CSimg06.jpg


BIN
docs/images/CSimg07.jpg


BIN
docs/images/CSimg08.jpg


BIN
docs/images/CSimg09.jpg


BIN
docs/images/SA002.jpg


BIN
docs/images/SA003.jpg


BIN
docs/images/SA004.jpg


BIN
docs/images/SA005.jpg


BIN
docs/images/SA006.jpg


BIN
docs/images/SA008.jpg


+ 7 - 2
ecl/hql/hqlparse.cpp

@@ -2000,7 +2000,12 @@ IXmlScope *HqlLex::ensureTopXmlScope(const YYSTYPE & errpos)
 {
     IXmlScope *top = queryTopXmlScope();
     if (!top)
-        top = xmlScope = ::loadXML("<xml></xml>");
+    {
+    	reportError(errpos, ERR_XML_NOSCOPE, "No XML scope active");
+
+    	// recovery: create a default XML scope
+    	top = xmlScope = ::loadXML("<xml></xml>");
+    }
 
     return top;
 }
@@ -2057,7 +2062,7 @@ void HqlLex::loadXML(const YYSTYPE & errpos, const char *name, const char * chil
         return;
     }
 
-    if (inmacro)
+    if (false && inmacro)
     {
         inmacro->loadXML(errpos, name);
         return;

+ 2 - 2
ecl/hthor/hthor.cpp

@@ -7831,9 +7831,9 @@ void CHThorDiskReadBaseActivity::resolve()
         if (!ldFile)
         {
             StringBuffer buff;
-            buff.append("Skipping OPT disk read of nonexistent file ").append(mangledHelperFileName.str());
+            buff.appendf("Input file '%s' was missing but declared optional", mangledHelperFileName.str());
             WARNLOG("%s", buff.str());
-            agent.addWuException(buff.str(), 0, ExceptionSeverityWarning, "hthor");
+            agent.addWuException(buff.str(), 0, ExceptionSeverityInformation, "hthor");
         }
     }
 }

+ 1 - 1
ecl/regress/demangle.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+LOADXML('<xml/>');
 
 #DECLARE (mstg)
 #DECLARE (dmstg)

+ 1 - 1
ecl/regress/err2201.ecl

@@ -15,6 +15,6 @@
     limitations under the License.
 ############################################################################## */
 
-
+LOADXML('<xml>dummy</xml>');
 
 #IF(

+ 1 - 1
ecl/regress/err2203.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+LOADXML('<xml></xml>');
 
 #SET(s, 'abc')
 

+ 1 - 1
ecl/regress/err2204.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+LOADXML('<xml></xml>');
 
 #FOR(i)
 

+ 1 - 1
ecl/regress/err2205.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+LOADXML('<xml>dummy</xml>');
 
 #ELSE
   #DECLARE(s)

+ 1 - 1
ecl/regress/err2206.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+LOADXML('<xml>dummy</xml>');
 
 #IF(true)
   #DECLARE(s)

+ 1 - 1
ecl/regress/err2208.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+LOADXML('<xml>dummy</xml>');
 
 #IF (true)
   #BREAK

+ 1 - 1
ecl/regress/err2209.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+LOADXML('<xml>dummy</xml>');
 
 #LOOP
 #END

+ 1 - 1
ecl/regress/err2210.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+LOADXML('<xml></xml>');
 
 #LOOP
   #IF (false)

+ 1 - 1
ecl/regress/errextrabreak.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+LOADXML('<xml>dummy</xml>');
 
 #BREAK
 

+ 1 - 1
ecl/regress/errextraelse.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+LOADXML('<xml>dummy</xml>');
 
 #DECLARE(s)
 

+ 1 - 1
ecl/regress/errextraend.ecl

@@ -16,7 +16,7 @@
 ############################################################################## */
 
 
-
+LOADXML('<xml>dummy</xml>');
 
 #DECLARE(s)
 

+ 1 - 1
ecl/regress/errisvalid.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+loadxml('<xml></xml>');
 
 #DECLARE (flag)
 

+ 1 - 1
ecl/regress/errloop2.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+loadxml('<xml></xml>');
 
 #DECLARE (s)
 

+ 1 - 1
ecl/regress/errloop3.ecl

@@ -16,7 +16,7 @@
 ############################################################################## */
 
 /* should detect */
-
+loadxml('<xml></xml>');
 #LOOP
   #LOOP
     #BREAK

+ 1 - 1
ecl/regress/errloop4.ecl

@@ -16,7 +16,7 @@
 ############################################################################## */
 
 /* should detect */
-
+loadxml('<xml></xml>');
 #LOOP
   #DECLARE(s)
    #LOOP

+ 1 - 1
ecl/regress/errloop5.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+loadxml('<xml></xml>');
 #LOOP
   #LOOP
     #BREAK

+ 1 - 1
ecl/regress/errloop6.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+loadxml('<xml></xml>');
 #LOOP
   #LOOP
 //  #BREAK

+ 1 - 1
ecl/regress/errloop7.ecl

@@ -16,6 +16,6 @@
 ############################################################################## */
 
 
-
+loadxml('<xml></xml>');
 #LOOP
 #END

+ 1 - 1
ecl/regress/errloop8.ecl

@@ -16,7 +16,7 @@
 ############################################################################## */
 
 /* Can not detect by just counting the #BREAK */
-
+loadxml('<xml></xml>');
 #LOOP
   #IF (false)
     #BREAK

+ 1 - 1
ecl/regress/errmissingend.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+LOADXML('<xml>dummy</xml>');
 
 #DECLARE(s)
 

+ 1 - 1
ecl/regress/errmissingend1.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+LOADXML('<xml>dummy</xml>');
 
 #DECLARE(s)
 

+ 1 - 1
ecl/regress/errmissingend2.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+LOADXML('<xml>dummy</xml>');
 
 #DECLARE(s)
 

+ 1 - 1
ecl/regress/errmissingend3.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+LOADXML('<xml>dummy</xml>');
 
 #DECLARE(s)
 

+ 1 - 1
ecl/regress/errmissingend4.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+LOADXML('<xml>dummy</xml>');
 
 #DECLARE(s)
 

+ 1 - 1
ecl/regress/errnestedhashif.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+LOADXML('<xml>dummy</xml>');
 
 #DECLARE(s,result)
 

+ 1 - 1
ecl/regress/export2.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+LOADXML('<xml/>');
 
 NamesRecord := record
 string10 first;

+ 1 - 1
ecl/regress/export3.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+LOADXML('<xml/>');
 
 NamesRecord := record
 string10 first;

+ 1 - 1
ecl/regress/export4.ecl

@@ -2,7 +2,7 @@ decimalRec := RECORD
 DECIMAL3 A;
 DECIMAL3_1 B;
 END;
- //"dummy" just to open an XML scope
+LOADXML('<xml/>'); //"dummy" just to open an XML scope
 #DECLARE(out);
 #EXPORT(out, decimalRec);
 OUTPUT(%'out'%);

+ 1 - 1
ecl/regress/gch2.ecl

@@ -17,7 +17,7 @@
 
 export CleanFields(inputFile,outputFile) := macro
 
-
+LOADXML('<xml/>');
 
 #EXPORTXML(doCleanFieldMetaInfo, recordof(inputFile))
 

+ 1 - 1
ecl/regress/hashelseif2.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+LOADXML('<xml/>');
 
 
 value := 1;

+ 1 - 1
ecl/regress/mangle.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+LOADXML('<xml/>');
 
 #declare(s1,s2)
 

+ 1 - 1
ecl/regress/memleak9.ecl

@@ -17,7 +17,7 @@
 
 import jfgao;
 
-
+LOADXML('<xml></xml>');
 #DECLARE(s1)
 #SET(s1, 'TMPT call external func: ' + jfgao.MyStringLib.TestExternalFunc(3))
 %'s1'%;

+ 1 - 1
ecl/regress/mluber36.ecl

@@ -26,7 +26,7 @@ OUTPUT('<<'+%'did'%+'>>');
 
 endmacro;
 
-
+loadxml('<xml/>');
 did('<root><did>81093191</did></root>');
 
 

+ 1 - 1
ecl/regress/mluber63.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+loadxml('<xml/>');
 
 string zz := '' : stored('zz');
 

+ 1 - 1
ecl/regress/mluber66.ecl

@@ -17,7 +17,7 @@
 
 export CleanFields(inputFile,outputFile) := macro
 
-
+loadxml('<xml/>');
 
 #EXPORTXML(doCleanFieldMetaInfo, recordof(inputFile))
 

+ 1 - 1
ecl/regress/round.ecl

@@ -14,7 +14,7 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 ############################################################################## */
-
+LOADXML('<xml/>');
 
 show(value) := macro
     output((string) value + ' =\n');

+ 1 - 1
ecl/regress/round2.ecl

@@ -14,7 +14,7 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 ############################################################################## */
-
+LOADXML('<xml/>');
 
 show(value) := macro
     output((string) value + ' =\n');

+ 1 - 1
ecl/regress/rtaylor22.ecl

@@ -15,7 +15,7 @@
     limitations under the License.
 ############################################################################## */
 
-
+LOADXML('<xml/>');
 
 NamesRecord := record
 string10 first;

+ 1 - 1
ecl/regress/textsearch.ecl

@@ -504,7 +504,7 @@ DG_MemFile := DATASET(DG_MemFileName,DG_MemFileRec,FLAT);
 
 INCLUDE_DEBUG_INFO := false;
 
-
+LOADXML('<xml/>');
 #option ('checkAsserts',false);
 import lib_stringLib;
 

+ 1 - 1
ecl/regress/tmptcall1.ecl

@@ -19,7 +19,7 @@
 // Test calling stuff from template command
 // Everything in default module works
 
-
+LOADXML('<xml></xml>');
 
 export YorN(boolean flag) := MAP(flag = true => 'Y', 'N');
 EXPORT testmacro(x) := MACRO

+ 1 - 1
ecl/regress/tmptcall2.ecl

@@ -21,7 +21,7 @@
 
 import jfgao;
 
-
+LOADXML('<xml></xml>');
 
 s1 := 'ECL call external func: ' + jfgao.MyStringLib.TestExternalFunc(3);
 s2 := 'ECL call ECL func: ' + jfgao.myfunc(3);

+ 1 - 1
ecl/regress/tmptcall3.ecl

@@ -56,7 +56,7 @@ s1x;
 s2x;
 s3x;
 
-
+LOADXML('<xml></xml>');
 
 #DECLARE(s1,s2,s3,s1x,s2x,s3x)
 

+ 1 - 1
ecl/regress/tmptcall4.ecl

@@ -39,7 +39,7 @@ s1;
 s2;
 s3;
 
-
+LOADXML('<xml>dummy</xml>');
 
 #DECLARE(s1,s2,s3,s1x,s2x,s3x)
 

+ 2 - 12
esp/build.sh

@@ -14,12 +14,6 @@ TOOLSDIR="$SRCDIR/util/buildscripts"
 # Destination directory for built code
 DISTDIR=$1
 
-# Module ID of the main application package loader configuration
-LOADERMID="eclwatch/run"
-
-# Main application package loader configuration
-LOADERCONF="$SRCDIR/$LOADERMID.js"
-
 # Main application package build configuration
 PROFILE="$BASEDIR/profiles/eclwatch.profile.js"
 
@@ -43,16 +37,14 @@ cp -r "$SRCDIR/CodeMirror2" "$DISTDIR/CodeMirror2"
 cat "$SRCDIR/stub.htm" | tr '\n' ' ' | \
 perl -pe "
   s/<\!--.*?-->//g;                          # Strip comments
-#  s/isDebug: *1/deps:['$LOADERMID']/;        # Remove isDebug, add deps
-#  s/<script src=\"$LOADERMID.*?\/script>//;  # Remove script eclwatch/run
   s/\s+/ /g;                                 # Collapse white-space" > "$DISTDIR/stub.htm"
 
 cd "$TOOLSDIR"
 
 if which node >/dev/null; then
-    node ../../dojo/dojo.js load=build --require "$LOADERCONF" --profile "$PROFILE" --releaseDir "$DISTDIR" ${*:2}
+    node ../../dojo/dojo.js load=build --require "$PROFILE" --releaseDir "$DISTDIR" ${*:2}
 elif which java >/dev/null; then
-    java -Xms256m -Xmx256m  -cp ../shrinksafe/js.jar:../closureCompiler/compiler.jar:../shrinksafe/shrinksafe.jar org.mozilla.javascript.tools.shell.Main  ../../dojo/dojo.js baseUrl=../../dojo load=build --require "$LOADERCONF" --profile "$PROFILE" --releaseDir "$DISTDIR" ${*:2}
+    java -Xms256m -Xmx256m  -cp ../shrinksafe/js.jar:../closureCompiler/compiler.jar:../shrinksafe/shrinksafe.jar org.mozilla.javascript.tools.shell.Main  ../../dojo/dojo.js baseUrl=../../dojo load=build --profile "$PROFILE" --releaseDir "$DISTDIR" ${*:2}
 else
     echo "Need node.js or Java to build!"
     exit 1
@@ -62,8 +54,6 @@ echo "Build complete"
 
 cd "$BASEDIR"
 
-LOADERMID=${LOADERMID//\//\\\/}
-
 for dojodir in dojo dojox dijit
 do
   for f in  $(find ${DISTDIR}/${dojo_dir} -type f -perm /a+x ! -name "*.sh" \

+ 150 - 150
esp/eclwatch/ws_XSLT/nls/bs/hpcc.xml

@@ -1,162 +1,162 @@
-<hpcc>
+<hpcc>
 <strings>
-<st id='Action'>Action</st>
-<st id='Available'>Available</st>
-<st id='AdditionalProcessesToFilter'>Additional processes to filter</st>
-<st id='AutoRefreshEvery'>Auto Refresh every</st>
-<st id='AutoUpdateMetricsWhenViewColumnsChanging'>Auto update metrics when View Columns changing.</st>
-<st id='AvailableNodes'>Available Nodes</st>
-<st id='BrowserTimedOut'>Browser timed out due to a long time delay.</st>
-<st id='Busy'>Busy</st>
+<st id='Action'>Akcija</st>
+<st id='Available'>Dostupni</st>
+<st id='AdditionalProcessesToFilter'>Dodatni procesi za filtriranje</st>
+<st id='AutoRefreshEvery'>Automatski osvježite svakih</st>
+<st id='AutoUpdateMetricsWhenViewColumnsChanging'>Automatski ažurirajte mjere kada se fokus kolone mjenja.</st>
+<st id='AvailableNodes'>Dostupni Čvorovi (Nodes)</st>
+<st id='BrowserTimedOut'>Brauser vrijeme je isteklo zbog dugog vremenskog kašnjenja.</st>
+<st id='Busy'>Zauzet</st>
 <st id='Bytes'>bytes</st>
-<st id='Cancel'>Cancel</st>
-<st id='Cluster'>Cluster</st>
-<st id='ClusterProcess'>Cluster Process</st>
-<st id='Clusters'>Clusters</st>
-<st id='ClusterTopology'>Cluster Topology</st>
-<st id='Component'>Component</st>
-<st id='Computer'>Computer</st>
-<st id='ComputerUpTime'>Computer Up Time</st>
-<st id='Condition'>Condition</st>
-<st id='Configuration'>Configuration</st>
-<st id='ConfigurationFile'>Configuration file</st>
-<st id='ConfirmSwap'>Are you sure you want to swap two machines under</st>
-<st id='CPULoad'>CPU Load</st>
-<st id='Critical'>Critical</st>
+<st id='Cancel'>Poništite</st>
+<st id='Cluster'>Klaster</st>
+<st id='ClusterProcess'>Klaster Proces</st>
+<st id='Clusters'>Klasteri</st>
+<st id='ClusterTopology'>Klaster Topologija</st>
+<st id='Component'>Komponenta</st>
+<st id='Computer'>Kompjuter</st>
+<st id='ComputerUpTime'>Vrijeme Aktivnosti Kompjutera</st>
+<st id='Condition'>Stanje</st>
+<st id='Configuration'>Konfiguracija</st>
+<st id='ConfigurationFile'>Konfiguraciona Datoteka</st>
+<st id='ConfirmSwap'>Jeste li sigurni da želite zamijeniti ove dvije mašine</st>
+<st id='CPULoad'>Opterećenje Procesora</st>
+<st id='Critical'>Kritičan</st>
 <st id='DaliServer'>Dali Server</st>
-<st id='DaliServers'>Dali Servers</st>
-<st id='Date'>Date</st>
-<st id='Description'>Description</st>
-<st id='DFUServers'>DFU Servers</st>
-<st id='Directory'>Directory</st>
-<st id='Domain'>Domain</st>
-<st id='Download'>Download</st>
-<st id='DropZone'>Drop Zone</st>
-<st id='DropZones'>Drop Zones</st>
-<st id='EarliestFirst'>EarliestFirst</st>
-<st id='ECLAgents'>ECL Agents</st>
-<st id='ECLAgentProcess'>ECL Agent Process</st>
-<st id='ECLCCServers'>ECL CC Servers</st>
-<st id='ECLSchedulers'>ECL Schedulers</st>
-<st id='ECLServers'>ECL Servers</st>
-<st id='ESPServers'>ESP Servers</st>
-<st id='FailedToRetrieveInformation'>Failed to retrieve information.  Please check configuration.</st>
-<st id='Fatal'>Fatal</st>
-<st id='Fetched'>Fetched</st>
-<st id='Files'>Files</st>
-<st id='FirstPage'>First page</st>
-<st id='FirstRowsNotDefined'>First Rows field not defined</st>
+<st id='DaliServers'>Dali Serveri</st>
+<st id='Date'>Datum</st>
+<st id='Description'>Opis</st>
+<st id='DFUServers'>DFU Serveri</st>
+<st id='Directory'>Direktorij</st>
+<st id='Domain'>Domen</st>
+<st id='Download'>Dobavite</st>
+<st id='DropZone'>Zona Prijema</st>
+<st id='DropZones'>Zone Prijema</st>
+<st id='EarliestFirst'>Najraniji Ide Prvi</st>
+<st id='ECLAgents'>ECL Izvršitelji</st>
+<st id='ECLAgentProcess'>ECL Izvršitelj Proces</st>
+<st id='ECLCCServers'>ECL Serveri za Kompiliranje</st>
+<st id='ECLSchedulers'>ECL Organizatori Posla</st>
+<st id='ECLServers'>ECL Serveri</st>
+<st id='ESPServers'>ESP Serveri</st>
+<st id='FailedToRetrieveInformation'>Nije uspjelo dohvatanje informacija. Molimo provjerite konfiguraciju.</st>
+<st id='Fatal'>Fatalan</st>
+<st id='Fetched'>Učitan</st>
+<st id='Files'>Datoteke</st>
+<st id='FirstPage'>Prva stranica</st>
+<st id='FirstRowsNotDefined'>Polja nisu definisana u prvom rekordu</st>
 <st id='Folder'>Folder</st>
-<st id='FTSlaves'>FT Slaves</st>
-<st id='GenesisServers'>Genesis Servers</st>
-<st id='GetProcessorInformation'>Get processor information</st>
-<st id='GetRoxieMetrics'>Get Roxie Metrics</st>
-<st id='GetSoftwareInformation'>Get software information</st>
-<st id='GetStorageInformation'>Get storage information</st>
-<st id='Home'>Home</st>
-<st id='Hours'>hours</st>
-<st id='Instance'>Instance</st>
-<st id='InvalidFirstRows'>Invalid data in First Rows field</st>
-<st id='InvalidLastHours'>Invalid data in Last Hours field</st>
-<st id='InvalidLastRows'>Invalid data in a Last Rows field</st>
-<st id='InvalidPageNumber'>Invalid data in page number field</st>
-<st id='InvalidTime'>Invalid data in a Time field</st>
-<st id='IPAddress'>IP Address</st>
-<st id='LastHoursNotDefined'>Last Hours field not defined</st>
-<st id='LastRowsNotDefined'>Last Rows field not defined</st>
-<st id='LatestFirst'>LatestFirst</st>
-<st id='LDAPServers'>LDAP Servers</st>
-<st id='LoadingPleaseWait'>Loading, please wait...</st>
-<st id='LocalFileSystemsOnly'>Local File Systems Only</st>
-<st id='Location'>Location</st>
-<st id='LogFile'>Log file</st>
-<st id='LogDirectory'>Log Directory</st>
-<st id='LostReferenceToParentWindow'>Lost reference to parent window.  Please traverse the path again!</st>
-<st id='MachineInfo'>Machine Information</st>
-<st id='Major'>Major</st>
-<st id='Mean'>Mean</st>
-<st id='Metrics'>Metrics</st>
-<st id='Minor'>Minor</st>
+<st id='FTSlaves'>FT Izvršivači</st>
+<st id='GenesisServers'>Genesis Serveri</st>
+<st id='GetProcessorInformation'>Dobavite Informacije o Procesoru</st>
+<st id='GetRoxieMetrics'>Dobavite Informacije o Roxie</st>
+<st id='GetSoftwareInformation'>Dobavite Informacije o softveru</st>
+<st id='GetStorageInformation'>Dobavite Informacije o prostoru</st>
+<st id='Home'>Polazište</st>
+<st id='Hours'>sati</st>
+<st id='Instance'>Primjer</st>
+<st id='InvalidFirstRows'>Pogrešni podaci u polju za prve redove</st>
+<st id='InvalidLastHours'>Pogrešni podaci u polju za poslijednje sate</st>
+<st id='InvalidLastRows'>Pogrešni podaci u polju za poslijednje redove</st>
+<st id='InvalidPageNumber'>Pogrešni podaci u polju za broj stranice</st>
+<st id='InvalidTime'>Pogrešni podaci u polju za Vrijeme</st>
+<st id='IPAddress'>IP Adresa</st>
+<st id='LastHoursNotDefined'>Polje za poslijednje sate nije definisano</st>
+<st id='LastRowsNotDefined'>Polje za poslijednje redove nije definisano</st>
+<st id='LatestFirst'>Najnoviji Ide Prvi</st>
+<st id='LDAPServers'>LDAP Serveri</st>
+<st id='LoadingPleaseWait'>Molimo sačekajte ...</st>
+<st id='LocalFileSystemsOnly'>Samo Lokalni Sistemi datoteka</st>
+<st id='Location'>Lokacija</st>
+<st id='LogFile'>Log datoteka</st>
+<st id='LogDirectory'>Log Direktorij</st>
+<st id='LostReferenceToParentWindow'>Izbubljna referenca na glavnu stranicu.  Molimo da ponovite put!</st>
+<st id='MachineInfo'>Informacija o Mašini</st>
+<st id='Major'>Glavni</st>
+<st id='Mean'>Srednji</st>
+<st id='Metrics'>Metrika</st>
+<st id='Minor'>Minoran</st>
 <st id='Mins'>mins</st>
-<st id='MySQLServers'>MySQL Servers</st>
+<st id='MySQLServers'>MySQL Serveri</st>
 <st id='NA'>N/A</st>
-<st id='Name'>Name</st>
-<st id='NetworkAddress'>Network Address</st>
-<st id='NextPage'>NextPage</st>
-<st id='NoClustersDefined'>No clusters defined.</st>
-<st id='Nodes'>Nodes</st>
-<st id='NoItems'>No items</st>
-<st id='NoMachinesSelected'>No machines selected!</st>
-<st id='Normal'>Normal</st>
-<st id='NoSystemServicesDefined'>No system services defined!</st>
-<st id='NoTargetClustersSelected'>No target clusters selected!</st>
-<st id='OrFirst'>or first</st>
-<st id='OrGoToPage'>or go to page</st>
-<st id='OrLast'>or last</st>
-<st id='OrLastPage'>or last page</st>
-<st id='OrTimeFrom'>or time from</st>
-<st id='Page'>page</st>
-<st id='PageNumberNotDefined'>page number field not defined</st>
-<st id='PhysicalMemory'>Physical Memory</st>
-<st id='Platform'>Platform</st>
+<st id='Name'>Ime</st>
+<st id='NetworkAddress'>Netvork Adresa</st>
+<st id='NextPage'>Slijedeća Stranica</st>
+<st id='NoClustersDefined'>Klasteri nisu definisani.</st>
+<st id='Nodes'>Čvorovi (Nodovi)</st>
+<st id='NoItems'>Nema ništa</st>
+<st id='NoMachinesSelected'>Mašine nisu odabrane!</st>
+<st id='Normal'>Normalan</st>
+<st id='NoSystemServicesDefined'>Sistem Servisi nisu definisani!</st>
+<st id='NoTargetClustersSelected'>Niste odabrali klaster za izvrsavanje!</st>
+<st id='OrFirst'>ili prvi</st>
+<st id='OrGoToPage'>ili idite na stranicu</st>
+<st id='OrLast'>ili zadnji</st>
+<st id='OrLastPage'>ili zadnja stranica</st>
+<st id='OrTimeFrom'>ili od vremena</st>
+<st id='Page'>strana</st>
+<st id='PageNumberNotDefined'>polje za broj stranice nije definisano</st>
+<st id='PhysicalMemory'>Fizička Memorija</st>
+<st id='Platform'>Platforma</st>
 <st id='Port'>Port</st>
-<st id='PrevPage'>PrevPage</st>
-<st id='Processes'>Processes</st>
-<st id='ProcessesDown'>Processes Down</st>
-<st id='Protocol'>Protocol</st>
-<st id='Queue'>Queue</st>
-<st id='Ready'>Ready</st>
-<st id='Recycling'>Recycling</st>
-<st id='Refresh'>Refresh</st>
-<st id='Rows'>rows</st>
+<st id='PrevPage'>Prethodna Stranica</st>
+<st id='Processes'>Procesi</st>
+<st id='ProcessesDown'>Procesi su Zaustavljni</st>
+<st id='Protocol'>Protokol</st>
+<st id='Queue'>Red</st>
+<st id='Ready'>Spreman</st>
+<st id='Recycling'>Recikliranje</st>
+<st id='Refresh'>Osvježite</st>
+<st id='Rows'>redovi</st>
 <st id='RoxieServer'>Roxie Server</st>
-<st id='SashaServers'>Sasha Servers</st>
-<st id='SchedulerProcess'>Scheduler Process</st>
-<st id='SecurityString'>Security String</st>
-<st id='Select'>Select</st>
-<st id='SelectASpareNodeToSwap'>Select a spare node to swap</st>
-<st id='SelectAllOrNone'>Select All / None</st>
-<st id='SelectAllTargetClusters'>Select all target clusters</st>
-<st id='SelectDeselectAll'>Select or deselect all</st>
-<st id='SelectDeselectAllMachines'>Select or deselect all machines</st>
-<st id='SelectThisTargetCluster'>Select this target cluster</st>
-<st id='ServerProcess'>Server Process</st>
-<st id='ServiceName'>Service Name</st>
-<st id='ServiceType'>Service Type</st>
-<st id='ShowProcessesUsingFilter'>Show processes using filter</st>
-<st id='Size'>Size</st>
-<st id='SlaveNumber'>Slave Number</st>
-<st id='Starting'>Starting</st>
-<st id='State'>State</st>
-<st id='Stopping'>Stopping</st>
-<st id='Submit'>Submit</st>
-<st id='Suspended'>Suspended</st>
-<st id='Swap'>Swap</st>
-<st id='SwapNode'>Swap Node</st>
-<st id='SystemServers'>System Servers</st>
-<st id='SystemServiceNodes'>System Service Nodes</st>
-<st id='TargetClusters'>Target Clusters</st>
-<st id='TimeNotDefined'>Either Time From or To field not defined</st>
-<st id='ThisPageFromByte'>this page from byte</st>
+<st id='SashaServers'>Sasha Serveri</st>
+<st id='SchedulerProcess'>Proces za raspoređivanje poslova</st>
+<st id='SecurityString'>Sigurnosni Tekst</st>
+<st id='Select'>Izaberite</st>
+<st id='SelectASpareNodeToSwap'>Izaberite rezervni nod za zamjenu</st>
+<st id='SelectAllOrNone'>Izaberite Sve / Ništa</st>
+<st id='SelectAllTargetClusters'>Izaberite sve klastere za izvršavanje</st>
+<st id='SelectDeselectAll'>Izaberite ili poništite sve</st>
+<st id='SelectDeselectAllMachines'>Izaberite ili poništite sve mašine</st>
+<st id='SelectThisTargetCluster'>Izaberite ovaj klaster za izvršavanje</st>
+<st id='ServerProcess'>Server Proces</st>
+<st id='ServiceName'>Ime Servisa</st>
+<st id='ServiceType'>Tip Servisa</st>
+<st id='ShowProcessesUsingFilter'>Pokažite procese pomoću filtera</st>
+<st id='Size'>Veličina</st>
+<st id='SlaveNumber'>Broj Izvršivača</st>
+<st id='Starting'>Pokretanje</st>
+<st id='State'>Stanje</st>
+<st id='Stopping'>Zaustavljanje</st>
+<st id='Submit'>Podnesite</st>
+<st id='Suspended'>Suspendovan</st>
+<st id='Swap'>Zamijenite</st>
+<st id='SwapNode'>Zamijenite Nod</st>
+<st id='SystemServers'>Sistem Serveri</st>
+<st id='SystemServiceNodes'>Sistem Servis Nodovi</st>
+<st id='TargetClusters'>Klasteri za Izvršavanje</st>
+<st id='TimeNotDefined'>Vremenski Interval nije definisan</st>
+<st id='ThisPageFromByte'>ova stranica od byte</st>
 <st id='ThorMaster'>Thor Master</st>
-<st id='ThorSlave'>Thor Slave</st>
-<st id='ThorSlaves'>Thor Slaves</st>
-<st id='ThorSpare'>Thor Spare</st>
-<st id='To'>to</st>
-<st id='ToByte'>to byte</st>
+<st id='ThorSlave'>Thor Izvršavač</st>
+<st id='ThorSlaves'>Thor Izvršavači</st>
+<st id='ThorSpare'>Rezervni Thor</st>
+<st id='To'>u</st>
+<st id='ToByte'>u byte</st>
 <st id='Total'>Total</st>
-<st id='TotalFileSize'>Total file size</st>
-<st id='UpdateMetricsNow'>Update Metrics Now</st>
-<st id='UpTime'>Up Time</st>
-<st id='Unknown'>Unknown</st>
-<st id='ViewConfigurationFile'>View Configuration File</st>
-<st id='ViewColumns'>View Columns</st>
-<st id='ViewDetails'>View Details</st>
-<st id='ViewingPage'>Viewing page</st>
-<st id='ViewLogFile'>View Log File</st>
-<st id='WarnIfAvailableDiskSpaceIsUnder'>Warn if available disk space is under</st>
-<st id='WarnIfAvailableMemoryIsUnder'>Warn if available memory is under</st>
-<st id='WarnIfCPUUsageIsOver'>Warn if CPU usage is over</st>
-<st id='Warning'>Warning</st>
+<st id='TotalFileSize'>Ukupna veličina datoteke</st>
+<st id='UpdateMetricsNow'>Ažurirajte Metriku</st>
+<st id='UpTime'>Vrijeme Aktivnog Rada</st>
+<st id='Unknown'>Nepoznat</st>
+<st id='ViewConfigurationFile'>Pogledajte Konfiguracionu Datoteku</st>
+<st id='ViewColumns'>Pogledajte Kolone</st>
+<st id='ViewDetails'>Pogledajte Detalje</st>
+<st id='ViewingPage'>Pregled stranice</st>
+<st id='ViewLogFile'>Pogledajte Log Datoteku</st>
+<st id='WarnIfAvailableDiskSpaceIsUnder'>Upozorite ako je raspoloživ prostor na disku ispod</st>
+<st id='WarnIfAvailableMemoryIsUnder'>Upozorite ako je raspoloživa memorija ispod</st>
+<st id='WarnIfCPUUsageIsOver'>Upozorite ako je iskorištenost procesora iznad</st>
+<st id='Warning'>Upozorenje</st>
 </strings>
 </hpcc>

+ 148 - 148
esp/eclwatch/ws_XSLT/nls/hr/hpcc.xml

@@ -1,162 +1,162 @@
-<hpcc>
+<hpcc>
 <strings>
-<st id='Action'>Action</st>
-<st id='Available'>Available</st>
-<st id='AdditionalProcessesToFilter'>Additional processes to filter</st>
-<st id='AutoRefreshEvery'>Auto Refresh every</st>
-<st id='AutoUpdateMetricsWhenViewColumnsChanging'>Auto update metrics when View Columns changing.</st>
-<st id='AvailableNodes'>Available Nodes</st>
-<st id='BrowserTimedOut'>Browser timed out due to a long time delay.</st>
-<st id='Busy'>Busy</st>
+<st id='Action'>Akcija</st>
+<st id='Available'>Dostupni</st>
+<st id='AdditionalProcessesToFilter'>Dodatni procesi za filtriranje</st>
+<st id='AutoRefreshEvery'>Automatski osvježite svakih</st>
+<st id='AutoUpdateMetricsWhenViewColumnsChanging'>Automatski ažurirajte mjere prilikom promjene fokusa kolone.</st>
+<st id='AvailableNodes'>Dostupni Čvorovi (Nodes)</st>
+<st id='BrowserTimedOut'>Browser vrijeme je isteklo zbog dugog vremenskog kašnjenja.</st>
+<st id='Busy'>Zauzet</st>
 <st id='Bytes'>bytes</st>
-<st id='Cancel'>Cancel</st>
-<st id='Cluster'>Cluster</st>
-<st id='ClusterProcess'>Cluster Process</st>
-<st id='Clusters'>Clusters</st>
-<st id='ClusterTopology'>Cluster Topology</st>
-<st id='Component'>Component</st>
-<st id='Computer'>Computer</st>
-<st id='ComputerUpTime'>Computer Up Time</st>
-<st id='Condition'>Condition</st>
-<st id='Configuration'>Configuration</st>
-<st id='ConfigurationFile'>Configuration file</st>
-<st id='ConfirmSwap'>Are you sure you want to swap two machines under</st>
-<st id='CPULoad'>CPU Load</st>
-<st id='Critical'>Critical</st>
+<st id='Cancel'>Poništite</st>
+<st id='Cluster'>Klaster</st>
+<st id='ClusterProcess'>Klaster Proces</st>
+<st id='Clusters'>Klasteri</st>
+<st id='ClusterTopology'>Klaster Topologija</st>
+<st id='Component'>Komponenta</st>
+<st id='Computer'>Računalo</st>
+<st id='ComputerUpTime'>Vrijeme Aktivnosti Računala</st>
+<st id='Condition'>Stanje</st>
+<st id='Configuration'>Konfiguracija</st>
+<st id='ConfigurationFile'>Konfiguraciona Datoteka</st>
+<st id='ConfirmSwap'>Jeste li sigurni da želite zamijeniti ove dvije mašine</st>
+<st id='CPULoad'>Opterećenje Procesora</st>
+<st id='Critical'>Kritičan</st>
 <st id='DaliServer'>Dali Server</st>
-<st id='DaliServers'>Dali Servers</st>
-<st id='Date'>Date</st>
-<st id='Description'>Description</st>
-<st id='DFUServers'>DFU Servers</st>
-<st id='Directory'>Directory</st>
-<st id='Domain'>Domain</st>
-<st id='Download'>Download</st>
-<st id='DropZone'>Drop Zone</st>
-<st id='DropZones'>Drop Zones</st>
-<st id='EarliestFirst'>EarliestFirst</st>
-<st id='ECLAgents'>ECL Agents</st>
-<st id='ECLAgentProcess'>ECL Agent Process</st>
-<st id='ECLCCServers'>ECL CC Servers</st>
-<st id='ECLSchedulers'>ECL Schedulers</st>
-<st id='ECLServers'>ECL Servers</st>
-<st id='ESPServers'>ESP Servers</st>
-<st id='FailedToRetrieveInformation'>Failed to retrieve information.  Please check configuration.</st>
-<st id='Fatal'>Fatal</st>
-<st id='Fetched'>Fetched</st>
-<st id='Files'>Files</st>
-<st id='FirstPage'>First page</st>
-<st id='FirstRowsNotDefined'>First Rows field not defined</st>
+<st id='DaliServers'>Dali Serveri</st>
+<st id='Date'>Datum</st>
+<st id='Description'>Opis</st>
+<st id='DFUServers'>DFU Serveri</st>
+<st id='Directory'>Direktorij</st>
+<st id='Domain'>Domen</st>
+<st id='Download'>Dobavite</st>
+<st id='DropZone'>Zona Prijema</st>
+<st id='DropZones'>Zone Prijema</st>
+<st id='EarliestFirst'>Najraniji Ide Prvi</st>
+<st id='ECLAgents'>ECL Izvršitelji</st>
+<st id='ECLAgentProcess'>ECL Izvršitelj Proces</st>
+<st id='ECLCCServers'>ECL Serveri za Kompiliranje</st>
+<st id='ECLSchedulers'>ECL Organizatori Posla</st>
+<st id='ECLServers'>ECL Serveri</st>
+<st id='ESPServers'>ESP Serveri</st>
+<st id='FailedToRetrieveInformation'>Nije uspjelo dohvatanje informacija. Molimo provjerite konfiguraciju.</st>
+<st id='Fatal'>Fatalan</st>
+<st id='Fetched'>Učitan</st>
+<st id='Files'>Datoteke</st>
+<st id='FirstPage'>Prva stranica</st>
+<st id='FirstRowsNotDefined'>Polja nisu definisana u prvom rekordu</st>
 <st id='Folder'>Folder</st>
-<st id='FTSlaves'>FT Slaves</st>
-<st id='GenesisServers'>Genesis Servers</st>
-<st id='GetProcessorInformation'>Get processor information</st>
-<st id='GetRoxieMetrics'>Get Roxie Metrics</st>
-<st id='GetSoftwareInformation'>Get software information</st>
-<st id='GetStorageInformation'>Get storage information</st>
-<st id='Home'>Home</st>
-<st id='Hours'>hours</st>
-<st id='Instance'>Instance</st>
-<st id='InvalidFirstRows'>Invalid data in First Rows field</st>
-<st id='InvalidLastHours'>Invalid data in Last Hours field</st>
-<st id='InvalidLastRows'>Invalid data in a Last Rows field</st>
-<st id='InvalidPageNumber'>Invalid data in page number field</st>
-<st id='InvalidTime'>Invalid data in a Time field</st>
+<st id='FTSlaves'>FT Izvršivači</st>
+<st id='GenesisServers'>Genesis Serveri</st>
+<st id='GetProcessorInformation'>Dobavite Informacije o Procesoru</st>
+<st id='GetRoxieMetrics'>Dobavite Informacije o Roxie</st>
+<st id='GetSoftwareInformation'>Dobavite Informacije o software</st>
+<st id='GetStorageInformation'>Dobavite Informacije o prostoru</st>
+<st id='Home'>Polazište</st>
+<st id='Hours'>sati</st>
+<st id='Instance'>Primjer</st>
+<st id='InvalidFirstRows'>Pogrešni podaci u polju za prve redove</st>
+<st id='InvalidLastHours'>Pogrešni podaci u polju za poslijednje sate</st>
+<st id='InvalidLastRows'>Pogrešni podaci u polju za poslijednje redove</st>
+<st id='InvalidPageNumber'>Pogrešni podaci u polju za broj stranice</st>
+<st id='InvalidTime'>Pogrešni podaci u polju za Vrijeme</st>
 <st id='IPAddress'>IP Address</st>
-<st id='LastHoursNotDefined'>Last Hours field not defined</st>
-<st id='LastRowsNotDefined'>Last Rows field not defined</st>
-<st id='LatestFirst'>LatestFirst</st>
-<st id='LDAPServers'>LDAP Servers</st>
-<st id='LoadingPleaseWait'>Loading, please wait...</st>
-<st id='LocalFileSystemsOnly'>Local File Systems Only</st>
-<st id='Location'>Location</st>
-<st id='LogFile'>Log file</st>
+<st id='LastHoursNotDefined'>Polje za poslijednje sate nije definisano</st>
+<st id='LastRowsNotDefined'>Polje za poslijednje redove nije definisano</st>
+<st id='LatestFirst'>Najnoviji Ide Prvi</st>
+<st id='LDAPServers'>LDAP Serveri</st>
+<st id='LoadingPleaseWait'>Molimo sačekajte ...</st>
+<st id='LocalFileSystemsOnly'>Samo Lokalni Sistemi datoteka</st>
+<st id='Location'>Lokacija</st>
+<st id='LogFile'>Log Direktorij</st>
 <st id='LogDirectory'>Log Directory</st>
-<st id='LostReferenceToParentWindow'>Lost reference to parent window.  Please traverse the path again!</st>
-<st id='MachineInfo'>Machine Information</st>
-<st id='Major'>Major</st>
-<st id='Mean'>Mean</st>
-<st id='Metrics'>Metrics</st>
-<st id='Minor'>Minor</st>
+<st id='LostReferenceToParentWindow'>Izbubljna referenca na glavnu stranicu.  Molimo da ponovite put!</st>
+<st id='MachineInfo'>Informacija o Mašini</st>
+<st id='Major'>Glavni</st>
+<st id='Mean'>Srednji</st>
+<st id='Metrics'>Metrika</st>
+<st id='Minor'>Minoran</st>
 <st id='Mins'>mins</st>
-<st id='MySQLServers'>MySQL Servers</st>
+<st id='MySQLServers'>MySQL Serveri</st>
 <st id='NA'>N/A</st>
-<st id='Name'>Name</st>
-<st id='NetworkAddress'>Network Address</st>
-<st id='NextPage'>NextPage</st>
-<st id='NoClustersDefined'>No clusters defined.</st>
-<st id='Nodes'>Nodes</st>
-<st id='NoItems'>No items</st>
-<st id='NoMachinesSelected'>No machines selected!</st>
-<st id='Normal'>Normal</st>
-<st id='NoSystemServicesDefined'>No system services defined!</st>
-<st id='NoTargetClustersSelected'>No target clusters selected!</st>
-<st id='OrFirst'>or first</st>
-<st id='OrGoToPage'>or go to page</st>
-<st id='OrLast'>or last</st>
-<st id='OrLastPage'>or last page</st>
-<st id='OrTimeFrom'>or time from</st>
-<st id='Page'>page</st>
-<st id='PageNumberNotDefined'>page number field not defined</st>
-<st id='PhysicalMemory'>Physical Memory</st>
-<st id='Platform'>Platform</st>
+<st id='Name'>Ime</st>
+<st id='NetworkAddress'>Netvork Adresa</st>
+<st id='NextPage'>Slijedeća Stranica</st>
+<st id='NoClustersDefined'>Klasteri nisu definisani.</st>
+<st id='Nodes'>Čvorovi (Nodovi)</st>
+<st id='NoItems'>Nema ništa</st>
+<st id='NoMachinesSelected'>Mašine nisu odabrane!</st>
+<st id='Normal'>Normalan</st>
+<st id='NoSystemServicesDefined'>Sistem Servisi nisu definisani!</st>
+<st id='NoTargetClustersSelected'>Niste odabrali klaster za izvrsavanje!</st>
+<st id='OrFirst'>ili prvi</st>
+<st id='OrGoToPage'>ili idite na stranicu</st>
+<st id='OrLast'>ili zadnji</st>
+<st id='OrLastPage'>ili zadnja stranica</st>
+<st id='OrTimeFrom'>ili od vremena</st>
+<st id='Page'>strana</st>
+<st id='PageNumberNotDefined'>polje za broj stranice nije definisano</st>
+<st id='PhysicalMemory'>Fizička Memorija</st>
+<st id='Platform'>Platforma</st>
 <st id='Port'>Port</st>
-<st id='PrevPage'>PrevPage</st>
-<st id='Processes'>Processes</st>
-<st id='ProcessesDown'>Processes Down</st>
-<st id='Protocol'>Protocol</st>
-<st id='Queue'>Queue</st>
-<st id='Ready'>Ready</st>
-<st id='Recycling'>Recycling</st>
-<st id='Refresh'>Refresh</st>
-<st id='Rows'>rows</st>
+<st id='PrevPage'>Prethodna Stranica</st>
+<st id='Processes'>Procesi</st>
+<st id='ProcessesDown'>Procesi su Zaustavljni</st>
+<st id='Protocol'>Protokol</st>
+<st id='Queue'>Red</st>
+<st id='Ready'>Spreman</st>
+<st id='Recycling'>Recikliranje</st>
+<st id='Refresh'>Osvježite</st>
+<st id='Rows'>redovi</st>
 <st id='RoxieServer'>Roxie Server</st>
-<st id='SashaServers'>Sasha Servers</st>
-<st id='SchedulerProcess'>Scheduler Process</st>
-<st id='SecurityString'>Security String</st>
-<st id='Select'>Select</st>
-<st id='SelectASpareNodeToSwap'>Select a spare node to swap</st>
-<st id='SelectAllOrNone'>Select All / None</st>
-<st id='SelectAllTargetClusters'>Select all target clusters</st>
-<st id='SelectDeselectAll'>Select or deselect all</st>
-<st id='SelectDeselectAllMachines'>Select or deselect all machines</st>
-<st id='SelectThisTargetCluster'>Select this target cluster</st>
-<st id='ServerProcess'>Server Process</st>
-<st id='ServiceName'>Service Name</st>
-<st id='ServiceType'>Service Type</st>
-<st id='ShowProcessesUsingFilter'>Show processes using filter</st>
-<st id='Size'>Size</st>
-<st id='SlaveNumber'>Slave Number</st>
-<st id='Starting'>Starting</st>
-<st id='State'>State</st>
-<st id='Stopping'>Stopping</st>
-<st id='Submit'>Submit</st>
-<st id='Suspended'>Suspended</st>
-<st id='Swap'>Swap</st>
-<st id='SwapNode'>Swap Node</st>
-<st id='SystemServers'>System Servers</st>
-<st id='SystemServiceNodes'>System Service Nodes</st>
-<st id='TargetClusters'>Target Clusters</st>
-<st id='TimeNotDefined'>Either Time From or To field not defined</st>
-<st id='ThisPageFromByte'>this page from byte</st>
+<st id='SashaServers'>Sasha Serveri</st>
+<st id='SchedulerProcess'>Proces za raspoređivanje poslova</st>
+<st id='SecurityString'>Sigurnosni Tekst</st>
+<st id='Select'>Izaberite</st>
+<st id='SelectASpareNodeToSwap'>Izaberite rezervni nod za zamjenu</st>
+<st id='SelectAllOrNone'>Izaberite Sve / Ništa</st>
+<st id='SelectAllTargetClusters'>Izaberite sve klastere za izvršavanje</st>
+<st id='SelectDeselectAll'>Izaberite ili poništite sve</st>
+<st id='SelectDeselectAllMachines'>Izaberite ili poništite sve mašine</st>
+<st id='SelectThisTargetCluster'>Izaberite ovaj klaster za izvršavanje</st>
+<st id='ServerProcess'>Server Proces</st>
+<st id='ServiceName'>Ime Servisa</st>
+<st id='ServiceType'>Tip Servisa</st>
+<st id='ShowProcessesUsingFilter'>Pokažite procese pomoću filtera</st>
+<st id='Size'>Veličina</st>
+<st id='SlaveNumber'>Broj Izvršivača</st>
+<st id='Starting'>Pokretanje</st>
+<st id='State'>Stanje</st>
+<st id='Stopping'>Zaustavljanje</st>
+<st id='Submit'>Podnesite</st>
+<st id='Suspended'>Suspendovan</st>
+<st id='Swap'>Zamijenite</st>
+<st id='SwapNode'>Zamijenite Nod</st>
+<st id='SystemServers'>Sistem Serveri</st>
+<st id='SystemServiceNodes'>Sistem Servis Nodovi</st>
+<st id='TargetClusters'>Klasteri za Izvršavanje</st>
+<st id='TimeNotDefined'>Vremenski Interval nije definisan</st>
+<st id='ThisPageFromByte'>ova stranica od byte</st>
 <st id='ThorMaster'>Thor Master</st>
-<st id='ThorSlave'>Thor Slave</st>
-<st id='ThorSlaves'>Thor Slaves</st>
-<st id='ThorSpare'>Thor Spare</st>
-<st id='To'>to</st>
-<st id='ToByte'>to byte</st>
+<st id='ThorSlave'>Thor Izvršavač</st>
+<st id='ThorSlaves'>Thor Izvršavači</st>
+<st id='ThorSpare'>Rezervni Thor</st>
+<st id='To'>u</st>
+<st id='ToByte'>u byte</st>
 <st id='Total'>Total</st>
-<st id='TotalFileSize'>Total file size</st>
-<st id='UpdateMetricsNow'>Update Metrics Now</st>
-<st id='UpTime'>Up Time</st>
-<st id='Unknown'>Unknown</st>
-<st id='ViewConfigurationFile'>View Configuration File</st>
-<st id='ViewColumns'>View Columns</st>
-<st id='ViewDetails'>View Details</st>
-<st id='ViewingPage'>Viewing page</st>
-<st id='ViewLogFile'>View Log File</st>
-<st id='WarnIfAvailableDiskSpaceIsUnder'>Warn if available disk space is under</st>
-<st id='WarnIfAvailableMemoryIsUnder'>Warn if available memory is under</st>
-<st id='WarnIfCPUUsageIsOver'>Warn if CPU usage is over</st>
-<st id='Warning'>Warning</st>
+<st id='TotalFileSize'>Ukupna veličina datoteke</st>
+<st id='UpdateMetricsNow'>Ažurirajte Metriku</st>
+<st id='UpTime'>Vrijeme Aktivnog Rada</st>
+<st id='Unknown'>Nepoznat</st>
+<st id='ViewConfigurationFile'>Pogledajte Konfiguracionu Datoteku</st>
+<st id='ViewColumns'>Pogledajte Kolone</st>
+<st id='ViewDetails'>Pogledajte Detalje</st>
+<st id='ViewingPage'>Pregled stranice</st>
+<st id='ViewLogFile'>Pogledajte Log Datoteku</st>
+<st id='WarnIfAvailableDiskSpaceIsUnder'>Upozorite ako je raspoloživ prostor na disku ispod</st>
+<st id='WarnIfAvailableMemoryIsUnder'>Upozorite ako je raspoloživa memorija ispod</st>
+<st id='WarnIfCPUUsageIsOver'>Upozorite ako je iskorištenost procesora iznad</st>
+<st id='Warning'>Upozorenje</st>
 </strings>
 </hpcc>

+ 155 - 155
esp/eclwatch/ws_XSLT/nls/sr/hpcc.xml

@@ -1,162 +1,162 @@
-<hpcc>
+<hpcc>
 <strings>
-<st id='Action'>Action</st>
-<st id='Available'>Available</st>
-<st id='AdditionalProcessesToFilter'>Additional processes to filter</st>
-<st id='AutoRefreshEvery'>Auto Refresh every</st>
-<st id='AutoUpdateMetricsWhenViewColumnsChanging'>Auto update metrics when View Columns changing.</st>
-<st id='AvailableNodes'>Available Nodes</st>
-<st id='BrowserTimedOut'>Browser timed out due to a long time delay.</st>
-<st id='Busy'>Busy</st>
-<st id='Bytes'>bytes</st>
-<st id='Cancel'>Cancel</st>
-<st id='Cluster'>Cluster</st>
-<st id='ClusterProcess'>Cluster Process</st>
-<st id='Clusters'>Clusters</st>
-<st id='ClusterTopology'>Cluster Topology</st>
-<st id='Component'>Component</st>
-<st id='Computer'>Computer</st>
-<st id='ComputerUpTime'>Computer Up Time</st>
-<st id='Condition'>Condition</st>
+<st id='Action'>Акција</st>
+<st id='Available'>Доступни</st>
+<st id='AdditionalProcessesToFilter'>Додатни процеси за филтрирање</st>
+<st id='AutoRefreshEvery'>Аутоматски освежите сваких</st>
+<st id='AutoUpdateMetricsWhenViewColumnsChanging'>Аутоматски ажурирајте мере када се фокус колоне мења.</st>
+<st id='AvailableNodes'>Доступни Чворови (Нодес)</st>
+<st id='BrowserTimedOut'>Браусер време је истекло због дугог временског кашњења.</st>
+<st id='Busy'>Заузет</st>
+<st id='Bytes'>Бyтес</st>
+<st id='Cancel'>Поништите</st>
+<st id='Cluster'>Кластер</st>
+<st id='ClusterProcess'>Кластер Процес</st>
+<st id='Clusters'>Кластери</st>
+<st id='ClusterTopology'>Кластер Топологија</st>
+<st id='Component'>Компонента</st>
+<st id='Computer'>Компјутер</st>
+<st id='ComputerUpTime'>Време Активности Компјутера</st>
+<st id='Condition'>Стање</st>
 <st id='Configuration'>Configuration</st>
-<st id='ConfigurationFile'>Configuration file</st>
-<st id='ConfirmSwap'>Are you sure you want to swap two machines under</st>
-<st id='CPULoad'>CPU Load</st>
-<st id='Critical'>Critical</st>
-<st id='DaliServer'>Dali Server</st>
-<st id='DaliServers'>Dali Servers</st>
-<st id='Date'>Date</st>
-<st id='Description'>Description</st>
-<st id='DFUServers'>DFU Servers</st>
-<st id='Directory'>Directory</st>
-<st id='Domain'>Domain</st>
-<st id='Download'>Download</st>
-<st id='DropZone'>Drop Zone</st>
-<st id='DropZones'>Drop Zones</st>
-<st id='EarliestFirst'>EarliestFirst</st>
-<st id='ECLAgents'>ECL Agents</st>
-<st id='ECLAgentProcess'>ECL Agent Process</st>
-<st id='ECLCCServers'>ECL CC Servers</st>
-<st id='ECLSchedulers'>ECL Schedulers</st>
-<st id='ECLServers'>ECL Servers</st>
-<st id='ESPServers'>ESP Servers</st>
-<st id='FailedToRetrieveInformation'>Failed to retrieve information.  Please check configuration.</st>
-<st id='Fatal'>Fatal</st>
-<st id='Fetched'>Fetched</st>
-<st id='Files'>Files</st>
-<st id='FirstPage'>First page</st>
-<st id='FirstRowsNotDefined'>First Rows field not defined</st>
-<st id='Folder'>Folder</st>
-<st id='FTSlaves'>FT Slaves</st>
-<st id='GenesisServers'>Genesis Servers</st>
-<st id='GetProcessorInformation'>Get processor information</st>
-<st id='GetRoxieMetrics'>Get Roxie Metrics</st>
-<st id='GetSoftwareInformation'>Get software information</st>
-<st id='GetStorageInformation'>Get storage information</st>
-<st id='Home'>Home</st>
-<st id='Hours'>hours</st>
-<st id='Instance'>Instance</st>
-<st id='InvalidFirstRows'>Invalid data in First Rows field</st>
-<st id='InvalidLastHours'>Invalid data in Last Hours field</st>
-<st id='InvalidLastRows'>Invalid data in a Last Rows field</st>
-<st id='InvalidPageNumber'>Invalid data in page number field</st>
-<st id='InvalidTime'>Invalid data in a Time field</st>
+<st id='ConfigurationFile'>Конфигурациона Датотека</st>
+<st id='ConfirmSwap'>Јесте ли сигурни да желите заменити ове две машине</st>
+<st id='CPULoad'>Оптерећење Процесора</st>
+<st id='Critical'>Критичан</st>
+<st id='DaliServer'>Дали Сервер</st>
+<st id='DaliServers'>Дали Сервери</st>
+<st id='Date'>Датум</st>
+<st id='Description'>Опис</st>
+<st id='DFUServers'>ДФУ Сервери</st>
+<st id='Directory'>Директориј</st>
+<st id='Domain'>Домен</st>
+<st id='Download'>Добавите</st>
+<st id='DropZone'>Зона Пријема</st>
+<st id='DropZones'>Зонe Пријема</st>
+<st id='EarliestFirst'>Најранији Иде Први</st>
+<st id='ECLAgents'>ЕЦЛ Извршитељи</st>
+<st id='ECLAgentProcess'>ЕЦЛ Извршитељ Процес</st>
+<st id='ECLCCServers'>ЕЦЛ Сервери за Компилирање</st>
+<st id='ECLSchedulers'>ЕЦЛ Организатори Посла</st>
+<st id='ECLServers'>ЕЦЛ Сервери</st>
+<st id='ESPServers'>ЕСП Сервери</st>
+<st id='FailedToRetrieveInformation'>Није успјело дохватање информација. Молимо провјерите конфигурацију.</st>
+<st id='Fatal'>Фаталан</st>
+<st id='Fetched'>Учитан</st>
+<st id='Files'>Датотеке</st>
+<st id='FirstPage'>Прва страница</st>
+<st id='FirstRowsNotDefined'>Поља нису дефинисана у првом рекорду</st>
+<st id='Folder'>Фасциклa</st>
+<st id='FTSlaves'>ФТ Извршивачи</st>
+<st id='GenesisServers'>Генесис Сервери</st>
+<st id='GetProcessorInformation'>Добавите Информације о Процесору</st>
+<st id='GetRoxieMetrics'>Добавите Информације о Роxие</st>
+<st id='GetSoftwareInformation'>Добавите Информације о софтверу</st>
+<st id='GetStorageInformation'>Добавите Информације о простору</st>
+<st id='Home'>Полазиште</st>
+<st id='Hours'>сати</st>
+<st id='Instance'>пример</st>
+<st id='InvalidFirstRows'>Погрешни подаци у пољу за прве редове</st>
+<st id='InvalidLastHours'>Погрешни подаци у пољу за последње сате</st>
+<st id='InvalidLastRows'>Погрешни подаци у пољу за последње редове</st>
+<st id='InvalidPageNumber'>Погрешни подаци у пољу за број странице</st>
+<st id='InvalidTime'>Погрешни подаци у пољу за Време</st>
 <st id='IPAddress'>IP Address</st>
-<st id='LastHoursNotDefined'>Last Hours field not defined</st>
-<st id='LastRowsNotDefined'>Last Rows field not defined</st>
-<st id='LatestFirst'>LatestFirst</st>
-<st id='LDAPServers'>LDAP Servers</st>
-<st id='LoadingPleaseWait'>Loading, please wait...</st>
-<st id='LocalFileSystemsOnly'>Local File Systems Only</st>
-<st id='Location'>Location</st>
-<st id='LogFile'>Log file</st>
-<st id='LogDirectory'>Log Directory</st>
-<st id='LostReferenceToParentWindow'>Lost reference to parent window.  Please traverse the path again!</st>
-<st id='MachineInfo'>Machine Information</st>
-<st id='Major'>Major</st>
-<st id='Mean'>Mean</st>
-<st id='Metrics'>Metrics</st>
-<st id='Minor'>Minor</st>
+<st id='LastHoursNotDefined'>Поље за последње сате није дефинисано</st>
+<st id='LastRowsNotDefined'>Поље за последње редове није дефинисано</st>
+<st id='LatestFirst'>Најновији Иде Први</st>
+<st id='LDAPServers'>ЛДАП Сервери</st>
+<st id='LoadingPleaseWait'>Молимо сачекајте ...</st>
+<st id='LocalFileSystemsOnly'>Само Локални Системи датотека</st>
+<st id='Location'>Локација</st>
+<st id='LogFile'>Лог датотека</st>
+<st id='LogDirectory'>Лог Директориј</st>
+<st id='LostReferenceToParentWindow'>Избубљна референца на главну страницу.  Молимо да поновите пут!</st>
+<st id='MachineInfo'>Информација о Машини</st>
+<st id='Major'>Главни</st>
+<st id='Mean'>Средњи</st>
+<st id='Metrics'>Метрика</st>
+<st id='Minor'>Миноран</st>
 <st id='Mins'>mins</st>
-<st id='MySQLServers'>MySQL Servers</st>
+<st id='MySQLServers'>МyСQЛ Сервери</st>
 <st id='NA'>N/A</st>
-<st id='Name'>Name</st>
-<st id='NetworkAddress'>Network Address</st>
-<st id='NextPage'>NextPage</st>
-<st id='NoClustersDefined'>No clusters defined.</st>
-<st id='Nodes'>Nodes</st>
-<st id='NoItems'>No items</st>
-<st id='NoMachinesSelected'>No machines selected!</st>
-<st id='Normal'>Normal</st>
-<st id='NoSystemServicesDefined'>No system services defined!</st>
-<st id='NoTargetClustersSelected'>No target clusters selected!</st>
-<st id='OrFirst'>or first</st>
-<st id='OrGoToPage'>or go to page</st>
-<st id='OrLast'>or last</st>
-<st id='OrLastPage'>or last page</st>
-<st id='OrTimeFrom'>or time from</st>
-<st id='Page'>page</st>
-<st id='PageNumberNotDefined'>page number field not defined</st>
-<st id='PhysicalMemory'>Physical Memory</st>
-<st id='Platform'>Platform</st>
-<st id='Port'>Port</st>
-<st id='PrevPage'>PrevPage</st>
-<st id='Processes'>Processes</st>
-<st id='ProcessesDown'>Processes Down</st>
-<st id='Protocol'>Protocol</st>
-<st id='Queue'>Queue</st>
-<st id='Ready'>Ready</st>
-<st id='Recycling'>Recycling</st>
-<st id='Refresh'>Refresh</st>
-<st id='Rows'>rows</st>
-<st id='RoxieServer'>Roxie Server</st>
-<st id='SashaServers'>Sasha Servers</st>
-<st id='SchedulerProcess'>Scheduler Process</st>
-<st id='SecurityString'>Security String</st>
-<st id='Select'>Select</st>
-<st id='SelectASpareNodeToSwap'>Select a spare node to swap</st>
-<st id='SelectAllOrNone'>Select All / None</st>
-<st id='SelectAllTargetClusters'>Select all target clusters</st>
-<st id='SelectDeselectAll'>Select or deselect all</st>
-<st id='SelectDeselectAllMachines'>Select or deselect all machines</st>
-<st id='SelectThisTargetCluster'>Select this target cluster</st>
-<st id='ServerProcess'>Server Process</st>
-<st id='ServiceName'>Service Name</st>
-<st id='ServiceType'>Service Type</st>
-<st id='ShowProcessesUsingFilter'>Show processes using filter</st>
-<st id='Size'>Size</st>
-<st id='SlaveNumber'>Slave Number</st>
-<st id='Starting'>Starting</st>
-<st id='State'>State</st>
-<st id='Stopping'>Stopping</st>
-<st id='Submit'>Submit</st>
-<st id='Suspended'>Suspended</st>
-<st id='Swap'>Swap</st>
-<st id='SwapNode'>Swap Node</st>
-<st id='SystemServers'>System Servers</st>
-<st id='SystemServiceNodes'>System Service Nodes</st>
-<st id='TargetClusters'>Target Clusters</st>
-<st id='TimeNotDefined'>Either Time From or To field not defined</st>
-<st id='ThisPageFromByte'>this page from byte</st>
-<st id='ThorMaster'>Thor Master</st>
-<st id='ThorSlave'>Thor Slave</st>
-<st id='ThorSlaves'>Thor Slaves</st>
-<st id='ThorSpare'>Thor Spare</st>
-<st id='To'>to</st>
-<st id='ToByte'>to byte</st>
-<st id='Total'>Total</st>
-<st id='TotalFileSize'>Total file size</st>
-<st id='UpdateMetricsNow'>Update Metrics Now</st>
-<st id='UpTime'>Up Time</st>
-<st id='Unknown'>Unknown</st>
-<st id='ViewConfigurationFile'>View Configuration File</st>
-<st id='ViewColumns'>View Columns</st>
-<st id='ViewDetails'>View Details</st>
-<st id='ViewingPage'>Viewing page</st>
-<st id='ViewLogFile'>View Log File</st>
-<st id='WarnIfAvailableDiskSpaceIsUnder'>Warn if available disk space is under</st>
-<st id='WarnIfAvailableMemoryIsUnder'>Warn if available memory is under</st>
-<st id='WarnIfCPUUsageIsOver'>Warn if CPU usage is over</st>
-<st id='Warning'>Warning</st>
+<st id='Name'>Име</st>
+<st id='NetworkAddress'>Нетворк Адреса</st>
+<st id='NextPage'>Следећа Страница</st>
+<st id='NoClustersDefined'>Кластери нису дефинисани.</st>
+<st id='Nodes'>Чворови (Нодови)</st>
+<st id='NoItems'>Нема ништа</st>
+<st id='NoMachinesSelected'>Машине нису одабране!</st>
+<st id='Normal'>Нормалан</st>
+<st id='NoSystemServicesDefined'>Систем Сервиси нису дефинисани!</st>
+<st id='NoTargetClustersSelected'>Нисте одабрали кластер за изврсавање!</st>
+<st id='OrFirst'>или први</st>
+<st id='OrGoToPage'>или идите на страницу</st>
+<st id='OrLast'>или задња</st>
+<st id='OrLastPage'>или задња страница</st>
+<st id='OrTimeFrom'>или од времена</st>
+<st id='Page'>страна</st>
+<st id='PageNumberNotDefined'>поље за број странице није дефинисано</st>
+<st id='PhysicalMemory'>Физичка Меморија</st>
+<st id='Platform'>Платформа</st>
+<st id='Port'>Порт</st>
+<st id='PrevPage'>Претходна Страница</st>
+<st id='Processes'>Процеси</st>
+<st id='ProcessesDown'>Процеси су Заустављни</st>
+<st id='Protocol'>Протокол</st>
+<st id='Queue'>Ред</st>
+<st id='Ready'>Спреман</st>
+<st id='Recycling'>Рециклирање</st>
+<st id='Refresh'>Освежите</st>
+<st id='Rows'>редови</st>
+<st id='RoxieServer'>Роxие Сервер</st>
+<st id='SashaServers'>Саша Сервери</st>
+<st id='SchedulerProcess'>Процес за распоређивање послова</st>
+<st id='SecurityString'>Сигурносни Текст</st>
+<st id='Select'>Изаберите</st>
+<st id='SelectASpareNodeToSwap'>Изаберите резервни нод за замену</st>
+<st id='SelectAllOrNone'>Изаберите Све / Ништа</st>
+<st id='SelectAllTargetClusters'>Изаберите све кластере за извршавање</st>
+<st id='SelectDeselectAll'>Изаберите или поништите све</st>
+<st id='SelectDeselectAllMachines'>Изаберите или поништите све машине</st>
+<st id='SelectThisTargetCluster'>Изаберите овај кластер за извршавање</st>
+<st id='ServerProcess'>Сервер Процес</st>
+<st id='ServiceName'>Име Сервиса Name</st>
+<st id='ServiceType'>Тип Сервиса</st>
+<st id='ShowProcessesUsingFilter'>Покажите процесе помоћу филтера</st>
+<st id='Size'> Величина</st>
+<st id='SlaveNumber'>Број Извршивача</st>
+<st id='Starting'>Покретање</st>
+<st id='State'>Стање</st>
+<st id='Stopping'>Заустављање</st>
+<st id='Submit'>Поднесите</st>
+<st id='Suspended'>Суспендован</st>
+<st id='Swap'>Замените</st>
+<st id='SwapNode'>Замените Нод</st>
+<st id='SystemServers'>Систем Сервери</st>
+<st id='SystemServiceNodes'>Систем Сервис Нодови</st>
+<st id='TargetClusters'>Кластери за Извршавање</st>
+<st id='TimeNotDefined'>Временски Интервал није дефинисан</st>
+<st id='ThisPageFromByte'>ова страница од бyте</st>
+<st id='ThorMaster'>Тхор Мастер</st>
+<st id='ThorSlave'>Тхор Извршавач</st>
+<st id='ThorSlaves'>Тхор Извршавачи</st>
+<st id='ThorSpare'>Резервни Тхор</st>
+<st id='To'>у</st>
+<st id='ToByte'>у бyте</st>
+<st id='Total'>Тотал</st>
+<st id='TotalFileSize'>Укупна величина датотеке</st>
+<st id='UpdateMetricsNow'>Ажурирајте Метрику</st>
+<st id='UpTime'>Време Активног Рада</st>
+<st id='Unknown'>Непознат</st>
+<st id='ViewConfigurationFile'>Погледајте Конфигурациону Датотеку</st>
+<st id='ViewColumns'>Погледајте Колоне</st>
+<st id='ViewDetails'>Погледајте Детаље</st>
+<st id='ViewingPage'>Преглед странице</st>
+<st id='ViewLogFile'>Погледајте Лог Датотеку</st>
+<st id='WarnIfAvailableDiskSpaceIsUnder'>Упозорите ако је расположив простор на диску испод</st>
+<st id='WarnIfAvailableMemoryIsUnder'>Упозорите ако је расположива меморија испод</st>
+<st id='WarnIfCPUUsageIsOver'>Упозорите ако је искориштеност процесора изнад</st>
+<st id='Warning'>Упозорење</st>
 </strings>
 </hpcc>

+ 0 - 30
esp/platform/espcfg.cpp

@@ -138,36 +138,6 @@ CEspConfig::CEspConfig(IProperties* inputs, IPropertyTree* envpt, IPropertyTree*
     m_options.frameTitle.set(m_cfg->queryProp("@name"));
     m_options.slowProcessingTime = m_cfg->getPropInt("@slowProcessingTime", 30) * 1000; //in msec
 
-#ifdef USE_ENV_CONF_FILE
-    // load environment parameters
-    StringBuffer envConfFile, envXMLFile;
-    const char* configFile = m_cfg->queryProp("EnvironmentConfFile");
-    if (configFile && *configFile)
-    {
-        envConfFile.append(configFile);
-    }
-    else
-    {
-        envConfFile.append("/etc/LexisNexis/environment.conf");
-    }
-    const char* envFromDali = m_cfg->queryProp("@environmentNotFromDali");
-    if (envFromDali && !stricmp(envFromDali, "true"))
-    {
-        const char* envXML = m_cfg->queryProp("EnvironmentXMLFile");
-        if (envXML && *envXML)
-        {
-            envXMLFile.append(envXML);
-        }
-        else
-        {
-            envXMLFile.append("environment.xml");
-        }
-    }
-
-    Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
-    factory->createEnvironmentByFile(envConfFile.str(), envXMLFile.str());
-#endif
-
     if (!m_cfg->getProp("@name", m_process))
     {
         ERRLOG("EspProcess name not found");

+ 90 - 99
esp/profiles/eclwatch.profile.js

@@ -1,107 +1,98 @@
-/**
- * This is the default application build profile used by the boilerplate. While it looks similar, this build profile
- * is different from the package build profile at `app/package.js` in the following ways:
- *
- * 1. you can have multiple application build profiles (e.g. one for desktop, one for tablet, etc.), but only one
- *    package build profile;
- * 2. the package build profile only configures the `resourceTags` for the files in the package, whereas the
- *    application build profile tells the build system how to build the entire application.
- *
- * Look to `util/build/buildControlDefault.js` for more information on available options and their default values.
- */
-
 var profile = {
-    // `basePath` is relative to the directory containing this profile file; in this case, it is being set to the
-    // src/ directory, which is the same place as the `baseUrl` directory in the loader configuration. (If you change
-    // this, you will also need to update run.js.)
-    basePath: '../src/',
-
-    // This is the directory within the release directory where built packages will be placed. The release directory
-    // itself is defined by `build.sh`. You should probably not use this; it is a legacy option dating back to Dojo
-    // 0.4.
-    // If you do use this, you will need to update build.sh, too.
-    // releaseName: '',
-
-    // Builds a new release.
-    action: 'release',
-
-    // Strips all comments and whitespace from CSS files and inlines @imports where possible.
-    cssOptimize: 'comments',
-
-    // Excludes tests, demos, and original template files from being included in the built version.
+    basePath: "../src/",
+    action: "release",
+    layerOptimize: "closure",
+    optimize: "closure",
+    cssOptimize: "comments",
     mini: true,
-
-    // Uses Closure Compiler as the JavaScript minifier. This can also be set to "shrinksafe" to use ShrinkSafe,
-    // though ShrinkSafe is deprecated and not recommended.
-    // This option defaults to "" (no compression) if not provided.
-    optimize: 'closure',
-
-    // We're building layers, so we need to set the minifier to use for those, too.
-    // This defaults to "shrinksafe" if not provided.
-    layerOptimize: 'closure',
-
-    // Strips all calls to console functions within the code. You can also set this to "warn" to strip everything
-    // but console.error, and any other truthy value to strip everything but console.warn and console.error.
-    // This defaults to "normal" (strip all but warn and error) if not provided.
-    stripConsole: 'all',
-
-    // The default selector engine is not included by default in a dojo.js build in order to make mobile builds
-    // smaller. We add it back here to avoid that extra HTTP request. There is also a "lite" selector available; if
-    // you use that, you will need to set the `selectorEngine` property in `app/run.js`, too. (The "lite" engine is
-    // only suitable if you are not supporting IE7 and earlier.)
-    selectorEngine: 'acme',
-
-    // Builds can be split into multiple different JavaScript files called "layers". This allows applications to
-    // defer loading large sections of code until they are actually required while still allowing multiple modules to
-    // be compiled into a single file.
-    layers: {
-        // This is the main loader module. It is a little special because it is treated like an AMD module even though
-        // it is actually just plain JavaScript. There is some extra magic in the build system specifically for this
-        // module ID.
-        'dojo/dojo': {
-            // In addition to the loader `dojo/dojo` and the loader configuration file `app/run`, we are also including
-            // the main application `app/main` and the `dojo/i18n` and `dojo/domReady` modules because, while they are
-            // all conditional dependencies in `app/main`, we do not want to have to make extra HTTP requests for such
-            // tiny files.
-            include: [ 'dojo/i18n', 'dojo/domReady', 'hpcc/stub' ],
-
-            // By default, the build system will try to include `dojo/main` in the built `dojo/dojo` layer, which adds
-            // a bunch of stuff we do not want or need. We want the initial script load to be as small and quick to
-            // load as possible, so we configure it as a custom, bootable base.
-            boot: true,
-            customBase: true
-        }//,
-
-        // In the demo application, we conditionally require `app/Dialog` on the client-side, so here we build a
-        // separate layer containing just that client-side code. (Practically speaking, you would probably just want
-        // to roll everything into a single layer, but this helps provide a basic illustration of multi-layer builds.)
-        // Note that when you create a new layer, the module referenced by the layer is always included in the layer
-        // (in this case, `app/Dialog`), so it does not need to be explicitly defined in the `include` array.
-        //'hpcc/Dialog': {}
+    stripConsole: "all",
+    selectorEngine: "lite",
+    
+    defaultConfig: {
+        hasCache: {
+            "dojo-built": 1,
+            "dojo-loader": 1,
+            "dom": 1,
+            "host-browser": 1,
+            "config-selectorEngine": "lite"
+        },
+        async: 1
     },
 
-    // Providing hints to the build system allows code to be conditionally removed on a more granular level than
-    // simple module dependencies can allow. This is especially useful for creating tiny mobile builds.
-    // Keep in mind that dead code removal only happens in minifiers that support it! Currently, only Closure Compiler
-    // to the Dojo build system with dead code removal.
-    // A documented list of has-flags in use within the toolkit can be found at
-    // <http://dojotoolkit.org/reference-guide/dojo/has.html>.
     staticHasFeatures: {
-        // The trace & log APIs are used for debugging the loader, so we do not need them in the build.
-        'dojo-trace-api': 0,
-        'dojo-log-api': 0,
-
-        // This causes normally private loader data to be exposed for debugging. In a release build, we do not need
-        // that either.
-        'dojo-publish-privates': 0,
-
-        // This application is pure AMD, so get rid of the legacy loader.
-        'dojo-sync-loader': 0,
-
-        // `dojo-xhr-factory` relies on `dojo-sync-loader`, which we have removed.
-        'dojo-xhr-factory': 0,
+        "config-deferredInstrumentation": 0,
+        "config-dojo-loader-catches": 0,
+        "config-tlmSiblingOfDojo": 0,
+        "dojo-amd-factory-scan": 0,
+        "dojo-combo-api": 0,
+        "dojo-config-api": 1,
+        "dojo-config-require": 0,
+        "dojo-debug-messages": 0,
+        "dojo-dom-ready-api": 1,
+        "dojo-firebug": 0,
+        "dojo-guarantee-console": 1,
+        "dojo-has-api": 1,
+        "dojo-inject-api": 1,
+        "dojo-loader": 1,
+        "dojo-log-api": 0,
+        "dojo-modulePaths": 0,
+        "dojo-moduleUrl": 0,
+        "dojo-publish-privates": 0,
+        "dojo-requirejs-api": 0,
+        "dojo-sniff": 1,
+        "dojo-sync-loader": 0,
+        "dojo-test-sniff": 0,
+        "dojo-timeout-api": 0,
+        "dojo-trace-api": 0,
+        "dojo-undef-api": 0,
+        "dojo-v1x-i18n-Api": 1,
+        "dom": 1,
+        "host-browser": 1,
+        "extend-dojo": 1
+    },
 
-        // We are not loading tests in production, so we can get rid of some test sniffing code.
-        'dojo-test-sniff': 0
+    packages: [
+        'dojo',
+        'dijit',
+        'dojox',
+        'dgrid',
+        'put-selector',
+        'xstyle',
+        {
+            name: "d3",
+            location: "./d3",
+            trees: [
+                [".", ".", /(\/\.)|(~$)|(^((?!d3\.js).)*$)|(test|src|lib|bin)/]
+            ]
+        },
+        {
+            name: "topojson",
+            location: "./topojson",
+            trees: [
+                [".", ".", /(\/\.)|(~$)|(^((?!topojson\.js).)*$)|(test|examples|lib|bin)/]
+            ]
+        },
+        {
+            name: "hpcc",
+            location: "./eclwatch"
+        },
+        {
+            name: "templates",
+            location: "eclwatch/templates"
+        }
+    ],
+        
+    layers: {
+        "hpcc/hpcc": {
+            include: [ 
+                "hpcc/stub",
+                "hpcc/HPCCPlatformWidget",
+                "hpcc/ActivityWidget",
+                "hpcc/HPCCPlatformECLWidget",
+                "hpcc/WUQueryWidget"
+            ],
+            customBase: true,
+            boot: true
+        }
     }
 };

+ 11 - 2
esp/scm/ws_dfu.ecm

@@ -133,6 +133,14 @@ ESPStruct DFUSpaceItem
     string SmallestSize;
 };
 
+ESPStruct DFUActionInfo
+{
+    string FileName;
+    string NodeGroup;
+    string ActionResult;
+    bool   Failed;
+};
+
 ESPrequest [nil_remove] DFUQueryRequest
 {
     string Prefix;
@@ -236,7 +244,8 @@ DFUArrayActionResponse
 {
     [min_ver("1.04")] string BackToPage;
     [min_ver("1.18")] string RedirectTo;
-    string DFUArrayActionResult;
+    string DFUArrayActionResult; //used by legacy eclwatch
+    [min_ver("1.27")] ESParray<ESPstruct DFUActionInfo> ActionResults;
 };
 
 ESPrequest 
@@ -641,7 +650,7 @@ ESPresponse [exceptions_inline, nil_remove, http_encode(0)] DFUSearchDataRespons
 
 //  ===========================================================================
 ESPservice [
-    version("1.26"), default_client_version("1.26"),
+    version("1.27"), default_client_version("1.27"),
     noforms, 
     exceptions_inline("./smc_xslt/exceptions.xslt")] WsDfu
 {

+ 7 - 1
esp/scm/ws_workunits.ecm

@@ -985,6 +985,7 @@ ESPrequest [nil_remove] WUShowScheduledRequest
     string EventName("");
     string PushEventName("");
     string PushEventText("");
+    [min_ver("1.51")] string State("");
 };
 
 ESPStruct [nil_remove] ScheduledWU
@@ -994,6 +995,9 @@ ESPStruct [nil_remove] ScheduledWU
     string EventName("");
     string EventText("");
     string JobName("");
+    [min_ver("1.51")] int StateID;
+    [min_ver("1.51")] string State("");
+    [min_ver("1.51")] string Owner("");
 };
 
 ESPStruct [nil_remove] ServerInfo
@@ -1259,6 +1263,8 @@ ESPrequest [nil_remove] WUListQueriesRequest
     [min_ver("1.48")] bool Activated;
     [min_ver("1.48")] bool SuspendedByUser;
     [min_ver("1.50")] string WUID;
+    [min_ver("1.51")] string QueryID;
+    [min_ver("1.51")] string QueryName;
 
     nonNegativeInteger PageSize(0);
     nonNegativeInteger PageStartFrom(0);
@@ -1555,7 +1561,7 @@ ESPresponse [exceptions_inline] WUCheckFeaturesResponse
 };
 
 ESPservice [
-    version("1.50"), default_client_version("1.50"),
+    version("1.51"), default_client_version("1.51"),
     noforms,exceptions_inline("./smc_xslt/exceptions.xslt"),use_method_name] WsWorkunits
 {
     ESPmethod [resp_xsl_default("/esp/xslt/workunits.xslt")]     WUQuery(WUQueryRequest, WUQueryResponse);

+ 68 - 14
esp/services/ws_dfu/ws_dfuService.cpp

@@ -1134,8 +1134,28 @@ bool CWsDfuEx::onAddtoSuperfile(IEspContext &context, IEspAddtoSuperfileRequest
     return true;
 }
 
+void CWsDfuEx::setDeleteFileResults(const char* fileName, const char* nodeGroup, bool failed, const char* actionResult, StringBuffer& resultString,
+    IArrayOf<IEspDFUActionInfo>& actionResults)
+{
+    if (!fileName || !*fileName)
+        return;
+    Owned<IEspDFUActionInfo> resultObj = createDFUActionInfo("", "");
+    resultObj->setFileName(fileName);
+    resultObj->setFailed(failed);
+    if (nodeGroup && *nodeGroup)
+        resultObj->setNodeGroup(nodeGroup);
+    if (actionResult && *actionResult)
+    {
+        resultObj->setActionResult(actionResult);
+        resultString.appendf("<Message><Value>%s</Value></Message>", actionResult);
+    }
+    actionResults.append(*resultObj.getClear());
+    return;
+}
+
 bool CWsDfuEx::DFUDeleteFiles(IEspContext &context, IEspDFUArrayActionRequest &req, IEspDFUArrayActionResponse &resp)
 {
+    double version = context.getClientVersion();
     StringBuffer username;
     context.getUserID(username);
 
@@ -1149,17 +1169,29 @@ bool CWsDfuEx::DFUDeleteFiles(IEspContext &context, IEspDFUArrayActionRequest &r
     StringBuffer returnStr;
 
     StringArray superFileNames, filesCannotBeDeleted;
+    IArrayOf<IEspDFUActionInfo> actionResults;
     for(int j = 0; j < 2; j++) //j=0: delete superfiles first
     {
         for(unsigned i = 0; i < req.getLogicalFiles().length(); i++)
         {
-            const char* filename = req.getLogicalFiles().item(i);
-            if(!filename || !*filename)
+            const char* fileNameAndNodeGroup = req.getLogicalFiles().item(i);
+            if(!fileNameAndNodeGroup || !*fileNameAndNodeGroup)
                 continue;
 
+            const char* fileName = NULL;
+            const char* nodeGroup = NULL;
+            StringArray fileNameOrNodeGroup;
+            fileNameOrNodeGroup.appendListUniq(fileNameAndNodeGroup, "@");
+            fileName = fileNameOrNodeGroup.item(0);
+            if (fileNameOrNodeGroup.length() > 1)
+            {
+                nodeGroup = fileNameOrNodeGroup.item(1);
+                if (!*nodeGroup || strieq(nodeGroup, "null")) //null is used by new ECLWatch for a superfile
+                    nodeGroup = NULL;
+            }
             if (j>0)
             { // 2nd pass, now we want to skip superfiles and the files which cannot do the lookup.
-                if (superFileNames.contains(filename) || filesCannotBeDeleted.contains(filename))
+                if (superFileNames.contains(fileNameAndNodeGroup) || filesCannotBeDeleted.contains(fileNameAndNodeGroup))
                     continue;
             }
 
@@ -1167,11 +1199,17 @@ bool CWsDfuEx::DFUDeleteFiles(IEspContext &context, IEspDFUArrayActionRequest &r
             {
                 IDistributedFileDirectory &fdir = queryDistributedFileDirectory();
                 {
-                    Owned<IDistributedFile> df = fdir.lookup(filename, userdesc, true);
+                    Owned<IDistributedFile> df = fdir.lookup(fileNameAndNodeGroup, userdesc, true);
                     if(!df)
                     {
-                        returnStr.appendf("<Message><Value>Cannot delete %s: file not found</Value></Message>", filename);
-                        filesCannotBeDeleted.append(filename);
+                        StringBuffer message;
+                        if (!nodeGroup || !*nodeGroup)
+                            message.appendf("Cannot delete %s: file not found", fileName);
+                        else
+                            message.appendf("Cannot delete %s on %s: file not found", fileName, nodeGroup);
+                        setDeleteFileResults(fileName, nodeGroup, true, message, returnStr, actionResults);
+                        PROGLOG("Deleted Logical File: %s by: %s\n",fileNameAndNodeGroup, username.str());
+                        filesCannotBeDeleted.append(fileNameAndNodeGroup);
                         continue;
                     }
                     if (0==j) // skip non-super files on 1st pass
@@ -1179,33 +1217,49 @@ bool CWsDfuEx::DFUDeleteFiles(IEspContext &context, IEspDFUArrayActionRequest &r
                         if(!df->querySuperFile())
                             continue;
 
-                        superFileNames.append(filename);
+                        superFileNames.append(fileNameAndNodeGroup);
                     }
                 }
-                fdir.removeEntry(filename, userdesc, NULL, REMOVE_FILE_SDS_CONNECT_TIMEOUT, true);
-                PROGLOG("Deleted Logical File: %s by: %s\n",filename, username.str());
-                returnStr.appendf("<Message><Value>Deleted File %s</Value></Message>", filename);
+                fdir.removeEntry(fileNameAndNodeGroup, userdesc, NULL, REMOVE_FILE_SDS_CONNECT_TIMEOUT, true);
+                StringBuffer message;
+                if (!nodeGroup || !*nodeGroup)
+                    message.appendf("File %s deleted", fileName);
+                else
+                    message.appendf("File %s deleted on %s", fileName, nodeGroup);
+                setDeleteFileResults(fileName, nodeGroup, false, message, returnStr, actionResults);
             }
             catch(IException* e)
             {
-                filesCannotBeDeleted.append(filename);
+                filesCannotBeDeleted.append(fileNameAndNodeGroup);
 
                 StringBuffer emsg;
                 e->errorMessage(emsg);
                 if((e->errorCode() == DFSERR_CreateAccessDenied) && (req.getType() != NULL))
                     emsg.replaceString("Create ", "Delete ");
 
-                returnStr.appendf("<Message><Value>Cannot delete %s: %s</Value></Message>", filename, emsg.str());
+                StringBuffer message;
+                if (!nodeGroup || !*nodeGroup)
+                    message.appendf("Cannot delete %s: %s", fileName, emsg.str());
+                else
+                    message.appendf("Cannot delete %s on %s: %s", fileName, nodeGroup, emsg.str());
+                setDeleteFileResults(fileName, nodeGroup, true, message, returnStr, actionResults);
                 e->Release();
             }
             catch(...)
             {
-                returnStr.appendf("<Message><Value>Cannot delete %s: unknown exception.</Value></Message>", filename);
+                StringBuffer message;
+                if (!nodeGroup || !*nodeGroup)
+                    message.appendf("Cannot delete %s: unknown exception.", fileName);
+                else
+                    message.appendf("Cannot delete %s on %s: unknown exception.", fileName, nodeGroup);
+                setDeleteFileResults(fileName, nodeGroup, true, message, returnStr, actionResults);
             }
         }
     }
 
-    resp.setDFUArrayActionResult(returnStr.str());
+    if (version >= 1.27)
+        resp.setActionResults(actionResults);
+    resp.setDFUArrayActionResult(returnStr.str());//Used by legacy
     return true;
 }
 

+ 2 - 0
esp/services/ws_dfu/ws_dfuService.hpp

@@ -134,6 +134,8 @@ private:
         const char* beforeSubFile, bool existingSuperfile, bool autocreatesuper, bool deleteFile, bool removeSuperfile =  true);
     void getFilePartsOnClusters(IEspContext &context, const char* clusterReq, StringArray& clusters, IDistributedFile* df, IEspDFUFileDetail& FileDetails,
         offset_t& mn, offset_t& mx, offset_t& sum, offset_t& count);
+    void setDeleteFileResults(const char* fileName, const char* nodeGroup, bool failed, const char* message, StringBuffer& resultString,
+        IArrayOf<IEspDFUActionInfo>& actionResults);
 private:
     bool         m_disableUppercaseTranslation;
     StringBuffer m_clusterName;

+ 1 - 1
esp/services/ws_ecl/ws_ecl_service.cpp

@@ -302,7 +302,7 @@ bool CWsEclService::init(const char * name, const char * type, IPropertyTree * c
     }
 
     Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
-    Owned<IConstEnvironment> environment = factory->openEnvironmentByFile();
+    Owned<IConstEnvironment> environment = factory->openEnvironment();
     Owned<IPropertyTree> pRoot = &environment->getPTree();
 
     xpath.clear().appendf("EspService[@name='%s']", name);

+ 0 - 4
esp/services/ws_fileio/ws_fileioservice.cpp

@@ -39,11 +39,7 @@ bool CWsFileIOEx::CheckServerAccess(const char* server, const char* relPath, Str
     Owned<IEnvironmentFactory> factory = getEnvironmentFactory();
 
     Owned<IConstEnvironment> env;
-#if 0
     env.setown(factory->openEnvironment());
-#else
-    env.setown(factory->openEnvironmentByFile());
-#endif
 
     Owned<IPropertyTree> pEnvRoot = &env->getPTree();
     IPropertyTree* pEnvSoftware = pEnvRoot->queryPropTree("Software");

+ 0 - 0
esp/services/ws_fs/ws_fsBinding.cpp


Some files were not shown because too many files changed in this diff