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
18 from gkeys.seedhandler import SeedHandler
19 from gkeys.lib import GkeysGPG
20 from gkeys.seed import Seeds
23 Available_Actions = ['listseed', 'addseed', 'removeseed', 'moveseed',
24 'listseedfiles', 'listkey', 'addkey', 'removekey', 'movekey',
28 class Actions(object):
29 '''Primary api actions'''
31 def __init__(self, config, output=None, logger=None):
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)
45 filepath = self.config.get_key(seeds + "-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: "
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))
62 self.seeds = self.load_seeds(args.seeds, args.seedfile)
64 results = self.seeds.list(**kwargs)
69 def addseed(self, args):
70 '''Action addseed method'''
71 handler = SeedHandler(self.logger)
72 gkey = handler.new(args)
73 gkeys = self.listseed(args)
75 self.logger.debug("ACTIONS: addkey; now adding gkey: %s" % str(gkey))
76 success = self.seeds.add(gkey)
78 success = self.seeds.save()
79 return ["Successfully Added new seed: %s" % str(success), gkey]
81 messages = ["Matching seeds found in seeds file",
82 "Aborting... \nMatching seeds:"]
83 messages.extend(gkeys)
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)
94 return ["Failed to Removed seed: No gkeys returned from listseed()",
97 self.logger.debug("ACTIONS: removeseed; now deleting gkey: %s" % str(gkeys[0]))
98 success = self.seeds.delete(gkeys[0])
100 success = self.seeds.save()
101 return ["Successfully Removed seed: %s" % str(success),
104 messages = ["Too many seeds found to remove"]
105 messages.extend(gkeys)
107 return ["Failed to Remove seed:", searchkey,
108 "No matching seed found"]
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))
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)
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])
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]])
137 elif len(sourcekeys):
138 messages = ["Too many seeds found to move"]
139 messages.extend(sourcekeys)
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"])
151 def listkey(self, args):
152 '''Action listskey method'''
153 self.seeds = self.load_seeds(args.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:")
164 self.logger.info("ACTIONS: listkey; "
165 "Matching seed entry not found")
167 return {"Search failed for: %s" % args.nick: False}
169 return {"Search failed for: %s" % args.name: False}
171 return {"Search failed for search term": False}
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)
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:"
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:",
194 #self.logger.debug("data record: " + str(result))
197 return {'done': True}
199 return {"No keydirs to list": False}
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)
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:")
216 self.logger.info("ACTIONS: addkey; "
217 "Matching seed entry not found")
219 return {"Search failed for: %s" % args.nick: False}
221 return {"Search failed for: %s" % args.name: False}
223 return {"Search failed for search term": False}
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)
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...")
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 = " +
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))
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}
260 def removekey(self, args):
261 '''Action removekey method'''
265 def movekey(self, args):
266 '''Action movekey method'''
270 def installed(self, args):
271 '''Action installed method.
272 lists the installed key directories'''
276 def user_confirm(self, message):
277 '''Get input from the user to confirm to proceed
278 with the desired action
280 @param message: string, user promt message to display
281 @return boolean: confirmation to proceed or abort
286 def listseedfiles(self, args):
288 seedsdir = self.config.get_key('seedsdir')
289 for files in os.listdir(seedsdir):
290 if files.endswith('.seeds'):
291 seedfile.append(files)
292 return {"Seed files found at path: %s\n %s"
293 % (seedsdir, "\n ".join(seedfile)): True}