# Copyright 2018 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    "Start the wilco_dtc daemon"
author         "chromium-os-dev@chromium.org"

# Start the wilco_dtc daemon (diagnostics and telemetry collector), which is
# responsible for processing and analyzing telemetry and diagnostics information
# obtained from wilco_dtc_supportd. `wilco_dtc_dispatcher` will manage the
# lifecycle of both this process and wilco_dtc_supportd.
start on starting wilco_dtc_dispatcher
stop on stopped wilco_dtc_dispatcher

respawn
# If the job respawns 3 times in 10 seconds, stop trying.
respawn limit 3 10

# Allow STARTUP_PROCESSES env variable to be sent to the job. If
# STARTUP_PROCESSES is true (default), the VM will start the DTC binaries. If it
# is false, the kernel parameter -p maitred.no_startup_processes will be added
# preventing the DTC binaries from starting.
import STARTUP_PROCESSES

# Allow TEST_DBUS_CONFIG env variable to be sent to the job. If
# TEST_DBUS_CONFIG is true, the VM will start dbus with a test
# configuration. If it is false (default) the production config is used.
# TODO(tbegin): remove this parameter when the wilco_dtc VM can be built in a
# test configuration.
import TEST_DBUS_CONFIG

env STARTUP_PROCESSES=true
env TEST_DBUS_CONFIG=false
env MAITRED_LISTEN_PORT=7788
env MAITRED_PORT=8888
env VM_CPUS=1
env VM_MEM=128
env VM_CID=512
env VM_PATH=/opt/wilco/dtc-vm
env RUNTIME_PATH=/run/wilco-vm
env STORAGE_PATH=/var/lib/wilco
env STORAGE_FILE=/var/lib/wilco/storage.img
env STORAGE_SIZE=64M

pre-start script
  # Sanitize the STARTUP_PROCESSES and TEST_DBUS_CONFIG environment variables
  # to ensure they are boolean values.
  case "${STARTUP_PROCESSES}" in
    true|false) ;;
    *)
      logger -t "${UPSTART_JOB}" \
        "STARTUP_PROCESSES env variable is not a boolean"
      exit 1
      ;;
  esac

  case "${TEST_DBUS_CONFIG}" in
    true|false) ;;
    *)
      logger -t "${UPSTART_JOB}" \
        "TEST_DBUS_CONFIG env variable is not a boolean"
      exit 1
      ;;
  esac

  # Make sure the vsock module is loaded.
  modprobe -q vhost-vsock

  # Create the runtime directory.
  if [ -d "${RUNTIME_PATH}" ]; then
    rm -r "${RUNTIME_PATH}"
  fi
  mkdir "${RUNTIME_PATH}"
  chown -R wilco_dtc:wilco_dtc "${RUNTIME_PATH}"

  # Create persistent VM storage if it does not exist.
  if [ ! -d "${STORAGE_PATH}" ]; then
    mkdir -p "${STORAGE_PATH}"
  fi

  if [ ! -f "${STORAGE_FILE}" ]; then
    truncate  --size "${STORAGE_SIZE}" "${STORAGE_FILE}"
    mkfs.ext4 "${STORAGE_FILE}"
    chown wilco_dtc:wilco_dtc "${STORAGE_FILE}"

  # If the VM storage exists but is not the correct size, attempt to resize it.
  elif [ "$(du -h --apparent-size "${STORAGE_FILE}" | cut -f1)" != \
         "${STORAGE_SIZE}" ]; then

    # Used jailing parameters:
    #   -e: new network namespace;
    #   -l: new IPC namespace;
    #   -n: the no_new_privs bit;
    #   -N: new cgroup namespace;
    #   -p: new PID namespace;
    #   -r: remount /proc readonly;
    #   -v: new VFS namespace;
    #   -u, -g: user account and group;
    #   --profile: Set up a minimalistic mount namespace;
    #   -k /var: a new tmpfs filesystem for /var;
    #   -b ${STORAGE_PATH}: give read/write access to persistent storage;
    minijail0 -e -l -n -N -p -r -v \
      -u wilco_dtc -g wilco_dtc \
      --profile=minimalistic-mountns \
      -k 'var,/var,tmpfs,MS_NODEV|MS_NOSUID|MS_NOEXEC' \
      -b "${STORAGE_PATH}",,1 \
      -S /usr/share/policy/wilco-dtc-e2fsck-seccomp.policy \
      -- /sbin/e2fsck -fp "${STORAGE_FILE}"

    minijail0 -e -l -n -N -p -r -v \
      -u wilco_dtc -g wilco_dtc \
      --profile=minimalistic-mountns \
      -k 'var,/var,tmpfs,MS_NODEV|MS_NOSUID|MS_NOEXEC' \
      -b "${STORAGE_PATH}",,1 \
      -S /usr/share/policy/wilco-dtc-resize2fs-seccomp.policy \
      -- /sbin/resize2fs "${STORAGE_FILE}" "${STORAGE_SIZE}"
  fi

