From ca2780b332c49d0f3c0ec6ae0c33b4956051aafe Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dgrove" Date: Wed, 21 Feb 2018 15:46:37 -0500 Subject: [PATCH 1/9] Added deprioritization functionality. --- .../AutoIngestCaseDeprioritizedEvent.java | 65 ++++++++++ .../autoingest/AutoIngestControlPanel.form | 55 +++++++- .../autoingest/AutoIngestControlPanel.java | 121 +++++++++++++----- .../autoingest/AutoIngestDashboard.form | 38 +++++- .../autoingest/AutoIngestDashboard.java | 84 ++++++++++-- .../autoingest/AutoIngestManager.java | 111 +++++++++++++++- .../autoingest/AutoIngestMonitor.java | 110 +++++++++++++++- .../experimental/autoingest/Bundle.properties | 35 ++++- 8 files changed, 562 insertions(+), 57 deletions(-) create mode 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseDeprioritizedEvent.java diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseDeprioritizedEvent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseDeprioritizedEvent.java new file mode 100755 index 0000000000..0076f0cc03 --- /dev/null +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseDeprioritizedEvent.java @@ -0,0 +1,65 @@ +/* + * Autopsy Forensic Browser + * + * Copyright 2018 Basis Technology Corp. + * Contact: carrier sleuthkit org + * + * Licensed 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. + */ +package org.sleuthkit.autopsy.experimental.autoingest; + +import java.io.Serializable; +import org.sleuthkit.autopsy.events.AutopsyEvent; + +/** + * Event published when an automated ingest manager deprioritizes all or part of + * a case. + */ +public final class AutoIngestCaseDeprioritizedEvent extends AutopsyEvent implements Serializable { + + private static final long serialVersionUID = 1L; + private final String caseName; + private final String nodeName; + + /** + * Constructs an event published when an automated ingest manager + * deprioritizes all or part of a case. + * + * @param caseName The name of the case. + * @param nodeName The host name of the node that deprioritized the case. + */ + public AutoIngestCaseDeprioritizedEvent(String nodeName, String caseName) { + super(AutoIngestManager.Event.CASE_DEPRIORITIZED.toString(), null, null); + this.caseName = caseName; + this.nodeName = nodeName; + } + + /** + * Gets the name of the deprioritized case. + * + * @return The case name. + */ + public String getCaseName() { + return caseName; + } + + /** + * Gets the host name of the node that deprioritized the case. + * + * @return The host name of the node. + */ + public String getNodeName() { + return nodeName; + } + +} diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.form index cf7db34165..1e1cc73c43 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.form +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.form @@ -73,6 +73,8 @@ + + @@ -102,10 +104,14 @@ - + + + + + @@ -608,5 +614,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java index 0d89c08246..fc82ddc1dd 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java @@ -73,8 +73,6 @@ import org.sleuthkit.autopsy.ingest.IngestProgressSnapshotDialog; * one such panel per node. */ @Messages({ - "AutoIngestControlPanel.bnClusterMetrics.text=Auto Ingest Metrics", - "AutoIngestControlPanel.bnPause.text=Pause", "AutoIngestControlPanel.bnPause.paused=Paused", "AutoIngestControlPanel.bnPause.running=Running", "AutoIngestControlPanel.bnPause.confirmHeader=Are you sure you want to pause?", @@ -88,38 +86,15 @@ import org.sleuthkit.autopsy.ingest.IngestProgressSnapshotDialog; "AutoIngestControlPanel.pendingTable.toolTipText=The Pending table displays the order upcoming Jobs will be processed with the top of the list first", "AutoIngestControlPanel.runningTable.toolTipText=The Running table displays the currently running Job and information about it", "AutoIngestControlPanel.completedTable.toolTipText=The Completed table shows all Jobs that have been processed already", - "AutoIngestControlPanel.bnCancelJob.text=&Cancel Job", "AutoIngestControlPanel.bnCancelJob.toolTipText=Cancel processing of the current Job and move on to the next Job. This functionality is only available for jobs running on current AIM node.", - "AutoIngestControlPanel.bnDeleteCase.text=&Delete Case", "AutoIngestControlPanel.bnDeleteCase.toolTipText=Delete the selected Case in its entirety", "AutoIngestControlPanel.bnResume.text=Resume", - "AutoIngestControlPanel.lbPending.text=Pending Jobs", - "AutoIngestControlPanel.lbRunning.text=Running Jobs", - "AutoIngestControlPanel.lbCompleted.text=Completed Jobs", - "AutoIngestControlPanel.bnRefresh.text=&Refresh", "AutoIngestControlPanel.bnRefresh.toolTipText=Refresh displayed tables", - "AutoIngestControlPanel.bnCancelModule.text=Cancel &Module", "AutoIngestControlPanel.bnCancelModule.toolTipText=Cancel processing of the current module within the Job and move on to the next module within the Job. This functionality is only available for jobs running on current AIM node.", - "AutoIngestControlPanel.bnExit.text=&Exit", "AutoIngestControlPanel.bnExit.toolTipText=Exit Application", - "AutoIngestControlPanel.bnOptions.text=&Options", "AutoIngestControlPanel.bnOptions.toolTipText=Display options panel. All processing must be paused to open the options panel.", - "AutoIngestControlPanel.bnShowProgress.text=Ingest Progress", "AutoIngestControlPanel.bnShowProgress.toolTipText=Show the progress of the currently running Job. This functionality is only available for jobs running on current AIM node.", - "AutoIngestControlPanel.bnPrioritizeCase.text=Prioritize Case", - "AutoIngestControlPanel.bnPrioritizeCase.toolTipText=Move all images associated with a case to top of Pending queue.", - "AutoIngestControlPanel.bnShowCaseLog.text=Show Case &Log", "AutoIngestControlPanel.bnShowCaseLog.toolTipText=Display case log file for selected case", - "AutoIngestControlPanel.tbStatusMessage.text=", - "AutoIngestControlPanel.lbStatus.text=Status:", - "AutoIngestControlPanel.bnPrioritizeJob.text=Prioritize Job", - "AutoIngestControlPanel.bnPrioritizeJob.toolTipText=Move this folder to the top of the Pending queue.", - "AutoIngestControlPanel.bnPrioritizeJob.actionCommand=", - "AutoIngestControlPanel.lbServicesStatus.text=Services Status:", - "AutoIngestControlPanel.tbServicesStatusMessage.text=", - "AutoIngestControlPanel.bnOpenLogDir.text=Open System Logs Folder", - "AutoIngestControlPanel.bnReprocessJob.text=Reprocess Job", - "AutoIngestControlPanel.bnPrioritizeFolder.label=", "AutoIngestControlPanel.Cancelling=Cancelling...", "AutoIngestControlPanel.AutoIngestStartupWarning.Title=Automated Ingest Warning", "AutoIngestControlPanel.AutoIngestStartupWarning.Message=Failed to establish remote communications with other automated ingest nodes.\nAuto ingest dashboard will only be able to display local ingest job events.\nPlease verify Multi-User settings (Options->Multi-User). See application log for details.", @@ -272,7 +247,12 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { completedTableModel = new AutoIngestTableModel(JobsTableModelColumns.headers, 0); - initComponents(); // Generated code. + try { + initComponents(); // Generated code. + } catch (Throwable ex) { //DLG: + System.out.println(); + return; + } setServicesStatusMessage(); initPendingJobsTable(); initRunningJobsTable(); @@ -652,6 +632,8 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { private void enablePendingTableButtons(Boolean enable) { bnPrioritizeCase.setEnabled(enable); bnPrioritizeJob.setEnabled(enable); + bnDeprioritizeCase.setEnabled(enable); + bnDeprioritizeJob.setEnabled(enable); } /** @@ -840,6 +822,7 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { }); break; case CASE_PRIORITIZED: + case CASE_DEPRIORITIZED: updateExecutor.submit(new UpdatePendingJobsTableTask()); break; case JOB_STATUS_UPDATED: @@ -1201,6 +1184,8 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { bnOpenLogDir = new javax.swing.JButton(); bnClusterMetrics = new javax.swing.JButton(); bnReprocessJob = new javax.swing.JButton(); + bnDeprioritizeCase = new javax.swing.JButton(); + bnDeprioritizeJob = new javax.swing.JButton(); pendingTable.setModel(pendingTableModel); pendingTable.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.pendingTable.toolTipText")); // NOI18N @@ -1434,6 +1419,29 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { } }); + org.openide.awt.Mnemonics.setLocalizedText(bnDeprioritizeCase, org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnDeprioritizeCase.text")); // NOI18N + bnDeprioritizeCase.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnDeprioritizeCase.toolTipText")); // NOI18N + bnDeprioritizeCase.setMaximumSize(new java.awt.Dimension(162, 23)); + bnDeprioritizeCase.setMinimumSize(new java.awt.Dimension(162, 23)); + bnDeprioritizeCase.setPreferredSize(new java.awt.Dimension(162, 23)); + bnDeprioritizeCase.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnDeprioritizeCaseActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(bnDeprioritizeJob, org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnDeprioritizeJob.text")); // NOI18N + bnDeprioritizeJob.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnDeprioritizeJob.toolTipText")); // NOI18N + bnDeprioritizeJob.setActionCommand(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnDeprioritizeJob.actionCommand")); // NOI18N + bnDeprioritizeJob.setMaximumSize(new java.awt.Dimension(162, 23)); + bnDeprioritizeJob.setMinimumSize(new java.awt.Dimension(162, 23)); + bnDeprioritizeJob.setPreferredSize(new java.awt.Dimension(162, 23)); + bnDeprioritizeJob.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + bnDeprioritizeJobActionPerformed(evt); + } + }); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -1486,7 +1494,9 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(bnPrioritizeCase, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(bnPrioritizeJob, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) + .addComponent(bnPrioritizeJob, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(bnDeprioritizeCase, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(bnDeprioritizeJob, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) ); @@ -1511,10 +1521,14 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(pendingScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 215, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() - .addGap(82, 82, 82) + .addGap(48, 48, 48) .addComponent(bnPrioritizeCase, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(bnPrioritizeJob, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addComponent(bnDeprioritizeCase, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(30, 30, 30) + .addComponent(bnPrioritizeJob, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(bnDeprioritizeJob, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(lbRunning) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -1747,7 +1761,7 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { * * @param evt The button click event. */ - @Messages({"AutoIngestControlPanel.casePrioritization.errorMessage=An error occurred when prioritizing the case. Some or all jobs may not have been prioritized."}) + @Messages({"AutoIngestControlPanel.errorMessage.casePrioritization=An error occurred when prioritizing the case. Some or all jobs may not have been prioritized."}) private void bnPrioritizeCaseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPrioritizeCaseActionPerformed if (pendingTable.getModel().getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) { this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); @@ -1757,7 +1771,7 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { manager.prioritizeCase(caseName); } catch (AutoIngestManager.AutoIngestManagerException ex) { SYS_LOGGER.log(Level.SEVERE, "Error prioritizing a case", ex); - MessageNotifyUtil.Message.error(Bundle.AutoIngestControlPanel_casePrioritization_errorMessage()); + MessageNotifyUtil.Message.error(Bundle.AutoIngestControlPanel_errorMessage_casePrioritization()); } refreshTables(); pendingTable.clearSelection(); @@ -1807,7 +1821,7 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { } }//GEN-LAST:event_bnShowCaseLogActionPerformed - @Messages({"AutoIngestControlPanel.jobPrioritization.errorMessage=An error occurred when prioritizing the job."}) + @Messages({"AutoIngestControlPanel.errorMessage.jobPrioritization=An error occurred when prioritizing the job."}) private void bnPrioritizeJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPrioritizeJobActionPerformed if (pendingTable.getModel().getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) { this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); @@ -1815,8 +1829,8 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { try { manager.prioritizeJob(manifestFilePath); } catch (AutoIngestManager.AutoIngestManagerException ex) { - SYS_LOGGER.log(Level.SEVERE, "Error prioritizing a case", ex); - MessageNotifyUtil.Message.error(Bundle.AutoIngestControlPanel_jobPrioritization_errorMessage()); + SYS_LOGGER.log(Level.SEVERE, "Error prioritizing a job", ex); + MessageNotifyUtil.Message.error(Bundle.AutoIngestControlPanel_errorMessage_jobPrioritization()); } refreshTables(); pendingTable.clearSelection(); @@ -1852,11 +1866,50 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { new AutoIngestMetricsDialog(this.getTopLevelAncestor()); }//GEN-LAST:event_bnClusterMetricsActionPerformed + @Messages({"AutoIngestControlPanel.errorMessage.caseDeprioritization=An error occurred when deprioritizing the case. Some or all jobs may not have been deprioritized."}) + private void bnDeprioritizeCaseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnDeprioritizeCaseActionPerformed + if (pendingTable.getModel().getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) { + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + + String caseName = (pendingTable.getModel().getValueAt(pendingTable.convertRowIndexToModel(pendingTable.getSelectedRow()), JobsTableModelColumns.CASE.ordinal())).toString(); + try { + manager.deprioritizeCase(caseName); + } catch (AutoIngestManager.AutoIngestManagerException ex) { + SYS_LOGGER.log(Level.SEVERE, "Error deprioritizing a case", ex); + MessageNotifyUtil.Message.error(Bundle.AutoIngestControlPanel_errorMessage_caseDeprioritization()); + } + refreshTables(); + pendingTable.clearSelection(); + enablePendingTableButtons(false); + AutoIngestControlPanel.this.setCursor(Cursor.getDefaultCursor()); + } + }//GEN-LAST:event_bnDeprioritizeCaseActionPerformed + + @Messages({"AutoIngestControlPanel.errorMessage.jobDeprioritization=An error occurred when deprioritizing the job."}) + private void bnDeprioritizeJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnDeprioritizeJobActionPerformed + if (pendingTable.getModel().getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) { + this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + Path manifestFilePath = (Path) (pendingTable.getModel().getValueAt(pendingTable.convertRowIndexToModel(pendingTable.getSelectedRow()), JobsTableModelColumns.MANIFEST_FILE_PATH.ordinal())); + try { + manager.deprioritizeJob(manifestFilePath); + } catch (AutoIngestManager.AutoIngestManagerException ex) { + SYS_LOGGER.log(Level.SEVERE, "Error deprioritizing a job", ex); + MessageNotifyUtil.Message.error(Bundle.AutoIngestControlPanel_errorMessage_jobDeprioritization()); + } + refreshTables(); + pendingTable.clearSelection(); + enablePendingTableButtons(false); + AutoIngestControlPanel.this.setCursor(Cursor.getDefaultCursor()); + } + }//GEN-LAST:event_bnDeprioritizeJobActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton bnCancelJob; private javax.swing.JButton bnCancelModule; private javax.swing.JButton bnClusterMetrics; private javax.swing.JButton bnDeleteCase; + private javax.swing.JButton bnDeprioritizeCase; + private javax.swing.JButton bnDeprioritizeJob; private javax.swing.JButton bnExit; private javax.swing.JButton bnOpenLogDir; private javax.swing.JButton bnOptions; diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form index 45e2a2ef43..9d2a343f56 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form @@ -35,11 +35,15 @@ - + + + - + + + @@ -84,6 +88,8 @@ + + @@ -265,5 +271,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java index 693bc4ad3d..65b69f1c7c 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java @@ -250,6 +250,8 @@ final class AutoIngestDashboard extends JPanel implements Observer { boolean enablePrioritizeButtons = (row >= 0 && row < pendingTable.getRowCount()); this.prioritizeJobButton.setEnabled(enablePrioritizeButtons); this.prioritizeCaseButton.setEnabled(enablePrioritizeButtons); + this.deprioritizeJobButton.setEnabled(enablePrioritizeButtons); + this.deprioritizeCaseButton.setEnabled(enablePrioritizeButtons); }); } @@ -655,6 +657,8 @@ final class AutoIngestDashboard extends JPanel implements Observer { prioritizeJobButton = new javax.swing.JButton(); prioritizeCaseButton = new javax.swing.JButton(); clusterMetricsButton = new javax.swing.JButton(); + deprioritizeJobButton = new javax.swing.JButton(); + deprioritizeCaseButton = new javax.swing.JButton(); org.openide.awt.Mnemonics.setLocalizedText(jButton1, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.jButton1.text")); // NOI18N @@ -759,6 +763,24 @@ final class AutoIngestDashboard extends JPanel implements Observer { } }); + org.openide.awt.Mnemonics.setLocalizedText(deprioritizeJobButton, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.deprioritizeJobButton.text")); // NOI18N + deprioritizeJobButton.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.deprioritizeJobButton.toolTipText")); // NOI18N + deprioritizeJobButton.setEnabled(false); + deprioritizeJobButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + deprioritizeJobButtonActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(deprioritizeCaseButton, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.deprioritizeCaseButton.text")); // NOI18N + deprioritizeCaseButton.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.deprioritizeCaseButton.toolTipText")); // NOI18N + deprioritizeCaseButton.setEnabled(false); + deprioritizeCaseButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + deprioritizeCaseButtonActionPerformed(evt); + } + }); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -773,11 +795,15 @@ final class AutoIngestDashboard extends JPanel implements Observer { .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addComponent(refreshButton, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGap(18, 18, 18) .addComponent(prioritizeJobButton, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(deprioritizeJobButton, javax.swing.GroupLayout.PREFERRED_SIZE, 127, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) .addComponent(prioritizeCaseButton, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(deprioritizeCaseButton, javax.swing.GroupLayout.PREFERRED_SIZE, 127, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) .addComponent(clusterMetricsButton)) .addComponent(lbPending, javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lbCompleted, javax.swing.GroupLayout.Alignment.LEADING) @@ -816,7 +842,9 @@ final class AutoIngestDashboard extends JPanel implements Observer { .addComponent(refreshButton) .addComponent(prioritizeJobButton) .addComponent(prioritizeCaseButton) - .addComponent(clusterMetricsButton)) + .addComponent(clusterMetricsButton) + .addComponent(deprioritizeJobButton) + .addComponent(deprioritizeCaseButton)) .addContainerGap()) ); }// //GEN-END:initComponents @@ -835,9 +863,7 @@ final class AutoIngestDashboard extends JPanel implements Observer { setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); }//GEN-LAST:event_refreshButtonActionPerformed - @Messages({ - "AutoIngestDashboard.PrioritizeJobError=Failed to prioritize job \"%s\"." - }) + @Messages({"AutoIngestDashboard.errorMessage.jobPrioritization=Failed to prioritize job \"%s\"."}) private void prioritizeJobButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_prioritizeJobButtonActionPerformed if (pendingTableModel.getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) { setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); @@ -847,7 +873,7 @@ final class AutoIngestDashboard extends JPanel implements Observer { jobsSnapshot = autoIngestMonitor.prioritizeJob(job); refreshTables(jobsSnapshot); } catch (AutoIngestMonitor.AutoIngestMonitorException ex) { - String errorMessage = String.format(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.PrioritizeJobError"), job.getManifest().getFilePath()); + String errorMessage = String.format(Bundle.AutoIngestDashboard_errorMessage_jobPrioritization(), job.getManifest().getFilePath()); LOGGER.log(Level.SEVERE, errorMessage, ex); MessageNotifyUtil.Message.error(errorMessage); } @@ -855,9 +881,7 @@ final class AutoIngestDashboard extends JPanel implements Observer { } }//GEN-LAST:event_prioritizeJobButtonActionPerformed - @Messages({ - "AutoIngestDashboard.PrioritizeCaseError=Failed to prioritize job \"%s\"." - }) + @Messages({"AutoIngestDashboard.errorMessage.casePrioritization=Failed to prioritize case \"%s\"."}) private void prioritizeCaseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_prioritizeCaseButtonActionPerformed if (pendingTableModel.getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) { setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); @@ -867,7 +891,7 @@ final class AutoIngestDashboard extends JPanel implements Observer { jobsSnapshot = autoIngestMonitor.prioritizeCase(caseName); refreshTables(jobsSnapshot); } catch (AutoIngestMonitor.AutoIngestMonitorException ex) { - String errorMessage = String.format(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.PrioritizeCaseError"), caseName); + String errorMessage = String.format(Bundle.AutoIngestDashboard_errorMessage_casePrioritization(), caseName); LOGGER.log(Level.SEVERE, errorMessage, ex); MessageNotifyUtil.Message.error(errorMessage); } @@ -879,10 +903,48 @@ final class AutoIngestDashboard extends JPanel implements Observer { new AutoIngestMetricsDialog(this.getTopLevelAncestor()); }//GEN-LAST:event_clusterMetricsButtonActionPerformed + @Messages({"AutoIngestDashboard.errorMessage.jobDeprioritization=Failed to deprioritize job \"%s\"."}) + private void deprioritizeJobButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deprioritizeJobButtonActionPerformed + if (pendingTableModel.getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) { + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + AutoIngestJob job = (AutoIngestJob) (pendingTableModel.getValueAt(pendingTable.getSelectedRow(), JobsTableModelColumns.JOB.ordinal())); + JobsSnapshot jobsSnapshot; + try { + jobsSnapshot = autoIngestMonitor.deprioritizeJob(job); + refreshTables(jobsSnapshot); + } catch (AutoIngestMonitor.AutoIngestMonitorException ex) { + String errorMessage = String.format(Bundle.AutoIngestDashboard_errorMessage_jobDeprioritization(), job.getManifest().getFilePath()); + LOGGER.log(Level.SEVERE, errorMessage, ex); + MessageNotifyUtil.Message.error(errorMessage); + } + setCursor(Cursor.getDefaultCursor()); + } + }//GEN-LAST:event_deprioritizeJobButtonActionPerformed + + @Messages({"AutoIngestDashboard.errorMessage.caseDeprioritization=Failed to deprioritize case \"%s\"."}) + private void deprioritizeCaseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deprioritizeCaseButtonActionPerformed + if (pendingTableModel.getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) { + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + String caseName = (pendingTableModel.getValueAt(pendingTable.getSelectedRow(), JobsTableModelColumns.CASE.ordinal())).toString(); + JobsSnapshot jobsSnapshot; + try { + jobsSnapshot = autoIngestMonitor.deprioritizeCase(caseName); + refreshTables(jobsSnapshot); + } catch (AutoIngestMonitor.AutoIngestMonitorException ex) { + String errorMessage = String.format(Bundle.AutoIngestDashboard_errorMessage_caseDeprioritization(), caseName); + LOGGER.log(Level.SEVERE, errorMessage, ex); + MessageNotifyUtil.Message.error(errorMessage); + } + setCursor(Cursor.getDefaultCursor()); + } + }//GEN-LAST:event_deprioritizeCaseButtonActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton clusterMetricsButton; private javax.swing.JScrollPane completedScrollPane; private javax.swing.JTable completedTable; + private javax.swing.JButton deprioritizeCaseButton; + private javax.swing.JButton deprioritizeJobButton; private javax.swing.JButton jButton1; private javax.swing.JLabel lbCompleted; private javax.swing.JLabel lbPending; diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java index 5260a9cd43..0b96b7eb17 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011-2017 Basis Technology Corp. + * Copyright 2011-2018 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -128,6 +128,7 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen Event.JOB_STATUS_UPDATED.toString(), Event.JOB_COMPLETED.toString(), Event.CASE_PRIORITIZED.toString(), + Event.CASE_DEPRIORITIZED.toString(), Event.JOB_STARTED.toString()})); private static final long JOB_STATUS_EVENT_INTERVAL_SECONDS = 10; private static final String JOB_STATUS_PUBLISHING_THREAD_NAME = "AIM-job-status-event-publisher-%d"; @@ -370,6 +371,20 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen notifyObservers(Event.CASE_PRIORITIZED); } + /** + * Processes a job/case deprioritization event from another node by + * triggering an immediate input directory scan. + * + * @param event A deprioritization event from another auto ingest node. + */ + private void handleRemoteCaseDeprioritizationEvent(AutoIngestCaseDeprioritizedEvent event) { + String hostName = event.getNodeName(); + hostNamesToLastMsgTime.put(hostName, Instant.now()); + scanInputDirsNow(); + setChanged(); + notifyObservers(Event.CASE_DEPRIORITIZED); + } + /** * Processes a case deletin event from another node by triggering an * immediate input directory scan. @@ -530,7 +545,49 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen } /** + * Removes the priority (set to zero) of all pending ingest jobs for a + * specified case. + * + * @param caseName The name of the case to be deprioritized. + * + * @throws AutoIngestManagerException If there is an error removing the + * priority of the jobs for the case. */ + void deprioritizeCase(final String caseName) throws AutoIngestManagerException { + if (state != State.RUNNING) { + return; + } + + List prioritizedJobs = new ArrayList<>(); + synchronized (jobsLock) { + for (AutoIngestJob job : pendingJobs) { + if (job.getManifest().getCaseName().equals(caseName)) { + prioritizedJobs.add(job); + } + } + if (!prioritizedJobs.isEmpty()) { + for (AutoIngestJob job : prioritizedJobs) { + int oldPriority = job.getPriority(); + job.setPriority(0); + try { + this.updateCoordinationServiceManifestNode(job); + } catch (CoordinationServiceException | InterruptedException ex) { + job.setPriority(oldPriority); + throw new AutoIngestManagerException("Error updating case priority", ex); + } + } + } + + Collections.sort(pendingJobs, new AutoIngestJob.PriorityComparator()); + } + + if (!prioritizedJobs.isEmpty()) { + new Thread(() -> { + eventPublisher.publishRemotely(new AutoIngestCaseDeprioritizedEvent(LOCAL_HOST_NAME, caseName)); + }).start(); + } + } + /** * Bumps the priority of all pending ingest jobs for a specified case. * @@ -580,6 +637,57 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen } } + /** + * Removes the priority (set to zero) of an auto ingest job. + * + * @param manifestPath The manifest file path for the job to be + * deprioritized. + * + * @throws AutoIngestManagerException If there is an error removing the + * priority of the job. + */ + void deprioritizeJob(Path manifestPath) throws AutoIngestManagerException { + if (state != State.RUNNING) { + return; + } + + AutoIngestJob prioritizedJob = null; + synchronized (jobsLock) { + /* + * Find the job in the pending jobs list. + */ + for (AutoIngestJob job : pendingJobs) { + if (job.getManifest().getFilePath().equals(manifestPath)) { + prioritizedJob = job; + } + } + + /* + * Remove the priority and update the coordination service manifest + * node data for the job. + */ + if (null != prioritizedJob) { + int oldPriority = prioritizedJob.getPriority(); + prioritizedJob.setPriority(0); + try { + this.updateCoordinationServiceManifestNode(prioritizedJob); + } catch (CoordinationServiceException | InterruptedException ex) { + prioritizedJob.setPriority(oldPriority); + throw new AutoIngestManagerException("Error updating job priority", ex); + } + } + + Collections.sort(pendingJobs, new AutoIngestJob.PriorityComparator()); + } + + if (null != prioritizedJob) { + final String caseName = prioritizedJob.getManifest().getCaseName(); + new Thread(() -> { + eventPublisher.publishRemotely(new AutoIngestCaseDeprioritizedEvent(LOCAL_HOST_NAME, caseName)); + }).start(); + } + } + /** * Bumps the priority of an auto ingest job. * @@ -2910,6 +3018,7 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen JOB_STATUS_UPDATED, JOB_COMPLETED, CASE_PRIORITIZED, + CASE_DEPRIORITIZED, CASE_DELETED, PAUSED_BY_REQUEST, PAUSED_FOR_SYSTEM_ERROR, diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java index e46a5e43c0..a4ba32a34c 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java @@ -55,6 +55,7 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen AutoIngestManager.Event.JOB_STATUS_UPDATED.toString(), AutoIngestManager.Event.JOB_COMPLETED.toString(), AutoIngestManager.Event.CASE_PRIORITIZED.toString(), + AutoIngestManager.Event.CASE_DEPRIORITIZED.toString(), AutoIngestManager.Event.JOB_STARTED.toString()})); private final AutopsyEventPublisher eventPublisher; private CoordinationService coordinationService; @@ -271,15 +272,59 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen LOGGER.log(Level.SEVERE, String.format("Failed to create a job for '%s'", node), ex); } } - + return newJobsSnapshot; - + } catch (CoordinationServiceException ex) { LOGGER.log(Level.SEVERE, "Failed to get node list from coordination service", ex); return new JobsSnapshot(); } } + /** + * Removes the priority (set to zero) of all pending ingest jobs for a + * specified case. + * + * @param caseName The name of the case to be deprioritized. + * + * @throws AutoIngestMonitorException If there is an error removing the + * priority of the jobs for the case. + * + * @return The latest jobs snapshot. + */ + JobsSnapshot deprioritizeCase(final String caseName) throws AutoIngestMonitorException { + List prioritizedJobs = new ArrayList<>(); + + synchronized (jobsLock) { + for (AutoIngestJob pendingJob : jobsSnapshot.getPendingJobs()) { + if (pendingJob.getManifest().getCaseName().equals(caseName)) { + prioritizedJobs.add(pendingJob); + } + } + if (!prioritizedJobs.isEmpty()) { + for (AutoIngestJob job : prioritizedJobs) { + String manifestNodePath = job.getManifest().getFilePath().toString(); + try { + AutoIngestJobNodeData nodeData = new AutoIngestJobNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath)); + nodeData.setPriority(0); + coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath, nodeData.toArray()); + } catch (AutoIngestJobNodeData.InvalidDataException | CoordinationServiceException | InterruptedException ex) { + throw new AutoIngestMonitorException("Error removing priority for job " + job.toString(), ex); + } + job.setPriority(0); + } + + /* + * Publish a deprioritization event. + */ + new Thread(() -> { + eventPublisher.publishRemotely(new AutoIngestCaseDeprioritizedEvent(LOCAL_HOST_NAME, caseName)); + }).start(); + } + return jobsSnapshot; + } + } + /** * Bumps the priority of all pending ingest jobs for a specified case. * @@ -287,7 +332,7 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen * * @throws AutoIngestMonitorException If there is an error bumping the * priority of the jobs for the case. - * + * * @return The latest jobs snapshot. */ JobsSnapshot prioritizeCase(final String caseName) throws AutoIngestMonitorException { @@ -327,14 +372,65 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen } } + /** + * Removes the priority (set to zero) of an auto ingest job. + * + * @param job The job to be deprioritized. + * + * @throws AutoIngestMonitorException If there is an error removing the + * priority of the job. + * + * @return The latest jobs snapshot. + */ + JobsSnapshot deprioritizeJob(AutoIngestJob job) throws AutoIngestMonitorException { + synchronized (jobsLock) { + AutoIngestJob prioritizedJob = null; + /* + * Make sure the job is still in the pending jobs queue. + */ + for (AutoIngestJob pendingJob : jobsSnapshot.getPendingJobs()) { + if (pendingJob.equals(job)) { + prioritizedJob = job; + break; + } + } + + /* + * If the job was still in the pending jobs queue, bump its + * priority. + */ + if (null != prioritizedJob) { + String manifestNodePath = job.getManifest().getFilePath().toString(); + try { + AutoIngestJobNodeData nodeData = new AutoIngestJobNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath)); + nodeData.setPriority(0); + coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath, nodeData.toArray()); + } catch (AutoIngestJobNodeData.InvalidDataException | CoordinationServiceException | InterruptedException ex) { + throw new AutoIngestMonitorException("Error removing priority for job " + job.toString(), ex); + } + prioritizedJob.setPriority(0); + + /* + * Publish a deprioritization event. + */ + final String caseName = job.getManifest().getCaseName(); + new Thread(() -> { + eventPublisher.publishRemotely(new AutoIngestCaseDeprioritizedEvent(LOCAL_HOST_NAME, caseName)); + }).start(); + + } + return jobsSnapshot; + } + } + /** * Bumps the priority of an auto ingest job. * * @param job The job to be prioritized. - * + * * @throws AutoIngestMonitorException If there is an error bumping the * priority of the job. - * + * * @return The latest jobs snapshot. */ JobsSnapshot prioritizeJob(AutoIngestJob job) throws AutoIngestMonitorException { @@ -525,7 +621,7 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen } } - + /** * Exception type thrown when there is an error completing an auto ingest * monitor operation. @@ -556,4 +652,4 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen } } -} \ No newline at end of file +} diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties index 656ccafb3d..633d069cc8 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties @@ -227,7 +227,7 @@ AutoIngestDashboard.prioritizeJobButton.text=Prioritize &Job AutoIngestDashboard.prioritizeCaseButton.toolTipText=Move all images associated with a case to top of Pending queue. AutoIngestDashboard.prioritizeCaseButton.text=Prioritize &Case AutoIngestMetricsDialog.reportTextArea.text= -AutoIngestDashboard.clusterMetricsButton.text=Auto Ingest Metrics +AutoIngestDashboard.clusterMetricsButton.text=Auto Ingest &Metrics AutoIngestMetricsDialog.metricsButton.text=Generate Metrics Report AutoIngestMetricsDialog.closeButton.text=Close AutoIngestMetricsDialog.datePicker.toolTipText=Choose a date @@ -236,3 +236,36 @@ ArchiveFilePanel.browseButton.text=Browse ArchiveFilePanel.pathTextField.text= ArchiveFilePanel.errorLabel.text=Error Label AutoIngestMetricsDialog.startingDataLabel.text=Starting Date: +AutoIngestDashboard.deprioritizeJobButton.toolTipText=Move the selected job to the top of the Pending queue. +AutoIngestDashboard.deprioritizeJobButton.text=Deprioritize J&ob +AutoIngestDashboard.deprioritizeCaseButton.text=Deprioritize C&ase +AutoIngestDashboard.deprioritizeCaseButton.toolTipText=Move all images associated with a case to top of Pending queue. +AutoIngestControlPanel.bnDeprioritizeCase.text=Deprioritize Case +AutoIngestControlPanel.bnDeprioritizeJob.text=Deprioritize Job +AutoIngestControlPanel.bnPrioritizeCase.text=Prioritize Case +AutoIngestControlPanel.bnPrioritizeJob.text=Prioritize Job +AutoIngestControlPanel.bnShowProgress.text=Ingest Progress +AutoIngestControlPanel.bnCancelJob.text=&Cancel Job +AutoIngestControlPanel.bnCancelModule.text=Cancel &Module +AutoIngestControlPanel.bnReprocessJob.text=Reprocess Job +AutoIngestControlPanel.bnDeleteCase.text=&Delete Case +AutoIngestControlPanel.bnShowCaseLog.text=Show Case &Log +AutoIngestControlPanel.bnPause.text=Pause +AutoIngestControlPanel.bnRefresh.text=&Refresh +AutoIngestControlPanel.bnOptions.text=&Options +AutoIngestControlPanel.bnOpenLogDir.text=Open System Logs Folder +AutoIngestControlPanel.bnClusterMetrics.text=Auto Ingest Metrics +AutoIngestControlPanel.bnExit.text=&Exit +AutoIngestControlPanel.lbStatus.text=Status: +AutoIngestControlPanel.lbServicesStatus.text=Services Status: +AutoIngestControlPanel.lbPending.text=Pending Jobs +AutoIngestControlPanel.lbRunning.text=Running Jobs +AutoIngestControlPanel.lbCompleted.text=Completed Jobs +AutoIngestControlPanel.tbStatusMessage.text= +AutoIngestControlPanel.tbServicesStatusMessage.text= +AutoIngestControlPanel.bnDeprioritizeJob.toolTipText= +AutoIngestControlPanel.bnDeprioritizeCase.toolTipText= +AutoIngestControlPanel.bnPrioritizeJob.toolTipText=Move this folder to the top of the Pending queue. +AutoIngestControlPanel.bnPrioritizeCase.toolTipText=Move all images associated with a case to top of Pending queue. +AutoIngestControlPanel.bnPrioritizeJob.actionCommand=Prioritize Job +AutoIngestControlPanel.bnDeprioritizeJob.actionCommand=Deprioritize Job From 53acf9d923cde90ce107d08e615894d56425b402 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dgrove" Date: Wed, 21 Feb 2018 15:59:51 -0500 Subject: [PATCH 2/9] Minor tweaks. --- .../experimental/autoingest/AutoIngestControlPanel.java | 7 +------ .../experimental/autoingest/AutoIngestManager.java | 5 +++-- .../experimental/autoingest/AutoIngestMonitor.java | 9 +++++---- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java index fc82ddc1dd..e21b928b99 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java @@ -247,12 +247,7 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { completedTableModel = new AutoIngestTableModel(JobsTableModelColumns.headers, 0); - try { - initComponents(); // Generated code. - } catch (Throwable ex) { //DLG: - System.out.println(); - return; - } + initComponents(); // Generated code. setServicesStatusMessage(); initPendingJobsTable(); initRunningJobsTable(); diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java index 0b96b7eb17..2a809e9ad0 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java @@ -133,6 +133,7 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen private static final long JOB_STATUS_EVENT_INTERVAL_SECONDS = 10; private static final String JOB_STATUS_PUBLISHING_THREAD_NAME = "AIM-job-status-event-publisher-%d"; private static final long MAX_MISSED_JOB_STATUS_UPDATES = 10; + private static final int DEFAULT_PRIORITY = 0; private static final java.util.logging.Logger SYS_LOGGER = AutoIngestSystemLogger.getLogger(); private static AutoIngestManager instance; private final AutopsyEventPublisher eventPublisher; @@ -568,7 +569,7 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen if (!prioritizedJobs.isEmpty()) { for (AutoIngestJob job : prioritizedJobs) { int oldPriority = job.getPriority(); - job.setPriority(0); + job.setPriority(DEFAULT_PRIORITY); try { this.updateCoordinationServiceManifestNode(job); } catch (CoordinationServiceException | InterruptedException ex) { @@ -668,7 +669,7 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen */ if (null != prioritizedJob) { int oldPriority = prioritizedJob.getPriority(); - prioritizedJob.setPriority(0); + prioritizedJob.setPriority(DEFAULT_PRIORITY); try { this.updateCoordinationServiceManifestNode(prioritizedJob); } catch (CoordinationServiceException | InterruptedException ex) { diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java index a4ba32a34c..24b4db1964 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java @@ -46,6 +46,7 @@ import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestJob.ProcessingSta final class AutoIngestMonitor extends Observable implements PropertyChangeListener { private static final Logger LOGGER = Logger.getLogger(AutoIngestMonitor.class.getName()); + private static final int DEFAULT_PRIORITY = 0; private static final int NUM_COORD_SVC_QUERY_THREADS = 1; private static final String COORD_SVC_QUERY_THREAD_NAME = "AIM-coord-svc-query-thread-%d"; //NON-NLS private static final int CORRD_SVC_QUERY_INERVAL_MINS = 5; @@ -306,12 +307,12 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen String manifestNodePath = job.getManifest().getFilePath().toString(); try { AutoIngestJobNodeData nodeData = new AutoIngestJobNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath)); - nodeData.setPriority(0); + nodeData.setPriority(DEFAULT_PRIORITY); coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath, nodeData.toArray()); } catch (AutoIngestJobNodeData.InvalidDataException | CoordinationServiceException | InterruptedException ex) { throw new AutoIngestMonitorException("Error removing priority for job " + job.toString(), ex); } - job.setPriority(0); + job.setPriority(DEFAULT_PRIORITY); } /* @@ -403,12 +404,12 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen String manifestNodePath = job.getManifest().getFilePath().toString(); try { AutoIngestJobNodeData nodeData = new AutoIngestJobNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath)); - nodeData.setPriority(0); + nodeData.setPriority(DEFAULT_PRIORITY); coordinationService.setNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath, nodeData.toArray()); } catch (AutoIngestJobNodeData.InvalidDataException | CoordinationServiceException | InterruptedException ex) { throw new AutoIngestMonitorException("Error removing priority for job " + job.toString(), ex); } - prioritizedJob.setPriority(0); + prioritizedJob.setPriority(DEFAULT_PRIORITY); /* * Publish a deprioritization event. From 5760349475499128da25d1fb4efbdb51e09e070a Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dgrove" Date: Thu, 22 Feb 2018 10:33:34 -0500 Subject: [PATCH 3/9] Minor fix. --- .../autoingest/AutoIngestCaseDeprioritizedEvent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseDeprioritizedEvent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseDeprioritizedEvent.java index 0076f0cc03..4c95b6b811 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseDeprioritizedEvent.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseDeprioritizedEvent.java @@ -25,7 +25,7 @@ import org.sleuthkit.autopsy.events.AutopsyEvent; * Event published when an automated ingest manager deprioritizes all or part of * a case. */ -public final class AutoIngestCaseDeprioritizedEvent extends AutopsyEvent implements Serializable { +final class AutoIngestCaseDeprioritizedEvent extends AutopsyEvent implements Serializable { private static final long serialVersionUID = 1L; private final String caseName; From bdd1ccd15eb2c58cd27da4878f568124333ea015 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dgrove" Date: Thu, 22 Feb 2018 10:35:31 -0500 Subject: [PATCH 4/9] Minor fix. --- .../autoingest/AutoIngestCaseDeprioritizedEvent.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseDeprioritizedEvent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseDeprioritizedEvent.java index 4c95b6b811..b362c1c733 100755 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseDeprioritizedEvent.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseDeprioritizedEvent.java @@ -38,7 +38,7 @@ final class AutoIngestCaseDeprioritizedEvent extends AutopsyEvent implements Ser * @param caseName The name of the case. * @param nodeName The host name of the node that deprioritized the case. */ - public AutoIngestCaseDeprioritizedEvent(String nodeName, String caseName) { + AutoIngestCaseDeprioritizedEvent(String nodeName, String caseName) { super(AutoIngestManager.Event.CASE_DEPRIORITIZED.toString(), null, null); this.caseName = caseName; this.nodeName = nodeName; @@ -49,7 +49,7 @@ final class AutoIngestCaseDeprioritizedEvent extends AutopsyEvent implements Ser * * @return The case name. */ - public String getCaseName() { + String getCaseName() { return caseName; } @@ -58,7 +58,7 @@ final class AutoIngestCaseDeprioritizedEvent extends AutopsyEvent implements Ser * * @return The host name of the node. */ - public String getNodeName() { + String getNodeName() { return nodeName; } From 13048e20964999fecbe71432e63abb8608559bca Mon Sep 17 00:00:00 2001 From: William Schaefer Date: Thu, 22 Feb 2018 12:19:35 -0500 Subject: [PATCH 5/9] 3565 add MD5 Hash column to File Tags and Interesting Files --- .../autopsy/datamodel/BlackboardArtifactNode.java | 15 +++++++++++---- .../autopsy/datamodel/ContentTagNode.java | 10 +++++++++- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java index 33dd6a2cc0..056d87bfbd 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/BlackboardArtifactNode.java @@ -178,11 +178,12 @@ public class BlackboardArtifactNode extends AbstractContentNode(Bundle.BlackboardArtifactNode_createSheet_artifactMD5_name(), + Bundle.BlackboardArtifactNode_createSheet_artifactMD5_displayName(), + "", + file != null ? file.getMd5Hash() : "")); } } else { String dataSourceStr = ""; diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ContentTagNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/ContentTagNode.java index 2108e982d7..9ce002efc0 100644 --- a/Core/src/org/sleuthkit/autopsy/datamodel/ContentTagNode.java +++ b/Core/src/org/sleuthkit/autopsy/datamodel/ContentTagNode.java @@ -26,6 +26,7 @@ import javax.swing.Action; import org.openide.nodes.Children; import org.openide.nodes.Sheet; import org.openide.util.NbBundle; +import org.openide.util.NbBundle.Messages; import org.openide.util.lookup.Lookups; import org.sleuthkit.autopsy.actions.DeleteContentTagAction; import org.sleuthkit.autopsy.coreutils.Logger; @@ -56,6 +57,10 @@ class ContentTagNode extends DisplayableItemNode { this.tag = tag; } + @Messages({ + "ContentTagNode.createSheet.artifactMD5.displayName=MD5 Hash", + "ContentTagNode.createSheet.artifactMD5.name=MD5 Hash" + }) @Override protected Sheet createSheet() { Content content = tag.getContent(); @@ -106,7 +111,10 @@ class ContentTagNode extends DisplayableItemNode { NbBundle.getMessage(this.getClass(), "ContentTagNode.createSheet.fileSize.displayName"), "", content.getSize())); - + properties.put(new NodeProperty<>(Bundle.ContentTagNode_createSheet_artifactMD5_name(), + Bundle.ContentTagNode_createSheet_artifactMD5_displayName(), + "", + file != null ? file.getMd5Hash() : "")); return propertySheet; } From 03943ac78a1e7d31630e83fa3416265f3a32ebd1 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dgrove" Date: Mon, 26 Feb 2018 11:59:27 -0500 Subject: [PATCH 6/9] Minor cleanup. --- .../autoingest/AutoIngestManager.java | 20 +++++++++---------- .../autoingest/AutoIngestMonitor.java | 16 +++++++-------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java index 2a809e9ad0..4f71e1887b 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java @@ -559,15 +559,15 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen return; } - List prioritizedJobs = new ArrayList<>(); + List jobsToDeprioritize = new ArrayList<>(); synchronized (jobsLock) { for (AutoIngestJob job : pendingJobs) { if (job.getManifest().getCaseName().equals(caseName)) { - prioritizedJobs.add(job); + jobsToDeprioritize.add(job); } } - if (!prioritizedJobs.isEmpty()) { - for (AutoIngestJob job : prioritizedJobs) { + if (!jobsToDeprioritize.isEmpty()) { + for (AutoIngestJob job : jobsToDeprioritize) { int oldPriority = job.getPriority(); job.setPriority(DEFAULT_PRIORITY); try { @@ -582,7 +582,7 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen Collections.sort(pendingJobs, new AutoIngestJob.PriorityComparator()); } - if (!prioritizedJobs.isEmpty()) { + if (!jobsToDeprioritize.isEmpty()) { new Thread(() -> { eventPublisher.publishRemotely(new AutoIngestCaseDeprioritizedEvent(LOCAL_HOST_NAME, caseName)); }).start(); @@ -603,7 +603,7 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen return; } - List prioritizedJobs = new ArrayList<>(); + List jobsToPrioritize = new ArrayList<>(); int maxPriority = 0; synchronized (jobsLock) { for (AutoIngestJob job : pendingJobs) { @@ -611,12 +611,12 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen maxPriority = job.getPriority(); } if (job.getManifest().getCaseName().equals(caseName)) { - prioritizedJobs.add(job); + jobsToPrioritize.add(job); } } - if (!prioritizedJobs.isEmpty()) { + if (!jobsToPrioritize.isEmpty()) { ++maxPriority; - for (AutoIngestJob job : prioritizedJobs) { + for (AutoIngestJob job : jobsToPrioritize) { int oldPriority = job.getPriority(); job.setPriority(maxPriority); try { @@ -631,7 +631,7 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen Collections.sort(pendingJobs, new AutoIngestJob.PriorityComparator()); } - if (!prioritizedJobs.isEmpty()) { + if (!jobsToPrioritize.isEmpty()) { new Thread(() -> { eventPublisher.publishRemotely(new AutoIngestCasePrioritizedEvent(LOCAL_HOST_NAME, caseName)); }).start(); diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java index 24b4db1964..62881f762e 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java @@ -294,16 +294,16 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen * @return The latest jobs snapshot. */ JobsSnapshot deprioritizeCase(final String caseName) throws AutoIngestMonitorException { - List prioritizedJobs = new ArrayList<>(); + List jobsToDeprioritize = new ArrayList<>(); synchronized (jobsLock) { for (AutoIngestJob pendingJob : jobsSnapshot.getPendingJobs()) { if (pendingJob.getManifest().getCaseName().equals(caseName)) { - prioritizedJobs.add(pendingJob); + jobsToDeprioritize.add(pendingJob); } } - if (!prioritizedJobs.isEmpty()) { - for (AutoIngestJob job : prioritizedJobs) { + if (!jobsToDeprioritize.isEmpty()) { + for (AutoIngestJob job : jobsToDeprioritize) { String manifestNodePath = job.getManifest().getFilePath().toString(); try { AutoIngestJobNodeData nodeData = new AutoIngestJobNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath)); @@ -337,7 +337,7 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen * @return The latest jobs snapshot. */ JobsSnapshot prioritizeCase(final String caseName) throws AutoIngestMonitorException { - List prioritizedJobs = new ArrayList<>(); + List jobsToPrioritize = new ArrayList<>(); int highestPriority = 0; synchronized (jobsLock) { for (AutoIngestJob pendingJob : jobsSnapshot.getPendingJobs()) { @@ -345,12 +345,12 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen highestPriority = pendingJob.getPriority(); } if (pendingJob.getManifest().getCaseName().equals(caseName)) { - prioritizedJobs.add(pendingJob); + jobsToPrioritize.add(pendingJob); } } - if (!prioritizedJobs.isEmpty()) { + if (!jobsToPrioritize.isEmpty()) { ++highestPriority; - for (AutoIngestJob job : prioritizedJobs) { + for (AutoIngestJob job : jobsToPrioritize) { String manifestNodePath = job.getManifest().getFilePath().toString(); try { AutoIngestJobNodeData nodeData = new AutoIngestJobNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath)); From e7379f859f2e4297cb1bc2e80611790aa3edda13 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dgrove" Date: Mon, 26 Feb 2018 12:05:18 -0500 Subject: [PATCH 7/9] Cleanup. --- .../autoingest/AutoIngestManager.java | 36 +++++++++---------- .../autoingest/AutoIngestMonitor.java | 16 ++++----- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java index 4f71e1887b..0ab41afa82 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java @@ -652,14 +652,14 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen return; } - AutoIngestJob prioritizedJob = null; + AutoIngestJob jobToDeprioritize = null; synchronized (jobsLock) { /* * Find the job in the pending jobs list. */ for (AutoIngestJob job : pendingJobs) { if (job.getManifest().getFilePath().equals(manifestPath)) { - prioritizedJob = job; + jobToDeprioritize = job; } } @@ -667,13 +667,13 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen * Remove the priority and update the coordination service manifest * node data for the job. */ - if (null != prioritizedJob) { - int oldPriority = prioritizedJob.getPriority(); - prioritizedJob.setPriority(DEFAULT_PRIORITY); + if (null != jobToDeprioritize) { + int oldPriority = jobToDeprioritize.getPriority(); + jobToDeprioritize.setPriority(DEFAULT_PRIORITY); try { - this.updateCoordinationServiceManifestNode(prioritizedJob); + this.updateCoordinationServiceManifestNode(jobToDeprioritize); } catch (CoordinationServiceException | InterruptedException ex) { - prioritizedJob.setPriority(oldPriority); + jobToDeprioritize.setPriority(oldPriority); throw new AutoIngestManagerException("Error updating job priority", ex); } } @@ -681,8 +681,8 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen Collections.sort(pendingJobs, new AutoIngestJob.PriorityComparator()); } - if (null != prioritizedJob) { - final String caseName = prioritizedJob.getManifest().getCaseName(); + if (null != jobToDeprioritize) { + final String caseName = jobToDeprioritize.getManifest().getCaseName(); new Thread(() -> { eventPublisher.publishRemotely(new AutoIngestCaseDeprioritizedEvent(LOCAL_HOST_NAME, caseName)); }).start(); @@ -703,7 +703,7 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen } int maxPriority = 0; - AutoIngestJob prioritizedJob = null; + AutoIngestJob jobToPrioritize = null; synchronized (jobsLock) { /* * Find the job in the pending jobs list and record the highest @@ -714,7 +714,7 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen maxPriority = job.getPriority(); } if (job.getManifest().getFilePath().equals(manifestPath)) { - prioritizedJob = job; + jobToPrioritize = job; } } @@ -722,14 +722,14 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen * Bump the priority by one and update the coordination service * manifest node data for the job. */ - if (null != prioritizedJob) { + if (null != jobToPrioritize) { ++maxPriority; - int oldPriority = prioritizedJob.getPriority(); - prioritizedJob.setPriority(maxPriority); + int oldPriority = jobToPrioritize.getPriority(); + jobToPrioritize.setPriority(maxPriority); try { - this.updateCoordinationServiceManifestNode(prioritizedJob); + this.updateCoordinationServiceManifestNode(jobToPrioritize); } catch (CoordinationServiceException | InterruptedException ex) { - prioritizedJob.setPriority(oldPriority); + jobToPrioritize.setPriority(oldPriority); throw new AutoIngestManagerException("Error updating job priority", ex); } } @@ -737,8 +737,8 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen Collections.sort(pendingJobs, new AutoIngestJob.PriorityComparator()); } - if (null != prioritizedJob) { - final String caseName = prioritizedJob.getManifest().getCaseName(); + if (null != jobToPrioritize) { + final String caseName = jobToPrioritize.getManifest().getCaseName(); new Thread(() -> { eventPublisher.publishRemotely(new AutoIngestCasePrioritizedEvent(LOCAL_HOST_NAME, caseName)); }).start(); diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java index 62881f762e..870756967b 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java @@ -385,13 +385,13 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen */ JobsSnapshot deprioritizeJob(AutoIngestJob job) throws AutoIngestMonitorException { synchronized (jobsLock) { - AutoIngestJob prioritizedJob = null; + AutoIngestJob jobToDeprioritize = null; /* * Make sure the job is still in the pending jobs queue. */ for (AutoIngestJob pendingJob : jobsSnapshot.getPendingJobs()) { if (pendingJob.equals(job)) { - prioritizedJob = job; + jobToDeprioritize = job; break; } } @@ -400,7 +400,7 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen * If the job was still in the pending jobs queue, bump its * priority. */ - if (null != prioritizedJob) { + if (null != jobToDeprioritize) { String manifestNodePath = job.getManifest().getFilePath().toString(); try { AutoIngestJobNodeData nodeData = new AutoIngestJobNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath)); @@ -409,7 +409,7 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen } catch (AutoIngestJobNodeData.InvalidDataException | CoordinationServiceException | InterruptedException ex) { throw new AutoIngestMonitorException("Error removing priority for job " + job.toString(), ex); } - prioritizedJob.setPriority(DEFAULT_PRIORITY); + jobToDeprioritize.setPriority(DEFAULT_PRIORITY); /* * Publish a deprioritization event. @@ -437,7 +437,7 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen JobsSnapshot prioritizeJob(AutoIngestJob job) throws AutoIngestMonitorException { synchronized (jobsLock) { int highestPriority = 0; - AutoIngestJob prioritizedJob = null; + AutoIngestJob jobToPrioritize = null; /* * Get the highest known priority and make sure the job is still in * the pending jobs queue. @@ -447,7 +447,7 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen highestPriority = pendingJob.getPriority(); } if (pendingJob.equals(job)) { - prioritizedJob = job; + jobToPrioritize = job; } } @@ -455,7 +455,7 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen * If the job was still in the pending jobs queue, bump its * priority. */ - if (null != prioritizedJob) { + if (null != jobToPrioritize) { ++highestPriority; String manifestNodePath = job.getManifest().getFilePath().toString(); try { @@ -465,7 +465,7 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen } catch (AutoIngestJobNodeData.InvalidDataException | CoordinationServiceException | InterruptedException ex) { throw new AutoIngestMonitorException("Error bumping priority for job " + job.toString(), ex); } - prioritizedJob.setPriority(highestPriority); + jobToPrioritize.setPriority(highestPriority); /* * Publish a prioritization event. From e46a20140556ba25d6762d9cb6a4517d733acda2 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dgrove" Date: Mon, 26 Feb 2018 15:11:19 -0500 Subject: [PATCH 8/9] Removed deprioritization event in favor of existing. --- .../AutoIngestCaseDeprioritizedEvent.java | 65 ------------------- .../autoingest/AutoIngestControlPanel.java | 1 - .../autoingest/AutoIngestManager.java | 20 +----- .../autoingest/AutoIngestMonitor.java | 7 +- 4 files changed, 5 insertions(+), 88 deletions(-) delete mode 100755 Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseDeprioritizedEvent.java diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseDeprioritizedEvent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseDeprioritizedEvent.java deleted file mode 100755 index b362c1c733..0000000000 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestCaseDeprioritizedEvent.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Autopsy Forensic Browser - * - * Copyright 2018 Basis Technology Corp. - * Contact: carrier sleuthkit org - * - * Licensed 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. - */ -package org.sleuthkit.autopsy.experimental.autoingest; - -import java.io.Serializable; -import org.sleuthkit.autopsy.events.AutopsyEvent; - -/** - * Event published when an automated ingest manager deprioritizes all or part of - * a case. - */ -final class AutoIngestCaseDeprioritizedEvent extends AutopsyEvent implements Serializable { - - private static final long serialVersionUID = 1L; - private final String caseName; - private final String nodeName; - - /** - * Constructs an event published when an automated ingest manager - * deprioritizes all or part of a case. - * - * @param caseName The name of the case. - * @param nodeName The host name of the node that deprioritized the case. - */ - AutoIngestCaseDeprioritizedEvent(String nodeName, String caseName) { - super(AutoIngestManager.Event.CASE_DEPRIORITIZED.toString(), null, null); - this.caseName = caseName; - this.nodeName = nodeName; - } - - /** - * Gets the name of the deprioritized case. - * - * @return The case name. - */ - String getCaseName() { - return caseName; - } - - /** - * Gets the host name of the node that deprioritized the case. - * - * @return The host name of the node. - */ - String getNodeName() { - return nodeName; - } - -} diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java index e21b928b99..19f7840123 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java @@ -817,7 +817,6 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { }); break; case CASE_PRIORITIZED: - case CASE_DEPRIORITIZED: updateExecutor.submit(new UpdatePendingJobsTableTask()); break; case JOB_STATUS_UPDATED: diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java index 0ab41afa82..c1c766d139 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestManager.java @@ -128,7 +128,6 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen Event.JOB_STATUS_UPDATED.toString(), Event.JOB_COMPLETED.toString(), Event.CASE_PRIORITIZED.toString(), - Event.CASE_DEPRIORITIZED.toString(), Event.JOB_STARTED.toString()})); private static final long JOB_STATUS_EVENT_INTERVAL_SECONDS = 10; private static final String JOB_STATUS_PUBLISHING_THREAD_NAME = "AIM-job-status-event-publisher-%d"; @@ -372,20 +371,6 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen notifyObservers(Event.CASE_PRIORITIZED); } - /** - * Processes a job/case deprioritization event from another node by - * triggering an immediate input directory scan. - * - * @param event A deprioritization event from another auto ingest node. - */ - private void handleRemoteCaseDeprioritizationEvent(AutoIngestCaseDeprioritizedEvent event) { - String hostName = event.getNodeName(); - hostNamesToLastMsgTime.put(hostName, Instant.now()); - scanInputDirsNow(); - setChanged(); - notifyObservers(Event.CASE_DEPRIORITIZED); - } - /** * Processes a case deletin event from another node by triggering an * immediate input directory scan. @@ -584,7 +569,7 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen if (!jobsToDeprioritize.isEmpty()) { new Thread(() -> { - eventPublisher.publishRemotely(new AutoIngestCaseDeprioritizedEvent(LOCAL_HOST_NAME, caseName)); + eventPublisher.publishRemotely(new AutoIngestCasePrioritizedEvent(LOCAL_HOST_NAME, caseName)); }).start(); } } @@ -684,7 +669,7 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen if (null != jobToDeprioritize) { final String caseName = jobToDeprioritize.getManifest().getCaseName(); new Thread(() -> { - eventPublisher.publishRemotely(new AutoIngestCaseDeprioritizedEvent(LOCAL_HOST_NAME, caseName)); + eventPublisher.publishRemotely(new AutoIngestCasePrioritizedEvent(LOCAL_HOST_NAME, caseName)); }).start(); } } @@ -3019,7 +3004,6 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen JOB_STATUS_UPDATED, JOB_COMPLETED, CASE_PRIORITIZED, - CASE_DEPRIORITIZED, CASE_DELETED, PAUSED_BY_REQUEST, PAUSED_FOR_SYSTEM_ERROR, diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java index 870756967b..9209fa1147 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestMonitor.java @@ -1,7 +1,7 @@ /* * Autopsy Forensic Browser * - * Copyright 2011-2017 Basis Technology Corp. + * Copyright 2011-2018 Basis Technology Corp. * Contact: carrier sleuthkit org * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -56,7 +56,6 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen AutoIngestManager.Event.JOB_STATUS_UPDATED.toString(), AutoIngestManager.Event.JOB_COMPLETED.toString(), AutoIngestManager.Event.CASE_PRIORITIZED.toString(), - AutoIngestManager.Event.CASE_DEPRIORITIZED.toString(), AutoIngestManager.Event.JOB_STARTED.toString()})); private final AutopsyEventPublisher eventPublisher; private CoordinationService coordinationService; @@ -319,7 +318,7 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen * Publish a deprioritization event. */ new Thread(() -> { - eventPublisher.publishRemotely(new AutoIngestCaseDeprioritizedEvent(LOCAL_HOST_NAME, caseName)); + eventPublisher.publishRemotely(new AutoIngestCasePrioritizedEvent(LOCAL_HOST_NAME, caseName)); }).start(); } return jobsSnapshot; @@ -416,7 +415,7 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen */ final String caseName = job.getManifest().getCaseName(); new Thread(() -> { - eventPublisher.publishRemotely(new AutoIngestCaseDeprioritizedEvent(LOCAL_HOST_NAME, caseName)); + eventPublisher.publishRemotely(new AutoIngestCasePrioritizedEvent(LOCAL_HOST_NAME, caseName)); }).start(); } From ff6feace5290401daa5594b11b9e5c55dd291033 Mon Sep 17 00:00:00 2001 From: "U-BASIS\\dgrove" Date: Mon, 26 Feb 2018 17:29:58 -0500 Subject: [PATCH 9/9] Disable deprioritize buttons when not prioritized. --- .../autoingest/AutoIngestControlPanel.java | 37 +++++++++++++++---- .../autoingest/AutoIngestDashboard.java | 11 ++++-- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java index 19f7840123..ea5b7b5ee3 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestControlPanel.java @@ -393,7 +393,14 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { return; } int row = pendingTable.getSelectedRow(); - enablePendingTableButtons((row >= 0) && (row < pendingTable.getRowCount())); + boolean enablePrioritizeButtons = false; + boolean enableDeprioritizeButtons = false; + if ((row >= 0) && (row < pendingTable.getRowCount())) { + enablePrioritizeButtons = true; + enableDeprioritizeButtons = ((Integer) pendingTableModel.getValueAt(row, JobsTableModelColumns.PRIORITY.ordinal()) > 0); + } + enablePrioritizeButtons(enablePrioritizeButtons); + enableDeprioritizeButtons(enableDeprioritizeButtons); }); /* @@ -597,7 +604,8 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { private void initButtons() { bnOptions.setEnabled(true); bnDeleteCase.setEnabled(false); - enablePendingTableButtons(false); + enablePrioritizeButtons(false); + enableDeprioritizeButtons(false); bnShowCaseLog.setEnabled(false); bnReprocessJob.setEnabled(false); bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestControlPanel.class, "AutoIngestControlPanel.bnStart.text")); @@ -620,13 +628,22 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { } /** - * Enables or disables buttons related to pending jobs table. + * Enables or disables prioritize buttons related to the pending jobs table. * * @param enable Enable/disable the buttons. */ - private void enablePendingTableButtons(Boolean enable) { + private void enablePrioritizeButtons(Boolean enable) { bnPrioritizeCase.setEnabled(enable); bnPrioritizeJob.setEnabled(enable); + } + + /** + * Enables or disables deprioritize buttons related to the pending jobs + * table. + * + * @param enable Enable/disable the buttons. + */ + private void enableDeprioritizeButtons(Boolean enable) { bnDeprioritizeCase.setEnabled(enable); bnDeprioritizeJob.setEnabled(enable); } @@ -1769,7 +1786,8 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { } refreshTables(); pendingTable.clearSelection(); - enablePendingTableButtons(false); + enablePrioritizeButtons(false); + enableDeprioritizeButtons(false); AutoIngestControlPanel.this.setCursor(Cursor.getDefaultCursor()); } }//GEN-LAST:event_bnPrioritizeCaseActionPerformed @@ -1828,7 +1846,8 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { } refreshTables(); pendingTable.clearSelection(); - enablePendingTableButtons(false); + enablePrioritizeButtons(false); + enableDeprioritizeButtons(false); AutoIngestControlPanel.this.setCursor(Cursor.getDefaultCursor()); } }//GEN-LAST:event_bnPrioritizeJobActionPerformed @@ -1874,7 +1893,8 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { } refreshTables(); pendingTable.clearSelection(); - enablePendingTableButtons(false); + enablePrioritizeButtons(false); + enableDeprioritizeButtons(false); AutoIngestControlPanel.this.setCursor(Cursor.getDefaultCursor()); } }//GEN-LAST:event_bnDeprioritizeCaseActionPerformed @@ -1892,7 +1912,8 @@ public final class AutoIngestControlPanel extends JPanel implements Observer { } refreshTables(); pendingTable.clearSelection(); - enablePendingTableButtons(false); + enablePrioritizeButtons(false); + enableDeprioritizeButtons(false); AutoIngestControlPanel.this.setCursor(Cursor.getDefaultCursor()); } }//GEN-LAST:event_bnDeprioritizeJobActionPerformed diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java index 65b69f1c7c..9324f782a3 100644 --- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java +++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java @@ -247,11 +247,16 @@ final class AutoIngestDashboard extends JPanel implements Observer { } int row = pendingTable.getSelectedRow(); - boolean enablePrioritizeButtons = (row >= 0 && row < pendingTable.getRowCount()); + boolean enablePrioritizeButtons = false; + boolean enableDeprioritizeButtons = false; + if (row >= 0 && row < pendingTable.getRowCount()) { + enablePrioritizeButtons = true; + enableDeprioritizeButtons = (Integer) pendingTableModel.getValueAt(row, JobsTableModelColumns.PRIORITY.ordinal()) > 0; + } this.prioritizeJobButton.setEnabled(enablePrioritizeButtons); this.prioritizeCaseButton.setEnabled(enablePrioritizeButtons); - this.deprioritizeJobButton.setEnabled(enablePrioritizeButtons); - this.deprioritizeCaseButton.setEnabled(enablePrioritizeButtons); + this.deprioritizeJobButton.setEnabled(enableDeprioritizeButtons); + this.deprioritizeCaseButton.setEnabled(enableDeprioritizeButtons); }); }