1*6dbdd20aSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*6dbdd20aSAndroid Build Coastguard Worker 3*6dbdd20aSAndroid Build Coastguard Worker"""A tool to delete permalinks and traces behind them. 4*6dbdd20aSAndroid Build Coastguard Worker 5*6dbdd20aSAndroid Build Coastguard WorkerTo be used by the Perfetto team, who has write access to the GCS bucket. 6*6dbdd20aSAndroid Build Coastguard Worker""" 7*6dbdd20aSAndroid Build Coastguard Worker 8*6dbdd20aSAndroid Build Coastguard Workerimport json 9*6dbdd20aSAndroid Build Coastguard Workerimport logging 10*6dbdd20aSAndroid Build Coastguard Workerimport re 11*6dbdd20aSAndroid Build Coastguard Workerimport subprocess 12*6dbdd20aSAndroid Build Coastguard Workerimport sys 13*6dbdd20aSAndroid Build Coastguard Worker 14*6dbdd20aSAndroid Build Coastguard Workerfrom typing import List 15*6dbdd20aSAndroid Build Coastguard Worker 16*6dbdd20aSAndroid Build Coastguard WorkerGCS_BUCKET = 'perfetto-ui-data' 17*6dbdd20aSAndroid Build Coastguard WorkerGCS_HTTP = 'https://storage.googleapis.com/%s/' % GCS_BUCKET 18*6dbdd20aSAndroid Build Coastguard Worker 19*6dbdd20aSAndroid Build Coastguard Worker 20*6dbdd20aSAndroid Build Coastguard Workerdef delete_gcs_obj(url: str, gcs_delete_list: List[str]): 21*6dbdd20aSAndroid Build Coastguard Worker if not url.startswith(GCS_HTTP): 22*6dbdd20aSAndroid Build Coastguard Worker logging.error('The URL %s should start with %s', url, GCS_HTTP) 23*6dbdd20aSAndroid Build Coastguard Worker return 24*6dbdd20aSAndroid Build Coastguard Worker gs_url = 'gs://%s/%s' % (GCS_BUCKET, url[len(GCS_HTTP):]) 25*6dbdd20aSAndroid Build Coastguard Worker gcs_delete_list.append(gs_url) 26*6dbdd20aSAndroid Build Coastguard Worker 27*6dbdd20aSAndroid Build Coastguard Worker 28*6dbdd20aSAndroid Build Coastguard Workerdef delete_permalink_uuid(uuid: str, gcs_delete_list: List[str]): 29*6dbdd20aSAndroid Build Coastguard Worker state_url = GCS_HTTP + uuid 30*6dbdd20aSAndroid Build Coastguard Worker delete_gcs_obj(state_url, gcs_delete_list) 31*6dbdd20aSAndroid Build Coastguard Worker state_json = subprocess.check_output(['curl', '-Ls', state_url]) 32*6dbdd20aSAndroid Build Coastguard Worker state = json.loads(state_json) 33*6dbdd20aSAndroid Build Coastguard Worker trace_url = state['engine']['source']['url'] 34*6dbdd20aSAndroid Build Coastguard Worker delete_gcs_obj(trace_url, gcs_delete_list) 35*6dbdd20aSAndroid Build Coastguard Worker 36*6dbdd20aSAndroid Build Coastguard Worker 37*6dbdd20aSAndroid Build Coastguard Workerdef main(): 38*6dbdd20aSAndroid Build Coastguard Worker gcs_delete_list = [] 39*6dbdd20aSAndroid Build Coastguard Worker if sys.stdin.isatty(): 40*6dbdd20aSAndroid Build Coastguard Worker logging.warn('This tool expects a list of uuids or https://ui.perfetto.dev/#!#?s=deadbeef') 41*6dbdd20aSAndroid Build Coastguard Worker 42*6dbdd20aSAndroid Build Coastguard Worker for line in sys.stdin.readlines(): 43*6dbdd20aSAndroid Build Coastguard Worker line = line.strip() 44*6dbdd20aSAndroid Build Coastguard Worker m = re.match(r'.*?\b([a-f0-9]{64})', line) 45*6dbdd20aSAndroid Build Coastguard Worker if not m: 46*6dbdd20aSAndroid Build Coastguard Worker logging.error('Could not find a 64 hex UUID from %s', line) 47*6dbdd20aSAndroid Build Coastguard Worker continue 48*6dbdd20aSAndroid Build Coastguard Worker uuid = m.group(1) 49*6dbdd20aSAndroid Build Coastguard Worker delete_permalink_uuid(uuid, gcs_delete_list) 50*6dbdd20aSAndroid Build Coastguard Worker 51*6dbdd20aSAndroid Build Coastguard Worker if len(gcs_delete_list) == 0: 52*6dbdd20aSAndroid Build Coastguard Worker logging.info('No object to delete, quitting without taking any action') 53*6dbdd20aSAndroid Build Coastguard Worker return 0 54*6dbdd20aSAndroid Build Coastguard Worker 55*6dbdd20aSAndroid Build Coastguard Worker print('Removing the following objects:') 56*6dbdd20aSAndroid Build Coastguard Worker for gs_uri in gcs_delete_list: 57*6dbdd20aSAndroid Build Coastguard Worker print(' ', gs_uri) 58*6dbdd20aSAndroid Build Coastguard Worker subprocess.check_call(['gsutil', '-m', 'rm', '-f', '-a'] + gcs_delete_list) 59*6dbdd20aSAndroid Build Coastguard Worker 60*6dbdd20aSAndroid Build Coastguard Worker 61*6dbdd20aSAndroid Build Coastguard Workerif __name__ == '__main__': 62*6dbdd20aSAndroid Build Coastguard Worker sys.exit(main()) 63