Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
F
fact_pdf_report
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
fact-depend
fact_pdf_report
Commits
336a80f1
Commit
336a80f1
authored
Jun 26, 2020
by
lwilms
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
delete old template
parent
72ca17d4
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
9 additions
and
357 deletions
+9
-357
docker_entry.py
docker_entry.py
+2
-8
generator.py
pdf_generator/generator.py
+2
-12
binwalk.tex
pdf_generator/templates/old_template/binwalk.tex
+0
-25
exploit_mitigations.tex
pdf_generator/templates/old_template/exploit_mitigations.tex
+0
-43
file_hashes.tex
pdf_generator/templates/old_template/file_hashes.tex
+0
-23
file_type.tex
pdf_generator/templates/old_template/file_type.tex
+0
-21
generic.tex
pdf_generator/templates/old_template/generic.tex
+0
-21
ip_and_uri_finder.tex
pdf_generator/templates/old_template/ip_and_uri_finder.tex
+0
-34
main.tex
pdf_generator/templates/old_template/main.tex
+0
-44
malware_scanner.tex
pdf_generator/templates/old_template/malware_scanner.tex
+0
-42
meta.tex
pdf_generator/templates/old_template/meta.tex
+0
-24
printable_strings.tex
pdf_generator/templates/old_template/printable_strings.tex
+0
-10
string_evaluator.tex
pdf_generator/templates/old_template/string_evaluator.tex
+0
-10
unpacker.tex
pdf_generator/templates/old_template/unpacker.tex
+0
-23
template_engine.py
pdf_generator/tex_generation/template_engine.py
+5
-17
No files found.
docker_entry.py
View file @
336a80f1
...
...
@@ -21,7 +21,7 @@ import json
import
shutil
from
pathlib
import
Path
from
tempfile
import
TemporaryDirectory
from
sys
import
exit
as
sys_exit
from
pdf_generator.generator
import
compile_pdf
,
create_templates
...
...
@@ -36,8 +36,6 @@ def move_pdf_report(pdf_path):
def
main
(
template_style
=
'default'
):
analysis
,
meta_data
=
get_data
()
# if 'exploit_mitigations' in analysis:
# analysis['exploit_mitigations']['count'] = count_mitigations(analysis['exploit_mitigations']['summary'])
with
TemporaryDirectory
()
as
tmp_dir
:
create_templates
(
analysis
,
meta_data
,
tmp_dir
,
template_style
)
...
...
@@ -48,7 +46,4 @@ def main(template_style='default'):
if
__name__
==
'__main__'
:
exit
(
main
())
# TODO
# order of sections
\ No newline at end of file
sys_exit
(
main
())
pdf_generator/generator.py
View file @
336a80f1
...
...
@@ -4,7 +4,7 @@ from pathlib import Path
from
common_helper_process
import
execute_shell_command
from
pdf_generator.tex_generation.template_engine
import
(
LOGO_FILE
,
MAIN_TEMPLATE
,
META_TEMPLATE
,
PLUGIN_TEMPLATE_BLUEPRINT
,
CUSTOM_TEMPLATE_CLASS
,
TemplateEngine
LOGO_FILE
,
MAIN_TEMPLATE
,
META_TEMPLATE
,
CUSTOM_TEMPLATE_CLASS
,
TemplateEngine
)
PDF_NAME
=
Path
(
MAIN_TEMPLATE
)
.
with_suffix
(
'.pdf'
)
.
name
...
...
@@ -23,13 +23,6 @@ def copy_fact_image(target):
shutil
.
copy
(
str
(
Path
(
__file__
)
.
parent
/
'templates'
/
LOGO_FILE
),
str
(
Path
(
target
)
/
LOGO_FILE
))
def
render_analysis_templates
(
engine
,
analysis
):
return
[
(
PLUGIN_TEMPLATE_BLUEPRINT
.
format
(
analysis_plugin
),
engine
.
render_analysis_template
(
analysis_plugin
,
analysis
[
analysis_plugin
]))
for
analysis_plugin
in
analysis
]
def
create_report_filename
(
meta_data
):
unsafe_name
=
'{}_analysis_report.pdf'
.
format
(
meta_data
[
'device_name'
])
safer_name
=
unsafe_name
.
replace
(
' '
,
'_'
)
.
replace
(
'/'
,
'__'
)
...
...
@@ -46,11 +39,8 @@ def compile_pdf(meta_data, tmp_dir):
def
create_templates
(
analysis
,
meta_data
,
tmp_dir
,
template_style
=
'default'
):
engine
=
TemplateEngine
(
template_folder
=
template_style
,
tmp_dir
=
tmp_dir
)
Path
(
tmp_dir
,
MAIN_TEMPLATE
)
.
write_text
(
engine
.
render_main_template
(
analysis
=
analysis
,
meta_data
=
meta_data
))
Path
(
tmp_dir
,
MAIN_TEMPLATE
)
.
write_text
(
engine
.
render_main_template
(
analysis
=
analysis
))
Path
(
tmp_dir
,
META_TEMPLATE
)
.
write_text
(
engine
.
render_meta_template
(
meta_data
))
if
template_style
==
'default'
:
Path
(
tmp_dir
,
CUSTOM_TEMPLATE_CLASS
)
.
write_text
(
engine
.
render_template_class
())
else
:
for
filename
,
rendered_template
in
render_analysis_templates
(
engine
=
engine
,
analysis
=
analysis
):
Path
(
tmp_dir
,
filename
)
.
write_text
(
rendered_template
)
pdf_generator/templates/old_template/binwalk.tex
deleted
100644 → 0
View file @
72ca17d4
\subsection*
{
Binwalk (v.
\VAR
{
selected
_
analysis['plugin
_
version']
}
)
}
{
\fontfamily
{
lmss
}
\selectfont
\begin{longtable}
{
|p
{
3cm
}
|p
{
11.5cm
}
|
}
\hline
\multicolumn
{
2
}{
|p
{
14.5cm
}
|
}{
Signature Analysis:
}
\\
\multicolumn
{
2
}{
|p
{
14.5cm
}
|
}{}
\\
\multicolumn
{
2
}{
|p
{
14.5cm
}
|
}{
\VAR
{
selected
_
analysis['signature
_
analysis'] | filter
_
chars
}}
\\
\hline
Entropy Graph
&
\includegraphics
[scale = 0.7]
{
\VAR
{
selected
_
analysis['entropy
_
analysis
_
graph'] | base64
_
to
_
png('entropy
_
analysis
_
graph', tmp
_
dir)
}}
\\
\hline
\BLOCK
{
if selected
_
analysis['summary']
}
\multicolumn
{
2
}{
|p
{
14.5cm
}
|
}{
Summary:
}
\\
\multicolumn
{
2
}{
|p
{
14.5cm
}
|
}{}
\\
\BLOCK
{
for data in selected
_
analysis['summary']
}
\multicolumn
{
2
}{
|p
{
14.5cm
}
|
}{
\VAR
{
data | filter
_
chars
}}
\\
\BLOCK
{
endfor
}
\hline
\BLOCK
{
endif
}
\end{longtable}
}
\ No newline at end of file
pdf_generator/templates/old_template/exploit_mitigations.tex
deleted
100644 → 0
View file @
72ca17d4
\subsection*
{
Exploit Mitigation (v.
\VAR
{
selected
_
analysis['plugin
_
version']
}
)
}
{
\fontfamily
{
lmss
}
\selectfont
\begin{longtable}
{
|p
{
3cm
}
|p
{
11.5cm
}
|
}
\hline
\BLOCK
{
if selected
_
analysis['summary']
}
NX
&
\BLOCK
{
for selected
_
summary in selected
_
analysis['summary']
}
\BLOCK
{
if selected
_
summary | contains('NX')
}
\VAR
{
selected
_
summary | filter
_
chars
}
(
\VAR
{
selected
_
analysis['summary'][selected
_
summary] | elements
_
count
}
)
\BLOCK
{
endif
}
\BLOCK
{
endfor
}
\\
\hline
Canary
&
\BLOCK
{
for selected
_
summary in selected
_
analysis['summary']
}
\BLOCK
{
if selected
_
summary | contains('Canary')
}
\VAR
{
selected
_
summary | filter
_
chars
}
(
\VAR
{
selected
_
analysis['summary'][selected
_
summary] | elements
_
count
}
)
\BLOCK
{
endif
}
\BLOCK
{
endfor
}
\\
\hline
PIE
&
\BLOCK
{
for selected
_
summary in selected
_
analysis['summary']
}
\BLOCK
{
if selected
_
summary | contains('PIE')
}
\VAR
{
selected
_
summary | filter
_
chars
}
(
\VAR
{
selected
_
analysis['summary'][selected
_
summary] | elements
_
count
}
)
\BLOCK
{
endif
}
\BLOCK
{
endfor
}
\\
\hline
RELRO
&
\BLOCK
{
for selected
_
summary in selected
_
analysis['summary']
}
\BLOCK
{
if selected
_
summary | contains('RELRO')
}
\VAR
{
selected
_
summary | filter
_
chars
}
(
\VAR
{
selected
_
analysis['summary'][selected
_
summary] | elements
_
count
}
)
\BLOCK
{
endif
}
\BLOCK
{
endfor
}
\\
\hline
\BLOCK
{
endif
}
\end{longtable}
}
\ No newline at end of file
pdf_generator/templates/old_template/file_hashes.tex
deleted
100644 → 0
View file @
72ca17d4
\subsection*
{
Hashes (v.
\VAR
{
selected
_
analysis['plugin
_
version']
}
)
}
{
\fontfamily
{
lmss
}
\selectfont
\begin{tabular}
{
|p
{
3cm
}
|p
{
11.5cm
}
|
}
\hline
md5
&
\VAR
{
selected
_
analysis['md5']
}
\\
\hline
ripemd160
&
\VAR
{
selected
_
analysis['ripemd160']
}
\\
\hline
sha1
&
\VAR
{
selected
_
analysis['sha1']
}
\\
\hline
sha256
&
\VAR
{
selected
_
analysis['sha256']
}
\\
\hline
sha512
&
\VAR
{
selected
_
analysis['sha512'] | split
_
hash
}
\\
\hline
\end{tabular}
}
\ No newline at end of file
pdf_generator/templates/old_template/file_type.tex
deleted
100644 → 0
View file @
72ca17d4
\subsection*
{
File Type (v.
\VAR
{
selected
_
analysis['plugin
_
version']
}
)
}
{
\fontfamily
{
lmss
}
\selectfont
\begin{longtable}
{
|p
{
3cm
}
|p
{
11.5cm
}
|
}
\hline
File Type
&
\VAR
{
selected
_
analysis['full'] | filter
_
chars
}
\\
\hline
MIME
&
\VAR
{
selected
_
analysis['mime'] | filter
_
chars
}
\\
\hline
\BLOCK
{
if selected
_
analysis['summary']
}
Containing Files
\BLOCK
{
for selected
_
summary in selected
_
analysis['summary']
}
&
\VAR
{
selected
_
summary | filter
_
chars
}
(
\VAR
{
selected
_
analysis['summary'][selected
_
summary] | elements
_
count
}
)
\\
\BLOCK
{
endfor
}
\hline
\BLOCK
{
endif
}
\end{longtable}
}
\ No newline at end of file
pdf_generator/templates/old_template/generic.tex
deleted
100644 → 0
View file @
72ca17d4
\subsection*
{
\VAR
{
plugin
_
name | plugin
_
name | filter
_
chars
}
(v.
\VAR
{
selected
_
analysis['plugin
_
version'] | filter
_
chars
}
)
}
{
\fontfamily
{
lmss
}
\selectfont
\begin{longtable}
{
|p
{
3cm
}
|p
{
11.5cm
}
|
}
\hline
Time of Analysis
&
\VAR
{
selected
_
analysis['analysis
_
date'] | nice
_
unix
_
time
}
\\
\hline
Plugin Version
&
\VAR
{
selected
_
analysis['plugin
_
version']
}
\\
\hline
\BLOCK
{
if selected
_
analysis['summary']
}
Summary
\BLOCK
{
for selected
_
summary in selected
_
analysis['summary']
}
&
\VAR
{
selected
_
summary | filter
_
chars
}
\\
\BLOCK
{
endfor
}
\hline
\BLOCK
{
endif
}
\end{longtable}
}
\ No newline at end of file
pdf_generator/templates/old_template/ip_and_uri_finder.tex
deleted
100644 → 0
View file @
72ca17d4
\subsection*
{
IPs and URIs (v.
\VAR
{
selected
_
analysis['plugin
_
version']
}
)
}
{
\fontfamily
{
lmss
}
\selectfont
\begin{longtable}
{
|p
{
3cm
}
|p
{
11.5cm
}
|
}
\hline
IPs v4
\BLOCK
{
for ip in selected
_
analysis['ips
_
v4'] | check
_
list | filter
_
list
}
&
\VAR
{
ip
}
\\
\BLOCK
{
endfor
}
\hline
IPs v6
\BLOCK
{
for ip in selected
_
analysis['ips
_
v6'] | check
_
list | filter
_
list
}
&
\VAR
{
ip
}
\\
\BLOCK
{
endfor
}
\hline
URIs
\BLOCK
{
for uri in selected
_
analysis['uris'] | check
_
list | filter
_
list
}
&
\VAR
{
uri
}
\\
\BLOCK
{
endfor
}
\hline
\BLOCK
{
if selected
_
analysis['summary']
}
\multicolumn
{
2
}{
|p
{
14.5cm
}
|
}{
Summary:
}
\\
\multicolumn
{
2
}{
|p
{
14.5cm
}
|
}{}
\\
\BLOCK
{
for data in selected
_
analysis['summary']
}
\multicolumn
{
2
}{
|p
{
14.5cm
}
|
}{
\VAR
{
data | filter
_
chars
}}
\\
\BLOCK
{
endfor
}
\hline
\BLOCK
{
endif
}
\end{longtable}
}
\ No newline at end of file
pdf_generator/templates/old_template/main.tex
deleted
100644 → 0
View file @
72ca17d4
\documentclass
{
article
}
\usepackage
[english]
{
babel
}
\usepackage
[utf8]
{
inputenc
}
\usepackage
{
amsmath
}
\usepackage
{
graphicx
}
\usepackage
{
lmodern
}
\usepackage
[a4paper, total={6in, 8in}]
{
geometry
}
\usepackage
{
longtable
}
\usepackage
{
sectsty
}
\allsectionsfont
{
\sffamily
}
\begin{document}
\begin{titlepage}
\newcommand
{
\HRule
}{
\rule
{
\linewidth
}{
0.5mm
}}
\center
\includegraphics
[width = 13cm]
{
fact
_
logo.png
}
\\
[3cm]
\HRule
\\
[0.4cm]
{
\fontfamily
{
lmss
}
\selectfont
{
\Large
\bfseries
Firmware Analysis of
\VAR
{
meta
_
data['hid'] | filter
_
chars
}}
\\
[0.4cm]
}
\HRule
\\
[1.5cm]
\vspace
{
3.0cm
}
{
\fontfamily
{
lmss
}
\selectfont
\input
{
meta.tex
}
}
\vfill
\end{titlepage}
\BLOCK
{
for current
_
analysis in analysis
}
\input
{
\VAR
{
current
_
analysis
}
.tex
}
\newpage
\BLOCK
{
endfor
}
\end{document}
pdf_generator/templates/old_template/malware_scanner.tex
deleted
100644 → 0
View file @
72ca17d4
\subsection*
{
Malware (v.
\VAR
{
selected
_
analysis['plugin
_
version']
}
)
}
{
\fontfamily
{
lmss
}
\selectfont
\begin{longtable}
{
|p
{
3cm
}
|p
{
11.5cm
}
|
}
\hline
MD5
&
\VAR
{
selected
_
analysis['md5']
}
\\
\hline
System Version
&
\VAR
{
selected
_
analysis['system
_
version']
}
\\
\hline
Scanners Number
&
\VAR
{
selected
_
analysis['number
_
of
_
scanners']
}
\\
\hline
Positives
&
\VAR
{
selected
_
analysis['positives']
}
\\
\hline
Scanners
\BLOCK
{
for scanner in selected
_
analysis['scanners']
}
&
\VAR
{
scanner
}
\\
\BLOCK
{
endfor
}
\hline
Scanns
\BLOCK
{
for scan in selected
_
analysis['scans']
}
\BLOCK
{
for value in selected
_
analysis['scans'][scan]
}
&
\VAR
{
scan
}
::
\VAR
{
value
}
:
\VAR
{
selected
_
analysis['scans'][scan][value]
}
\\
\BLOCK
{
endfor
}
\BLOCK
{
endfor
}
\hline
\BLOCK
{
if selected
_
analysis['summary']
}
Summary
\BLOCK
{
for selected
_
summary in selected
_
analysis['summary']
}
&
\VAR
{
selected
_
summary | filter
_
chars
}
\\
\BLOCK
{
endfor
}
\hline
\BLOCK
{
endif
}
\end{longtable}
}
\ No newline at end of file
pdf_generator/templates/old_template/meta.tex
deleted
100644 → 0
View file @
72ca17d4
\begin{tabular}
{
|p
{
3cm
}
|p
{
11.5cm
}
|
}
\hline
HID
&
\VAR
{
meta
_
data['hid'] | filter
_
chars
}
\\
\hline
Device Name
&
\VAR
{
meta
_
data['device
_
name'] | filter
_
chars
}
\\
\hline
Vendor
&
\VAR
{
meta
_
data['vendor'] | filter
_
chars
}
\\
\hline
Device Class
&
\VAR
{
meta
_
data['device
_
class'] | filter
_
chars
}
\\
\hline
Version
&
\VAR
{
meta
_
data['version'] | filter
_
chars
}
\\
\hline
Release Date
&
\VAR
{
meta
_
data['release
_
date']
}
\\
\hline
Size
&
\VAR
{
meta
_
data['size'] | number
_
format
}
\\
\hline
\end{tabular}
\ No newline at end of file
pdf_generator/templates/old_template/printable_strings.tex
deleted
100644 → 0
View file @
72ca17d4
\subsection*
{
String Stats (v.
\VAR
{
selected
_
analysis['plugin
_
version']
}
)
}
{
\fontfamily
{
lmss
}
\selectfont
\begin{tabular}
{
|p
{
3cm
}
|p
{
11.5cm
}
|
}
\hline
String Count
&
\VAR
{
selected
_
analysis['strings'] | elements
_
count
}
\\
\hline
\end{tabular}
}
\ No newline at end of file
pdf_generator/templates/old_template/string_evaluator.tex
deleted
100644 → 0
View file @
72ca17d4
\subsection*
{
String Eval Stats (v.
\VAR
{
selected
_
analysis['plugin
_
version']
}
)
}
{
\fontfamily
{
lmss
}
\selectfont
\begin{tabular}
{
|p
{
3cm
}
|p
{
11.5cm
}
|
}
\hline
String Count
&
\VAR
{
selected
_
analysis['string
_
eval'] | elements
_
count
}
\\
\hline
\end{tabular}
}
\ No newline at end of file
pdf_generator/templates/old_template/unpacker.tex
deleted
100644 → 0
View file @
72ca17d4
\subsection*
{
Unpacker (v.
\VAR
{
selected
_
analysis['plugin
_
version']
}
)
}
{
\fontfamily
{
lmss
}
\selectfont
\begin{longtable}
{
|p
{
3cm
}
|p
{
11.5cm
}
|
}
\hline
Plugin
&
\VAR
{
selected
_
analysis['plugin
_
used'] | filter
_
chars
}
\\
\hline
Extracted
&
\VAR
{
selected
_
analysis['number
_
of
_
unpacked
_
files']
}
\\
\hline
\BLOCK
{
if selected
_
analysis['output']
}
\multicolumn
{
2
}{
|p
{
14.5cm
}
|
}{
Output:
}
\\
\multicolumn
{
2
}{
|p
{
14.5cm
}
|
}{}
\\
\multicolumn
{
2
}{
|p
{
14.5cm
}
|
}{
\VAR
{
selected
_
analysis['output'] | split
_
output
_
lines | filter
_
chars
}}
\\
\hline
\BLOCK
{
endif
}
Entropy
&
\VAR
{
selected
_
analysis['entropy'] | nice
_
number
}
\\
\hline
\end{longtable}
}
\ No newline at end of file
pdf_generator/tex_generation/template_engine.py
View file @
336a80f1
import
logging
from
base64
import
decodebytes
from
collections
import
OrderedDict
from
contextlib
import
suppress
...
...
@@ -10,11 +9,9 @@ import socket
import
jinja2
from
common_helper_files
import
human_readable_file_size
GENERIC_TEMPLATE
=
'generic.tex'
MAIN_TEMPLATE
=
'main.tex'
META_TEMPLATE
=
'meta.tex'
CUSTOM_TEMPLATE_CLASS
=
'twentysecondcv.cls'
PLUGIN_TEMPLATE_BLUEPRINT
=
'{}.tex'
LOGO_FILE
=
'fact.png'
...
...
@@ -47,7 +44,7 @@ def replace_special_characters(data):
latex_character_escapes
=
OrderedDict
()
latex_character_escapes
[
'
\\
'
]
=
''
latex_character_escapes
[
'
\'
'
]
=
''
latex_character_escapes
[
'/'
]
=
'/'
latex_character_escapes
[
'/'
]
=
'/'
# no need to replace?
latex_character_escapes
[
'$'
]
=
'
\\
$'
latex_character_escapes
[
'('
]
=
'$($'
latex_character_escapes
[
')'
]
=
'$)$'
...
...
@@ -141,7 +138,7 @@ def get_five_longest_entries(summary, top=5):
def
exploit_mitigation
(
summary
):
summary
=
summary
[
'exploit_mitigations'
][
'summary'
]
max_count
=
count_mitigations
(
summary
)
# skillsbar is maxed
out
at 6
max_count
=
count_mitigations
(
summary
)
# skillsbar is maxed at 6
pie_num
,
canary_num
,
relro_num
,
nx_num
,
fortify_num
=
0
,
0
,
0
,
0
,
0
for
selected_summary
in
summary
:
if
'PIE'
in
selected_summary
and
'present'
in
selected_summary
:
...
...
@@ -183,7 +180,6 @@ def count_this_mitigation(summary, mitigation):
def
software_components
(
software_string
):
# analysis['software_components']['summary']
software
=
software_string
ver_number
=
''
if
' '
in
software_string
:
...
...
@@ -216,7 +212,7 @@ def get_desired_triple(seleced_summary, which_desired):
while
len
(
chosen_one
)
>
50
:
chosen_one
=
choice
(
desired_list
)
return
'{2}{1}{0}{3}{4}$
\
>$ (incl. {5})'
.
format
(
'{'
,
'}'
,
len
(
desired_list
),
which_desired
,
'
\
quad'
,
replace_special_characters
(
chosen_one
))
replace_special_characters
(
chosen_one
))
def
ip_or_uri
(
summary
,
which_select
):
...
...
@@ -273,22 +269,14 @@ class TemplateEngine:
self
.
_environment
=
create_jinja_environment
(
template_folder
if
template_folder
else
'default'
)
self
.
_tmp_dir
=
tmp_dir
def
render_main_template
(
self
,
analysis
,
meta_data
):
def
render_main_template
(
self
,
analysis
):
template
=
self
.
_environment
.
get_template
(
MAIN_TEMPLATE
)
return
template
.
render
(
analysis
=
analysis
,
meta_data
=
meta_data
,
tmp_dir
=
self
.
_tmp_dir
)
return
template
.
render
(
analysis
=
analysis
,
tmp_dir
=
self
.
_tmp_dir
)
def
render_meta_template
(
self
,
meta_data
):
template
=
self
.
_environment
.
get_template
(
META_TEMPLATE
)
return
template
.
render
(
meta_data
=
meta_data
)
def
render_analysis_template
(
self
,
plugin
,
analysis
):
try
:
template
=
self
.
_environment
.
get_template
(
PLUGIN_TEMPLATE_BLUEPRINT
.
format
(
plugin
))
except
jinja2
.
TemplateNotFound
:
logging
.
warning
(
'Falling back on generic template for {}'
.
format
(
plugin
))
template
=
self
.
_environment
.
get_template
(
GENERIC_TEMPLATE
)
return
template
.
render
(
plugin_name
=
plugin
,
selected_analysis
=
analysis
,
tmp_dir
=
self
.
_tmp_dir
)
def
render_template_class
(
self
):
template
=
self
.
_environment
.
get_template
(
CUSTOM_TEMPLATE_CLASS
)
return
template
.
render
(
tmp_dir
=
self
.
_tmp_dir
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment