blob: 6319ceab52bd98ea963767f81d3db008aaa7e7d1 [file] [log] [blame]
# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import json
import logging
import os
import pwd
SSH_IDENTITY_FILE_PATH = '/b/id_rsa'
SSH_CONFIG_FILE_PATH = os.path.expanduser('~chrome-bot/.ssh/config')
SSH_CONFIG_FILE_CONTENTS = (
"""# This file is generated by the infra docker service. Changes will be
# overwritten. The identity file is unique per container.
IdentityFile %s
ConnectionAttempts 4
Protocol 2
ConnectTimeout 30
ServerAliveCountMax 3
ServerAliveInterval 10
# A device's identity changes after every update. This can cause problems when
# its identity is stored on the host, so just skip the key checking.
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
# LogLevel QUIET skips the "Host key has been permanently added" messages.
LogLevel QUIET
""" % SSH_IDENTITY_FILE_PATH)
def read_device_list(path_to_list):
try:
with open(path_to_list) as f:
devices = json.load(f)
if not isinstance(devices, list):
raise TypeError(
'Devices json file expected list, got %s: %s' % (
type(devices), devices))
return [d.split('.')[0] for d in devices]
except TypeError:
logging.exception('Unable to read device list %s.', path_to_list)
raise
def should_write_ssh_config():
ssh_dir = os.path.dirname(SSH_CONFIG_FILE_PATH)
if not os.path.exists(ssh_dir):
os.mkdir(ssh_dir, 0o700)
chrome_bot = pwd.getpwnam('chrome-bot')
os.chown(ssh_dir, chrome_bot.pw_uid, chrome_bot.pw_gid)
if not os.path.exists(SSH_CONFIG_FILE_PATH):
logging.warning('~/.ssh/config file does not exist. Creating it.')
return True
# Ensure the file's contents are what they should be. The file should be
# reasonably sized, so just compare the whole thing in one go.
with open(SSH_CONFIG_FILE_PATH) as f:
config_contents = f.read()
if config_contents != SSH_CONFIG_FILE_CONTENTS:
logging.warning("SSH config file's contents are incorrect. Overwriting.")
return True
return False
def write_ssh_config():
with open(SSH_CONFIG_FILE_PATH, 'w') as f:
f.write(SSH_CONFIG_FILE_CONTENTS)