modules/enterprise/server/container/src/main/scripts/rhq-container.build.xml | 9 + modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java | 51 -------- modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftUtil.java | 59 ++++++++++ modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java | 21 ++- 4 files changed, 85 insertions(+), 55 deletions(-)
New commits: commit 12766f0f87c4922faa8d59b2a962beabd6933c09 Author: John Sanda jsanda@redhat.com Date: Mon Nov 28 11:08:19 2011 -0500
[BZ 757758] Adding logic to filter out binary content
By default, the server will not store content for binary files that are being monitored for drift. It can be enabled by setting the system property default.rhq.server.drift.binary.content to a value of 1. The property can be set in rhq-server.properties.
diff --git a/modules/enterprise/server/container/src/main/scripts/rhq-container.build.xml b/modules/enterprise/server/container/src/main/scripts/rhq-container.build.xml index 9dbae53..3a18691 100644 --- a/modules/enterprise/server/container/src/main/scripts/rhq-container.build.xml +++ b/modules/enterprise/server/container/src/main/scripts/rhq-container.build.xml @@ -22,6 +22,8 @@
<property name="rhq.sync.endpoint-address" value="false"/>
+ <property name="default.rhq.server.drift.binary.content" value="0"/> + <target name="set-predeploy-prop"> <condition property="predeploy" value="true"> <or> @@ -608,6 +610,13 @@ rhq.server.plugin-scan-period-ms=${rhq.server.plugin-scan-period-ms} # you have to deal with IP address changes. rhq.sync.endpoint-address=false
+# Enabling this property has two effects. First, it will cause the server to +# request that agents send binary content for files being monitored for drift. +# Secondly, the server will persist that binary content. The property is +# enabled when it is to set a value of 1. Any other value will cause this +# feature to be disabled. +# default.rhq.server.drift.binary.content=0 + # Auto-Install Pre-Configuration Settings # If you wish to circumvent the installer webapp and auto-install the server # immediately upon first startup, make sure all of the settings above are diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java index 7c1d3e1..6af05d9 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java @@ -119,48 +119,6 @@ import org.rhq.enterprise.server.util.LookupUtil; @Stateless public class DriftManagerBean implements DriftManagerLocal, DriftManagerRemote {
- private static Set<String> binaryFileTypes = new HashSet<String>(); - - static { - binaryFileTypes.add("jar"); - binaryFileTypes.add("war"); - binaryFileTypes.add("ear"); - binaryFileTypes.add("sar"); // jboss service - binaryFileTypes.add("har"); // hibernate archive - binaryFileTypes.add("rar"); // resource adapter - binaryFileTypes.add("wsr"); // jboss web service archive - binaryFileTypes.add("zip"); - binaryFileTypes.add("tar"); - binaryFileTypes.add("bz2"); - binaryFileTypes.add("gz"); - binaryFileTypes.add("rpm"); - binaryFileTypes.add("so"); - binaryFileTypes.add("dll"); - binaryFileTypes.add("exe"); - binaryFileTypes.add("jpg"); - binaryFileTypes.add("png"); - binaryFileTypes.add("jpeg"); - binaryFileTypes.add("gif"); - binaryFileTypes.add("pdf"); - binaryFileTypes.add("swf"); - binaryFileTypes.add("bpm"); - binaryFileTypes.add("tiff"); - binaryFileTypes.add("svg"); - binaryFileTypes.add("doc"); - binaryFileTypes.add("mp3"); - binaryFileTypes.add("wav"); - binaryFileTypes.add("m4a"); - binaryFileTypes.add("mov"); - binaryFileTypes.add("mpeg"); - binaryFileTypes.add("avi"); - binaryFileTypes.add("mp4"); - binaryFileTypes.add("wmv"); - binaryFileTypes.add("deb"); - binaryFileTypes.add("sit"); - binaryFileTypes.add("iso"); - binaryFileTypes.add("dmg"); - } - // TODO Should security checks be handled here instead of delegating to the drift plugin? // Currently any security checks that need to be performed are delegated to the plugin. // This is fine *so far* since the only plugin is the default which is our existing SLSB @@ -869,14 +827,7 @@ public class DriftManagerBean implements DriftManagerLocal, DriftManagerRemote {
@Override public boolean isBinaryFile(Subject subject, Drift<?, ?> drift) { - String path = drift.getPath(); - int index = path.lastIndexOf('.'); - - if (index == -1 || index == path.length() - 1) { - return false; - } - - return binaryFileTypes.contains(path.substring(index + 1, path.length())); + return DriftUtil.isBinaryFile(drift); }
@Override diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftUtil.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftUtil.java index 16cb479..34a3c69 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftUtil.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftUtil.java @@ -21,9 +21,12 @@ package org.rhq.enterprise.server.drift;
import java.io.InputStream; import java.io.OutputStream; +import java.util.HashSet; +import java.util.Set;
import org.apache.commons.logging.LogFactory;
+import org.rhq.core.domain.drift.Drift; import org.rhq.enterprise.communications.ServiceContainer; import org.rhq.enterprise.communications.command.client.ClientCommandSender; import org.rhq.enterprise.communications.command.client.ClientCommandSenderConfiguration; @@ -36,6 +39,62 @@ import org.rhq.enterprise.server.core.comm.ServerCommunicationsServiceUtil; */ public class DriftUtil {
+ private static Set<String> binaryFileTypes = new HashSet<String>(); + + static { + binaryFileTypes.add("jar"); + binaryFileTypes.add("war"); + binaryFileTypes.add("ear"); + binaryFileTypes.add("sar"); // jboss service + binaryFileTypes.add("har"); // hibernate archive + binaryFileTypes.add("rar"); // resource adapter + binaryFileTypes.add("wsr"); // jboss web service archive + binaryFileTypes.add("zip"); + binaryFileTypes.add("tar"); + binaryFileTypes.add("bz2"); + binaryFileTypes.add("gz"); + binaryFileTypes.add("rpm"); + binaryFileTypes.add("so"); + binaryFileTypes.add("dll"); + binaryFileTypes.add("exe"); + binaryFileTypes.add("jpg"); + binaryFileTypes.add("png"); + binaryFileTypes.add("jpeg"); + binaryFileTypes.add("gif"); + binaryFileTypes.add("pdf"); + binaryFileTypes.add("swf"); + binaryFileTypes.add("bpm"); + binaryFileTypes.add("tiff"); + binaryFileTypes.add("svg"); + binaryFileTypes.add("doc"); + binaryFileTypes.add("mp3"); + binaryFileTypes.add("wav"); + binaryFileTypes.add("m4a"); + binaryFileTypes.add("mov"); + binaryFileTypes.add("mpeg"); + binaryFileTypes.add("avi"); + binaryFileTypes.add("mp4"); + binaryFileTypes.add("wmv"); + binaryFileTypes.add("deb"); + binaryFileTypes.add("sit"); + binaryFileTypes.add("iso"); + binaryFileTypes.add("dmg"); + } + + static boolean isBinaryFile(Drift<?, ?> drift) { + return isBinaryFile(drift.getPath()); + } + + static boolean isBinaryFile(String path) { + int index = path.lastIndexOf('.'); + + if (index == -1 || index == path.length() - 1) { + return false; + } + + return binaryFileTypes.contains(path.substring(index + 1, path.length())); + } + static InputStream remoteStream(InputStream stream) { RemoteInputStream remoteStream = (RemoteInputStream) stream; ServiceContainer serviceContainer = ServerCommunicationsServiceUtil.getService().getServiceContainer(); diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java index 142e959..ddcdace 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/JPADriftServerBean.java @@ -346,8 +346,10 @@ public class JPADriftServerBean implements JPADriftServerLocal {
if (version > 0) { for (FileEntry entry : reader) { - JPADriftFile oldDriftFile = getDriftFile(entry.getOldSHA(), emptyDriftFiles); - JPADriftFile newDriftFile = getDriftFile(entry.getNewSHA(), emptyDriftFiles); + boolean addToList = + isBinaryContentStorageEnabled() || !DriftUtil.isBinaryFile(entry.getFile()); + JPADriftFile oldDriftFile = getDriftFile(entry.getOldSHA(), emptyDriftFiles, addToList); + JPADriftFile newDriftFile = getDriftFile(entry.getNewSHA(), emptyDriftFiles, addToList);
// TODO Figure out an efficient way to save coverage change sets. // The initial/coverage change set could contain hundreds or even thousands @@ -373,7 +375,9 @@ public class JPADriftServerBean implements JPADriftServerLocal { summary.setInitialChangeSet(true); JPADriftSet driftSet = new JPADriftSet(); for (FileEntry entry : reader) { - JPADriftFile newDriftFile = getDriftFile(entry.getNewSHA(), emptyDriftFiles); + boolean addToList = + isBinaryContentStorageEnabled() || !DriftUtil.isBinaryFile(entry.getFile()); + JPADriftFile newDriftFile = getDriftFile(entry.getNewSHA(), emptyDriftFiles, addToList); String path = FileUtil.useForwardSlash(entry.getFile()); // A Drift always has a changeSet. Note that in this code section the changeset is // always going to be set to a DriftDefinition's changeSet. But that is not always the @@ -430,7 +434,12 @@ public class JPADriftServerBean implements JPADriftServerLocal { } }
- private JPADriftFile getDriftFile(String sha256, List<JPADriftFile> emptyDriftFiles) { + private boolean isBinaryContentStorageEnabled() { + String binaryContent = System.getProperty("default.rhq.server.drift.binary.content", "0"); + return binaryContent.equals("1"); + } + + private JPADriftFile getDriftFile(String sha256, List<JPADriftFile> emptyDriftFiles, boolean addToList) { JPADriftFile result = null;
if (null == sha256 || "0".equals(sha256)) { @@ -441,7 +450,9 @@ public class JPADriftServerBean implements JPADriftServerLocal { // if the JPADriftFile is not yet in the db, then it needs to be fetched from the agent if (null == result) { result = persistDriftFile(new JPADriftFile(sha256)); - emptyDriftFiles.add(result); + if (addToList) { + emptyDriftFiles.add(result); + } }
return result;