diff --git a/BUILDING.txt b/BUILDING.txt index 0e0172c4d8..25e34e9ec1 100644 --- a/BUILDING.txt +++ b/BUILDING.txt @@ -1,8 +1,8 @@ - Last Updated: Sept 17, 2014 + Last Updated: 21 April 2015 This file outlines what it takes to build Autopsy from source. -Note that it currently only works out of the box on Windows. We +Note that it currently only works out-of-the-box on Windows. We are working on getting the process working under non-Windows systems. It generally works, but needs some custom mangling to find the correct C libraries. @@ -11,7 +11,9 @@ correct C libraries. STEPS: 1) Get Java Setup -1a) Download and install JDK version 1.8. You can now use 32-bit or 64-bit, but special work is needed to get The Sleuth Kit to compile as 64-bit. So, 32-bit is easier. +1a) Download and install JDK version 1.8. You can now use 32-bit or 64-bit, but +special work is needed to get The Sleuth Kit to compile as 64-bit. So, 32-bit +is easier, but if you intend to use PostgreSQL, choose 64-bit. Autopsy has been used and tested with Oracle JavaSE and the included JavaFX support (http://www.oracle.com/technetwork/java/javase/downloads/index.html). @@ -28,8 +30,8 @@ but it is a recommended IDE to use for development of Autopsy modules. need to set JRE_HOME_32 to the root 32-bit JRE directory and/or JRE_HOME_64 to the root 64-bit JRE directory. -1e) (optional) For some Autopsy features to be functional, you need to add java executable to the system PATH. - +1e) (optional) For some Autopsy features to be functional, you need to add the + java executable to the system PATH. 2) Get Sleuth Kit Setup @@ -43,18 +45,29 @@ our 64-bit version of libewf: 2b) Set LIBEWF_HOME environment variable to root directory of LIBEWF -2c) Download and build a Release version of Sleuth Kit (TSK) 4.0. You -need to build the tsk_jni project. You can use a released version or -download the latest from github: +2c) Download and install PostgreSQL 9.4 or above. The official releases are + from: http://www.postgresql.org/download/ + +2d) Set the POSTGRESQL_HOME_64 environment variable to point to the + PostgreSQL folder containing, but not including, the bin folder. + Example: POSTGRESQL_HOME_64=C:\Program Files\PostgreSQL\9.4 + +2d) Download and build a Release version of Sleuth Kit (TSK) 4.0. See + win32\BUILDING.txt in the TSK package for more information. You need to + build the tsk_jni project. Select the Debug_PostgreSQL x64 or + Release_PostgreSQL x64 target. You can use a released version or download + the latest from github: - git://github.com/sleuthkit/sleuthkit.git -2d) Build the TSK JAR file by typing 'ant' in bindings/java in the -TSK source code folder from a command line. You can also add the -code to a NetBeans project and build it from there. +2e) Build the TSK JAR file by typing 'ant PostgreSQL' in bindings/java in the + TSK source code folder from a command line. Note it is case sensitive. You + can also add the code to a NetBeans project and build it from there, + selecting the PostgreSQL target. For TSK, the default is SQLite, which is + not enough for Autopsy. You must use the PostgreSQL target. -2e) Set TSK_HOME environment variable to the root directory of TSK +2f) Set TSK_HOME environment variable to the root directory of TSK -2f) On Non-Windows systems, you will need to do a 'make install' +2g) On Non-Windows systems, you will need to do a 'make install' from the TSK root directory to install the libraries and such in the needed places (i.e. '/usr/local'). @@ -85,12 +98,13 @@ and by submitting pull requests to the main Autopsy repository. 5) Compile Autopsy 5a) using Netbeans IDE: - Start NetBeans IDE and open the Autopsy project. -- Choose to build the Autopsy project / module. It is the highest -level project that will then cause the other modules to be compiled. +- To build Autopsy, PostgreSQL is required to be installed. +- Choose to build the Autopsy project / module. It is the highest level project + that will cause the other modules to be compiled. 5b) without Netbeans IDE (requires JDK and ant >= 1.7.1): - from root directory of Autopsy source execute: -ant build +ant (to build Autopsy) ant run (to run Autopsy) @@ -102,8 +116,10 @@ the build process. - The Sleuth Kit Java datamodel JAR file has native JNI libraries that are copied into it. These JNI libraries have dependencies on -libewf and zlib. On non-Windows platforms, the JNI library also has -a dependency on libtsk (on Windows, it is compiled into libtsk_jni). +libewf and zlib. If you are using PostgreSQL, the dependencies are on libewf, +zlib, libpq, libintl-8, libeay32, and ssleay32 DLL files. On non-Windows +platforms, the JNI library also has a dependency on libtsk (on Windows, +it is compiled into libtsk_jni). - NetBeans uses ant to build Autopsy. The build target copies the TSK datamodel JAR file into the project. If you want to use the diff --git a/KeywordSearch/release/solr/contexts/solr-jetty-context.xml b/KeywordSearch/release/solr/contexts/solr-jetty-context.xml index 50978a365f..a84d325e74 100644 --- a/KeywordSearch/release/solr/contexts/solr-jetty-context.xml +++ b/KeywordSearch/release/solr/contexts/solr-jetty-context.xml @@ -4,5 +4,5 @@ /webapps/solr.war /etc/webdefault.xml - /solr-webapp + diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java index ac80816888..01a87bd7eb 100644 --- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java +++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Server.java @@ -60,6 +60,7 @@ import org.sleuthkit.autopsy.coreutils.PlatformUtil; import org.sleuthkit.datamodel.Content; import org.apache.solr.common.SolrInputDocument; import org.apache.solr.client.solrj.impl.XMLResponseParser; +import org.apache.solr.client.solrj.response.CoreAdminResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrException; import org.sleuthkit.autopsy.casemodule.Case.CaseType; @@ -513,9 +514,18 @@ public class Server { * Waits for the stop command to finish before returning. */ synchronized void stop() { + + try { + // Close any open core before stopping server + closeCore(); + } + catch (KeywordSearchModuleException e) { + logger.log(Level.WARNING, "Failed to close core: ", e); //NON-NLS + } try { logger.log(Level.INFO, "Stopping Solr server from: " + solrFolder.getAbsolutePath()); //NON-NLS + //try graceful shutdown final String [] SOLR_STOP_CMD = { javaPath, @@ -653,6 +663,7 @@ public class Server { if (currentCore == null) { return; } + currentCore.close(); currentCore = null; serverAction.putValue(CORE_EVT, CORE_EVT_STATES.STOPPED); @@ -971,11 +982,6 @@ public class Server { NbBundle.getMessage(this.getClass(), "Server.openCore.exception.msg")); } - CoreAdminRequest.Create createCore = new CoreAdminRequest.Create(); - createCore.setDataDir(dataDir.getAbsolutePath()); - createCore.setCoreName(coreName); - createCore.setConfigSet("AutopsyConfig"); - if (caseType == CaseType.SINGLE_USER_CASE) { currentSolrServer = this.localSolrServer; //createCore.setInstanceDir(instanceDir); @@ -984,9 +990,18 @@ public class Server { currentSolrServer = connectToRemoteSolrServer(); } - currentSolrServer.request(createCore); + if (!isCoreLoaded(coreName)) { + CoreAdminRequest.Create createCore = new CoreAdminRequest.Create(); + createCore.setDataDir(dataDir.getAbsolutePath()); + createCore.setCoreName(coreName); + createCore.setConfigSet("AutopsyConfig"); //NON-NLS + createCore.setIsLoadOnStartup(false); + createCore.setIsTransient(true); - final Core newCore = new Core(coreName); + currentSolrServer.request(createCore); + } + + final Core newCore = new Core(coreName, caseType); return newCore; @@ -1005,18 +1020,34 @@ public class Server { return new HttpSolrServer("http://" + host + ":" + port + "/solr"); } + + /** + * Determines whether the Solr core with the given name already exists. + * @param coreName + * @return true if core exists, otherwise false. + * @throws SolrServerException + * @throws IOException + */ + private boolean isCoreLoaded(String coreName) throws SolrServerException, IOException { + CoreAdminResponse response = CoreAdminRequest.getStatus(coreName, currentSolrServer); + return response.getCoreStatus(coreName).get("instanceDir") != null; //NON-NLS + } class Core { // handle to the core in Solr - private String name; + private final String name; + + private final CaseType caseType; + // the server to access a core needs to be built from a URL with the // core in it, and is only good for core-specific operations - private HttpSolrServer solrCore; + private final HttpSolrServer solrCore; - private Core(String name) { + private Core(String name, CaseType caseType) { this.name = name; - + this.caseType = caseType; + this.solrCore = new HttpSolrServer(currentSolrServer.getBaseURL() + "/" + name); //TODO test these settings @@ -1119,6 +1150,11 @@ public class Server { } synchronized void close() throws KeywordSearchModuleException { + // We only unload cores for "single-user" cases. + if (this.caseType == CaseType.MULTI_USER_CASE) { + return; + } + try { CoreAdminRequest.unloadCore(this.name, currentSolrServer); } catch (SolrServerException ex) { diff --git a/build.xml b/build.xml index 09cd25d639..49c44e8469 100644 --- a/build.xml +++ b/build.xml @@ -2,7 +2,7 @@ - + Builds the module suite Autopsy3.