1
1
import csv
2
+ import json
2
3
import os
3
4
4
5
from datetime import datetime
@@ -20,37 +21,56 @@ def generate_filename(self, extention=None):
20
21
self .filename = f"output.cve-bin-tool.{ now } .{ extention } "
21
22
22
23
def output_cves (self , outfile , output = None ):
23
-
24
24
""" Output a list of CVEs
25
- format is modules[checker_name][version] = dict{id: severity}
25
+ format self.modules[checker_name][version] = dict{id: severity}
26
+ to other formats like CSV or JSON
27
+ """
28
+ if output == "json" :
29
+ self .output_json (outfile )
30
+ else : # csv, console, or anything else that is unrecognised
31
+ self .output_csv (outfile )
32
+
33
+ def formatted_modules (self ):
34
+ """ Returns self.modules converted into form
35
+ formatted_output[modulesname][version] = {
36
+ "cve": cve_number,
37
+ "severity": cve_severity,
38
+ }
26
39
"""
27
- # if the output is csv we must open a file
28
- if output == "csv" :
29
- outfile = open (f"{ outfile } " , "w" )
40
+ formatted_output = {}
41
+ for modulename in self .modules :
42
+ formatted_output [modulename ] = {}
43
+ for version , cves in self .modules [modulename ].items ():
44
+ formatted_output [modulename ][version ] = []
45
+ for cve_number , cve_severity in cves .items ():
46
+ formatted_output [modulename ][version ].append (
47
+ {"cve" : cve_number , "severity" : cve_severity ,}
48
+ )
49
+ return formatted_output
30
50
31
- writer = csv .writer (outfile )
32
- writer .writerow (["Module Name" , "Version" , "CVE Number" , "Severity" ])
51
+ def output_json (self , outfile ):
52
+ """ Output a JSON of CVEs """
53
+ json .dump (self .formatted_modules (), outfile )
33
54
55
+ def output_csv (self , outfile ):
56
+ """ Output a CSV of CVEs """
34
57
writer = csv .writer (outfile )
58
+ writer .writerow (["Module Name" , "Version" , "CVE Number" , "Severity" ])
35
59
for modulename , versions in self .modules .items ():
36
60
for version , cve_list in versions .items ():
37
61
for cve_number , cve_severity in cve_list .items ():
38
62
row = [modulename , version , cve_number , cve_severity ]
39
63
writer .writerow (row )
40
64
41
- # We must also close the file
42
- if output == "csv" :
43
- outfile .close ()
44
-
45
- def output_csv (self ):
65
+ def output_file (self , output = "csv" ):
46
66
47
- """ Generate a CSV file for list of CVE """
67
+ """ Generate a file for list of CVE """
48
68
49
69
# Check if we need to generate a filename
50
70
if self .filename == None :
51
- self .generate_filename ("csv" )
71
+ self .generate_filename (output )
52
72
else :
53
- self .filename = f"{ self .filename } .csv "
73
+ self .filename = f"{ self .filename } .{ output } "
54
74
# check if the filename already exists
55
75
file_list = os .listdir (os .getcwd ())
56
76
if self .filename in file_list :
@@ -60,7 +80,7 @@ def output_csv(self):
60
80
self .logger .info (
61
81
"Generating a new filename with Default Naming Convention"
62
82
)
63
- self .generate_filename ("csv" )
83
+ self .generate_filename (output )
64
84
65
85
# try opening that file
66
86
try :
@@ -70,10 +90,11 @@ def output_csv(self):
70
90
except Exception as E :
71
91
self .logger .warning (E )
72
92
self .logger .info ("Switching Back to Default Naming Convention" )
73
- self .generate_filename ("csv" )
93
+ self .generate_filename (output )
74
94
75
95
# Log the filename generated
76
- self .logger .info (f"CSV output stored at { os .getcwd ()} /{ self .filename } " )
96
+ self .logger .info (f"Output stored at { os .getcwd ()} /{ self .filename } " )
77
97
78
98
# call to output_cves
79
- self .output_cves (self .filename , "csv" )
99
+ with open (self .filename , "w" ) as f :
100
+ self .output_cves (f , output )
0 commit comments