Merge pull request #3475 from sleuthkit/custom-release-2.11.1

Merge in custom release 2.11.1 branch
This commit is contained in:
Richard Cordovano 2018-02-27 17:13:16 -05:00 committed by GitHub
commit bc28f09939
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 551 additions and 91 deletions

View File

@ -178,11 +178,12 @@ public class BlackboardArtifactNode extends AbstractContentNode<BlackboardArtifa
}
/**
* The finalizer removes event listeners as the BlackboardArtifactNode
* is being garbage collected. Yes, we know that finalizers are considered
* to be "bad" but since the alternative also relies on garbage collection
* The finalizer removes event listeners as the BlackboardArtifactNode is
* being garbage collected. Yes, we know that finalizers are considered to
* be "bad" but since the alternative also relies on garbage collection
* being run and we know that finalize will be called when the object is
* being GC'd it seems like this is a reasonable solution.
*
* @throws Throwable
*/
@Override
@ -300,7 +301,9 @@ public class BlackboardArtifactNode extends AbstractContentNode<BlackboardArtifa
"BlackboardArtifactNode.createSheet.artifactType.name=Artifact Type",
"BlackboardArtifactNode.createSheet.artifactDetails.displayName=Artifact Details",
"BlackboardArtifactNode.createSheet.artifactDetails.name=Artifact Details",
"BlackboardArtifactNode.artifact.displayName=Artifact"})
"BlackboardArtifactNode.artifact.displayName=Artifact",
"BlackboardArtifactNode.createSheet.artifactMD5.displayName=MD5 Hash",
"BlackboardArtifactNode.createSheet.artifactMD5.name=MD5 Hash"})
@Override
protected Sheet createSheet() {
@ -415,6 +418,10 @@ public class BlackboardArtifactNode extends AbstractContentNode<BlackboardArtifa
NbBundle.getMessage(BlackboardArtifactNode.class, "ContentTagNode.createSheet.fileSize.displayName"),
"",
associated.getSize()));
ss.put(new NodeProperty<>(Bundle.BlackboardArtifactNode_createSheet_artifactMD5_name(),
Bundle.BlackboardArtifactNode_createSheet_artifactMD5_displayName(),
"",
file != null ? file.getMd5Hash() : ""));
}
} else {
String dataSourceStr = "";

View File

@ -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;
}

View File

@ -73,6 +73,8 @@
<Group type="103" groupAlignment="0" max="-2" attributes="0">
<Component id="bnPrioritizeCase" max="32767" attributes="0"/>
<Component id="bnPrioritizeJob" max="32767" attributes="0"/>
<Component id="bnDeprioritizeCase" alignment="0" max="32767" attributes="0"/>
<Component id="bnDeprioritizeJob" alignment="0" max="32767" attributes="0"/>
</Group>
</Group>
</Group>
@ -102,10 +104,14 @@
<Component id="pendingScrollPane" min="-2" pref="215" max="-2" attributes="0"/>
</Group>
<Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="82" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="48" max="-2" attributes="0"/>
<Component id="bnPrioritizeCase" linkSize="2" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="bnDeprioritizeCase" min="-2" max="-2" attributes="0"/>
<EmptySpace min="-2" pref="30" max="-2" attributes="0"/>
<Component id="bnPrioritizeJob" linkSize="2" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="bnDeprioritizeJob" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
<EmptySpace max="-2" attributes="0"/>
@ -608,5 +614,52 @@
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnReprocessJobActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="bnDeprioritizeCase">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestControlPanel.bnDeprioritizeCase.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestControlPanel.bnDeprioritizeCase.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[162, 23]"/>
</Property>
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[162, 23]"/>
</Property>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[162, 23]"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnDeprioritizeCaseActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="bnDeprioritizeJob">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestControlPanel.bnDeprioritizeJob.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestControlPanel.bnDeprioritizeJob.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="actionCommand" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestControlPanel.bnDeprioritizeJob.actionCommand" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[162, 23]"/>
</Property>
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[162, 23]"/>
</Property>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[162, 23]"/>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnDeprioritizeJobActionPerformed"/>
</Events>
</Component>
</SubComponents>
</Form>

View File

