commit: 6ccce1de425884f2279435381b756a50cec5b34b Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org> AuthorDate: Tue Dec 23 21:10:47 2014 +0000 Commit: Brian Dolbec <brian.dolbec <AT> gmail <DOT> com> CommitDate: Tue Dec 23 21:10:47 2014 +0000 URL: http://sources.gentoo.org/gitweb/?p=proj/gentoo-keys.git;a=commit;h=6ccce1de
gkeys/config.py: Subclass ConfigParser to be able to set defaults in the config Allow some base defaults to be set in the [base] section of the config. Reset our defaults from those changes. Resave the new defaults back to the configparser for interpolation when retrieving the values. --- gkeys/gkeys/SaneConfigParser.py | 27 ++++++++++++++++++ gkeys/gkeys/config.py | 63 ++++++++++++++--------------------------- 2 files changed, 48 insertions(+), 42 deletions(-) diff --git a/gkeys/gkeys/SaneConfigParser.py b/gkeys/gkeys/SaneConfigParser.py new file mode 100644 index 0000000..3bb69b5 --- /dev/null +++ b/gkeys/gkeys/SaneConfigParser.py @@ -0,0 +1,27 @@ + +import sys + +# py3.2 +if sys.hexversion >= 0x30200f0: + from configparser import configparser as ConfigParser + from configparser import NoSectionError + py3 = True +else: + from ConfigParser import ConfigParser, NoSectionError + py3 = False + + +class SaneConfigParser(ConfigParser): + '''This class overrides what I consider a buggy RawConfigParser.options()''' + + + def options(self, section): + """Return a list of option names for the given section name.""" + try: + opts = self._sections[section].copy() + except KeyError: + raise NoSectionError(section) + if '__name__' in opts: + del opts['__name__'] + return list(opts.keys()) + diff --git a/gkeys/gkeys/config.py b/gkeys/gkeys/config.py index e6789ff..7e31909 100644 --- a/gkeys/gkeys/config.py +++ b/gkeys/gkeys/config.py @@ -11,22 +11,13 @@ """ import os -import sys from collections import OrderedDict - -# py3.2 -if sys.hexversion >= 0x30200f0: - import configparser as ConfigParser -else: - import ConfigParser - from collections import namedtuple - from pyGPG.config import GPGConfig -from gkeys import log +from gkeys.SaneConfigParser import SaneConfigParser from gkeys.utils import path @@ -82,27 +73,17 @@ class GKeysConfig(GPGConfig): def _add_gkey_defaults(self): self.defaults['gkeysdir'] = path([self.root, EPREFIX, '/var/lib/gentoo/gkeys']) - self.defaults['dev-keydir'] = '%(gkeysdir)s/devs' - self.defaults['rel-keydir'] = '%(gkeysdir)s/release' self.defaults['keyring'] = '%(gkeysdir)s/keyring' - self.defaults['overlays-keydir'] = '%(gkeysdir)s/overlays' self.defaults['sign-keydir'] = '%(gkeysdir)s/sign', self.defaults['logdir'] = '/var/log/gkeys' # local directory to scan for seed files installed via ebuild, layman # or manual install. self.defaults['seedsdir'] = '%(gkeysdir)s/seeds' - self.defaults['seeds'] = { - 'gentoo': '%(seedsdir)s/gentoo.seeds', - 'gentoodevs': '%(seedsdir)s/gentoodevs.seeds', - } + self.defaults['seeds'] = {} self.defaults['keyserver'] = 'pool.sks-keyservers.net' # NOTE: files is umask mode in octal, directories is chmod mode in octal self.defaults['permissions'] = {'files': '0o002', 'directories': '0o775',} - self.defaults['seedurls'] = { - 'gentoo': 'https://api.gentoo.org/gentoo-keys/seeds/gentoo.seeds', - 'gentoodevs': 'https://api.gentoo.org/gentoo-keys/seeds/gentoodevs.seeds', - 'gkey': 'gkeys', - } + self.defaults['seedurls'] = {} self.defaults['sign'] = { 'key': 'fingerprint', 'keydir': '~/.gkeys', @@ -120,13 +101,24 @@ class GKeysConfig(GPGConfig): % {'configdir': self.defaults['configdir']} for key in self.defaults: self.defaults[key] = self._sub_(self.defaults[key]) - defaults = self.get_defaults() - # remove some defaults from being entered into the configparser - for key in ['gpg_defaults', 'only_usable', 'refetch', 'tasks']: - defaults.pop(key) - self.configparser = ConfigParser.ConfigParser(defaults) - self.configparser.read(defaults['config']) - + defaults = OrderedDict() + # Add only the defaults we want in the configparser + for key in ['gkeysdir', 'keyring', 'sign-keydir', 'logdir', 'seedsdir', + 'keyserver']: + defaults[key] = self.defaults[key] + self.configparser = SaneConfigParser(defaults) + self.configparser.read(self.defaults['config']) + # I consider this hacky, but due to shortcomings of ConfigParser + # we need to reset the defaults redefined in the 'base' section + for key in self.configparser.options('base'): + self.defaults[key] = self.configparser.get('base', key) + defaults[key] = self.defaults[key] + self.configparser._defaults = defaults + for section in self.configparser.sections(): + if section == 'base': + continue + for key in self.configparser.options(section): + self.defaults[section][key] = self.configparser.get(section, key) def get_key(self, key, subkey=None): return self._get_(key, subkey) @@ -134,25 +126,12 @@ class GKeysConfig(GPGConfig): def _get_(self, key, subkey=None): if subkey: - if self.configparser and self.configparser.has_option(key, subkey): - if self.logger: - self.logger.debug("Found %s in configparser... %s" - % (key, str(self.configparser.get(key, subkey)))) - return self._sub_(self.configparser.get(key, subkey)) - #print("CONFIG: key, subkey", key, subkey) if key in self.options and subkey in self.options[key]: return self._sub_(self.options[key][subkey]) elif key in self.defaults and subkey in self.defaults[key]: return self._sub_(self.defaults[key][subkey]) else: return super(GKeysConfig, self)._get_(key, subkey) - elif self.configparser and self.configparser.has_option('DEFAULT', key): - if self.logger: - self.logger.debug("Found %s in configparser... %s" - % (key, str(self.configparser.get('DEFAULT', key)))) - #self.logger.debug("type(key)= %s" - # % str(type(self.configparser.get('DEFAULT', key)))) - return self.configparser.get('DEFAULT', key) else: return super(GKeysConfig, self)._get_(key, subkey)