8
8
import collections
9
9
import fileinput
10
10
import hashlib
11
+ import tempfile
11
12
12
13
from xml .etree import ElementTree
13
14
@@ -183,23 +184,6 @@ def patch(args, qgc, keys):
183
184
""" Entrypoint for patch command.
184
185
"""
185
186
logger .info ("Started" )
186
- files_input = fileinput .input (files = args .files if args .files else ('-' , ))
187
- csv .register_dialect ('qualys' , delimiter = ',' , quotechar = '"' ,
188
- quoting = csv .QUOTE_NONNUMERIC )
189
-
190
- reader = csv .reader (files_input , dialect = 'qualys' )
191
- writer = csv .writer (sys .stdout , dialect = 'qualys' )
192
-
193
- # Seach headers
194
- headers = []
195
- lineno = 0
196
- while 'QID' not in headers :
197
- headers = next (reader )
198
- lineno += 1
199
- writer .writerow (headers )
200
-
201
- if not headers :
202
- raise KcareQualysError ("There was no QID column in a report." )
203
187
204
188
cache = collections .defaultdict (set )
205
189
plan = collections .defaultdict (set )
@@ -223,20 +207,44 @@ def patch(args, qgc, keys):
223
207
logger .info ('{0} QIDs was found for {1} assets' .format (
224
208
len (qid_list ), len (asset_list )))
225
209
226
- for lineno , row in enumerate (reader , lineno ):
227
- data = dict (zip (headers , row ))
228
- if 'QID' in data :
229
- qid , ip = data ['QID' ], data ['IP' ]
230
- dns_name = data .get ('DNS Name' ) or data .get ("DNS" )
231
- qids_to_exclude = cache [ip ] | cache [dns_name ]
232
- if qid not in qids_to_exclude :
233
- writer .writerow (row )
210
+ files_input = fileinput .input (files = args .files if args .files else ('-' , ))
211
+ csv .register_dialect ('qualys' , delimiter = ',' , quotechar = '"' ,
212
+ quoting = csv .QUOTE_NONNUMERIC )
213
+
214
+ orig_fd , orig = tempfile .mkstemp (prefix = 'kcare-qualys-' , suffix = '.csv' )
215
+ with open (orig_fd , 'w' , newline = '\r \n ' ) as orig_file :
216
+ reader = csv .reader (files_input , dialect = 'qualys' )
217
+ writer = csv .writer (orig_file , dialect = 'qualys' )
218
+
219
+ # Seach headers
220
+ headers = []
221
+ while 'QID' not in headers :
222
+ headers = next (reader )
223
+ writer .writerow (headers )
224
+
225
+ if not headers :
226
+ raise KcareQualysError ("There was no QID column in a report." )
227
+
228
+ for row in reader :
229
+ data = dict (zip (headers , row ))
230
+ if 'QID' in data :
231
+ qid , ip = data ['QID' ], data ['IP' ]
232
+ dns_name = data .get ('DNS Name' ) or data .get ("DNS" )
233
+ qids_to_exclude = cache [ip ] | cache [dns_name ]
234
+ if qid not in qids_to_exclude :
235
+ writer .writerow (row )
236
+ else :
237
+ logger .info ("Line {0} was skipped [QID: {1}, ip: {2}]" .format (reader .line_num , qid , ip ))
234
238
else :
235
- logger .info ("Line {0} was skipped [QID: {1}, ip: {2}]" .format (lineno , qid , ip ))
236
- else :
237
- # Malformed line write as is
238
- writer .writerow (row )
239
+ # Malformed line write as is
240
+ writer .writerow (row )
241
+
242
+ with open (orig , 'r' , newline = '\r \n ' ) as orig_file :
243
+ for idx , line in enumerate (orig_file ):
244
+ line = line .replace ('"",' , ',' )
245
+ sys .stdout .write (line )
239
246
247
+ os .unlink (orig )
240
248
logger .info ("Done" )
241
249
242
250
0 commit comments