Skip to content

Commit ed23ad3

Browse files
committed
UPDATED: Multithread-based
1 parent ee873ae commit ed23ad3

File tree

1 file changed

+114
-84
lines changed

1 file changed

+114
-84
lines changed

nvdnist.py

+114-84
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
import os
1010
import signal
1111
import time
12-
import copy
12+
import threading
13+
1314
from multiprocessing import Process
1415
from database import TableColumn
1516
from threading import Thread
@@ -29,6 +30,7 @@ def __init__(self, process):
2930
self._process = None
3031
self.kill = False
3132
self.process = process
33+
self._lock = threading.Lock()
3234

3335
def _pobject(self):
3436
self._entry = len(self._wpList)
@@ -61,20 +63,21 @@ def _pobject(self):
6163
if len(self._wpList) == 0:
6264
self.kill = True
6365

64-
def _processFunction(self):
66+
def _processFunction(self, delay=6.0):
6567
while True:
6668
sys.stdout.write("\rCurrent progress: %d / %d" % (self._entry - len(self._wpList), self._entry))
6769
sys.stdout.flush()
6870
if self.kill:
71+
self._lock.release()
6972
break
70-
time.sleep(5)
73+
time.sleep(delay)
7174

7275
def start(self):
7376
self._coreThread = Thread(target=self._pobject)
7477
self._coreThread.start()
75-
7678
self._process = Thread(target=self._processFunction)
7779
self._process.start()
80+
self._lock.acquire()
7881

7982
def add_thread(self, thread):
8083
self._wpList.append(thread)
@@ -97,39 +100,21 @@ def workstation(sql, tablename, jsonElement):
97100
cve_data_version = str(jsonElement['CVE_data_version'])
98101
reference = ""
99102
description = ""
100-
cpe = ""
101103
problemtype = ""
102104

103105
for r in base.find_key(jsonElement, r"reference_.+$"):
104-
reference += jsonElement[r] + " || "
105-
reference = reference[:-4]
106+
reference += jsonElement[r] + " | "
107+
reference = reference[:-3]
106108

107109
for d in base.find_key(jsonElement, r"desc_(.+)"):
108-
description += jsonElement[d] + " || "
109-
description = description[:-4]
110+
description += jsonElement[d] + " | "
111+
description = description[:-3]
110112

111113
for d in base.find_key(jsonElement, r"cwe_\d"):
112-
problemtype += jsonElement[d] + " || "
113-
problemtype = problemtype[:-4]
114-
115-
cpe_list = []
116-
117-
for c in base.find_key(jsonElement, r"cpe_\d_vulnderable"):
118-
cpe_list.append(str(jsonElement[c]) + "|")
119-
120-
121-
for index, c in enumerate(base.find_key(jsonElement, r"cpe_\d_cpe22uri")):
122-
cpe_list[index] += (str(jsonElement[c])) + "|"
123-
124-
125-
for index, c in enumerate(base.find_key(jsonElement, r"cpe_\d_cpe23uri")):
126-
cpe_list[index] += (str(jsonElement[c]))
127-
128-
for c in cpe_list:
129-
cpe += c + " || "
130-
cpe = cpe[:-4]
114+
problemtype += jsonElement[d] + " | "
115+
problemtype = problemtype[:-3]
131116

132-
# for version 2
117+
# for version 2
133118
baseMetricV2_version = str(jsonElement.get('baseMetricV2.version', ''))
134119
baseMetricV2_vectorString = str(jsonElement.get('baseMetricV2.vectorString', ''))
135120
baseMetricV2_accessVector = str(jsonElement.get('baseMetricV2.accessVector', ''))
@@ -167,43 +152,76 @@ def workstation(sql, tablename, jsonElement):
167152
publishedDate = str(jsonElement.get('publishedDate', ''))
168153
lastModifiedDate = str(jsonElement.get('lastModifiedDate', ''))
169154

