blob: 008f8b652e30c1629b39bf5b189f55e45b62fd44 [file] [log] [blame]
#!/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()