poky/scripts/patchtest-send-results
Trevor Gamblin d1c21e9eea patchtest-send-results: check max line length, simplify responses
Check that the maximum line length of the testresult file is less than
220 characters, to help guard against malicious changes being sent in
email responses. If any line exceeds this length, replace the normal
testresults used in the response with a line stating that tests failed,
but the results could not be processed. Also clean up the respone
substrings slightly to go along with the change.

(From OE-Core rev: b0d53cf587dc9afb97f00c1089e45b758e96dd7c)

Signed-off-by: Trevor Gamblin <tgamblin@baylibre.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2023-10-25 15:52:13 +01:00

87 lines
3.1 KiB
Python
Executable File

#!/usr/bin/env python3
# ex:ts=4:sw=4:sts=4:et
# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
#
# patchtest: execute all unittest test cases discovered for a single patch
# Note that this script is currently under development and has been
# hard-coded with default values for testing purposes. This script
# should not be used without changing the default recipient, at minimum.
#
# Copyright (C) 2023 BayLibre Inc.
#
# SPDX-License-Identifier: GPL-2.0-only
#
import argparse
import boto3
import configparser
import mailbox
import os
import sys
greeting = """Thank you for your submission. Patchtest identified one
or more issues with the patch. Please see the log below for
more information:\n\n---\n"""
suggestions = """\n---\n\nPlease address the issues identified and
submit a new revision of the patch, or alternatively, reply to this
email with an explanation of why the patch format should be accepted. If
you believe these results are due to an error in patchtest, please
submit a bug at https://bugzilla.yoctoproject.org/ (use the 'Patchtest'
category under 'Yocto Project Subprojects'). Thank you!"""
parser = argparse.ArgumentParser(description="Send patchtest results to a submitter for a given patch")
parser.add_argument("-p", "--patch", dest="patch", required=True, help="The patch file to summarize")
args = parser.parse_args()
if not os.path.exists(args.patch):
print(f"Patch '{args.patch}' not found - did you provide the right path?")
sys.exit(1)
elif not os.path.exists(args.patch + ".testresult"):
print(f"Found patch '{args.patch}' but '{args.patch}.testresult' was not present. Have you run patchtest on the patch?")
sys.exit(1)
result_file = args.patch + ".testresult"
result_basename = os.path.basename(args.patch)
testresult = None
with open(result_file, "r") as f:
testresult = f.read()
# we know these patch files will only contain a single patch, so only
# worry about the first element for getting the subject
mbox = mailbox.mbox(args.patch)
mbox_subject = mbox[0]['subject']
subject_line = f"Patchtest results for {mbox_subject}"
if "FAIL" in testresult:
reply_contents = None
if len(max(open(result_file, 'r'), key=len)) > 220:
warning = "Tests failed for the patch, but the results log could not be processed due to excessive result line length."
reply_contents = greeting + warning + suggestions
else:
reply_contents = greeting + testresult + suggestions
ses_client = boto3.client('ses', region_name='us-west-2')
response = ses_client.send_email(
Source='patchtest@automation.yoctoproject.org',
Destination={
'ToAddresses': ['test-list@lists.yoctoproject.org'],
},
ReplyToAddresses=['test-list@lists.yoctoproject.org'],
Message={
'Subject': {
'Data': subject_line,
'Charset': 'utf-8'
},
'Body': {
'Text': {
'Data': reply_contents,
'Charset': 'utf-8'
}
}
}
)
else:
print(f"No failures identified for {args.patch}.")