mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-16 17:57:43 +00:00
First cut at integrating AutopsyServiceProvider
This commit is contained in:
parent
7d252864a4
commit
40cc726a11
@ -117,7 +117,7 @@ public interface AutopsyServiceProvider {
|
|||||||
*
|
*
|
||||||
* @param message Exception message.
|
* @param message Exception message.
|
||||||
*/
|
*/
|
||||||
AutopsyServiceProviderException(String message) {
|
public AutopsyServiceProviderException(String message) {
|
||||||
super(message);
|
super(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,7 +128,7 @@ public interface AutopsyServiceProvider {
|
|||||||
* @param message Exception message.
|
* @param message Exception message.
|
||||||
* @param throwable Exception cause.
|
* @param throwable Exception cause.
|
||||||
*/
|
*/
|
||||||
AutopsyServiceProviderException(String message, Throwable throwable) {
|
public AutopsyServiceProviderException(String message, Throwable throwable) {
|
||||||
super(message, throwable);
|
super(message, throwable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -191,6 +191,8 @@ public class Server {
|
|||||||
private static final String KWS_OUTPUT_FOLDER_NAME = "keywordsearch";
|
private static final String KWS_OUTPUT_FOLDER_NAME = "keywordsearch";
|
||||||
private static final String KWS_DATA_FOLDER_NAME = "data";
|
private static final String KWS_DATA_FOLDER_NAME = "data";
|
||||||
private static final String INDEX_FOLDER_NAME = "index";
|
private static final String INDEX_FOLDER_NAME = "index";
|
||||||
|
private static final String CURRENT_SOLR_VERSION = "6";
|
||||||
|
private static final String CURRENT_SOLR_SCHEMA_VERSION = "2.0";
|
||||||
|
|
||||||
public enum CORE_EVT_STATES {
|
public enum CORE_EVT_STATES {
|
||||||
|
|
||||||
@ -307,6 +309,14 @@ public class Server {
|
|||||||
return currentSolrStopPort;
|
return currentSolrStopPort;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String getCurrentSolrVersion() {
|
||||||
|
return CURRENT_SOLR_VERSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
String getCurrentSchemaVersion() {
|
||||||
|
return CURRENT_SOLR_SCHEMA_VERSION;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper threads to handle stderr/stdout from Solr process
|
* Helper threads to handle stderr/stdout from Solr process
|
||||||
*/
|
*/
|
||||||
@ -731,17 +741,25 @@ public class Server {
|
|||||||
return indexDir;
|
return indexDir;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String findLatestIndexDataDir(Case theCase) {
|
||||||
|
String dataFolderName = "solr" + CURRENT_SOLR_VERSION + "_schema_" + CURRENT_SOLR_SCHEMA_VERSION;
|
||||||
|
return findIndexDataDir(theCase, dataFolderName);
|
||||||
|
}
|
||||||
|
|
||||||
|
String findOldIndexDataDir(Case theCase) {
|
||||||
|
return findIndexDataDir(theCase, "");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find index dir location for the case. This is done by doing a subdirectory
|
* Find index directory location for the case. This is done via subdirectory
|
||||||
* search of all existing "ModuleOutput/node_name/keywordsearch/data/" folders.
|
* search of all existing "ModuleOutput/node_name/keywordsearch/data/" folders.
|
||||||
*
|
*
|
||||||
* @param theCase the case to get index dir for
|
* @param theCase the case to get index dir for
|
||||||
*
|
*
|
||||||
* @return absolute path to index dir
|
* @return absolute path to index dir
|
||||||
*/
|
*/
|
||||||
String findIndexDataDir(Case theCase) {
|
private List<String> findIndexDataDir(Case theCase, String dataFolderName) {
|
||||||
String indexDir = "";
|
ArrayList<String> indexDirs = new ArrayList<>();
|
||||||
// look for existing index folder
|
// look for existing index folder
|
||||||
if (theCase.getCaseType() == CaseType.MULTI_USER_CASE) {
|
if (theCase.getCaseType() == CaseType.MULTI_USER_CASE) {
|
||||||
// multi user cases contain a subfolder for each node that participated in case ingest or review.
|
// multi user cases contain a subfolder for each node that participated in case ingest or review.
|
||||||
@ -756,26 +774,28 @@ public class Server {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
// ELTODO is it possible that index is in a different location? what about new solr6 index?
|
// ELTODO is it possible that index is in a different location? what about new solr6 index?
|
||||||
String path = Paths.get(item.getAbsolutePath(), MODULE_OUTPUT, KWS_OUTPUT_FOLDER_NAME, KWS_DATA_FOLDER_NAME).toString(); //NON-NLS
|
String path = Paths.get(item.getAbsolutePath(), MODULE_OUTPUT, KWS_OUTPUT_FOLDER_NAME, KWS_DATA_FOLDER_NAME, dataFolderName).toString(); //NON-NLS
|
||||||
if (containsValidIndexFolder(path)) {
|
if (containsValidIndexFolder(path)) {
|
||||||
indexDir = path;
|
indexDirs.add(path);
|
||||||
// ELTODO analyze possibilities of multiple indexes
|
// there can be multiple index folders (e.g. current version and "old" version) so keep looking
|
||||||
break; // there should only be one index
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
String path = Paths.get(theCase.getModuleDirectory(), KWS_OUTPUT_FOLDER_NAME, KWS_DATA_FOLDER_NAME).toString(); //NON-NLS
|
// single user case
|
||||||
|
String path = Paths.get(theCase.getModuleDirectory(), KWS_OUTPUT_FOLDER_NAME, KWS_DATA_FOLDER_NAME, dataFolderName).toString(); //NON-NLS
|
||||||
if (containsValidIndexFolder(path)) {
|
if (containsValidIndexFolder(path)) {
|
||||||
indexDir = path;
|
indexDirs.add(path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if we still did not find index then it is a new case
|
// did we find an index that requires an upgrade?
|
||||||
if (indexDir.isEmpty()) {
|
if (indexDir.isEmpty()) {
|
||||||
indexDir = Paths.get(theCase.getModuleDirectory(), KWS_OUTPUT_FOLDER_NAME, KWS_DATA_FOLDER_NAME).toString(); //NON-NLS
|
return indexDir;
|
||||||
|
// ELTODO if we still did not find index then it is a new case
|
||||||
|
// ELTODO indexDir = Paths.get(theCase.getModuleDirectory(), KWS_OUTPUT_FOLDER_NAME, KWS_DATA_FOLDER_NAME).toString(); //NON-NLS
|
||||||
}
|
}
|
||||||
|
|
||||||
// ELTODO do we still need this?
|
// ELTODO do we need to do this when searching for old index?
|
||||||
if (uncPathUtilities != null) {
|
if (uncPathUtilities != null) {
|
||||||
// if we can check for UNC paths, do so, otherwise just return the indexDir
|
// if we can check for UNC paths, do so, otherwise just return the indexDir
|
||||||
String result = uncPathUtilities.mappedDriveToUNC(indexDir);
|
String result = uncPathUtilities.mappedDriveToUNC(indexDir);
|
||||||
@ -864,7 +884,6 @@ public class Server {
|
|||||||
throw new KeywordSearchModuleException(NbBundle.getMessage(Server.class, "Server.connect.exception.msg"), ex);
|
throw new KeywordSearchModuleException(NbBundle.getMessage(Server.class, "Server.connect.exception.msg"), ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
//String indexDir = findIndexDataDir(theCase); // ELTODO
|
|
||||||
String dataDir = geCoreDataDirPath(theCase);
|
String dataDir = geCoreDataDirPath(theCase);
|
||||||
String coreName = theCase.getTextIndexName();
|
String coreName = theCase.getTextIndexName();
|
||||||
return this.openCore(coreName.isEmpty() ? DEFAULT_CORE_NAME : coreName, new File(dataDir), theCase.getCaseType());
|
return this.openCore(coreName.isEmpty() ? DEFAULT_CORE_NAME : coreName, new File(dataDir), theCase.getCaseType());
|
||||||
|
@ -36,6 +36,8 @@ import org.sleuthkit.datamodel.SleuthkitCase;
|
|||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.util.MissingResourceException;
|
import java.util.MissingResourceException;
|
||||||
|
import org.sleuthkit.autopsy.core.RuntimeProperties;
|
||||||
|
import org.sleuthkit.autopsy.corecomponentinterfaces.AutopsyServiceProvider;
|
||||||
import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchServiceException;
|
import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchServiceException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -43,7 +45,7 @@ import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchServiceException;
|
|||||||
* text indexing and search.
|
* text indexing and search.
|
||||||
*/
|
*/
|
||||||
@ServiceProvider(service = KeywordSearchService.class)
|
@ServiceProvider(service = KeywordSearchService.class)
|
||||||
public class SolrSearchService implements KeywordSearchService {
|
public class SolrSearchService implements KeywordSearchService, AutopsyServiceProvider {
|
||||||
|
|
||||||
private static final String BAD_IP_ADDRESS_FORMAT = "ioexception occurred when talking to server"; //NON-NLS
|
private static final String BAD_IP_ADDRESS_FORMAT = "ioexception occurred when talking to server"; //NON-NLS
|
||||||
private static final String SERVER_REFUSED_CONNECTION = "server refused connection"; //NON-NLS
|
private static final String SERVER_REFUSED_CONNECTION = "server refused connection"; //NON-NLS
|
||||||
@ -230,4 +232,76 @@ public class SolrSearchService implements KeywordSearchService {
|
|||||||
@Override
|
@Override
|
||||||
public void close() throws IOException {
|
public void close() throws IOException {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param context
|
||||||
|
*
|
||||||
|
* @throws
|
||||||
|
* org.sleuthkit.autopsy.corecomponentinterfaces.AutopsyServiceProvider.AutopsyServiceProviderException
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void openCaseResources(Context context) throws AutopsyServiceProviderException {
|
||||||
|
/*
|
||||||
|
* Autopsy service providers may not have case-level resources.
|
||||||
|
*/
|
||||||
|
Server server = KeywordSearch.getServer();
|
||||||
|
if (server.coreIsOpen() == false) {
|
||||||
|
throw new AutopsyServiceProviderException("ELTODO");
|
||||||
|
}
|
||||||
|
|
||||||
|
// do a case subdirectory search to check if latest index exists
|
||||||
|
|
||||||
|
// do a case subdirectory search to check for the existence and upgrade status of cores
|
||||||
|
String indexDir = server.findLatestIndexDataDir(Case.getCurrentCase()); // ELTODO
|
||||||
|
|
||||||
|
// check if index needs upgrade
|
||||||
|
boolean needsUpgrade = true;
|
||||||
|
|
||||||
|
if (needsUpgrade && RuntimeProperties.coreComponentsAreActive()) {
|
||||||
|
//pop up a message box to indicate the restrictions on adding additional
|
||||||
|
//text and performing regex searches and give the user the option to decline the upgrade
|
||||||
|
boolean upgradeDeclined = true;
|
||||||
|
if (upgradeDeclined) {
|
||||||
|
throw new AutopsyServiceProviderException("ELTODO");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needsUpgrade) {
|
||||||
|
// ELTODO Check for cancellation at whatever points are feasible
|
||||||
|
|
||||||
|
// Copy the contents (core) of ModuleOutput/keywordsearch/data/index into ModuleOutput/keywordsearch/data/solr6_schema_2.0/index
|
||||||
|
|
||||||
|
// Make a “reference copy” of the configset and place it in ModuleOutput/keywordsearch/data/solr6_schema_2.0/configset
|
||||||
|
|
||||||
|
// Run the upgrade tools on the contents (core) in ModuleOutput/keywordsearch/data/solr6_schema_2.0/index
|
||||||
|
|
||||||
|
// Open the upgraded index
|
||||||
|
|
||||||
|
// execute a test query
|
||||||
|
boolean success = true;
|
||||||
|
|
||||||
|
if (!success) {
|
||||||
|
// delete the new directories
|
||||||
|
|
||||||
|
// close the upgraded index?
|
||||||
|
|
||||||
|
throw new AutopsyServiceProviderException("ELTODO");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param context
|
||||||
|
*
|
||||||
|
* @throws
|
||||||
|
* org.sleuthkit.autopsy.corecomponentinterfaces.AutopsyServiceProvider.AutopsyServiceProviderException
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void closeCaseResources(Context context) throws AutopsyServiceProviderException {
|
||||||
|
/*
|
||||||
|
* Autopsy service providers may not have case-level resources.
|
||||||
|
*/
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user