19package org.sleuthkit.autopsy.report.infrastructure;
21import org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModuleSettings;
22import org.sleuthkit.autopsy.report.modules.portablecase.PortableCaseReportModule;
23import org.sleuthkit.autopsy.report.NoReportModuleSettings;
24import org.sleuthkit.autopsy.report.ReportModule;
25import org.sleuthkit.autopsy.report.ReportModuleSettings;
26import org.sleuthkit.autopsy.report.GeneralReportModule;
27import java.awt.event.ActionEvent;
28import java.awt.event.ActionListener;
29import java.awt.event.WindowAdapter;
30import java.awt.event.WindowEvent;
32import java.io.IOException;
33import java.text.DateFormat;
34import java.text.SimpleDateFormat;
35import java.util.ArrayList;
36import java.util.Collections;
38import java.util.HashMap;
41import java.util.Map.Entry;
42import java.util.logging.Level;
43import javax.swing.JDialog;
44import org.openide.filesystems.FileUtil;
45import org.openide.util.NbBundle;
46import org.openide.windows.WindowManager;
47import org.sleuthkit.autopsy.casemodule.Case;
48import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
49import org.sleuthkit.autopsy.coreutils.Logger;
50import org.sleuthkit.autopsy.python.FactoryClassNameNormalizer;
51import org.sleuthkit.autopsy.report.GeneralReportSettings;
52import org.sleuthkit.autopsy.report.ReportProgressPanel;
53import org.sleuthkit.autopsy.report.ReportProgressPanel.ReportStatus;
54import org.sleuthkit.datamodel.AbstractFile;
55import org.sleuthkit.datamodel.SleuthkitCase;
56import org.sleuthkit.datamodel.TskCoreException;
57import org.sleuthkit.datamodel.TskData;
68 private static final String
REPORT_PATH_FMT_STR =
"%s" + File.separator +
"%s %s %s" + File.separator;
89 String errorString =
"";
91 errorString += error +
"\n";
107 this.reportGenerationPanel =
null;
120 this.reportGenerationPanel = panel;
121 this.progressIndicator = panel.getProgressPanel();
134 Map<String, ReportModule> modules =
new HashMap<>();
154 "ReportGenerator.error.noReportModules=No report modules found",
155 "# {0} - report configuration name",
"ReportGenerator.error.unableToLoadConfig=Unable to load reporting configuration {0}.",
156 "# {0} - report module name",
"ReportGenerator.error.moduleNotFound=Report module {0} not found",
157 "# {0} - report module name",
"ReportGenerator.error.noTableReportSettings=No table report settings for report module {0}",
158 "# {0} - report module name",
"ReportGenerator.error.noFileReportSettings=No file report settings for report module {0}",
159 "# {0} - report module name",
"ReportGenerator.error.invalidSettings=Invalid settings for report module {0}",
160 "# {0} - report module name",
"ReportGenerator.error.unsupportedType=Report module {0} has unsupported report module type",
161 "# {0} - report module name",
"ReportGenerator.error.exception=Exception while running report module {0}"})
175 if (modules ==
null || modules.isEmpty()) {
176 logger.log(Level.SEVERE, Bundle.ReportGenerator_error_noReportModules());
177 progressIndicator.updateStatusLabel(Bundle.ReportGenerator_error_noReportModules());
181 ReportingConfig config =
null;
183 config = ReportingConfigLoader.loadConfig(
configName);
184 }
catch (ReportConfigException ex) {
185 logger.log(Level.SEVERE, Bundle.ReportGenerator_error_unableToLoadConfig(
configName), ex);
190 if (config ==
null) {
191 logger.log(Level.SEVERE, Bundle.ReportGenerator_error_unableToLoadConfig(
configName));
198 for (Map.Entry<String, ReportModuleConfig> entry : config.getModuleConfigs().entrySet()) {
199 ReportModuleConfig moduleConfig = entry.getValue();
200 if (moduleConfig ==
null || !moduleConfig.isEnabled()) {
205 String moduleName = entry.getKey();
207 if (module ==
null) {
208 logger.log(Level.SEVERE, Bundle.ReportGenerator_error_moduleNotFound(moduleName));
209 progressIndicator.updateStatusLabel(Bundle.ReportGenerator_error_moduleNotFound(moduleName));
215 if (settings ==
null) {
233 TableReportSettings tableSettings = config.getTableReportSettings();
234 if (tableSettings ==
null) {
235 logger.log(Level.SEVERE, Bundle.ReportGenerator_error_noTableReportSettings(moduleName));
236 progressIndicator.updateStatusLabel(Bundle.ReportGenerator_error_noTableReportSettings(moduleName));
245 FileReportSettings fileSettings = config.getFileReportSettings();
246 if (fileSettings ==
null) {
247 logger.log(Level.SEVERE, Bundle.ReportGenerator_error_noFileReportSettings(moduleName));
248 progressIndicator.updateStatusLabel(Bundle.ReportGenerator_error_noFileReportSettings(moduleName));
259 logger.log(Level.SEVERE, Bundle.ReportGenerator_error_invalidSettings(moduleName));
260 progressIndicator.updateStatusLabel(Bundle.ReportGenerator_error_invalidSettings(moduleName));
267 logger.log(Level.SEVERE, Bundle.ReportGenerator_error_unsupportedType(moduleName));
268 progressIndicator.updateStatusLabel(Bundle.ReportGenerator_error_unsupportedType(moduleName));
270 }
catch (IOException e) {
271 logger.log(Level.SEVERE, Bundle.ReportGenerator_error_exception(moduleName));
272 progressIndicator.updateStatusLabel(Bundle.ReportGenerator_error_exception(moduleName));
285 void displayProgressPanel() {
290 final JDialog dialog =
new JDialog(WindowManager.getDefault().getMainWindow(),
true);
291 dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
292 dialog.setTitle(NbBundle.getMessage(
this.getClass(),
"ReportGenerator.displayProgress.title.text"));
293 dialog.add(this.reportGenerationPanel);
298 public void actionPerformed(ActionEvent e) {
303 dialog.addWindowListener(
new WindowAdapter() {
305 public void windowClosing(WindowEvent e) {
310 dialog.setLocationRelativeTo(WindowManager.getDefault().getMainWindow());
311 dialog.setVisible(
true);
318 if (generalReportModule !=
null) {
321 reportSettings.setReportDirectoryPath(reportDir);
333 if (tableReport !=
null && tableReportSettings !=
null &&
null != tableReportSettings.getArtifactSelections()) {
336 tableReport.startReport(reportDir);
337 TableReportGenerator generator =
new TableReportGenerator(tableReportSettings,
progressIndicator, tableReport);
339 tableReport.endReport();
360 if (fileReportModule !=
null && fileReportSettings !=
null &&
null != fileReportSettings.getFileProperties()) {
362 List<FileReportDataTypes> enabled =
new ArrayList<>();
363 for (Entry<FileReportDataTypes, Boolean> e : fileReportSettings.getFileProperties().entrySet()) {
365 enabled.add(e.getKey());
372 NbBundle.getMessage(
this.getClass(),
"ReportGenerator.progress.queryingDb.text"));
375 List<AbstractFile> files =
getFiles();
376 int numFiles = files.size();
378 fileReportModule.startReport(reportDir);
379 fileReportModule.startTable(enabled);
386 for (AbstractFile file : files) {
395 fileReportModule.addRow(file, enabled);
399 if ((i % 100) == 0) {
401 NbBundle.getMessage(
this.getClass(),
"ReportGenerator.progress.processingFile.text",
407 fileReportModule.endTable();
408 fileReportModule.endReport();
414 if (fileReportSettings.getSelectedDataSources() ==
null) {
418 return !fileReportSettings.getSelectedDataSources().contains(file.getDataSourceObjectId());
425 if (portableCaseReportModule !=
null) {
438 List<AbstractFile> absFiles;
441 absFiles = skCase.findAllFilesWhere(
"meta_type != " + TskData.TSK_FS_META_TYPE_ENUM.TSK_FS_META_TYPE_DIR.getValue());
444 progressIndicator.updateStatusLabel(NbBundle.getMessage(
this.getClass(),
"ReportGenerator.errors.reportErrorText") + ex.getLocalizedMessage());
445 logger.log(Level.SEVERE,
"failed to generate reports. Unable to get all files in the image.", ex);
446 return Collections.<AbstractFile>emptyList();
453 if (reportFilePath ==
null) {
455 }
else if (reportFilePath.isEmpty()) {
468 throw new IOException(
"Exception while getting open case.", ex);
471 DateFormat dateFormat =
new SimpleDateFormat(
"MM-dd-yyyy-HH-mm-ss");
472 Date date =
new Date();
473 String dateNoTime = dateFormat.format(date);
477 FileUtil.createFolder(
new File(reportPath));
478 }
catch (IOException ex) {
479 throw new IOException(
"Failed to make report folder, unable to generate reports.", ex);
SleuthkitCase getSleuthkitCase()
static Case getCurrentCaseThrows()
String getReportDirectory()
synchronized static Logger getLogger(String name)
static String normalize(String canonicalClassName)
final ReportProgressPanel progressIndicator
List< AbstractFile > getFiles()
static final String REPORT_PATH_FMT_STR
void generateReports(Map< String, ReportModule > modules)
boolean shouldFilterFromReport(AbstractFile file, FileReportSettings fileReportSettings)
void setupProgressPanel(ReportModule module, String reportDir)
void generateTableReport(TableReportModule tableReport, TableReportSettings tableReportSettings)
static String createReportDirectory(ReportModule module)
static String getReportsDirectory()
ReportGenerator(String configName, ReportProgressIndicator progressIndicator)
void generateGeneralReport(GeneralReportModule generalReportModule, GeneralReportSettings reportSettings)
void generateFileListReport(FileReportModule fileReportModule, FileReportSettings fileReportSettings)
static final Logger logger
void generatePortableCaseReport(PortableCaseReportModule portableCaseReportModule, PortableCaseReportModuleSettings settings)
static final String REPORTS_DIR
void displayReportErrors()
final ReportGenerationPanel reportGenerationPanel
default void setConfiguration(ReportModuleSettings settings)
String getRelativeFilePath()
default ReportModuleSettings getDefaultConfiguration()