end script

# Used jailing parameters:
#   -e: new network namespace;
#   -i: exit after forking;
#   -l: new IPC namespace;
#   -n: the no_new_privs bit;
#   -N: new cgroup namespace;
#   -p: new PID namespace;
#   -r: remount /proc readonly;
#   -t: a new tmpfs filesystem for /tmp;
#   -v: new VFS namespace;
#   --uts: new UTS/hostname namespace;
#   -u, -g: user account and group;
#   -G: inherit supplementary groups;
#   --mount-dev: a new /dev mount;
#   --profile: minimalistic mount namespace;
#   -k /run: a new tmpfs filesystem for /run, with the subsequent parameters
#       mounting specific files into this directory;
#   -k /var: a new tmpfs filesystem for /var
#   -b /dev/chromeos-low-mem: crosvm can alert system of low memory;
#   -b /dev/log: provide minijail log access;
#   -b /dev/kvm: give access to crosvm to start VMs;
#   -b /dev/vhost-vsock: give access for VM communication;
#   -b ${STORAGE_PATH}: give access to persistent storage;
#   -b ${DIAGNOSTICS_PARTITION}: give read only access to diagnostics partition;
#   -b ${RUNTIME_PATH}: temporary directories to create VM sock
script

  # Give wilco_dtc permission to read the diagnostics partition.
  DIAGNOSTICS_PARTITION="$(cgpt find -l DIAGNOSTICS $(rootdev -d -s) | head -1)"
  setfacl -m u:wilco_dtc:r "${DIAGNOSTICS_PARTITION}"

  # Parse the environment variables.
  set --
  if [ "${STARTUP_PROCESSES}" = false ]; then
    set -- "$@" -p maitred.no_startup_processes
  fi

  if [ "${TEST_DBUS_CONFIG}" = true ]; then
    set -- "$@" -p dtc.use_test_dbus_config
  fi

  exec minijail0 -e -l -n -N -p -r -t -v --uts \
    -u wilco_dtc -g wilco_dtc \
    -G \
    --mount-dev \
    --profile=minimalistic-mountns \
    -k 'tmpfs,/run,tmpfs,MS_NODEV|MS_NOSUID|MS_NOEXEC,mode=755,size=10M' \
    -k 'var,/var,tmpfs,MS_NODEV|MS_NOSUID|MS_NOEXEC,mode=755,size=32M' \
    -b /dev/chromeos-low-mem \
    -b /dev/log \
    -b /dev/kvm,,1 \
    -b /dev/vhost-vsock,,1 \
    -b "${STORAGE_PATH}",,1 \
    -b "${DIAGNOSTICS_PARTITION}" \
    -b "${RUNTIME_PATH}",,1 \
    -- /usr/bin/crosvm run \
         -r "${VM_PATH}"/vm_rootfs.img \
         -p maitred.listen_port="${MAITRED_LISTEN_PORT}" \
         -p printk.devkmsg=on \
         --serial num=1,type=syslog,console=false \
         --syslog-tag wilco_dtc \
         -c "${VM_CPUS}" \
         -m "${VM_MEM}" \
         -s "${RUNTIME_PATH}" \
         --cid "${VM_CID}" \
         -d "${DIAGNOSTICS_PARTITION}" \
         --rwdisk "${STORAGE_FILE}" \
         "$@" \
         "${VM_PATH}"/vm_kernel
end script

post-start script
  # Default cpu.shares is 1024. Limit the Wilco VM to 1/8th of that.
  cgroup_dir="/sys/fs/cgroup/cpu/wilco-dtc"
  mkdir -p "${cgroup_dir}"
  echo $(status | cut -f 4 -d ' ') > "${cgroup_dir}/tasks"
  echo 128 > "${cgroup_dir}/cpu.shares"
end script

pre-stop script
  maitred_client --cid=512 --port=8888 --shutdown
end script
