@@ -55,9 +55,9 @@ def __init__(self, auth, server="qualysapi.qualys.com", proxies=None, max_retrie
55
55
qualysapi .api_methods .api_methods_with_trailing_slash
56
56
)
57
57
self .proxies = proxies
58
- logger .debug ("proxies = \n %s" % proxies )
58
+ logger .debug ("proxies = \n %s" , proxies )
59
59
# Set up requests max_retries.
60
- logger .debug ("max_retries = \n %s" % max_retries )
60
+ logger .debug ("max_retries = \n %s" , max_retries )
61
61
self .session = requests .Session ()
62
62
http_max_retries = requests .adapters .HTTPAdapter (max_retries = max_retries )
63
63
https_max_retries = requests .adapters .HTTPAdapter (max_retries = max_retries )
@@ -120,22 +120,22 @@ def url_api_version(self, api_version):
120
120
# Set base url depending on API version.
121
121
if api_version == 1 :
122
122
# QualysGuard API v1 url.
123
- url = "https://%s /msp/" % ( self . server ,)
123
+ url = f "https://{ self . server } /msp/"
124
124
elif api_version == 2 :
125
125
# QualysGuard API v2 url.
126
- url = "https://%s/" % ( self .server ,)
126
+ url = f "https://{ self .server } /"
127
127
elif api_version == "was" :
128
128
# QualysGuard REST v3 API url (Portal API).
129
- url = "https://%s /qps/rest/3.0/" % ( self . server ,)
129
+ url = f "https://{ self . server } /qps/rest/3.0/"
130
130
elif api_version == "am" :
131
131
# QualysGuard REST v1 API url (Portal API).
132
- url = "https://%s /qps/rest/1.0/" % ( self . server ,)
132
+ url = f "https://{ self . server } /qps/rest/1.0/"
133
133
elif api_version == "am2" :
134
134
# QualysGuard REST v1 API url (Portal API).
135
- url = "https://%s /qps/rest/2.0/" % ( self . server ,)
135
+ url = f "https://{ self . server } /qps/rest/2.0/"
136
136
else :
137
- raise Exception ("Unknown QualysGuard API Version Number (%s)" % ( api_version ,) )
138
- logger .debug ("Base url =\n %s" % ( url ) )
137
+ raise Exception (f "Unknown QualysGuard API Version Number { api_version } " )
138
+ logger .debug ("Base url =\n %s" , url )
139
139
return url
140
140
141
141
def format_http_method (self , api_version , api_call , data ):
@@ -185,7 +185,7 @@ def preformat_call(self, api_call):
185
185
api_call_formatted = api_call_formatted .rstrip ("?" )
186
186
if api_call != api_call_formatted :
187
187
# Show difference
188
- logger .debug ("api_call post strip =\n %s" % api_call_formatted )
188
+ logger .debug ("api_call post strip =\n %s" , api_call_formatted )
189
189
return api_call_formatted
190
190
191
191
def format_call (self , api_version , api_call ):
@@ -195,7 +195,7 @@ def format_call(self, api_version, api_call):
195
195
# Remove possible starting slashes or trailing question marks in call.
196
196
api_call = api_call .lstrip ("/" )
197
197
api_call = api_call .rstrip ("?" )
198
- logger .debug ("api_call post strip =\n %s" % api_call )
198
+ logger .debug ("api_call post strip =\n %s" , api_call )
199
199
# Make sure call always ends in slash for API v2 calls.
200
200
if api_version == 2 and api_call [- 1 ] != "/" :
201
201
# Add slash.
@@ -216,25 +216,25 @@ def format_payload(self, api_version, data):
216
216
# Check if string type.
217
217
if type (data ) == str :
218
218
# Convert to dictionary.
219
- logger .debug ("Converting string to dict:\n %s" % data )
219
+ logger .debug ("Converting string to dict:\n %s" , data )
220
220
# Remove possible starting question mark & ending ampersands.
221
221
data = data .lstrip ("?" )
222
222
data = data .rstrip ("&" )
223
223
# Convert to dictionary.
224
224
data = parse_qs (data )
225
- logger .debug ("Converted:\n %s" % str (data ))
225
+ logger .debug ("Converted:\n %s" , str (data ))
226
226
elif api_version in ("am" , "was" , "am2" ):
227
227
if type (data ) == etree ._Element :
228
228
logger .debug ("Converting lxml.builder.E to string" )
229
229
data = etree .tostring (data )
230
- logger .debug ("Converted:\n %s" % data )
230
+ logger .debug ("Converted:\n %s" , data )
231
231
return data
232
232
233
233
def build_request (self , api_call , data = None , api_version = None , http_method = None ):
234
- logger .debug ("api_call =\n %s" % api_call )
235
- logger .debug ("api_version =\n %s" % api_version )
236
- logger .debug ("data %s =\n %s" % ( type (data ), str (data ) ))
237
- logger .debug ("http_method =\n %s" % http_method )
234
+ logger .debug ("api_call =\n %s" , api_call )
235
+ logger .debug ("api_version =\n %s" , api_version )
236
+ logger .debug ("data %s =\n %s" , type (data ), str (data ))
237
+ logger .debug ("http_method =\n %s" , http_method )
238
238
239
239
#
240
240
# Determine API version.
@@ -252,32 +252,31 @@ def build_request(self, api_call, data=None, api_version=None, http_method=None)
252
252
#
253
253
# Set up headers.
254
254
headers = {
255
- "X-Requested-With" : "Parag Baxi QualysAPI (python) v%s"
256
- % (qualysapi .version .__version__ ,)
255
+ "X-Requested-With" : f"Parag Baxi QualysAPI (python) v{ qualysapi .version .__version__ } "
257
256
}
258
- logger .debug ("headers =\n %s" % ( str (headers ) ))
257
+ logger .debug ("headers =\n %s" , str (headers ))
259
258
# Portal API takes in XML text, requiring custom header.
260
259
if api_version in ("am" , "was" , "am2" ):
261
260
headers ["Content-type" ] = "text/xml"
262
261
#
263
262
# Set up http request method, if not specified.
264
263
if not http_method :
265
264
http_method = self .format_http_method (api_version , api_call , data )
266
- logger .debug ("http_method =\n %s" % http_method )
265
+ logger .debug ("http_method =\n %s" , http_method )
267
266
#
268
267
# Format API call.
269
268
api_call = self .format_call (api_version , api_call )
270
- logger .debug ("api_call =\n %s" % ( api_call ) )
269
+ logger .debug ("api_call =\n %s" , api_call )
271
270
# Append api_call to url.
272
271
url += api_call
273
272
#
274
273
# Format data, if applicable.
275
274
if data is not None :
276
275
data = self .format_payload (api_version , data )
277
276
278
- logger .debug ("url =\n %s" % ( str (url ) ))
279
- logger .debug ("data =\n %s" % ( str (data ) ))
280
- logger .debug ("headers =\n %s" % ( str (headers ) ))
277
+ logger .debug ("url =\n %s" , str (url ))
278
+ logger .debug ("data =\n %s" , str (data ))
279
+ logger .debug ("headers =\n %s" , str (headers ))
281
280
282
281
return url , data , headers
283
282
@@ -313,19 +312,18 @@ def request_streaming(
313
312
stream = True ,
314
313
verify = verify ,
315
314
)
316
- logger .debug ("response headers =\n %s" % ( str (request .headers ) ))
315
+ logger .debug ("response headers =\n %s" , str (request .headers ))
317
316
#
318
317
# Remember how many times left user can make against api_call.
319
318
try :
320
319
self .rate_limit_remaining [api_call ] = int (request .headers ["x-ratelimit-remaining" ])
321
320
logger .debug (
322
- "rate limit for api_call, %s = %s"
323
- % (api_call , self .rate_limit_remaining [api_call ])
321
+ "rate limit for api_call, %s = %s" , api_call , self .rate_limit_remaining [api_call ]
324
322
)
325
323
if self .rate_limit_remaining [api_call ] <= 0 :
326
324
logger .critical (
327
- "ATTENTION! RATE LIMIT HAS BEEN REACHED (remaining api calls = %s)!"
328
- % self .rate_limit_remaining [api_call ]
325
+ "ATTENTION! RATE LIMIT HAS BEEN REACHED (remaining api calls = %s)!" ,
326
+ self .rate_limit_remaining [api_call ],
329
327
)
330
328
except KeyError as e :
331
329
# Likely a bad api_call.
@@ -353,8 +351,8 @@ def request(
353
351
354
352
"""
355
353
356
- logger .debug ("concurrent_scans_retries =\n %s" % str (concurrent_scans_retries ))
357
- logger .debug ("concurrent_scans_retry_delay =\n %s" % str (concurrent_scans_retry_delay ))
354
+ logger .debug ("concurrent_scans_retries =\n %s" , str (concurrent_scans_retries ))
355
+ logger .debug ("concurrent_scans_retry_delay =\n %s" , str (concurrent_scans_retry_delay ))
358
356
concurrent_scans_retries = int (concurrent_scans_retries )
359
357
concurrent_scans_retry_delay = int (concurrent_scans_retry_delay )
360
358
@@ -367,9 +365,9 @@ def request(
367
365
rate_warn_threshold = 10
368
366
while retries <= concurrent_scans_retries :
369
367
# Make request.
370
- logger .debug ("url =\n %s" % ( str (url ) ))
371
- logger .debug ("data =\n %s" % ( str (data ) ))
372
- logger .debug ("headers =\n %s" % ( str (headers ) ))
368
+ logger .debug ("url =\n %s" , str (url ))
369
+ logger .debug ("data =\n %s" , str (data ))
370
+ logger .debug ("headers =\n %s" , str (headers ))
373
371
if http_method == "get" :
374
372
# GET
375
373
logger .debug ("GET request." )
@@ -393,7 +391,7 @@ def request(
393
391
proxies = self .proxies ,
394
392
verify = verify ,
395
393
)
396
- logger .debug ("response headers =\n %s" % ( str (request .headers ) ))
394
+ logger .debug ("response headers =\n %s" , str (request .headers ))
397
395
# Force request encoding value, the automatic detection is very long for large files (report for example)
398
396
# And sometimes with MemoryError
399
397
if request .encoding is None :
@@ -405,25 +403,27 @@ def request(
405
403
request .headers ["x-ratelimit-remaining" ]
406
404
)
407
405
logger .debug (
408
- "rate limit for api_call, %s = %s"
409
- % (api_call , self .rate_limit_remaining [api_call ])
406
+ "rate limit for api_call, %s = %s" ,
407
+ api_call ,
408
+ self .rate_limit_remaining [api_call ],
410
409
)
411
410
if self .rate_limit_remaining [api_call ] > rate_warn_threshold :
412
411
logger .debug (
413
- "rate limit for api_call, %s = %s"
414
- % (api_call , self .rate_limit_remaining [api_call ])
412
+ "rate limit for api_call, %s = %s" ,
413
+ api_call ,
414
+ self .rate_limit_remaining [api_call ],
415
415
)
416
416
elif (self .rate_limit_remaining [api_call ] <= rate_warn_threshold ) and (
417
417
self .rate_limit_remaining [api_call ] > 0
418
418
):
419
419
logger .warning (
420
- "Rate limit is about to being reached (remaining api calls = %s)"
421
- % self .rate_limit_remaining [api_call ]
420
+ "Rate limit is about to being reached (remaining api calls = %s)" ,
421
+ self .rate_limit_remaining [api_call ],
422
422
)
423
423
elif self .rate_limit_remaining [api_call ] <= 0 :
424
424
logger .critical (
425
- "ATTENTION! RATE LIMIT HAS BEEN REACHED (remaining api calls = %s)!"
426
- % self .rate_limit_remaining [api_call ]
425
+ "ATTENTION! RATE LIMIT HAS BEEN REACHED (remaining api calls = %s)!" ,
426
+ self .rate_limit_remaining [api_call ],
427
427
)
428
428
except KeyError as e :
429
429
# Likely a bad api_call.
@@ -435,7 +435,7 @@ def request(
435
435
pass
436
436
# Response received.
437
437
response = request .text
438
- logger .debug ("response text =\n %s" % ( response ) )
438
+ logger .debug ("response text =\n %s" , response )
439
439
# Keep track of how many retries.
440
440
retries += 1
441
441
# Check for concurrent scans limit.
@@ -454,11 +454,11 @@ def request(
454
454
# If trying again, delay next try by concurrent_scans_retry_delay.
455
455
if retries <= concurrent_scans_retries :
456
456
logger .warning (
457
- "Waiting %d seconds until next try." % concurrent_scans_retry_delay
457
+ "Waiting %d seconds until next try." , concurrent_scans_retry_delay
458
458
)
459
459
time .sleep (concurrent_scans_retry_delay )
460
460
# Inform user of how many retries.
461
- logger .critical ("Retry #%d" % retries )
461
+ logger .critical ("Retry #%d" , retries )
462
462
else :
463
463
# Ran out of retries. Let user know.
464
464
print ("Alert! Ran out of concurrent_scans_retries!" )
@@ -471,17 +471,17 @@ def request(
471
471
# Error
472
472
print ("Error! Received a 4XX client error or 5XX server error response." )
473
473
print ("Content = \n " , response )
474
- logger .error ("Content = \n %s" % response )
474
+ logger .error ("Content = \n %s" , response )
475
475
print ("Headers = \n " , request .headers )
476
- logger .error ("Headers = \n %s" % str (request .headers ))
476
+ logger .error ("Headers = \n %s" , str (request .headers ))
477
477
request .raise_for_status ()
478
478
if '<RETURN status="FAILED" number="2007">' in response :
479
479
print (
480
480
"Error! Your IP address is not in the list of secure IPs. Manager must include this IP (QualysGuard VM > Users > Security)."
481
481
)
482
482
print ("Content = \n " , response )
483
- logger .error ("Content = \n %s" % response )
483
+ logger .error ("Content = \n %s" , response )
484
484
print ("Headers = \n " , request .headers )
485
- logger .error ("Headers = \n %s" % str (request .headers ))
485
+ logger .error ("Headers = \n %s" , str (request .headers ))
486
486
return False
487
487
return response
0 commit comments