1#!/usr/bin/env python 2# Copyright (C) 2019 The Android Open Source Project 3# 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# http://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15 16# This file should do the same thing when being invoked in any of these ways: 17# ./traceconv 18# python traceconv 19# bash traceconv 20# cat ./traceconv | bash 21# cat ./traceconv | python - 22 23BASH_FALLBACK=""" " 24exec python - "$@" <<'#'EOF 25#""" 26 27import hashlib 28import os 29import sys 30import tempfile 31import urllib 32 33TRACE_TO_TEXT_SHAS = { 34 'linux': '91cbc8addb9adc4dcc0cbf398e7ff67a8ad14ece', 35 'mac': '36a1313c8900b3b59b40e6f07488a6d2c7ffaa94', 36} 37TRACE_TO_TEXT_PATH = tempfile.gettempdir() 38TRACE_TO_TEXT_BASE_URL = ( 39 'https://storage.googleapis.com/perfetto/') 40 41def check_hash(file_name, sha_value): 42 with open(file_name, 'rb') as fd: 43 file_hash = hashlib.sha1(fd.read()).hexdigest() 44 return file_hash == sha_value 45 46def load_trace_to_text(platform): 47 sha_value = TRACE_TO_TEXT_SHAS[platform] 48 file_name = 'trace_to_text-' + platform + '-' + sha_value 49 local_file = os.path.join(TRACE_TO_TEXT_PATH, file_name) 50 51 if os.path.exists(local_file): 52 if not check_hash(local_file, sha_value): 53 os.remove(local_file) 54 else: 55 return local_file 56 57 url = TRACE_TO_TEXT_BASE_URL + file_name 58 urllib.urlretrieve(url, local_file) 59 if not check_hash(local_file, sha_value): 60 os.remove(local_file) 61 raise ValueError("Invalid signature.") 62 os.chmod(local_file, 0o755) 63 return local_file 64 65def main(argv): 66 platform = None 67 if sys.platform.startswith('linux'): 68 platform = 'linux' 69 elif sys.platform.startswith('darwin'): 70 platform = 'mac' 71 else: 72 print("Invalid platform: {}".format(sys.platform)) 73 return 1 74 75 trace_to_text_binary = load_trace_to_text(platform) 76 os.execv(trace_to_text_binary, [trace_to_text_binary] + argv[1:]) 77 78if __name__ == '__main__': 79 sys.exit(main(sys.argv)) 80 81#EOF 82