# 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 "Update the Activation Date"
author      "chromium-os-dev@chromium.org"

start on started system-services
stop on stopping system-services

# This sets the activation date to the RW_VPD of a device. Here we wait
# for a proper time sync to have taken place before setting the value
# to ensure that the time is correct.

script
  FIELD_NAME="ActivateDate"
  OOBE_COMPLETED_FILE="/home/chronos/.oobe_completed"
  PARTITION="RW_VPD"
  # TIMEFILE is updated by tlsdated whenever a time remote sync occurs.
  TIMEFILE="/var/cache/tlsdated/timestamp"

  check_timestamp() {
    stat -c %Y "${TIMEFILE}" || :
  }

  # Get initial timestamp of TIMEFILE - we don't care about the contents
  # of this file, only its timestamp. We will check the timestamp later
  # to see if a remote time sync occurred. There is a race condition here,
  # tlsdated only updates the time every 24 hours by default, so if we
  # don't get the timefile timestamp before tlsdated updates the time on
  # boot we will end up waiting 24 hours. This upstart should almost
  # always win the race as tlsdated depends on having a valid network
  # connection up.
  # TODO(bhthompson): find a way to avoid the race.
  TIMESTAMP=$(check_timestamp)

  # Never run from a factory image.
  if [ -f /root/.factory_test -o -f /root/.factory_installer ] ; then
    exit 0
  fi

  # Wait for OOBE to have completed.
  while [ ! -f "${OOBE_COMPLETED_FILE}" ]; do
    sleep 60
  done

  # Wait for remote sync of clock, then write activation date.
  while true; do
    sleep 200
    # Only a non-empty TIMEFILE guarantees that a time sync has happened.
    if [ "${TIMESTAMP}" != "$(check_timestamp)" -a -s "${TIMEFILE}" ] ; then
      # Get system date with proper format for FUD.
      year=$(expr \( $(date +%Y) \- 1980 \) \* 512)
      month=$(expr $(date +%m) \* 32)
      fuddata=$(expr $year \+ $month \+ $(date +%d))
      # Write FUD to battery. We could call it every time.
      # EC firmware would only write once to battery if the FUD is cleared.
      # The call will always return failed, but write would be succeed.
      if ! ectool batteryparam set 0 $fuddata 2>&1; then
        logger -t "$UPSTART_JOB" "Battery FUD already set."
      fi

      # Don't run if we have set the date already, we use dump_vpd_log so that
      # we can leverage the cached VPD file.
      # This is a soft check, the activate_date script will also check the vpd
      # directly to see if a date has been set.
      #
      ACTIVATE_DATE="$(vpd_get_value "${FIELD_NAME}")"
      if [ -n "${ACTIVATE_DATE}" ]; then
        exit 0
      fi
      if ! activate_date 2>&1; then
        logger -t "$UPSTART_JOB" "activate_date failed."
        exit 0
      fi
      if ! dump_vpd_log --force 2>&1; then
        logger -t "$UPSTART_JOB" "dump_vpd_log failed."
        exit 0
      fi
      logger -t "$UPSTART_JOB" "Activation date set."
      exit 0
    fi
  done
end script
