modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
| 32 ++-
modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java
| 95 ++++++++++
2 files changed, 120 insertions(+), 7 deletions(-)
New commits:
commit 786eb9d50b9c8beebf5a9a7edf18e8ba82ef79cd
Author: John Sanda <jsanda(a)redhat.com>
Date: Wed Sep 28 15:07:35 2011 -0400
[BZ 727959] Check to make sure files are readable during drift detection
When generating the initial change set, if a file is not readable, it is
skipped and excluded from the change set since we cannot compute the SHA
for the file.
When generating a drift change set, if we detect a new file that is not
readable, we skip it as well since we cannot compute the SHA. Now if an
existing file that is already being monitored for drift has its
permissions changed such that it is no longer readable, then it is
treated and recorded as a deleted file entry.
diff --git
a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
index 4f2ea30..1aedea3 100644
---
a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
+++
b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java
@@ -163,7 +163,6 @@ public class DriftDetector implements Runnable {
final Set<File> processedFiles = new HashSet<File>();
final List<FileEntry> snapshotEntries = new LinkedList<FileEntry>();
final List<FileEntry> deltaEntries = new LinkedList<FileEntry>();
- int currentVersion = coverageReader.getHeaders().getVersion();
int newVersion = coverageReader.getHeaders().getVersion() + 1;
// First look for files that have either been modified or deleted
@@ -171,16 +170,22 @@ public class DriftDetector implements Runnable {
File file = new File(basedir, entry.getFile());
if (!file.exists()) {
// The file has been deleted since the last scan
- if (log.isInfoEnabled()) {
- log.info("Detected deleted file for " + schedule + "
--> " + file.getAbsolutePath());
+ if (log.isDebugEnabled()) {
+ log.debug("Detected deleted file for " + schedule + "
--> " + file.getAbsolutePath());
+ }
+ deltaEntries.add(removedFileEntry(entry.getFile(), entry.getNewSHA()));
+ } else if (!file.canRead()) {
+ processedFiles.add(file);
+ if (log.isDebugEnabled()) {
+ log.debug(file.getPath() + " is no longer readable. Treating it
as a deleted file.");
}
deltaEntries.add(removedFileEntry(entry.getFile(), entry.getNewSHA()));
} else {
processedFiles.add(file);
String currentSHA = sha256(file);
if (!currentSHA.equals(entry.getNewSHA())) {
- if (log.isInfoEnabled()) {
- log.info("Detected modified file for " + schedule +
" --> " + file.getAbsolutePath());
+ if (log.isDebugEnabled()) {
+ log.debug("Detected modified file for " + schedule +
" --> " + file.getAbsolutePath());
}
FileEntry modifiedEntry = changedFileEntry(entry.getFile(),
entry.getNewSHA(), currentSHA);
deltaEntries.add(modifiedEntry);
@@ -204,6 +209,13 @@ public class DriftDetector implements Runnable {
return;
}
+ if (!file.canRead()) {
+ if (log.isDebugEnabled()) {
+ log.debug("Skipping " + file.getPath() +
" since it is not readable.");
+ return;
+ }
+ }
+
if (log.isInfoEnabled()) {
log.info("Detected added file for " + schedule
+ " --> " + file.getAbsolutePath());
}
@@ -274,8 +286,14 @@ public class DriftDetector implements Runnable {
@Override
public void visit(File file) {
try {
- if (log.isInfoEnabled()) {
- log.info("Adding " + file.getPath() + " to
coverage change set for " + schedule);
+ if (!file.canRead()) {
+ if (log.isDebugEnabled()) {
+ log.debug("Skipping " + file.getPath() +
" since it is not readable.");
+ }
+ return;
+ }
+ if (log.isDebugEnabled()) {
+ log.debug("Adding " + file.getPath() + "
to coverage change set for " + schedule);
}
writer.write(addedFileEntry(relativePath(basedir, file),
sha256(file)));
} catch (IOException e) {
diff --git
a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java
b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java
index 0b97ba6..4811044 100644
---
a/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java
+++
b/modules/core/plugin-container/src/test/java/org/rhq/core/pc/drift/DriftDetectorTest.java
@@ -518,6 +518,101 @@ public class DriftDetectorTest extends DriftTest {
"only the initial change set has been generated and sending change send
report to server fails");
}
+ @Test
+ public void ignoreFilesThatAreNotReadableForCoverageChangeSet() throws Exception {
+ DriftConfiguration config =
driftConfiguration("nonreadable-files-coverage",
resourcesDir.getAbsolutePath());
+
+ File confDir = mkdir(resourceDir, "conf");
+ File server1Conf = createRandomFile(confDir, "server-1.conf");
+ File server2Conf = createRandomFile(confDir, "server-2.conf");
+ assertTrue(server2Conf.setReadable(false), "Failed to make " +
server2Conf.getPath() + " write only");
+
+ scheduleQueue.addSchedule(new DriftDetectionSchedule(resourceId(), config));
+ detector.run();
+
+ File changeSet = changeSet(config.getName(), COVERAGE);
+ List<FileEntry> entries =
asList(addedFileEntry("conf/server-1.conf", sha256(server1Conf)));
+
+ assertHeaderEquals(changeSet, createHeaders(config, COVERAGE));
+ assertFileEntriesMatch("Files that are non-readable should be skipped but
other, readable file should still " +
+ "be included in the change set", entries, changeSet);
+ }
+
+ @Test
+ public void ignoreNewFilesThatAreNotReadableForDriftChangeSet() throws Exception {
+ DriftConfiguration config =
driftConfiguration("nonreadable-files-drfit", resourceDir.getAbsolutePath());
+ DriftDetectionSchedule schedule = new DriftDetectionSchedule(resourceId(),
config);
+
+ File confDir = mkdir(resourceDir, "conf");
+ File server1Conf = createRandomFile(confDir, "server-1.conf");
+ String oldServer1Hash = sha256(server1Conf);
+
+ scheduleQueue.addSchedule(schedule);
+ detector.run();
+
+ // create some drift that includes a new file that is not readable
+ server1Conf.delete();
+ server1Conf = createRandomFile(confDir, "server-1.conf");
+ String newServer1Hash = sha256(server1Conf);
+
+ File server2Conf = createRandomFile(confDir, "server-2.conf");
+ assertTrue(server2Conf.setReadable(false), "Failed to make " +
server2Conf.getPath() + " write only");
+
+ schedule.resetSchedule();
+ detector.run();
+
+ File driftChangeSet = changeSet(config.getName(), DRIFT);
+ List<FileEntry> driftEntries =
asList(changedFileEntry("conf/server-1.conf", oldServer1Hash,
newServer1Hash));
+
+ // verify that the drift change set was generated
+ assertTrue(driftChangeSet.exists(), "Expected to find drift change set
" + driftChangeSet.getPath());
+ assertHeaderEquals(driftChangeSet, createHeaders(config, DRIFT, 1));
+ assertFileEntriesMatch("The drift change set does not match the expected
values", driftEntries, driftChangeSet);
+
+ // verify that the coverage change set was updated
+ File coverageChangeSet = changeSet(config.getName(), COVERAGE);
+ List<FileEntry> coverageEntries =
asList(changedFileEntry("conf/server-1.conf", oldServer1Hash,
newServer1Hash));
+
+ assertHeaderEquals(coverageChangeSet, createHeaders(config, COVERAGE, 1));
+ assertFileEntriesMatch("The coverage change set was not updated as
expected", coverageEntries,
+ coverageChangeSet);
+ }
+
+ @Test
+ public void markFileUnderDriftDetectionAsRemovedWhenItIsMadeNonReadable() throws
Exception {
+ DriftConfiguration config = driftConfiguration("file-made-nonreadable",
resourceDir.getAbsolutePath());
+ DriftDetectionSchedule schedule = new DriftDetectionSchedule(resourceId(),
config);
+
+ File confDir = mkdir(resourceDir, "conf");
+ File server1Conf = createRandomFile(confDir, "server-1.conf");
+ String server1Hash = sha256(server1Conf);
+
+ scheduleQueue.addSchedule(schedule);
+ detector.run();
+
+ // make the file non-readable and run the detector again
+ assertTrue(server1Conf.setReadable(false), "Failed to make " +
server1Conf.getPath() + " write only");
+
+ schedule.resetSchedule();
+ detector.run();
+
+ File driftChangeSet = changeSet(config.getName(), DRIFT);
+ List<FileEntry> driftEntries =
asList(removedFileEntry("conf/server-1.conf", server1Hash));
+
+ // verify that the drift change set was generated
+ assertTrue(driftChangeSet.exists(), "Expected to find drift change set
" + driftChangeSet.getPath());
+ assertHeaderEquals(driftChangeSet, createHeaders(config, DRIFT, 1));
+ assertFileEntriesMatch("The drift change set does not match the expected
values", driftEntries, driftChangeSet);
+
+ // verify that the coverage change set was updated
+ File coverageChangeSet = changeSet(config.getName(), COVERAGE);
+ List<FileEntry> coverageEntries = emptyList();
+
+ assertHeaderEquals(coverageChangeSet, createHeaders(config, COVERAGE, 1));
+ assertFileEntriesMatch("The coverage change set was not updated as
expected", coverageEntries,
+ coverageChangeSet);
+ }
+
void assertHeaderEquals(File changeSet, Headers expected) throws Exception {
ChangeSetReader reader = new ChangeSetReaderImpl(new BufferedReader(new
FileReader(changeSet)));
Headers actual = reader.getHeaders();