
* changing config template paths for qualys * Update frameworks_example.ini Will leave for now qualys local folder as "qualys" instead of changing to one for each module, as like this it will still be compatible with the current logstash and we will be able to update master to drop the qualysapi fork once the new version is uploaded to PyPI repository. PR from qualysapi repo has already been merged, so the only missing is the upload to PyPI. * initialize variable fullpath to avoid break * fix get latest scan entry from db and ignore 'potential' not verified vulns * added host resolv + cache to speed already resolved, jira logging * make sure that vulnerability criticality appears as a label on ticket + automatic actions * jira bulk report of scans, fix on nessus logging, jira time resolution and list all ticket reported assets * added jira ticket data download + change default time window from 6 to 12 months * small fixes * jira logstash files * fix variable confusion (thx Travis :)
86 lines
3.5 KiB
Python
86 lines
3.5 KiB
Python
import os
|
|
import sys
|
|
import logging
|
|
|
|
# Support for python3
|
|
if (sys.version_info > (3, 0)):
|
|
import configparser as cp
|
|
else:
|
|
import ConfigParser as cp
|
|
|
|
|
|
class vwConfig(object):
|
|
|
|
def __init__(self, config_in=None):
|
|
self.config_in = config_in
|
|
self.config = cp.RawConfigParser()
|
|
self.config.read(self.config_in)
|
|
self.logger = logging.getLogger('vwConfig')
|
|
|
|
def get(self, section, option):
|
|
self.logger.debug('Calling get for {}:{}'.format(section, option))
|
|
return self.config.get(section, option)
|
|
|
|
def getbool(self, section, option):
|
|
self.logger.debug('Calling getbool for {}:{}'.format(section, option))
|
|
return self.config.getboolean(section, option)
|
|
|
|
def get_sections_with_attribute(self, attribute):
|
|
sections = []
|
|
# TODO: does this not also need the "yes" case?
|
|
check = ["true", "True", "1"]
|
|
for section in self.config.sections():
|
|
try:
|
|
if self.get(section, attribute) in check:
|
|
sections.append(section)
|
|
except:
|
|
self.logger.warn("Section {} has no option '{}'".format(section, attribute))
|
|
return sections
|
|
|
|
def exists_jira_profiles(self, profiles):
|
|
# get list of profiles source_scanner.scan_name
|
|
for profile in profiles:
|
|
if not self.config.has_section(self.normalize_section(profile)):
|
|
self.logger.warn("JIRA Scan Profile missing")
|
|
return False
|
|
return True
|
|
|
|
|
|
def update_jira_profiles(self, profiles):
|
|
# create JIRA profiles in the ini config file
|
|
self.logger.debug('Updating Jira profiles: {}'.format(str(profiles)))
|
|
|
|
for profile in profiles:
|
|
#IMPORTANT profile scans/results will be normalized to lower and "_" instead of spaces for ini file section
|
|
section_name = self.normalize_section(profile)
|
|
try:
|
|
self.get(section_name, "source")
|
|
self.logger.info("Skipping creating of section '{}'; already exists".format(section_name))
|
|
except:
|
|
self.logger.warn("Creating config section for '{}'".format(section_name))
|
|
self.config.add_section(section_name)
|
|
self.config.set(section_name,'source',profile.split('.')[0])
|
|
# in case any scan name contains '.' character
|
|
self.config.set(section_name,'scan_name','.'.join(profile.split('.')[1:]))
|
|
self.config.set(section_name,'jira_project', '')
|
|
self.config.set(section_name,'; if multiple components, separate by ","')
|
|
self.config.set(section_name,'components', '')
|
|
self.config.set(section_name,'; minimum criticality to report (low, medium, high or critical)')
|
|
self.config.set(section_name,'min_critical_to_report', 'high')
|
|
self.config.set(section_name,'; automatically report, boolean value ')
|
|
self.config.set(section_name,'autoreport', 'false')
|
|
|
|
# TODO: try/catch this
|
|
# writing changes back to file
|
|
with open(self.config_in, 'w') as configfile:
|
|
self.config.write(configfile)
|
|
self.logger.debug('Written configuration to {}'.format(self.config_in))
|
|
|
|
# FIXME: this is the same as return None, that is the default return for return-less functions
|
|
return
|
|
|
|
def normalize_section(self, profile):
|
|
profile = "jira.{}".format(profile.lower().replace(" ","_"))
|
|
self.logger.debug('Normalized profile as: {}'.format(profile))
|
|
return profile
|