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

description   "Hammer firmware updater task"
author        "chromium-os-dev@chromium.org"

# When the hammer device is plugged, udev emits hammer-device-added signal.
# The example rule file: hammerd/udev/99-hammerd.rules.example
# Additionally, start hammerd when ash gets initialized. Ash observes
# signals from hammerd and, if needed, notifies the user of connected hammer
# state. This means that hammerd should be rerun to ensure ash has received
# relavant signals, in case ash missed signals emitted when hammer device was
# added (e.g. if ash had restarted after hammer device addition due to user
# session restart).
# NOTE: ash-initialized signal is emitted by session manager on request from
# the browser process once ash initialization completes.
start on hammer-device-added or ash-initialized

# If the device pairs correctly, expose hammer's sysfs path for other
# applications to use.
env WRITE_SYSFS_PATH="/run/hammer_sysfs_path"

# Arguments should be empty here and overridden at `hammerd.override`.
env EC_IMAGE_PATH=
env TOUCHPAD_IMAGE_PATH=
env VENDOR_ID=
env PRODUCT_ID=
env USB_BUS=
env USB_PORT=
env AUTOSUSPEND_DELAY_MS="-1"

# These variables may be passed when the job gets started from
# hammerd-at-boot.sh.
import AT_BOOT
import UPDATE_IF

# Set the argument to True when triggering at boot.
env AT_BOOT="false"
# The argument to determine the update condition.
# Valid values are "never", "mismatch", and "always".
env UPDATE_IF="never"

task

pre-start script
  # Because the upstart job `boot-update-firmware` will force invoking hammerd
  # once before UI is started, we need to make sure hammerd isn't invoked by
  # udev before boot-update-firmware gets to run.
  if [ "${UPSTART_EVENTS}" = 'hammer-device-added' ] && \
     ! initctl status boot-update-firmware | grep -q "start/running"; then
    logger -t hammerd "boot-update-firmware hasn't started yet, ignore."
    stop
  fi
end script

# Trigger hammerd process.
# Note: minijail0 "-N" argument (cgroup namespace) is only supported on
# kernel >= 3.14. Remove if the hammerd runs on kernel < 3.14.
script
  # If reacting to ash-initialized event, verify that the base is actually
  # connected before proceeding - hammerd expects the base to be connected,
  # which is not guaranteed on ash initialization signal (unlike on
  # hammerd-device-added).
  if [ "${UPSTART_EVENTS}" = 'ash-initialized' ]; then
    HAMMERD_DETECTOR_SCRIPT='/usr/share/cros/init/hammerd-base-detector.sh'
    if [ -e "${HAMMERD_DETECTOR_SCRIPT}" ]; then
      # Import base_connected function.
      . "${HAMMERD_DETECTOR_SCRIPT}"

      if ! base_connected "${UPSTART_JOB}"; then
        logger -t "${UPSTART_JOB}" \
            "Base not connected during ash initialization"
        exit 0
      fi
    else
      logger -t hammerd "hammerd-base-detector script not found."
    fi
  fi

  exit_status=0
  /sbin/minijail0 -e -N -p -l -u hammerd -g hammerd -c 0002 \
      /usr/bin/hammerd --ec_image_path="${EC_IMAGE_PATH}" \
                       --touchpad_image_path="${TOUCHPAD_IMAGE_PATH}" \
                       --vendor_id="${VENDOR_ID}" \
                       --product_id="${PRODUCT_ID}" \
                       --usb_bus="${USB_BUS}" \
                       --usb_port="${USB_PORT}" \
                       --autosuspend_delay_ms="${AUTOSUSPEND_DELAY_MS}" \
                       --at_boot="${AT_BOOT}" \
                       --update_if="${UPDATE_IF}" || exit_status="$?"

  if [ "${exit_status}" -eq 0 ]; then
    usb_device_path="/sys/bus/usb/devices/${USB_BUS}-${USB_PORT}"
    if ! echo "${usb_device_path}" > "${WRITE_SYSFS_PATH}"; then
      logger -t ${UPSTART_JOB} \
          "FAILED to write into sysfs tag file: ${WRITE_SYSFS_PATH}"
      exit 1  # Exit status for "unknown error" in hammerd.
    fi
  else
    rm "${WRITE_SYSFS_PATH}" || true
  fi
  exit "${exit_status}"
end script
