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