# -*- coding: utf-8 -*-
"""Timesketch output module."""
from __future__ import unicode_literals
try:
from flask import current_app
import timesketch
from timesketch.models import db_session as timesketch_db_session
from timesketch.models import sketch as timesketch_sketch
from timesketch.models import user as timesketch_user
except ImportError:
timesketch = None
from plaso.output import logger
from plaso.output import manager
from plaso.output import shared_elastic
[docs]class TimesketchOutputModule(shared_elastic.SharedElasticsearchOutputModule):
"""Output module for Timesketch."""
NAME = 'timesketch'
DESCRIPTION = 'Create a Timesketch timeline.'
def __init__(self, output_mediator):
"""Initializes a Timesketch output module.
Args:
output_mediator (OutputMediator): mediates interactions between output
modules and other components, such as storage and dfvfs.
"""
hostname = output_mediator.GetStoredHostname()
if hostname:
logger.debug('Hostname: {0:s}'.format(hostname))
super(TimesketchOutputModule, self).__init__(output_mediator)
self._timeline_name = hostname
self._timeline_owner = None
self._timesketch = timesketch.create_app()
[docs] def Close(self):
"""Closes the connection to TimeSketch Elasticsearch database.
Sends the remaining events for indexing and removes the processing status on
the Timesketch search index object.
"""
super(TimesketchOutputModule, self).Close()
with self._timesketch.app_context():
search_index = timesketch_sketch.SearchIndex.query.filter_by(
index_name=self._index_name).first()
search_index.status.remove(search_index.status[0])
timesketch_db_session.add(search_index)
timesketch_db_session.commit()
[docs] def GetMissingArguments(self):
"""Retrieves a list of arguments that are missing from the input.
Returns:
list[str]: names of arguments that are required by the module and have
not been specified.
"""
if not self._timeline_name:
return ['timeline_name']
return []
[docs] def SetTimelineName(self, timeline_name):
"""Sets the timeline name.
Args:
timeline_name (str): timeline name.
"""
self._timeline_name = timeline_name
logger.info('Timeline name: {0:s}'.format(self._timeline_name))
[docs] def SetTimelineOwner(self, username):
"""Sets the username of the user that should own the timeline.
Args:
username (str): username.
"""
self._timeline_owner = username
logger.info('Owner of the timeline: {0!s}'.format(self._timeline_owner))
manager.OutputManager.RegisterOutput(TimesketchOutputModule, disabled=(
shared_elastic.elasticsearch is None or timesketch is None))