9
9
import os
10
10
import signal
11
11
import time
12
- import copy
12
+ import threading
13
+
13
14
from multiprocessing import Process
14
15
from database import TableColumn
15
16
from threading import Thread
@@ -29,6 +30,7 @@ def __init__(self, process):
29
30
self ._process = None
30
31
self .kill = False
31
32
self .process = process
33
+ self ._lock = threading .Lock ()
32
34
33
35
def _pobject (self ):
34
36
self ._entry = len (self ._wpList )
@@ -61,20 +63,21 @@ def _pobject(self):
61
63
if len (self ._wpList ) == 0 :
62
64
self .kill = True
63
65
64
- def _processFunction (self ):
66
+ def _processFunction (self , delay = 6.0 ):
65
67
while True :
66
68
sys .stdout .write ("\r Current progress: %d / %d" % (self ._entry - len (self ._wpList ), self ._entry ))
67
69
sys .stdout .flush ()
68
70
if self .kill :
71
+ self ._lock .release ()
69
72
break
70
- time .sleep (5 )
73
+ time .sleep (delay )
71
74
72
75
def start (self ):
73
76
self ._coreThread = Thread (target = self ._pobject )
74
77
self ._coreThread .start ()
75
-
76
78
self ._process = Thread (target = self ._processFunction )
77
79
self ._process .start ()
80
+ self ._lock .acquire ()
78
81
79
82
def add_thread (self , thread ):
80
83
self ._wpList .append (thread )
@@ -97,39 +100,21 @@ def workstation(sql, tablename, jsonElement):
97
100
cve_data_version = str (jsonElement ['CVE_data_version' ])
98
101
reference = ""
99
102
description = ""
100
- cpe = ""
101
103
problemtype = ""
102
104
103
105
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 ]
106
108
107
109
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 ]
110
112
111
113
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 ]
131
116
132
- # for version 2
117
+ # for version 2
133
118
baseMetricV2_version = str (jsonElement .get ('baseMetricV2.version' , '' ))
134
119
baseMetricV2_vectorString = str (jsonElement .get ('baseMetricV2.vectorString' , '' ))
135
120
baseMetricV2_accessVector = str (jsonElement .get ('baseMetricV2.accessVector' , '' ))
@@ -167,43 +152,76 @@ def workstation(sql, tablename, jsonElement):
167
152
publishedDate = str (jsonElement .get ('publishedDate' , '' ))
168
153
lastModifiedDate = str (jsonElement .get ('lastModifiedDate' , '' ))
169
154
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.
171
169
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 )
202
198
base .disconnect ()
203
199
except KeyboardInterrupt :
204
- sys .exit ()
200
+ sys .exit (0 )
201
+
205
202
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
+
207
225
208
226
class Nvdnist (CVEDatabase ):
209
227
def __init__ (self , mysql_base ):
@@ -331,20 +349,30 @@ def load(self, obj):
331
349
return raw_file , collection
332
350
333
351
def default_table_column (self ):
352
+ # There's no meaning about variable name.
353
+ # Because it reads automantually only value.
334
354
a2 = TableColumn ("year" , "VARCHAR(5)" )
335
-
336
355
a3 = TableColumn ("ID" , "VARCHAR(24)" )
337
356
a4 = TableColumn ('ASSIGNER' , "VARCHAR(15)" )
338
357
a5 = TableColumn ("data_type" , 'VARCHAR(5)' )
339
358
a6 = TableColumn ("data_format" , "VARCHAR(10)" )
340
359
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)" )
343
366
a9 = TableColumn ("description" , "TEXT" )
344
367
a10 = TableColumn ("reference" , "TEXT" )
345
368
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
+
348
376
a13 = TableColumn ('baseMetricV2_version' , "VARCHAR(10)" )
349
377
a14 = TableColumn ('baseMetricV2_vectorString' , "VARCHAR(50)" )
350
378
a15 = TableColumn ('baseMetricV2_confidentialityImpact' , "VARCHAR(10)" )
@@ -392,19 +420,21 @@ def find_key(self, element, pattern):
392
420
return key
393
421
394
422
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)
407
430
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 ()
408
438
print ("\n All data has been inserted." )
409
439
410
440
@@ -606,7 +636,7 @@ def affect_vendor_data(self, cve_affects):
606
636
product_name = product_info ['product_name' ]
607
637
for version in product_info ['version' ]['version_data' ]:
608
638
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' ))
610
640
affect = Affect (vendor_name , product_flag )
611
641
vendor_list .append (affect )
612
642
except :
@@ -709,7 +739,7 @@ def __init__(self, vendor_name, product_flag):
709
739
710
740
def serialize (self , jsonDefault , o ):
711
741
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 )
713
743
714
744
class DescriptionType :
715
745
__dbcolumn__ = "Description"
@@ -718,14 +748,14 @@ def __init__(self, lang, value):
718
748
self .value = value
719
749
720
750
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
722
752
723
753
class ProblemType (DescriptionType ):
724
754
def __init__ (self , lang , value ):
725
755
super ().__init__ (lang , value )
726
756
727
757
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
729
759
730
760
class Reference :
731
761
def __init__ (self , url , name , refsource ):
@@ -734,4 +764,4 @@ def __init__(self, url, name, refsource):
734
764
self .refsource = refsource
735
765
736
766
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