170-
affect = ""
155+
cpe_list = []
156+
r = base.find_key(jsonElement, r"cpe_\d_vulnderable")
157+
if len(r) != 0:
158+
for index, c in enumerate(r):
159+
cpe_list.append(str(jsonElement[c]) + "||")
160+
161+
for index, c in enumerate(base.find_key(jsonElement, r"cpe_\d_cpe22uri")):
162+
cpe_list[index] += (str(jsonElement[c])) + "||"
163+
164+
165+
for index, c in enumerate(base.find_key(jsonElement, r"cpe_\d_cpe23uri")):
166+
cpe_list[index] += (str(jsonElement[c]))
167+
168+
# each of affect data.
171169
for index, c in enumerate(base.find_key(jsonElement, r"affect_\d")):
172-
affect += jsonElement[c] + " || "
173-
affect = affect[:-4]
174-
175-
a = None
176-
r = None
177-
d = None
178-
c = None
179-
query_argument = None
180-
query_format = None
181-
query_argument = None
182-
query_header = None
183-
variable_name = None
184-
185-
v = dict(vars())
186-
187-
query_header = "("
188-
query_format = "("
189-
query_argument = []
190-
191-
# automatic insert value
192-
for variable_name in v.keys():
193-
if isinstance(v[variable_name], str) and not variable_name == "tablename":
194-
query_header += variable_name + ','
195-
query_format += "%s,"
196-
query_argument.append(v[variable_name])
197-
query_header = query_header[:-1]
198-
query_header += ")"
199-
query_format = query_format[:-1]
200-
query_format += ")"
201-
sucessful = base.send_query("INSERT INTO {table_name} {header} VALUES {format}".format(table_name=tablename, header=query_header, format=query_format), tuple(query_argument), False, sql.execption_list)
170+
r = jsonElement[c].split('|')
171+
affect_vendor_name = r[0]
172+
affect_product_name = r[1]
173+
affect_version_value = r[2]
174+
175+
nodes_cpe_vulnerable = None
176+
nodes_cpe_cpe22uri = None
177+
nodes_cpe_cpe23uri = None
178+
179+
if len(cpe_list) != 0:
180+
for c in cpe_list:
181+
r = c.split('||')
182+
nodes_cpe_vulnerable = r[0]
183+
nodes_cpe_cpe22uri = r[1]
184+
nodes_cpe_cpe23uri = r[2]
185+
a = None
186+
r = None
187+
d = None
188+
c = None
189+
v = dict(vars())
190+
execute(base, sql, tablename, v)
191+
else:
192+
a = None
193+
r = None
194+
d = None
195+
c = None
196+
v = dict(vars())
197+
execute(base, sql, tablename, v)
202198
base.disconnect()
203199
except KeyboardInterrupt:
204-
sys.exit()
200+
sys.exit(0)
201+
205202
except SystemExit:
206-
sys.exit()
203+
sys.exit(0)
204+
205+
def execute(base, sql, tablename, v):
206+
query_header = "("
207+
query_format = "("
208+
query_argument = []
209+
210+
# automatic insert value
211+
for variable_name in v.keys():
212+
if isinstance(v[variable_name], str) and not variable_name == "tablename":
213+
query_header += variable_name + ','
214+
query_format += "%s,"
215+
query_argument.append(v[variable_name])
216+
217+
query_header = query_header[:-1]
218+
query_header += ")"
219+
220+
query_format = query_format[:-1]
221+
query_format += ")"
222+
223+
base.send_query("INSERT INTO {table_name} {header} VALUES {format}".format(table_name=tablename, header=query_header, format=query_format), tuple(query_argument), False, sql.execption_list)
224+
207225

208226
class Nvdnist(CVEDatabase):
209227
def __init__(self, mysql_base):
@@ -331,20 +349,30 @@ def load(self, obj):
331349
return raw_file, collection
332350

333351
def default_table_column(self):
352+
# There's no meaning about variable name.
353+
# Because it reads automantually only value.
334354
a2 = TableColumn("year", "VARCHAR(5)")
335-
336355
a3 = TableColumn("ID", "VARCHAR(24)")
337356
a4 = TableColumn('ASSIGNER', "VARCHAR(15)")
338357
a5 = TableColumn("data_type", 'VARCHAR(5)')
339358
a6 = TableColumn("data_format", "VARCHAR(10)")
340359
a7 = TableColumn("data_version", "VARCHAR(5)")
341-
a8 = TableColumn("affect", "TEXT")
342-
aa8 = TableColumn("problemtype", "VARCHAR(25)")
360+
361+
a8 = TableColumn("affect_vendor_name", "TEXT")
362+
aa8 = TableColumn("affect_product_name", "TEXT")
363+
ab8 = TableColumn("affect_version_value", "TEXT")
364+
365+
ac8 = TableColumn("problemtype", "VARCHAR(25)")
343366
a9 = TableColumn("description", "TEXT")
344367
a10 = TableColumn("reference", "TEXT")
345368
a11 = TableColumn("cve_data_version", "VARCHAR(5)")
346-
a12 = TableColumn("cpe", "TEXT")
347-
369+
370+
cpe1 = TableColumn("nodes_operator", "VARCHAR(5)")
371+
cpe2 = TableColumn("nodes_cpe", "TEXT")
372+
cpe3 = TableColumn("nodes_cpe_vulnerable", "VARCHAR(5)")
373+
cpe4 = TableColumn("nodes_cpe_cpe22uri", "TEXT")
374+
cpe5 = TableColumn("nodes_cpe_cpe23uri", "TEXT")
375+
348376
a13 = TableColumn('baseMetricV2_version', "VARCHAR(10)")
349377
a14 = TableColumn('baseMetricV2_vectorString', "VARCHAR(50)")
350378
a15 = TableColumn('baseMetricV2_confidentialityImpact', "VARCHAR(10)")
@@ -392,19 +420,21 @@ def find_key(self, element, pattern):
392420
return key
393421

