| #!/usr/bin/python3 |
| # |
| # Send build performance test report emails |
| # |
| # Copyright (c) 2017, Intel Corporation. |
| # |
| # SPDX-License-Identifier: GPL-2.0-only |
| # |
| |
| import argparse |
| import base64 |
| import logging |
| import os |
| import pwd |
| import re |
| import shutil |
| import smtplib |
| import socket |
| import subprocess |
| import sys |
| import tempfile |
| from email.mime.text import MIMEText |
| |
| |
| # Setup logging |
| logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") |
| log = logging.getLogger('oe-build-perf-report') |
| |
| |
| def check_utils(): |
| """Check that all needed utils are installed in the system""" |
| missing = [] |
| for cmd in ('phantomjs', 'optipng'): |
| if not shutil.which(cmd): |
| missing.append(cmd) |
| if missing: |
| log.error("The following tools are missing: %s", ' '.join(missing)) |
| sys.exit(1) |
| |
| |
| def parse_args(argv): |
| """Parse command line arguments""" |
| description = """Email build perf test report""" |
| parser = argparse.ArgumentParser( |
| formatter_class=argparse.ArgumentDefaultsHelpFormatter, |
| description=description) |
| |
| parser.add_argument('--debug', '-d', action='store_true', |
| help="Verbose logging") |
| parser.add_argument('--quiet', '-q', action='store_true', |
| help="Only print errors") |
| parser.add_argument('--to', action='append', |
| help="Recipients of the email") |
| parser.add_argument('--cc', action='append', |
| help="Carbon copy recipients of the email") |
| parser.add_argument('--bcc', action='append', |
| help="Blind carbon copy recipients of the email") |
| parser.add_argument('--subject', default="Yocto build perf test report", |
| help="Email subject") |
| parser.add_argument('--outdir', '-o', |
| help="Store files in OUTDIR. Can be used to preserve " |
| "the email parts") |
| parser.add_argument('--text', |
| help="Plain text message") |
| |
| args = parser.parse_args(argv) |
| |
| if not args.text: |
| parser.error("Please specify --text") |
| |
| return args |
| |
| |
| def send_email(text_fn, subject, recipients, copy=[], blind_copy=[]): |
| # Generate email message |
| with open(text_fn) as f: |
| msg = MIMEText("Yocto build performance test report.\n" + f.read(), 'plain') |
| |
| pw_data = pwd.getpwuid(os.getuid()) |
| full_name = pw_data.pw_gecos.split(',')[0] |
| email = os.environ.get('EMAIL', |
| '{}@{}'.format(pw_data.pw_name, socket.getfqdn())) |
| msg['From'] = "{} <{}>".format(full_name, email) |
| msg['To'] = ', '.join(recipients) |
| if copy: |
| msg['Cc'] = ', '.join(copy) |
| if blind_copy: |
| msg['Bcc'] = ', '.join(blind_copy) |
| msg['Subject'] = subject |
| |
| # Send email |
| with smtplib.SMTP('localhost') as smtp: |
| smtp.send_message(msg) |
| |
| |
| def main(argv=None): |
| """Script entry point""" |
| args = parse_args(argv) |
| if args.quiet: |
| log.setLevel(logging.ERROR) |
| if args.debug: |
| log.setLevel(logging.DEBUG) |
| |
| check_utils() |
| |
| if args.outdir: |
| outdir = args.outdir |
| if not os.path.exists(outdir): |
| os.mkdir(outdir) |
| else: |
| outdir = tempfile.mkdtemp(dir='.') |
| |
| try: |
| log.debug("Storing email parts in %s", outdir) |
| if args.to: |
| log.info("Sending email to %s", ', '.join(args.to)) |
| if args.cc: |
| log.info("Copying to %s", ', '.join(args.cc)) |
| if args.bcc: |
| log.info("Blind copying to %s", ', '.join(args.bcc)) |
| send_email(args.text, args.subject, args.to, args.cc, args.bcc) |
| except subprocess.CalledProcessError as err: |
| log.error("%s, with output:\n%s", str(err), err.output.decode()) |
| return 1 |
| finally: |
| if not args.outdir: |
| log.debug("Wiping %s", outdir) |
| shutil.rmtree(outdir) |
| |
| return 0 |
| |
| |
| if __name__ == "__main__": |
| sys.exit(main()) |