mirror of
https://github.com/volatilityfoundation/volatility
synced 2026-06-08 18:04:46 +00:00
38 lines
1.6 KiB
Python
38 lines
1.6 KiB
Python
from volatility import debug
|
|
from volatility.renderers.basic import Renderer
|
|
|
|
__author__ = 'mike'
|
|
|
|
class DotRenderer(Renderer):
|
|
def __init__(self, renderers_func, config):
|
|
self._config = config
|
|
self._columns = None
|
|
self._text_cell_renderers_func = renderers_func
|
|
self._text_cell_renderers = None
|
|
|
|
def description(self, node):
|
|
output = []
|
|
for column in self._columns:
|
|
text = self._text_cell_renderers[column.index].render(node.values[column.index])
|
|
output.append((column.name + ": " + text).replace("|", "_").replace("\"", "_"))
|
|
return "|".join(output)
|
|
|
|
def _add_node(self, node, data):
|
|
outfd, accumulator = data
|
|
accumulator[node] = max(accumulator.values()) + 1
|
|
outfd.write(" Node" + str(accumulator[node]) + " [label=\"{" + self.description(node) + "}\"];\n")
|
|
if accumulator[node.parent] != 0:
|
|
outfd.write(" Node" + str(accumulator[node.parent]) + " -> Node" + str(accumulator[node]) + ";\n")
|
|
return (outfd, accumulator)
|
|
|
|
def render(self, outfd, grid):
|
|
"""Renders the TreeGrid in data out to the output file from the config options"""
|
|
self._columns = grid.columns
|
|
self._text_cell_renderers = self._text_cell_renderers_func(self._columns)
|
|
|
|
if grid.max_depth() <= 1:
|
|
debug.warning("Dot output will be unhelpful since the TreeGrid is a flat list")
|
|
outfd.write("digraph output {\n node[shape = Mrecord];\n # rankdir=LR;\n")
|
|
grid.visit(None, self._add_node, (outfd, {None: 0}))
|
|
outfd.write("}\n")
|