5 Gentoo-keys - actions.py
7 Primary api interface module
9 @copyright: 2012 by Brian Dolbec <dol-sen@gentoo.org>
10 @license: GNU GPL2, see COPYING for details.
13 from __future__ import print_function
16 from gkeys.config import GKEY
17 from gkeys.lib import GkeysGPG
18 from gkeys.seed import Seeds
21 Avialable_Actions = ['listseed', 'addseed', 'removeseed', 'moveseed', 'listkey',
22 'addkey', 'removekey', 'movekey', 'installed']
25 class Actions(object):
26 '''Primary api actions'''
28 def __init__(self, config, output=None, logger=None):
36 def build_gkeydict(args):
38 for x in GKEY._fields:
40 value = getattr(args, x)
43 except AttributeError:
49 def build_gkeylist(args):
51 for x in GKEY._fields:
53 keyinfo.append(getattr(args, x))
54 except AttributeError:
59 def load_seeds(self, filename):
61 self.logger.debug("ACTIONS: load_seeds; no filename to load: "
64 filepath = self.config.get_key(filename + "-seedfile")
65 self.logger.debug("ACTIONS: load_seeds; seeds filepath to load: "
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))
77 self.seeds = self.load_seeds(args.seeds)
79 results = self.seeds.list(**kwargs)
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)
91 self.logger.debug("ACTIONS: addkey; now adding gkey: %s" % str(gkey))
92 success = self.seeds.add(gkey)
94 success = self.seeds.save()
95 return ["Successfully Added new seed: %s" % str(success), gkey]
97 messages = ["Matching seeds found in seeds file",
98 "Aborting... \nMatching seeds:"]
99 messages.extend(gkeys)
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)
110 self.logger.debug("ACTIONS: removeseed; now deleting gkey: %s" % str(gkeys[0]))
111 success = self.seeds.delete(gkeys[0])
113 success = self.seeds.save()
114 return ["Successfully Removed seed: %s" % str(success),
117 messages = ["Too many seeds found to remove"]
118 messages.extend(gkeys)
120 return ["Failed to Remove seed:", searchkey,
121 "No matching seed found"]
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))
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)
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])
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]])
150 elif len(sourcekeys):
151 messages = ["Too many seeds found to move"]
152 messages.extend(sourcekeys)
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"])
164 def listkey(self, args):
165 '''Action listskey method'''
166 self.seeds = self.load_seeds(args.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:")
176 self.logger.info("ACTIONS: listkey; "
177 "Matching seed entry not found")
179 return {"Search failed for: %s" % args.nick: False}
181 return {"Search failed for: %s" % args.name: False}
183 return {"Search failed for search term": False}
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)
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:"
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:",
206 #self.logger.debug("data record: " + str(result))
209 return {'done': True}
211 return {"No keydirs to list": False}
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)
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:")
227 self.logger.info("ACTIONS: addkey; "
228 "Matching seed entry not found")
230 return {"Search failed for: %s" % args.nick: False}
232 return {"Search failed for: %s" % args.name: False}
234 return {"Search failed for search term": False}
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)
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...")
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 = " +
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))
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}
271 def removekey(self, args):
272 '''Action removekey method'''
276 def movekey(self, args):
277 '''Action movekey method'''
281 def installed(self, args):
282 '''Action installed method.
283 lists the installed key directories'''
287 def user_confirm(self, message):
288 '''Get input from the user to confirm to proceed
289 with the desired action
291 @param message: string, user promt message to display
292 @return boolean: confirmation to proceed or abort