From ffff91a8e8d1b29164db89019429a712feca4a18 Mon Sep 17 00:00:00 2001 From: Nick Platt Date: Wed, 13 Apr 2016 22:10:25 -0400 Subject: [PATCH 1/2] rustbuild: Improve error messaging in bootstrap.py For normal invocations, print a short error message and exit. When the verbose option is enabled, also print the backtrace. --- src/bootstrap/bootstrap.py | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/bootstrap/bootstrap.py b/src/bootstrap/bootstrap.py index 5de7e6957c6..5c50599fbf4 100644 --- a/src/bootstrap/bootstrap.py +++ b/src/bootstrap/bootstrap.py @@ -57,9 +57,10 @@ def run(args, verbose=False): ret = subprocess.Popen(args) code = ret.wait() if code != 0: - if not verbose: - print("failed to run: " + ' '.join(args)) - raise RuntimeError("failed to run command") + err = "failed to run: " + ' '.join(args) + if verbose: + raise RuntimeError(err) + sys.exit(err) class RustBuild: def download_rust_nightly(self): @@ -210,7 +211,10 @@ class RustBuild: if sys.platform == 'win32': return 'x86_64-pc-windows-msvc' else: - raise + err = "uname not found" + if self.verbose: + raise Exception(err) + sys.exit(err) # Darwin's `uname -s` lies and always returns i386. We have to use # sysctl instead. @@ -253,7 +257,10 @@ class RustBuild: cputype = 'x86_64' ostype = 'pc-windows-gnu' else: - raise ValueError("unknown OS type: " + ostype) + err = "unknown OS type: " + ostype + if self.verbose: + raise ValueError(err) + sys.exit(err) if cputype in {'i386', 'i486', 'i686', 'i786', 'x86'}: cputype = 'i686' @@ -269,7 +276,10 @@ class RustBuild: elif cputype in {'amd64', 'x86_64', 'x86-64', 'x64'}: cputype = 'x86_64' else: - raise ValueError("unknown cpu type: " + cputype) + err = "unknown cpu type: " + cputype + if self.verbose: + raise ValueError(err) + sys.exit(err) return cputype + '-' + ostype From e0f997d3477fe28c2c5d99229bd1cd0de81604b4 Mon Sep 17 00:00:00 2001 From: Nick Platt Date: Wed, 13 Apr 2016 22:10:42 -0400 Subject: [PATCH 2/2] rustbuild: Verify sha256 of downloaded tarballs --- src/bootstrap/bootstrap.py | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/src/bootstrap/bootstrap.py b/src/bootstrap/bootstrap.py index 5c50599fbf4..84b8ad333c1 100644 --- a/src/bootstrap/bootstrap.py +++ b/src/bootstrap/bootstrap.py @@ -10,6 +10,7 @@ import argparse import contextlib +import hashlib import os import shutil import subprocess @@ -18,13 +19,29 @@ import tarfile def get(url, path, verbose=False): print("downloading " + url) - # see http://serverfault.com/questions/301128/how-to-download - if sys.platform == 'win32': - run(["PowerShell.exe", "/nologo", "-Command", - "(New-Object System.Net.WebClient).DownloadFile('" + url + - "', '" + path + "')"], verbose=verbose) - else: - run(["curl", "-o", path, url], verbose=verbose) + sha_url = url + ".sha256" + sha_path = path + ".sha256" + for _url, _path in ((url, path), (sha_url, sha_path)): + # see http://serverfault.com/questions/301128/how-to-download + if sys.platform == 'win32': + run(["PowerShell.exe", "/nologo", "-Command", + "(New-Object System.Net.WebClient)" + ".DownloadFile('{}', '{}')".format(_url, _path)], + verbose=verbose) + else: + run(["curl", "-o", _path, _url], verbose=verbose) + print("verifying " + path) + with open(path, "rb") as f: + found = hashlib.sha256(f.read()).hexdigest() + with open(sha_path, "r") as f: + expected, _ = f.readline().split() + if found != expected: + err = ("invalid checksum:\n" + " found: {}\n" + " expected: {}".format(found, expected)) + if verbose: + raise RuntimeError(err) + sys.exit(err) def unpack(tarball, dst, verbose=False, match=None): print("extracting " + tarball)