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.