# Copyright (c) 2011 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.

# cros-disks upstart job

env CROS_DISKS_OPTS=''

# Set the default polling interval in milliseconds on block devices.
# This in-kernel polling mechanism is available since kernel 2.6.38.
# The poll timer slack is set to 25% in kernel (linux/block/genhd.c).
# With a polling interval <= 1 second, the system seems to react to
# eject requests from a CD-ROM drive more responsively.
env BLOCK_DEFAULT_POLL_MSECS=1000
env BLOCK_DEFAULT_POLL_MSECS_SYSFS_PATH=/sys/module/block/parameters/events_dfl_poll_msecs

# Minimum log level defined in base/logging.h.
#   0:INFO, 1:WARNING, 2:ERROR, 3:ERROR_REPORT, 4:FATAL
#   -1:VLOG(1), -2:VLOG(2), etc
# Set to log only INFO or above by default.
env CROS_DISKS_LOG_LEVEL=1

# Importing the TZ environment variable to allow the time zone to be changed
# for tests.
import TZ

start on starting system-services
stop on stopping system-services

pre-start script
  # The TZ variable is only allowed to exist in test builds for running
  # autotests. The existence, even if set to empty, of TZ interferes with the
  # regular functioning of the system timezone.
  if crossystem "cros_debug?0" && [ -n "${TZ+set}" ]; then
    logger -t "${UPSTART_JOB}" "TZ variable set in non-debug mode"
    exit 1
  fi

  # Set default polling interval on block devices.
  # This only affects block devices with removable media, which do not
  # support asynchronous media change/eject events.
  if [ -f "${BLOCK_DEFAULT_POLL_MSECS_SYSFS_PATH}" ]; then
    echo "${BLOCK_DEFAULT_POLL_MSECS}" > "${BLOCK_DEFAULT_POLL_MSECS_SYSFS_PATH}"
  fi

  # Load the FUSE module, which is used by various FUSE mounters.
  # cros-disks should still run even if the FUSE module fails to load.
  logger -t "${UPSTART_JOB}" "Loading FUSE module"
  modprobe fuse || logger -t "${UPSTART_JOB}" "Failed to load FUSE module"

  # /run/fuse is used to hold temporary directories for individual
  # FUSE mount helpers invocations.
  dirs="/run/fuse"
  mkdir -p ${dirs}
  chown cros-disks:cros-disks ${dirs}
  chmod 0775 ${dirs}

  # Create cgroup freeze directories for various FUSE daemons. This is to help
  # order the freezing of processes during suspend. Without doing so, freeze can
  # timeout in the kernel.
  for fs in "drivefs" "sshfs" "rar2fs" "smbfs" "mount.exfat-fuse" "ntfs-3g" \
            "archivemount" "fuse-zip"; do
    mkdir -p /sys/fs/cgroup/freezer/${fs}
    chown power:power /sys/fs/cgroup/freezer/${fs}/freezer.state
    chown cros-disks:cros-disks /sys/fs/cgroup/freezer/${fs}/cgroup.procs
  done
end script

post-stop script
  if [ -f "${BLOCK_DEFAULT_POLL_MSECS_SYSFS_PATH}" ]; then
    # Disable default polling on block devices.
    echo 0 > "${BLOCK_DEFAULT_POLL_MSECS_SYSFS_PATH}"
  fi
end script

respawn
expect fork

# Run cros-disks under Minijail as follows:
# - Enter new IPC (-l) namespace.
#
# - Remain in the original network namespace in order to join to the system
#   DBus.
#
# - Remain in the original cgroup namespace as it isn't supported on systems
#   running kernel 3.8. TODO(benchan): Put cros-disks in new cgroup namespace
#   once all systems support it.
#
# - Temporarily skip new mount (-v) and PID (-p) namespace as cros-disks
#   needs to access /home/user/<hash> for archive support, which isn't
#   accessible inside a new mount namespace. TODO(benchan): Put cros-disks in
#   new mount and PID namespace after archive support in cros-disks is
#   deprecated (chromium:707327).
#
# - To let upstart track the cros-disks process properly according to the
#   'expect fork' stanza, Minijail exits immediately after fork (-i) while
#   cros-disks stays in foreground (--foreground) without daemonizing itself.
#
# - Use -K to prevent Minijail from remounting the shared mount at /media as
#   private.
#   TODO(benchan): Remove -K once Minijail provides a finer control over
#   what should be remounted private and what can remain shared (b:62056108).
#
# - Do not lock SECBIT_KEEP_CAPS (-B 0x20) such that nested minijail invocations
#   can enable the bit again to pass capabilities.
#
exec minijail0 -u cros-disks -g cros-disks -G \
  -c cap_chown,cap_setgid,cap_setuid,cap_sys_admin,cap_sys_chroot,cap_mknod,cap_setpcap=e \
  --ambient -B 0x20 \
  -i -l -n \
  -- /usr/bin/cros-disks --foreground \
       --log_level="${CROS_DISKS_LOG_LEVEL}" ${CROS_DISKS_OPTS}
