Source code for plaso.output.tln
"""Output module for the TLN format.
For documentation on the TLN format see:
https://forensics.wiki/tln
"""
from plaso.output import formatting_helper
from plaso.output import manager
from plaso.output import shared_dsv
[docs]
class TLNFieldFormattingHelper(formatting_helper.FieldFormattingHelper):
"""TLN output module field formatting helper."""
_DESCRIPTION_FIELD_DELIMITER = ";"
_FIELD_FORMAT_CALLBACKS = {
"description": "_FormatDescription",
"host": "_FormatHostname",
"inode": "_FormatInode",
"notes": "_FormatNotes",
"source": "_FormatSourceShort",
"time": "_FormatTimestamp",
"tz": "_FormatTimeZone",
"user": "_FormatUsername",
"values": "_FormatValues",
}
# The field format callback methods require specific arguments hence
# the check for unused arguments is disabled here.
# pylint: disable=unused-argument
def _FormatDescription(self, output_mediator, event, event_data, event_data_stream):
"""Formats a description field.
Args:
output_mediator (OutputMediator): mediates interactions between output
modules and other components, such as storage and dfVFS.
event (EventObject): event.
event_data (EventData): event data.
event_data_stream (EventDataStream): event data stream.
Returns:
str: description field.
"""
date_time_string = self._FormatDateTime(
output_mediator, event, event_data, event_data_stream
)
timestamp_description = event.timestamp_desc or "UNKNOWN"
message = self._FormatMessage(
output_mediator, event, event_data, event_data_stream
)
message = message.replace(self._DESCRIPTION_FIELD_DELIMITER, " ")
return f"{date_time_string:s}; {timestamp_description:s}; {message:s}"
def _FormatNotes(self, output_mediator, event, event_data, event_data_stream):
"""Formats a notes field.
Args:
output_mediator (OutputMediator): mediates interactions between output
modules and other components, such as storage and dfVFS.
event (EventObject): event.
event_data (EventData): event data.
event_data_stream (EventDataStream): event data stream.
Returns:
str: formatted notes field.
"""
inode = self._FormatInode(output_mediator, event, event_data, event_data_stream)
notes = getattr(event_data, "notes", "")
if not notes:
display_name = self._FormatDisplayName(
output_mediator, event, event_data, event_data_stream
)
notes = f"File: {display_name:s}"
if inode != "-":
notes = f"{notes:s} inode: {inode:s}"
return notes
def _FormatTimestamp(self, output_mediator, event, event_data, event_data_stream):
"""Formats a timestamp.
Args:
output_mediator (OutputMediator): mediates interactions between output
modules and other components, such as storage and dfVFS.
event (EventObject): event.
event_data (EventData): event data.
event_data_stream (EventDataStream): event data stream.
Returns:
str: POSIX timestamp in seconds or 0 on error.
"""
if not event.date_time:
posix_timestamp, _ = divmod(event.timestamp, 1000000)
else:
posix_timestamp = event.date_time.CopyToPosixTimestamp()
if posix_timestamp is None:
posix_timestamp = 0
return f"{posix_timestamp:d}"
# pylint: enable=unused-argument
[docs]
class TLNOutputModule(shared_dsv.DSVOutputModule):
"""Output module for the TLN format.
TLN defines 5 | separated fields, namely:
* Time - 32-bit POSIX (or Unix) epoch timestamp.
* Source - The name of the parser or plugin that produced the event.
* Host - The source host system.
* User - The user associated with the data.
* Description - Message string describing the data.
"""
NAME = "tln"
DESCRIPTION = "TLN 5 field | delimited output."
_FIELD_NAMES = ["time", "source", "host", "user", "description"]
_HEADER = "Time|Source|Host|User|Description"
[docs]
def __init__(self):
"""Initializes an output module."""
field_formatting_helper = TLNFieldFormattingHelper()
super().__init__(
field_formatting_helper,
self._FIELD_NAMES,
delimiter="|",
header=self._HEADER,
)
[docs]
class L2TTLNOutputModule(shared_dsv.DSVOutputModule):
"""Output module for the log2timeline extended variant of the TLN format.
l2tTLN is an extended variant of TLN introduced log2timeline.pl 0.65.
l2tTLN extends basic TLN to 7 | separated fields, namely:
* Time - 32-bit POSIX (or Unix) epoch timestamp.
* Source - The name of the parser or plugin that produced the event.
* Host - The source host system.
* User - The user associated with the data.
* Description - Message string describing the data.
* TZ - L2T 0.65 field. Timezone of the event.
* Notes - L2T 0.65 field. Optional notes field or filename and inode.
"""
NAME = "l2ttln"
DESCRIPTION = "Extended TLN 7 field | delimited output."
_FIELD_NAMES = ["time", "source", "host", "user", "description", "tz", "notes"]
_HEADER = "Time|Source|Host|User|Description|TZ|Notes"
[docs]
def __init__(self):
"""Initializes an output module."""
field_formatting_helper = TLNFieldFormattingHelper()
super().__init__(
field_formatting_helper,
self._FIELD_NAMES,
delimiter="|",
header=self._HEADER,
)
manager.OutputManager.RegisterOutputs([L2TTLNOutputModule, TLNOutputModule])