5 Gentoo-keys - config.py
7 Holds configuration keys and values
9 @copyright: 2012 by Brian Dolbec <dol-sen@gentoo.org>
10 @license: GNU GNU GPL2, see COPYING for details.
17 if sys.hexversion >= 0x30200f0:
18 import configparser as ConfigParser
22 from collections import namedtuple
25 from pyGPG.config import GPGConfig
28 from gkeys.utils import path
33 # establish the eprefix, initially set so eprefixify can
35 EPREFIX = "@GENTOO_PORTAGE_EPREFIX@"
37 # check and set it if it wasn't
38 if "GENTOO_PORTAGE_EPREFIX" in EPREFIX:
43 class GKeysConfig(GPGConfig):
44 """ Configuration superclass which holds our gentoo-keys
45 config settings for pygpg """
47 def __init__ (self, config=None, root=None, read_configfile=False):
48 """ Class initialiser """
49 GPGConfig.__init__(self)
51 self.root = root or ''
53 self.defaults['config'] = config
54 self.defaults['configdir'] = os.path.dirname(config)
56 self.defaults['configdir'] = path([self.root, EPREFIX, '/etc/gentoo-keys'])
57 self.defaults['config'] = '%(configdir)s/gkeys.conf'
58 self.configparser = None
63 def _add_gkey_defaults(self):
64 self.defaults['keysdir'] = path([self.root, EPREFIX, '/var/gentoo/gkeys'])
65 self.defaults['dev-keydir'] = '%(keysdir)s/devs'
66 self.defaults['release-keydir'] = '%(keysdir)s/release'
67 self.defaults['overlays-keydir'] = '%(keysdir)s/overlays'
68 self.defaults['logdir'] = '%(keysdir)s/logs'
69 # local directory to scan for seed files installed via ebuild, layman
71 self.defaults['seedsdir'] = '%(keysdir)s/seeds'
72 self.defaults['release-seedfile'] = '%(seedsdir)s/release.seeds'
73 self.defaults['dev-seedfile'] = '%(seedsdir)s/developer.seeds'
74 self.defaults['keyserver'] = 'pool.sks-keyservers.net'
75 self.defaults['seedurls'] = {
76 'release.seeds': 'https://dev.gentoo.org/~dolsen/gkey-seeds/release.seeds',
77 'developers.seeds': 'https://dev.gentoo.org/~dolsen/gkey-seeds/developer.seeds',
81 def read_config(self):
82 '''Reads the config file into memory
84 if "%(configdir)s" in self.defaults['config']:
86 self.defaults['config'] = self.defaults['config'] \
87 % {'configdir': self.defaults['configdir']}
88 defaults = self.get_defaults()
89 # remove some defaults from being entered into the configparser
90 for key in ['gpg_defaults', 'only_usable', 'refetch', 'tasks']:
92 self.configparser = ConfigParser.ConfigParser(defaults)
93 self.configparser.add_section('MAIN')
94 self.configparser.read(defaults['config'])
97 def get_key(self, key, subkey=None):
98 return self._get_(key, subkey)
101 def _get_(self, key, subkey=None):
102 if self.configparser and self.configparser.has_option('MAIN', key):
104 logger.debug("Found %s in configparser... %s"
105 % (key, str(self.configparser.get('MAIN', key))))
106 #logger.debug("type(key)= %s"
107 # % str(type(self.configparser.get('MAIN', key))))
108 return self.configparser.get('MAIN', key)
110 return super(GKeysConfig, self)._get_(key, subkey)
113 # some constants used in gkeyldap/actions.py
114 # they map the index values of the GKEY input data fields
129 class GKEY(namedtuple('GKEY', ['nick', 'name', 'keyid', 'longkeyid',
130 'keydir', 'fingerprint'])):
131 '''Class to hold the relavent info about a key'''
133 # subclass __new__ to make both gkeys and gkeyldap work properly
134 # delete it when keyid and longkeyid are removed from LDAP
135 def __new__(cls, nick=None, name=None, keydir=None, fingerprint=None,
136 keyid=None, longkeyid=None):
137 return super(GKEY, cls).__new__(cls, nick, name, keydir, fingerprint,
140 field_types = {'nick': str, 'name': str, 'keyid': list,
141 'longkeyid': list, 'keydir': str, 'fingerprint': list}
142 field_separator = "|"
146 def _packed_values(self):
147 '''Returns a list of the field values'''
149 for f in self._fields:
150 v.append(self._pack(f))
154 def packed_string(self):
155 '''Returns a separator joined string of the field values'''
156 return self.field_separator.join([str(x) for x in self._packed_values()])
158 def _unpack_string(self, packed_data):
159 '''Returns a list of the separator joined string of the field values'''
161 data = packed_data.split(self.field_separator)
162 for x in self._fields:
163 values.append(self._unpack(x, data.pop(0)))
166 def _pack(self, field):
167 '''pack field data into a string'''
168 if self.field_types[field] == str:
169 return getattr(self, field)
170 elif self.field_types[field] == list:
171 info = getattr(self, field)
173 return self.list_separator.join(info)
175 # force an empty list to None
178 raise "ERROR packing %s" %str(getattr(self, field))
180 def _unpack(self, field, data):
181 '''unpack field data to the desired type'''
182 if self.field_types[field] == str:
188 # make it an empty list
191 result = data.split(self.list_separator)
194 def make_packed(self, packed_string):
195 '''Creates a new instance of Gkey from the packed
198 @param packed_string: string of data separated by field_separator
199 @return new GKEY instance containing the data
201 return GKEY._make(self._unpack_string(packed_string))