mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-13 00:16:16 +00:00
Merge pull request #636 from rcordovano/ingest_scheduler_fixes
Ingest scheduler fixes
This commit is contained in:
commit
df76d75de7
@ -52,10 +52,6 @@ Ensure the Case drive has at least 1GB free space and restart ingest.
|
||||
IngestJobConfigurationPanel.advancedButton.text=Advanced
|
||||
IngestJobConfigurationPanel.advancedButton.actionCommand=Advanced
|
||||
IngestScheduler.DataSourceScheduler.toString.size=DataSourceQueue, size\:
|
||||
IngestScheduler.DataSourceScheduler.exception.remove.msg=Removing of scheduled data source ingest tasks is not supported.
|
||||
IngestScheduler.DataSourceScheduler.exception.next.msg=There is no data source tasks in the queue, check hasNext()
|
||||
IngestScheduler.remove.exception.notSupported.msg=Not supported.
|
||||
IngestScheduler.FileTask.next.exception.msg=No next ProcessTask, check hasNext() first\!
|
||||
IngestScheduler.FileSched.toString.curFiles.text=\
|
||||
CurFiles, size\:
|
||||
IngestScheduler.FileSched.toString.curDirs.text=\
|
||||
|
@ -1,68 +1,64 @@
|
||||
CTL_IngestMessageTopComponent=\u30E1\u30C3\u30BB\u30FC\u30B8
|
||||
HINT_IngestMessageTopComponent=\u30E1\u30C3\u30BB\u30FC\u30B8\u30A6\u30A3\u30F3\u30C9\u30A6
|
||||
IngestDialog.closeButton.title=\u9589\u3058\u308B
|
||||
IngestDialog.startButton.title=\u30B9\u30BF\u30FC\u30C8
|
||||
IngestDialog.title.text=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E2\u30B8\u30E5\u30FC\u30EB
|
||||
IngestJob.progress.cancelling={0}\uFF08\u30AD\u30E3\u30F3\u30BB\u30EB\u4E2D\u2026\uFF09
|
||||
IngestJob.progress.dataSourceIngest.displayName={0}\u306E\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u3092\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8
|
||||
IngestJob.progress.fileIngest.displayName={0}\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8
|
||||
IngestJobConfigurationPanel.advancedButton.actionCommand=\u30A2\u30C9\u30D0\u30F3\u30B9
|
||||
IngestJobConfigurationPanel.advancedButton.text=\u30A2\u30C9\u30D0\u30F3\u30B9
|
||||
IngestJobConfigurationPanel.processUnallocCheckbox.text=\u672A\u5272\u308A\u5F53\u3066\u9818\u57DF\u306E\u51E6\u7406
|
||||
IngestJobConfigurationPanel.processUnallocCheckbox.toolTipText=\u524A\u9664\u3055\u308C\u305F\u30D5\u30A1\u30A4\u30EB\u7B49\u306E\u672A\u5272\u308A\u5F53\u3066\u9818\u57DF\u3092\u51E6\u7406\u3002\u3088\u308A\u5B8C\u5168\u306A\u7D50\u679C\u304C\u51FA\u307E\u3059\u304C\u3001\u5927\u304D\u3044\u30A4\u30E1\u30FC\u30B8\u3067\u306F\u51E6\u7406\u6642\u9593\u304C\u9577\u304F\u306A\u308B\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002
|
||||
IngestManager.moduleErr=\u30E2\u30B8\u30E5\u30FC\u30EB\u30A8\u30E9\u30FC
|
||||
IngestManager.moduleErr.errListenToUpdates.msg=Ingest Manager\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3092\u78BA\u8A8D\u4E2D\u306B\u30E2\u30B8\u30E5\u30FC\u30EB\u304C\u30A8\u30E9\u30FC\u3092\u8D77\u3053\u3057\u307E\u3057\u305F\u3002\u3069\u306E\u30E2\u30B8\u30E5\u30FC\u30EB\u304B\u30ED\u30B0\u3067\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002\u4E00\u90E8\u306E\u30C7\u30FC\u30BF\u304C\u4E0D\u5B8C\u5168\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002
|
||||
IngestManager.StartIngestJobsTask.run.cancelling={0}\uFF08\u30AD\u30E3\u30F3\u30BB\u30EB\u4E2D\u2026\uFF09
|
||||
IngestManager.StartIngestJobsTask.run.catchException.msg=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u306E\u958B\u59CB\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u7D50\u679C\u304C\u4E00\u90E8\u306E\u3082\u306E
|
||||
IngestManager.StartIngestJobsTask.run.displayName=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30BF\u30B9\u30AF\u3092\u30AD\u30E5\u30FC\u30A4\u30F3\u30B0
|
||||
IngestMessage.exception.srcSubjDetailsDataNotNull.msg=\u30BD\u30FC\u30B9\u3001\u30B5\u30D6\u30B8\u30A7\u30AF\u30C8\u3001\u8A73\u7D30\u304A\u3088\u3073\u30C7\u30FC\u30BF\u306F\u30CC\u30EB\u3067\u3042\u3063\u3066\u306F\u3044\u3051\u307E\u305B\u3093
|
||||
IngestMessage.exception.srcSubjNotNull.msg=\u30BD\u30FC\u30B9\u304A\u3088\u3073\u30B5\u30D6\u30B8\u30A7\u30AF\u30C8\u306F\u30CC\u30EB\u3067\u3042\u3063\u3066\u306F\u3044\u3051\u307E\u305B\u3093
|
||||
IngestMessage.exception.typeSrcSubjNotNull.msg=\u30E1\u30C3\u30BB\u30FC\u30B8\u30BF\u30A4\u30D7\u3001\u30BD\u30FC\u30B9\u304A\u3088\u3073\u30B5\u30D6\u30B8\u30A7\u30AF\u30C8\u306F\u30CC\u30EB\u3067\u3042\u3063\u3066\u306F\u3044\u3051\u307E\u305B\u3093
|
||||
IngestMessage.toString.data.text=\ \u30C7\u30FC\u30BF\uFF1A{0}
|
||||
IngestMessage.toString.date.text=\ \u65E5\u4ED8\uFF1A{0}
|
||||
IngestMessage.toString.details.text=\ \u8A73\u7D30\uFF1A{0}
|
||||
IngestMessage.toString.subject.text=\ \u30B5\u30D6\u30B8\u30A7\u30AF\u30C8\uFF1A{0}
|
||||
IngestMessage.toString.type.text=\u30BF\u30A4\u30D7\uFF1A{0}
|
||||
IngestMessageDetailsPanel.copyMenuItem.text=\u30B3\u30D4\u30FC
|
||||
IngestMessageDetailsPanel.messageDetailsPane.contentType=\u30C6\u30AD\u30B9\u30C8\uFF0Fhtml
|
||||
IngestMessageDetailsPanel.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629E
|
||||
IngestMessageDetailsPanel.viewArtifactButton.text=\u7D50\u679C\u3078\u79FB\u52D5
|
||||
IngestMessageDetailsPanel.viewContentButton.text=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3078\u79FB\u52D5
|
||||
IngestMessagePanel.BooleanRenderer.exception.nonBoolVal.msg=\u30D6\u30FC\u30EB\u5024\u3067\u306F\u306A\u3044\u3082\u306E\u306BBooleanRenderer\u3092\u4F7F\u7528\u3057\u3088\u3046\u3068\u3057\u307E\u3057\u305F
|
||||
IngestMessagePanel.DateRenderer.exception.nonDateVal.text=\u65E5\u4ED8\u3067\u306F\u306A\u3044\u3082\u306E\u306BDateRenderer\u3092\u4F7F\u7528\u3057\u3088\u3046\u3068\u3057\u307E\u3057\u305F\u3002
|
||||
IngestMessagePanel.moduleErr=\u30E2\u30B8\u30E5\u30FC\u30EB\u30A8\u30E9\u30FC
|
||||
IngestMessagePanel.moduleErr.errListenUpdates.text=IngestMessagePanel\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u3092\u78BA\u8A8D\u4E2D\u306B\u30E2\u30B8\u30E5\u30FC\u30EB\u304C\u30A8\u30E9\u30FC\u3092\u8D77\u3053\u3057\u307E\u3057\u305F\u3002\u3069\u306E\u30E2\u30B8\u30E5\u30FC\u30EB\u304B\u30ED\u30B0\u3067\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002\u4E00\u90E8\u306E\u30C7\u30FC\u30BF\u304C\u4E0D\u5B8C\u5168\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002
|
||||
IngestMessagePanel.MsgTableMod.colNames.module=\u30E2\u30B8\u30E5\u30FC\u30EB
|
||||
IngestMessagePanel.MsgTableMod.colNames.new=\u65B0\u898F\uFF1F
|
||||
IngestMessagePanel.MsgTableMod.colNames.num=\u756A\u53F7
|
||||
IngestMessagePanel.MsgTableMod.colNames.subject=\u30B5\u30D6\u30B8\u30A7\u30AF\u30C8
|
||||
IngestMessagePanel.MsgTableMod.colNames.timestamp=\u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7
|
||||
IngestMessagePanel.sortByComboBox.model.priority=\u512A\u5148\u5EA6
|
||||
CTL_IngestMessageTopComponent=\u30e1\u30c3\u30bb\u30fc\u30b8
|
||||
HINT_IngestMessageTopComponent=\u30e1\u30c3\u30bb\u30fc\u30b8\u30a6\u30a3\u30f3\u30c9\u30a6
|
||||
IngestDialog.closeButton.title=\u9589\u3058\u308b
|
||||
IngestDialog.startButton.title=\u30b9\u30bf\u30fc\u30c8
|
||||
IngestDialog.title.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb
|
||||
IngestJob.progress.cancelling={0}\uff08\u30ad\u30e3\u30f3\u30bb\u30eb\u4e2d\u2026\uff09
|
||||
IngestJob.progress.dataSourceIngest.displayName={0}\u306e\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u3092\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8
|
||||
IngestJob.progress.fileIngest.displayName={0}\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8
|
||||
IngestJobConfigurationPanel.advancedButton.actionCommand=\u30a2\u30c9\u30d0\u30f3\u30b9
|
||||
IngestJobConfigurationPanel.advancedButton.text=\u30a2\u30c9\u30d0\u30f3\u30b9
|
||||
IngestJobConfigurationPanel.processUnallocCheckbox.text=\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u306e\u51e6\u7406
|
||||
IngestJobConfigurationPanel.processUnallocCheckbox.toolTipText=\u524a\u9664\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u7b49\u306e\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u3092\u51e6\u7406\u3002\u3088\u308a\u5b8c\u5168\u306a\u7d50\u679c\u304c\u51fa\u307e\u3059\u304c\u3001\u5927\u304d\u3044\u30a4\u30e1\u30fc\u30b8\u3067\u306f\u51e6\u7406\u6642\u9593\u304c\u9577\u304f\u306a\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002
|
||||
IngestManager.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc
|
||||
IngestManager.moduleErr.errListenToUpdates.msg=Ingest Manager\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3092\u78ba\u8a8d\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u8d77\u3053\u3057\u307e\u3057\u305f\u3002\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u30ed\u30b0\u3067\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002
|
||||
IngestManager.StartIngestJobsTask.run.cancelling={0}\uff08\u30ad\u30e3\u30f3\u30bb\u30eb\u4e2d\u2026\uff09
|
||||
IngestManager.StartIngestJobsTask.run.catchException.msg=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u306e\u958b\u59cb\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u7d50\u679c\u304c\u4e00\u90e8\u306e\u3082\u306e
|
||||
IngestManager.StartIngestJobsTask.run.displayName=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30bf\u30b9\u30af\u3092\u30ad\u30e5\u30fc\u30a4\u30f3\u30b0
|
||||
IngestMessage.exception.srcSubjDetailsDataNotNull.msg=\u30bd\u30fc\u30b9\u3001\u30b5\u30d6\u30b8\u30a7\u30af\u30c8\u3001\u8a73\u7d30\u304a\u3088\u3073\u30c7\u30fc\u30bf\u306f\u30cc\u30eb\u3067\u3042\u3063\u3066\u306f\u3044\u3051\u307e\u305b\u3093
|
||||
IngestMessage.exception.srcSubjNotNull.msg=\u30bd\u30fc\u30b9\u304a\u3088\u3073\u30b5\u30d6\u30b8\u30a7\u30af\u30c8\u306f\u30cc\u30eb\u3067\u3042\u3063\u3066\u306f\u3044\u3051\u307e\u305b\u3093
|
||||
IngestMessage.exception.typeSrcSubjNotNull.msg=\u30e1\u30c3\u30bb\u30fc\u30b8\u30bf\u30a4\u30d7\u3001\u30bd\u30fc\u30b9\u304a\u3088\u3073\u30b5\u30d6\u30b8\u30a7\u30af\u30c8\u306f\u30cc\u30eb\u3067\u3042\u3063\u3066\u306f\u3044\u3051\u307e\u305b\u3093
|
||||
IngestMessage.toString.data.text=\ \u30c7\u30fc\u30bf\uff1a{0}
|
||||
IngestMessage.toString.date.text=\ \u65e5\u4ed8\uff1a{0}
|
||||
IngestMessage.toString.details.text=\ \u8a73\u7d30\uff1a{0}
|
||||
IngestMessage.toString.subject.text=\ \u30b5\u30d6\u30b8\u30a7\u30af\u30c8\uff1a{0}
|
||||
IngestMessage.toString.type.text=\u30bf\u30a4\u30d7\uff1a{0}
|
||||
IngestMessageDetailsPanel.copyMenuItem.text=\u30b3\u30d4\u30fc
|
||||
IngestMessageDetailsPanel.messageDetailsPane.contentType=\u30c6\u30ad\u30b9\u30c8\uff0fhtml
|
||||
IngestMessageDetailsPanel.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629e
|
||||
IngestMessageDetailsPanel.viewArtifactButton.text=\u7d50\u679c\u3078\u79fb\u52d5
|
||||
IngestMessageDetailsPanel.viewContentButton.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3078\u79fb\u52d5
|
||||
IngestMessagePanel.BooleanRenderer.exception.nonBoolVal.msg=\u30d6\u30fc\u30eb\u5024\u3067\u306f\u306a\u3044\u3082\u306e\u306bBooleanRenderer\u3092\u4f7f\u7528\u3057\u3088\u3046\u3068\u3057\u307e\u3057\u305f
|
||||
IngestMessagePanel.DateRenderer.exception.nonDateVal.text=\u65e5\u4ed8\u3067\u306f\u306a\u3044\u3082\u306e\u306bDateRenderer\u3092\u4f7f\u7528\u3057\u3088\u3046\u3068\u3057\u307e\u3057\u305f\u3002
|
||||
IngestMessagePanel.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc
|
||||
IngestMessagePanel.moduleErr.errListenUpdates.text=IngestMessagePanel\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3092\u78ba\u8a8d\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u8d77\u3053\u3057\u307e\u3057\u305f\u3002\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u30ed\u30b0\u3067\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002
|
||||
IngestMessagePanel.MsgTableMod.colNames.module=\u30e2\u30b8\u30e5\u30fc\u30eb
|
||||
IngestMessagePanel.MsgTableMod.colNames.new=\u65b0\u898f\uff1f
|
||||
IngestMessagePanel.MsgTableMod.colNames.num=\u756a\u53f7
|
||||
IngestMessagePanel.MsgTableMod.colNames.subject=\u30b5\u30d6\u30b8\u30a7\u30af\u30c8
|
||||
IngestMessagePanel.MsgTableMod.colNames.timestamp=\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7
|
||||
IngestMessagePanel.sortByComboBox.model.priority=\u512a\u5148\u5ea6
|
||||
IngestMessagePanel.sortByComboBox.model.time=\u6642\u9593
|
||||
IngestMessagePanel.sortByComboBox.toolTipText=\u6642\u9593\u9806\uFF08\u6642\u7CFB\u5217\uFF09\u307E\u305F\u306F\u30E1\u30C3\u30BB\u30FC\u30B8\u306E\u512A\u5148\u5EA6\u3067\u30BD\u30FC\u30C8
|
||||
IngestMessagePanel.sortByLabel.text=\u4E0B\u8A18\u3067\u30BD\u30FC\u30C8\uFF1A
|
||||
IngestMessagePanel.totalMessagesNameLabel.text=\u5408\u8A08\uFF1A
|
||||
IngestMessagePanel.sortByComboBox.toolTipText=\u6642\u9593\u9806\uff08\u6642\u7cfb\u5217\uff09\u307e\u305f\u306f\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u512a\u5148\u5ea6\u3067\u30bd\u30fc\u30c8
|
||||
IngestMessagePanel.sortByLabel.text=\u4e0b\u8a18\u3067\u30bd\u30fc\u30c8\uff1a
|
||||
IngestMessagePanel.totalMessagesNameLabel.text=\u5408\u8a08\uff1a
|
||||
IngestMessagePanel.totalMessagesNameVal.text=-
|
||||
IngestMessagePanel.totalUniqueMessagesNameLabel.text=\u30E6\u30CB\u30FC\u30AF\uFF1A
|
||||
IngestMessagePanel.totalUniqueMessagesNameLabel.text=\u30e6\u30cb\u30fc\u30af\uff1a
|
||||
IngestMessagePanel.totalUniqueMessagesNameVal.text=-
|
||||
IngestMessagesToolbar.customizeButton.toolTipText=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30E1\u30C3\u30BB\u30FC\u30B8
|
||||
IngestMessageTopComponent.displayName=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30A4\u30F3\u30DC\u30C3\u30AF\u30B9
|
||||
IngestMessageTopComponent.displayReport.option.GenRpt=\u30EC\u30DD\u30FC\u30C8\u751F\u6210
|
||||
IngestMessagesToolbar.customizeButton.toolTipText=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8
|
||||
IngestMessageTopComponent.displayName=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30a4\u30f3\u30dc\u30c3\u30af\u30b9
|
||||
IngestMessageTopComponent.displayReport.option.GenRpt=\u30ec\u30dd\u30fc\u30c8\u751f\u6210
|
||||
IngestMessageTopComponent.displayReport.option.OK=OK
|
||||
IngestMessageTopComponent.initComponents.name=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30A4\u30F3\u30DC\u30C3\u30AF\u30B9
|
||||
IngestMessageTopComponent.msgDlg.ingestRpt.text=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30EC\u30DD\u30FC\u30C8
|
||||
IngestMonitor.mgrErrMsg.lowDiskSpace.msg=\u30C7\u30A3\u30B9\u30AF{0}\u306E\u30C7\u30A3\u30B9\u30AF\u9818\u57DF\u4E0D\u8DB3\u306E\u305F\u3081\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u3092\u4E2D\u6B62\u3057\u307E\u3059\u3002\
|
||||
\u30B1\u30FC\u30B9\u30C9\u30E9\u30A4\u30D6\u306B\u6700\u4F4E1GB\u306E\u7A7A\u304D\u9818\u57DF\u304C\u3042\u308B\u306E\u3092\u78BA\u8A8D\u3057\u3001\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u3092\u518D\u30B9\u30BF\u30FC\u30C8\u3057\u3066\u4E0B\u3055\u3044\u3002
|
||||
IngestMonitor.mgrErrMsg.lowDiskSpace.title=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u304C\u4E2D\u6B62\u3055\u308C\u307E\u3057\u305F\u30FC{0}\u306E\u30C7\u30A3\u30B9\u30AF\u9818\u57DF\u4E0D\u8DB3
|
||||
IngestScheduler.DataSourceScheduler.exception.next.msg=\u30AD\u30E5\u30FC\u306B\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u30BF\u30B9\u30AF\u304C\u3042\u308A\u307E\u305B\u3093\u3001hasNext()\u3092\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044
|
||||
IngestScheduler.DataSourceScheduler.exception.remove.msg=\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u3055\u308C\u3066\u3044\u308B\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u306E\u524A\u9664\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002
|
||||
IngestScheduler.DataSourceScheduler.toString.size=DataSourceQueue, \u30B5\u30A4\u30BA\uFF1A
|
||||
IngestMessageTopComponent.initComponents.name=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30a4\u30f3\u30dc\u30c3\u30af\u30b9
|
||||
IngestMessageTopComponent.msgDlg.ingestRpt.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30ec\u30dd\u30fc\u30c8
|
||||
IngestMonitor.mgrErrMsg.lowDiskSpace.msg=\u30c7\u30a3\u30b9\u30af{0}\u306e\u30c7\u30a3\u30b9\u30af\u9818\u57df\u4e0d\u8db3\u306e\u305f\u3081\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u4e2d\u6b62\u3057\u307e\u3059\u3002\
|
||||
\u30b1\u30fc\u30b9\u30c9\u30e9\u30a4\u30d6\u306b\u6700\u4f4e1GB\u306e\u7a7a\u304d\u9818\u57df\u304c\u3042\u308b\u306e\u3092\u78ba\u8a8d\u3057\u3001\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u518d\u30b9\u30bf\u30fc\u30c8\u3057\u3066\u4e0b\u3055\u3044\u3002
|
||||
IngestMonitor.mgrErrMsg.lowDiskSpace.title=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u4e2d\u6b62\u3055\u308c\u307e\u3057\u305f\u30fc{0}\u306e\u30c7\u30a3\u30b9\u30af\u9818\u57df\u4e0d\u8db3
|
||||
IngestScheduler.DataSourceScheduler.toString.size=DataSourceQueue, \u30b5\u30a4\u30ba\uff1a
|
||||
IngestScheduler.FileSched.toString.curDirs.text=\
|
||||
CurDirs(stack), \u30B5\u30A4\u30BA\uFF1A
|
||||
CurDirs(stack), \u30b5\u30a4\u30ba\uff1a
|
||||
IngestScheduler.FileSched.toString.curFiles.text=\
|
||||
CurFiles, \u30B5\u30A4\u30BA\uFF1A
|
||||
CurFiles, \u30b5\u30a4\u30ba\uff1a
|
||||
IngestScheduler.FileSched.toString.rootDirs.text=\
|
||||
RootDirs(sorted), \u30B5\u30A4\u30BA\uFF1A
|
||||
IngestScheduler.FileTask.next.exception.msg=\u6B21\u306E\u30D7\u30ED\u30EC\u30B9\u30BF\u30B9\u30AF\u306F\u3042\u308A\u307E\u305B\u3093\u3001\u307E\u305AhasNext()\u3092\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\uFF01
|
||||
IngestScheduler.remove.exception.notSupported.msg=\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002
|
||||
OpenIDE-Module-Name=\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8
|
||||
RootDirs(sorted), \u30b5\u30a4\u30ba\uff1a
|
||||
OpenIDE-Module-Name=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8
|
@ -39,7 +39,7 @@ final class IngestJob {
|
||||
private final boolean processUnallocatedSpace;
|
||||
private final HashMap<Long, FileIngestPipeline> fileIngestPipelines = new HashMap<>();
|
||||
private final HashMap<Long, DataSourceIngestPipeline> dataSourceIngestPipelines = new HashMap<>();
|
||||
private final IngestScheduler.FileScheduler fileScheduler = IngestScheduler.getInstance().getFileScheduler();
|
||||
private final IngestScheduler.FileIngestScheduler fileScheduler = IngestScheduler.getInstance().getFileIngestScheduler();
|
||||
private FileIngestPipeline initialFileIngestPipeline = null;
|
||||
private DataSourceIngestPipeline initialDataSourceIngestPipeline = null;
|
||||
private ProgressHandle dataSourceTaskProgress;
|
||||
|
@ -40,6 +40,7 @@ import org.sleuthkit.datamodel.AbstractFile;
|
||||
import org.sleuthkit.datamodel.Content;
|
||||
import java.util.prefs.Preferences;
|
||||
import javax.swing.SwingWorker;
|
||||
import org.sleuthkit.autopsy.ingest.IngestScheduler.FileIngestScheduler.FileIngestTask;
|
||||
|
||||
/**
|
||||
* Manages the execution of ingest jobs.
|
||||
@ -129,7 +130,7 @@ public class IngestManager {
|
||||
synchronized void addFileToIngestJob(long ingestJobId, AbstractFile file) {
|
||||
IngestJob job = ingestJobs.get(ingestJobId);
|
||||
if (job != null) {
|
||||
scheduler.getFileScheduler().scheduleFile(job, file);
|
||||
scheduler.getFileIngestScheduler().queueFile(job, file);
|
||||
}
|
||||
}
|
||||
|
||||
@ -315,8 +316,8 @@ public class IngestManager {
|
||||
}
|
||||
|
||||
// Jettision the remaining data source and file ingest tasks.
|
||||
scheduler.getFileScheduler().empty();
|
||||
scheduler.getDataSourceScheduler().empty();
|
||||
scheduler.getFileIngestScheduler().emptyQueues();
|
||||
scheduler.getDataSourceIngestScheduler().emptyQueues();
|
||||
}
|
||||
|
||||
synchronized void reportStartIngestJobsTaskDone(long taskId) {
|
||||
@ -411,12 +412,12 @@ public class IngestManager {
|
||||
// Queue the data source ingest tasks for the ingest job.
|
||||
final String inputName = dataSource.getName();
|
||||
progress.progress("Data source ingest tasks for " + inputName, workUnitsCompleted); // RJCTODO: Improve
|
||||
scheduler.getDataSourceScheduler().schedule(ingestJob);
|
||||
scheduler.getDataSourceIngestScheduler().queueForIngest(ingestJob);
|
||||
progress.progress("Data source ingest tasks for " + inputName, ++workUnitsCompleted);
|
||||
|
||||
// Queue the file ingest tasks for the ingest job.
|
||||
progress.progress("Data source ingest tasks for " + inputName, workUnitsCompleted);
|
||||
scheduler.getFileScheduler().scheduleIngestOfFiles(ingestJob);
|
||||
scheduler.getFileIngestScheduler().queueForIngest(ingestJob);
|
||||
progress.progress("Data source ingest tasks for " + inputName, ++workUnitsCompleted);
|
||||
|
||||
if (!Thread.currentThread().isInterrupted()) {
|
||||
@ -447,13 +448,14 @@ public class IngestManager {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
IngestScheduler.DataSourceScheduler scheduler = IngestScheduler.getInstance().getDataSourceScheduler();
|
||||
while (scheduler.hasNext()) {
|
||||
IngestScheduler.DataSourceIngestScheduler scheduler = IngestScheduler.getInstance().getDataSourceIngestScheduler();
|
||||
IngestJob job = scheduler.getNextTask();
|
||||
while (job != null) {
|
||||
if (Thread.currentThread().isInterrupted()) {
|
||||
break;
|
||||
}
|
||||
IngestJob job = scheduler.next();
|
||||
job.getDataSourceIngestPipelineForThread(id).process();
|
||||
job = scheduler.getNextTask();
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
String message = String.format("RunDataSourceIngestModulesTask (id=%d) caught exception", id);
|
||||
@ -475,15 +477,16 @@ public class IngestManager {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
IngestScheduler.FileScheduler fileScheduler = IngestScheduler.getInstance().getFileScheduler();
|
||||
while (fileScheduler.hasNext()) {
|
||||
IngestScheduler.FileIngestScheduler fileScheduler = IngestScheduler.getInstance().getFileIngestScheduler();
|
||||
FileIngestTask task = fileScheduler.getNextTask();
|
||||
while (task != null) {
|
||||
if (Thread.currentThread().isInterrupted()) {
|
||||
break;
|
||||
}
|
||||
IngestScheduler.FileScheduler.FileTask task = fileScheduler.next();
|
||||
IngestJob job = task.getJob();
|
||||
job.updateFileTasksProgressBar(task.getFile().getName());
|
||||
job.getFileIngestPipelineForThread(id).process(task.getFile());
|
||||
task = fileScheduler.getNextTask();
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
String message = String.format("RunFileSourceIngestModulesTask (id=%d) caught exception", id);
|
||||
|
@ -22,9 +22,9 @@ import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.TreeSet;
|
||||
import java.util.logging.Level;
|
||||
@ -34,7 +34,7 @@ import java.util.regex.Pattern;
|
||||
|
||||
import org.openide.util.NbBundle;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
import org.sleuthkit.autopsy.ingest.IngestScheduler.FileScheduler.FileTask;
|
||||
import org.sleuthkit.autopsy.ingest.IngestScheduler.FileIngestScheduler.FileIngestTask;
|
||||
import org.sleuthkit.datamodel.AbstractFile;
|
||||
import org.sleuthkit.datamodel.Content;
|
||||
import org.sleuthkit.datamodel.ContentVisitor;
|
||||
@ -52,29 +52,18 @@ import org.sleuthkit.datamodel.TskData.TSK_DB_FILES_TYPE_ENUM;
|
||||
import org.sleuthkit.datamodel.TskData.TSK_FS_META_TYPE_ENUM;
|
||||
|
||||
/**
|
||||
* Schedules data source (images, file-sets, etc) and files with their
|
||||
* associated modules for ingest, and manage queues of the scheduled tasks.
|
||||
*
|
||||
* Currently a singleton object only (as there is one pipeline at a time)
|
||||
*
|
||||
* Contains internal schedulers for content objects into data source and and
|
||||
* file ingest pipelines.
|
||||
*
|
||||
* Enqueues data source ingest and file ingest tasks for processing.
|
||||
*/
|
||||
final class IngestScheduler {
|
||||
|
||||
private static IngestScheduler instance;
|
||||
private static final Logger logger = Logger.getLogger(IngestScheduler.class.getName());
|
||||
private final DataSourceScheduler dataSourceScheduler = new DataSourceScheduler();
|
||||
private final FileScheduler fileScheduler = new FileScheduler();
|
||||
private final DataSourceIngestScheduler dataSourceIngestScheduler = new DataSourceIngestScheduler();
|
||||
private final FileIngestScheduler fileIngestScheduler = new FileIngestScheduler();
|
||||
|
||||
private IngestScheduler() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Get ingest scheduler singleton instance
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
static synchronized IngestScheduler getInstance() {
|
||||
if (instance == null) {
|
||||
instance = new IngestScheduler();
|
||||
@ -83,36 +72,19 @@ final class IngestScheduler {
|
||||
return instance;
|
||||
}
|
||||
|
||||
DataSourceScheduler getDataSourceScheduler() {
|
||||
return dataSourceScheduler;
|
||||
DataSourceIngestScheduler getDataSourceIngestScheduler() {
|
||||
return dataSourceIngestScheduler;
|
||||
}
|
||||
|
||||
FileScheduler getFileScheduler() {
|
||||
return fileScheduler;
|
||||
FileIngestScheduler getFileIngestScheduler() {
|
||||
return fileIngestScheduler;
|
||||
}
|
||||
|
||||
/**
|
||||
* FileScheduler ingest scheduler
|
||||
*
|
||||
* Supports addition ScheduledTasks - tuples of (data-source, modules)
|
||||
*
|
||||
* Enqueues files and modules, and sorts the files by priority. Maintains
|
||||
* only top level directories in memory (not all children files of the scheduled container content objects)
|
||||
*
|
||||
* getNext() will return next FileTask - tuple of (file, modules)
|
||||
*
|
||||
*/
|
||||
static class FileScheduler implements Iterator<FileScheduler.FileTask> {
|
||||
//root folders enqueued
|
||||
private TreeSet<FileTask> rootDirectoryTasks;
|
||||
static class FileIngestScheduler {
|
||||
|
||||
//stack of current dirs to be processed recursively
|
||||
private List<FileTask> directoryTasks;
|
||||
|
||||
//list of files being processed in the currently processed directory
|
||||
private LinkedList<FileTask> fileTasks; //need to add to start and end quickly
|
||||
|
||||
//estimated total files to be enqueued for currently scheduled content objects
|
||||
private TreeSet<FileIngestTask> rootDirectoryTasks;
|
||||
private List<FileIngestTask> directoryTasks;
|
||||
private LinkedList<FileIngestTask> fileTasks; //need to add to start and end quickly
|
||||
private int filesEnqueuedEst = 0;
|
||||
private int filesDequeued = 0;
|
||||
private final static int FAT_NTFS_FLAGS = TskData.TSK_FS_TYPE_ENUM.TSK_FS_TYPE_FAT12.getValue()
|
||||
@ -120,7 +92,7 @@ final class IngestScheduler {
|
||||
| TskData.TSK_FS_TYPE_ENUM.TSK_FS_TYPE_FAT32.getValue()
|
||||
| TskData.TSK_FS_TYPE_ENUM.TSK_FS_TYPE_NTFS.getValue();
|
||||
|
||||
private FileScheduler() {
|
||||
private FileIngestScheduler() {
|
||||
rootDirectoryTasks = new TreeSet<>(new RootTaskComparator());
|
||||
directoryTasks = new ArrayList<>();
|
||||
fileTasks = new LinkedList<>();
|
||||
@ -136,29 +108,28 @@ final class IngestScheduler {
|
||||
public synchronized String toString() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(NbBundle.getMessage(this.getClass(), "IngestScheduler.FileSched.toString.rootDirs.text")).append(rootDirectoryTasks.size());
|
||||
for (FileTask task : rootDirectoryTasks) {
|
||||
for (FileIngestTask task : rootDirectoryTasks) {
|
||||
sb.append(task.toString()).append(" ");
|
||||
}
|
||||
sb.append(NbBundle.getMessage(this.getClass(), "IngestScheduler.FileSched.toString.curDirs.text")).append(directoryTasks.size());
|
||||
for (FileTask task : directoryTasks) {
|
||||
for (FileIngestTask task : directoryTasks) {
|
||||
sb.append(task.toString()).append(" ");
|
||||
}
|
||||
sb.append(NbBundle.getMessage(this.getClass(), "IngestScheduler.FileSched.toString.curFiles.text")).append(fileTasks.size());
|
||||
for (FileTask task : fileTasks) {
|
||||
for (FileIngestTask task : fileTasks) {
|
||||
sb.append(task.toString()).append(" ");
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
synchronized void scheduleIngestOfFiles(IngestJob dataSourceTask) {
|
||||
synchronized void queueForIngest(IngestJob dataSourceTask) {
|
||||
Content dataSource = dataSourceTask.getDataSource();
|
||||
Collection<AbstractFile> rootObjects = dataSource.accept(new GetRootDirVisitor());
|
||||
List<AbstractFile> firstLevelFiles = new ArrayList<>();
|
||||
if (rootObjects.isEmpty() && dataSource instanceof AbstractFile) {
|
||||
// The data source is file.
|
||||
firstLevelFiles.add((AbstractFile)dataSource);
|
||||
}
|
||||
else {
|
||||
firstLevelFiles.add((AbstractFile) dataSource);
|
||||
} else {
|
||||
for (AbstractFile root : rootObjects) {
|
||||
List<Content> children;
|
||||
try {
|
||||
@ -166,8 +137,7 @@ final class IngestScheduler {
|
||||
if (children.isEmpty()) {
|
||||
//add the root itself, could be unalloc file, child of volume or image
|
||||
firstLevelFiles.add(root);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
//root for fs root dir, schedule children dirs/files
|
||||
for (Content child : children) {
|
||||
if (child instanceof AbstractFile) {
|
||||
@ -175,15 +145,14 @@ final class IngestScheduler {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (TskCoreException ex) {
|
||||
} catch (TskCoreException ex) {
|
||||
logger.log(Level.WARNING, "Could not get children of root to enqueue: " + root.getId() + ": " + root.getName(), ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (AbstractFile firstLevelFile : firstLevelFiles) {
|
||||
FileTask fileTask = new FileTask(firstLevelFile, dataSourceTask);
|
||||
FileIngestTask fileTask = new FileIngestTask(firstLevelFile, dataSourceTask);
|
||||
if (shouldEnqueueTask(fileTask)) {
|
||||
rootDirectoryTasks.add(fileTask);
|
||||
}
|
||||
@ -196,20 +165,8 @@ final class IngestScheduler {
|
||||
updateQueues();
|
||||
}
|
||||
|
||||
/**
|
||||
* Schedule a file to the file ingest, with associated modules. This
|
||||
* will add the file to beginning of the file queue. The method is
|
||||
* intended for rescheduling a file that is a derivative of another
|
||||
* content object that has already ingested and produced this file. As a
|
||||
* result, the derivative file will be scheduled with the same priority
|
||||
* as the parent origin file.
|
||||
*
|
||||
* @param file file to be scheduled
|
||||
* @param originalContext original content schedule context that was used
|
||||
* to schedule the parent origin content, with the modules, settings, etc.
|
||||
*/
|
||||
synchronized void scheduleFile(IngestJob ingestJob, AbstractFile file) {
|
||||
FileTask fileTask = new FileTask(file, ingestJob);
|
||||
synchronized void queueFile(IngestJob ingestJob, AbstractFile file) {
|
||||
FileIngestTask fileTask = new FileIngestTask(file, ingestJob);
|
||||
if (shouldEnqueueTask(fileTask)) {
|
||||
fileTasks.addFirst(fileTask);
|
||||
++filesEnqueuedEst;
|
||||
@ -240,7 +197,7 @@ final class IngestScheduler {
|
||||
totalFiles += content.accept(countVisitor);
|
||||
}
|
||||
|
||||
logger.log(Level.INFO, "Total files to queue up: " + totalFiles);
|
||||
logger.log(Level.INFO, "Total files to queue up: {0}", totalFiles);
|
||||
|
||||
return totalFiles;
|
||||
}
|
||||
@ -265,33 +222,18 @@ final class IngestScheduler {
|
||||
return filesDequeued;
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized boolean hasNext() {
|
||||
if (fileTasks.isEmpty()) {
|
||||
filesEnqueuedEst = 0;
|
||||
filesDequeued = 0;
|
||||
return false;
|
||||
synchronized FileIngestTask getNextTask() {
|
||||
final FileIngestTask task = fileTasks.pollLast();
|
||||
if (task != null) {
|
||||
filesDequeued++;
|
||||
updateQueues();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized FileTask next() {
|
||||
if (!hasNext()) {
|
||||
throw new IllegalStateException(
|
||||
NbBundle.getMessage(this.getClass(), "IngestScheduler.FileTask.next.exception.msg"));
|
||||
}
|
||||
|
||||
//dequeue the last in the list
|
||||
final FileTask task = fileTasks.pollLast();
|
||||
filesDequeued++;
|
||||
updateQueues();
|
||||
|
||||
return task;
|
||||
}
|
||||
|
||||
/**
|
||||
* Shuffle the queues so that there are files in the files queue.
|
||||
*
|
||||
* @returns true if no more data in queue
|
||||
*/
|
||||
private synchronized void updateQueues() {
|
||||
@ -310,13 +252,13 @@ final class IngestScheduler {
|
||||
if (rootDirectoryTasks.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
FileTask rootTask = this.rootDirectoryTasks.pollFirst();
|
||||
FileIngestTask rootTask = this.rootDirectoryTasks.pollFirst();
|
||||
directoryTasks.add(rootTask);
|
||||
}
|
||||
|
||||
//pop and push AbstractFile directory children if any
|
||||
//add the popped and its leaf children onto cur file list
|
||||
FileTask parentTask = directoryTasks.remove(directoryTasks.size() - 1);
|
||||
FileIngestTask parentTask = directoryTasks.remove(directoryTasks.size() - 1);
|
||||
final AbstractFile parentFile = parentTask.file;
|
||||
|
||||
// add itself to the file list
|
||||
@ -330,12 +272,11 @@ final class IngestScheduler {
|
||||
for (Content c : children) {
|
||||
if (c instanceof AbstractFile) {
|
||||
AbstractFile childFile = (AbstractFile) c;
|
||||
FileTask childTask = new FileTask(childFile, parentTask.getJob());
|
||||
FileIngestTask childTask = new FileIngestTask(childFile, parentTask.getJob());
|
||||
|
||||
if (childFile.hasChildren()) {
|
||||
this.directoryTasks.add(childTask);
|
||||
}
|
||||
else if (shouldEnqueueTask(childTask)) {
|
||||
} else if (shouldEnqueueTask(childTask)) {
|
||||
this.fileTasks.addLast(childTask);
|
||||
}
|
||||
}
|
||||
@ -347,12 +288,6 @@ final class IngestScheduler {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {
|
||||
throw new UnsupportedOperationException(
|
||||
NbBundle.getMessage(this.getClass(), "IngestScheduler.remove.exception.notSupported.msg"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Return list of content objects that are in the queue to be processed.
|
||||
*
|
||||
@ -365,20 +300,20 @@ final class IngestScheduler {
|
||||
synchronized List<Content> getSourceContent() {
|
||||
final Set<Content> contentSet = new HashSet<>();
|
||||
|
||||
for (FileTask task : rootDirectoryTasks) {
|
||||
for (FileIngestTask task : rootDirectoryTasks) {
|
||||
contentSet.add(task.getJob().getDataSource());
|
||||
}
|
||||
for (FileTask task : directoryTasks) {
|
||||
for (FileIngestTask task : directoryTasks) {
|
||||
contentSet.add(task.getJob().getDataSource());
|
||||
}
|
||||
for (FileTask task : fileTasks) {
|
||||
for (FileIngestTask task : fileTasks) {
|
||||
contentSet.add(task.getJob().getDataSource());
|
||||
}
|
||||
|
||||
return new ArrayList<>(contentSet);
|
||||
}
|
||||
|
||||
synchronized void empty() {
|
||||
synchronized void emptyQueues() {
|
||||
this.rootDirectoryTasks.clear();
|
||||
this.directoryTasks.clear();
|
||||
this.fileTasks.clear();
|
||||
@ -391,7 +326,7 @@ final class IngestScheduler {
|
||||
* skipped
|
||||
* @return true if should be enqueued, false otherwise
|
||||
*/
|
||||
private static boolean shouldEnqueueTask(final FileTask processTask) {
|
||||
private static boolean shouldEnqueueTask(final FileIngestTask processTask) {
|
||||
final AbstractFile aFile = processTask.file;
|
||||
|
||||
//if it's unalloc file, skip if so scheduled
|
||||
@ -449,15 +384,12 @@ final class IngestScheduler {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Task for a specific file to process. More specific than the
|
||||
* higher-level DataSourceTask.
|
||||
*/
|
||||
static class FileTask {
|
||||
static class FileIngestTask {
|
||||
|
||||
private final AbstractFile file;
|
||||
private final IngestJob task;
|
||||
|
||||
public FileTask(AbstractFile file, IngestJob task) {
|
||||
private FileIngestTask(AbstractFile file, IngestJob task) {
|
||||
this.file = file;
|
||||
this.task = task;
|
||||
}
|
||||
@ -498,7 +430,7 @@ final class IngestScheduler {
|
||||
if (getClass() != obj.getClass()) {
|
||||
return false;
|
||||
}
|
||||
final FileTask other = (FileTask) obj;
|
||||
final FileIngestTask other = (FileIngestTask) obj;
|
||||
if (this.file != other.file && (this.file == null || !this.file.equals(other.file))) {
|
||||
return false;
|
||||
}
|
||||
@ -511,17 +443,25 @@ final class IngestScheduler {
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int hash = 5;
|
||||
hash = 47 * hash + Objects.hashCode(this.file);
|
||||
hash = 47 * hash + Objects.hashCode(this.task);
|
||||
return hash;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Root dir sorter
|
||||
*/
|
||||
private static class RootTaskComparator implements Comparator<FileTask> {
|
||||
private static class RootTaskComparator implements Comparator<FileIngestTask> {
|
||||
|
||||
@Override
|
||||
public int compare(FileTask q1, FileTask q2) {
|
||||
AbstractFilePriotity.Priority p1 = AbstractFilePriotity.getPriority(q1.file);
|
||||
AbstractFilePriotity.Priority p2 = AbstractFilePriotity.getPriority(q2.file);
|
||||
public int compare(FileIngestTask q1, FileIngestTask q2) {
|
||||
AbstractFilePriority.Priority p1 = AbstractFilePriority.getPriority(q1.file);
|
||||
AbstractFilePriority.Priority p2 = AbstractFilePriority.getPriority(q2.file);
|
||||
if (p1 == p2) {
|
||||
return (int) (q2.file.getId() - q1.file.getId());
|
||||
} else {
|
||||
@ -534,16 +474,16 @@ final class IngestScheduler {
|
||||
* Priority determination for sorted AbstractFile, used by
|
||||
* RootDirComparator
|
||||
*/
|
||||
private static class AbstractFilePriotity {
|
||||
private static class AbstractFilePriority {
|
||||
|
||||
enum Priority {
|
||||
|
||||
LAST, LOW, MEDIUM, HIGH
|
||||
};
|
||||
static final List<Pattern> LAST_PRI_PATHS = new ArrayList<Pattern>();
|
||||
static final List<Pattern> LOW_PRI_PATHS = new ArrayList<Pattern>();
|
||||
static final List<Pattern> MEDIUM_PRI_PATHS = new ArrayList<Pattern>();
|
||||
static final List<Pattern> HIGH_PRI_PATHS = new ArrayList<Pattern>();
|
||||
static final List<Pattern> LAST_PRI_PATHS = new ArrayList<>();
|
||||
static final List<Pattern> LOW_PRI_PATHS = new ArrayList<>();
|
||||
static final List<Pattern> MEDIUM_PRI_PATHS = new ArrayList<>();
|
||||
static final List<Pattern> HIGH_PRI_PATHS = new ArrayList<>();
|
||||
|
||||
/* prioritize root directory folders based on the assumption that we are
|
||||
* looking for user content. Other types of investigations may want different
|
||||
@ -573,53 +513,54 @@ final class IngestScheduler {
|
||||
|
||||
/**
|
||||
* Get the scheduling priority for a given file.
|
||||
*
|
||||
* @param abstractFile
|
||||
* @return
|
||||
*/
|
||||
static AbstractFilePriotity.Priority getPriority(final AbstractFile abstractFile) {
|
||||
static AbstractFilePriority.Priority getPriority(final AbstractFile abstractFile) {
|
||||
if (!abstractFile.getType().equals(TskData.TSK_DB_FILES_TYPE_ENUM.FS)) {
|
||||
//quickly filter out unstructured content
|
||||
//non-fs virtual files and dirs, such as representing unalloc space
|
||||
return AbstractFilePriotity.Priority.LAST;
|
||||
return AbstractFilePriority.Priority.LAST;
|
||||
}
|
||||
|
||||
//determine the fs files priority by name
|
||||
final String path = abstractFile.getName();
|
||||
|
||||
if (path == null) {
|
||||
return AbstractFilePriotity.Priority.MEDIUM;
|
||||
return AbstractFilePriority.Priority.MEDIUM;
|
||||
}
|
||||
|
||||
for (Pattern p : HIGH_PRI_PATHS) {
|
||||
Matcher m = p.matcher(path);
|
||||
if (m.find()) {
|
||||
return AbstractFilePriotity.Priority.HIGH;
|
||||
return AbstractFilePriority.Priority.HIGH;
|
||||
}
|
||||
}
|
||||
|
||||
for (Pattern p : MEDIUM_PRI_PATHS) {
|
||||
Matcher m = p.matcher(path);
|
||||
if (m.find()) {
|
||||
return AbstractFilePriotity.Priority.MEDIUM;
|
||||
return AbstractFilePriority.Priority.MEDIUM;
|
||||
}
|
||||
}
|
||||
|
||||
for (Pattern p : LOW_PRI_PATHS) {
|
||||
Matcher m = p.matcher(path);
|
||||
if (m.find()) {
|
||||
return AbstractFilePriotity.Priority.LOW;
|
||||
return AbstractFilePriority.Priority.LOW;
|
||||
}
|
||||
}
|
||||
|
||||
for (Pattern p : LAST_PRI_PATHS) {
|
||||
Matcher m = p.matcher(path);
|
||||
if (m.find()) {
|
||||
return AbstractFilePriotity.Priority.LAST;
|
||||
return AbstractFilePriority.Priority.LAST;
|
||||
}
|
||||
}
|
||||
|
||||
//default is medium
|
||||
return AbstractFilePriotity.Priority.MEDIUM;
|
||||
return AbstractFilePriority.Priority.MEDIUM;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -627,8 +568,8 @@ final class IngestScheduler {
|
||||
/**
|
||||
* Get counts of ingestable files/dirs for the content input source.
|
||||
*
|
||||
* Note, also includes counts of all unalloc children files (for the fs, image, volume) even
|
||||
* if ingest didn't ask for them
|
||||
* Note, also includes counts of all unalloc children files (for the fs,
|
||||
* image, volume) even if ingest didn't ask for them
|
||||
*/
|
||||
static class GetFilesCountVisitor extends ContentVisitor.Default<Long> {
|
||||
|
||||
@ -653,7 +594,7 @@ final class IngestScheduler {
|
||||
//queryB.append(")");
|
||||
try {
|
||||
final String query = queryB.toString();
|
||||
logger.log(Level.INFO, "Executing count files query: " + query);
|
||||
logger.log(Level.INFO, "Executing count files query: {0}", query);
|
||||
return sc.countFilesWhere(query);
|
||||
} catch (TskCoreException ex) {
|
||||
logger.log(Level.SEVERE, "Couldn't get count of all files in FileSystem", ex);
|
||||
@ -704,7 +645,7 @@ final class IngestScheduler {
|
||||
public Collection<AbstractFile> visit(VirtualDirectory ld) {
|
||||
//case when we hit a layout directoryor local file container, not under a real FS
|
||||
//or when root virt dir is scheduled
|
||||
Collection<AbstractFile> ret = new ArrayList<AbstractFile>();
|
||||
Collection<AbstractFile> ret = new ArrayList<>();
|
||||
ret.add(ld);
|
||||
return ret;
|
||||
}
|
||||
@ -712,7 +653,7 @@ final class IngestScheduler {
|
||||
@Override
|
||||
public Collection<AbstractFile> visit(LayoutFile lf) {
|
||||
//case when we hit a layout file, not under a real FS
|
||||
Collection<AbstractFile> ret = new ArrayList<AbstractFile>();
|
||||
Collection<AbstractFile> ret = new ArrayList<>();
|
||||
ret.add(lf);
|
||||
return ret;
|
||||
}
|
||||
@ -721,7 +662,7 @@ final class IngestScheduler {
|
||||
public Collection<AbstractFile> visit(Directory drctr) {
|
||||
//we hit a real directory, a child of real FS
|
||||
|
||||
Collection<AbstractFile> ret = new ArrayList<AbstractFile>();
|
||||
Collection<AbstractFile> ret = new ArrayList<>();
|
||||
|
||||
ret.add(drctr);
|
||||
|
||||
@ -756,68 +697,32 @@ final class IngestScheduler {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* DataSourceScheduler ingest scheduler
|
||||
*/
|
||||
static class DataSourceScheduler implements Iterator<IngestJob> {
|
||||
static class DataSourceIngestScheduler {
|
||||
|
||||
private LinkedList<IngestJob> tasks;
|
||||
private final LinkedList<IngestJob> tasks = new LinkedList<>();
|
||||
|
||||
DataSourceScheduler() {
|
||||
tasks = new LinkedList<>();
|
||||
private DataSourceIngestScheduler() {
|
||||
}
|
||||
|
||||
synchronized void schedule(IngestJob task) {
|
||||
synchronized void queueForIngest(IngestJob job) {
|
||||
try {
|
||||
if (task.getDataSource().getParent() != null) {
|
||||
//only accepting parent-less content objects (Image, parentless VirtualDirectory)
|
||||
logger.log(Level.SEVERE, "Only parent-less Content (data sources) can be scheduled for DataSource ingest, skipping: {0}", task.getDataSource());
|
||||
if (job.getDataSource().getParent() != null) {
|
||||
logger.log(Level.SEVERE, "Only parent-less Content (data sources) can be scheduled for DataSource ingest, skipping: {0}", job.getDataSource());
|
||||
return;
|
||||
}
|
||||
} catch (TskCoreException e) {
|
||||
logger.log(Level.SEVERE, "Error validating data source to be scheduled for DataSource ingest" + task.getDataSource(), e);
|
||||
logger.log(Level.SEVERE, "Error validating data source to be scheduled for DataSource ingest" + job.getDataSource(), e);
|
||||
return;
|
||||
}
|
||||
|
||||
tasks.addLast(task);
|
||||
tasks.addLast(job);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized IngestJob next() throws IllegalStateException {
|
||||
if (!hasNext()) {
|
||||
throw new IllegalStateException(
|
||||
NbBundle.getMessage(this.getClass(), "IngestScheduler.DataSourceScheduler.exception.next.msg"));
|
||||
}
|
||||
|
||||
final IngestJob ret = tasks.pollFirst();
|
||||
return ret;
|
||||
public synchronized IngestJob getNextTask() {
|
||||
return tasks.pollFirst();
|
||||
}
|
||||
|
||||
/**
|
||||
* get all data source that are scheduled to process
|
||||
*
|
||||
* @return list of data sources in the queue scheduled to process
|
||||
*/
|
||||
synchronized List<org.sleuthkit.datamodel.Content> getContents() {
|
||||
List<org.sleuthkit.datamodel.Content> contents = new ArrayList<org.sleuthkit.datamodel.Content>();
|
||||
for (IngestJob task : tasks) {
|
||||
contents.add(task.getDataSource());
|
||||
}
|
||||
return contents;
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized boolean hasNext() {
|
||||
return !tasks.isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {
|
||||
throw new UnsupportedOperationException(
|
||||
NbBundle.getMessage(this.getClass(), "IngestScheduler.DataSourceScheduler.exception.remove.msg"));
|
||||
}
|
||||
|
||||
synchronized void empty() {
|
||||
synchronized void emptyQueues() {
|
||||
tasks.clear();
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user