preliminary coding to make gkeyldap py3 capable
[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
19 from gkeys.log import logger
20 from gkeys.config import GKEY
21
22
23 class Seeds(object):
24     '''Handles all seed key file operations'''
25
26
27     def __init__(self, filepath=None):
28         '''Seeds class init function
29
30         @param filepath: string of the file to load
31         '''
32         self.filename = filepath
33         self.seeds = []
34
35
36     def load(self, filename=None):
37         '''Load the seed file into memory'''
38         if filename:
39             self.filename = filename
40         if not self.filename:
41             logger.debug("Seed: load; Not a valid filename: '%s'" % str(self.filename))
42             return False
43         logger.debug("Seeds: load; Begin loading seed file %s" % self.filename)
44         seedlines = None
45         self.seeds = []
46         try:
47             with open(self.filename) as seedfile:
48                 seedlines = seedfile.readlines()
49         except IOError as err:
50             logger.debug("Seed: load; IOError occurred while loading file")
51             self._error(err)
52             return False
53
54         # initialize a dummy instance, so it can make new ones
55         gkey = GKEY._make([None,None,None,None,None,None])
56         for seed in seedlines:
57             #try:
58             seed = seed.strip('\n')
59             self.seeds.append(gkey.make_packed(seed))
60             #except Exception as err:
61                 #logger.debug("Seed: load; Error splitting seed: %s" % seed)
62                 #logger.debug("Seed: load; ...............parts: %s" % str(parts))
63                 #self._error(err)
64         logger.debug("Seed: load; Completed loading seed file %s" % self.filename)
65         return True
66
67
68     def save(self, filename=None):
69         '''Save the seeds to the file'''
70         if filename:
71             self.filename = filename
72         if not self.filename:
73             logger.debug("Seed: save; Not a valid filename: '%s'" % str(self.filename))
74             return False
75         logger.debug("Seed: save; Begin saving seed file %s" % self.filename)
76         try:
77             with open(self.filename, 'w') as seedfile:
78                 seedlines = [x.packed_string for x in self.seeds]
79                 seedfile.write('\n'.join(seedlines))
80                 seedfile.write("\n")
81         except IOError as err:
82             self._error(err)
83             return False
84         return True
85
86
87     def add(self, gkey):
88         '''Add a new seed key to memory'''
89         if isinstance(gkey, GKEY):
90             self.seeds.append(gkey)
91             return True
92         return False
93
94
95
96     def delete(self, gkey=None, index=None):
97         '''Delete the key from the seeds in memory
98
99         @param gkey: GKEY, the matching GKEY to delete
100         @param index: int, '''
101         if gkey:
102             try:
103                 self.seeds.remove(gkey)
104             except ValueError:
105                 return False
106             return True
107         elif index:
108             self.seeds.pop(index)
109             return True
110
111
112     def list(self, **kwargs):
113         '''List the key or keys matching the kwargs argument or all
114
115         @param kwargs: dict of GKEY._fields and values
116         @returns list
117         '''
118         if not kwargs:
119             return self.seeds
120         if kwargs['nick'] == '*':
121             return self.seeds[:]
122         # proceed with the search
123         # discard any invalid keys
124         keys = set(list(kwargs)).intersection(GKEY._fields)
125         result = self.seeds[:]
126         for key in keys:
127             result = [x for x in result if getattr(x , key) == kwargs[key]]
128         return result
129
130
131     def search(self, pattern):
132         '''Search for the keys matching the regular expression pattern'''
133         pass
134
135
136     def index(self, gkey):
137         '''The index of the gkey in the seeds list
138
139         @param gkey: GKEY, the matching GKEY to delete
140         @return int
141         '''
142         try:
143             index = self.seeds.index(gkey)
144         except ValueError:
145             return None
146         return index
147
148
149     def _error(self, err):
150         '''Class error logging function'''
151         logger.error("Seed: Error processing seed file %s" % self.filename)
152         logger.error("Seed: Error was: %s" % str(err))
153