| #!/usr/bin/env python3 | |
| """A tool to delete permalinks and traces behind them. | |
| To be used by the Perfetto team, who has write access to the GCS bucket. | |
| """ | |
| import json | |
| import logging | |
| import re | |
| import subprocess | |
| import sys | |
| from typing import List | |
| GCS_BUCKET = 'perfetto-ui-data' | |
| GCS_HTTP = 'https://storage.googleapis.com/%s/' % GCS_BUCKET | |
| def delete_gcs_obj(url: str, gcs_delete_list: List[str]): | |
| if not url.startswith(GCS_HTTP): | |
| logging.error('The URL %s should start with %s', url, GCS_HTTP) | |
| return | |
| gs_url = 'gs://%s/%s' % (GCS_BUCKET, url[len(GCS_HTTP):]) | |
| gcs_delete_list.append(gs_url) | |
| def delete_permalink_uuid(uuid: str, gcs_delete_list: List[str]): | |
| state_url = GCS_HTTP + uuid | |
| delete_gcs_obj(state_url, gcs_delete_list) | |
| state_json = subprocess.check_output(['curl', '-Ls', state_url]) | |
| state = json.loads(state_json) | |
| trace_url = state['engine']['source']['url'] | |
| delete_gcs_obj(trace_url, gcs_delete_list) | |
| def main(): | |
| gcs_delete_list = [] | |
| if sys.stdin.isatty(): | |
| logging.warn( | |
| 'This tool expects a list of uuids or https://ui.perfetto.dev/#!#?s=deadbeef' | |
| ) | |
| for line in sys.stdin.readlines(): | |
| line = line.strip() | |
| m = re.match(r'.*?\b([a-f0-9]{64})', line) | |
| if not m: | |
| logging.error('Could not find a 64 hex UUID from %s', line) | |
| continue | |
| uuid = m.group(1) | |
| delete_permalink_uuid(uuid, gcs_delete_list) | |
| if len(gcs_delete_list) == 0: | |
| logging.info('No object to delete, quitting without taking any action') | |
| return 0 | |
| print('Removing the following objects:') | |
| for gs_uri in gcs_delete_list: | |
| print(' ', gs_uri) | |
| subprocess.check_call(['gsutil', '-m', 'rm', '-f', '-a'] + gcs_delete_list) | |
| if __name__ == '__main__': | |
| sys.exit(main()) |