#!/usr/bin/env python3 # Copyright (C) 2024 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. import argparse import os import subprocess import sys def list_instances(project_id): try: result = subprocess.run([ 'gcloud', 'compute', 'instances', 'list', '--project', project_id, '--format', 'table(name,zone)' ], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) lines = result.stdout.strip().split('\n') instances = [tuple(line.split()) for line in lines[1:]] # Skip the header return instances except subprocess.CalledProcessError as e: print(f'Error retrieving instances: {e.stderr}') sys.exit(1) def main(): DEFAULT_PROJECT_ID = 'perfetto-ci' # project_id = os.getenv('CLOUDSDK_CORE_PROJECT', DEFAULT_PROJECT_ID) parser = argparse.ArgumentParser() parser.add_argument( '-p', '--project-id', metavar='PROJECT_ID', required=False, help='The Cloud project id. Defaults to CLOUDSDK_CORE_PROJECT', default=os.getenv('CLOUDSDK_CORE_PROJECT', DEFAULT_PROJECT_ID)) args = parser.parse_args() project_id = args.project_id print('Using Cloud project: %s' % project_id) print('If this script fail ensure that:') print(' - The cloud project has been configured as per go/gce-beyondcorp-ssh') print(' - Register your key as per "Ensure that you are registered with OS') instances = list_instances(project_id) if not instances: print('No GCE instances found.') sys.exit(0) print('Available VMs:') for idx, (name, zone) in enumerate(instances, start=1): print(f'{idx}. {name} ({zone})') try: vm_number = int(input('Enter the number of the VM you want to ssh into: ')) if vm_number < 1 or vm_number > len(instances): raise ValueError except ValueError: print('Invalid selection. Please run the script again.') sys.exit(1) # Get the selected VM's name and zone selected_instance = instances[vm_number - 1] vm_name, vm_zone = selected_instance user = os.getenv('USER', 'username') ssh_arg = '%s_google_com@nic0.%s.%s.c.%s.internal.gcpnode.com' % ( user, vm_name, vm_zone, project_id) print('ssh ' + ssh_arg) os.execvp('ssh', ['ssh', ssh_arg]) if __name__ == '__main__': main()