def __init__(self, config_section, defaults=None, config_path=None, secrets_dir=None,
                 throw_exception=False, allow_no_value=True):
        """
        Config files will be checked in /etc/panw be default. If a PANW_CONFIG env exists, it will pull the path from
        there When setting variable values, make sure that you can have an ALL_CAPS setting that will work without
        colliding in an environment variable Settings and sections should be lower_case_underscore

        """
        if defaults is None:
            defaults = {}

        if not secrets_dir and 'SECRETS_DIR' in os.environ:
            secrets_dir = os.environ.get("SECRETS_DIR")

        self.secrets_dir = secrets_dir

        # GSRTTECH-5222
        self.parser = configparser.ConfigParser(defaults, allow_no_value=allow_no_value)

        if not config_path and 'PANW_CONFIG' in os.environ:
            config_path = os.environ.get('PANW_CONFIG')

        if not config_path:
            for known_path in [os.path.expanduser("~") + "/.config/panw", "/opt/.config/panw", "/etc/panw/config"]:
                if os.path.isfile(known_path):
                    config_path = known_path
                    break

        self.config_path = config_path

        # Only read the file if the config_path is a true value
        if config_path:
            if os.path.isfile(config_path):
                self.parser.read(os.path.expanduser(config_path))
            else:
                raise Exception("PANW_CONFIG=%s is not a valid file" % config_path)

        # We'll stub out a blank section in case it doesn't exist, this prevents exceptions from being thrown
        if not self.parser.has_section(config_section):
            self.parser.add_section(config_section)

        self.config_section = config_section

        self.throw_exception = throw_exception