summaryrefslogtreecommitdiffstats
path: root/third_party/libwebrtc/build/fuchsia/boot_data.py
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/libwebrtc/build/fuchsia/boot_data.py')
-rw-r--r--third_party/libwebrtc/build/fuchsia/boot_data.py120
1 files changed, 120 insertions, 0 deletions
diff --git a/third_party/libwebrtc/build/fuchsia/boot_data.py b/third_party/libwebrtc/build/fuchsia/boot_data.py
new file mode 100644
index 0000000000..f59d1974c8
--- /dev/null
+++ b/third_party/libwebrtc/build/fuchsia/boot_data.py
@@ -0,0 +1,120 @@
+# 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.
+
+"""Functions used to provision Fuchsia boot images."""
+
+import common
+import logging
+import os
+import subprocess
+import tempfile
+import time
+import uuid
+
+_SSH_CONFIG_TEMPLATE = """
+Host *
+ CheckHostIP no
+ StrictHostKeyChecking no
+ ForwardAgent no
+ ForwardX11 no
+ User fuchsia
+ IdentitiesOnly yes
+ IdentityFile {identity}
+ ServerAliveInterval 2
+ ServerAliveCountMax 5
+ ControlMaster auto
+ ControlPersist 1m
+ ControlPath /tmp/ssh-%r@%h:%p
+ ConnectTimeout 5
+ """
+
+# Specifies boot files intended for use by an emulator.
+TARGET_TYPE_QEMU = 'qemu'
+
+# Specifies boot files intended for use by anything (incl. physical devices).
+TARGET_TYPE_GENERIC = 'generic'
+
+# Defaults used by Fuchsia SDK
+_SSH_DIR = os.path.expanduser('~/.ssh')
+_SSH_CONFIG_DIR = os.path.expanduser('~/.fuchsia')
+
+
+def _GetPubKeyPath():
+ """Returns a path to the generated SSH public key."""
+
+ return os.path.join(_SSH_DIR, 'fuchsia_ed25519.pub')
+
+
+def ProvisionSSH():
+ """Generates a key pair and config file for SSH."""
+
+ fuchsia_authorized_keys_path = os.path.join(_SSH_DIR,
+ 'fuchsia_authorized_keys')
+ id_key_path = os.path.join(_SSH_DIR, 'fuchsia_ed25519')
+ _GetPubKeyPath()
+
+ logging.debug('Generating SSH credentials.')
+
+ if not os.path.isfile(id_key_path):
+ subprocess.check_output([
+ 'ssh-keygen', '-P', '', '-t', 'ed25519', '-f', id_key_path, '-C',
+ 'generated by FEMU Start testing step'
+ ])
+
+ if not os.path.isfile(fuchsia_authorized_keys_path):
+ result = subprocess.check_output(['ssh-keygen', '-y', '-f', id_key_path])
+ with open(fuchsia_authorized_keys_path, 'w') as out:
+ out.write(result.decode('utf-8'))
+
+ if not os.path.exists(_SSH_CONFIG_DIR):
+ os.mkdir(_SSH_CONFIG_DIR)
+ elif not os.path.isdir(_SSH_CONFIG_DIR):
+ raise Exception(_SSH_CONFIG_DIR + ' is not a directory.')
+ ssh_config_path = os.path.join(_SSH_CONFIG_DIR, 'ssh_config')
+ with open(ssh_config_path, "w") as ssh_config:
+ ssh_config.write(
+ _SSH_CONFIG_TEMPLATE.format(identity=id_key_path))
+
+
+def GetTargetFile(filename, target_arch, target_type):
+ """Computes a path to |filename| in the Fuchsia boot image directory specific
+ to |target_type| and |target_arch|."""
+
+ assert target_type == TARGET_TYPE_QEMU or target_type == TARGET_TYPE_GENERIC
+
+ return os.path.join(common.IMAGES_ROOT, target_arch, target_type, filename)
+
+
+def GetSSHConfigPath():
+ return os.path.join(_SSH_CONFIG_DIR, 'ssh_config')
+
+
+def GetBootImage(output_dir, target_arch, target_type):
+ """"Gets a path to the Zircon boot image, with the SSH client public key
+ added."""
+ ProvisionSSH()
+ pubkey_path = _GetPubKeyPath()
+ zbi_tool = common.GetHostToolPathFromPlatform('zbi')
+ image_source_path = GetTargetFile('zircon-a.zbi', target_arch, target_type)
+ image_dest_path = os.path.join(output_dir, 'gen', 'fuchsia-with-keys.zbi')
+
+ cmd = [ zbi_tool, '-o', image_dest_path, image_source_path,
+ '-e', 'data/ssh/authorized_keys=' + pubkey_path ]
+ subprocess.check_call(cmd)
+
+ return image_dest_path
+
+
+def GetKernelArgs(output_dir):
+ return ['devmgr.epoch=%d' % time.time()]
+
+
+def AssertBootImagesExist(arch, platform):
+ assert os.path.exists(GetTargetFile('zircon-a.zbi', arch, platform)), \
+ 'This checkout is missing the files necessary for\n' \
+ 'booting this configuration of Fuchsia.\n' \
+ 'To check out the files, add this entry to the "custom_vars"\n' \
+ 'section of your .gclient file:\n\n' \
+ ' "checkout_fuchsia_boot_images": "%s.%s"\n\n' % \
+ (platform, arch)