#!/bin/bash
# Copyright 2020 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

set -u -e

# Temporary script to get cros_config values for an alternative identity.
# Used for factory process until b/152291015 is resolved.

CONFIGFS_IMAGE="/usr/share/chromeos-config/configfs.img"
SQUASHFS_BASE="/run/chromeos-config/private"

SMBIOS_NAME=""
DT_COMPATIBLE_LIST=()
SKU_ID=""
WHITELABEL_TAG=""

print_usage () {
  cat <<EOF >&2
Usage: $0 [OPTIONS...] PATH PROPERTY

Optional arguments:
  --configfs-image FILE   Path to configfs image.
  --smbios-name NAME      Override the SMBIOS name from firmware.
  --dt-compatible STRING  Add STRING to the device-tree compatible list.
  --sku-id SKU            Override the SKU id from firmware.
  --whitelabel-tag VALUE  Override the whitelabel tag from VPD.
  --help                  Show this help message and exit.

Positional arguments:
  PATH                    The path to get from config.
  PROPERTY                The property to get from config.
EOF
}

if [[ "${#@}" -eq 0 ]]; then
  print_usage
  exit 1
fi

while [[ "${1:0:1}" != "/" ]]; do
  case "$1" in
    --configfs-image )
      CONFIGFS_IMAGE="$2"
      shift
      ;;
    --smbios-name )
      SMBIOS_NAME="$2"
      shift
      ;;
    --dt-compatible )
      DT_COMPATIBLE_LIST+=("$2")
      shift
      ;;
    --sku-id )
      SKU_ID="$2"
      shift
      ;;
    --whitelabel-tag )
      WHITELABEL_TAG="$2"
      shift
      ;;
    --help )
      print_usage
      exit 0
      ;;
    * )
      print_usage
      echo >&2
      echo "Unknown argument: $1" >&2
      exit 1
      ;;
  esac
  shift
done

if [[ "${#@}" -ne 2 ]]; then
  print_usage
  exit 1
fi

PATH_NAME="$1"
PROPERTY_NAME="$2"

array_contains () {
  for item in "${$2[@]}"; do
    if [[ "$1" == "${item}" ]]; then
      return 0
    fi
  done
  return 1
}

# Load default values from firmware.
if [[ -f /sys/class/dmi/id/product_name && -z "${SMBIOS_NAME}" ]]; then
  read -r SMBIOS_NAME </sys/class/dmi/id/product_name
fi

if [[ -f /proc/device-tree/compatible && "${#DT_COMPATIBLE_LIST}" -eq 0 ]]; then
  # readarray -d '' splits on null chars
  readarray -d '' DT_COMPATIBLE_LIST </proc/device-tree/compatible
fi

if [[ -f /sys/class/dmi/id/product_sku && -z "${SKU_ID}" ]]; then
  # Trim off "sku" in front of the ID
  SKU_ID="$(cut -b4- </sys/class/dmi/id/product_sku)"
fi

if [[ -f /sys/firmware/vpd/ro/whitelabel_tag && -z "${WHITELABEL_TAG}" ]]; then
  read -r WHITELABEL_TAG </sys/firmware/vpd/ro/whitelabel_tag || true
fi

on_exit_unmount () {
  umount "${SQUASHFS_BASE}"
  rmdir "${SQUASHFS_BASE}"
}

if [[ "${CONFIGFS_IMAGE}" != /usr/share/chromeos-config/configfs.img || \
  ! -d "${SQUASHFS_BASE}" ]]; then
  SQUASHFS_BASE="$(mktemp -d)"
  mount -oro "${CONFIGFS_IMAGE}" "${SQUASHFS_BASE}"
  trap on_exit_unmount EXIT
fi

# file_mismatch filename contents
# returns 0 if file exists and the contents don't match, 1 otherwise
file_mismatch () {
  if [[ -f "$1" && "${2,,}" != "$(tr '[:upper:]' '[:lower:]' <"$1")" ]]; then
    return 0
  fi
  return 1
}

for base in "${SQUASHFS_BASE}"/v1/chromeos/configs/*; do
  if file_mismatch "${base}/identity/smbios-name-match" "${SMBIOS_NAME}"; then
    continue
  fi

  if [[ -f "${base}/identity/device-tree-compatible-match" ]] && \
    ! array_contains "$(cat "${base}/identity/device-tree-compatible-match")" \
    DT_COMPATIBLE_LIST; then
    continue
  fi

  if file_mismatch "${base}/identity/sku-id" "${SKU_ID}"; then
    continue
  fi

  if file_mismatch "${base}/identity/whitelabel-tag" "${WHITELABEL_TAG}"; then
    continue
  fi

  # Identity matched!
  cat "${base}${PATH_NAME}/${PROPERTY_NAME}"
  exit 0
done

echo "No identity matched!" >&2
exit 1
