Merge remote-tracking branch 'upstream/release-4.11.1' into develop

This commit is contained in:
Richard Cordovano 2019-05-06 10:00:04 -04:00
commit 616ac03da4
4 changed files with 73 additions and 28 deletions

View File

@ -50,6 +50,9 @@ final class DataSourceBrowser extends javax.swing.JPanel implements ExplorerMana
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final Logger logger = Logger.getLogger(DataSourceBrowser.class.getName()); private static final Logger logger = Logger.getLogger(DataSourceBrowser.class.getName());
private static final int COUNT_COLUMN_WIDTH = 25;
private static final int USAGE_COLUMN_WIDTH = 120;
private static final int DATA_SOURCE_COLUMN_WIDTH = 325;
private final Outline outline; private final Outline outline;
private final org.openide.explorer.view.OutlineView outlineView; private final org.openide.explorer.view.OutlineView outlineView;
private final ExplorerManager explorerManager; private final ExplorerManager explorerManager;
@ -84,6 +87,11 @@ final class DataSourceBrowser extends javax.swing.JPanel implements ExplorerMana
|| column.getHeaderValue().toString().equals(Bundle.DataSourceSummaryNode_column_results_header()) || column.getHeaderValue().toString().equals(Bundle.DataSourceSummaryNode_column_results_header())
|| column.getHeaderValue().toString().equals(Bundle.DataSourceSummaryNode_column_tags_header())) { || column.getHeaderValue().toString().equals(Bundle.DataSourceSummaryNode_column_tags_header())) {
column.setCellRenderer(rightAlignedRenderer); column.setCellRenderer(rightAlignedRenderer);
column.setPreferredWidth(COUNT_COLUMN_WIDTH);
} else if (column.getHeaderValue().toString().equals(Bundle.DataSourceSummaryNode_column_type_header())) {
column.setPreferredWidth(USAGE_COLUMN_WIDTH);
} else {
column.setPreferredWidth(DATA_SOURCE_COLUMN_WIDTH);
} }
} }
this.setVisible(true); this.setVisible(true);
@ -168,7 +176,7 @@ final class DataSourceBrowser extends javax.swing.JPanel implements ExplorerMana
*/ */
DataSource getSelectedDataSource() { DataSource getSelectedDataSource() {
Node selectedNode[] = explorerManager.getSelectedNodes(); Node selectedNode[] = explorerManager.getSelectedNodes();
if (selectedNode.length == 1 && selectedNode[0] instanceof DataSourceSummaryEntryNode) { if (selectedNode.length == 1 && selectedNode[0] instanceof DataSourceSummaryEntryNode) {
return ((DataSourceSummaryEntryNode) selectedNode[0]).getDataSource(); return ((DataSourceSummaryEntryNode) selectedNode[0]).getDataSource();
} }
return null; return null;

View File

@ -208,13 +208,15 @@ DeleteOrphanCaseNodesAction.progressDisplayName=Cleanup Case Znodes
DeleteOrphanCaseNodesTask.progress.connectingToCoordSvc=Connecting to the coordination service DeleteOrphanCaseNodesTask.progress.connectingToCoordSvc=Connecting to the coordination service
# {0} - node path # {0} - node path
DeleteOrphanCaseNodesTask.progress.deletingOrphanedCaseNode=Deleting orphaned case znode {0} DeleteOrphanCaseNodesTask.progress.deletingOrphanedCaseNode=Deleting orphaned case znode {0}
DeleteOrphanCaseNodesTask.progress.gettingCaseNodesListing=Querying coordination service for case znodes DeleteOrphanCaseNodesTask.progress.gettingCaseZnodes=Querying the coordination service for case znodes
DeleteOrphanCaseNodesTask.progress.lookingForOrphanedCaseZnodes=Looking for orphaned case znodes
DeleteOrphanCaseNodesTask.progress.startMessage=Starting orphaned case znode cleanup DeleteOrphanCaseNodesTask.progress.startMessage=Starting orphaned case znode cleanup
DeleteOrphanManifestNodesAction.progressDisplayName=Cleanup Manifest File Znodes DeleteOrphanManifestNodesAction.progressDisplayName=Cleanup Manifest File Znodes
DeleteOrphanManifestNodesTask.progress.connectingToCoordSvc=Connecting to the coordination service DeleteOrphanManifestNodesTask.progress.connectingToCoordSvc=Connecting to the coordination service
# {0} - node path # {0} - node path
DeleteOrphanManifestNodesTask.progress.deletingOrphanedManifestNode=Deleting orphaned manifest file znode {0} DeleteOrphanManifestNodesTask.progress.deletingOrphanedManifestNode=Deleting orphaned manifest file znode {0}
DeleteOrphanManifestNodesTask.progress.gettingManifestNodes=Querying the coordination service for manifest file znodes DeleteOrphanManifestNodesTask.progress.gettingManifestNodes=Querying the coordination service for manifest file znodes
DeleteOrphanManifestNodesTask.progress.lookingForOrphanedManifestFileZnodes=Looking for orphaned manifest file znodes
DeleteOrphanManifestNodesTask.progress.startMessage=Starting orphaned manifest file znode cleanup DeleteOrphanManifestNodesTask.progress.startMessage=Starting orphaned manifest file znode cleanup
HINT_CasesDashboardTopComponent=This is an adminstrative dashboard for multi-user cases HINT_CasesDashboardTopComponent=This is an adminstrative dashboard for multi-user cases
OpenAutoIngestLogAction.deletedLogErrorMsg=The case auto ingest log has been deleted. OpenAutoIngestLogAction.deletedLogErrorMsg=The case auto ingest log has been deleted.

View File

@ -20,12 +20,14 @@ package org.sleuthkit.autopsy.experimental.autoingest;
import java.io.File; import java.io.File;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List; import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
import org.openide.util.NbBundle; import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.casemodule.multiusercases.CaseNodeData;
import org.sleuthkit.autopsy.casemodule.multiusercases.CaseNodeDataCollector;
import org.sleuthkit.autopsy.casemodule.multiusercases.CoordinationServiceUtils; import org.sleuthkit.autopsy.casemodule.multiusercases.CoordinationServiceUtils;
import static org.sleuthkit.autopsy.casemodule.multiusercases.CoordinationServiceUtils.isCaseAutoIngestLogNodePath;
import static org.sleuthkit.autopsy.casemodule.multiusercases.CoordinationServiceUtils.isCaseNameNodePath;
import static org.sleuthkit.autopsy.casemodule.multiusercases.CoordinationServiceUtils.isCaseResourcesNodePath;
import org.sleuthkit.autopsy.coordinationservice.CoordinationService; import org.sleuthkit.autopsy.coordinationservice.CoordinationService;
import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.progress.ProgressIndicator; import org.sleuthkit.autopsy.progress.ProgressIndicator;
@ -38,6 +40,8 @@ final class DeleteOrphanCaseNodesTask implements Runnable {
private static final Logger logger = AutoIngestDashboardLogger.getLogger(); private static final Logger logger = AutoIngestDashboardLogger.getLogger();
private final ProgressIndicator progress; private final ProgressIndicator progress;
private int nodesCount;
private int casesCount;
/** /**
* Constucts an instance of a task for deleting case coordination service * Constucts an instance of a task for deleting case coordination service
@ -53,7 +57,8 @@ final class DeleteOrphanCaseNodesTask implements Runnable {
@NbBundle.Messages({ @NbBundle.Messages({
"DeleteOrphanCaseNodesTask.progress.startMessage=Starting orphaned case znode cleanup", "DeleteOrphanCaseNodesTask.progress.startMessage=Starting orphaned case znode cleanup",
"DeleteOrphanCaseNodesTask.progress.connectingToCoordSvc=Connecting to the coordination service", "DeleteOrphanCaseNodesTask.progress.connectingToCoordSvc=Connecting to the coordination service",
"DeleteOrphanCaseNodesTask.progress.gettingCaseNodesListing=Querying coordination service for case znodes" "DeleteOrphanCaseNodesTask.progress.gettingCaseZnodes=Querying the coordination service for case znodes",
"DeleteOrphanCaseNodesTask.progress.lookingForOrphanedCaseZnodes=Looking for orphaned case znodes"
}) })
public void run() { public void run() {
progress.start(Bundle.DeleteOrphanCaseNodesTask_progress_startMessage()); progress.start(Bundle.DeleteOrphanCaseNodesTask_progress_startMessage());
@ -68,24 +73,30 @@ final class DeleteOrphanCaseNodesTask implements Runnable {
return; return;
} }
progress.progress(Bundle.DeleteOrphanCaseNodesTask_progress_gettingCaseNodesListing()); progress.progress(Bundle.DeleteOrphanCaseNodesTask_progress_gettingCaseZnodes());
logger.log(Level.INFO, Bundle.DeleteOrphanCaseNodesTask_progress_gettingCaseNodesListing()); logger.log(Level.INFO, Bundle.DeleteOrphanCaseNodesTask_progress_gettingCaseZnodes());
List<CaseNodeData> nodeDataList; List<String> nodePaths;
try { try {
nodeDataList = CaseNodeDataCollector.getNodeData(); nodePaths = coordinationService.getNodeList(CoordinationService.CategoryNode.CASES);
} catch (CoordinationService.CoordinationServiceException ex) { } catch (CoordinationService.CoordinationServiceException ex) {
logger.log(Level.SEVERE, "Error collecting case node data", ex); //NON-NLS logger.log(Level.SEVERE, "Error getting case znode list", ex); //NON-NLS
return; return;
} catch (InterruptedException unused) { } catch (InterruptedException unused) {
logger.log(Level.WARNING, "Task cancelled while collecting case node data"); //NON-NLS logger.log(Level.WARNING, "Task cancelled while getting case znode list"); //NON-NLS
return; return;
} }
for (CaseNodeData nodeData : nodeDataList) { progress.progress(Bundle.DeleteOrphanCaseNodesTask_progress_lookingForOrphanedCaseZnodes());
final Path caseDirectoryPath = nodeData.getDirectory(); logger.log(Level.INFO, Bundle.DeleteOrphanCaseNodesTask_progress_lookingForOrphanedCaseZnodes());
for (String caseNodePath : nodePaths) {
if (isCaseNameNodePath(caseNodePath) || isCaseResourcesNodePath(caseNodePath) || isCaseAutoIngestLogNodePath(caseNodePath)) {
continue;
}
final Path caseDirectoryPath = Paths.get(caseNodePath);
final File caseDirectory = caseDirectoryPath.toFile(); final File caseDirectory = caseDirectoryPath.toFile();
if (!caseDirectory.exists()) { if (!caseDirectory.exists()) {
String caseName = nodeData.getDisplayName(); String caseName = CoordinationServiceUtils.getCaseNameNodePath(caseDirectoryPath);
String nodePath = ""; // NON-NLS String nodePath = ""; // NON-NLS
try { try {
nodePath = CoordinationServiceUtils.getCaseNameNodePath(caseDirectoryPath); nodePath = CoordinationServiceUtils.getCaseNameNodePath(caseDirectoryPath);
@ -100,12 +111,21 @@ final class DeleteOrphanCaseNodesTask implements Runnable {
nodePath = CoordinationServiceUtils.getCaseDirectoryNodePath(caseDirectoryPath); nodePath = CoordinationServiceUtils.getCaseDirectoryNodePath(caseDirectoryPath);
deleteNode(coordinationService, caseName, nodePath); deleteNode(coordinationService, caseName, nodePath);
++casesCount;
/*
* Back to looking for orphans...
*/
progress.progress(Bundle.DeleteOrphanCaseNodesTask_progress_lookingForOrphanedCaseZnodes());
logger.log(Level.INFO, Bundle.DeleteOrphanCaseNodesTask_progress_lookingForOrphanedCaseZnodes());
} catch (InterruptedException unused) { } catch (InterruptedException unused) {
logger.log(Level.WARNING, String.format("Task cancelled while deleting orphaned znode %s for %s", nodePath, caseName)); //NON-NLS logger.log(Level.WARNING, String.format("Task cancelled while deleting orphaned znode %s for %s", nodePath, caseName)); //NON-NLS
return; return;
} }
} }
} }
} catch (Exception ex) { } catch (Exception ex) {
/* /*
* This is an unexpected runtime exceptions firewall. It is here * This is an unexpected runtime exceptions firewall. It is here
@ -117,6 +137,7 @@ final class DeleteOrphanCaseNodesTask implements Runnable {
throw ex; throw ex;
} finally { } finally {
logger.log(Level.INFO, String.format("Deleted %d orphaned case znodes for %d cases", nodesCount, casesCount));
progress.finish(); progress.finish();
} }
} }
@ -137,11 +158,12 @@ final class DeleteOrphanCaseNodesTask implements Runnable {
private void deleteNode(CoordinationService coordinationService, String caseName, String nodePath) throws InterruptedException { private void deleteNode(CoordinationService coordinationService, String caseName, String nodePath) throws InterruptedException {
try { try {
progress.progress(Bundle.DeleteOrphanCaseNodesTask_progress_deletingOrphanedCaseNode(nodePath)); progress.progress(Bundle.DeleteOrphanCaseNodesTask_progress_deletingOrphanedCaseNode(nodePath));
logger.log(Level.INFO, String.format("Deleting orphaned case node %s for %s", nodePath, caseName)); //NON-NLS logger.log(Level.INFO, String.format("Deleting orphaned case node %s for case %s", nodePath, caseName)); //NON-NLS
coordinationService.deleteNode(CoordinationService.CategoryNode.CASES, nodePath); coordinationService.deleteNode(CoordinationService.CategoryNode.CASES, nodePath);
++nodesCount;
} catch (CoordinationService.CoordinationServiceException ex) { } catch (CoordinationService.CoordinationServiceException ex) {
if (!DeleteCaseUtils.isNoNodeException(ex)) { if (!DeleteCaseUtils.isNoNodeException(ex)) {
logger.log(Level.SEVERE, String.format("Error deleting orphaned case node %s for %s", nodePath, caseName), ex); //NON-NLS logger.log(Level.SEVERE, String.format("Error deleting orphaned case node %s for case %s", nodePath, caseName), ex); //NON-NLS
} }
} }
} }

View File

@ -20,6 +20,7 @@ package org.sleuthkit.autopsy.experimental.autoingest;
import java.io.File; import java.io.File;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List; import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
import org.openide.util.NbBundle; import org.openide.util.NbBundle;
@ -33,7 +34,7 @@ import org.sleuthkit.autopsy.progress.ProgressIndicator;
*/ */
final class DeleteOrphanManifestNodesTask implements Runnable { final class DeleteOrphanManifestNodesTask implements Runnable {
private static final Logger logger = Logger.getLogger(DeleteOrphanManifestNodesTask.class.getName()); private static final Logger logger = AutoIngestDashboardLogger.getLogger();
private final ProgressIndicator progress; private final ProgressIndicator progress;
/** /**
@ -51,13 +52,15 @@ final class DeleteOrphanManifestNodesTask implements Runnable {
"DeleteOrphanManifestNodesTask.progress.startMessage=Starting orphaned manifest file znode cleanup", "DeleteOrphanManifestNodesTask.progress.startMessage=Starting orphaned manifest file znode cleanup",
"DeleteOrphanManifestNodesTask.progress.connectingToCoordSvc=Connecting to the coordination service", "DeleteOrphanManifestNodesTask.progress.connectingToCoordSvc=Connecting to the coordination service",
"DeleteOrphanManifestNodesTask.progress.gettingManifestNodes=Querying the coordination service for manifest file znodes", "DeleteOrphanManifestNodesTask.progress.gettingManifestNodes=Querying the coordination service for manifest file znodes",
"DeleteOrphanManifestNodesTask.progress.lookingForOrphanedManifestFileZnodes=Looking for orphaned manifest file znodes",
"# {0} - node path", "DeleteOrphanManifestNodesTask.progress.deletingOrphanedManifestNode=Deleting orphaned manifest file znode {0}" "# {0} - node path", "DeleteOrphanManifestNodesTask.progress.deletingOrphanedManifestNode=Deleting orphaned manifest file znode {0}"
}) })
public void run() { public void run() {
progress.start(Bundle.DeleteOrphanManifestNodesTask_progress_startMessage()); progress.start(Bundle.DeleteOrphanManifestNodesTask_progress_startMessage());
int nodesCount = 0;
try { try {
progress.progress(Bundle.DeleteOrphanManifestNodesTask_progress_connectingToCoordSvc()); progress.progress(Bundle.DeleteOrphanManifestNodesTask_progress_connectingToCoordSvc());
logger.log(Level.INFO, Bundle.DeleteOrphanManifestNodesTask_progress_connectingToCoordSvc()); logger.log(Level.INFO, Bundle.DeleteOrphanManifestNodesTask_progress_connectingToCoordSvc());
CoordinationService coordinationService; CoordinationService coordinationService;
try { try {
coordinationService = CoordinationService.getInstance(); coordinationService = CoordinationService.getInstance();
@ -68,36 +71,45 @@ final class DeleteOrphanManifestNodesTask implements Runnable {
progress.progress(Bundle.DeleteOrphanManifestNodesTask_progress_gettingManifestNodes()); progress.progress(Bundle.DeleteOrphanManifestNodesTask_progress_gettingManifestNodes());
logger.log(Level.INFO, Bundle.DeleteOrphanManifestNodesTask_progress_gettingManifestNodes()); logger.log(Level.INFO, Bundle.DeleteOrphanManifestNodesTask_progress_gettingManifestNodes());
List<AutoIngestJobNodeData> nodeDataList; List<String> nodePaths;
try { try {
nodeDataList = AutoIngestJobNodeDataCollector.getNodeData(); nodePaths = coordinationService.getNodeList(CoordinationService.CategoryNode.MANIFESTS);
} catch (CoordinationService.CoordinationServiceException ex) { } catch (CoordinationService.CoordinationServiceException ex) {
logger.log(Level.SEVERE, "Error collecting auto ingest job node data", ex); // NON-NLS logger.log(Level.SEVERE, "Error getting manifest file znode list", ex); // NON-NLS
return; return;
} catch (InterruptedException unused) { } catch (InterruptedException unused) {
logger.log(Level.WARNING, "Task cancelled while collecting auto ingest job node data"); // NON-NLS logger.log(Level.WARNING, "Task cancelled while getting manifest file znode list"); // NON-NLS
return; return;
} }
for (AutoIngestJobNodeData nodeData : nodeDataList) { progress.progress(Bundle.DeleteOrphanManifestNodesTask_progress_lookingForOrphanedManifestFileZnodes());
final String caseName = nodeData.getCaseName(); logger.log(Level.INFO, Bundle.DeleteOrphanManifestNodesTask_progress_lookingForOrphanedManifestFileZnodes());
final Path manifestFilePath = nodeData.getManifestFilePath(); for (String nodePath : nodePaths) {
final Path manifestFilePath = Paths.get(nodePath);
final File manifestFile = manifestFilePath.toFile(); final File manifestFile = manifestFilePath.toFile();
if (!manifestFile.exists()) { if (!manifestFile.exists()) {
try { try {
progress.progress(Bundle.DeleteOrphanManifestNodesTask_progress_deletingOrphanedManifestNode(manifestFilePath)); progress.progress(Bundle.DeleteOrphanManifestNodesTask_progress_deletingOrphanedManifestNode(manifestFilePath));
logger.log(Level.INFO, String.format("Deleting orphaned manifest file znode %s for %s", manifestFilePath, caseName)); logger.log(Level.INFO, String.format("Deleting orphaned manifest file znode %s", manifestFilePath));
coordinationService.deleteNode(CoordinationService.CategoryNode.MANIFESTS, manifestFilePath.toString()); coordinationService.deleteNode(CoordinationService.CategoryNode.MANIFESTS, manifestFilePath.toString());
++nodesCount;
} catch (CoordinationService.CoordinationServiceException ex) { } catch (CoordinationService.CoordinationServiceException ex) {
if (!DeleteCaseUtils.isNoNodeException(ex)) { if (!DeleteCaseUtils.isNoNodeException(ex)) {
logger.log(Level.SEVERE, String.format("Error deleting %s znode for %s", manifestFilePath, caseName), ex); // NON-NLS logger.log(Level.SEVERE, String.format("Error deleting orphaned manifest file %s", manifestFilePath), ex); // NON-NLS
} }
} catch (InterruptedException unused) { } catch (InterruptedException unused) {
logger.log(Level.WARNING, String.format("Task cancelled while deleting %s znode for %s", manifestFilePath, caseName)); // NON-NLS logger.log(Level.WARNING, String.format("Task cancelled while deleting orphaned manifest file %s", manifestFilePath)); // NON-NLS
return; return;
} }
/*
* Back to looking for orphans...
*/
progress.progress(Bundle.DeleteOrphanManifestNodesTask_progress_lookingForOrphanedManifestFileZnodes());
logger.log(Level.INFO, Bundle.DeleteOrphanManifestNodesTask_progress_lookingForOrphanedManifestFileZnodes());
} }
} }
} catch (Exception ex) { } catch (Exception ex) {
/* /*
* This is an unexpected runtime exceptions firewall. It is here * This is an unexpected runtime exceptions firewall. It is here
@ -109,6 +121,7 @@ final class DeleteOrphanManifestNodesTask implements Runnable {
throw ex; throw ex;
} finally { } finally {
logger.log(Level.INFO, String.format("Deleted %d orphaned manifest file znodes", nodesCount));
progress.finish(); progress.finish();
} }
} }