394422
def table_insert(self, tablename, jsonCollection):
395-
try:
396-
print("MYSQL inserting thread now started")
397-
threadlist = ThreadList(thread_count)
398-
print("Inserting value ...")
399-
for jsonElement in jsonCollection:
400-
p = Thread(target=workstation, args=(self, tablename, jsonElement))
401-
threadlist.add_thread(p)
402-
threadlist.start()
403-
while threadlist.kill == False:
404-
time.sleep(0.1)
405-
except (KeyboardInterrupt, SystemExit):
406-
sys.exit(-1)
423+
threadlist = ThreadList(thread_count)
424+
print("Inserting value ...")
425+
426+
# Singlethreading-based
427+
#p = Thread(target=self._processFunction, args=())
428+
#for jsonElement in jsonCollection:
429+
# workstation(self, tablename, jsonElement)
407430

431+
# Multithreading-based
432+
print("MYSQL inserting thread now started")
433+
for jsonElement in jsonCollection:
434+
p = Thread(target=workstation, args=(self, tablename, jsonElement))
435+
threadlist.add_thread(p)
436+
threadlist.start()
437+
threadlist._process.join()
408438
print("\nAll data has been inserted.")
409439

410440

@@ -606,7 +636,7 @@ def affect_vendor_data(self, cve_affects):
606636
product_name = product_info['product_name']
607637
for version in product_info['version']['version_data']:
608638
version_value = version
609-
product_flag.append(product_name + ":" + version_value.get('version_value', 'invaild'))
639+
product_flag.append(product_name + "|" + version_value.get('version_value', 'invaild'))
610640
affect = Affect(vendor_name, product_flag)
611641
vendor_list.append(affect)
612642
except:
@@ -709,7 +739,7 @@ def __init__(self, vendor_name, product_flag):
709739

710740
def serialize(self, jsonDefault, o):
711741
for index, flag in enumerate(self.product_flag):
712-
jsonDefault['affect_{n}'.format(n=index)] = str(self.vendor_name + ":" + flag)
742+
jsonDefault['affect_{n}'.format(n=index)] = str(self.vendor_name + "|" + flag)
713743

714744
class DescriptionType:
715745
__dbcolumn__ = "Description"
@@ -718,14 +748,14 @@ def __init__(self, lang, value):
718748
self.value = value
719749

720750
def serialize(self, jsonDefault, o):
721-
jsonDefault["desc_" + str(id(self))] = self.lang + "|" + self.value
751+
jsonDefault["desc_" + str(id(self))] = self.lang + ", " + self.value
722752

723753
class ProblemType(DescriptionType):
724754
def __init__(self, lang, value):
725755
super().__init__(lang, value)
726756

727757
def serialize(self, jsonDefault, o):
728-
jsonDefault["cwe_" + str(id(self))] = self.lang + "|" + self.value
758+
jsonDefault["cwe_" + str(id(self))] = self.lang + ", " + self.value
729759

730760
class Reference:
731761
def __init__(self, url, name, refsource):
@@ -734,4 +764,4 @@ def __init__(self, url, name, refsource):
734764
self.refsource = refsource
735765

736766
def serialize(self, jsonDefault, o):
737-
jsonDefault["reference_" + self.name] = self.url + "|" + self.refsource
767+
jsonDefault["reference_" + self.name] = self.url + ", " + self.refsource

0 commit comments

Comments
 (0)