blob: d53eb36ccf95303f5e9782cf19138047615d2929 [file] [log] [blame]
# 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