@ -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.bnPrioritizeJob.text>",
"AutoIngestControlPanel.lbServicesStatus.text=Services Status:",
"AutoIngestControlPanel.tbServicesStatusMessage.text=",
"AutoIngestControlPanel.bnOpenLogDir.text=Open System Logs Folder",
"AutoIngestControlPanel.bnReprocessJob.text=Reprocess Job",
"AutoIngestControlPanel.bnPrioritizeFolder.label=<AutoIngestControlPanel.bnPrioritizeJob.text>",
"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.",
@ -418,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);
});
/*
@ -622,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"));
@ -645,15 +628,26 @@ 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);
}
/**
* Starts up the auto ingest manager and adds this panel as an observer,
* subscribes to services monitor events and starts a task to populate the
@ -1201,6 +1195,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 +1430,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 +1505,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 +1532,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 +1772,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,11 +1782,12 @@ 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();
enablePendingTableButtons(false);
enablePrioritizeButtons(false);
enableDeprioritizeButtons(false);
AutoIngestControlPanel.this.setCursor(Cursor.getDefaultCursor());
}
}//GEN-LAST:event_bnPrioritizeCaseActionPerformed
@ -1807,7 +1833,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,12 +1841,13 @@ 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();
enablePendingTableButtons(false);
enablePrioritizeButtons(false);
enableDeprioritizeButtons(false);
AutoIngestControlPanel.this.setCursor(Cursor.getDefaultCursor());
}
}//GEN-LAST:event_bnPrioritizeJobActionPerformed
@ -1852,11 +1879,52 @@ 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();
enablePrioritizeButtons(false);
enableDeprioritizeButtons(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();
enablePrioritizeButtons(false);
enableDeprioritizeButtons(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;

View File

@ -35,11 +35,15 @@
<Group type="103" groupAlignment="1" attributes="0">
<Group type="102" alignment="0" attributes="0">
<Component id="refreshButton" linkSize="1" min="-2" pref="100" max="-2" attributes="0"/>
<EmptySpace type="unrelated" max="-2" attributes="0"/>
<EmptySpace type="separate" max="-2" attributes="0"/>
<Component id="prioritizeJobButton" linkSize="1" min="-2" pref="100" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="deprioritizeJobButton" min="-2" pref="127" max="-2" attributes="0"/>
<EmptySpace type="separate" max="-2" attributes="0"/>
<Component id="prioritizeCaseButton" linkSize="1" min="-2" pref="100" max="-2" attributes="0"/>
<EmptySpace type="unrelated" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="deprioritizeCaseButton" min="-2" pref="127" max="-2" attributes="0"/>
<EmptySpace type="separate" max="-2" attributes="0"/>
<Component id="clusterMetricsButton" linkSize="1" min="-2" max="-2" attributes="0"/>
</Group>
<Component id="lbPending" alignment="0" min="-2" max="-2" attributes="0"/>
@ -84,6 +88,8 @@
<Component id="prioritizeJobButton" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="prioritizeCaseButton" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="clusterMetricsButton" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="deprioritizeJobButton" alignment="3" min="-2" max="-2" attributes="0"/>
<Component id="deprioritizeCaseButton" alignment="3" min="-2" max="-2" attributes="0"/>
</Group>
<EmptySpace max="-2" attributes="0"/>
</Group>
@ -265,5 +271,33 @@
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="clusterMetricsButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="deprioritizeJobButton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestDashboard.deprioritizeJobButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestDashboard.deprioritizeJobButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="enabled" type="boolean" value="false"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="deprioritizeJobButtonActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="deprioritizeCaseButton">
<Properties>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestDashboard.deprioritizeCaseButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestDashboard.deprioritizeCaseButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
<Property name="enabled" type="boolean" value="false"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="deprioritizeCaseButtonActionPerformed"/>
</Events>
</Component>
</SubComponents>
</Form>

View File

@ -247,9 +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(enableDeprioritizeButtons);
this.deprioritizeCaseButton.setEnabled(enableDeprioritizeButtons);
});
}
@ -655,6 +662,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 +768,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 +800,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 +847,9 @@ final class AutoIngestDashboard extends JPanel implements Observer {
.addComponent(refreshButton)
.addComponent(prioritizeJobButton)
.addComponent(prioritizeCaseButton)
.addComponent(clusterMetricsButton))
.addComponent(clusterMetricsButton)
.addComponent(deprioritizeJobButton)
.addComponent(deprioritizeCaseButton))
.addContainerGap())
);
}// </editor-fold>//GEN-END:initComponents
@ -835,9 +868,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 +878,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 +886,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 +896,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 +908,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;

View File

@ -1,7 +1,7 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2011-2017 Basis Technology Corp.
* Copyright 2011-2018 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -132,6 +132,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;
@ -530,7 +531,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<AutoIngestJob> jobsToDeprioritize = new ArrayList<>();
synchronized (jobsLock) {
for (AutoIngestJob job : pendingJobs) {
if (job.getManifest().getCaseName().equals(caseName)) {
jobsToDeprioritize.add(job);
}
}
if (!jobsToDeprioritize.isEmpty()) {
for (AutoIngestJob job : jobsToDeprioritize) {
int oldPriority = job.getPriority();
job.setPriority(DEFAULT_PRIORITY);
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 (!jobsToDeprioritize.isEmpty()) {
new Thread(() -> {
eventPublisher.publishRemotely(new AutoIngestCasePrioritizedEvent(LOCAL_HOST_NAME, caseName));
}).start();
}
}
/**
* Bumps the priority of all pending ingest jobs for a specified case.
*
@ -545,7 +588,7 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen
return;
}
List<AutoIngestJob> prioritizedJobs = new ArrayList<>();
List<AutoIngestJob> jobsToPrioritize = new ArrayList<>();
int maxPriority = 0;
synchronized (jobsLock) {
for (AutoIngestJob job : pendingJobs) {
@ -553,12 +596,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 {
@ -573,7 +616,58 @@ 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();
}
}
/**
* 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 jobToDeprioritize = null;
synchronized (jobsLock) {
/*
* Find the job in the pending jobs list.
*/
for (AutoIngestJob job : pendingJobs) {
if (job.getManifest().getFilePath().equals(manifestPath)) {
jobToDeprioritize = job;
}
}
/*
* Remove the priority and update the coordination service manifest
* node data for the job.
*/
if (null != jobToDeprioritize) {
int oldPriority = jobToDeprioritize.getPriority();
jobToDeprioritize.setPriority(DEFAULT_PRIORITY);
try {
this.updateCoordinationServiceManifestNode(jobToDeprioritize);
} catch (CoordinationServiceException | InterruptedException ex) {
jobToDeprioritize.setPriority(oldPriority);
throw new AutoIngestManagerException("Error updating job priority", ex);
}
}
Collections.sort(pendingJobs, new AutoIngestJob.PriorityComparator());
}
if (null != jobToDeprioritize) {
final String caseName = jobToDeprioritize.getManifest().getCaseName();
new Thread(() -> {
eventPublisher.publishRemotely(new AutoIngestCasePrioritizedEvent(LOCAL_HOST_NAME, caseName));
}).start();
@ -594,7 +688,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
@ -605,7 +699,7 @@ final class AutoIngestManager extends Observable implements PropertyChangeListen
maxPriority = job.getPriority();
}
if (job.getManifest().getFilePath().equals(manifestPath)) {
prioritizedJob = job;
jobToPrioritize = job;
}
}
@ -613,14 +707,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);
}
}
@ -628,8 +722,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();

