blob: 3159cf2c9096d907edadb51d99b3ebb577e72758 [file] [log] [blame]
# 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 "Chrome OS Machine Learning service"
author "chromium-os-dev@chromium.org"
# This daemon is started by D-Bus service activation configured in
# ml/dbus/org.chromium.MachineLearning.service and
# ml/dbus/org.chromium.MachineLearning.AdaptiveCharging.service
stop on stopping system-services
expect fork
import TASK
export TASK
instance ${TASK}
pre-start script
logger -t "${UPSTART_JOB}" "Pre-start ml-service task=${TASK}"
mkdir -m 0755 -p /var/lib/ml_service/metrics
chown -R ml-service:ml-service /var/lib/ml_service
# TASK can be "mojo_service" for a general ml-service or "adaptive_charging"
# for adaptive charging dbus service.
if [ "${TASK}" != "mojo_service" -a "${TASK}" != "adaptive_charging" ]; then
logger -t "${UPSTART_JOB}" "ERROR: unknown TASK ${TASK}, quit."
stop
exit 0
fi
# Check if system-services is still running before starting ml-service.
# This is to prevent new dbus-activated instances from getting started once
# the system is beginning to shut down.
if ! initctl status system-services | grep -q running; then
logger -t "${UPSTART_JOB}" "ERROR: system services not running, quit."
stop
exit 0
fi
end script
script
if [ "${TASK}" = "mojo_service" ]; then
# --profile=minimalistic-mountns Mount namespace with basic mounts
# includes /var/empty, /, /proc (RO), /dev/log, /tmp (tmpfs)
# -b /var/lib/ml_service for ml_service metrics
# -b /var/lib/metrics for uma metrics
# -k /run/imageloader with MS_BIND|MS_REC to pick up any new DLC package
# mounts
# We have to use nested minijail to enable correct userns set-up: the outer
# minijail mainly does the mounting and the inner minijail set up the
# userns. Also we have remount "/proc" by making it writable because we need
# to write to /proc/[pid]/uid_map etc.
# The uid/gid 20106 is for ml-service's control process.
# The uid/gid 20177 is for bootstrapping DBus connection because DBus
# requires the process connecting to it to have the same euid inside and
# outside of the userns.
exec minijail0 -n -p -l -r -v -N -i -I --uts -Kslave \
--profile=minimalistic-mountns \
-k 'proc,/proc,proc,MS_NOSUID|MS_NODEV|MS_NOEXEC' \
-k tmpfs,/var,tmpfs \
-k tmpfs,/run,tmpfs \
-k '/run/imageloader,/run/imageloader,none,MS_BIND|MS_REC' \
-b /run/dbus \
-b /var/lib/ml_service,,1 \
-b /var/lib/metrics,,1 \
-- /sbin/minijail0 -Kslave -U -I -v -M"0 20106 1,20177 20177 1" \
-m"0 20106 1,20177 20177 1" \
-k 'proc,/proc,proc,MS_NOSUID|MS_NODEV|MS_NOEXEC|MS_RDONLY' \
-S /usr/share/policy/ml_service-seccomp.policy \
-- /usr/bin/ml_service --task=mojo_service
elif [ "${TASK}" = "adaptive_charging" ]; then
# adaptive_charging doesn't require a nested minijail.
# TODO(alanlxl): customize seccomp to make it run in a tighter sandbox.
exec minijail0 -e -i -n -p -l --uts -c 0 \
--profile=minimalistic-mountns \
-k tmpfs,/var,tmpfs \
-k tmpfs,/run,tmpfs \
-b /run/dbus \
-b /var/lib/ml_service,,1 \
-b /var/lib/metrics,,1 \
-S /usr/share/policy/ml_service-seccomp.policy \
-u ml-service -g ml-service \
-- /usr/bin/ml_service --task=adaptive_charging
fi
end script
post-start script
local dbus_interface
if [ "${TASK}" = "mojo_service" ]; then
dbus_interface="org.chromium.MachineLearning"
elif [ "${TASK}" = "adaptive_charging" ]; then
dbus_interface="org.chromium.MachineLearning.AdaptiveCharging"
fi
logger -t "${UPSTART_JOB}" "Post-start ml-service task=${TASK}"
# Wait for daemon to claim its D-Bus name before transitioning to started.
exec minijail0 -u ml-service -g ml-service /usr/bin/gdbus \
wait --system --timeout 15 ${dbus_interface}
end script
post-stop exec logger -t "${UPSTART_JOB}" "Post-stop ml-service task=${TASK}"