diff options
Diffstat (limited to 'gkeys/gkeys/seed.py')
-rw-r--r-- | gkeys/gkeys/seed.py | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/gkeys/gkeys/seed.py b/gkeys/gkeys/seed.py new file mode 100644 index 0000000..f0cb019 --- /dev/null +++ b/gkeys/gkeys/seed.py @@ -0,0 +1,192 @@ +# +#-*- coding:utf-8 -*- + +'''Gentoo-keys - seed.py +This is gentoo-keys superclass which wraps the pyGPG lib +with gentoo-keys specific convienience functions. + + Distributed under the terms of the GNU General Public License v2 + + Copyright: + (c) 2011 Brian Dolbec + Distributed under the terms of the GNU General Public License v2 + + Author(s): + Brian Dolbec <dolsen@gentoo.org> + +''' + +import json +import os + +from gkeys.log import logger +from gkeys.config import GKEY +from gkeys.fileops import ensure_dirs + + +class Seeds(object): + '''Handles all seed key file operations''' + + + def __init__(self, filepath=None, config=None): + '''Seeds class init function + + @param filepath: string of the file to load + ''' + self.filename = filepath + self.config = config + self.seeds = {} + + + def load(self, filename=None, trap_errors=True): + '''Load the seed file into memory''' + if filename: + self.filename = filename + if not self.filename: + logger.debug("Seed: load; Not a valid filename: '%s'" % str(self.filename)) + return False + logger.debug("Seeds: load; Begin loading seed file %s" % self.filename) + seedlines = None + self.seeds = {} + try: + with open(self.filename, "r+") as seedfile: + seedlines = json.load(seedfile) + except IOError as err: + logger.debug("Seed: load; IOError occurred while loading file") + if trap_errors: + self._error(err) + return False + for seed in list(seedlines.items()): + #try: + self.seeds[seed[0]] = GKEY(**seed[1]) + #except Exception as err: + #logger.debug("Seed: load; Error splitting seed: %s" % seed) + #logger.debug("Seed: load; ...............parts: %s" % str(parts)) + #self._error(err) + logger.debug("Seed: load; Completed loading seed file %s" % self.filename) + return True + + + def save(self, filename=None): + '''Save the seeds to the file''' + if filename: + self.filename = filename + if not self.filename: + logger.debug("Seed: save; Not a valid filename: '%s'" % str(self.filename)) + return False + logger.debug("Seed: save; Begin saving seed file %s" % self.filename) + ensure_dirs(os.path.split(self.filename)[0], + mode=int(self.config.get_key('permissions', "directories"),0), + fatal=True) + os.umask(int(self.config.get_key("permissions", "files"),0)) + try: + with open(self.filename, 'w') as seedfile: + seedfile.write(self._seeds2json(self.seeds)) + seedfile.write("\n") + except IOError as err: + self._error(err) + return False + return True + + + def add(self, dev, gkey): + '''Add a new seed key to memory''' + if isinstance(gkey, dict) or isinstance(gkey, GKEY): + self.seeds[dev] = gkey + return True + return False + + + def delete(self, gkey=None): + '''Delete the key from the seeds in memory + + @param gkey: GKEY, the matching GKEY to delete + ''' + if gkey: + if isinstance(gkey, dict): + nick = gkey['nick'] + elif isinstance(gkey, GKEY): + nick = gkey.nick + try: + self.seeds.pop(nick, None) + except ValueError: + return False + return True + + + def list(self, **kwargs): + '''List the key or keys matching the kwargs argument or all + + @param kwargs: dict of GKEY._fields and values + @returns list + ''' + if not kwargs or ('nick' in kwargs and kwargs['nick'] == '*'): + return sorted(self.seeds.values()) + # proceed with the search + # discard any invalid keys + keys = kwargs + result = self.seeds + for key in keys: + if key in ['fingerprint', 'keyid']: + kwargs[key] = [x.replace(' ', '').upper() for x in kwargs[key]] + if key in ['fingerprint']: + result = {dev: gkey for dev, gkey in list(result.items()) if kwargs[key][0] in getattr(gkey, key)} + elif key in ['keyid']: + searchids = [x.lstrip('0X') for x in kwargs[key]] + res = {} + for dev, gkey in list(result.items()): + keyids = [x.lstrip("0x") for x in getattr(gkey, key)] + for keyid in searchids: + if keyid in keyids: + res[dev] = gkey + break + result = res + else: + result = {dev: gkey for dev, gkey in list(result.items()) if kwargs[key].lower() in getattr(gkey, key).lower()} + return sorted(result.values()) + + + def search(self, pattern): + '''Search for the keys matching the regular expression pattern''' + pass + + + def nick_search(self, nick): + '''Searches the seeds for a matching nick + + @param nick: string + @returns GKEY instance or None + ''' + try: + return self.seeds[nick] + except KeyError: + return None + + + def _error(self, err): + '''Class error logging function''' + logger.error("Seed: Error processing seed file %s" % self.filename) + logger.error("Seed: Error was: %s" % str(err)) + + + def _seeds2json(self, seeds): + is_gkey = False + if not seeds: + seeds = {} + elif isinstance(list(seeds.values())[0], GKEY): + is_gkey = True + for dev, value in list(seeds.items()): + if is_gkey: + seeds[dev] = dict(value._asdict()) + return json.dumps(seeds, sort_keys=True, indent=4) + + + def update(self, gkey): + '''Looks for existance of a matching nick already in the seedfile + if it exists. Then either adds or replaces the gkey + @param gkey: GKEY instance + ''' + oldkey = self.nick_search(gkey.nick) + if oldkey: + self.delete(oldkey) + self.add(gkey.nick, gkey) |