| #!/usr/bin/env python3 |
| # Copyright (C) 2019 The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| # This file should do the same thing when being invoked in any of these ways: |
| # ./traceconv |
| # python traceconv |
| # bash traceconv |
| # cat ./traceconv | bash |
| # cat ./traceconv | python - |
| |
| BASH_FALLBACK = """ " |
| exec python3 - "$@" <<'#'EOF |
| #""" |
| |
| import hashlib |
| import os |
| import sys |
| import subprocess |
| import tempfile |
| import platform |
| |
| |
| TRACE_TO_TEXT_SHAS = { |
| 'linux': 'a37bad26ec5f216e5a249db4ff6ce8b1ecb35ec1', |
| 'mac': 'ffb4ecb6e0d100188f203821f16b3972ac179a7d', |
| } |
| TRACE_TO_TEXT_PATH = tempfile.gettempdir() |
| TRACE_TO_TEXT_BASE_URL = ('https://storage.googleapis.com/perfetto/') |
| |
| |
| def DownloadURL(url, out_file): |
| subprocess.check_call(['curl', '-L', '-#', '-o', out_file, url]) |
| |
| |
| def check_hash(file_name, sha_value): |
| with open(file_name, 'rb') as fd: |
| file_hash = hashlib.sha1(fd.read()).hexdigest() |
| return file_hash == sha_value |
| |
| |
| def load_trace_to_text(platform): |
| sha_value = TRACE_TO_TEXT_SHAS[platform] |
| file_name = 'trace_to_text-' + platform + '-' + sha_value |
| local_file = os.path.join(TRACE_TO_TEXT_PATH, file_name) |
| |
| if os.path.exists(local_file): |
| if not check_hash(local_file, sha_value): |
| os.remove(local_file) |
| else: |
| return local_file |
| |
| url = TRACE_TO_TEXT_BASE_URL + file_name |
| DownloadURL(url, local_file) |
| if not check_hash(local_file, sha_value): |
| os.remove(local_file) |
| raise ValueError("Invalid signature.") |
| os.chmod(local_file, 0o755) |
| return local_file |
| |
| |
| def main(argv): |
| os_name = None |
| if sys.platform.startswith('linux'): |
| os_name = 'linux' |
| elif sys.platform.startswith('darwin'): |
| os_name = 'mac' |
| else: |
| print("Invalid platform: {}".format(sys.platform)) |
| return 1 |
| |
| arch = platform.machine() |
| if arch not in ['x86_64', 'amd64']: |
| print("Prebuilts are only available for x86_64 (found '{}' instead).".format(arch)) |
| print("Follow https://perfetto.dev/docs/contributing/build-instructions to build locally.") |
| return 1 |
| |
| trace_to_text_binary = load_trace_to_text(os_name) |
| os.execv(trace_to_text_binary, [trace_to_text_binary] + argv[1:]) |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main(sys.argv)) |
| |
| #EOF |