1#!/bin/bash
2
3# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
7# Customizes a Chrome OS release image by setting /etc/lsb-release values.
8
9# Load common constants and variables.
10. "$(dirname "$0")/common.sh"
11
12set_lsb_release_keyval() {
13  local rootfs=$1
14  local key=$2
15  local value=$3
16  local temp_lsb_release="$rootfs/etc/temp-lsb-release"
17  echo "$key=$value" | sudo tee "$temp_lsb_release" > /dev/null
18  grep -Ev "^$key=" "$rootfs/etc/lsb-release" \
19    | sudo tee -a "$temp_lsb_release" > /dev/null
20  sudo sort -o "$rootfs/etc/lsb-release" "$temp_lsb_release"
21  sudo rm -f "$temp_lsb_release"
22}
23
24main() {
25  set -e
26
27  if [[ $(( $# % 2 )) -eq 0 ]]; then
28    cat <<EOF
29Usage: $PROG <image.bin> [<key> <value> [<key> <value> ...]]
30
31Examples:
32
33$ $PROG chromiumos_image.bin
34
35Dumps /etc/lsb-release from chromiumos_image.bin to stdout.
36
37$ $PROG chromiumos_image.bin CHROMEOS_RELEASE_DESCRIPTION "New description"
38
39Sets the CHROMEOS_RELEASE_DESCRIPTION key's value to "New description"
40in /etc/lsb-release in chromiumos_image.bin, sorts the keys and dumps
41the updated file to stdout.
42
43EOF
44    exit 1
45  fi
46
47  local image=$1
48  shift
49  local rootfs=$(make_temp_dir)
50
51  # If there are no key/value pairs to process, we don't need write access.
52  if [[ $# -eq 0 ]]; then
53    mount_image_partition_ro "${image}" 3 "${rootfs}"
54  else
55    mount_image_partition "${image}" 3 "${rootfs}"
56    touch "${image}"  # Updates the image modification time.
57  fi
58
59  # Process all the key/value pairs.
60  local key value
61  while [[ $# -ne 0 ]]; do
62    key=$1 value=$2
63    shift 2
64    set_lsb_release_keyval "${rootfs}" "${key}" "${value}"
65  done
66
67  # Dump the final state.
68  cat "${rootfs}/etc/lsb-release"
69}
70
71main "$@"
72