Gentoo Archives: gentoo-commits

From: Brian Dolbec <dolsen@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/gentoo-keys:gsoc-2016 commit in: gkeys/gkeys/
Date: Sat, 24 Dec 2016 09:13:48
Message-Id: 1482555256.e92ddf9481339c1d302ca3a19ef051d355461c46.dolsen@gentoo
1 commit: e92ddf9481339c1d302ca3a19ef051d355461c46
2 Author: aeroniero33 <justthisthing <AT> gmail <DOT> com>
3 AuthorDate: Fri Jun 17 17:40:01 2016 +0000
4 Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
5 CommitDate: Sat Dec 24 04:54:16 2016 +0000
6 URL: https://gitweb.gentoo.org/proj/gentoo-keys.git/commit/?id=e92ddf94
7
8 gkeys actions: Added automatic seeds,keys update capability
9
10 Add more detailed update reporting including the keys removed,
11 revoked/changed, added.
12 <rebase edit>
13 Convert print() to proper self.output()
14 Whitespace cleanup
15 Commit message improvements
16 </edit Brian Dolbec>
17
18 gkeys/gkeys/actions.py | 20 +++++++-------
19 gkeys/gkeys/base.py | 68 +++++++++++++++++++++++++++++++++++++++++++++-
20 gkeys/gkeys/seedhandler.py | 9 +++++-
21 3 files changed, 85 insertions(+), 12 deletions(-)
22
23 diff --git a/gkeys/gkeys/actions.py b/gkeys/gkeys/actions.py
24 index 77d39b1..825f2d9 100644
25 --- a/gkeys/gkeys/actions.py
26 +++ b/gkeys/gkeys/actions.py
27 @@ -133,19 +133,19 @@ class Actions(ActionBase):
28 self.output('', "Update succeeded.\n")
29 messages = fetch_messages + [" Update operation:"] + [install_messages]
30 success, new_gkeys = self.listseed(args)
31 - added_gkeys, changed_gkeys = self.seedhandler.compare_seeds(old_gkeys, new_gkeys)
32 - self.output('', "Updated revoked GKeys:")
33 - if changed_gkeys:
34 - for gkey in changed_gkeys:
35 - self.output(['', changed_gkeys])
36 + added_gkeys, changed_gkeys, removed_gkeys = self.seedhandler.compare_seeds(old_gkeys, new_gkeys)
37 + for gkey in changed_gkeys:
38 + self.output([changed_gkeys], "Updated or revoked GKeys:")
39 else:
40 - self.output('', "No GKeys were revoked")
41 - self.output('', "Added GKeys:")
42 - if added_gkeys:
43 - for gkey in added_gkeys:
44 - self.output(['', added_gkeys])
45 + self.output('', "No GKeys were updated or revoked")
46 + for gkey in added_gkeys:
47 + self.output([added_gkeys], "Added GKeys:")
48 else:
49 self.output('', "No GKeys were added")
50 + for gkey in removed_gkeys:
51 + self.output([removed_gkeys], "Removed GKeys:")
52 + else:
53 + self.output('', "No GKeys were removed")
54 return (success, messages)
55
56 def addseed(self, args):
57
58 diff --git a/gkeys/gkeys/base.py b/gkeys/gkeys/base.py
59 index a0224c0..28dd0b2 100644
60 --- a/gkeys/gkeys/base.py
61 +++ b/gkeys/gkeys/base.py
62 @@ -17,10 +17,20 @@ from __future__ import print_function
63 import argparse
64 import os
65 import sys
66 +import copy
67
68 from gkeys.fileops import ensure_dirs
69 from gkeys.log import log_levels, set_logger
70 +from gkeys.gkey import GKEY
71
72 +if sys.version_info[0] >= 3:
73 + from urllib.request import urlopen
74 + py_input = input
75 + _unicode = str
76 +else:
77 + from urllib2 import urlopen
78 + py_input = raw_input
79 + _unicode = unicode
80
81 if sys.version_info[0] >= 3:
82 unicode = str
83 @@ -291,6 +301,10 @@ class CliBase(object):
84 for opt in options:
85 getattr(self, '_option_%s' % opt)(parser)
86
87 + def warning_output(self, info):
88 + ''' We don't want this message to be spammed 4 times everytime gkeys is run'''
89 + if "Re-fetch cycle timeout of" not in info:
90 + print(info)
91
92 def setup(self, args, configs):
93 '''Set up the args and configs passed in
94 @@ -352,7 +366,59 @@ class CliBase(object):
95 '''
96 # establish our actions instance
97 self.actions = self.cli_config['Actions'](self.config, self.output_results, self.logger)
98 -
99 + # check for seed update
100 + from sslfetch.connections import Connector
101 + connector_output = {
102 + 'info': self.logger.info,
103 + 'debug': self.logger.debug,
104 + 'error': self.logger.error,
105 + 'exception': self.logger.exception,
106 + 'warning': self.warning_output,
107 + 'kwargs-info': {},
108 + 'kwargs-debug': {},
109 + 'kwargs-error': {},
110 + 'kwargs-exception': {},
111 + 'kwargs-warning': {},
112 + }
113 + fetcher = Connector(connector_output, None, "Gentoo Keys")
114 + successes = []
115 + up_to_date = True
116 + categories = list(self.config.defaults['seeds'])
117 + '''Attemp to download seed and seed.sig files for each available category'''
118 + for category in categories:
119 + filepath = self.config.defaults['seedsdir'] + "/" + category + ".seeds"
120 + timestamp_path = filepath + ".timestamp"
121 + url = self.config.defaults['seedurls'][category]
122 + success, signedfile, timestamp = fetcher.fetch_file(
123 + url, filepath, timestamp_path)
124 + if timestamp != "":
125 + up_to_date = False
126 + successes.append(success)
127 + url += ".sig"
128 + filepath += ".sig"
129 + success, signedfile, timestamp = fetcher.fetch_file(
130 + url, filepath, timestamp_path)
131 + if timestamp != "":
132 + up_to_date = False
133 + successes.append(success)
134 + if False not in successes and not up_to_date:
135 + print("Seeds need to be updated")
136 + ack = None
137 + while ack not in ("y", "yes", "n", "no"):
138 + ack = py_input("Would you like to update the seeds now? (y/n) ").lower()
139 + if ack in ("y", "yes"):
140 + custom_args = copy.copy(args)
141 + for attr in GKEY._fields:
142 + if attr != "debug":
143 + custom_args.attr = None
144 + custom_args.category = None
145 + custom_args.action = "update-seed"
146 + print("Updating seeds")
147 + self.run(custom_args)
148 + elif False not in successes:
149 + print("Seeds are up to date")
150 + else:
151 + print("Seed update check failed, check your internet connection.")
152 # run the action
153 func = getattr(self.actions, '%s'
154 % self.cli_config['Action_Map'][args.action]['func'])
155
156 diff --git a/gkeys/gkeys/seedhandler.py b/gkeys/gkeys/seedhandler.py
157 index c7dad2e..90ce583 100644
158 --- a/gkeys/gkeys/seedhandler.py
159 +++ b/gkeys/gkeys/seedhandler.py
160 @@ -78,21 +78,28 @@ class SeedHandler(object):
161 @param seeds2: set of seeds to be compared
162 @return added_gkeys: list of keys that are included in seed2 but not seed1
163 @return changed_gkeys: list of keys that are included in seed1 and seed2 but have been altered
164 + @return removed_gkeys: list of keys that are included in seed1 but not in seed2
165 '''
166 old_gkeys = seeds1[1]
167 new_gkeys = seeds2[1]
168 changed_gkeys = []
169 + old_changed_gkeys = []
170 + removed_gkeys = []
171 added_gkeys = []
172 if old_gkeys:
173 for new_gkey in new_gkeys:
174 for old_gkey in old_gkeys:
175 if new_gkey.nick == old_gkey.nick and new_gkey != old_gkey:
176 changed_gkeys.append(new_gkey)
177 + old_changed_gkeys.append(old_gkey)
178 if new_gkey not in old_gkeys and new_gkey not in changed_gkeys:
179 added_gkeys.append(new_gkey)
180 + for old_gkey in old_gkeys:
181 + if old_gkey not in new_gkeys and old_gkey not in old_changed_gkeys:
182 + removed_gkeys.append(old_gkey)
183 else:
184 added_gkeys = new_gkeys
185 - return(added_gkeys, changed_gkeys)
186 + return(added_gkeys, changed_gkeys, removed_gkeys)
187
188 def load_seeds(self, seedfile=None, filepath=None, refresh=False):
189 '''Load seed file