View File

@ -1,7 +1,7 @@
/*
* Autopsy Forensic Browser
*
* Copyright 2011-2017 Basis Technology Corp.
* Copyright 2011-2018 Basis Technology Corp.
* Contact: carrier <at> sleuthkit <dot> org
*
* Licensed under the Apache License, Version 2.0 (the "License");
@ -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;
@ -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<AutoIngestJob> jobsToDeprioritize = new ArrayList<>();
synchronized (jobsLock) {
for (AutoIngestJob pendingJob : jobsSnapshot.getPendingJobs()) {
if (pendingJob.getManifest().getCaseName().equals(caseName)) {
jobsToDeprioritize.add(pendingJob);
}
}
if (!jobsToDeprioritize.isEmpty()) {
for (AutoIngestJob job : jobsToDeprioritize) {
String manifestNodePath = job.getManifest().getFilePath().toString();
try {
AutoIngestJobNodeData nodeData = new AutoIngestJobNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath));
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(DEFAULT_PRIORITY);
}
/*
* Publish a deprioritization event.
*/
new Thread(() -> {
eventPublisher.publishRemotely(new AutoIngestCasePrioritizedEvent(LOCAL_HOST_NAME, caseName));
}).start();
}
return jobsSnapshot;
}
}
/**
* Bumps the priority of all pending ingest jobs for a specified case.
*
@ -287,11 +332,11 @@ 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 {
List<AutoIngestJob> prioritizedJobs = new ArrayList<>();
List<AutoIngestJob> jobsToPrioritize = new ArrayList<>();
int highestPriority = 0;
synchronized (jobsLock) {
for (AutoIngestJob pendingJob : jobsSnapshot.getPendingJobs()) {
@ -299,12 +344,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));
@ -327,20 +372,71 @@ 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 jobToDeprioritize = null;
/*
* Make sure the job is still in the pending jobs queue.
*/
for (AutoIngestJob pendingJob : jobsSnapshot.getPendingJobs()) {
if (pendingJob.equals(job)) {
jobToDeprioritize = job;
break;
}
}
/*
* If the job was still in the pending jobs queue, bump its
* priority.
*/
if (null != jobToDeprioritize) {
String manifestNodePath = job.getManifest().getFilePath().toString();
try {
AutoIngestJobNodeData nodeData = new AutoIngestJobNodeData(coordinationService.getNodeData(CoordinationService.CategoryNode.MANIFESTS, manifestNodePath));
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);
}
jobToDeprioritize.setPriority(DEFAULT_PRIORITY);
/*
* Publish a deprioritization event.
*/
final String caseName = job.getManifest().getCaseName();
new Thread(() -> {
eventPublisher.publishRemotely(new AutoIngestCasePrioritizedEvent(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 {
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.
@ -350,7 +446,7 @@ final class AutoIngestMonitor extends Observable implements PropertyChangeListen
highestPriority = pendingJob.getPriority();
}
if (pendingJob.equals(job)) {
prioritizedJob = job;
jobToPrioritize = job;
}
}
@ -358,7 +454,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 {
@ -368,7 +464,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.
@ -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
}
}
}
}

View File

@ -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