1 |
commit: b9e64a989cbb143c63de7dc18cff2bec32ddcdd2 |
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 09:40:27 2016 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/gentoo-keys.git/commit/?id=b9e64a98 |
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 c06cd47..bb71496 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 |