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.
15 from collections import namedtuple
18 from pygpg.config import GPGConfig
20 from gkeys.log import logger
21 from gkeys.utils import path
24 # establish the eprefix, initially set so eprefixify can
26 EPREFIX = "@GENTOO_PORTAGE_EPREFIX@"
28 # check and set it if it wasn't
29 if "GENTOO_PORTAGE_EPREFIX" in EPREFIX:
34 class GKeysConfig(GPGConfig):
35 """ Configuration superclass which holds our gentoo-keys
36 config settings for pygpg """
38 def __init__ (self, config=None, root=None, read_configfile=False):
39 """ Class initialiser """
40 GPGConfig.__init__(self)
42 self.root = root or ''
44 self.defaults['config'] = config
45 self.defaults['configdir'] = os.path.dirname(config)
47 self.defaults['configdir'] = path([self.root, EPREFIX, '/etc/gentoo-keys'])
48 self.defaults['config'] = '%(configdir)s/gkeys.conf'
49 self.configparser = None
54 def _add_gkey_defaults(self):
55 self.defaults['keysdir'] = path([self.root, EPREFIX, '/var/gentoo/gkeys'])
56 self.defaults['dev-keydir'] = '%(keysdir)s/devs'
57 self.defaults['release-keydir'] = '%(keysdir)s/release'
58 self.defaults['overlays-keydir'] = '%(keysdir)s/overlays'
59 self.defaults['known-keysfile'] = '%(keysdir)s/knownkeys'
60 self.defaults['release-seedfile'] = '%(configdir)s/release.seeds'
61 self.defaults['dev-seedfile'] = '%(configdir)s/developer.seeds'
65 def read_config(self):
66 '''Reads the config file into memory
68 if "%(configdir)s" in self.defaults['config']:
70 self.defaults['config'] = self.defaults['config'] \
71 % {'configdir': self.defaults['configdir']}
72 defaults = self.get_defaults()
73 # remove some defaults from being entered into the configparser
74 for key in ['gpg_defaults', 'only_usable', 'refetch', 'tasks']:
76 self.configparser = ConfigParser.ConfigParser(defaults)
77 self.configparser.add_section('MAIN')
78 self.configparser.read(defaults['config'])
81 def get_key(self, key, subkey=None):
82 return self._get_(key, subkey)
85 def _get_(self, key, subkey=None):
86 if self.configparser and self.configparser.has_option('MAIN', key):
87 logger.debug("Found %s in configparser... %s"
88 % (key, str(self.configparser.get('MAIN', key))))
89 logger.debug("type(key)= %s"
90 % str(type(self.configparser.get('MAIN', key))))
91 return self.configparser.get('MAIN', key)
93 return super(GKeysConfig, self)._get_(key, subkey)
94 #elif key in self.options:
95 #logger.debug("Found %s in options... %s"
96 #% (key, str(self.options[key])))
97 #return self.options[key]
98 #elif key in self.defaults:
99 #logger.debug("type(key)= %s" %str(type(self.defaults[key])))
100 #logger.debug("Found %s in defaults... %s"
101 #% (key, str(self.defaults[key])))
102 #logger.debug("type(key)= %s" %str(type(self.defaults[key])))
103 #return self.defaults[key]
104 #logger.error("GKeysConfig: _get_; didn't find :", key)
108 class GKEY(namedtuple('GKEY', ['nick', 'name', 'keyid', 'longkeyid',
109 'keyring', 'fingerprint'])):
110 '''Class to hold the relavent info about a key'''
112 field_types = {'nick': str, 'name': str, 'keyid': list,
113 'longkeyid': list, 'keyring': str, 'fingerprint': list}
114 field_separator = "|"
118 def _packed_values(self):
119 '''Returns a list of the field values'''
121 for f in self._fields:
122 v.append(self._pack(f))
126 def packed_string(self):
127 '''Returns a separator joined string of the field values'''
128 return self.field_separator.join([x for x in self._packed_values()])
130 def _unpack_string(self, packed_data):
131 '''Returns a list of the separator joined string of the field values'''
133 data = packed_data.split(self.field_separator)
134 for x in self._fields:
135 values.append(self._unpack(x, data.pop(0)))
138 def _pack(self, field):
139 '''pack field data into a string'''
140 if self.field_types[field] == str:
141 return getattr(self, field)
142 elif self.field_types[field] == list:
143 info = getattr(self, field)
145 return self.list_separator.join(info)
147 # force an empty list to None
150 raise "ERROR packing %s" %str(getattr(self, field))
152 def _unpack(self, field, data):
153 '''unpack field data to the desired type'''
154 if self.field_types[field] == str:
160 # make it an empty list
163 result = data.split(self.list_separator)
166 def make_packed(self, packed_string):
167 '''Creates a new instance of Gkey from the packed
170 @param packed_string: string of data separated by field_separator
171 @return new GKEY instance containing the data
173 return GKEY._make(self._unpack_string(packed_string))