# 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_cur") 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
