blob: 2edaefa6127997485bcb1f4f441bca6aa46ece10 [file] [log] [blame]
# Copyright 2015 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Utility for setting the /etc/lsb-release file of an image."""
import getpass
import os
from chromite.lib import commandline
from chromite.lib import cros_build_lib
from chromite.lib import image_lib
from chromite.utils import hostname_util
# LSB keys:
# Set google-specific version numbers:
# CHROMEOS_RELEASE_BOARD is the target board identifier.
# CHROMEOS_RELEASE_BRANCH_NUMBER is the Chrome OS branch number
# CHROMEOS_RELEASE_BUILD_NUMBER is the Chrome OS build number
# CHROMEOS_RELEASE_BUILD_TYPE is the type of build (official, from developers,
# etc..)
# CHROMEOS_RELEASE_CHROME_MILESTONE is the Chrome milestone (also named Chrome
# branch).
# CHROMEOS_RELEASE_DESCRIPTION is the version displayed by Chrome; see
# chrome/browser/chromeos/chromeos_version_loader.cc.
# CHROMEOS_RELEASE_NAME is a human readable name for the build.
# CHROMEOS_RELEASE_PATCH_NUMBER is the patch number for the current branch.
# CHROMEOS_RELEASE_TRACK and CHROMEOS_RELEASE_VERSION are used by the software
# update service.
# CHROMEOS_RELEASE_KEYSET is the named of the keyset used to sign this build.
# TODO(skrul): Remove GOOGLE_RELEASE once Chromium is updated to look at
# CHROMEOS_RELEASE_VERSION for UserAgent data.
LSB_KEY_NAME = "CHROMEOS_RELEASE_NAME"
LSB_KEY_AUSERVER = "CHROMEOS_AUSERVER"
LSB_KEY_DEVSERVER = "CHROMEOS_DEVSERVER"
LSB_KEY_TRACK = "CHROMEOS_RELEASE_TRACK"
LSB_KEY_BUILD_TYPE = "CHROMEOS_RELEASE_BUILD_TYPE"
LSB_KEY_DESCRIPTION = "CHROMEOS_RELEASE_DESCRIPTION"
LSB_KEY_BOARD = "CHROMEOS_RELEASE_BOARD"
LSB_KEY_KEYSET = "CHROMEOS_RELEASE_KEYSET"
LSB_KEY_UNIBUILD = "CHROMEOS_RELEASE_UNIBUILD"
LSB_KEY_BRANCH_NUMBER = "CHROMEOS_RELEASE_BRANCH_NUMBER"
LSB_KEY_BUILD_NUMBER = "CHROMEOS_RELEASE_BUILD_NUMBER"
LSB_KEY_CHROME_MILESTONE = "CHROMEOS_RELEASE_CHROME_MILESTONE"
LSB_KEY_PATCH_NUMBER = "CHROMEOS_RELEASE_PATCH_NUMBER"
LSB_KEY_VERSION = "CHROMEOS_RELEASE_VERSION"
LSB_KEY_BUILDER_PATH = "CHROMEOS_RELEASE_BUILDER_PATH"
LSB_KEY_GOOGLE_RELEASE = "GOOGLE_RELEASE"
LSB_KEY_APPID_RELEASE = "CHROMEOS_RELEASE_APPID"
LSB_KEY_APPID_BOARD = "CHROMEOS_BOARD_APPID"
LSB_KEY_APPID_CANARY = "CHROMEOS_CANARY_APPID"
LSB_KEY_ARC_VERSION = "CHROMEOS_ARC_VERSION"
LSB_KEY_ARC_ANDROID_SDK_VERSION = "CHROMEOS_ARC_ANDROID_SDK_VERSION"
CANARY_APP_ID = "{90F229CE-83E2-4FAF-8479-E368A34938B1}"
def _ParseArguments(argv):
parser = commandline.ArgumentParser(description=__doc__)
parser.add_argument("--app_id", default=None, help="The APP_ID to install.")
parser.add_argument("--board", help="The board name.", required=True)
parser.add_argument(
"--unibuild",
action="store_true",
default=False,
help="Set if board has chromeos-config.",
)
parser.add_argument(
"--sysroot",
required=True,
type="path",
help="The sysroot to install the lsb-release file into.",
)
parser.add_argument(
"--version_string", required=True, help="The image's version string."
)
parser.add_argument(
"--builder_path", default=None, help="The image's builder path."
)
parser.add_argument(
"--auserver", default=None, help="The auserver url to use."
)
parser.add_argument(
"--devserver", default=None, help="The devserver url to use."
)
parser.add_argument(
"--official",
action="store_true",
help="Whether or not to populate with fields for an " "official image.",
)
parser.add_argument(
"--keyset", help="The keyset name used to sign this image."
)
parser.add_argument(
"--buildbot_build",
default="N/A",
help="The build number, for use with the continuous " "builder.",
)
parser.add_argument(
"--track", default="developer-build", help="The type of release track."
)
parser.add_argument(
"--branch_number", default="0", help="The branch number."
)
parser.add_argument("--build_number", default="0", help="The build number.")
parser.add_argument(
"--chrome_milestone", default="0", help="The Chrome milestone."
)
parser.add_argument(
"--patch_number",
default="0",
help="The patch number for the given branch.",
)
parser.add_argument(
"--arc_version", default=None, help="Android revision number of ARC."
)
parser.add_argument(
"--arc_android_sdk_version",
default=None,
help="Android SDK version of ARC.",
)
opts = parser.parse_args(argv)
# If the auserver or devserver isn't specified or is set to blank, set it
# to the host's hostname.
hostname = hostname_util.get_host_name(fully_qualified=True)
if not opts.auserver:
opts.auserver = "http://%s:8080/update" % hostname
if not opts.devserver:
opts.devserver = "http://%s:8080" % hostname
opts.Freeze()
if not os.path.isdir(opts.sysroot):
cros_build_lib.Die(
"The target sysroot does not exist: %s" % opts.sysroot
)
if not opts.version_string:
cros_build_lib.Die(
"version_string must not be empty. Was "
"chromeos_version.sh sourced correctly in the calling "
"script?"
)
return opts
def main(argv):
opts = _ParseArguments(argv)
fields = {
LSB_KEY_NAME: "Chromium OS",
LSB_KEY_AUSERVER: opts.auserver,
LSB_KEY_DEVSERVER: opts.devserver,
}
if opts.app_id is not None:
fields.update(
{
LSB_KEY_APPID_RELEASE: opts.app_id,
LSB_KEY_APPID_BOARD: opts.app_id,
LSB_KEY_APPID_CANARY: CANARY_APP_ID,
}
)
if opts.arc_version is not None:
fields.update(
{
LSB_KEY_ARC_VERSION: opts.arc_version,
}
)
if opts.arc_android_sdk_version is not None:
fields.update(
{
LSB_KEY_ARC_ANDROID_SDK_VERSION: opts.arc_android_sdk_version,
}
)
if opts.builder_path is not None:
fields.update(
{
LSB_KEY_BUILDER_PATH: opts.builder_path,
}
)
if opts.keyset is not None:
fields.update(
{
LSB_KEY_KEYSET: opts.keyset,
}
)
board = opts.board
if opts.official:
# Official builds (i.e. buildbot).
track = "dev-channel"
build_type = "Official Build"
fields.update(
{
LSB_KEY_TRACK: track,
LSB_KEY_NAME: "Chrome OS",
LSB_KEY_BUILD_TYPE: build_type,
LSB_KEY_DESCRIPTION: (
"%s (%s) %s %s test"
% (opts.version_string, build_type, track, board)
),
LSB_KEY_AUSERVER: "https://tools.google.com/service/update2",
LSB_KEY_DEVSERVER: "",
}
)
elif getpass.getuser() == "chrome-bot":
# Continuous builder.
build_type = "Continuous Builder - Builder: %s" % opts.buildbot_build
fields.update(
{
LSB_KEY_TRACK: "buildbot-build",
LSB_KEY_BUILD_TYPE: build_type,
LSB_KEY_DESCRIPTION: "%s (%s) %s"
% (opts.version_string, build_type, board),
}
)
else:
# Developer manual builds.
build_type = "Developer Build - %s" % getpass.getuser()
fields.update(
{
LSB_KEY_TRACK: opts.track,
LSB_KEY_BUILD_TYPE: build_type,
LSB_KEY_DESCRIPTION: "%s (%s) %s %s"
% (opts.version_string, build_type, opts.track, board),
}
)
fields.update(
{
LSB_KEY_BOARD: opts.board,
LSB_KEY_BRANCH_NUMBER: opts.branch_number,
LSB_KEY_BUILD_NUMBER: opts.build_number,
LSB_KEY_CHROME_MILESTONE: opts.chrome_milestone,
LSB_KEY_PATCH_NUMBER: opts.patch_number,
LSB_KEY_VERSION: opts.version_string,
LSB_KEY_GOOGLE_RELEASE: opts.version_string,
}
)
if opts.unibuild:
fields[LSB_KEY_UNIBUILD] = "1"
image_lib.WriteLsbRelease(opts.sysroot, fields)