summaryrefslogtreecommitdiffstats
path: root/meta
diff options
context:
space:
mode:
authorRandy Witt <randy.e.witt@linux.intel.com>2016-04-07 16:34:49 -0700
committerRichard Purdie <richard.purdie@linuxfoundation.org>2016-04-09 23:00:43 +0100
commit7e902807cb6c6d453972a3af4d632e627aa5e1fb (patch)
treefb3c6d39285fc2d8b083ae13ff5da75f055ba0a6 /meta
parent7ce800c3a24bcbe14b6d204c177f89ba836cfd70 (diff)
downloadpoky-7e902807cb6c6d453972a3af4d632e627aa5e1fb.tar.gz
sstatesig.py: Split single locked sigs check into multiple checks
Add the SIGGEN_LOCKEDSIGS_TASKSIG_CHECK and SIGGEN_LOCKEDSIGS_SSTATE_EXISTS_CHECK variables to replace SIGGEN_LOCKEDSIGS_CHECK_LEVEL. SIGGEN_LOCKEDSIGS_TASKSIG_CHECK will no control whether there is a warning or error if a task's hash in the locked signature file doesn't match the computed hash from the current metadata. SIGGEN_LOCKEDSIGS_SSTATE_EXISTS_CHECK will control whther there is a warning or error if a task that supports sstate is in the locked signature file, but no sstate exists for the task. Previously you could only have warning/errors for both controlled by SIGGEN_LOCKEDSIGS_CHECK_LEVEL. This was an issue in the extensible sdk, because we know sstate won't exist for certain items in the reverse dependencies list for tasks. However, we still want to error if task signatures don't match. [YOCTO #9195] (From OE-Core rev: 0fe2a5e5ffd01e926d0f3d4c78ad9910296e2d1a) Signed-off-by: Randy Witt <randy.e.witt@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
-rw-r--r--meta/classes/sstate.bbclass8
-rw-r--r--meta/lib/oe/sstatesig.py27
-rw-r--r--meta/lib/oeqa/selftest/signing.py4
3 files changed, 30 insertions, 9 deletions
diff --git a/meta/classes/sstate.bbclass b/meta/classes/sstate.bbclass
index 3234e7914c..8c623271ad 100644
--- a/meta/classes/sstate.bbclass
+++ b/meta/classes/sstate.bbclass
@@ -53,7 +53,13 @@ SSTATEPOSTINSTFUNCS = ""
53EXTRA_STAGING_FIXMES ?= "" 53EXTRA_STAGING_FIXMES ?= ""
54SSTATECLEANFUNCS = "" 54SSTATECLEANFUNCS = ""
55 55
56SIGGEN_LOCKEDSIGS_CHECK_LEVEL ?= 'error' 56# Check whether sstate exists for tasks that support sstate and are in the
57# locked signatures file.
58SIGGEN_LOCKEDSIGS_SSTATE_EXISTS_CHECK ?= 'error'
59
60# Check whether the task's computed hash matches the task's hash in the
61# locked signatures file.
62SIGGEN_LOCKEDSIGS_TASKSIG_CHECK ?= "error"
57 63
58# The GnuPG key ID and passphrase to use to sign sstate archives (or unset to 64# The GnuPG key ID and passphrase to use to sign sstate archives (or unset to
59# not sign) 65# not sign)
diff --git a/meta/lib/oe/sstatesig.py b/meta/lib/oe/sstatesig.py
index 5828a9def8..b2319ff213 100644
--- a/meta/lib/oe/sstatesig.py
+++ b/meta/lib/oe/sstatesig.py
@@ -189,20 +189,35 @@ class SignatureGeneratorOEBasicHash(bb.siggen.SignatureGeneratorBasicHash):
189 f.write('SIGGEN_LOCKEDSIGS_TYPES_%s = "%s"' % (self.machine, " ".join(types.keys()))) 189 f.write('SIGGEN_LOCKEDSIGS_TYPES_%s = "%s"' % (self.machine, " ".join(types.keys())))
190 190
191 def checkhashes(self, missed, ret, sq_fn, sq_task, sq_hash, sq_hashfn, d): 191 def checkhashes(self, missed, ret, sq_fn, sq_task, sq_hash, sq_hashfn, d):
192 checklevel = d.getVar("SIGGEN_LOCKEDSIGS_CHECK_LEVEL", True) 192 warn_msgs = []
193 error_msgs = []
194 sstate_missing_msgs = []
195
193 for task in range(len(sq_fn)): 196 for task in range(len(sq_fn)):
194 if task not in ret: 197 if task not in ret:
195 for pn in self.lockedsigs: 198 for pn in self.lockedsigs:
196 if sq_hash[task] in self.lockedsigs[pn].itervalues(): 199 if sq_hash[task] in self.lockedsigs[pn].itervalues():
197 if sq_task[task] == 'do_shared_workdir': 200 if sq_task[task] == 'do_shared_workdir':
198 continue 201 continue
199 self.mismatch_msgs.append("Locked sig is set for %s:%s (%s) yet not in sstate cache?" 202 sstate_missing_msgs.append("Locked sig is set for %s:%s (%s) yet not in sstate cache?"
200 % (pn, sq_task[task], sq_hash[task])) 203 % (pn, sq_task[task], sq_hash[task]))
201 204
202 if self.mismatch_msgs and checklevel == 'warn': 205 checklevel = d.getVar("SIGGEN_LOCKEDSIGS_TASKSIG_CHECK", True)
203 bb.warn("\n".join(self.mismatch_msgs)) 206 if checklevel == 'warn':
204 elif self.mismatch_msgs and checklevel == 'error': 207 warn_msgs += self.mismatch_msgs
205 bb.fatal("\n".join(self.mismatch_msgs)) 208 elif checklevel == 'error':
209 error_msgs += self.mismatch_msgs
210
211 checklevel = d.getVar("SIGGEN_LOCKEDSIGS_SSTATE_EXISTS_CHECK", True)
212 if checklevel == 'warn':
213 warn_msgs += sstate_missing_msgs
214 elif checklevel == 'error':
215 error_msgs += sstate_missing_msgs
216
217 if warn_msgs:
218 bb.warn("\n".join(warn_msgs))
219 if error_msgs:
220 bb.fatal("\n".join(error_msgs))
206 221
207 222
208# Insert these classes into siggen's namespace so it can see and select them 223# Insert these classes into siggen's namespace so it can see and select them
diff --git a/meta/lib/oeqa/selftest/signing.py b/meta/lib/oeqa/selftest/signing.py
index d2b3f0003c..1babca07df 100644
--- a/meta/lib/oeqa/selftest/signing.py
+++ b/meta/lib/oeqa/selftest/signing.py
@@ -160,7 +160,7 @@ class LockedSignatures(oeSelfTest):
160 bitbake('-S none %s' % test_recipe) 160 bitbake('-S none %s' % test_recipe)
161 161
162 feature = 'require %s\n' % locked_sigs_file 162 feature = 'require %s\n' % locked_sigs_file
163 feature += 'SIGGEN_LOCKEDSIGS_CHECK_LEVEL = "warn"\n' 163 feature += 'SIGGEN_LOCKEDSIGS_TASKSIG_CHECK = "warn"\n'
164 self.write_config(feature) 164 self.write_config(feature)
165 165
166 # Build a locked recipe 166 # Build a locked recipe
@@ -180,7 +180,7 @@ class LockedSignatures(oeSelfTest):
180 ret = bitbake(test_recipe) 180 ret = bitbake(test_recipe)
181 181
182 # Verify you get the warning and that the real task *isn't* run (i.e. the locked signature has worked) 182 # Verify you get the warning and that the real task *isn't* run (i.e. the locked signature has worked)
183 patt = r'WARNING: The %s:do_package sig \S+ changed, use locked sig \S+ to instead' % test_recipe 183 patt = r'WARNING: The %s:do_package sig is computed to be \S+, but the sig is locked to \S+ in SIGGEN_LOCKEDSIGS\S+' % test_recipe
184 found_warn = re.search(patt, ret.output) 184 found_warn = re.search(patt, ret.output)
185 185
186 self.assertIsNotNone(found_warn, "Didn't find the expected warning message. Output: %s" % ret.output) 186 self.assertIsNotNone(found_warn, "Didn't find the expected warning message. Output: %s" % ret.output)