# Copyright 2016 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.

description   "Report boot mode metrics"
author        "chromium-os-dev@chromium.org"

start on started system-services

script
  # Reads a boolean crossystem parameter and outputs a status value:
  #   0: parameter value is false
  #   1: parameter value is true
  #   2: failed to determine value
  get_crossystem_sample() {
    local param="$1"
    local value="$(crossystem "${param}")"
    case "${value}" in
      0|1)
        echo "${value}"
        ;;
      *)
        echo "2"
        ;;
    esac
  }

  # Report firmware write protect status.
  metrics_client -e Platform.BootMode.WriteProtectSwitch \
      $(get_crossystem_sample "wpsw_boot") 2
  # Report dev switch status.
  metrics_client -e Platform.BootMode.DevSwitch \
      $(get_crossystem_sample "devsw_boot") 2

  # Prints write protect status from flashrom to stdout:
  #   0: write protect is disabled
  #   1: write protect is enabled and range looks good
  #   2: write protect is enabled but range looks bad
  #   3: failed to determine status
  get_wp_status_sample() {
    local target="$1"
    local flashrom_output="$(flashrom --wp-status -p "${target}")"
    case "${flashrom_output}" in
      *"WP: write protect is disabled"*)
        echo "0"
        ;;
      *"WP: write protect is enabled"*)
        local range_len="$(echo "${flashrom_output}" |
            grep "WP: write protect range:" |
            grep -o "len=0x[[:xdigit:]]\+")"
        if [ "$((${range_len#len=}))" -gt "0" ]; then
          echo "1"
        else
          echo "2"
        fi
        ;;
      *)
        echo "3"
        ;;
    esac
  }

  # Report main firmware write protect status.
  metrics_client -e Platform.BootMode.FirmwareWriteProtect.Main \
      $(get_wp_status_sample "host") 3
  # Report EC firmware write protect status.
  metrics_client -e Platform.BootMode.FirmwareWriteProtect.EC \
      $(get_wp_status_sample "ec") 3
  # Report PD firmware write protect status.
  metrics_client -e Platform.BootMode.FirmwareWriteProtect.PD \
      $(get_wp_status_sample "ec:type=pd") 3
end script
