
* Fix closing logging handlers * Fix *some* unicode issues for nessus and qualys * Prevent multiple requests to nessus scans endpoint * More unicode fixes * Remove unnecessary call * Fix whitespace * Add mock module and argument * Add test config and data * Fix whitespace again * Disable qualys_web until data is available * Use logging module * Delete report_tracker.db * Cleanup mock calls * Add httpretty to requirements * Refactor into a class * Updates travis tests * Fix exit codes * Remove print statements * Remove test * Add test directory as submodule
86 lines
3.6 KiB
Python
86 lines
3.6 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
|