switch seed handling from list to dictionary
[gentoo-keys.git] / gkeys / seed.py
1 #
2 #-*- coding:utf-8 -*-
3
4 '''Gentoo-keys - seed.py
5 This is gentoo-keys superclass which wraps the pyGPG lib
6 with gentoo-keys specific convienience functions.
7
8  Distributed under the terms of the GNU General Public License v2
9
10  Copyright:
11              (c) 2011 Brian Dolbec
12              Distributed under the terms of the GNU General Public License v2
13
14  Author(s):
15              Brian Dolbec <dolsen@gentoo.org>
16
17 '''
18 import json
19
20 from gkeys.log import logger
21 from gkeys.config import GKEY
22
23
24 class Seeds(object):
25     '''Handles all seed key file operations'''
26
27
28     def __init__(self, filepath=None):
29         '''Seeds class init function
30
31         @param filepath: string of the file to load
32         '''
33         self.filename = filepath
34         self.seeds = {}
35
36
37     def load(self, filename=None):
38         '''Load the seed file into memory'''
39         if filename:
40             self.filename = filename
41         if not self.filename:
42             logger.debug("Seed: load; Not a valid filename: '%s'" % str(self.filename))
43             return False
44         logger.debug("Seeds: load; Begin loading seed file %s" % self.filename)
45         seedlines = None
46         self.seeds = {}
47         try:
48             with open(self.filename) as seedfile:
49                 seedlines = json.load(seedfile)
50         except IOError as err:
51             logger.debug("Seed: load; IOError occurred while loading file")
52             self._error(err)
53             return False
54         for seed in seedlines.items():
55             #try:
56             self.seeds[seed[0]] = GKEY(**seed[1])
57             #except Exception as err:
58                 #logger.debug("Seed: load; Error splitting seed: %s" % seed)
59                 #logger.debug("Seed: load; ...............parts: %s" % str(parts))
60                 #self._error(err)
61         logger.debug("Seed: load; Completed loading seed file %s" % self.filename)
62         return True
63
64
65     def save(self, filename=None):
66         '''Save the seeds to the file'''
67         if filename:
68             self.filename = filename
69         if not self.filename:
70             logger.debug("Seed: save; Not a valid filename: '%s'" % str(self.filename))
71             return False
72         logger.debug("Seed: save; Begin saving seed file %s" % self.filename)
73         try:
74             with open(self.filename, 'w') as seedfile:
75                 seedfile.write(self._seeds2json(self.seeds))
76                 seedfile.write("\n")
77         except IOError as err:
78             self._error(err)
79             return False
80         return True
81
82
83     def add(self, dev, gkey):
84         '''Add a new seed key to memory'''
85         if isinstance(gkey, dict) or isinstance(gkey, GKEY):
86             self.seeds[dev] = gkey
87             return True
88         return False
89
90
91     def delete(self, gkey=None, index=None):
92         '''Delete the key from the seeds in memory
93
94         @param gkey: GKEY, the matching GKEY to delete
95         @param index: int, '''
96         if gkey:
97             try:
98                 self.seeds.pop(getattr(gkey[0], 'nick')[0], None)
99             except ValueError:
100                 return False
101             return True
102         elif index:
103             self.seeds.pop(index)
104             return True
105
106
107     def list(self, **kwargs):
108         '''List the key or keys matching the kwargs argument or all
109
110         @param kwargs: dict of GKEY._fields and values
111         @returns list
112         '''
113         if not kwargs or kwargs['nick'] == '*':
114             return self.seeds.values()[0]
115         # proceed with the search
116         # discard any invalid keys
117         keys = kwargs
118         result = self.seeds
119         for key in keys:
120             result = {dev: gkey for dev, gkey in result.items() if kwargs[key] in getattr(gkey, key)}
121         return result.values()
122
123
124     def search(self, pattern):
125         '''Search for the keys matching the regular expression pattern'''
126         pass
127
128
129     def index(self, gkey):
130         '''The index of the gkey in the seeds list
131
132         @param gkey: GKEY, the matching GKEY to delete
133         @return int
134         '''
135         try:
136             index = self.seeds.index(gkey)
137         except ValueError:
138             return None
139         return index
140
141
142     def _error(self, err):
143         '''Class error logging function'''
144         logger.error("Seed: Error processing seed file %s" % self.filename)
145         logger.error("Seed: Error was: %s" % str(err))
146
147
148     def _seeds2json(self, seeds):
149         is_gkey=False
150         if isinstance(seeds.values()[0], GKEY):
151             is_gkey = True
152         for dev, value in seeds.items():
153             if is_gkey:
154                 seeds[dev] = dict(value._asdict())
155         return json.dumps(seeds, sort_keys=True, indent=4)