gkeys/actions.py: load_seed(), Upgrade a logger.debug message to logger.error
[gentoo-keys.git] / gkeys / actions.py
1 #
2 #-*- coding:utf-8 -*-
3
4 """
5     Gentoo-keys - actions.py
6
7     Primary api interface module
8
9     @copyright: 2012 by Brian Dolbec <dol-sen@gentoo.org>
10     @license: GNU GPL2, see COPYING for details.
11 """
12
13 from __future__ import print_function
14
15
16 from gkeys.seedhandler import SeedHandler
17 from gkeys.lib import GkeysGPG
18 from gkeys.seed import Seeds
19
20
21 Avialable_Actions = ['listseed', 'addseed', 'removeseed', 'moveseed', 'listkey',
22             'addkey', 'removekey', 'movekey', 'installed']
23
24
25 class Actions(object):
26     '''Primary api actions'''
27
28     def __init__(self, config, output=None, logger=None):
29         self.config = config
30         self.output = output
31         self.logger = logger
32         self.seeds = None
33
34
35     def load_seeds(self, filename):
36         if not filename:
37             self.logger.error("ACTIONS: load_seeds; no filename to load: "
38             "%s" % filename)
39             return None
40         filepath = self.config.get_key(filename + "-seedfile")
41         self.logger.debug("ACTIONS: load_seeds; seeds filepath to load: "
42             "%s" % filepath)
43         seeds = Seeds()
44         seeds.load(filepath)
45         return seeds
46
47
48     def listseed(self, args):
49         '''Action listseed method'''
50         handler = SeedHandler(self.logger)
51         kwargs = handler.build_gkeydict(args)
52         self.logger.debug("ACTIONS: listseed; kwargs: %s" % str(kwargs))
53         if not self.seeds:
54             self.seeds = self.load_seeds(args.seeds)
55         if self.seeds:
56             results = self.seeds.list(**kwargs)
57             return results
58         return None
59
60
61     def addseed(self, args):
62         '''Action addseed method'''
63         handler = SeedHandler(self.logger)
64         gkey = handler.new(args)
65         gkeys = self.listseed(args)
66         if len(gkeys) == 0:
67             self.logger.debug("ACTIONS: addkey; now adding gkey: %s" % str(gkey))
68             success = self.seeds.add(gkey)
69             if success:
70                 success = self.seeds.save()
71                 return ["Successfully Added new seed: %s" % str(success), gkey]
72         else:
73             messages = ["Matching seeds found in seeds file",
74                 "Aborting... \nMatching seeds:"]
75             messages.extend(gkeys)
76             return messages
77
78
79     def removeseed(self, args):
80         '''Action removeseed method'''
81         handler = SeedHandler(self.logger)
82         searchkey = handler.new(args, needkeyid=False, checkintegrity=False)
83         self.logger.debug("ACTIONS: removeseed; gkey: %s" % str(searchkey))
84         gkeys = self.listseed(args)
85         if not gkeys:
86             return ["Failed to Removed seed: No gkeys returned from listseed()",
87                 None]
88         if len(gkeys) == 1:
89             self.logger.debug("ACTIONS: removeseed; now deleting gkey: %s" % str(gkeys[0]))
90             success = self.seeds.delete(gkeys[0])
91             if success:
92                 success = self.seeds.save()
93             return ["Successfully Removed seed: %s" % str(success),
94                 gkeys[0]]
95         elif len(gkeys):
96             messages = ["Too many seeds found to remove"]
97             messages.extend(gkeys)
98             return messages
99         return ["Failed to Remove seed:", searchkey,
100             "No matching seed found"]
101
102
103     def moveseed(self, args):
104         '''Action moveseed method'''
105         handler = SeedHandler(self.logger)
106         searchkey = handler.new(args, needkeyid=False, checkintegrity=False)
107         self.logger.debug("ACTIONS: moveseed; gkey: %s" % str(searchkey))
108         if not self.seeds:
109             self.seeds = self.load_seeds(args.seeds)
110         kwargs = handler.build_gkeydict(args)
111         sourcekeys = self.seeds.list(**kwargs)
112         dest = self.load_seeds(args.destination)
113         destkeys = dest.list(**kwargs)
114         messages = []
115         if len(sourcekeys) == 1 and destkeys == []:
116             self.logger.debug("ACTIONS: moveseed; now adding destination gkey: %s"
117                 % str(sourcekeys[0]))
118             success = dest.add(sourcekeys[0])
119             self.logger.debug("ACTIONS: moveseed; success: %s" %str(success))
120             self.logger.debug("ACTIONS: moveseed; now deleting sourcekey: %s" % str(sourcekeys[0]))
121             success = self.seeds.delete(sourcekeys[0])
122             if success:
123                 success = dest.save()
124                 self.logger.debug("ACTIONS: moveseed; destination saved... %s" %str(success))
125                 success = self.seeds.save()
126             messages.extend(["Successfully Moved %s seed: %s"
127                 % (args.seeds, str(success)), sourcekeys[0]])
128             return messages
129         elif len(sourcekeys):
130             messages = ["Too many seeds found to move"]
131             messages.extend(sourcekeys)
132             return messages
133         messages.append("Failed to Move seed:")
134         messages.append(searchkey)
135         messages.append('\n')
136         messages.append("Source seeds found...")
137         messages.extend(sourcekeys or ["None\n"])
138         messages.append("Destination seeds found...")
139         messages.extend(destkeys or ["None\n"])
140         return messages
141
142
143     def listkey(self, args):
144         '''Action listskey method'''
145         self.seeds = self.load_seeds(args.seeds)
146         if self.seeds:
147             handler = SeedHandler(self.logger)
148             kwargs = handler.build_gkeydict(args)
149             # get the desired seed
150             keyresults = self.seeds.list(**kwargs)
151             if keyresults and not args.nick == '*' and self.output:
152                 self.output(keyresults, "\n Found GKEY seeds:")
153             elif keyresults and self.output:
154                 self.output(['all'], "\n Installed seeds:")
155             else:
156                 self.logger.info("ACTIONS: listkey; "
157                     "Matching seed entry not found")
158                 if args.nick:
159                     return {"Search failed for: %s" % args.nick: False}
160                 elif args.name:
161                     return {"Search failed for: %s" % args.name: False}
162                 else:
163                     return {"Search failed for search term": False}
164             # get confirmation
165             # fill in code here
166             keydir = self.config.get_key(args.seeds + "-keydir")
167             self.logger.debug("ACTIONS: listkey; keysdir = %s" % keydir)
168             self.gpg = GkeysGPG(self.config, keydir)
169             results = {}
170             #failed = []
171             print(" GPG output:")
172             for key in keyresults:
173                 if not key.keydir and not args.nick == '*':
174                     self.logger.debug("ACTIONS: listkey; NO keydir... Ignoring")
175                     return {"Failed: No keyid's found for %s" % key.name : ''}
176                 self.logger.debug("ACTIONS: listkey; listing keydir:"
177                     + str(key.keydir))
178                 results[key.name] = self.gpg.list_keys(key.keydir)
179                 if self.config.options['print_results']:
180                     print(results[key.name].output)
181                     self.logger.debug("data output:\n" +
182                         str(results[key.name].output))
183                     #for result in results[key.name].status.data:
184                         #print("key desired:", key.name, ", keydir listed:",
185                             #result)
186                         #self.logger.debug("data record: " + str(result))
187                 else:
188                     return results
189             return {'done': True}
190         else:
191             return {"No keydirs to list": False}
192
193
194     def addkey(self, args):
195         '''Action addkey method'''
196         handler = SeedHandler(self.logger)
197         kwargs = handler.build_gkeydict(args)
198         self.logger.debug("ACTIONS: listseed; kwargs: %s" % str(kwargs))
199         self.seeds = self.load_seeds(args.seeds)
200         if self.seeds:
201             # get the desired seed
202             keyresults = self.seeds.list(**kwargs)
203             if keyresults and not args.nick == '*' and self.output:
204                 self.output(keyresults, "\n Found GKEY seeds:")
205             elif keyresults and self.output:
206                 self.output(['all'], "\n Installing seeds:")
207             else:
208                 self.logger.info("ACTIONS: addkey; "
209                     "Matching seed entry not found")
210                 if args.nick:
211                     return {"Search failed for: %s" % args.nick: False}
212                 elif args.name:
213                     return {"Search failed for: %s" % args.name: False}
214                 else:
215                     return {"Search failed for search term": False}
216             # get confirmation
217             # fill in code here
218             keydir = self.config.get_key(args.seeds + "-keydir")
219             self.logger.debug("ACTIONS: addkey; keysdir = %s" % keydir)
220             self.gpg = GkeysGPG(self.config, keydir)
221             results = {}
222             failed = []
223             for key in keyresults:
224                 if not key.keyid and not key.longkeyid and not args.nick == '*':
225                     self.logger.debug("ACTIONS: addkey; NO key id's to add... Ignoring")
226                     return {"Failed: No keyid's found for %s" % key.name : ''}
227                 elif not key.keyid and not key.longkeyid:
228                     print("No keyid's found for:", key.nick, key.name, "Skipping...")
229                     failed.append(key)
230                     continue
231                 self.logger.debug("ACTIONS: addkey; adding key:")
232                 self.logger.debug("ACTIONS: " + str(key))
233                 results[key.name] = self.gpg.add_key(key)
234                 for result in results[key.name]:
235                     self.logger.debug("ACTIONS: addkey; result.failed = " +
236                         str(result.failed))
237                 if self.config.options['print_results']:
238                     for result in results[key.name]:
239                         print("key desired:", key.name, ", key added:",
240                             result.username, ", succeeded:",
241                             not result.failed, ", keyid:", result.keyid,
242                             ", fingerprint:", result.fingerprint)
243                         self.logger.debug("stderr_out: " + str(result.stderr_out))
244                         if result.failed:
245                             failed.append(key)
246             if failed and self.output:
247                 self.output(failed, "\n Failed to install:")
248             return {'Completed': True}
249         return {"No seeds to search or install": False}
250
251
252     def removekey(self, args):
253         '''Action removekey method'''
254         pass
255
256
257     def movekey(self, args):
258         '''Action movekey method'''
259         pass
260
261
262     def installed(self, args):
263         '''Action installed method.
264         lists the installed key directories'''
265         pass
266
267
268     def user_confirm(self, message):
269         '''Get input from the user to confirm to proceed
270         with the desired action
271
272         @param message: string, user promt message to display
273         @return boolean: confirmation to proceed or abort
274         '''
275         pass
276