add filter for scan name and days to look back
This commit is contained in:
@ -2,7 +2,7 @@ import json
|
||||
import logging
|
||||
import sys
|
||||
import time
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
import pytz
|
||||
import requests
|
||||
@ -81,9 +81,6 @@ class NessusAPI(object):
|
||||
else:
|
||||
self.login()
|
||||
|
||||
self.scans = self.get_scans()
|
||||
self.scan_ids = self.get_scan_ids()
|
||||
|
||||
def login(self):
|
||||
auth = '{"username":"%s", "password":"%s"}' % (self.user, self.password)
|
||||
resp = self.request(self.SESSION, data=auth, json_output=False)
|
||||
@ -92,7 +89,7 @@ class NessusAPI(object):
|
||||
else:
|
||||
raise Exception('[FAIL] Could not login to Nessus')
|
||||
|
||||
def request(self, url, data=None, headers=None, method='POST', download=False, json_output=False):
|
||||
def request(self, url, data=None, headers=None, method='POST', download=False, json_output=False, params=None):
|
||||
timeout = 0
|
||||
success = False
|
||||
|
||||
@ -101,7 +98,7 @@ class NessusAPI(object):
|
||||
self.logger.debug('Requesting to url {}'.format(url))
|
||||
|
||||
while (timeout <= 10) and (not success):
|
||||
response = getattr(self.session, method)(url, data=data)
|
||||
response = getattr(self.session, method)(url, data=data, params=params)
|
||||
if response.status_code == 401:
|
||||
if url == self.base + self.SESSION:
|
||||
break
|
||||
@ -130,12 +127,15 @@ class NessusAPI(object):
|
||||
return response_data
|
||||
return response
|
||||
|
||||
def get_scans(self):
|
||||
scans = self.request(self.SCANS, method='GET', json_output=True)
|
||||
def get_scans(self, days=None):
|
||||
if days:
|
||||
parameters = {
|
||||
"last_modification_date": (datetime.now() - timedelta(days=days)).strftime("%s")
|
||||
}
|
||||
scans = self.request(self.SCANS, method="GET", params=parameters, json_output=True)
|
||||
return scans
|
||||
|
||||
def get_scan_ids(self):
|
||||
scans = self.scans
|
||||
def get_scan_ids(self, scans):
|
||||
scan_ids = [scan_id['id'] for scan_id in scans['scans']] if scans['scans'] else []
|
||||
self.logger.debug('Found {} scan_ids'.format(len(scan_ids)))
|
||||
return scan_ids
|
||||
|
@ -5,6 +5,7 @@ __author__ = 'Nathan Young'
|
||||
import logging
|
||||
import sys
|
||||
import xml.etree.ElementTree as ET
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
import dateutil.parser as dp
|
||||
import pandas as pd
|
||||
@ -29,7 +30,7 @@ class qualysWhisperAPI(object):
|
||||
def scan_xml_parser(self, xml):
|
||||
all_records = []
|
||||
root = ET.XML(xml.encode('utf-8'))
|
||||
if not root.find('.//SCAN_LIST'):
|
||||
if len(root.find('.//SCAN_LIST')) == 0:
|
||||
return pd.DataFrame(columns=['id', 'status'])
|
||||
for child in root.find('.//SCAN_LIST'):
|
||||
all_records.append({
|
||||
@ -42,12 +43,17 @@ class qualysWhisperAPI(object):
|
||||
})
|
||||
return pd.DataFrame(all_records)
|
||||
|
||||
def get_all_scans(self):
|
||||
def get_all_scans(self, days=None):
|
||||
if not days:
|
||||
self.launched_date = '0001-01-01'
|
||||
else:
|
||||
self.launched_date = (datetime.now() - timedelta(days=days)).strftime('%Y-%m-%d')
|
||||
parameters = {
|
||||
'action': 'list',
|
||||
'echo_request': 0,
|
||||
'show_op': 0,
|
||||
'launched_after_datetime': '0001-01-01'
|
||||
'state': 'Finished',
|
||||
'launched_after_datetime': self.launched_date
|
||||
}
|
||||
scans_xml = self.qgc.request(self.SCANS, parameters)
|
||||
return self.scan_xml_parser(scans_xml)
|
||||
|
@ -7,6 +7,7 @@ import logging
|
||||
import os
|
||||
import sys
|
||||
import xml.etree.ElementTree as ET
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
import dateutil.parser as dp
|
||||
import pandas as pd
|
||||
@ -60,10 +61,12 @@ class qualysWhisperAPI(object):
|
||||
"""
|
||||
Checks number of scans, used to control the api limits
|
||||
"""
|
||||
parameters = (
|
||||
E.ServiceRequest(
|
||||
parameters = E.ServiceRequest(
|
||||
E.filters(
|
||||
E.Criteria({'field': 'status', 'operator': 'EQUALS'}, status))))
|
||||
E.Criteria({"field": "status", "operator": "EQUALS"}, status),
|
||||
E.Criteria({"field": "launchedDate", "operator": "GREATER"}, self.launched_date)
|
||||
)
|
||||
)
|
||||
xml_output = self.qgc.request(self.COUNT_WASSCAN, parameters)
|
||||
root = objectify.fromstring(xml_output.encode('utf-8'))
|
||||
return root.count.text
|
||||
@ -71,8 +74,8 @@ class qualysWhisperAPI(object):
|
||||
def generate_scan_result_XML(self, limit=1000, offset=1, status='FINISHED'):
|
||||
report_xml = E.ServiceRequest(
|
||||
E.filters(
|
||||
E.Criteria({'field': 'status', 'operator': 'EQUALS'}, status
|
||||
),
|
||||
E.Criteria({'field': 'status', 'operator': 'EQUALS'}, status),
|
||||
E.Criteria({"field": "launchedDate", "operator": "GREATER"}, self.launched_date)
|
||||
),
|
||||
E.preferences(
|
||||
E.startFromOffset(str(offset)),
|
||||
@ -104,7 +107,12 @@ class qualysWhisperAPI(object):
|
||||
all_records.append(record)
|
||||
return pd.DataFrame(all_records)
|
||||
|
||||
def get_all_scans(self, limit=1000, offset=1, status='FINISHED'):
|
||||
|
||||
def get_all_scans(self, limit=1000, offset=1, status='FINISHED', days=None):
|
||||
if not days:
|
||||
self.launched_date = '0001-01-01'
|
||||
else:
|
||||
self.launched_date = (datetime.now() - timedelta(days=days)).strftime('%Y-%m-%d')
|
||||
qualys_api_limit = limit
|
||||
dataframes = []
|
||||
_records = []
|
||||
|
Reference in New Issue
Block a user