# $Id: setup-routines.sh 56295 2015-06-09 14:29:55Z vboxsync $
## @file
# VirtualBox Validation Kit - TestBoxScript Service Setup on Mac OS X (darwin).
#
#
# Copyright (C) 2006-2015 Oracle Corporation
#
# This file is part of VirtualBox Open Source Edition (OSE), as
# available from http://www.virtualbox.org. This file is free software;
# you can redistribute it and/or modify it under the terms of the GNU
# General Public License (GPL) as published by the Free Software
# Foundation, in version 2 as it comes in the "COPYING" file of the
# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
#
# The contents of this file may alternatively be used under the terms
# of the Common Development and Distribution License Version 1.0
# (CDDL) only, as it comes in the "COPYING.CDDL" file of the
# VirtualBox OSE distribution, in which case the provisions of the
# CDDL are applicable instead of those of the GPL.
#
# You may elect to license modified versions of this file under the
# terms and conditions of either the GPL or the CDDL or both.
#
MY_CONFIG_FILE=/Library/LaunchDaemons/org.virtualbox.testboxscript.plist
##
# Checks for a boolean option pair --$2/--no-$2 in the XMLARGS variable,
# storing the result in the TESTBOXSCRIPT_XXX variable $1.
darwin_check_for_option_bool() {
MY_TMP=`echo "${XMLARGS}" | sed -ne 's|^.*--'"$2"'.*$|yes|p'`
if [ -n "${MY_TMP}" ]; then
eval $1="yes";
fi
MY_TMP=`echo "${XMLARGS}" | sed -ne 's|^.*--no-'"$2"'.*$|yes|p'`
if [ -n "${MY_TMP}" ]; then
eval $1="no";
fi
return 0;
}
##
# Checks for an option $2 taking an argument, storing the result in the
# TESTBOXSCRIPT_XXX variable $1.
darwin_check_for_option_arg() {
MY_TMP=`echo "${XMLARGS}" | sed -ne 's|^.*--'"$2"' *\([^<>]*\).*$|\1|p'`
if [ -n "${MY_TMP}" ]; then
eval $1="\"${MY_TMP}\"";
fi
return 0;
}
##
# Loads config values from the current installation.
#
os_load_config() {
if [ -r "${MY_CONFIG_FILE}" ]; then
# User.
MY_TMP=`/usr/bin/tr '\n' ' ' < "${MY_CONFIG_FILE}" \
| /usr/bin/sed \
-e 's/ */ /g' \
-e 's|\([[:alnum:]]*>\)<|\1 <|g' \
-e 's|^.*UserName *\([^<>]*\).*$|\1|'`;
if [ -n "${MY_TMP}" ]; then
TESTBOXSCRIPT_USER="${MY_TMP}";
fi
# Arguments.
XMLARGS=`/usr/bin/tr '\n' ' ' < "${MY_CONFIG_FILE}" \
| /usr/bin/sed \
-e 's/ */ /g' \
-e 's|\([[:alnum:]]*>\)<|\1 <|g' \
-e 's|^.*ProgramArguments * *\(.*\).*$|\1|'`;
darwin_check_for_option_arg TESTBOXSCRIPT_SYSTEM_UUID system-uuid
darwin_check_for_option_arg TESTBOXSCRIPT_SCRATCH_ROOT scratch-root
darwin_check_for_option_arg TESTBOXSCRIPT_TEST_MANAGER test-manager
darwin_check_for_option_bool TESTBOXSCRIPT_HWVIRT hwvirt
darwin_check_for_option_bool TESTBOXSCRIPT_NESTED_PAGING nested-paging
darwin_check_for_option_bool TESTBOXSCRIPT_IOMMU io-mmu
darwin_check_for_option_arg TESTBOXSCRIPT_BUILDS_PATH builds-path
darwin_check_for_option_arg TESTBOXSCRIPT_BUILDS_TYPE builds-server-type
darwin_check_for_option_arg TESTBOXSCRIPT_BUILDS_NAME builds-server-name
darwin_check_for_option_arg TESTBOXSCRIPT_BUILDS_SHARE builds-server-share
darwin_check_for_option_arg TESTBOXSCRIPT_BUILDS_USER builds-server-user
darwin_check_for_option_arg TESTBOXSCRIPT_BUILDS_PASSWD builds-server-passwd
darwin_check_for_option_arg TESTBOXSCRIPT_TESTRSRC_PATH testrsrc-path
darwin_check_for_option_arg TESTBOXSCRIPT_TESTRSRC_TYPE testrsrc-server-type
darwin_check_for_option_arg TESTBOXSCRIPT_TESTRSRC_NAME testrsrc-server-name
darwin_check_for_option_arg TESTBOXSCRIPT_TESTRSRC_SHARE testrsrc-server-share
darwin_check_for_option_arg TESTBOXSCRIPT_TESTRSRC_USER testrsrc-server-user
darwin_check_for_option_arg TESTBOXSCRIPT_TESTRSRC_PASSWD testrsrc-server-passwd
## @TODO darwin_check_for_option_arg TESTBOXSCRIPT_PYTHON python
fi
}
##
# Adds an argument ($1) to MY_ARGV (XML plist format).
#
darwin_add_args() {
while [ $# -gt 0 ];
do
case "$1" in
*\<* | *\>* | *\&*)
MY_TMP='`echo "$1" | sed -e 's/&/&/g' -e 's/</g' -e 's/>/>/g'`';
MY_ARGV="${MY_ARGV} ${MY_TMP}";
;;
*)
MY_ARGV="${MY_ARGV} $1";
;;
esac
shift;
done
MY_ARGV="${MY_ARGV}"'
';
return 0;
}
os_install_service() {
MY_ARGV=""
if [ -n "${TESTBOXSCRIPT_PYTHON}" ]; then
darwin_add_args "${TESTBOXSCRIPT_PYTHON}"
fi
darwin_add_args "${TESTBOXSCRIPT_DIR}/testboxscript/testboxscript.py"
if [ "${TESTBOXSCRIPT_HWVIRT}" = "yes" ]; then darwin_add_args "--hwvirt"; fi
if [ "${TESTBOXSCRIPT_HWVIRT}" = "no" ]; then darwin_add_args "--no-hwvirt"; fi
if [ "${TESTBOXSCRIPT_NESTED_PAGING}" = "yes" ]; then darwin_add_args "--nested-paging"; fi
if [ "${TESTBOXSCRIPT_NESTED_PAGING}" = "no" ]; then darwin_add_args "--no-nested-paging"; fi
if [ "${TESTBOXSCRIPT_IOMMU}" = "yes" ]; then darwin_add_args "--io-mmu"; fi
if [ "${TESTBOXSCRIPT_IOMMU}" = "no" ]; then darwin_add_args "--no-io-mmu"; fi
if [ -n "${TESTBOXSCRIPT_SYSTEM_UUID}" ]; then darwin_add_args "--system-uuid" "${TESTBOXSCRIPT_SYSTEM_UUID}"; fi
if [ -n "${TESTBOXSCRIPT_TEST_MANAGER}" ]; then darwin_add_args "--test-manager" "${TESTBOXSCRIPT_TEST_MANAGER}"; fi
if [ -n "${TESTBOXSCRIPT_SCRATCH_ROOT}" ]; then darwin_add_args "--scratch-root" "${TESTBOXSCRIPT_SCRATCH_ROOT}"; fi
if [ -n "${TESTBOXSCRIPT_BUILDS_PATH}" ]; then darwin_add_args "--builds-path" "${TESTBOXSCRIPT_BUILDS_PATH}"; fi
if [ -n "${TESTBOXSCRIPT_BUILDS_TYPE}" ]; then darwin_add_args "--builds-server-type" "${TESTBOXSCRIPT_BUILDS_TYPE}"; fi
if [ -n "${TESTBOXSCRIPT_BUILDS_NAME}" ]; then darwin_add_args "--builds-server-name" "${TESTBOXSCRIPT_BUILDS_NAME}"; fi
if [ -n "${TESTBOXSCRIPT_BUILDS_SHARE}" ]; then darwin_add_args "--builds-server-share" "${TESTBOXSCRIPT_BUILDS_SHARE}"; fi
if [ -n "${TESTBOXSCRIPT_BUILDS_USER}" ]; then darwin_add_args "--builds-server-user" "${TESTBOXSCRIPT_BUILDS_USER}"; fi
if [ -n "${TESTBOXSCRIPT_BUILDS_PASSWD}" ]; then darwin_add_args "--builds-server-passwd" "${TESTBOXSCRIPT_BUILDS_PASSWD}"; fi
if [ -n "${TESTBOXSCRIPT_TESTRSRC_PATH}" ]; then darwin_add_args "--testrsrc-path" "${TESTBOXSCRIPT_PATH_TESTRSRC}"; fi
if [ -n "${TESTBOXSCRIPT_BUILDS_TYPE}" ]; then darwin_add_args "--testrsrc-server-type" "${TESTBOXSCRIPT_TESTRSRC_TYPE}"; fi
if [ -n "${TESTBOXSCRIPT_BUILDS_NAME}" ]; then darwin_add_args "--testrsrc-server-name" "${TESTBOXSCRIPT_TESTRSRC_NAME}"; fi
if [ -n "${TESTBOXSCRIPT_BUILDS_SHARE}" ]; then darwin_add_args "--testrsrc-server-share" "${TESTBOXSCRIPT_TESTRSRC_SHARE}"; fi
if [ -n "${TESTBOXSCRIPT_BUILDS_USER}" ]; then darwin_add_args "--testrsrc-server-user" "${TESTBOXSCRIPT_TESTRSRC_USER}"; fi
if [ -n "${TESTBOXSCRIPT_BUILDS_PASSWD}" ]; then darwin_add_args "--testrsrc-server-passwd" "${TESTBOXSCRIPT_TESTRSRC_PASSWD}"; fi
# Note! It's not possible to use screen 4.0.3 with the launchd due to buggy
# "setsid off" handling (and possible other things).
cat > "${MY_CONFIG_FILE}" <
Label org.virtualbox.testboxscript
UserName ${TESTBOXSCRIPT_USER}
WorkingDirectory ${TESTBOXSCRIPT_DIR}
Enabled
RunAtLoad
KeepAlive
StandardInPath /dev/null
StandardOutPath /dev/null
StandardErrorPath /dev/null
ProgramArguments
${MY_ARGV}
EOF
return 0;
}
os_enable_service() {
launchctl load "${MY_CONFIG_FILE}"
return 0;
}
os_disable_service() {
if [ -r "${MY_CONFIG_FILE}" ]; then
launchctl unload "${MY_CONFIG_FILE}"
fi
return 0;
}
os_add_user() {
NEWUID=$(expr `dscl . -readall /Users UniqueID | sed -ne 's/UniqueID: *\([0123456789]*\) *$/\1/p' | sort -n | tail -1 ` + 1)
if [ -z "$NEWUID" -o "${NEWUID}" -lt 502 ]; then
NEWUID=502;
fi
dscl . -create "/Users/${TESTBOXSCRIPT_USER}" UserShell /bin/bash
dscl . -create "/Users/${TESTBOXSCRIPT_USER}" RealName "VBox Test User"
dscl . -create "/Users/${TESTBOXSCRIPT_USER}" UniqueID ${NEWUID}
dscl . -create "/Users/${TESTBOXSCRIPT_USER}" PrimaryGroupID 80
dscl . -create "/Users/${TESTBOXSCRIPT_USER}" NFSHomeDirectory "/Users/vbox"
dscl . -passwd "/Users/${TESTBOXSCRIPT_USER}" "password"
mkdir -p "/Users/${TESTBOXSCRIPT_USER}"
}
os_final_message() {
cat <