Module: check_mk
Branch: master
Commit: d3c0569f5e2114ff2569af166c508bdf35a3659e
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=d3c0569f5e2114…
Author: Sergey Kipnis <sk(a)mathias-kettner.de>
Date: Fri Dec 7 13:26:39 2018 +0100
6865 FIX Windows Agent's fileinfo section produces correct output
Previously, fileinfo section may contain invalid data, usually nulls.
With the fix this section works as intended and sends to the output correct
file information.
[CMK-1417] - fixed invalid behavior of the fileinfo section provider in Windows Agent
Now the provider writes correct data to section.
Change-Id: Idaf41c3ec803edf4671b75642a2c5f733bdc9685
---
.werks/6865 | 13 +++++++++++++
agents/windows/build_version | 2 +-
agents/windows/sections/SectionFileinfo.cc | 31 +++++++++++++++++++++++++-----
3 files changed, 40 insertions(+), 6 deletions(-)
diff --git a/.werks/6865 b/.werks/6865
new file mode 100644
index 0000000..33e84be
--- /dev/null
+++ b/.werks/6865
@@ -0,0 +1,13 @@
+Title: Windows Agent's fileinfo section produces correct output
+Level: 1
+Component: checks
+Compatible: compat
+Edition: cre
+Version: 1.6.0i1
+Date: 1544186240
+Class: fix
+
+Previously, fileinfo section may contain invalid data, usually nulls.
+With the fix this section works as intended and sends to the output correct
+file information.
+
diff --git a/agents/windows/build_version b/agents/windows/build_version
index 74de7d2..7c85d65 100644
--- a/agents/windows/build_version
+++ b/agents/windows/build_version
@@ -1 +1 @@
-3264
+3266
diff --git a/agents/windows/sections/SectionFileinfo.cc
b/agents/windows/sections/SectionFileinfo.cc
index ae298c5..da641b4 100644
--- a/agents/windows/sections/SectionFileinfo.cc
+++ b/agents/windows/sections/SectionFileinfo.cc
@@ -97,21 +97,42 @@ struct IteratorTraits<false> {
* @param[in/out] files The container for storing found files
* @param[in/out] dirs The container for storing found dirs
*/
+// The function works not so good as we are expecting:
+// dir traverse doesn't work, symlinks are not processed too,
+// unit tests are absent(refactoring is forbidden)
+// i.e. pure disaster. Do not reuse without careful testing.
+// Or just do not reuse.
template <bool recursive>
void addFilesAndDirs(const fs::path &searchPath, const fs::path &filePattern,
const fs::path &dirPattern, PathsT &files, PathsT &dirs)
{
using IteratorT = typename IteratorTraits<recursive>::iterator_type;
for (const auto &p : IteratorT(searchPath)) {
// Found files must match the entire path pattern.
- if (auto status = p.symlink_status();
- fs::is_regular_file(status) &&
+
+ // *******************************************
+ // we have to check status, not symlink_status
+ // if you are not sure, test behavior before
+ // putting the code into production
+ auto status = p.status(); // CMK-1417, to be confirmed in ticket
+
+ // Logic below is a bit crazy and ineffective(we check status twice)
+ // correct is "double if", not logical AND.
+
+ // normal file
+ if (fs::is_regular_file(status) &&
globmatch(filePattern.wstring(), p.path().wstring())) {
files.push_back(p.path());
// Only consider dirs if not iterating recursively.
- // Found dirs must match the pattern only on the next subdir level.
- } else if (!recursive && fs::is_directory(status) &&
- globmatch(dirPattern.wstring(), p.path().wstring())) {
+ // Found dirs must match the pattern only on the next subdir
+ // level.
+ continue;
+ }
+
+ // directory
+ if (!recursive && fs::is_directory(status) &&
+ globmatch(dirPattern.wstring(), p.path().wstring())) {
dirs.push_back(p.path());
+ continue;
}
}
}