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