#!/bin/sh
# Copyright 2017 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.

. /usr/share/misc/shflags

DEFINE_boolean 'test' ${FLAGS_FALSE} "For unit testing."

# Parse command line.
FLAGS "$@" || exit 1
eval set -- "${FLAGS_ARGV}"

set -e

if [ ${FLAGS_test} -eq ${FLAGS_FALSE} ]; then
  . /usr/share/cros/disk_utils.sh
else
  . ./disk_utils.sh
fi

dmesg_matches() {
  if dmesg | grep -q "$1"; then
    echo 1
  else
    echo 0
  fi
}

gather_battery_errors() {
  # The metrics library requires a max value of 2 rather than 1
  # (http://crbug.com/338015).
  metrics_client -e Platform.BatteryAbsent $(
    dmesg_matches "ACPI: Battery Slot.*absent") 2
}

gather_wifi_error() {
  local count=$(grep "^DEVTYPE=wlan" /sys/class/net/*/uevent | wc -l)
  if [ "${count}" -gt 9 ]; then
    count=9
  fi
  metrics_client -e Platform.WiFiDeviceCount "${count}" 10
}

gather_fs_error() {
  # Gather filesystem errors.
  local dev dev_name fs_error_count
  local DEV_Stateful="$(
    get_stateful_df_data | awk '{print $1}' | sed -e 's#^/dev/##')"
  if [ -e /dev/mapper/encstateful -o ${FLAGS_test} -eq ${FLAGS_TRUE} ]; then
    DEV_EncStateful="$(printf "dm-%d" $(stat -c "%T" /dev/mapper/encstateful))"
  else
    DEV_EncStateful=""
  fi

  for dev in "Stateful" "EncStateful"; do
    eval "dev_name=\"\${DEV_${dev}}\""

    if [ -z "${dev_name}" ]; then
      continue
    fi

    metrics_client -e Platform.FileSystem.${dev}_RecoveryNeeded \
      "$(dmesg_matches "EXT4-fs (${dev_name}): recovery complete")" 2

    metrics_client -e Platform.FileSystem.${dev}_FsckNeeded \
      "$(dmesg_matches \
        "EXT4-fs (${dev_name}): warning: mounting fs with errors")" 2

    fs_error_count=$(dumpe2fs -h "/dev/$dev_name" 2>/dev/null | \
                     sed -En '/FS Error count/s/.* +([0-9]+)$/\1/p')
    : "${fs_error_count:=0}"
    metrics_client Platform.FileSystem.${dev}_ErrorCount \
      "${fs_error_count}" 0 100000 20
  done
}

gather_errors() {
  gather_battery_errors
  # The wifi devices may take some time to appear.
  sleep 10
  gather_wifi_error
  gather_fs_error
}

main() {
  if [ ${FLAGS_test} -eq ${FLAGS_TRUE} ]; then
    return
  fi
  if [ $# -ne 0 ]; then
    flags_help
    exit 1
  fi
  gather_errors
}
main "$@"
