Author: orudyy
Date: Thu Jul 2 13:30:52 2015
New Revision: 1688825
URL: http://svn.apache.org/r1688825
Log:
QPID-6614: Improve functionality around exposing log files and their content
and add UI to browse and download log files (work by Lorenz Quack and Alex
Rudyy)
Added:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LogFileDetails.java
- copied, changed from r1688819,
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/virtualhostlogger/file/show.js
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/PathContent.java
- copied, changed from r1688819,
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/logback/PathTypedContent.java
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/ZippedContent.java
- copied, changed from r1688819,
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/logback/PathTypedContent.java
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/FileBrowser.js
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/logger/file/fileBrowser.html
- copied, changed from r1688819,
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/logs/showLogFileDownloadDialog.html
Removed:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/logback/PathTypedContent.java
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/log/LogFileDetails.java
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/log/LogFileHelper.java
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/LogFileServlet.java
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogFileListingServlet.java
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logs/LogFileDownloadDialog.js
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/logs/showLogFileDownloadDialog.html
Modified:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLogger.java
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLoggerImpl.java
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/RollingFileAppenderFactory.java
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostFileLogger.java
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostFileLoggerImpl.java
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/logback/RolloverWatcher.java
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SecurityManager.java
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/access/ObjectType.java
qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/VirtualHostLoggerTest.java
qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/logback/RolloverWatcherTest.java
qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/security/SecurityManagerTest.java
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogRecordsServlet.java
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/CategoryTabExtension.js
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Logger.js
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/brokerlogger/file/show.js
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/brokerlogger/show.js
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/virtualhostlogger/file/show.js
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/virtualhostlogger/show.js
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logs/LogViewer.js
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/logs/showLogViewer.html
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/showLogger.html
qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/acl/BrokerACLTest.java
qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/acl/VirtualHostACLTest.java
Modified:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLogger.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLogger.java?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLogger.java
(original)
+++
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLogger.java
Thu Jul 2 13:30:52 2015
@@ -21,6 +21,7 @@
package org.apache.qpid.server.logging;
import java.util.Collection;
+import java.util.Set;
import org.apache.qpid.server.model.BrokerLogger;
import org.apache.qpid.server.model.DerivedAttribute;
@@ -57,8 +58,14 @@ public interface BrokerFileLogger<X exte
String getLayout();
@DerivedAttribute
- Collection<String> getRolledFiles();
+ Collection<LogFileDetails> getLogFiles();
@ManagedOperation(nonModifying = true)
Content getFile(@Param(name = "fileName") String fileName);
+
+ @ManagedOperation(nonModifying = true)
+ Content getFiles(@Param(name = "fileName") Set<String> fileName);
+
+ @ManagedOperation(nonModifying = true)
+ Content getAllFiles();
}
Modified:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLoggerImpl.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLoggerImpl.java?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLoggerImpl.java
(original)
+++
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/BrokerFileLoggerImpl.java
Thu Jul 2 13:30:52 2015
@@ -20,9 +20,10 @@
*/
package org.apache.qpid.server.logging;
-import java.nio.file.Path;
+import java.security.AccessControlException;
import java.util.Collection;
import java.util.Map;
+import java.util.Set;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@@ -36,12 +37,13 @@ import org.apache.qpid.server.model.Brok
import org.apache.qpid.server.model.ManagedAttributeField;
import org.apache.qpid.server.model.ManagedObjectFactoryConstructor;
import org.apache.qpid.server.model.Content;
+import org.apache.qpid.server.model.Param;
import org.apache.qpid.server.util.DaemonThreadFactory;
public class BrokerFileLoggerImpl extends
AbstractBrokerLogger<BrokerFileLoggerImpl> implements
BrokerFileLogger<BrokerFileLoggerImpl>, FileLoggerSettings
{
- private final RolloverWatcher _rolloverWatcher;
- private final ScheduledExecutorService _rolledPolicyExecutor;
+ private RolloverWatcher _rolloverWatcher;
+ private ScheduledExecutorService _rolledPolicyExecutor;
@ManagedAttributeField
private String _layout;
@@ -57,15 +59,20 @@ public class BrokerFileLoggerImpl extend
private int _maxHistory;
@ManagedAttributeField
private String _maxFileSize;
- private Collection<String> _rolledFiles;
- private Path _baseFolder;
@ManagedObjectFactoryConstructor
protected BrokerFileLoggerImpl(final Map<String, Object> attributes,
Broker<?> broker)
{
super(attributes, broker);
- _rolloverWatcher = new RolloverWatcher();
+ }
+
+ @Override
+ protected void postResolveChildren()
+ {
+ _rolloverWatcher = new RolloverWatcher(getFileName());
_rolledPolicyExecutor = Executors.newSingleThreadScheduledExecutor(new
DaemonThreadFactory("RolledFileScanner-" + getName()));
+
+ super.postResolveChildren();
}
@Override
@@ -109,16 +116,44 @@ public class BrokerFileLoggerImpl extend
{
return _layout;
}
+
@Override
- public Collection<String> getRolledFiles()
+ public Collection<LogFileDetails> getLogFiles()
{
- return _rolloverWatcher.getRolledFiles();
+ return _rolloverWatcher.getLogFileDetails();
}
@Override
public Content getFile(final String fileName)
{
- return _rolloverWatcher.getTypedContent(fileName,
_fileName.equals(fileName));
+ if (!getSecurityManager().authoriseLogsAccess(this))
+ {
+ throw new AccessControlException("Permission denied to access log
content");
+ }
+
+ return _rolloverWatcher.getFileContent(fileName);
+ }
+
+ @Override
+ public Content getFiles(@Param(name = "fileName") Set<String> fileName)
+ {
+ if (!getSecurityManager().authoriseLogsAccess(this))
+ {
+ throw new AccessControlException("Permission denied to access log
content");
+ }
+
+ return _rolloverWatcher.getFilesAsZippedContent(fileName);
+ }
+
+ @Override
+ public Content getAllFiles()
+ {
+ if (!getSecurityManager().authoriseLogsAccess(this))
+ {
+ throw new AccessControlException("Permission denied to access log
content");
+ }
+
+ return _rolloverWatcher.getAllFilesAsZippedContent();
}
@Override
Copied:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LogFileDetails.java
(from r1688819,
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/virtualhostlogger/file/show.js)
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LogFileDetails.java?p2=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LogFileDetails.java&p1=qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/virtualhostlogger/file/show.js&r1=1688819&r2=1688825&rev=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/virtualhostlogger/file/show.js
(original)
+++
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/LogFileDetails.java
Thu Jul 2 13:30:52 2015
@@ -18,19 +18,37 @@
* under the License.
*
*/
-define(["qpid/common/util",
- "dojo/query",
- "dojox/html/entities",
- "dojo/text!logger/file/show.html",
- "qpid/common/TypeTabExtension",
- "dojo/domReady!"],
- function (util, query, entities, template, TypeTabExtension)
- {
- function VirtualHostFileLogger(params)
+package org.apache.qpid.server.logging;
+
+import org.apache.qpid.server.model.ManagedAttributeValue;
+import org.apache.qpid.server.model.ManagedAttributeValueType;
+
+@ManagedAttributeValueType
+public class LogFileDetails implements ManagedAttributeValue
+{
+ private final String _name;
+ private final long _lastModified;
+ private final long _size;
+
+ public LogFileDetails(String name, long lastModified, long size)
+ {
+ _name = name;
+ _lastModified = lastModified;
+ _size = size;
+ }
+
+ public String getName()
{
- TypeTabExtension.call(this, params.containerNode, template,
"VirtualHostLogger", "File", params.metadata, params.data);
+ return _name;
}
- return util.extend(VirtualHostFileLogger, TypeTabExtension);
- }
-);
+ public long getLastModified()
+ {
+ return _lastModified;
+ }
+
+ public long getSize()
+ {
+ return _size;
+ }
+}
Copied:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/PathContent.java
(from r1688819,
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/logback/PathTypedContent.java)
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/PathContent.java?p2=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/PathContent.java&p1=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/logback/PathTypedContent.java&r1=1688819&r2=1688825&rev=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/logback/PathTypedContent.java
(original)
+++
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/PathContent.java
Thu Jul 2 13:30:52 2015
@@ -18,7 +18,7 @@
* under the License.
*
*/
-package org.apache.qpid.server.logging.logback;
+package org.apache.qpid.server.logging;
import java.io.FileNotFoundException;
import java.io.IOException;
@@ -30,14 +30,14 @@ import org.apache.qpid.server.model.Cust
import org.apache.qpid.server.model.RestContentHeader;
import org.apache.qpid.server.model.Content;
-public class PathTypedContent implements Content, CustomRestHeaders
+public class PathContent implements Content, CustomRestHeaders
{
private final Path _path;
private final String _contentType;
private final String _disposition;
private final long _contentSize;
- public PathTypedContent(Path path, String contentType)
+ public PathContent(Path path, String contentType)
{
_path = path;
_contentType = contentType;
Modified:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/RollingFileAppenderFactory.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/RollingFileAppenderFactory.java?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/RollingFileAppenderFactory.java
(original)
+++
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/RollingFileAppenderFactory.java
Thu Jul 2 13:30:52 2015
@@ -31,6 +31,7 @@ import ch.qos.logback.core.rolling.Rolli
import ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP;
import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy;
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
+import ch.qos.logback.core.rolling.TriggeringPolicy;
import org.apache.qpid.server.logging.logback.RollingPolicyDecorator;
public class RollingFileAppenderFactory
@@ -42,34 +43,38 @@ public class RollingFileAppenderFactory
appender.setAppend(true);
appender.setContext(loggerContext);
- RollingPolicyBase policy;
+ TriggeringPolicy triggeringPolicy;
+ RollingPolicyBase rollingPolicy;
if(fileLoggerSettings.isRollDaily())
{
- DailyTriggeringPolicy triggeringPolicy = new
DailyTriggeringPolicy(fileLoggerSettings.isRollOnRestart(),
fileLoggerSettings.getMaxFileSize());
- triggeringPolicy.setContext(loggerContext);
- TimeBasedRollingPolicy<ILoggingEvent> rollingPolicy = new
TimeBasedRollingPolicy<>();
- rollingPolicy.setMaxHistory(fileLoggerSettings.getMaxHistory());
-
rollingPolicy.setTimeBasedFileNamingAndTriggeringPolicy(triggeringPolicy);
- rollingPolicy.setFileNamePattern(fileLoggerSettings.getFileName()
+ ".%d{yyyy-MM-dd}.%i" + (fileLoggerSettings.isCompressOldFiles()
+ DailyTriggeringPolicy dailyTriggeringPolicy = new
DailyTriggeringPolicy(fileLoggerSettings.isRollOnRestart(),
fileLoggerSettings.getMaxFileSize());
+ dailyTriggeringPolicy.setContext(loggerContext);
+ TimeBasedRollingPolicy<ILoggingEvent> timeBasedRollingPolicy = new
TimeBasedRollingPolicy<>();
+
timeBasedRollingPolicy.setMaxHistory(fileLoggerSettings.getMaxHistory());
+
timeBasedRollingPolicy.setTimeBasedFileNamingAndTriggeringPolicy(dailyTriggeringPolicy);
+
timeBasedRollingPolicy.setFileNamePattern(fileLoggerSettings.getFileName() +
".%d{yyyy-MM-dd}.%i" + (fileLoggerSettings.isCompressOldFiles()
? ".gz"
: ""));
- policy = rollingPolicy;
+ rollingPolicy = timeBasedRollingPolicy;
+ triggeringPolicy = dailyTriggeringPolicy;
}
else
{
SizeTriggeringPolicy sizeTriggeringPolicy = new
SizeTriggeringPolicy(fileLoggerSettings.isRollOnRestart(),
fileLoggerSettings.getMaxFileSize());
sizeTriggeringPolicy.setContext(loggerContext);
- SimpleRollingPolicy rollingPolicy = new
SimpleRollingPolicy(fileLoggerSettings.getMaxHistory());
- rollingPolicy.setFileNamePattern(fileLoggerSettings.getFileName()
+ ".%i" + (fileLoggerSettings.isCompressOldFiles() ? ".gz" : ""));
- appender.setTriggeringPolicy(sizeTriggeringPolicy);
- sizeTriggeringPolicy.start();
- policy = rollingPolicy;
+ SimpleRollingPolicy simpleRollingPolicy = new
SimpleRollingPolicy(fileLoggerSettings.getMaxHistory());
+
simpleRollingPolicy.setFileNamePattern(fileLoggerSettings.getFileName() + ".%i"
+ (fileLoggerSettings.isCompressOldFiles() ? ".gz" : ""));
+ rollingPolicy = simpleRollingPolicy;
+ triggeringPolicy = sizeTriggeringPolicy;
}
- policy.setContext(loggerContext);
- RollingPolicyDecorator decorator = new RollingPolicyDecorator(policy,
fileLoggerSettings.getRolloverListener(),
fileLoggerSettings.getExecutorService());
+
+ rollingPolicy.setContext(loggerContext);
+ RollingPolicyDecorator decorator = new
RollingPolicyDecorator(rollingPolicy, fileLoggerSettings.getRolloverListener(),
fileLoggerSettings.getExecutorService());
decorator.setParent(appender);
appender.setRollingPolicy(decorator);
+ appender.setTriggeringPolicy(triggeringPolicy);
decorator.start();
+ triggeringPolicy.start();
final PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setPattern(fileLoggerSettings.getLayout());
Modified:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostFileLogger.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostFileLogger.java?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostFileLogger.java
(original)
+++
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostFileLogger.java
Thu Jul 2 13:30:52 2015
@@ -22,6 +22,8 @@ package org.apache.qpid.server.logging;
import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
import org.apache.qpid.server.model.DerivedAttribute;
import org.apache.qpid.server.model.ManagedAttribute;
@@ -59,8 +61,14 @@ public interface VirtualHostFileLogger<X
String getLayout();
@DerivedAttribute
- Collection<String> getRolledFiles();
+ Collection<LogFileDetails> getLogFiles();
@ManagedOperation(nonModifying = true)
Content getFile(@Param(name = "fileName") String fileName);
+
+ @ManagedOperation(nonModifying = true)
+ Content getFiles(@Param(name = "fileName") Set<String> fileName);
+
+ @ManagedOperation(nonModifying = true)
+ Content getAllFiles();
}
Modified:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostFileLoggerImpl.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostFileLoggerImpl.java?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostFileLoggerImpl.java
(original)
+++
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/VirtualHostFileLoggerImpl.java
Thu Jul 2 13:30:52 2015
@@ -20,9 +20,10 @@
*/
package org.apache.qpid.server.logging;
-import java.security.Principal;
+import java.security.AccessControlException;
import java.util.Collection;
import java.util.Map;
+import java.util.Set;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@@ -35,14 +36,14 @@ import org.apache.qpid.server.logging.lo
import org.apache.qpid.server.model.ManagedAttributeField;
import org.apache.qpid.server.model.ManagedObjectFactoryConstructor;
import org.apache.qpid.server.model.Content;
+import org.apache.qpid.server.model.Param;
import org.apache.qpid.server.model.VirtualHost;
import org.apache.qpid.server.util.DaemonThreadFactory;
public class VirtualHostFileLoggerImpl extends
AbstractVirtualHostLogger<VirtualHostFileLoggerImpl> implements
VirtualHostFileLogger<VirtualHostFileLoggerImpl>, FileLoggerSettings
{
- private final Principal _principal;
- private final RolloverWatcher _rolloverWatcher;
- private final ScheduledExecutorService _rolledPolicyExecutor;
+ private RolloverWatcher _rolloverWatcher;
+ private ScheduledExecutorService _rolledPolicyExecutor;
@ManagedAttributeField
private String _layout;
@@ -65,9 +66,15 @@ public class VirtualHostFileLoggerImpl e
protected VirtualHostFileLoggerImpl(final Map<String, Object> attributes,
VirtualHost<?,?,?> virtualHost)
{
super(attributes, virtualHost);
- _principal = virtualHost.getPrincipal();
- _rolloverWatcher = new RolloverWatcher();
+ }
+
+ @Override
+ protected void postResolveChildren()
+ {
+ _rolloverWatcher = new RolloverWatcher(getFileName());
_rolledPolicyExecutor = Executors.newSingleThreadScheduledExecutor(new
DaemonThreadFactory("RolledFileScanner-" + getName()));
+
+ super.postResolveChildren();
}
@Override
@@ -113,15 +120,43 @@ public class VirtualHostFileLoggerImpl e
}
@Override
- public Collection<String> getRolledFiles()
+ public Collection<LogFileDetails> getLogFiles()
{
- return _rolloverWatcher.getRolledFiles();
+ return _rolloverWatcher.getLogFileDetails();
}
@Override
public Content getFile(final String fileName)
{
- return _rolloverWatcher.getTypedContent(fileName,
_fileName.equals(fileName));
+ if (!getSecurityManager().authoriseLogsAccess(this))
+ {
+ throw new AccessControlException("Permission denied to access log
content");
+ }
+
+ return _rolloverWatcher.getFileContent(fileName);
+ }
+
+ @Override
+ public Content getFiles(@Param(name = "fileName") Set<String> fileName)
+ {
+ if (!getSecurityManager().authoriseLogsAccess(this))
+ {
+ throw new AccessControlException("Permission denied to access log
content");
+ }
+
+ return _rolloverWatcher.getFilesAsZippedContent(fileName);
+ }
+
+
+ @Override
+ public Content getAllFiles()
+ {
+ if (!getSecurityManager().authoriseLogsAccess(this))
+ {
+ throw new AccessControlException("Permission denied to access log
content");
+ }
+
+ return _rolloverWatcher.getAllFilesAsZippedContent();
}
@Override
Copied:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/ZippedContent.java
(from r1688819,
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/logback/PathTypedContent.java)
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/ZippedContent.java?p2=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/ZippedContent.java&p1=qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/logback/PathTypedContent.java&r1=1688819&r2=1688825&rev=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/logback/PathTypedContent.java
(original)
+++
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/ZippedContent.java
Thu Jul 2 13:30:52 2015
@@ -18,61 +18,74 @@
* under the License.
*
*/
-package org.apache.qpid.server.logging.logback;
+package org.apache.qpid.server.logging;
-import java.io.FileNotFoundException;
+import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.text.Format;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+import org.apache.qpid.server.model.Content;
import org.apache.qpid.server.model.CustomRestHeaders;
import org.apache.qpid.server.model.RestContentHeader;
-import org.apache.qpid.server.model.Content;
-public class PathTypedContent implements Content, CustomRestHeaders
+public class ZippedContent implements Content, CustomRestHeaders
{
- private final Path _path;
- private final String _contentType;
+ private static final Format FORMAT = new
SimpleDateFormat("YYYY-MM-dd-HHmmss");
+ private static final String DISPOSITION = "attachment;
filename=\"log-files-%s.zip\"";
+
+ private final Map<String, Path> _paths;
private final String _disposition;
- private final long _contentSize;
- public PathTypedContent(Path path, String contentType)
+
+ public ZippedContent(Map<String, Path> paths)
{
- _path = path;
- _contentType = contentType;
- _disposition = _path == null ? "attachment" : "attachment;
filename=\"" + _path.getFileName().toString() + "\"";
- _contentSize = _path == null ? 0 : _path.toFile().length();
+ _paths = paths;
+ _disposition = String.format(DISPOSITION, FORMAT.format(new Date()));
}
- @RestContentHeader("Content-Type")
- public String getContentType()
+ @Override
+ public void write(OutputStream outputStream) throws IOException
{
- return _contentType;
+ try(ZipOutputStream out = new ZipOutputStream(outputStream))
+ {
+ for (Map.Entry<String, Path> entry: _paths.entrySet())
+ {
+ addLogFileEntry(entry.getKey(), entry.getValue(), out);
+ }
+ }
}
- @RestContentHeader("Content-Length")
- public long getContentLength()
+ private void addLogFileEntry(String zipEntryName, Path path,
ZipOutputStream out) throws IOException
{
- return _contentSize;
+ File file = path.toFile();
+ if (file.exists())
+ {
+ ZipEntry entry = new ZipEntry(zipEntryName);
+ entry.setSize(file.length());
+ out.putNextEntry(entry);
+ Files.copy(path, out);
+ out.closeEntry();
+ }
+ out.flush();
}
- @RestContentHeader("Content-Disposition")
- public String getContentDisposition()
+ @RestContentHeader("Content-Type")
+ public String getContentType()
{
- return _disposition;
+ return "application/x-zip";
}
- @Override
- public void write(OutputStream outputStream) throws IOException
+ @RestContentHeader("Content-Disposition")
+ public String getContentDisposition()
{
- if (_path != null && _path.toFile().exists())
- {
- Files.copy(_path, outputStream);
- }
- else
- {
- throw new FileNotFoundException();
- }
+ return _disposition;
}
}
Modified:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/logback/RolloverWatcher.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/logback/RolloverWatcher.java?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/logback/RolloverWatcher.java
(original)
+++
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/logging/logback/RolloverWatcher.java
Thu Jul 2 13:30:52 2015
@@ -22,17 +22,30 @@ package org.apache.qpid.server.logging.l
import java.io.File;
import java.nio.file.Path;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+import org.apache.qpid.server.logging.LogFileDetails;
+import org.apache.qpid.server.logging.PathContent;
+import org.apache.qpid.server.logging.ZippedContent;
+import org.apache.qpid.server.model.Content;
public class RolloverWatcher implements RollingPolicyDecorator.RolloverListener
{
+ private final Path _activeFilePath;
private volatile Collection<String> _rolledFiles;
private volatile Path _baseFolder;
- public RolloverWatcher()
+ public RolloverWatcher(final String activeFileName)
{
+ _activeFilePath = new File(activeFileName).toPath();
_rolledFiles = Collections.emptyList();
}
@@ -43,23 +56,30 @@ public class RolloverWatcher implements
_baseFolder = baseFolder;
}
- public PathTypedContent getTypedContent(String fileName, boolean
activeFile)
+ public PathContent getFileContent(String fileName)
{
if (fileName == null)
{
throw new IllegalArgumentException("File name cannot be null");
}
+ Path path = getPath(fileName);
+ return new PathContent(path, getContentType(fileName));
+ }
+
+ private Path getPath(String fileName)
+ {
Path path = null;
- if (activeFile)
+ File active = _activeFilePath.toFile();
+ if (fileName.equals(active.getName()))
{
- path = new File(fileName).toPath();
+ path = active.toPath();
}
else if (_rolledFiles.contains(fileName))
{
path = _baseFolder.resolve(fileName);
}
- return new PathTypedContent(path, getContentType(fileName));
+ return path;
}
public Collection<String> getRolledFiles()
@@ -67,6 +87,44 @@ public class RolloverWatcher implements
return _rolledFiles;
}
+ public List<LogFileDetails> getLogFileDetails()
+ {
+ List<LogFileDetails> results = new ArrayList<>();
+ results.add(getFileDetails(_activeFilePath));
+ List<String> rolledFiles = new ArrayList<>(_rolledFiles);
+ for (String fileName : rolledFiles)
+ {
+ Path file = _baseFolder.resolve(fileName);
+ LogFileDetails details = getFileDetails(file);
+ results.add(details);
+ }
+ return results;
+ }
+
+ private LogFileDetails getFileDetails(Path path)
+ {
+ File file = path.toFile();
+ return new LogFileDetails(getDisplayName(path), file.lastModified(),
file.length());
+ }
+
+ private String getDisplayName(Path path)
+ {
+ String displayName = path.getFileName().toString();
+ if (!_activeFilePath.equals(path) && (_baseFolder != null))
+ {
+ try
+ {
+ displayName = _baseFolder.relativize(path).toString();
+ }
+ catch (IllegalArgumentException e)
+ {
+ // active file might not be relative to root
+ // returning a file name
+ }
+ }
+ return displayName;
+ }
+
public String getContentType(String fileName)
{
String fileNameLower = fileName.toLowerCase();
@@ -83,4 +141,27 @@ public class RolloverWatcher implements
return "text/plain";
}
}
+
+ public ZippedContent getFilesAsZippedContent(Set<String> fileNames)
+ {
+ Map<String, Path> paths = new TreeMap<>();
+ for (String name: fileNames)
+ {
+ Path filePath = getPath(name);
+ if (filePath != null)
+ {
+ paths.put(name, filePath);
+ }
+ }
+
+ return new ZippedContent(paths);
+ }
+
+ public ZippedContent getAllFilesAsZippedContent()
+ {
+ Set<String> fileNames = new HashSet<>(_rolledFiles);
+ fileNames.add(getDisplayName(_activeFilePath));
+
+ return getFilesAsZippedContent(fileNames);
+ }
}
Modified:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SecurityManager.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SecurityManager.java?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SecurityManager.java
(original)
+++
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SecurityManager.java
Thu Jul 2 13:30:52 2015
@@ -633,13 +633,16 @@ public class SecurityManager
}
}
- public boolean authoriseLogsAccess()
+ public boolean authoriseLogsAccess(ConfiguredObject configuredObject)
{
+ Class<? extends ConfiguredObject> categoryClass =
configuredObject.getCategoryClass();
+ final ObjectType objectType =
getACLObjectTypeManagingConfiguredObjectOfCategory(categoryClass);
+ final ObjectProperties objectProperties = objectType == BROKER ?
ObjectProperties.EMPTY : new
ObjectProperties((String)configuredObject.getAttribute(ConfiguredObject.NAME));
return checkAllPlugins(new AccessCheck()
{
Result allowed(AccessControl plugin)
{
- return plugin.authorise(ACCESS_LOGS, BROKER,
ObjectProperties.EMPTY);
+ return plugin.authorise(ACCESS_LOGS, objectType,
objectProperties);
}
});
}
Modified:
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/access/ObjectType.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/access/ObjectType.java?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/access/ObjectType.java
(original)
+++
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/access/ObjectType.java
Thu Jul 2 13:30:52 2015
@@ -43,7 +43,7 @@ public enum ObjectType
{
ALL(Operation.ALL),
VIRTUALHOSTNODE(Operation.ALL, CREATE, DELETE, UPDATE),
- VIRTUALHOST(Operation.ALL, ACCESS, CREATE, DELETE, UPDATE),
+ VIRTUALHOST(Operation.ALL, ACCESS, CREATE, DELETE, UPDATE, ACCESS_LOGS),
MANAGEMENT(Operation.ALL, ACCESS),
QUEUE(Operation.ALL, CREATE, DELETE, PURGE, CONSUME, UPDATE),
EXCHANGE(Operation.ALL, ACCESS, CREATE, DELETE, BIND, UNBIND, PUBLISH,
UPDATE),
Modified:
qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/VirtualHostLoggerTest.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/VirtualHostLoggerTest.java?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/VirtualHostLoggerTest.java
(original)
+++
qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/VirtualHostLoggerTest.java
Thu Jul 2 13:30:52 2015
@@ -25,12 +25,15 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.File;
+import java.util.Collection;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.Appender;
import org.apache.qpid.server.store.DurableConfigurationStore;
+import org.apache.qpid.util.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -53,6 +56,7 @@ public class VirtualHostLoggerTest exte
{
private VirtualHost<?,?,?> _virtualHost;
private TaskExecutor _taskExecutor;
+ private File _baseFolder;
private File _logFile;
@Override
@@ -94,10 +98,11 @@ public class VirtualHostLoggerTest exte
_virtualHost = new TestMemoryVirtualHost(attributes, node);
_virtualHost.open();
- _logFile = new File(TMP_FOLDER, "tmp-virtual-host.log." +
System.currentTimeMillis());
- if (_logFile.exists())
+ _baseFolder = new File(TMP_FOLDER, "test-sub-folder");
+ _logFile = new File(_baseFolder, "tmp-virtual-host.log." +
System.currentTimeMillis());
+ if (_baseFolder.exists())
{
- assertTrue(String.format("Log file '%s' is not deleted in setUp",
_logFile.getPath()), _logFile.delete());
+ FileUtils.delete(_baseFolder, true);
}
}
@@ -108,9 +113,9 @@ public class VirtualHostLoggerTest exte
{
_virtualHost.close();
_taskExecutor.stopImmediately();
- if (_logFile != null && _logFile.exists())
+ if (_baseFolder != null && _baseFolder.exists())
{
- _logFile.delete();
+ FileUtils.delete(_baseFolder, true);
}
}
finally
@@ -119,13 +124,28 @@ public class VirtualHostLoggerTest exte
}
}
- public void testAddLogger()
+ public void testAddLoggerWithDefaultSettings()
{
VirtualHostLogger logger = createVirtualHostLogger();
assertTrue("Unexpected logger created " + logger, logger instanceof
VirtualHostFileLogger);
assertEquals("Unexpected log file", _logFile.getPath(),
((VirtualHostFileLogger<?>) logger).getFileName());
assertEquals("Unexpected state on creation", State.ACTIVE,
logger.getState());
+ assertTrue("Log file does not exists", _logFile.exists());
+
+ Appender<ILoggingEvent> appender = ((ch.qos.logback.classic.Logger)
LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME))
+ .getAppender(logger.getName());
+ assertTrue("Appender was not started", appender.isStarted());
+ }
+
+ public void testAddLoggerWithRollDailyOn()
+ {
+ VirtualHostLogger logger =
createVirtualHostLogger(Collections.<String, Object>singletonMap("rollDaily",
true));
+
+ assertTrue("Unexpected logger created " + logger, logger instanceof
VirtualHostFileLogger);
+ assertEquals("Unexpected log file", _logFile.getPath(),
((VirtualHostFileLogger<?>) logger).getFileName());
+ assertEquals("Unexpected state on creation", State.ACTIVE,
logger.getState());
+ assertTrue("Log file does not exists", _logFile.exists());
Appender<ILoggingEvent> appender = ((ch.qos.logback.classic.Logger)
LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME))
.getAppender(logger.getName());
@@ -168,10 +188,29 @@ public class VirtualHostLoggerTest exte
assertNull("Appender was not deleted", appender);
}
+ public void testGetLogFiles()
+ {
+ VirtualHostFileLogger logger =
(VirtualHostFileLogger)createVirtualHostLogger();
+
+ Collection<LogFileDetails> logFileDetails = logger.getLogFiles();
+ assertEquals("File details should not be empty", 1,
logFileDetails.size());
+
+ for(LogFileDetails logFile : logFileDetails)
+ {
+ assertEquals("Unexpected log name", _logFile.getName(),
logFile.getName());
+ assertEquals("Unexpected log name", 0, logFile.getSize());
+ assertEquals("Unexpected log name", _logFile.lastModified(),
logFile.getLastModified());
+ }
+ }
private VirtualHostLogger createVirtualHostLogger()
{
- Map<String, Object> attributes = new HashMap<>();
+ return createVirtualHostLogger(Collections.<String,Object>emptyMap());
+ }
+
+ private VirtualHostLogger createVirtualHostLogger(Map<String, Object>
additionalAttributes)
+ {
+ Map<String, Object> attributes = new HashMap<>(additionalAttributes);
attributes.put(VirtualHostLogger.NAME, getTestName());
attributes.put(ConfiguredObject.TYPE, VirtualHostFileLogger.TYPE);
attributes.put(VirtualHostFileLogger.FILE_NAME, _logFile.getPath());
Modified:
qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/logback/RolloverWatcherTest.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/logback/RolloverWatcherTest.java?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/logback/RolloverWatcherTest.java
(original)
+++
qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/logging/logback/RolloverWatcherTest.java
Thu Jul 2 13:30:52 2015
@@ -21,14 +21,15 @@
package org.apache.qpid.server.logging.logback;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
+import java.io.*;
import java.nio.file.Path;
-import java.util.Arrays;
-import java.util.HashSet;
-
+import java.util.*;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+import org.apache.qpid.server.logging.LogFileDetails;
+import org.apache.qpid.server.logging.PathContent;
+import org.apache.qpid.server.logging.ZippedContent;
import org.apache.qpid.server.model.Content;
import org.apache.qpid.test.utils.QpidTestCase;
import org.apache.qpid.test.utils.TestFileUtils;
@@ -38,12 +39,14 @@ public class RolloverWatcherTest extends
{
private RolloverWatcher _rolloverWatcher;
private File _baseFolder;
+ private File _activeFile;
public void setUp() throws Exception
{
super.setUp();
- _rolloverWatcher = new RolloverWatcher();
_baseFolder = TestFileUtils.createTestDirectory("rollover", true);
+ _activeFile = new File(_baseFolder, "test.log");
+ _rolloverWatcher = new RolloverWatcher(_activeFile.toString());
}
@Override
@@ -70,21 +73,20 @@ public class RolloverWatcherTest extends
{
_rolloverWatcher.onRollover(_baseFolder.toPath(), new String[]{});
- final File activeFile = new File(_baseFolder, "test.log");
- TestFileUtils.saveTextContentInFile("test", activeFile);
- PathTypedContent content =
_rolloverWatcher.getTypedContent(activeFile.getAbsolutePath(), true);
+ TestFileUtils.saveTextContentInFile("test", _activeFile);
+ PathContent content =
_rolloverWatcher.getFileContent(_activeFile.getName());
assertEquals("Unexpected content type", "text/plain",
content.getContentType());
assertEquals("Unexpected data", "test", readContent(content));
assertEquals("Unexpected size", 4, content.getContentLength());
- assertEquals("Unexpected content disposition", "attachment;
filename=\"" + activeFile.getName().toString() + "\"",
content.getContentDisposition());
+ assertEquals("Unexpected content disposition", "attachment;
filename=\"" + _activeFile.getName().toString() + "\"",
content.getContentDisposition());
}
public void testGetTypedForNullFile() throws Exception
{
try
{
- _rolloverWatcher.getTypedContent(null, true);
+ _rolloverWatcher.getFileContent(null);
fail("IllegalArgumentException is expected for null file name");
}
catch (IllegalArgumentException e)
@@ -100,7 +102,7 @@ public class RolloverWatcherTest extends
TestFileUtils.saveTextContentInFile("test.gz", new File(_baseFolder,
"test1.gz"));
- PathTypedContent content =
_rolloverWatcher.getTypedContent("test1.gz", false);
+ PathContent content = _rolloverWatcher.getFileContent("test1.gz");
assertEquals("Unexpected content type", "application/x-gzip",
content.getContentType());
assertEquals("Unexpected data", "test.gz", readContent(content));
@@ -114,7 +116,7 @@ public class RolloverWatcherTest extends
Path baseFolder = new File(getTestName()).toPath();
_rolloverWatcher.onRollover(baseFolder, files);
- PathTypedContent content =
_rolloverWatcher.getTypedContent("test3.zip", false);
+ PathContent content = _rolloverWatcher.getFileContent("test3.zip");
assertEquals("Unexpected content type", "application/x-zip",
content.getContentType());
assertEquals("Unexpected content disposition", "attachment",
content.getContentDisposition());
@@ -137,6 +139,117 @@ public class RolloverWatcherTest extends
assertEquals("Unexpected content type for zip file",
"application/x-zip", _rolloverWatcher.getContentType("test.zip"));
}
+ public void testGetLogFileDetails() throws Exception
+ {
+ String[] files = createTestRolledFilesAndNotifyWatcher();
+
+ List<LogFileDetails> logFileDetails =
_rolloverWatcher.getLogFileDetails();
+ final int expectedNumberOfEntries = files.length + 1; // add one for
the active file
+ assertEquals("getLogFileDetails returned unexpected number of
entries", expectedNumberOfEntries, logFileDetails.size());
+
+ List<String> expectedFiles = new ArrayList<>(Arrays.asList(files));
+ expectedFiles.add(_activeFile.getName());
+
+ for (String expectedFileName : expectedFiles)
+ {
+ boolean found = false;
+ for (LogFileDetails details : logFileDetails)
+ {
+ if (details.getName().equals(expectedFileName))
+ {
+ found = true;
+ final File file = new File(_baseFolder, expectedFileName);
+ assertEquals("FileDetail for \"" + expectedFileName + "\"
has unexpected lastModified time", file.lastModified(),
details.getLastModified());
+ assertEquals("FileDetail for \"" + expectedFileName + "\"
has unexpected size", file.length(), details.getSize());
+ break;
+ }
+ }
+ assertTrue("File \"" + expectedFileName + "\" expected but not
found in logFileDetails", found);
+ }
+ }
+
+ public void testGetFilesAsZippedContentWithNonLogFile() throws Exception
+ {
+ String[] fileNames = createTestRolledFilesAndNotifyWatcher();
+ String nonLogFileName = "nonLogFile.txt";
+ TestFileUtils.saveTextContentInFile(nonLogFileName, new
File(_baseFolder, nonLogFileName));
+
+ String[] requestedFiles = new String[]{ fileNames[0], fileNames[2],
nonLogFileName };
+ String[] expectedFiles = new String[]{ fileNames[0], fileNames[2] };
+
+ ZippedContent content = _rolloverWatcher.getFilesAsZippedContent(new
HashSet<>(Arrays.asList(requestedFiles)));
+ assertZippedContent(expectedFiles, content);
+ }
+
+ public void testGetFilesAsZippedContent() throws Exception
+ {
+ String[] fileNames = createTestRolledFilesAndNotifyWatcher();
+ String[] requestedFiles = new String[]{ fileNames[0], fileNames[2] };
+
+ ZippedContent content = _rolloverWatcher.getFilesAsZippedContent(new
HashSet<>(Arrays.asList(requestedFiles)));
+ assertZippedContent(requestedFiles, content);
+ }
+
+ public void testGetFilesAsZippedContentWithNonExistingFile() throws
Exception
+ {
+ String[] fileNames = createTestRolledFilesAndNotifyWatcher();
+ new File(_baseFolder, fileNames[2]).delete();
+ String[] requestedFiles = new String[]{ fileNames[0], fileNames[2] };
+ String[] expectedFiles = new String[]{ fileNames[0] };
+
+ ZippedContent content = _rolloverWatcher.getFilesAsZippedContent(new
HashSet<>(Arrays.asList(requestedFiles)));
+ assertZippedContent(expectedFiles, content);
+ }
+
+ public void testGetAllFilesAsZippedContent() throws Exception
+ {
+ String[] fileNames = createTestRolledFilesAndNotifyWatcher();
+
+ ZippedContent content = _rolloverWatcher.getAllFilesAsZippedContent();
+ assertZippedContent(fileNames, content);
+ }
+
+ private String[] createTestRolledFilesAndNotifyWatcher()
+ {
+ String[] fileNames = {"test1.gz", "test2.gz", "test3.gz"};
+ for (String fileName : fileNames)
+ {
+ TestFileUtils.saveTextContentInFile(fileName, new
File(_baseFolder, fileName));
+ }
+ _rolloverWatcher.onRollover(_baseFolder.toPath(), fileNames);
+ return fileNames;
+ }
+
+ private void assertZippedContent(String[] expectedZipEntries,
ZippedContent zippedContent) throws IOException
+ {
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ zippedContent.write(outputStream);
+
+ byte[] zipFileContent = outputStream.toByteArray();
+ ZipInputStream zipInputStream = new ZipInputStream(new
ByteArrayInputStream(zipFileContent));
+
+ byte[] buffer = new byte[10];
+ Map<String, String> unzippedContent = new HashMap<>();
+ ZipEntry zipEntry;
+ while ((zipEntry = zipInputStream.getNextEntry()) != null)
+ {
+ int len = 0;
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ while ((len = zipInputStream.read(buffer)) > 0)
+ {
+ output.write(buffer, 0, len);
+ }
+ unzippedContent.put(zipEntry.getName(), new
String(output.toByteArray()));
+ }
+
+ assertEquals("ZippedContent has unexpected number of entries.",
expectedZipEntries.length, unzippedContent.size());
+ for (String fileName : expectedZipEntries)
+ {
+ assertTrue("ZippedContent does not contain expected file \"" +
fileName + "\".", unzippedContent.containsKey(fileName));
+ assertEquals("ZippedContent entry \"" + fileName + "\" has
unexpected content.", fileName, unzippedContent.get(fileName));
+ }
+ }
+
private String readContent(Content content) throws IOException
{
ByteArrayOutputStream os = new ByteArrayOutputStream();
Modified:
qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/security/SecurityManagerTest.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/security/SecurityManagerTest.java?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/security/SecurityManagerTest.java
(original)
+++
qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/security/SecurityManagerTest.java
Thu Jul 2 13:30:52 2015
@@ -21,6 +21,7 @@
package org.apache.qpid.server.security;
import static org.apache.qpid.server.security.access.ObjectType.BROKER;
+import static org.apache.qpid.server.security.access.ObjectType.VIRTUALHOST;
import static org.apache.qpid.server.security.access.Operation.ACCESS_LOGS;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
@@ -964,7 +965,7 @@ public class SecurityManagerTest extends
ObjectProperties properties = new OperationLoggingDetails(description);
assertDeleteAuthorization(configuredObject, Operation.CONFIGURE,
ObjectType.BROKER,
- properties, parent );
+ properties, parent);
}
private void assertAuthorization(Operation operation, ConfiguredObject<?>
configuredObject, Operation aclOperation, ObjectType aclObjectType,
ObjectProperties expectedProperties, ConfiguredObject... objects)
@@ -1045,17 +1046,30 @@ public class SecurityManagerTest extends
verify(_accessControl, times(2)).authorise(eq(aclOperation),
eq(aclObjectType), eq(expectedProperties));
}
- public void testAuthoriseLogsAccess()
+ public void testAuthoriseLogsAccessOnBroker()
{
configureAccessPlugin(Result.ALLOWED);
- assertTrue(_securityManager.authoriseLogsAccess());
+ assertTrue(_securityManager.authoriseLogsAccess(_broker));
+
verify(_accessControl).authorise(ACCESS_LOGS, BROKER,
ObjectProperties.EMPTY);
configureAccessPlugin(Result.DENIED);
- assertFalse(_securityManager.authoriseLogsAccess());
+ assertFalse(_securityManager.authoriseLogsAccess(_broker));
verify(_accessControl, times(2)).authorise(ACCESS_LOGS, BROKER,
ObjectProperties.EMPTY);
}
+ public void testAuthoriseLogsAccessOnVirtualHost()
+ {
+ configureAccessPlugin(Result.ALLOWED);
+ assertTrue(_securityManager.authoriseLogsAccess(_virtualHost));
+ ObjectProperties expectedObjectProperties = new
ObjectProperties((String)_virtualHost.getAttribute(ConfiguredObject.NAME));
+ verify(_accessControl).authorise(ACCESS_LOGS, VIRTUALHOST,
expectedObjectProperties);
+
+ configureAccessPlugin(Result.DENIED);
+ assertFalse(_securityManager.authoriseLogsAccess(_virtualHost));
+ verify(_accessControl, times(2)).authorise(ACCESS_LOGS, VIRTUALHOST,
expectedObjectProperties);
+ }
+
private void configureAccessPlugin(Result result)
{
when(_accessControl.authorise(any(Operation.class),
any(ObjectType.class), any(ObjectProperties.class))).thenReturn(result);
Modified:
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
(original)
+++
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
Thu Jul 2 13:30:52 2015
@@ -337,9 +337,6 @@ public class HttpManagement extends Abst
}
root.addServlet(new ServletHolder(new TimeZoneServlet()),
"/service/timezones");
- // QPID-6516
-// root.addServlet(new ServletHolder(new LogFileListingServlet()),
"/service/logfilenames");
-// root.addServlet(new ServletHolder(new Log FileServlet()),
"/service/logfile");
final SessionManager sessionManager =
root.getSessionHandler().getSessionManager();
sessionManager.getSessionCookieConfig().setName(JSESSIONID_COOKIE_PREFIX +
lastPort);
Modified:
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogRecordsServlet.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogRecordsServlet.java?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogRecordsServlet.java
(original)
+++
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/LogRecordsServlet.java
Thu Jul 2 13:30:52 2015
@@ -43,7 +43,7 @@ public class LogRecordsServlet extends A
@Override
protected void doGetWithSubjectAndActor(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException
{
- if (!getBroker().getSecurityManager().authoriseLogsAccess())
+ if (!getBroker().getSecurityManager().authoriseLogsAccess(getBroker()))
{
response.sendError(HttpServletResponse.SC_FORBIDDEN, "Broker logs
access is denied");
return;
Modified:
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/CategoryTabExtension.js
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/CategoryTabExtension.js?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/CategoryTabExtension.js
(original)
+++
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/CategoryTabExtension.js
Thu Jul 2 13:30:52 2015
@@ -23,17 +23,20 @@ define(["qpid/common/util",
"dojo/domReady!"],
function (util, query)
{
- function CategoryTabExtension(containerNode, template, attributesNode,
metadata, data, typeBaseFolder)
+ function CategoryTabExtension(params)
{
var that = this;
- this.base = typeBaseFolder;
- this.metadata = metadata;
- util.parse(containerNode, template,
+ this.base = params.baseUrl;
+ this.metadata = params.metadata;
+ this.management = params.management;
+ this.typeSpecificDetailsContainer = params.typeSpecificDetailsNode;
+ this.modelObj = params.modelObj;
+ util.parse(params.containerNode, params.template,
function()
{
- that.typeSpecificAttributesContainer = query("." + attributesNode,
containerNode)[0];
- that.postParse(containerNode);
- that.update(data)
+ that.typeSpecificAttributesContainer = query("." +
params.typeSpecificAttributesClassName, params.containerNode)[0];
+ that.postParse(params.containerNode);
+ that.update(params.data)
});
}
@@ -53,7 +56,15 @@ define(["qpid/common/util",
require([this.base + data.type.toLowerCase() + "/show"],
function(Details)
{
- that.details = new
Details({containerNode:that.typeSpecificAttributesContainer, metadata:
that.metadata, data:data});
+ that.details = new Details(
+ {
+ containerNode: that.typeSpecificAttributesContainer,
+ typeSpecificDetailsNode: that.typeSpecificDetailsContainer,
+ metadata: that.metadata,
+ data:data,
+ management: that.management,
+ modelObj: that.modelObj
+ });
}
);
}
Modified:
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js
(original)
+++
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js
Thu Jul 2 13:30:52 2015
@@ -476,7 +476,8 @@ define(["dojo/_base/xhr",
{
postParseCallback();
}
- });
+ },
+ function(e){console.error("Parse error:" + e);});
}
util.buildUI = function(containerNode, parent,
htmlTemplateLocation, fieldNames, obj, postParseCallback)
{
Modified:
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Logger.js
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Logger.js?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Logger.js
(original)
+++
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Logger.js
Thu Jul 2 13:30:52 2015
@@ -192,7 +192,7 @@ define(["dojo/parser",
}
}
- storeNodes(["name", "state", "type", "loggerAttributes",
"filterWarning", "durable"]);
+ storeNodes(["name", "state", "type", "loggerAttributes",
"loggerTypeSpecificDetails", "filterWarning", "durable"]);
}
Updater.prototype.update = function (callback)
@@ -236,8 +236,11 @@ define(["dojo/parser",
{
that.details = new Details({
containerNode: that.loggerAttributes,
+ typeSpecificDetailsNode: that.loggerTypeSpecificDetails,
metadata: that.tabObject.management.metadata,
- data: data
+ data: data,
+ management: that.tabObject.management,
+ modelObj: that.tabObject.modelObj
});
}
);
Added:
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/FileBrowser.js
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/FileBrowser.js?rev=1688825&view=auto
==============================================================================
---
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/FileBrowser.js
(added)
+++
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/FileBrowser.js
Thu Jul 2 13:30:52 2015
@@ -0,0 +1,157 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ *
+ */
+define(["qpid/common/util",
+ "dojo/query",
+ "dojo/number",
+ "dojo/_base/lang",
+ "dojo/_base/connect",
+ "dojox/html/entities",
+ "dojo/text!logger/file/fileBrowser.html",
+ "dojox/grid/EnhancedGrid",
+ "qpid/common/UpdatableStore",
+ "dijit/registry",
+ "dojo/domReady!"],
+ function (util, query, number, lang, connect, entities, template,
EnhancedGrid, UpdatableStore, registry)
+ {
+ function FileBrowser(params)
+ {
+ var that = this;
+ this.management = params.management;
+ this.modelObj = params.modelObj;
+ util.parse(params.containerNode, template, function()
+ {
+ that.postParse(params);
+ });
+ }
+
+ FileBrowser.prototype.postParse = function(params)
+ {
+ var that = this;
+ var gridProperties = {
+ height: 400,
+ selectionMode: "extended",
+ plugins: {
+ indirectSelection: true,
+ pagination: {
+ pageSizes: [10, 25, 50, 100],
+ description: true,
+ sizeSwitch: true,
+ pageStepper: true,
+ gotoButton: true,
+ maxPageStep: 4,
+ position: "bottom"
+ }
+ }};
+
+ this.downloadButton = registry.byNode(query(".downloadButton",
params.containerNode)[0]);
+ this.downloadButton.on("click", function(e)
{that.downloadSelectedFiles()} );
+
+ this.downloadAllButton = registry.byNode(query(".downloadAllButton",
params.containerNode)[0]);
+ this.downloadAllButton.on("click", function(e) {that.downloadAllFiles()}
);
+
+ this.logFiles = this.addIdToFileObjects(params.data);
+ this.logFileGrid = new UpdatableStore(this.logFiles,
query(".logFilesGrid", params.containerNode)[0],
+ [
+ { name: "Name", field: "name", width: "auto"},
+ { name: "Size", field: "size", width: "60px",
+ formatter: function(val)
+ {
+ return val > 1024 ? (val > 1048576? number.round(val/1048576) +
"MB": number.round(val/1024) + "KB") : val + "bytes";
+ }
+ },
+ { name: "Last Modified", field: "lastModified", width: "250px",
+ formatter: function(val)
+ {
+ return that.management.userPreferences.formatDateTime(val,
{addOffset: true, appendTimeZone: true});
+ }
+ }
+ ], function(obj) {
+ obj.grid.on("rowDblClick",
+ function(evt){
+ var idx = evt.rowIndex;
+ var theItem = this.getItem(idx);
+ that.download(theItem);
+ });
+ }, gridProperties, EnhancedGrid);
+ }
+
+ FileBrowser.prototype.download = function (item)
+ {
+ var parentModelObj = this.modelObj;
+ var modelObj = {type: parentModelObj.type, name: "getFile", parent:
parentModelObj}
+ this.management.download(modelObj, {fileName: item.name});
+ }
+
+ FileBrowser.prototype.addIdToFileObjects = function(data)
+ {
+ var fileItems = [];
+ var logFiles = data.logFiles;
+ for (var idx in logFiles)
+ {
+ var item = lang.mixin(logFiles[idx], {id: logFiles[idx].name});
+ fileItems.push(item);
+ }
+ return fileItems;
+ }
+
+ FileBrowser.prototype.downloadSelectedFiles = function ()
+ {
+ var data = this.logFileGrid.grid.selection.getSelected();
+ this.downloadFiles(data);
+ }
+
+ FileBrowser.prototype.downloadAllFiles = function()
+ {
+ var parentModelObj = this.modelObj;
+ var modelObj = {type: parentModelObj.type, name: "getAllFiles", parent:
parentModelObj}
+ this.management.download(modelObj, {});
+ }
+
+ FileBrowser.prototype.downloadFiles = function(fileItems)
+ {
+ if(fileItems.length)
+ {
+ var parentModelObj = this.modelObj;
+ var modelObj = {type: parentModelObj.type, name: "getFiles", parent:
parentModelObj}
+ var items = [];
+ for(var i = 0; i < fileItems.length; i++)
+ {
+ items.push(fileItems[i].id);
+ }
+ this.management.download(modelObj, {fileName: items});
+ }
+ }
+
+ FileBrowser.prototype.update = function (restData)
+ {
+ if (this.logFileGrid)
+ {
+ this.logFiles = this.addIdToFileObjects(restData);
+ if (this.logFileGrid.update(this.logFiles))
+ {
+ //this.logFileGrid.grid._refresh();
+ }
+ }
+ }
+
+ return FileBrowser;
+ }
+);
Modified:
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/brokerlogger/file/show.js
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/brokerlogger/file/show.js?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/brokerlogger/file/show.js
(original)
+++
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/brokerlogger/file/show.js
Thu Jul 2 13:30:52 2015
@@ -19,18 +19,29 @@
*
*/
define(["qpid/common/util",
- "dojo/query",
- "dojox/html/entities",
"dojo/text!logger/file/show.html",
"qpid/common/TypeTabExtension",
+ "qpid/management/logger/FileBrowser",
"dojo/domReady!"],
- function (util, query, entities, template, TypeTabExtension)
+ function (util, template, TypeTabExtension, FileBrowser)
{
function BrokerFileLogger(params)
{
+ this.fileBrowser = new FileBrowser({containerNode:
params.typeSpecificDetailsNode,
+ management: params.management,
+ data: params.data,
+ modelObj: params.modelObj});
TypeTabExtension.call(this, params.containerNode, template,
"BrokerLogger", "File", params.metadata, params.data);
}
- return util.extend(BrokerFileLogger, TypeTabExtension);
+ util.extend(BrokerFileLogger, TypeTabExtension);
+
+ BrokerFileLogger.prototype.update = function (restData)
+ {
+ TypeTabExtension.prototype.update.call(this, restData);
+ this.fileBrowser.update(restData);
+ }
+
+ return BrokerFileLogger;
}
);
Modified:
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/brokerlogger/show.js
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/brokerlogger/show.js?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/brokerlogger/show.js
(original)
+++
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/brokerlogger/show.js
Thu Jul 2 13:30:52 2015
@@ -20,14 +20,20 @@
*/
define(["qpid/common/util",
"dojo/query",
+ "dojo/_base/lang",
"dojo/text!logger/brokerlogger/show.html",
"qpid/common/CategoryTabExtension",
"dojo/domReady!"],
- function (util, query, template, CategoryTabExtension)
+ function (util, query, lang, template, CategoryTabExtension)
{
function BrokerLogger(params)
{
- CategoryTabExtension.call(this, params.containerNode, template,
"typeSpecificAttributes", params.metadata, params.data,
"qpid/management/logger/brokerlogger/");
+ var categoryExtensionParams = lang.mixin(params, {
+ template: template,
+
typeSpecificAttributesClassName: "typeSpecificAttributes",
+ baseUrl:
"qpid/management/logger/brokerlogger/"
+ });
+ CategoryTabExtension.call(this, categoryExtensionParams);
}
util.extend(BrokerLogger, CategoryTabExtension);
Modified:
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/virtualhostlogger/file/show.js
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/virtualhostlogger/file/show.js?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/virtualhostlogger/file/show.js
(original)
+++
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/virtualhostlogger/file/show.js
Thu Jul 2 13:30:52 2015
@@ -19,18 +19,29 @@
*
*/
define(["qpid/common/util",
- "dojo/query",
- "dojox/html/entities",
"dojo/text!logger/file/show.html",
"qpid/common/TypeTabExtension",
+ "qpid/management/logger/FileBrowser",
"dojo/domReady!"],
- function (util, query, entities, template, TypeTabExtension)
+ function (util, template, TypeTabExtension, FileBrowser)
{
function VirtualHostFileLogger(params)
{
+ this.fileBrowser = new FileBrowser({containerNode:
params.typeSpecificDetailsNode,
+ management: params.management,
+ data: params.data,
+ modelObj: params.modelObj});
TypeTabExtension.call(this, params.containerNode, template,
"VirtualHostLogger", "File", params.metadata, params.data);
}
- return util.extend(VirtualHostFileLogger, TypeTabExtension);
+ util.extend(VirtualHostFileLogger, TypeTabExtension);
+
+ VirtualHostFileLogger.prototype.update = function (restData)
+ {
+ TypeTabExtension.prototype.update.call(this, restData);
+ this.fileBrowser.update(restData);
+ }
+
+ return VirtualHostFileLogger;
}
);
Modified:
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/virtualhostlogger/show.js
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/virtualhostlogger/show.js?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/virtualhostlogger/show.js
(original)
+++
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logger/virtualhostlogger/show.js
Thu Jul 2 13:30:52 2015
@@ -20,14 +20,20 @@
*/
define(["qpid/common/util",
"dojo/query",
+ "dojo/_base/lang",
"dojo/text!logger/virtualhostlogger/show.html",
"qpid/common/CategoryTabExtension",
"dojo/domReady!"],
- function (util, query, template, CategoryTabExtension)
+ function (util, query, lang, template, CategoryTabExtension)
{
function VirtualHostLogger(params)
{
- CategoryTabExtension.call(this, params.containerNode, template,
"typeSpecificAttributes", params.metadata, params.data,
"qpid/management/logger/virtualhostlogger/");
+ var categoryExtensionParams = lang.mixin(params, {
+ template: template,
+
typeSpecificAttributesClassName: "typeSpecificAttributes",
+ baseUrl:
"qpid/management/logger/virtualhostlogger/"
+ });
+ CategoryTabExtension.call(this, categoryExtensionParams);
}
return util.extend(VirtualHostLogger, CategoryTabExtension);
Modified:
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logs/LogViewer.js
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logs/LogViewer.js?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logs/LogViewer.js
(original)
+++
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/js/qpid/management/logs/LogViewer.js
Thu Jul 2 13:30:52 2015
@@ -25,10 +25,9 @@ define(["dojo/_base/xhr",
"dijit/registry",
"qpid/common/grid/GridUpdater",
"qpid/common/grid/UpdatableGrid",
- "qpid/management/logs/LogFileDownloadDialog",
"dojo/text!../../../logs/showLogViewer.html",
"dojo/domReady!"],
- function (xhr, parser, query, locale, registry, GridUpdater,
UpdatableGrid, LogFileDownloadDialog, markup) {
+ function (xhr, parser, query, locale, registry, GridUpdater,
UpdatableGrid, markup) {
var defaulGridRowLimit = 4096;
var currentTimeZone;
@@ -65,14 +64,6 @@ define(["dojo/_base/xhr",
};
LogViewer.prototype._postParse = function()
{
- var self = this;
-
- this.downloadLogsButton =
registry.byNode(query(".downloadLogs", this.contentPane.containerNode)[0]);
- this.downloadLogDialog = new
LogFileDownloadDialog({userPreferences:this.management.userPreferences});
-
- this.downloadLogsButton.on("click", function(evt){
- self.downloadLogDialog.showDialog();
- });
this._buildGrid();
};
Copied:
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/logger/file/fileBrowser.html
(from r1688819,
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/logs/showLogFileDownloadDialog.html)
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/logger/file/fileBrowser.html?p2=qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/logger/file/fileBrowser.html&p1=qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/logs/showLogFileDownloadDialog.html&r1=1688819&r2=1688825&rev=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/logs/showLogFileDownloadDialog.html
(original)
+++
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/logger/file/fileBrowser.html
Thu Jul 2 13:30:52 2015
@@ -19,15 +19,11 @@
-
-->
<div>
- <div class="contentArea" style="height:320px;overflow:auto">
- <div><b>Select log files to download</b></div>
- <div class="logFilesGrid" style='height:300px;width: 580px'></div>
- </div>
- <div class="dijitDialogPaneActionBar qpidDialogPaneActionBar">
- <button value="Download" data-dojo-type="dijit.form.Button"
- class="downloadLogsButton"
- data-dojo-props="iconClass: 'downloadLogsIcon', label: 'Download'
"></button>
- <button value="Close" data-dojo-type="dijit.form.Button"
data-dojo-props="label: 'Close'"
- class="downloadLogsDialogCloseButton"></button>
- </div>
+ <div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Log Files'"
class="clear logFilesGridPanel">
+ <div class="logFilesGrid hidden"></div>
+ <div class="clear">
+ <button data-dojo-type="dijit.form.Button"
class="downloadButton">Download Selected</button>
+ <button data-dojo-type="dijit.form.Button"
class="downloadAllButton">Download All</button>
+ </div>
+ </div>
</div>
Modified:
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/logs/showLogViewer.html
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/logs/showLogViewer.html?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/logs/showLogViewer.html
(original)
+++
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/logs/showLogViewer.html
Thu Jul 2 13:30:52 2015
@@ -22,8 +22,5 @@
<div id="broker-logfile"></div>
<br/>
- <button data-dojo-type="dijit.form.Button" class="downloadLogs"
- data-dojo-props="iconClass: 'downloadLogsIcon',
title:'Download Log Files', name: 'downloadLogs'">Download Log Files</button>
- <br/>
</div>
Modified:
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/showLogger.html
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/showLogger.html?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/showLogger.html
(original)
+++
qpid/java/trunk/broker-plugins/management-http/src/main/java/resources/showLogger.html
Thu Jul 2 13:30:52 2015
@@ -53,6 +53,6 @@
</div>
</div>
<br/>
- <div class="loggerExtra"></div>
+ <div class="loggerTypeSpecificDetails"></div>
</div>
Modified:
qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/acl/BrokerACLTest.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/acl/BrokerACLTest.java?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/acl/BrokerACLTest.java
(original)
+++
qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/acl/BrokerACLTest.java
Thu Jul 2 13:30:52 2015
@@ -28,6 +28,7 @@ import java.util.Map;
import javax.servlet.http.HttpServletResponse;
+import org.apache.qpid.server.logging.BrokerFileLogger;
import org.apache.qpid.server.logging.BrokerMemoryLogger;
import org.apache.qpid.server.logging.BrokerNameAndLevelFilter;
import org.apache.qpid.server.management.plugin.servlet.rest.RestServlet;
@@ -74,6 +75,8 @@ public class BrokerACLTest extends QpidR
AbstractACLTestCase.writeACLFileUtil(this, "ACL ALLOW-LOG ALL ACCESS
MANAGEMENT",
"ACL ALLOW-LOG " + ALLOWED_USER + " CONFIGURE BROKER",
"ACL DENY-LOG " + DENIED_USER + " CONFIGURE BROKER",
+ "ACL ALLOW-LOG " + ALLOWED_USER + " ACCESS_LOGS BROKER",
+ "ACL DENY-LOG " + DENIED_USER + " ACCESS_LOGS BROKER",
"ACL DENY-LOG ALL ALL");
_secondaryAclFileContent =
@@ -867,6 +870,28 @@ public class BrokerACLTest extends QpidR
getRestTestHelper().submitRequest("brokerlogger/memory", "GET",
HttpServletResponse.SC_NOT_FOUND);
}
+ public void testDownloadBrokerLoggerFileAllowedDenied() throws Exception
+ {
+ final String loggerName = "testFileLogger";
+ final String loggerPath = "brokerlogger/" + loggerName;
+
+ getRestTestHelper().setUsernameAndPassword(ALLOWED_USER, ALLOWED_USER);
+
+ Map<String, Object> attributes = new HashMap<>();
+ attributes.put(BrokerLogger.NAME, loggerName);
+ attributes.put(ConfiguredObject.TYPE, BrokerFileLogger.TYPE);
+ getRestTestHelper().submitRequest("brokerlogger", "PUT", attributes,
HttpServletResponse.SC_CREATED);
+
+ getRestTestHelper().submitRequest(loggerPath +
"/getFile?fileName=qpid.log", "GET", HttpServletResponse.SC_OK);
+ getRestTestHelper().submitRequest(loggerPath +
"/getFiles?fileName=qpid.log", "GET", HttpServletResponse.SC_OK);
+ getRestTestHelper().submitRequest(loggerPath + "/getAllFiles", "GET",
HttpServletResponse.SC_OK);
+
+ getRestTestHelper().setUsernameAndPassword(DENIED_USER, DENIED_USER);
+ getRestTestHelper().submitRequest(loggerPath +
"/getFile?fileName=qpid.log", "GET", HttpServletResponse.SC_FORBIDDEN);
+ getRestTestHelper().submitRequest(loggerPath +
"/getFiles?fileName=qpid.log", "GET", HttpServletResponse.SC_FORBIDDEN);
+ getRestTestHelper().submitRequest(loggerPath + "/getAllFiles", "GET",
HttpServletResponse.SC_FORBIDDEN);
+ }
+
/* === Broker Logger Filters === */
public void testCreateBrokerLoggerFilterAllowedDenied() throws Exception
Modified:
qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/acl/VirtualHostACLTest.java
URL:
http://svn.apache.org/viewvc/qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/acl/VirtualHostACLTest.java?rev=1688825&r1=1688824&r2=1688825&view=diff
==============================================================================
---
qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/acl/VirtualHostACLTest.java
(original)
+++
qpid/java/trunk/systests/src/test/java/org/apache/qpid/systest/rest/acl/VirtualHostACLTest.java
Thu Jul 2 13:30:52 2015
@@ -26,9 +26,12 @@ import java.util.Map;
import javax.servlet.http.HttpServletResponse;
+import org.apache.qpid.server.logging.VirtualHostFileLogger;
import org.apache.qpid.server.management.plugin.HttpManagement;
+import org.apache.qpid.server.model.ConfiguredObject;
import org.apache.qpid.server.model.Plugin;
import org.apache.qpid.server.model.VirtualHost;
+import org.apache.qpid.server.model.VirtualHostLogger;
import org.apache.qpid.server.model.VirtualHostNode;
import org.apache.qpid.server.security.acl.AbstractACLTestCase;
import org.apache.qpid.server.virtualhost.ProvidedStoreVirtualHostImpl;
@@ -109,6 +112,31 @@ public class VirtualHostACLTest extends
getRestTestHelper().submitRequest("virtualhost/" + TEST2_VIRTUALHOST +
"/" + TEST2_VIRTUALHOST, "PUT", attributes, HttpServletResponse.SC_FORBIDDEN);
}
+ public void testDownloadVirtualHostLoggerFileAllowedDenied() throws
Exception
+ {
+ final String virtualHostName = "testVirtualHost";
+ final String loggerName = "testFileLogger";
+ final String loggerPath = "virtualhostlogger/" + VHN_WITHOUT_VH + "/"
+ virtualHostName + "/" + loggerName;
+
+ getRestTestHelper().setUsernameAndPassword(ALLOWED_USER, ALLOWED_USER);
+
+ createVirtualHost(VHN_WITHOUT_VH, virtualHostName);
+
+ Map<String, Object> attributes = new HashMap<>();
+ attributes.put(VirtualHostLogger.NAME, loggerName);
+ attributes.put(ConfiguredObject.TYPE, VirtualHostFileLogger.TYPE);
+ getRestTestHelper().submitRequest("virtualhostlogger/" +
VHN_WITHOUT_VH + "/" + virtualHostName, "PUT", attributes,
HttpServletResponse.SC_CREATED);
+
+ getRestTestHelper().submitRequest(loggerPath +
"/getFile?fileName=qpid.log", "GET", HttpServletResponse.SC_OK);
+ getRestTestHelper().submitRequest(loggerPath +
"/getFiles?fileName=qpid.log", "GET", HttpServletResponse.SC_OK);
+ getRestTestHelper().submitRequest(loggerPath + "/getAllFiles", "GET",
HttpServletResponse.SC_OK);
+
+ getRestTestHelper().setUsernameAndPassword(DENIED_USER, DENIED_USER);
+ getRestTestHelper().submitRequest(loggerPath +
"/getFile?fileName=qpid.log", "GET", HttpServletResponse.SC_FORBIDDEN);
+ getRestTestHelper().submitRequest(loggerPath +
"/getFiles?fileName=qpid.log", "GET", HttpServletResponse.SC_FORBIDDEN);
+ getRestTestHelper().submitRequest(loggerPath + "/getAllFiles", "GET",
HttpServletResponse.SC_FORBIDDEN);
+ }
+
/* === Utility Methods === */
private int createVirtualHost(final String testVirtualHostNode, String
virtualHostName) throws Exception
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]