Merge pull request #2293 from eugene7646/aim_move
1924 Moved AID into Autopsy
@ -0,0 +1,450 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
|
||||
<Form version="1.6" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
||||
<AuxValues>
|
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
|
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Group type="103" groupAlignment="1" attributes="0">
|
||||
<Component id="lbPending" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="pendingScrollPane" min="-2" pref="920" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="bnPrioritizeCase" min="-2" pref="117" max="-2" attributes="0"/>
|
||||
<Component id="bnPrioritizeFolder" min="-2" pref="117" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<Group type="102" attributes="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace min="-2" pref="75" max="-2" attributes="0"/>
|
||||
<Component id="bnPause" linkSize="1" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" pref="100" max="-2" attributes="0"/>
|
||||
<Component id="bnRefresh" linkSize="1" min="-2" pref="100" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" pref="100" max="-2" attributes="0"/>
|
||||
<Component id="bnOptions" linkSize="1" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" pref="100" max="-2" attributes="0"/>
|
||||
<Component id="bnExit" linkSize="1" min="-2" pref="94" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="runningScrollPane" min="-2" pref="920" max="-2" attributes="0"/>
|
||||
<Component id="completedScrollPane" min="-2" pref="920" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" max="-2" attributes="0">
|
||||
<Component id="bnCancelJob" linkSize="1" pref="117" max="32767" attributes="0"/>
|
||||
<Component id="bnShowProgress" linkSize="1" pref="116" max="32767" attributes="0"/>
|
||||
<Component id="bnCancelModule" linkSize="1" alignment="0" pref="117" max="32767" attributes="0"/>
|
||||
<Component id="bnDeleteCase" linkSize="1" alignment="0" pref="117" max="32767" attributes="0"/>
|
||||
<Component id="bnShowCaseLog" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="lbStatus" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Component id="tbStatusMessage" min="-2" pref="861" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Component id="lbCompleted" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="lbRunning" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="lbServicesStatus" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Component id="tbServicesStatusMessage" min="-2" pref="861" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="lbStatus" alignment="3" min="-2" pref="23" max="-2" attributes="0"/>
|
||||
<Component id="tbStatusMessage" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="lbServicesStatus" alignment="3" min="-2" pref="23" max="-2" attributes="0"/>
|
||||
<Component id="tbServicesStatusMessage" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="lbPending" min="-2" pref="23" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<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"/>
|
||||
<Component id="bnPrioritizeCase" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="bnPrioritizeFolder" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="lbRunning" min="-2" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace min="-2" pref="34" max="-2" attributes="0"/>
|
||||
<Component id="bnShowProgress" linkSize="2" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="bnCancelJob" linkSize="2" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="bnCancelModule" linkSize="2" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="runningScrollPane" min="-2" pref="133" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace min="-2" pref="102" max="-2" attributes="0"/>
|
||||
<Component id="bnDeleteCase" linkSize="2" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Component id="bnShowCaseLog" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="lbCompleted" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="completedScrollPane" min="-2" pref="179" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="bnExit" linkSize="2" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="bnPause" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="bnRefresh" linkSize="2" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="bnOptions" linkSize="2" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JScrollPane" name="pendingScrollPane">
|
||||
<AuxValues>
|
||||
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JTable" name="pendingTable">
|
||||
<Properties>
|
||||
<Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||
<Connection code="pendingTableModel" type="code"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.pendingTable.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="autoResizeMode" type="int" value="4"/>
|
||||
<Property name="rowHeight" type="int" value="20" postCode="pendingTable.setSelectionModel(new DefaultListSelectionModel() {
 private static final long serialVersionUID = 1L;
 @Override
 public void setSelectionInterval(int index0, int index1) {
 if (index0 == pendingTable.getSelectedRow()) {
 pendingTable.clearSelection();
 } else {
 super.setSelectionInterval(index0, index1);
 }
 }
});"/>
|
||||
<Property name="selectionModel" type="javax.swing.ListSelectionModel" editor="org.netbeans.modules.form.editors2.JTableSelectionModelEditor">
|
||||
<JTableSelectionModel selectionMode="0"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Container class="javax.swing.JScrollPane" name="runningScrollPane">
|
||||
<AuxValues>
|
||||
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JTable" name="runningTable">
|
||||
<Properties>
|
||||
<Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||
<Connection code="runningTableModel" type="code"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.runningTable.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="autoResizeMode" type="int" value="4"/>
|
||||
<Property name="rowHeight" type="int" value="20" postCode="runningTable.setSelectionModel(new DefaultListSelectionModel() {
 private static final long serialVersionUID = 1L;
 @Override
 public void setSelectionInterval(int index0, int index1) {
 if (index0 == runningTable.getSelectedRow()) {
 runningTable.clearSelection();
 } else {
 super.setSelectionInterval(index0, index1);
 }
 }
});"/>
|
||||
<Property name="selectionModel" type="javax.swing.ListSelectionModel" editor="org.netbeans.modules.form.editors2.JTableSelectionModelEditor">
|
||||
<JTableSelectionModel selectionMode="0"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Container class="javax.swing.JScrollPane" name="completedScrollPane">
|
||||
<AuxValues>
|
||||
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JTable" name="completedTable">
|
||||
<Properties>
|
||||
<Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||
<Connection code="completedTableModel" type="code"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.completedTable.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="autoResizeMode" type="int" value="4"/>
|
||||
<Property name="rowHeight" type="int" value="20" postCode="completedTable.setSelectionModel(new DefaultListSelectionModel() {
 private static final long serialVersionUID = 1L;
 @Override
 public void setSelectionInterval(int index0, int index1) {
 if (index0 == completedTable.getSelectedRow()) {
 completedTable.clearSelection();
 } else {
 super.setSelectionInterval(index0, index1);
 }
 }
});"/>
|
||||
<Property name="selectionModel" type="javax.swing.ListSelectionModel" editor="org.netbeans.modules.form.editors2.JTableSelectionModelEditor">
|
||||
<JTableSelectionModel selectionMode="0"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Component class="javax.swing.JButton" name="bnCancelJob">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnCancelJob.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnCancelJob.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnCancelJobActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="bnDeleteCase">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnDeleteCase.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnDeleteCase.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnDeleteCaseActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="lbPending">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Tahoma" size="14" style="0"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.lbPending.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="lbRunning">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Tahoma" size="14" style="0"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.lbRunning.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="lbCompleted">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Tahoma" size="14" style="0"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.lbCompleted.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="bnRefresh">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnRefresh.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnRefresh.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnRefreshActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="bnCancelModule">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnCancelModule.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnCancelModule.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnCancelModuleActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="bnExit">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnExit.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnExit.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnExitActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="bnOptions">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnOptions.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnOptions.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="enabled" type="boolean" value="false"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnOptionsActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="bnShowProgress">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnShowProgress.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnShowProgress.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnShowProgressActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="bnPause">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnPause.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnPause.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnPauseActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="bnPrioritizeCase">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnPrioritizeCase.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnPrioritizeCase.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnPrioritizeCaseActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="bnShowCaseLog">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnShowCaseLog.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnShowCaseLog.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnShowCaseLogActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JTextField" name="tbStatusMessage">
|
||||
<Properties>
|
||||
<Property name="editable" type="boolean" value="false"/>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Tahoma" size="12" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.tbStatusMessage.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
|
||||
<Border info="null"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="lbStatus">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Tahoma" size="14" style="0"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.lbStatus.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="bnPrioritizeFolder">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnPrioritizeFolder.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.bnPrioritizeFolder.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnPrioritizeFolderActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="lbServicesStatus">
|
||||
<Properties>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Tahoma" size="14" style="0"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.lbServicesStatus.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JTextField" name="tbServicesStatusMessage">
|
||||
<Properties>
|
||||
<Property name="editable" type="boolean" value="false"/>
|
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
|
||||
<Font name="Tahoma" size="12" style="1"/>
|
||||
</Property>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/autoingest/Bundle.properties" key="AutoIngestDashboard.tbServicesStatusMessage.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
|
||||
<Border info="null"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Form>
|
1706
Core/src/org/sleuthkit/autopsy/autoingest/AutoIngestDashboard.java
Normal file
595
Core/src/org/sleuthkit/autopsy/autoingest/AutoIngestJob.java
Normal file
@ -0,0 +1,595 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2015 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> 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.autoingest;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.attribute.BasicFileAttributes;
|
||||
import java.time.Instant;
|
||||
import java.util.Comparator;
|
||||
import java.util.Date;
|
||||
import java.util.Objects;
|
||||
import java.util.logging.Level;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.autopsy.coreutils.NetworkUtils;
|
||||
import org.sleuthkit.autopsy.core.UserPreferences;
|
||||
import org.sleuthkit.autopsy.ingest.IngestJob;
|
||||
import org.joda.time.DateTime;
|
||||
|
||||
/**
|
||||
* An automated ingest job completed by, or to be completed by, the automated
|
||||
* ingest manager.
|
||||
*/
|
||||
class AutoIngestJob implements Comparable<AutoIngestJob> {
|
||||
|
||||
// ELTODO: move JobIngestStatus back into AIM
|
||||
/**
|
||||
* Represents the state of an auto ingest job at any given moment during its
|
||||
* lifecycle as it moves from waiting to be processed, through the various
|
||||
* stages of processing, to its final completed state.
|
||||
*/
|
||||
static final class JobIngestStatus {
|
||||
|
||||
private enum IngestStatus {
|
||||
|
||||
PENDING("Pending"),
|
||||
STARTING("Starting"),
|
||||
UPDATING_SHARED_CONFIG("Updating shared configuration"),
|
||||
CHECKING_SERVICES("Checking services"),
|
||||
OPENING_CASE("Opening case"),
|
||||
IDENTIFYING_IMAGES("Identifying images"),
|
||||
ADDING_IMAGES("Adding images"),
|
||||
ANALYZING_IMAGES("Analyzing images"),
|
||||
ANALYZING_FILES("Analyzing files"),
|
||||
EXPORTING_FILES("Exporting files"),
|
||||
CANCELLING_MODULE("Cancelling module"),
|
||||
CANCELLING("Cancelling"),
|
||||
COMPLETED("Completed");
|
||||
|
||||
private final String displayText;
|
||||
|
||||
private IngestStatus(String displayText) {
|
||||
this.displayText = displayText;
|
||||
}
|
||||
|
||||
String getDisplayText() {
|
||||
return displayText;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private IngestStatus ingestStatus;
|
||||
private String statusDisplayName;
|
||||
private Date startDate;
|
||||
private IngestJob ingestJob;
|
||||
private boolean cancelled;
|
||||
private Date dateCompleted;
|
||||
|
||||
private JobIngestStatus(Date dateCompleted) {
|
||||
ingestStatus = IngestStatus.PENDING;
|
||||
statusDisplayName = ingestStatus.getDisplayText();
|
||||
startDate = DateTime.now().toDate();
|
||||
this.dateCompleted = dateCompleted;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates displayed status and start fileTime of auto ingest job. Used
|
||||
* primarily to display status of remote running jobs.
|
||||
*
|
||||
* @param newDisplayName Displayed status of the auto ingest job.
|
||||
* @param startTime Start fileTime of the current activity.
|
||||
*/
|
||||
synchronized private void setStatus(String newDisplayName, Date startTime) {
|
||||
statusDisplayName = newDisplayName;
|
||||
startDate = startTime;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates status of auto ingest job. Sets current fileTime as activity
|
||||
* start fileTime. Used to update status of local running job.
|
||||
*
|
||||
* @param newStatus Status of the auto ingest job.
|
||||
*/
|
||||
synchronized private void setStatus(IngestStatus newStatus) {
|
||||
if (ingestStatus == IngestStatus.CANCELLING && newStatus != IngestStatus.COMPLETED) {
|
||||
/**
|
||||
* Do not overwrite canceling status with anything other than
|
||||
* completed status.
|
||||
*/
|
||||
return;
|
||||
}
|
||||
ingestStatus = newStatus;
|
||||
statusDisplayName = ingestStatus.getDisplayText();
|
||||
startDate = Date.from(Instant.now());
|
||||
if (ingestStatus == IngestStatus.COMPLETED) {
|
||||
/**
|
||||
* Release the reference for garbage collection since this
|
||||
* object may live for a long time within a completed job.
|
||||
*/
|
||||
ingestJob = null;
|
||||
}
|
||||
if (ingestStatus == IngestStatus.COMPLETED) {
|
||||
dateCompleted = startDate;
|
||||
}
|
||||
}
|
||||
|
||||
synchronized private void setIngestJob(IngestJob ingestJob) {
|
||||
/**
|
||||
* Once this field is set, the ingest job should be used to
|
||||
* determine the current activity up until the the job is completed.
|
||||
*/
|
||||
this.ingestJob = ingestJob;
|
||||
}
|
||||
|
||||
synchronized AutoIngestJob.Status getStatus() {
|
||||
if (null != ingestJob && ingestStatus != IngestStatus.CANCELLING && ingestStatus != IngestStatus.EXPORTING_FILES) {
|
||||
String activityDisplayText;
|
||||
IngestJob.ProgressSnapshot progress = ingestJob.getSnapshot();
|
||||
IngestJob.DataSourceIngestModuleHandle ingestModuleHandle = progress.runningDataSourceIngestModule();
|
||||
if (null != ingestModuleHandle) {
|
||||
/**
|
||||
* A first or second stage data source level ingest module
|
||||
* is running. Reporting this takes precedence over
|
||||
* reporting generic file analysis.
|
||||
*/
|
||||
startDate = ingestModuleHandle.startTime();
|
||||
if (!ingestModuleHandle.isCancelled()) {
|
||||
activityDisplayText = ingestModuleHandle.displayName();
|
||||
} else {
|
||||
activityDisplayText = String.format(IngestStatus.CANCELLING_MODULE.getDisplayText(), ingestModuleHandle.displayName());
|
||||
}
|
||||
} else {
|
||||
/**
|
||||
* If no data source level ingest module is running, then
|
||||
* either it is still the first stage of analysis and file
|
||||
* level ingest modules are running or another ingest job is
|
||||
* still running. Note that there can be multiple ingest
|
||||
* jobs running in parallel. For example, there is an ingest
|
||||
* job created to ingest each extracted virtual machine.
|
||||
*/
|
||||
activityDisplayText = IngestStatus.ANALYZING_FILES.getDisplayText();
|
||||
startDate = progress.fileIngestStartTime();
|
||||
}
|
||||
return new AutoIngestJob.Status(activityDisplayText, startDate);
|
||||
} else {
|
||||
return new AutoIngestJob.Status(statusDisplayName, startDate);
|
||||
}
|
||||
}
|
||||
|
||||
synchronized private IngestJob setStatusCancelled() {
|
||||
cancelled = true;
|
||||
setStatus(JobIngestStatus.IngestStatus.CANCELLING);
|
||||
return ingestJob;
|
||||
}
|
||||
|
||||
synchronized private IngestJob cancelModule() {
|
||||
setStatus(JobIngestStatus.IngestStatus.CANCELLING_MODULE);
|
||||
return ingestJob;
|
||||
}
|
||||
|
||||
synchronized private boolean isCancelled() {
|
||||
return cancelled;
|
||||
}
|
||||
|
||||
synchronized Date getDateCompleted() {
|
||||
return dateCompleted;
|
||||
}
|
||||
|
||||
synchronized Date getDateStarted() {
|
||||
return startDate;
|
||||
}
|
||||
}
|
||||
|
||||
private static final Logger logger = Logger.getLogger(AutoIngestJob.class.getName());
|
||||
private final String caseName;
|
||||
private final Path imageFolderPath;
|
||||
private final Date imageFolderCreateDate;
|
||||
private Path caseFolderName;
|
||||
private final String jobDisplayName;
|
||||
private String nodeName;
|
||||
//ELTODO private final AutoIngestManager.JobIngestStatus ingestStatus;
|
||||
private final JobIngestStatus ingestStatus;
|
||||
private static final String localHostName = NetworkUtils.getLocalHostName();
|
||||
|
||||
/**
|
||||
* This variable is being accessed by AID as well as JMS thread
|
||||
*/
|
||||
private volatile boolean isLocalJob;
|
||||
private Date readyFileTimeStamp;
|
||||
private Date prioritizedFileTimeStamp;
|
||||
|
||||
/**
|
||||
* Constructs an automated ingest job completed by, or to be completed by,
|
||||
* the automated ingest manager.
|
||||
*
|
||||
* @param imageFolderPath The fully qualified path to the case input folder
|
||||
* for the job.
|
||||
* @param caseName The case to which this job belongs. Note that this
|
||||
* is the original case name (and not the timestamped
|
||||
* case name).
|
||||
* @param caseFolderName The fully qualified path to the case output folder
|
||||
* for the job, if known.
|
||||
* @param ingestStatus Ingest status details provided by the automated
|
||||
* ingest manager.
|
||||
* @param nodeName Name of the node that is processing the job
|
||||
*/
|
||||
AutoIngestJob(Path imageFolderPath, String caseName, Path caseFolderName, /* //ELTODO AutoIngestManager.*/JobIngestStatus ingestStatus, String nodeName) {
|
||||
this.caseName = caseName;
|
||||
this.imageFolderPath = imageFolderPath;
|
||||
this.caseFolderName = caseFolderName;
|
||||
this.ingestStatus = ingestStatus;
|
||||
this.jobDisplayName = resolveJobDisplayName(imageFolderPath);
|
||||
this.isLocalJob = true; // jobs are set to "local" by default
|
||||
this.nodeName = nodeName;
|
||||
|
||||
/**
|
||||
* Either initialize to the folder creation date or the current date.
|
||||
* Note that the way this is coded allows the folder creation date field
|
||||
* to be final.
|
||||
*/
|
||||
BasicFileAttributes attrs = null;
|
||||
try {
|
||||
attrs = Files.readAttributes(imageFolderPath, BasicFileAttributes.class);
|
||||
} catch (IOException ex) {
|
||||
logger.log(Level.SEVERE, String.format("Failed to read attributes of input folder %s", imageFolderPath), ex);
|
||||
}
|
||||
this.imageFolderCreateDate = attrs == null ? new Date() : new Date(attrs.creationTime().toMillis());
|
||||
|
||||
try {
|
||||
attrs = Files.readAttributes(Paths.get(imageFolderPath.toString(), StateFile.Type.READY.fileName()), BasicFileAttributes.class);
|
||||
this.readyFileTimeStamp = new Date(attrs.creationTime().toMillis());
|
||||
} catch (IOException ex) {
|
||||
// Auto ingest job may be created for a remotely running job so no need to log exception if we don't find READY file
|
||||
this.readyFileTimeStamp = new Date();
|
||||
}
|
||||
|
||||
try {
|
||||
attrs = Files.readAttributes(Paths.get(imageFolderPath.toString(), StateFile.Type.PRIORITIZED.fileName()), BasicFileAttributes.class);
|
||||
this.prioritizedFileTimeStamp = new Date(attrs.creationTime().toMillis());
|
||||
} catch (IOException ex) {
|
||||
this.prioritizedFileTimeStamp = null;
|
||||
}
|
||||
}
|
||||
|
||||
static final class Status {
|
||||
|
||||
private final String activity;
|
||||
private final Date activityStartDate;
|
||||
|
||||
Status(String activity, Date activityStartTime) {
|
||||
this.activity = activity;
|
||||
this.activityStartDate = activityStartTime;
|
||||
}
|
||||
|
||||
String getActivity() {
|
||||
return this.activity;
|
||||
}
|
||||
|
||||
Date getActivityStartDate() {
|
||||
return this.activityStartDate;
|
||||
}
|
||||
}
|
||||
|
||||
Status getStatus() {
|
||||
return ingestStatus.getStatus();
|
||||
}
|
||||
|
||||
// ELTODO AutoIngestManager.JobIngestStatus getIngestStatus() {
|
||||
JobIngestStatus getIngestStatus() {
|
||||
return ingestStatus;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine auto ingest job's display name. Display name is a relative path
|
||||
* from case folder down to auto ingest job's folder.
|
||||
*
|
||||
* @param jobFolderPath Full path to auto ingest job's directory
|
||||
*
|
||||
* @return Auto ingest job's display name
|
||||
*/
|
||||
private String resolveJobDisplayName(Path jobFolderPath) {
|
||||
Path pathRelative;
|
||||
try {
|
||||
Path rootInputFolderPath = Paths.get(UserPreferences.getAutoModeImageFolder());
|
||||
Path casePath = PathUtils.caseImagesPathFromImageFolderPath(rootInputFolderPath, jobFolderPath);
|
||||
pathRelative = casePath.relativize(jobFolderPath);
|
||||
} catch (Exception ignore) {
|
||||
// job folder is not a subpath of case folder, return entire job folder path
|
||||
return jobFolderPath.toString();
|
||||
}
|
||||
return pathRelative.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the fully qualified path to the input folder.
|
||||
*/
|
||||
Path getImageFolderPath() {
|
||||
return imageFolderPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the case to which the ingest job belongs. Note that
|
||||
* this is the original case name (not the timestamped Autopsy case name).
|
||||
*/
|
||||
String getCaseName() {
|
||||
return this.caseName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the display name for current auto ingest job.
|
||||
*/
|
||||
String getJobDisplayName() {
|
||||
return this.jobDisplayName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the fully qualified path to the case results folder.
|
||||
*/
|
||||
Path getCaseFolderPath() {
|
||||
return this.caseFolderName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the fully qualifies path to the case results folder.
|
||||
*
|
||||
* @param resultsPath
|
||||
*/
|
||||
void setCaseFolderPath(Path resultsPath) {
|
||||
this.caseFolderName = resultsPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the date processing completed on the job.
|
||||
*/
|
||||
Date getDateCompleted() {
|
||||
return ingestStatus.getDateCompleted();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the ready file created date
|
||||
*/
|
||||
Date getReadyFileTimeStamp() {
|
||||
return this.readyFileTimeStamp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the prioritized file created date.
|
||||
*/
|
||||
Date getPrioritizedFileTimeStamp() {
|
||||
return this.prioritizedFileTimeStamp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the created date of the prirotized state file for this job.
|
||||
*/
|
||||
void setPrioritizedFileTimeStamp(Date timeStamp) {
|
||||
/*
|
||||
* RJC: This method is a bit of a hack to support a quick and dirty way
|
||||
* of giving user feedback when an input folder or a case is
|
||||
* prioritized. It can be removed when a better solution is found, or
|
||||
* replaced with a method that looks up the state file time stamp.
|
||||
*/
|
||||
this.prioritizedFileTimeStamp = timeStamp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets case status based on the state files that exist in the job folder.
|
||||
*
|
||||
* @return See CaseStatus enum definition.
|
||||
*/
|
||||
CaseStatus getCaseStatus() {
|
||||
try {
|
||||
if (StateFile.exists(imageFolderPath, StateFile.Type.CANCELLED)) {
|
||||
return CaseStatus.CANCELLATIONS;
|
||||
} else if (StateFile.exists(imageFolderPath, StateFile.Type.ERROR)) {
|
||||
return CaseStatus.ERRORS;
|
||||
} else if (StateFile.exists(imageFolderPath, StateFile.Type.INTERRUPTED)) {
|
||||
return CaseStatus.INTERRUPTS;
|
||||
} else {
|
||||
return CaseStatus.OK;
|
||||
}
|
||||
} catch (IOException | SecurityException ex) {
|
||||
logger.log(Level.SEVERE, String.format("Failed to determine status of case at %s", imageFolderPath), ex);
|
||||
return CaseStatus.ERRORS;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the date the input folder was created.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
Date getDateCreated() {
|
||||
return this.imageFolderCreateDate;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates flag whether the auto ingest job is running on local AIM node or
|
||||
* remote one.
|
||||
*
|
||||
* @param isLocal true if job is local, false otherwise.
|
||||
*/
|
||||
void setIsLocalJob(boolean isLocal) {
|
||||
this.isLocalJob = isLocal;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets flag whether the auto ingest job is running on local AIM node or
|
||||
* remote one.
|
||||
*
|
||||
* @return True if job is local, false otherwise.
|
||||
*/
|
||||
boolean getIsLocalJob() {
|
||||
return this.isLocalJob;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets name of AIN that is processing the job.
|
||||
*
|
||||
* @return Name of the node that is processing the job.
|
||||
*/
|
||||
public String getNodeName() {
|
||||
return nodeName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets name of AIN that is processing the job.
|
||||
*
|
||||
* @param nodeName Name of the node that is processing the job.
|
||||
*/
|
||||
public void setNodeName(String nodeName) {
|
||||
this.nodeName = nodeName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof AutoIngestJob)) {
|
||||
return false;
|
||||
}
|
||||
if (obj == this) {
|
||||
return true;
|
||||
}
|
||||
AutoIngestJob rhs = (AutoIngestJob) obj;
|
||||
|
||||
return this.imageFolderPath.toString().equals(rhs.imageFolderPath.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int hash = 7;
|
||||
hash = 71 * hash + Objects.hashCode(this.imageFolderPath);
|
||||
hash = 71 * hash + Objects.hashCode(this.imageFolderCreateDate);
|
||||
hash = 71 * hash + Objects.hashCode(this.caseName);
|
||||
return hash;
|
||||
}
|
||||
|
||||
/**
|
||||
* Default sorting is by ready file creation date, descending
|
||||
*/
|
||||
@Override
|
||||
public int compareTo(AutoIngestJob o) {
|
||||
return -this.imageFolderCreateDate.compareTo(o.getDateCreated());
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if this job object is a higher priority than the otherJob.
|
||||
*
|
||||
* @param otherJob The job to compare against.
|
||||
*
|
||||
* @return true if this job is a higher priority, otherwise false.
|
||||
*/
|
||||
boolean isHigherPriorityThan(AutoIngestJob otherJob) {
|
||||
if (this.prioritizedFileTimeStamp == null) {
|
||||
return false;
|
||||
}
|
||||
if (otherJob.prioritizedFileTimeStamp == null) {
|
||||
return true;
|
||||
}
|
||||
return (this.prioritizedFileTimeStamp.compareTo(otherJob.prioritizedFileTimeStamp) > 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom comparator that allows us to sort List<AutoIngestJob> on reverse
|
||||
* chronological date modified (descending)
|
||||
*/
|
||||
static class ReverseDateCompletedComparator implements Comparator<AutoIngestJob> {
|
||||
|
||||
@Override
|
||||
public int compare(AutoIngestJob o1, AutoIngestJob o2) {
|
||||
return -o1.getDateCompleted().compareTo(o2.getDateCompleted());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom comparator that allows us to sort List<AutoIngestJob> on reverse
|
||||
* chronological date created (descending)
|
||||
*/
|
||||
static class ReverseDateCreatedComparator implements Comparator<AutoIngestJob> {
|
||||
|
||||
@Override
|
||||
public int compare(AutoIngestJob o1, AutoIngestJob o2) {
|
||||
return -o1.getDateCreated().compareTo(o2.getDateCreated());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom comparator that allows us to sort List<AutoIngestJob> on reverse
|
||||
* chronological date started (descending)
|
||||
*/
|
||||
static class ReverseDateStartedComparator implements Comparator<AutoIngestJob> {
|
||||
|
||||
@Override
|
||||
public int compare(AutoIngestJob o1, AutoIngestJob o2) {
|
||||
return -o1.getStatus().getActivityStartDate().compareTo(o2.getStatus().getActivityStartDate());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom comparator that sorts the pending list with prioritized cases
|
||||
* first, then nonprioritized cases. Prioritized cases are last in, first
|
||||
* out. Nonprioritized cases are first in, first out. Prioritized times are
|
||||
* from the creation time of the ".prioritized" state file. Non prioritized
|
||||
* are from the folder creation time.
|
||||
*/
|
||||
public static class PrioritizedPendingListComparator implements Comparator<AutoIngestJob> {
|
||||
|
||||
@Override
|
||||
public int compare(AutoIngestJob o1, AutoIngestJob o2) {
|
||||
Date dateCreated1 = o1.getDateCreated();
|
||||
Date dateCreated2 = o2.getDateCreated();
|
||||
Date datePrioritized1 = o1.getPrioritizedFileTimeStamp();
|
||||
Date datePrioritized2 = o2.getPrioritizedFileTimeStamp();
|
||||
|
||||
if (datePrioritized1 != null && datePrioritized2 != null) {
|
||||
// both are prioritized, sort on prioritized file date, last in first out
|
||||
return datePrioritized2.compareTo(datePrioritized1);
|
||||
} else if (datePrioritized1 == null && datePrioritized2 == null) {
|
||||
// both are not prioritized, sort on folder creation date, first in first out
|
||||
return dateCreated1.compareTo(dateCreated2);
|
||||
} else if (datePrioritized1 != null) {
|
||||
// left hand side is prioritized
|
||||
return -1;
|
||||
} else {
|
||||
// datePrioritized2 != null, so right hand side is prioritized
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom comparator that allows us to sort List<AutoIngestJob> on case name
|
||||
* alphabetically except for jobs for the current host, which are placed at
|
||||
* the top of the list.
|
||||
*/
|
||||
static class AlphabeticalComparator implements Comparator<AutoIngestJob> {
|
||||
|
||||
@Override
|
||||
public int compare(AutoIngestJob o1, AutoIngestJob o2) {
|
||||
if (o1.getNodeName().equalsIgnoreCase(localHostName)) {
|
||||
return -1; // o1 is for current case, float to top
|
||||
} else if (o2.getNodeName().equalsIgnoreCase(localHostName)) {
|
||||
return 1; // o2 is for current case, float to top
|
||||
} else {
|
||||
return o1.getCaseName().compareToIgnoreCase(o2.getCaseName());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
283
Core/src/org/sleuthkit/autopsy/autoingest/Bundle.properties
Normal file
@ -0,0 +1,283 @@
|
||||
AutoIngestDashboard.bnRefresh.text=&Refresh
|
||||
AutoIngestDashboard.lbCompleted.text=Completed
|
||||
AutoIngestDashboard.lbRunning.text=Running
|
||||
AutoIngestDashboard.lbPending.text=Pending
|
||||
AutoIngestDashboard.bnCancelModule.text=Cancel &Module
|
||||
AutoIngestDashboard.bnExit.text=&Exit
|
||||
AutoIngestDashboard.bnOptions.text=&Options
|
||||
AutoIngestDashboard.JobsTableModel.ColumnHeader.Case=Case
|
||||
AutoIngestDashboard.JobsTableModel.ColumnHeader.ImageFolder=Image Folder
|
||||
AutoIngestDashboard.JobsTableModel.ColumnHeader.HostName=Host Name
|
||||
AutoIngestDashboard.JobsTableModel.ColumnHeader.CreatedTime=Created Time
|
||||
AutoIngestDashboard.JobsTableModel.ColumnHeader.StartedTime=Started Time
|
||||
AutoIngestDashboard.JobsTableModel.ColumnHeader.CompletedTime=Completed Time
|
||||
AutoIngestDashboard.JobsTableModel.ColumnHeader.Activity=Activity
|
||||
AutoIngestDashboard.JobsTableModel.ColumnHeader.Status=Status
|
||||
AutoIngestDashboard.bnShowProgress.text=&Show Progress
|
||||
AutoIngestDashboard.bnResume.text=Resume
|
||||
AutoIngestDashboard.bnPause.text=Pause
|
||||
AutoIngestDashboard.bnPause.confirmHeader=Are you sure you want to pause?
|
||||
AutoIngestDashboard.bnPause.warningText=Pause will occur after the current job completes processing. This could take a long time. Continue?
|
||||
AutoIngestDashboard.bnPause.toolTipText=Suspend processing of Pending Jobs
|
||||
AutoIngestDashboard.bnPause.toolTipTextResume=Resume processing of Pending Jobs
|
||||
AutoIngestDashboard.bnPause.pausing=Pausing after current job completes...
|
||||
AutoIngestDashboard.bnRefresh.toolTipText=Refresh displayed tables
|
||||
AutoIngestDashboard.bnShowProgress.toolTipText=Show the progress of the currently running Job. This functionality is only available for jobs running on current AIM node.
|
||||
AutoIngestDashboard.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.
|
||||
AutoIngestDashboard.bnExit.toolTipText=Exit Application
|
||||
AutoIngestDashboard.Cancelling=Cancelling...
|
||||
AutoIngestDashboard.bnOptions.toolTipText=Display options panel. All processing must be paused to open the options panel.
|
||||
AutoIngestDashboard.pendingTable.toolTipText=The Pending table displays the order upcoming Jobs will be processed with the top of the list first
|
||||
AutoIngestDashboard.runningTable.toolTipText=The Running table displays the currently running Job and information about it
|
||||
AutoIngestDashboard.completedTable.toolTipText=The Completed table shows all Jobs that have been processed already
|
||||
AutoIngestDashboard.JobsTableModel.ColumnHeader.ActvitiyTime=Run Time
|
||||
AutoIngestDashboard.JobsTableModel.ColumnHeader.CaseFolder=Case Folder
|
||||
AutoIngestDashboard.JobsTableModel.ColumnHeader.LocalJob= Local Job?
|
||||
AutoIngestDashboard.DeletionFailed=Deletion failed for job
|
||||
AutoIngestDashboard.ShowLogFailed.Title=Unable to display case log
|
||||
AutoIngestDashboard.ShowLogFailed.Message=Case log file does not exist
|
||||
AutoIngestDashboard.bnPrioritizeCase.toolTipText=Move all images associated with a case to top of Pending queue.
|
||||
AutoIngestDashboard.bnPrioritizeCase.text=Prioritize Case
|
||||
AutoIngestDashboard.ExitConsequences=This will cancel any currently running job on this host. Exiting while a job is running potentially leaves the case in an inconsistent or corrupted state.
|
||||
AutoIngestDashboard.ExitingStatus=Exiting...
|
||||
AutoIngestDashboard.OK=OK
|
||||
AutoIngestDashboard.Cancel=Cancel
|
||||
AutoIngestDashboard.AutoIngestStartupFailed.Message=Failed to start automated ingest.\nPlease see application log for details.
|
||||
AutoIngestDashboard.AutoIngestStartupFailed.Title=Automated Ingest Error
|
||||
AutoIngestDashboard.AutoIngestStartupError=Failed to start automated ingest. Verify Multi-user Settings.
|
||||
AutoIngestDashboard.AutoIngestStartupWarning.Title=Automated Ingest Warning
|
||||
AutoIngestDashboard.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.
|
||||
AutoIngestDashboard.UpdatingSharedConfig=Updating shared configuration
|
||||
AutoIngestDashboard.SharedConfigurationDisabled=Shared configuration disabled
|
||||
AutoIngestDashboard.EnableConfigurationSettings=Enable shared configuration from the options panel before uploading
|
||||
AutoIngestDashboard.ErrorUploadingConfiguration=Error uploading configuration
|
||||
AutoIngestDashboard.UploadSuccessTitle=Success
|
||||
AutoIngestDashboard.UploadSuccess=Shared configuration successfully uploaded
|
||||
AutoIngestDashboard.UploadFailedTitle=Failed
|
||||
AutoIngestDashboard.ConfigLocked=The shared configuration directory is locked because upload from another node is in progress. \nIf this is an error, you can unlock the directory and then retry the upload.
|
||||
AutoIngestDashboard.ConfigLockedTitle=Configuration directory locked
|
||||
AutoIngestDashboard.tbServicesStatusMessage.Message=Case databases {0}, keyword search {1}, coordination {2}, messaging {3}
|
||||
AutoIngestDashboard.tbServicesStatusMessage.Message.Up=up
|
||||
AutoIngestDashboard.tbServicesStatusMessage.Message.Down=down
|
||||
AutoIngestDashboard.tbServicesStatusMessage.Message.Unknown=unknown
|
||||
ConfirmationDialog.DoNotDelete=Do not delete
|
||||
ConfirmationDialog.Delete=Permanently delete
|
||||
ConfirmationDialog.DeleteAreYouSure=The entire case will be removed. Are you sure you want to delete case
|
||||
ConfirmationDialog.ConfirmDeletion=Do you really want to cancel copy job
|
||||
ConfirmationDialog.ConfirmDeletionHeader=Confirm Deletion
|
||||
ConfirmationDialog.QuestionMark=?
|
||||
ConfirmationDialog.DoNotCancelModule=Do Not Cancel Module
|
||||
ConfirmationDialog.DoNotCancelJob=Do Not Cancel Job
|
||||
ConfirmationDialog.DoNotCancel=Do not cancel
|
||||
ConfirmationDialog.Cancel=Proceed with cancellation
|
||||
ConfirmationDialog.CancelJob=Cancel Job
|
||||
ConfirmationDialog.CancelModule=Cancel Module
|
||||
ConfirmationDialog.CancelModuleAreYouSure=The analysis of the ingest module processing the current job will be canceled. Are you sure?
|
||||
ConfirmationDialog.CancelJobAreYouSure=The currently running job will be canceled. Are you sure?
|
||||
ConfirmationDialog.ConfirmCancellationHeader=Confirm Cancellation
|
||||
ConfirmationDialog.Exit=Exit
|
||||
ConfirmationDialog.DoNotExit=Do Not Exit
|
||||
ConfirmationDialog.ConfirmExit=All incomplete copy jobs will be cancelled. Are you sure?
|
||||
ConfirmationDialog.ConfirmExitHeader=Confirm Exit
|
||||
ReviewModeCasePanel.bnRefresh.text=&Refresh
|
||||
ReviewModeCasePanel.bnOpen.text=&Open
|
||||
ReviewModeCasePanel.rbGroupLabel.text=Show Last 10:
|
||||
ReviewModeCasePanel.rbDays.text=Days
|
||||
ReviewModeCasePanel.rbWeeks.text=Weeks
|
||||
ReviewModeCasePanel.rbMonths.text=Months
|
||||
ReviewModeCasePanel.rbAllCases.text=Everything
|
||||
ReviewModeCasePanel.cannotOpenCase=Cannot Open Case
|
||||
ReviewModeCasePanel.casePathNotFound=Case path not found
|
||||
ReviewModeCasePanel.caseIsLocked=Single-user case is locked.
|
||||
DisplayLogDialog.cannotOpenLog=Unable to open the selected case log file
|
||||
DisplayLogDialog.cannotFindLog=Unable to find the selected case log file
|
||||
DisplayLogDialog.unableToShowLogFile=Unable to show log file
|
||||
DisplayLogDialog.okay=Okay
|
||||
ReviewModeCasePanel.bnShowLog.text=&Show Log
|
||||
CopyFilesPanel.lbFrom.text=From Source
|
||||
CopyFilesPanel.lbTo.text=Destination Case
|
||||
CopyFilesPanel.bnCopy.text=&Copy
|
||||
CopyFilesPanel.bnCancel.text=C&ancel
|
||||
CopyFilesPanel.lbStatus.text=Status
|
||||
CopyFilesPanel.tbCaseName.text=
|
||||
CopyFilesPanel.tbSourceName.text=
|
||||
CopyFilesPanel.bnCaseName.text=B&rowse
|
||||
CopyFilesPanel.bnSourceName.text=&Browse
|
||||
CopyFilesPanel.spRetryCount.toolTipText=Skip this copy job and move on to the next after failing this number of times.
|
||||
CopyFilesPanel.rbExistingCase.text=
|
||||
CopyFilesPanel.rbNewCase.text=
|
||||
CopyFilesPanel.lbFailureText.text=failures
|
||||
CopyFilesPanel.lpSkipAfterText.text=Skip after
|
||||
CopyFilesPanel.lbExistingCase.text=Use Existing Case
|
||||
CopyFilesPanel.lbNewCase.text=Create New Case
|
||||
CopyFilesPanel.lbTitle.text=Schedule New Copy Job
|
||||
CopyFilesPanel.confirmCancellation=Do you really want to cancel the copy operation?
|
||||
CopyFilesPanel.confirmCopyHeader=Confirm Copy to Existing Case
|
||||
CopyFilesPanel.confirmCopyAdd=exists. Do you really want to copy more files to this Case?
|
||||
CopyFilesPanel.confirmCopyYes=Copy
|
||||
CopyFilesPanel.confirmCopyNo=Do not copy
|
||||
CopyFilesPanel.lbScheduledJobs.text=Scheduled Copy Jobs
|
||||
CopyFilesPanel.lbRunningJob.text=Running Copy Job
|
||||
CopyFilesPanel.lbCompletedJobs.text=Completed Copy Jobs
|
||||
CopyFilesPanel.Source=Source
|
||||
CopyFilesPanel.Destination=Destination
|
||||
CopyFilesPanel.Initiated=Initiated
|
||||
CopyFilesPanel.Started=Started
|
||||
CopyFilesPanel.RunTime=Run Time
|
||||
CopyFilesPanel.Status=State
|
||||
CopyFilesPanel.tableCompletedJobs.toolTipText=Shows completed copy jobs and status
|
||||
CopyFilesPanel.toolTipText=Shows the currently running copy job.
|
||||
CopyFilesPanel.lbWait.text=Wait
|
||||
CopyFilesPanel.lbWaitMinutesText.text=minutes before retrying
|
||||
CopyFilesPanel.bnUp.text=
|
||||
CopyFilesPanel.bnDown.text=
|
||||
CopyFilesPanel.bnShowLog.text=&Show Log
|
||||
CopyFilesPanel.tablePendingJobs.toolTipText=Scheduled copy jobs in the order they will complete, starting from the top.
|
||||
CopyFilesPanel.lbPendingJobs.text=Scheduled Copy Jobs
|
||||
CopyFilesPanel.chooseOrCreate=Please choose or create a Case
|
||||
CopyFilesPanel.invalidCasePath=Invalid case path
|
||||
CopyFilesPanel.empty=
|
||||
CopyFilesPanel.failedToDeleteSome=Failed to delete some files in cancelled job
|
||||
CopyFilesPanel.noRunningJob=No running copy job to cancel
|
||||
CopyFilesPanel.destinationEmpty=Destination cannot be within Source
|
||||
CopyFilesPanel.copyAborted=Copy aborted. No copying occurred.
|
||||
CopyFilesPanel.copying=Copying...
|
||||
CopyFilesPanel.copySuccess=Files successfully copied.
|
||||
CopyFilesPanel.errorCopying=Error copying.
|
||||
CopyFilesPanel.permissionDenied=Permission denied. Check permissions on source and destination directories.
|
||||
CopyFilesPanel.retriesLeft=retries left. Waiting to retry.
|
||||
CopyFilesPanel.noRetriesLeft=Error copying. All retries used. Skipping.
|
||||
CopyFilesPanel.cancelled=Cancelled running copy job
|
||||
CopyFilesPanel.deleteConfirmed=Copy job cancelled
|
||||
CopyFilesPanel.deleteNotConfirmed=Copy job not cancelled
|
||||
CopyFilesPanel.deleteUnable=Unable to cancel copy job
|
||||
CopyFilesPanel.unableToOpenLogfile=Unable to open logfile
|
||||
CopyFilesPanel.invalidSourcePath=Invalid source path
|
||||
CopyFilesPanel.lbScheduledJobs.text=Scheduled Copy Jobs (Placeholder)
|
||||
CopyFilesPanel.ConfirmCancellation=Do you really want to cancel the copy operation?
|
||||
CopyFilesPanel.ConfirmCopyHeader=Confirm Copy to Existing Case
|
||||
CopyFilesPanel.ConfirmCopyAdd=exists. Do you really want to copy more files to this Case?
|
||||
CopyFilesPanel.ConfirmCopyYes=Copy
|
||||
CopyFilesPanel.ConfirmCopyNo=Do not copy
|
||||
ConfirmationDialog.ConfirmUnlockHeader=Confirm Case Unlock
|
||||
ReviewModeCasePanel.bnShowLog.text=&Show Log
|
||||
AutoIngestDashboard.bnPrioritizeCase.toolTipText=Move all images associated with a case to top of Pending queue.
|
||||
AutoIngestDashboard.bnPrioritizeCase.text=Prioriti&ze Case
|
||||
AutoIngestDashboard.bnShowCaseLog.toolTipText=Display case log file for selected case
|
||||
AutoIngestDashboard.bnShowCaseLog.text=Show &Log
|
||||
ReviewModeCasePanel.bnShowLog.toolTipText=Display case log file for selected case
|
||||
CopyFilesPanel.bnCancelPendingJob.text=Ca&ncel
|
||||
CopyFilesPanel.tbDestinationCase.text=
|
||||
CopyFilesPanel.cbThrottleNetwork.text=&Throttle Network
|
||||
CopyFilesPanel.cbThrottleNetwork.toolTipText=<html>Select this box if a low-bandwidth network connection is involved in this copy job.<br>\nSelecting this box will artificially limit the transfer speed by inserting strategic delays.<br>\nThis helps copy files across low-bandwidth networks where the transfer would<br>\notherwise fail. Only select this if you are having problems copying across the network.</html>
|
||||
CopyFilesPanel.bnShowCurrentLog.text=Show &Log
|
||||
CopyFilesPanel.bnShowCurrentLog.text=Show &Log
|
||||
AutoIngestDashboard.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.
|
||||
AutoIngestDashboard.bnCancelJob.text=&Cancel Job
|
||||
AutoIngestDashboard.bnDeleteCase.toolTipText=Delete the selected Case in its entirety
|
||||
AutoIngestDashboard.bnDeleteCase.text=&Delete Case
|
||||
CopyFilesPanel.lbCaseName.text=Case Name
|
||||
CaseStatusIconCellRenderer.tooltiptext.ok=Images processed successfully
|
||||
CaseStatusIconCellRenderer.tooltiptext.warning=An error occurred or processing was canceled for at least one image - please check the log
|
||||
CaseImportPanel.ChooseCase=Choose a case to import
|
||||
CaseImportPanel.ChooseSource=Choose source images
|
||||
CaseImportPanel.DatabaseConnected=Database connected
|
||||
CaseImportPanel.DatabaseNotConnected=Verify Multi-user database settings.
|
||||
CaseImportPanel.ImportingCases=Importing case(s)...
|
||||
CaseImportPanel.Cancelling=Cancelling
|
||||
CaseImportPanel.CannotOpenLog=Unable to open log file
|
||||
CaseImportPanel.BadCaseSourceFolder=Bad case source folder name
|
||||
CaseImportPanel.BadCaseDestinationFolder=Bad case destination folder name
|
||||
CaseImportPanel.BadImageSourceFolder=Bad image source folder name
|
||||
CaseImportPanel.BadImageDestinationFolder=Bad image destination folder name
|
||||
CaseImportPanel.Error=Error
|
||||
CaseImportPanel.Complete=Complete
|
||||
CaseImportPanel.Blank=
|
||||
CaseImportPanel.DeleteWarning=Make sure no important files are in the case source directory
|
||||
AutoIngestDashboard.lbStatus.text=Status:
|
||||
AutoIngestDashboard.bnPrioritizeFolder.text=Prioritize &Folder
|
||||
AutoIngestDashboard.bnPrioritizeFolder.toolTipText=Move this folder to the top of the Pending queue.
|
||||
SingleUserCaseImporter.NonUniqueOutputFolder=Output folder not unique. Skipping
|
||||
SingleUserCaseImporter.WillImport=Will import:
|
||||
SingleUserCaseImporter.None=None
|
||||
SingleUserCaseImporter.WillNotImport=Will not import:
|
||||
SingleUserCaseImporter.ContinueWithImport=Continue with import?
|
||||
SingleUserCaseImporter.Cancelled=Cancelled
|
||||
SingleUserCaseImporter.ImportedAsMultiUser=\nThis case was imported as a multi-user collaborative case on
|
||||
SingleUserCaseImporter.StartingBatch=Starting batch processing of
|
||||
SingleUserCaseImporter.to=to
|
||||
SingleUserCaseImporter.ErrorFindingAutFiles=Error trying to find .aut files to import
|
||||
SingleUserCaseImporter.StartedProcessing=Started processing
|
||||
SingleUserCaseImporter.FinishedProcessing=Finished processing
|
||||
SingleUserCaseImporter.FailedToComplete=Failed to complete processing of
|
||||
SingleUserCaseImporter.CompletedBatch=Completed batch processing of
|
||||
SingleUserCaseImporter.AbortingBatch=Aborting batch processing of
|
||||
SingleUserCaseImporter.SourceImageMissing=. Source image missing for
|
||||
ReviewModeCasePanel.bnOptions.text=Op&tions
|
||||
ReviewModeCasePanel.CaseHeaderText=Case
|
||||
ReviewModeCasePanel.CreatedTimeHeaderText=Created Time
|
||||
ReviewModeCasePanel.StatusIconHeaderText=Status
|
||||
ReviewModeCasePanel.OutputFolderHeaderText=Output Folder
|
||||
ReviewModeCasePanel.LastAccessedTimeHeaderText=Last Accessed Time
|
||||
CopyFilesPanel.bnOptions.text=&Options
|
||||
AutoIngestDashboard.lbServicesStatus.text=Services Status:
|
||||
AutoIngestDashboard.tbServicesStatusMessage.text=
|
||||
AutoIngestDashboard.tbStatusMessage.text=
|
||||
FileExporterSettingsPanel.ChooseRootDirectory=Choose a root directory for file output
|
||||
FileExporterSettingsPanel.ChooseReportDirectory=Choose a report directory
|
||||
FileExporterSettingsPanel.RuleName=Rule Name
|
||||
FileExporterSettingsPanel.RootDirectory=Root Directory
|
||||
FileExporterSettingsPanel.ReportDirectory=Report Directory
|
||||
FileExporterSettingsPanel.AttributeValue=Value to compare against
|
||||
FileExporterSettingsPanel.RuleListTooltip=Shows a list of rules.
|
||||
FileExporterSettingsPanel.RuleOutputTooltip=This is the root output folder for saved output. You must have read and write access for this folder.
|
||||
FileExporterSettingsPanel.MimetypeTooltip=Select the MIME Type to compare against.
|
||||
FileExporterSettingsPanel.MimetypeText=MIME Type
|
||||
FileExporterSettingsPanel.MimetypeCheckboxTooltip=Check this to filter based on MIME Type.
|
||||
FileExporterSettingsPanel.FileSizeValueToolTip=Select the value to compare against.
|
||||
FileExporterSettingsPanel.FileSizeUnitToolTip=Select the units of the file size value.
|
||||
FileExporterSettingsPanel.FileSize=File Size
|
||||
FileExporterSettingsPanel.FileSizeComparisonTooltip=Select the file size comparison operator.
|
||||
FileExporterSettingsPanel.MimeTypeComparisonTooltip=Select the MIME Type comparison operator.
|
||||
FileExporterSettingsPanel.CurrentlySelectedRuleNameTooltip=Shows the currently selected rule's name.
|
||||
FileExporterSettingsPanel.SaveText=Save Rule
|
||||
FileExporterSettingsPanel.SaveTooltip=Click to save the rule. There must be a rule name and at least one conditional (checkbox) enabled.
|
||||
FileExporterSettingsPanel.BrowseText=Browse
|
||||
FileExporterSettingsPanel.BrowseRootOutputFolder=Browse to set the root output folder.
|
||||
FileExporterSettingsPanel.NewText=New Rule
|
||||
FileExporterSettingsPanel.NewRuleTooltip=Clears the rule editor, allowing the user to enter a new rule.
|
||||
FileExporterSettingsPanel.BrowseReportTooltip=Browse to set the report output folder.
|
||||
FileExporterSettingsPanel.ReportOutputFolderTooltip=This is the report output folder. You must have read and write access for this folder.
|
||||
FileExporterSettingsPanel.DeleteText=Delete Rule
|
||||
FileExporterSettingsPanel.DeleteTooltip=Deletes the selected rule.
|
||||
FileExporterSettingsPanel.UnsavedChangesLost=Unsaved rule changes will be lost. Continue?
|
||||
FileExporterSettingsPanel.ChangesWillBeLost=Unsaved changes will be lost.
|
||||
FileExporterSettingsPanel.DoYouWantToSave=Do you want to save?
|
||||
FileExporterSettingsPanel.BadRootFolder=Bad root folder chosen.
|
||||
FileExporterSettingsPanel.BadFolderForInterestingFileExport=Bad folder for file export
|
||||
FileExporterSettingsPanel.BadReportFolder=Bad report folder chosen.
|
||||
FileExporterSettingsPanel.ReallyDeleteRule=Really delete rule
|
||||
FileExporterSettingsPanel.ReallyDeleteCondition=Really delete condition
|
||||
FileExporterSettingsPanel.QuestionMark=?
|
||||
FileExporterSettingsPanel.ConfirmRuleDeletion=Confirm rule deletion
|
||||
FileExporterSettingsPanel.ConfirmClauseDeletion=Confirm clause deletion
|
||||
FileExporterSettingsPanel.Title=File Export Rule Generator
|
||||
FileExporterSettingsPanel.UnableToFindDirectory=Unable to find directory.
|
||||
FileExporterSettingsPanel.PermissionsInvalid=Invalid folder permissions. Can not read or write.
|
||||
FileExporterSettingsPanel.RuleNotSaved=Malformed rule. Rule not saved.
|
||||
FileExporterSettingsPanel.MalformedRule=Malformed rule.
|
||||
FileExporterSettingsPanel.FileSize_1=Select to include file size in the rule
|
||||
FileExporterSettingsPanel.MimetypeCheckboxTooltip_1=Select to include MIME type in the rule
|
||||
FileExporterSettingsPanel.MimeTypeComparisonTooltip_1=Select the conditional operator
|
||||
FileExporterSettingsPanel.FileSizeComparisonTooltip_1=Select the conditional operator
|
||||
FileExporterSettingsPanel.FileSizeValueToolTip_1=Select the desired file size
|
||||
FileExporterSettingsPanel.FileSizeUnitToolTip_1=Select the desired file size units
|
||||
FileExporterSettingsPanel.MimetypeTooltip_1=Select the desired MIME type
|
||||
FileExporterSettingsPanel.CurrentlySelectedRuleNameTooltip_1=The name of the rule
|
||||
FileExporterSettingsPanel.ReportOutputFolderTooltip_1=The Reports folder where a JSON report is written out for each exported file.
|
||||
FileExporterSettingsPanel.RuleOutputTooltip_1=The Files folder where each matching file is written out
|
||||
FileExporterSettingsPanel.BrowseRootOutputFolder_1=Browse for the Files Folder
|
||||
FileExporterSettingsPanel.BrowseReportTooltip_1=Browse for the Reports Folder
|
||||
FileExporterSettingsPanel.NewRuleTooltip_1=Clear the rule editor to begin a new rule
|
||||
FileExporterSettingsPanel.DeleteTooltip_1=Delete the selected rule
|
||||
FileExporterSettingsPanel.SaveTooltip_1=Save the current rule
|
27
Core/src/org/sleuthkit/autopsy/autoingest/CaseStatus.java
Normal file
@ -0,0 +1,27 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2011 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> 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.autoingest;
|
||||
|
||||
public enum CaseStatus {
|
||||
|
||||
OK,
|
||||
CANCELLATIONS,
|
||||
INTERRUPTS,
|
||||
ERRORS
|
||||
}
|
@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2015 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> 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.autoingest;
|
||||
|
||||
import java.awt.Component;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JTable;
|
||||
import static javax.swing.SwingConstants.CENTER;
|
||||
import org.openide.util.ImageUtilities;
|
||||
|
||||
/**
|
||||
* A JTable cell renderer that represents a CaseStatus object as a
|
||||
* center-aligned icon, and grays out the cell if the table is disabled.
|
||||
*/
|
||||
class CaseStatusIconCellRenderer extends GrayableCellRenderer {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
static final ImageIcon checkedIcon = new ImageIcon(ImageUtilities.loadImage("org/sleuthkit/autopsy/images/tick.png", false));
|
||||
static final ImageIcon warningIcon = new ImageIcon(ImageUtilities.loadImage("org/sleuthkit/autopsy/images/warning16.png", false));
|
||||
|
||||
CaseStatusIconCellRenderer() {
|
||||
setHorizontalAlignment(CENTER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
|
||||
if ((value instanceof CaseStatus)) {
|
||||
switch ((CaseStatus) value) {
|
||||
case CANCELLATIONS:
|
||||
case ERRORS:
|
||||
case INTERRUPTS:
|
||||
setIcon(warningIcon);
|
||||
setToolTipText(org.openide.util.NbBundle.getMessage(CaseStatusIconCellRenderer.class, "CaseStatusIconCellRenderer.tooltiptext.warning"));
|
||||
break;
|
||||
case OK:
|
||||
default:
|
||||
setIcon(checkedIcon);
|
||||
setToolTipText(org.openide.util.NbBundle.getMessage(CaseStatusIconCellRenderer.class, "CaseStatusIconCellRenderer.tooltiptext.ok"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
grayCellIfTableNotEnabled(table, isSelected);
|
||||
|
||||
return this;
|
||||
}
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2015 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> 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.autoingest;
|
||||
|
||||
import static javax.swing.SwingConstants.CENTER;
|
||||
|
||||
/**
|
||||
* A JTable cell renderer that center-aligns cell content and grays out the cell
|
||||
* if the table is disabled.
|
||||
*/
|
||||
class CenteredGrayableCellRenderer extends GrayableCellRenderer {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public CenteredGrayableCellRenderer() {
|
||||
setHorizontalAlignment(CENTER);
|
||||
}
|
||||
}
|
@ -0,0 +1,74 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2015 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> 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.autoingest;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.time.Duration;
|
||||
import javax.swing.JTable;
|
||||
import static javax.swing.SwingConstants.CENTER;
|
||||
|
||||
/**
|
||||
* A JTable cell renderer that renders a duration represented as a long as a
|
||||
* string with days, hours, minutes, and seconds components. It center-aligns
|
||||
* cell content and grays out the cell if the table is disabled.
|
||||
*/
|
||||
class DurationCellRenderer extends GrayableCellRenderer {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
DurationCellRenderer() {
|
||||
setHorizontalAlignment(CENTER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
|
||||
if (value instanceof Long) {
|
||||
{
|
||||
Duration d = Duration.ofMillis((long) value);
|
||||
if (d.isNegative()) {
|
||||
d = Duration.ofMillis(-(long) value);
|
||||
}
|
||||
|
||||
String result;
|
||||
long days = d.toDays();
|
||||
long hours = d.minusDays(days).toHours();
|
||||
long minutes = d.minusDays(days).minusHours(hours).toMinutes();
|
||||
long seconds = d.minusDays(days).minusHours(hours).minusMinutes(minutes).getSeconds();
|
||||
|
||||
if (minutes > 0) {
|
||||
if (hours > 0) {
|
||||
if (days > 0) {
|
||||
result = days + " d " + hours + " h " + minutes + " m " + seconds + " s";
|
||||
} else {
|
||||
result = hours + " h " + minutes + " m " + seconds + " s";
|
||||
}
|
||||
} else {
|
||||
result = minutes + " m " + seconds + " s";
|
||||
}
|
||||
} else {
|
||||
result = seconds + " s";
|
||||
}
|
||||
|
||||
setText(result);
|
||||
}
|
||||
}
|
||||
grayCellIfTableNotEnabled(table, isSelected);
|
||||
return this;
|
||||
}
|
||||
}
|
@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2015 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> 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.autoingest;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import javax.swing.JTable;
|
||||
import static javax.swing.SwingConstants.LEFT;
|
||||
import javax.swing.table.DefaultTableCellRenderer;
|
||||
|
||||
/**
|
||||
* A JTable cell renderer that left-aligns cell content and grays out the cell
|
||||
* if the table is disabled.
|
||||
*/
|
||||
class GrayableCellRenderer extends DefaultTableCellRenderer {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
GrayableCellRenderer() {
|
||||
setHorizontalAlignment(LEFT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
|
||||
if (null != value) {
|
||||
setText(value.toString());
|
||||
}
|
||||
grayCellIfTableNotEnabled(table, isSelected);
|
||||
return this;
|
||||
}
|
||||
|
||||
void grayCellIfTableNotEnabled(JTable table, boolean isSelected) {
|
||||
if (table.isEnabled()) {
|
||||
/*
|
||||
* The table is enabled, make the foreground and background the
|
||||
* normal selected or unselected color.
|
||||
*/
|
||||
if (isSelected) {
|
||||
setBackground(table.getSelectionBackground());
|
||||
setForeground(table.getSelectionForeground());
|
||||
} else {
|
||||
setBackground(table.getBackground());
|
||||
setForeground(table.getForeground());
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* The table is disabled, make the foreground and background gray.
|
||||
*/
|
||||
setBackground(Color.lightGray);
|
||||
setForeground(Color.darkGray);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2015 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> 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.autoingest;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.text.SimpleDateFormat;
|
||||
import javax.swing.JTable;
|
||||
import static javax.swing.SwingConstants.CENTER;
|
||||
|
||||
/**
|
||||
* A JTable cell renderer that renders a date represented as a long as a
|
||||
* center-aligned, long-format date string. It also grays out the cell if the
|
||||
* table is disabled.
|
||||
*/
|
||||
class LongDateCellRenderer extends GrayableCellRenderer {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final String FORMAT_STRING = "yyyy/MM/dd HH:mm:ss"; //NON-NLS
|
||||
private static final SimpleDateFormat dateFormat = new SimpleDateFormat(FORMAT_STRING);
|
||||
|
||||
public LongDateCellRenderer() {
|
||||
setHorizontalAlignment(CENTER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
|
||||
if (value != null) {
|
||||
setText(dateFormat.format(value));
|
||||
}
|
||||
grayCellIfTableNotEnabled(table, isSelected);
|
||||
return this;
|
||||
}
|
||||
}
|
214
Core/src/org/sleuthkit/autopsy/autoingest/PathUtils.java
Normal file
@ -0,0 +1,214 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2015 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> 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.autoingest;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FilenameFilter;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
import org.sleuthkit.autopsy.casemodule.CaseMetadata;
|
||||
import org.sleuthkit.autopsy.casemodule.GeneralFilter;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
|
||||
final class PathUtils {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(PathUtils.class.getName());
|
||||
private static final List<String> CASE_METADATA_FILE_EXTS = Arrays.asList(new String[]{CaseMetadata.getFileExtension()});
|
||||
private static final GeneralFilter caseMetadataFileFilter = new GeneralFilter(CASE_METADATA_FILE_EXTS, "Autopsy Case File");
|
||||
|
||||
/**
|
||||
* Searches a given folder for the most recently modified case folder for a
|
||||
* case.
|
||||
*
|
||||
* @param folderToSearch The folder to be searched.
|
||||
* @param caseName The name of the case for which a case folder is to
|
||||
* be found.
|
||||
*
|
||||
* @return The path of the case folder, or null if it is not found.
|
||||
*/
|
||||
static Path findCaseFolder(Path folderToSearch, String caseName) {
|
||||
File searchFolder = new File(folderToSearch.toString());
|
||||
if (!searchFolder.isDirectory()) {
|
||||
return null;
|
||||
}
|
||||
Path caseFolderPath = null;
|
||||
String[] candidateFolders = searchFolder.list(new CaseFolderFilter(caseName));
|
||||
long mostRecentModified = 0;
|
||||
for (String candidateFolder : candidateFolders) {
|
||||
File file = new File(candidateFolder);
|
||||
if (file.lastModified() >= mostRecentModified) {
|
||||
mostRecentModified = file.lastModified();
|
||||
caseFolderPath = Paths.get(folderToSearch.toString(), file.getPath());
|
||||
}
|
||||
}
|
||||
return caseFolderPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a listing of case folders in a given folder.
|
||||
*
|
||||
* @param folderToSearch The path of the folder to search.
|
||||
*
|
||||
* @return A list of the output case folder paths.
|
||||
*/
|
||||
static List<Path> findCaseFolders(Path folderToSearch) {
|
||||
File searchFolder = new File(folderToSearch.toString());
|
||||
if (!searchFolder.isDirectory()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
String[] caseFolders = searchFolder.list(new CaseFolderFilter(null));
|
||||
List<Path> caseFolderPaths = new ArrayList<>();
|
||||
for (String path : caseFolders) {
|
||||
caseFolderPaths.add(Paths.get(folderToSearch.toString(), path));
|
||||
}
|
||||
return caseFolderPaths;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether or not there is a case metadata file in a given
|
||||
* folder.
|
||||
*
|
||||
* @param folderPath Path to the folder to search.
|
||||
*
|
||||
* @return True or false.
|
||||
*/
|
||||
static boolean hasCaseMetadataFile(Path folderPath) {
|
||||
/**
|
||||
* TODO: If need be, this can be rewritten without the FilenameFilter so
|
||||
* that it does not necessarily visit every file in the folder.
|
||||
*/
|
||||
File folder = folderPath.toFile();
|
||||
if (!folder.isDirectory()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
String[] caseDataFiles = folder.list((File folder1, String fileName) -> {
|
||||
File file = new File(folder1, fileName);
|
||||
if (file.isFile()) {
|
||||
return caseMetadataFileFilter.accept(file);
|
||||
}
|
||||
return false;
|
||||
});
|
||||
return caseDataFiles.length != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts the path to the case images folder path from an image folder
|
||||
* path.
|
||||
*
|
||||
* @param rootImageFoldersPath The root image folders path.
|
||||
* @param imageFolderPath The image folder path.
|
||||
*
|
||||
* @return The root input folder path for a case.
|
||||
*/
|
||||
static Path caseImagesPathFromImageFolderPath(Path rootImageFoldersPath, Path imageFolderPath) {
|
||||
return rootImageFoldersPath.resolve(imageFolderPath.subpath(0, rootImageFoldersPath.getNameCount() + 1).getFileName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts the case name from an image folder path.
|
||||
*
|
||||
* @param rootImageFoldersPath The root image folders path.
|
||||
* @param imageFolderPath The image folder path.
|
||||
*
|
||||
* @return The case name.
|
||||
*/
|
||||
static String caseNameFromImageFolderPath(Path rootImageFoldersPath, Path imageFolderPath) {
|
||||
Path caseImagesPath = PathUtils.caseImagesPathFromImageFolderPath(rootImageFoldersPath, imageFolderPath);
|
||||
return caseImagesPath.getFileName().toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts the case name from a case folder path.
|
||||
*
|
||||
* @param caseFolderPath A case folder path.
|
||||
*
|
||||
* @return A case name, with the time stamp suffix removed.
|
||||
*/
|
||||
static String caseNameFromCaseFolderPath(Path caseFolderPath) {
|
||||
String caseName = caseFolderPath.getFileName().toString();
|
||||
if (caseName.length() > TimeStampUtils.getTimeStampLength()) {
|
||||
return caseName.substring(0, caseName.length() - TimeStampUtils.getTimeStampLength());
|
||||
} else {
|
||||
return caseName;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a case folder path. Does not create the folder described by the
|
||||
* path.
|
||||
*
|
||||
* @param caseFoldersPath The root case folders path.
|
||||
* @param caseName The name of the case.
|
||||
*
|
||||
* @return A case folder path with a time stamp suffix.
|
||||
*/
|
||||
static Path createCaseFolderPath(Path caseFoldersPath, String caseName) {
|
||||
String folderName = caseName + "_" + TimeStampUtils.createTimeStamp();
|
||||
return Paths.get(caseFoldersPath.toString(), folderName);
|
||||
}
|
||||
|
||||
private static class CaseFolderFilter implements FilenameFilter {
|
||||
|
||||
private final String caseName;
|
||||
|
||||
CaseFolderFilter(String caseName) {
|
||||
this.caseName = caseName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean accept(File folder, String fileName) {
|
||||
File file = new File(folder, fileName);
|
||||
if (file.isDirectory() && fileName.length() > TimeStampUtils.getTimeStampLength()) {
|
||||
Path filePath = Paths.get(file.getPath());
|
||||
try {
|
||||
if (!StateFile.exists(filePath, StateFile.Type.DELETED)) {
|
||||
if (TimeStampUtils.endsWithTimeStamp(fileName)) {
|
||||
if (null != caseName) {
|
||||
String fileNamePrefix = fileName.substring(0, fileName.length() - TimeStampUtils.getTimeStampLength());
|
||||
if (fileNamePrefix.equals(caseName)) {
|
||||
return hasCaseMetadataFile(filePath);
|
||||
}
|
||||
} else {
|
||||
return hasCaseMetadataFile(filePath);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (IOException ex) {
|
||||
logger.log(Level.SEVERE, String.format("Failed to access %s", file.getPath()), ex);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Supress creation of instances of this class.
|
||||
*/
|
||||
private PathUtils() {
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2015 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> 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.autoingest;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.text.SimpleDateFormat;
|
||||
import javax.swing.JTable;
|
||||
import static javax.swing.SwingConstants.CENTER;
|
||||
|
||||
/**
|
||||
* A JTable cell renderer that renders a date represented as a long as a
|
||||
* center-aligned, short-format date string. It also grays out the cell if the
|
||||
* table is disabled.
|
||||
*/
|
||||
class ShortDateCellRenderer extends GrayableCellRenderer {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final String FORMAT_STRING = "MM/dd HH:mm"; //NON-NLS
|
||||
private static final SimpleDateFormat dateFormat = new SimpleDateFormat(FORMAT_STRING);
|
||||
|
||||
public ShortDateCellRenderer() {
|
||||
setHorizontalAlignment(CENTER);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
|
||||
if (value != null) {
|
||||
setText(dateFormat.format(value));
|
||||
}
|
||||
grayCellIfTableNotEnabled(table, isSelected);
|
||||
return this;
|
||||
}
|
||||
}
|
84
Core/src/org/sleuthkit/autopsy/autoingest/StateFile.java
Normal file
@ -0,0 +1,84 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2015 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> 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.autoingest;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.FileAlreadyExistsException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
|
||||
final class StateFile {
|
||||
|
||||
enum Type {
|
||||
|
||||
READY("state.ready"),
|
||||
PROCESSING("state.processing"),
|
||||
CANCELLED("state.cancelled"),
|
||||
DONE("state.done"),
|
||||
ERROR("state.error"),
|
||||
COPY_ERROR("state.copyerror"),
|
||||
DELETED("state.deleted"),
|
||||
INTERRUPTED("state.interrupted"),
|
||||
PRIORITIZED("state.prioritized");
|
||||
|
||||
private final String fileName;
|
||||
|
||||
private Type(String fileName) {
|
||||
this.fileName = fileName;
|
||||
}
|
||||
|
||||
String fileName() {
|
||||
return fileName;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static boolean exists(Path folderPath, Type stateFileType) throws IOException {
|
||||
return folderPath.resolve(stateFileType.fileName()).toFile().exists();
|
||||
}
|
||||
|
||||
static void create(Path folderPath, Type stateFileType) throws IOException {
|
||||
Files.createFile(folderPath.resolve(stateFileType.fileName()));
|
||||
}
|
||||
|
||||
static void createIfDoesNotExist(Path folderPath, Type stateFileType) throws IOException {
|
||||
try {
|
||||
Files.createFile(folderPath.resolve(stateFileType.fileName()));
|
||||
} catch (FileAlreadyExistsException ignored) {
|
||||
/**
|
||||
* The file already exists, the exception is not exceptional.
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
static void delete(Path folderPath, Type stateFileType) throws IOException {
|
||||
Files.delete(folderPath.resolve(stateFileType.fileName()));
|
||||
}
|
||||
|
||||
static void deleteIfExists(Path folderPath, Type stateFileType) throws IOException {
|
||||
Files.deleteIfExists(folderPath.resolve(stateFileType.fileName()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Private, do-nothing constructor to suppress creation of instances of this
|
||||
* class.
|
||||
*/
|
||||
private StateFile() {
|
||||
}
|
||||
}
|
104
Core/src/org/sleuthkit/autopsy/autoingest/TimeStampUtils.java
Normal file
@ -0,0 +1,104 @@
|
||||
/*
|
||||
* Autopsy Forensic Browser
|
||||
*
|
||||
* Copyright 2015 Basis Technology Corp.
|
||||
* Contact: carrier <at> sleuthkit <dot> 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.autoingest;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* Utility methods for working with strings with the time-stamp suffixes used by
|
||||
* auto ingest.
|
||||
*/
|
||||
public final class TimeStampUtils {
|
||||
|
||||
/*
|
||||
* Sample time stamp suffix: 2015_02_02_12_10_31
|
||||
*/
|
||||
private static final Pattern timeStampPattern = Pattern.compile("\\d{4}_\\d{2}_\\d{2}_\\d{2}_\\d{2}_\\d{2}$");
|
||||
private static final int LENGTH_OF_DATE_TIME_STAMP = 20; // length of the above time stamp
|
||||
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
|
||||
|
||||
/**
|
||||
* Checks whether a string ends with an auto ingest time stamp.
|
||||
*
|
||||
* @param inputString The string to check.
|
||||
*
|
||||
* @return True or false.
|
||||
*/
|
||||
public static boolean endsWithTimeStamp(String inputString) {
|
||||
Matcher m = timeStampPattern.matcher(inputString);
|
||||
return m.find();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the fixed length of the auto-ingest time stamp suffix.
|
||||
*
|
||||
* @return The length.
|
||||
*/
|
||||
public static int getTimeStampLength() {
|
||||
return LENGTH_OF_DATE_TIME_STAMP;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an auto ingest time stamp suffix using the current time.
|
||||
*
|
||||
* @return The suffix.
|
||||
*/
|
||||
public static String createTimeStamp() {
|
||||
return dateFormat.format(Calendar.getInstance().getTime());
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes an auto ingest timestamp suffix, if it present.
|
||||
*
|
||||
* @param inputString The string to trim.
|
||||
*
|
||||
* @return The trimmed string.
|
||||
*/
|
||||
public static String removeTimeStamp(String inputString) {
|
||||
String trimmedString = inputString;
|
||||
if (inputString != null && endsWithTimeStamp(inputString)) {
|
||||
trimmedString = inputString.substring(0, inputString.length() - getTimeStampLength());
|
||||
}
|
||||
return trimmedString;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the auto ingest time stamp suffix from a string, if it is present.
|
||||
*
|
||||
* @param inputString the name to check for a timestamp
|
||||
*
|
||||
* @return The time stamp, may be the empty.
|
||||
*/
|
||||
public static String getTimeStampOnly(String inputString) {
|
||||
String timeStamp = "";
|
||||
if (inputString != null && endsWithTimeStamp(inputString)) {
|
||||
timeStamp = inputString.substring(inputString.length() - getTimeStampLength(), inputString.length());
|
||||
}
|
||||
return timeStamp;
|
||||
}
|
||||
|
||||
/*
|
||||
* Private contructor to prevent instantiation.
|
||||
*/
|
||||
private TimeStampUtils() {
|
||||
}
|
||||
}
|
@ -208,6 +208,10 @@ RecentCases.exception.caseIdxOutOfRange.msg=Recent case index {0} is out of rang
|
||||
RecentCases.getName.text=Clear Recent Cases
|
||||
RecentItems.openRecentCase.msgDlg.text=Case {0} no longer exists.
|
||||
StartupWindow.title.text=Welcome
|
||||
StartupWindow.AutoIngestMode=Automated Ingest Node
|
||||
StartupWindow.ReviewMode=Cases
|
||||
StartupWindow.CopyAndImportMode=Utilities
|
||||
StartupWindow.CaseImportMode=Single User Case Import
|
||||
UpdateRecentCases.menuItem.clearRecentCases.text=Clear Recent Cases
|
||||
UpdateRecentCases.menuItem.empty=-Empty-
|
||||
AddImageWizardIngestConfigPanel.CANCEL_BUTTON.text=Cancel
|
||||
|
@ -18,16 +18,24 @@
|
||||
*/
|
||||
package org.sleuthkit.autopsy.casemodule;
|
||||
|
||||
import java.awt.Cursor;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
import javax.swing.JDialog;
|
||||
import javax.swing.JFrame;
|
||||
|
||||
import javax.swing.JTabbedPane;
|
||||
import javax.swing.WindowConstants;
|
||||
import org.openide.LifecycleManager;
|
||||
import org.openide.util.NbBundle;
|
||||
import org.openide.util.lookup.ServiceProvider;
|
||||
import org.openide.windows.WindowManager;
|
||||
import org.sleuthkit.autopsy.core.UserPreferences;
|
||||
import org.sleuthkit.autopsy.coreutils.NetworkUtils;
|
||||
import org.sleuthkit.autopsy.autoingest.AutoIngestDashboard;
|
||||
|
||||
/**
|
||||
* The default implementation of the Autopsy startup window
|
||||
@ -39,9 +47,14 @@ public final class StartupWindow extends JDialog implements StartupWindowInterfa
|
||||
private static final String TITLE = NbBundle.getMessage(StartupWindow.class, "StartupWindow.title.text");
|
||||
private static Dimension DIMENSIONS = new Dimension(750, 400);
|
||||
private static CueBannerPanel welcomeWindow;
|
||||
//ELTODO private ReviewModeCasePanel caseManagementPanel = null;
|
||||
//ELTODO private CaseImportPanel caseImportPanel = null;
|
||||
private JTabbedPane copyPane = new JTabbedPane();
|
||||
private static final String localHostName = NetworkUtils.getLocalHostName();
|
||||
|
||||
public StartupWindow() {
|
||||
super(WindowManager.getDefault().getMainWindow(), TITLE, true);
|
||||
//ELTODO super(WindowManager.getDefault().getMainWindow(), TITLE, true); // ELTODO do we need this??
|
||||
super(new JFrame(TITLE), TITLE, true); // ELTODO last parameter - modal - used to be set to "false"
|
||||
init();
|
||||
}
|
||||
|
||||
@ -50,38 +63,36 @@ public final class StartupWindow extends JDialog implements StartupWindowInterfa
|
||||
*/
|
||||
private void init() {
|
||||
|
||||
setModalityType(ModalityType.APPLICATION_MODAL); // ELTODO this was moved over, do we need this?
|
||||
|
||||
Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
|
||||
|
||||
// set the popUp window / JFrame
|
||||
setSize(DIMENSIONS);
|
||||
int w = this.getSize().width;
|
||||
int h = this.getSize().height;
|
||||
int w = getSize().width;
|
||||
int h = getSize().height;
|
||||
|
||||
// set the location of the popUp Window on the center of the screen
|
||||
setLocation((screenDimension.width - w) / 2, (screenDimension.height - h) / 2);
|
||||
setLocationRelativeTo(WindowManager.getDefault().getMainWindow());
|
||||
|
||||
welcomeWindow = new CueBannerPanel();
|
||||
|
||||
// add the command to close the window to the button on the Volume Detail Panel
|
||||
welcomeWindow.setCloseButtonActionListener(new ActionListener() {
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
close();
|
||||
}
|
||||
});
|
||||
|
||||
add(welcomeWindow);
|
||||
//ELTODO setLocationRelativeTo(WindowManager.getDefault().getMainWindow());
|
||||
|
||||
addPanelForMode();
|
||||
pack();
|
||||
setResizable(false);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void open() {
|
||||
welcomeWindow.refresh();
|
||||
setLocationRelativeTo(WindowManager.getDefault().getMainWindow());
|
||||
|
||||
//ELTODO if (caseManagementPanel != null) {
|
||||
//ELTODO caseManagementPanel.updateView();
|
||||
//ELTODO caseManagementPanel.setCursor(Cursor.getDefaultCursor());
|
||||
//ELTODO }
|
||||
|
||||
if (welcomeWindow != null) {
|
||||
welcomeWindow.refresh();
|
||||
}
|
||||
this.setLocationRelativeTo(WindowManager.getDefault().getMainWindow());
|
||||
setVisible(true);
|
||||
}
|
||||
|
||||
@ -92,4 +103,55 @@ public final class StartupWindow extends JDialog implements StartupWindowInterfa
|
||||
public void close() {
|
||||
this.setVisible(false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a panel to the dialog based on operational mode selected by the
|
||||
* user.
|
||||
*/
|
||||
private void addPanelForMode() {
|
||||
UserPreferences.SelectedMode mode = UserPreferences.getMode();
|
||||
|
||||
switch (mode) {
|
||||
case AUTOMATED:
|
||||
this.setTitle(NbBundle.getMessage(StartupWindow.class, "StartupWindow.AutoIngestMode") + " (" + localHostName + ")");
|
||||
this.addWindowListener(new WindowAdapter() {
|
||||
@Override
|
||||
public void windowClosing(WindowEvent e) {
|
||||
AutoIngestDashboard.getInstance().shutdown();
|
||||
}
|
||||
});
|
||||
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
|
||||
add(AutoIngestDashboard.getInstance());
|
||||
break;
|
||||
case REVIEW:
|
||||
this.setTitle(NbBundle.getMessage(StartupWindow.class, "StartupWindow.ReviewMode") + " (" + localHostName + ")");
|
||||
//ELTODO caseManagementPanel = new ReviewModeCasePanel(this);
|
||||
//ELTODO add(caseManagementPanel);
|
||||
break;
|
||||
case COPYFILES:
|
||||
this.setTitle(NbBundle.getMessage(StartupWindow.class, "StartupWindow.CopyAndImportMode") + " (" + localHostName + ")");
|
||||
//ELTODO caseImportPanel = new CaseImportPanel();
|
||||
//ELTODO copyPane.add(NbBundle.getMessage(StartupWindow.class, "StartupWindow.CaseImportMode"), caseImportPanel);
|
||||
this.addWindowListener(new WindowAdapter() {
|
||||
@Override
|
||||
public void windowClosing(WindowEvent e) {
|
||||
LifecycleManager.getDefault().exit();
|
||||
}
|
||||
});
|
||||
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
|
||||
//ELTODO add(copyPane);
|
||||
break;
|
||||
default:
|
||||
welcomeWindow = new CueBannerPanel();
|
||||
// add the command to close the window to the button on the Volume Detail Panel
|
||||
welcomeWindow.setCloseButtonActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
close();
|
||||
}
|
||||
});
|
||||
add(welcomeWindow);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -40,6 +40,26 @@ import org.sleuthkit.datamodel.TskData.DbType;
|
||||
*/
|
||||
public final class UserPreferences {
|
||||
|
||||
public enum SelectedMode {
|
||||
|
||||
STANDALONE,
|
||||
AUTOMATED,
|
||||
REVIEW,
|
||||
COPYFILES
|
||||
};
|
||||
|
||||
private static final String MODE = "Mode"; // NON-NLS
|
||||
private static final String AUTO_MODE_IMAGES_FOLDER = "AutoModeImageFolder"; // NON-NLS
|
||||
private static final String AUTO_MODE_RESULTS_FOLDER = "AutoModeResultsFolder"; // NON-NLS
|
||||
private static final String SHARED_CONFIG_FOLDER = "SharedSettingsFolder"; // NON-NLS
|
||||
private static final String SHARED_CONFIG_ENABLED = "SharedSettingsEnabled"; // NON-NLS
|
||||
private static final String SHARED_CONFIG_MASTER = "SharedSettingsMaster"; // NON-NLS
|
||||
private static final String AUTO_MODE_CONTEXT_STRING = "AutoModeContext"; // NON-NLS
|
||||
private static final String COPY_MODE_SOURCE_FOLDER = "CopyModeSourceFolder"; // NON-NLS
|
||||
private static final String SLEEP_BETWEEN_CASES_TIME = "SleepBetweenCasesTime"; // NON-NLS
|
||||
private static final String MAX_NUM_TIMES_TO_PROCESS_IMAGE = "MaxNumTimesToAttemptToProcessImage"; // NON-NLS
|
||||
private static final String MAX_CONCURRENT_NODES_FOR_ONE_CASE = "MaxConcurrentNodesForOneCase"; // NON-NLS
|
||||
|
||||
private static final boolean isWindowsOS = PlatformUtil.isWindowsOS();
|
||||
private static final Preferences preferences = NbPreferences.forModule(UserPreferences.class);
|
||||
public static final String KEEP_PREFERRED_VIEWER = "KeepPreferredViewer"; // NON-NLS
|
||||
@ -98,6 +118,214 @@ public final class UserPreferences {
|
||||
public static void removeChangeListener(PreferenceChangeListener listener) {
|
||||
preferences.removePreferenceChangeListener(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get mode from persistent storage.
|
||||
*
|
||||
* @return SelectedMode Selected mode.
|
||||
*/
|
||||
public static SelectedMode getMode() {
|
||||
int ordinal = preferences.getInt(MODE, SelectedMode.STANDALONE.ordinal());
|
||||
return SelectedMode.values()[ordinal];
|
||||
}
|
||||
|
||||
/**
|
||||
* Set mode to persistent storage.
|
||||
*
|
||||
* @param mode Selected mode.
|
||||
*/
|
||||
public static void setMode(SelectedMode mode) {
|
||||
preferences.putInt(MODE, mode.ordinal());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get input folder for automated mode from persistent storage.
|
||||
*
|
||||
* @return String Selected input folder.
|
||||
*/
|
||||
public static String getAutoModeImageFolder() {
|
||||
return preferences.get(AUTO_MODE_IMAGES_FOLDER, "");
|
||||
}
|
||||
|
||||
/**
|
||||
* Set input image folder for automated mode from persistent storage.
|
||||
*
|
||||
* @param folder Selected input folder.
|
||||
*/
|
||||
public static void setAutoModeImageFolder(String folder) {
|
||||
preferences.put(AUTO_MODE_IMAGES_FOLDER, folder);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get results folder for automated mode from persistent storage.
|
||||
*
|
||||
* @return String Selected output folder.
|
||||
*/
|
||||
public static String getAutoModeResultsFolder() {
|
||||
return preferences.get(AUTO_MODE_RESULTS_FOLDER, "");
|
||||
}
|
||||
|
||||
/**
|
||||
* Set results folder for automated mode from persistent storage.
|
||||
*
|
||||
* @param folder Selected output folder.
|
||||
*/
|
||||
public static void setAutoModeResultsFolder(String folder) {
|
||||
preferences.put(AUTO_MODE_RESULTS_FOLDER, folder);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get shared config folder for automated mode from persistent
|
||||
* storage.
|
||||
*
|
||||
* @return String Selected settings folder.
|
||||
*/
|
||||
public static String getSharedConfigFolder() {
|
||||
return preferences.get(SHARED_CONFIG_FOLDER, "");
|
||||
}
|
||||
|
||||
/**
|
||||
* Set shared config folder for automated mode from persistent
|
||||
* storage.
|
||||
*/
|
||||
public static void setSharedConfigFolder(String folder) {
|
||||
preferences.put(SHARED_CONFIG_FOLDER, folder);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get shared config checkbox state for automated mode from
|
||||
* persistent storage.
|
||||
*
|
||||
* @return Boolean true if shared settings are enabled.
|
||||
*/
|
||||
public static Boolean getSharedConfigEnabled() {
|
||||
return preferences.getBoolean(SHARED_CONFIG_ENABLED, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Save shared config checkbox state for automated mode to persistent
|
||||
* storage.
|
||||
*
|
||||
* @param sharedSettingsEnabled true = use shared settings in auto-ingest
|
||||
* mode
|
||||
*/
|
||||
public static void setSharedConfigEnabled(boolean sharedSettingsEnabled) {
|
||||
preferences.putBoolean(SHARED_CONFIG_ENABLED, sharedSettingsEnabled);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get shared config master checkbox state for automated mode from
|
||||
* persistent storage.
|
||||
*
|
||||
* @return true if this node is set as a shared configuration master
|
||||
*/
|
||||
public static Boolean getSharedConfigMaster() {
|
||||
return preferences.getBoolean(SHARED_CONFIG_MASTER, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Save shared config master checkbox state to persistent storage.
|
||||
*
|
||||
* @param sharedSettingsMaster true = this node can upload configuration
|
||||
*/
|
||||
public static void setSharedConfigMaster(boolean sharedSettingsMaster) {
|
||||
preferences.putBoolean(SHARED_CONFIG_MASTER, sharedSettingsMaster);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get context string for automated mode ingest module settings.
|
||||
*
|
||||
* @return String Context string for automated mode ingest module
|
||||
* settings.
|
||||
*/
|
||||
public static String getAutoModeIngestModuleContextString() {
|
||||
return AUTO_MODE_CONTEXT_STRING;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get source folder for Copy Mode from persistent storage.
|
||||
*
|
||||
* @return String Most recent source folder.
|
||||
*/
|
||||
public static String getCopyModeSourceFolder() {
|
||||
return preferences.get(COPY_MODE_SOURCE_FOLDER, "C:\\");
|
||||
}
|
||||
|
||||
/**
|
||||
* Set source folder for Copy Mode into persistent storage.
|
||||
*
|
||||
* @param folder Selected source folder.
|
||||
*/
|
||||
public static void setCopyModeSourceFolder(String folder) {
|
||||
preferences.put(COPY_MODE_SOURCE_FOLDER, folder);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the configured time to sleep between cases to prevent
|
||||
* database locks
|
||||
*
|
||||
* @return int the value in seconds, default is 30 seconds.
|
||||
*/
|
||||
public static int getSecondsToSleepBetweenCases() {
|
||||
int answer = Integer.parseInt(preferences.get(SLEEP_BETWEEN_CASES_TIME, "30"));
|
||||
return answer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the configured time to sleep between cases to prevent
|
||||
* database locks
|
||||
*
|
||||
* @param int value the number of seconds to sleep between cases
|
||||
*/
|
||||
public static void setSecondsToSleepBetweenCases(int value) {
|
||||
preferences.put(SLEEP_BETWEEN_CASES_TIME, Integer.toString(value));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get maximum number of times to attempt processing an image folder. This
|
||||
* is used to avoid endless attempts to process an image folder with corrupt
|
||||
* data that causes a crash.
|
||||
*
|
||||
* @return int maximum number of attempts, default is 2.
|
||||
*/
|
||||
public static int getMaxNumTimesToProcessImage() {
|
||||
int answer = Integer.parseInt(preferences.get(MAX_NUM_TIMES_TO_PROCESS_IMAGE, "2"));
|
||||
return answer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the maximum number of times to attempt to reprocess an image. This is
|
||||
* used to avoid endless attempts to process an image folder with corrupt
|
||||
* data that causes a crash.
|
||||
*
|
||||
* @param retries the number of retries to allow
|
||||
*/
|
||||
public static void setMaxNumTimesToProcessImage(int retries) {
|
||||
preferences.putInt(MAX_NUM_TIMES_TO_PROCESS_IMAGE, retries);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get maximum number of concurrent ingest nodes allowable for one case at a
|
||||
* time.
|
||||
*
|
||||
* @return maximum number of concurrent nodes for one case. Default is 3.
|
||||
*/
|
||||
public static int getMaxConcurrentJobsForOneCase() {
|
||||
return Integer.parseInt(preferences.get(MAX_CONCURRENT_NODES_FOR_ONE_CASE, "3"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get maximum number of concurrent ingest nodes allowable for one case at a
|
||||
* time.
|
||||
*
|
||||
* @param numberOfNodes the number of concurrent nodes to allow for one case
|
||||
*/
|
||||
public static void setMaxConcurrentIngestNodesForOneCase(int numberOfNodes) {
|
||||
preferences.putInt(MAX_CONCURRENT_NODES_FOR_ONE_CASE, numberOfNodes);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static boolean keepPreferredContentViewer() {
|
||||
return preferences.getBoolean(KEEP_PREFERRED_VIEWER, false);
|
||||
|
BIN
Core/src/org/sleuthkit/autopsy/images/AIM.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
Core/src/org/sleuthkit/autopsy/images/arrow-down-icon.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
Core/src/org/sleuthkit/autopsy/images/arrow-up-icon.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
Core/src/org/sleuthkit/autopsy/images/left-arrow-16-icon.png
Normal file
After Width: | Height: | Size: 489 B |
BIN
Core/src/org/sleuthkit/autopsy/images/locked.png
Normal file
After Width: | Height: | Size: 617 B |
BIN
Core/src/org/sleuthkit/autopsy/images/minus-icon.png
Normal file
After Width: | Height: | Size: 259 B |
BIN
Core/src/org/sleuthkit/autopsy/images/plus-icon.png
Normal file
After Width: | Height: | Size: 419 B |
BIN
Core/src/org/sleuthkit/autopsy/images/tick.png
Normal file
After Width: | Height: | Size: 582 B |
BIN
Core/src/org/sleuthkit/autopsy/images/warning16.png
Normal file
After Width: | Height: | Size: 552 B |
BIN
Core/src/org/sleuthkit/autopsy/images/yield16-icon.png
Normal file
After Width: | Height: | Size: 349 B |
@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
|
||||
<!-- for some information on what you could do (e.g. targets to override). -->
|
||||
<!-- If you delete this file and reopen the project it will be recreated. -->
|
||||
<project name="org.sleuthkit.autopsy.experimental" default="netbeans" basedir=".">
|
||||
<description>Builds, tests, and runs the project org.sleuthkit.autopsy.experimental.</description>
|
||||
<import file="nbproject/build-impl.xml"/>
|
||||
</project>
|
@ -1,6 +0,0 @@
|
||||
Manifest-Version: 1.0
|
||||
AutoUpdate-Show-In-Client: true
|
||||
OpenIDE-Module: org.sleuthkit.autopsy.experimental
|
||||
OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/experimental/Bundle.properties
|
||||
OpenIDE-Module-Specification-Version: 1.0
|
||||
|
@ -1,45 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
*** GENERATED FROM project.xml - DO NOT EDIT ***
|
||||
*** EDIT ../build.xml INSTEAD ***
|
||||
-->
|
||||
<project name="org.sleuthkit.autopsy.experimental-impl" basedir="..">
|
||||
<fail message="Please build using Ant 1.7.1 or higher.">
|
||||
<condition>
|
||||
<not>
|
||||
<antversion atleast="1.7.1"/>
|
||||
</not>
|
||||
</condition>
|
||||
</fail>
|
||||
<property file="nbproject/private/suite-private.properties"/>
|
||||
<property file="nbproject/suite.properties"/>
|
||||
<fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
|
||||
<property file="${suite.dir}/nbproject/private/platform-private.properties"/>
|
||||
<property file="${suite.dir}/nbproject/platform.properties"/>
|
||||
<macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
|
||||
<attribute name="name"/>
|
||||
<attribute name="value"/>
|
||||
<sequential>
|
||||
<property name="@{name}" value="${@{value}}"/>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
<macrodef name="evalprops" uri="http://www.netbeans.org/ns/nb-module-project/2">
|
||||
<attribute name="property"/>
|
||||
<attribute name="value"/>
|
||||
<sequential>
|
||||
<property name="@{property}" value="@{value}"/>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
<property file="${user.properties.file}"/>
|
||||
<nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
|
||||
<nbmproject2:property name="nbplatform.active.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
|
||||
<nbmproject2:evalprops property="cluster.path.evaluated" value="${cluster.path}" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
|
||||
<fail message="Path to 'platform' cluster missing in $${cluster.path} property or using corrupt Netbeans Platform (missing harness).">
|
||||
<condition>
|
||||
<not>
|
||||
<contains string="${cluster.path.evaluated}" substring="platform"/>
|
||||
</not>
|
||||
</condition>
|
||||
</fail>
|
||||
<import file="${harness.dir}/build.xml"/>
|
||||
</project>
|
@ -1,2 +0,0 @@
|
||||
javac.source=1.7
|
||||
javac.compilerargs=-Xlint -Xlint:-serial
|
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://www.netbeans.org/ns/project/1">
|
||||
<type>org.netbeans.modules.apisupport.project</type>
|
||||
<configuration>
|
||||
<data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
|
||||
<code-name-base>org.sleuthkit.autopsy.experimental</code-name-base>
|
||||
<suite-component/>
|
||||
<module-dependencies/>
|
||||
<public-packages/>
|
||||
</data>
|
||||
</configuration>
|
||||
</project>
|
@ -1 +0,0 @@
|
||||
suite.dir=${basedir}/..
|
@ -1 +0,0 @@
|
||||
OpenIDE-Module-Name=Experimental
|
@ -1,5 +1,5 @@
|
||||
#Updated by build script
|
||||
#Mon, 18 Jul 2016 17:58:06 -0400
|
||||
#Fri, 05 Aug 2016 15:20:55 -0400
|
||||
LBL_splash_window_title=Starting Autopsy
|
||||
SPLASH_HEIGHT=314
|
||||
SPLASH_WIDTH=538
|
||||
|
@ -1,4 +1,4 @@
|
||||
#Updated by build script
|
||||
#Mon, 18 Jul 2016 17:58:06 -0400
|
||||
#Tue, 09 Aug 2016 15:02:14 -0400
|
||||
CTL_MainWindow_Title=Autopsy 4.1.0
|
||||
CTL_MainWindow_Title_No_Project=Autopsy 4.1.0
|
||||
|
@ -9,7 +9,6 @@ app.version=4.1.0
|
||||
#build.type=RELEASE
|
||||
build.type=DEVELOPMENT
|
||||
|
||||
project.org.sleuthkit.autopsy.experimental=Experimental
|
||||
project.org.sleuthkit.autopsy.imagegallery=ImageGallery
|
||||
update_versions=false
|
||||
#custom JVM options
|
||||
@ -29,8 +28,7 @@ modules=\
|
||||
${project.org.sleuthkit.autopsy.thunderbirdparser}:\
|
||||
${project.org.sleuthkit.autopsy.core}:\
|
||||
${project.org.sleuthkit.autopsy.corelibs}:\
|
||||
${project.org.sleuthkit.autopsy.imagegallery}:\
|
||||
${project.org.sleuthkit.autopsy.experimental}
|
||||
${project.org.sleuthkit.autopsy.imagegallery}
|
||||
project.org.sleuthkit.autopsy.core=Core
|
||||
project.org.sleuthkit.autopsy.corelibs=CoreLibs
|
||||
project.org.sleuthkit.autopsy.keywordsearch=KeywordSearch
|
||||
|