19package org.sleuthkit.autopsy.core;
21import org.sleuthkit.autopsy.core.events.ServiceEvent;
22import com.google.common.util.concurrent.ThreadFactoryBuilder;
23import java.beans.PropertyChangeListener;
25import java.util.concurrent.ConcurrentHashMap;
26import java.util.concurrent.ScheduledThreadPoolExecutor;
27import java.util.concurrent.TimeUnit;
28import java.util.logging.Level;
29import java.util.stream.Collectors;
30import java.util.stream.Stream;
31import org.openide.util.Lookup;
32import org.openide.util.NbBundle;
33import org.sleuthkit.autopsy.coreutils.Logger;
34import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
35import org.sleuthkit.autopsy.events.AutopsyEventPublisher;
36import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchService;
37import org.sleuthkit.autopsy.events.MessageServiceConnectionInfo;
38import org.sleuthkit.autopsy.events.MessageServiceException;
39import org.sleuthkit.autopsy.keywordsearchservice.KeywordSearchServiceException;
40import org.sleuthkit.datamodel.CaseDbConnectionInfo;
41import org.sleuthkit.datamodel.SleuthkitCase;
42import org.sleuthkit.datamodel.TskCoreException;
87 private static final Set<String>
coreServices = Stream.of(
ServicesMonitor.Service.values()).map(Service::toString).collect(Collectors.toSet());
145 String serviceDisplayName;
147 serviceDisplayName =
ServicesMonitor.Service.valueOf(service).getDisplayName();
148 }
catch (IllegalArgumentException ignore) {
149 serviceDisplayName = service;
153 logger.log(Level.INFO,
"Connection to {0} is up", serviceDisplayName);
155 NbBundle.getMessage(
ServicesMonitor.class,
"ServicesMonitor.restoredService.notify.title"),
156 NbBundle.getMessage(
ServicesMonitor.class,
"ServicesMonitor.restoredService.notify.msg", serviceDisplayName));
158 logger.log(Level.SEVERE,
"Failed to connect to {0}. Reason: {1}",
new Object[]{serviceDisplayName, details});
160 NbBundle.getMessage(
ServicesMonitor.class,
"ServicesMonitor.failedService.notify.title"),
161 NbBundle.getMessage(
ServicesMonitor.class,
"ServicesMonitor.failedService.notify.msg", serviceDisplayName));
163 logger.log(Level.INFO,
"Status for {0} is {1} ({2})",
new Object[]{serviceDisplayName, status});
165 NbBundle.getMessage(
ServicesMonitor.class,
"ServicesMonitor.statusChange.notify.title"),
166 NbBundle.getMessage(
ServicesMonitor.class,
"ServicesMonitor.statusChange.notify.msg",
new Object[]{serviceDisplayName, status, details}));
184 if (service ==
null || service.isEmpty()) {
197 if (status ==
null) {
219 public void addSubscriber(Set<String> services, PropertyChangeListener subscriber) {
230 public void addSubscriber(String service, PropertyChangeListener subscriber) {
293 }
catch (Exception ex) {
294 logger.log(Level.SEVERE,
"An error occurred during services monitoring", ex);
311 super(message, cause);
334 CaseDbConnectionInfo info;
338 logger.log(Level.SEVERE,
"Error accessing case database connection info", ex);
343 SleuthkitCase.tryConnect(info);
345 }
catch (TskCoreException ex) {
356 if (kwsService !=
null) {
360 if (!kwsHostName.isEmpty()) {
375 NbBundle.getMessage(
ServicesMonitor.class,
"ServicesMonitor.KeywordSearchNull"));
377 }
catch (NumberFormatException ex) {
378 String rootCause = NbBundle.getMessage(
ServicesMonitor.class,
"ServicesMonitor.InvalidPortNumber");
379 logger.log(Level.SEVERE,
"Unable to connect to Keyword Search server: " + rootCause, ex);
382 String rootCause = ex.getMessage();
383 logger.log(Level.SEVERE,
"Unable to connect to Keyword Search server: " + rootCause, ex);
396 logger.log(Level.SEVERE,
"Error accessing messaging service connection info", ex);
405 String rootCause = ex.getMessage();
406 logger.log(Level.SEVERE,
"Unable to connect to messaging server: " + rootCause, ex);
ServicesMonitorException(String message)
ServicesMonitorException(String message, Throwable cause)
static final long serialVersionUID
void checkServiceStatus(String service)
static synchronized ServicesMonitor getInstance()
void checkDatabaseConnectionStatus()
void addSubscriber(Set< String > services, PropertyChangeListener subscriber)
final AutopsyEventPublisher eventPublisher
static ServicesMonitor servicesMonitor
final ScheduledThreadPoolExecutor periodicTasksExecutor
void checkKeywordSearchServerConnectionStatus()
void removeSubscriber(Set< String > services, PropertyChangeListener subscriber)
final ConcurrentHashMap< String, String > statusByService
static final Set< String > coreServices
void checkMessagingServerConnectionStatus()
static final Logger logger
void setServiceStatus(String service, String status, String details)
void removeSubscriber(String service, PropertyChangeListener subscriber)
void addSubscriber(String service, PropertyChangeListener subscriber)
String getServiceStatus(String service)
static final int NUMBER_OF_PERIODIC_TASK_THREADS
void removeSubscriber(PropertyChangeListener subscriber)
void addSubscriber(PropertyChangeListener subscriber)
static final long CRASH_DETECTION_INTERVAL_MINUTES
static final String PERIODIC_TASK_THREAD_NAME
static String getIndexingServerPort()
static boolean getIsMultiUserModeEnabled()
static CaseDbConnectionInfo getDatabaseConnectionInfo()
static String getSolr4ServerHost()
static String getIndexingServerHost()
static MessageServiceConnectionInfo getMessageServiceConnectionInfo()
static String getSolr4ServerPort()
synchronized static Logger getLogger(String name)
static void error(String title, String message)
static void info(String title, String message)
Service(String displayName)
void tryConnect(String host, int port)