blob: 9b798380520f20ec19940ef18e0b061227f4e694 [file] [log] [blame]
# Copyright 2020 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 "Run /system/bin/adbd (bridge)"
author "chromium-os-dev@chromium.org"
start on starting arcvm-post-vm-start-services
stop on stopping arcvm-post-vm-start-services
# There is no point to have this service when the VM it talks to has
# been killed in oom case, so the value should be higher than the VM
# instance.
oom score -100
# The service will allocate some buffers.
limit as 150000000 150000000
env PIDFILE=/run/arc/adbd.pid
env RUNTIME_DIR=/run/arc/adbd
# The following environment variables are passed from Chrome.
import SERIALNUMBER
import ARCVM_CID
pre-start script
logger -t "${UPSTART_JOB}" "Pre-start arcvm-adbd"
# Validity check against serial number is derived from Android CTS.
if ! echo "${SERIALNUMBER}" | grep -q -E '^[0-9A-Za-z]{6,20}$'; then
logger -t "${UPSTART_JOB}" "ERROR: Serial number is invalid."
stop
exit 0
fi
# Validity check cid of VM that is defined as unsigned integer.
# In arc-adbd service the CID is for guest VM so it should start
# from 3. (Refer to the man page of vsock)
if ! echo "${ARCVM_CID}" | grep -q -E '^(([3-9])|([1-9][0-9]+))$'; then
logger -t "${UPSTART_JOB}" "ERROR: CID of ARCVM is invalid."
stop
exit 0
fi
# Clean up a stale pid file if exists.
if ! rm -f "${PIDFILE}"; then
logger -t "${UPSTART_JOB}" "ERROR: Failed to remove ${PIDFILE}"
stop
exit 0
fi
end script
script
# Start constructing minijail0 args...
args="minijail0"
# Use a minimalistic mount namespace.
args="${args} --profile minimalistic-mountns"
# Enter a new mount namespace.
args="${args} -v"
# Enter a new PID namespace.
args="${args} -p"
# Skip remounting as private.
args="${args} -K"
# Enter a new IPC namespace.
args="${args} -l"
# Create PID file at $PIDFILE.
args="${args} -f $PIDFILE"
# Set up mount points.
args="${args} -b /sys,/sys"
args="${args} -k tmpfs,/run,tmpfs,MS_NOSUID|MS_NODEV|MS_NOEXEC"
# Set up seccomp-bpf.
args="${args} -S /usr/share/policy/arcvm-adbd-seccomp.policy"
# Allow only CAP_CHOWN, CAP_DAC_OVERRIDE, CAP_DAC_READ_SEARCH,
# CAP_SYS_MODULE, CAP_SYS_ADMIN.
args="${args} -n -c 210007 --ambient"
# Finally, specify the command line arguments.
args="${args} -- /usr/sbin/arc-adbd \
--serialnumber=${SERIALNUMBER} \
--arcvm_cid=${ARCVM_CID}"
logger -t "${UPSTART_JOB}" "Executing: ${args}"
exec ${args}
end script
post-stop script
{
echo "Post-stop arcvm-adbd"
set +e -x
# Perform best-effort unmounting of the bulk endpoints.
umount --lazy "${RUNTIME_DIR}"/ep1
umount --lazy "${RUNTIME_DIR}"/ep2
exec rm -f "${RUNTIME_DIR}/"*
} 2>&1 | logger -t "${UPSTART_JOB}"
end script