Nettacker/lib/graph/d3_tree_v1/engine.py

95 lines
2.7 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import json
import os
from core.alert import messages
def start(events):
"""
generate the d3_tree_v1_graph with events
Args:
events: all events
Returns:
a graph in HTML
"""
# define a normalised_json
normalisedjson = {
"name": "Started attack",
"children": {}
}
# get data for normalised_json
for event in events:
if event['target'] not in normalisedjson['children']:
normalisedjson['children'].update(
{
event['target']: {}
}
)
normalisedjson['children'][event['target']].update(
{
event['module_name']: []
}
)
if event['module_name'] not in normalisedjson['children'][event['target']]:
normalisedjson['children'][event['target']].update(
{
event['module_name']: []
}
)
normalisedjson['children'][event['target']][event['module_name']].append(
f"target: {event['target']}, module_name: {event['module_name']}, port: "
f"{event['port']}, event: {event['event']}"
)
# define a d3_structure_json
d3_structure = {
"name": "Starting attack",
"children": []
}
# get data for normalised_json
for target in list(normalisedjson['children'].keys()):
for module_name in list(normalisedjson['children'][target].keys()):
for description in normalisedjson["children"][target][module_name]:
children_array = [
{
"name": module_name,
"children": [
{
"name": description
}
]
}
]
d3_structure["children"].append(
{
"name": target,
"children": children_array
}
)
from config import nettacker_paths
data = open(
os.path.join(
nettacker_paths()['web_static_files_path'],
'report/d3_tree_v1.html'
)
).read().replace(
'__data_will_locate_here__',
json.dumps(d3_structure)
).replace(
'__title_to_replace__',
messages("pentest_graphs")
).replace(
'__description_to_replace__',
messages("graph_message")
).replace(
'__html_title_to_replace__',
messages("nettacker_report")
)
return data