When buildtools are fetched externally (e.g. by bitbake-setup using bb.fetch with checksum verification), install-buildtools does not need to download or verify the file again.
Add --local-file to accept a path to a pre-downloaded installer, skipping the download and checksum steps. The existing standalone download behaviour is preserved in the else branch. Signed-off-by: Jaipaul Cheernam <[email protected]> Reviewed-by: Daniel Turull <[email protected]> --- scripts/install-buildtools | 109 +++++++++++++++++++++---------------- 1 file changed, 62 insertions(+), 47 deletions(-) diff --git a/scripts/install-buildtools b/scripts/install-buildtools index 723edd793e..943770c84c 100755 --- a/scripts/install-buildtools +++ b/scripts/install-buildtools @@ -130,6 +130,10 @@ def main(): description="Buildtools installation helper", add_help=False, formatter_class=argparse.RawTextHelpFormatter) + parser.add_argument('--local-file', + help='path to a pre-downloaded buildtools installer file.\n' + 'Cannot be combined with --url or --filename.', + action='store') parser.add_argument('-u', '--url', help='URL from where to fetch buildtools SDK installer, not ' 'including filename (optional)\n' @@ -243,62 +247,73 @@ def main(): os.makedirs(sdk_dir, exist_ok=True) try: # Fetch installer - logger.info("Fetching buildtools installer") - tmpbuildtools = os.path.join(sdk_dir, filename) - with open(os.path.join(sdk_dir, 'buildtools_url'), 'w') as f: - f.write(buildtools_url) - ret = subprocess.call("wget -q -O %s %s" % - (tmpbuildtools, buildtools_url), shell=True) - if ret != 0: - logger.error("Could not download file from %s" % buildtools_url) - return ret - - # Verify checksum - if args.check: - logger.info("Fetching buildtools installer checksum") - checksum_type = "sha256sum" - checksum_url = "{}.{}".format(buildtools_url, checksum_type) - checksum_filename = "{}.{}".format(filename, checksum_type) - tmpbuildtools_checksum = os.path.join(sdk_dir, checksum_filename) - with open(os.path.join(sdk_dir, 'checksum_url'), 'w') as f: - f.write(checksum_url) - ret = subprocess.call("wget -q -O %s %s" % - (tmpbuildtools_checksum, checksum_url), shell=True) + if args.local_file: + if args.url or args.filename: + parser.error("--local-file cannot be combined with --url or --filename") + tmpbuildtools = os.path.abspath(args.local_file) + if not os.path.exists(tmpbuildtools): + logger.error("Local file not found: %s" % tmpbuildtools) + return 1 + filename = os.path.basename(tmpbuildtools) + else: + logger.info("Fetching buildtools installer") + tmpbuildtools = os.path.join(sdk_dir, filename) + with open(os.path.join(sdk_dir, 'buildtools_url'), 'w') as f: + f.write(buildtools_url) + ret = subprocess.call(["wget", "-q", "-O", tmpbuildtools, buildtools_url]) if ret != 0: - logger.error("Could not download file from %s" % checksum_url) + logger.error("Could not download file from %s" % buildtools_url) return ret - regex = re.compile(r"^(?P<checksum>[0-9a-f]+)\s+(?P<path>.*/)?(?P<filename>.*)$") - with open(tmpbuildtools_checksum, 'rb') as f: - original = f.read() - m = re.search(regex, original.decode("utf-8")) - logger.debug("checksum regex match: %s" % m) - logger.debug("checksum: %s" % m.group('checksum')) - logger.debug("path: %s" % m.group('path')) - logger.debug("filename: %s" % m.group('filename')) - if filename != m.group('filename'): - logger.error("Filename does not match name in checksum") + + # Verify checksum + if args.check: + logger.info("Fetching buildtools installer checksum") + checksum_type = "sha256sum" + checksum_url = "{}.{}".format(buildtools_url, checksum_type) + checksum_filename = "{}.{}".format(filename, checksum_type) + tmpbuildtools_checksum = os.path.join(sdk_dir, checksum_filename) + with open(os.path.join(sdk_dir, 'checksum_url'), 'w') as f: + f.write(checksum_url) + ret = subprocess.call(["wget", "-q", "-O", tmpbuildtools_checksum, checksum_url]) + if ret != 0: + logger.error("Could not download file from %s" % checksum_url) + return ret + regex = re.compile(r"^(?P<checksum>[0-9a-f]+)\s+(?P<path>.*/)?(?P<filename>.*)$") + with open(tmpbuildtools_checksum, 'rb') as f: + original = f.read() + m = re.search(regex, original.decode("utf-8")) + logger.debug("checksum regex match: %s" % m) + logger.debug("checksum: %s" % m.group('checksum')) + logger.debug("path: %s" % m.group('path')) + logger.debug("filename: %s" % m.group('filename')) + if filename != m.group('filename'): + logger.error("Filename does not match name in checksum") + return 1 + checksum = m.group('checksum') + checksum_value = sha256_file(tmpbuildtools) + if checksum == checksum_value: + logger.info("Checksum success") + else: + logger.error("Checksum %s expected. Actual checksum is %s." % + (checksum, checksum_value)) return 1 - checksum = m.group('checksum') - checksum_value = sha256_file(tmpbuildtools) - if checksum == checksum_value: - logger.info("Checksum success") - else: - logger.error("Checksum %s expected. Actual checksum is %s." % - (checksum, checksum_value)) - return 1 # Make installer executable - logger.info("Making installer executable") - st = os.stat(tmpbuildtools) - os.chmod(tmpbuildtools, st.st_mode | stat.S_IEXEC) - logger.debug(os.stat(tmpbuildtools)) + if args.local_file: + # Avoid mutating caller-owned file; invoke via /bin/sh instead + cmd = ["/bin/sh", tmpbuildtools] + else: + logger.info("Making installer executable") + st = os.stat(tmpbuildtools) + os.chmod(tmpbuildtools, st.st_mode | stat.S_IEXEC) + logger.debug(os.stat(tmpbuildtools)) + cmd = [tmpbuildtools] if args.directory: install_dir = os.path.abspath(args.directory) - ret = subprocess.call("%s -d %s -y" % - (tmpbuildtools, install_dir), shell=True) + ret = subprocess.call(cmd + ["-d", install_dir, "-y"]) else: install_dir = "/opt/poky/%s" % args.installer_version - ret = subprocess.call("%s -y" % tmpbuildtools, shell=True) + ret = subprocess.call(cmd + ["-y"]) if ret != 0: logger.error("Could not run buildtools installer") return ret -- 2.34.1
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#239551): https://lists.openembedded.org/g/openembedded-core/message/239551 Mute This Topic: https://lists.openembedded.org/mt/119970828/21656 Group Owner: [email protected] Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [[email protected]] -=-=-=-=-=-=-=-=-=-=-=-
