From 128af6b2d04581ef18998de397f1b5e8e0fea860 Mon Sep 17 00:00:00 2001 From: Nathan Dunne Date: Mon, 26 Oct 2020 11:12:22 +0000 Subject: [PATCH] arm-autonomy/xenguest-manager: source init scripts source init scripts in xenguest manager instead of executing directly, so they can immediately access functions and variables from the parent script. Also added a check that init scripts are executable, and will skip if not. Change-Id: Ie6bbb1b480a7bfe5af095addcf1aefd122b57c50 Issue-Id: SCM-1587 Signed-off-by: Nathan Dunne Signed-off-by: Jon Mason --- .../documentation/xenguest-manager.md | 38 ++++++++++- .../xenguest/files/network-bridge.sh.in | 9 ++- .../xenguest/files/xenguest-manager | 68 ++++++++++++------- 3 files changed, 82 insertions(+), 33 deletions(-) diff --git a/meta-arm-autonomy/documentation/xenguest-manager.md b/meta-arm-autonomy/documentation/xenguest-manager.md index 387af944..93453bfb 100644 --- a/meta-arm-autonomy/documentation/xenguest-manager.md +++ b/meta-arm-autonomy/documentation/xenguest-manager.md @@ -48,16 +48,16 @@ project compilation (those can be set in your project local.conf, for example). The following parameters are available: -- XENGUEST_MANAGER_VOLUME_DEVICE: This is the device path used by the +- XENGUEST_MANAGER_VOLUME_DEVICE: This is the device path used by the xenguest-manager on the device to create LVM disks when guests have a disk configuration. This is set by default to "/dev/sda2". -- XENGUEST_MANAGER_VOLUME_NAME: This is the LVM volume name that the +- XENGUEST_MANAGER_VOLUME_NAME: This is the LVM volume name that the xenguest-manager will create and use to create guest LVM disks. This is set by default to "vg-xen". -- XENGUEST_MANAGER_GUEST_DIR: This is the directory on Dom0 where the +- XENGUEST_MANAGER_GUEST_DIR: This is the directory on Dom0 where the xenguest-manager will look for xenguest images to create during init. That's the place where xenguest images can be added to have them automatically created during next Dom0 boot. The xenguests found there will only be created @@ -65,3 +65,35 @@ The following parameters are available: name). This is set by default to "/usr/share/guests". +Init scripts +------------ + +Shell scripts can be executed on the host when a guest is started. Depending on +when the script should be executed it should be installed in a different +directory on the target: + +- /etc/xenguest/init.pre : Executed first, prior to guest creation + +- /etc/xenguest/init.d : Executed after guest creation, but before it is started + +- /etc/xenguest/init.post : Executed after starting the guest + +Inside the directory, scripts will be executed in alphabetical order. + +Since these scripts are sourced by xenguest-manager they can acccess functions +and variables from the parent file's scope, including: + +- ${guestname} : The name of the guest being created + +- ${guestdir} : The path to the guest directory + +- ${LOGFILE} : The file to append any logging to, e.g. + echo "Hello, World" >> ${LOGFILE} + +Sourcing also allows the script to access params.cfg. + + +An example of how to create the directory and install an init shell script can +be found in: + recipes-extended/xenguest/xenguest-network.bb +Where network-bridge.sh is installed from network-bridge.sh.in diff --git a/meta-arm-autonomy/recipes-extended/xenguest/files/network-bridge.sh.in b/meta-arm-autonomy/recipes-extended/xenguest/files/network-bridge.sh.in index 752f4987..42ccb703 100755 --- a/meta-arm-autonomy/recipes-extended/xenguest/files/network-bridge.sh.in +++ b/meta-arm-autonomy/recipes-extended/xenguest/files/network-bridge.sh.in @@ -1,14 +1,13 @@ #!/bin/sh # This script is setting up a virtual network interface connected to the # xenguest-network-bridge if NETWORK_BRIDGE is set to 1 in the guest params - -guestname="${1}" +# +# Since this script is sourced by xenguest-manager, it can access variables +# such as ${guestname} from the parent file's scope, as well as those in +# params.cfg, for example XENGUEST_NETWORK_TYPE BRIDGE_NAME="###BRIDGE_NAME###" -# get guest parameters -. ./params.cfg - case "${XENGUEST_NETWORK_TYPE:-}" in nat) # Create the symlinks for the files that vif-nat script expects diff --git a/meta-arm-autonomy/recipes-extended/xenguest/files/xenguest-manager b/meta-arm-autonomy/recipes-extended/xenguest/files/xenguest-manager index d55c9ffe..4d598455 100755 --- a/meta-arm-autonomy/recipes-extended/xenguest/files/xenguest-manager +++ b/meta-arm-autonomy/recipes-extended/xenguest/files/xenguest-manager @@ -475,6 +475,9 @@ function xenguest_guest_start() # Build init script lists (ignore non existing dirs errors, # sort alphabetically and run global scripts first) + # + # These scripts are sourced throughout the start operation if they + # are executable init_pre="$(find ${XENGUEST_CONF_BASE}/init.pre -type f 2> /dev/null | \ sort) $(find ${guestdir}/init.pre -type f 2> /dev/null | sort)" init_d="$(find ${XENGUEST_CONF_BASE}/init.d -type f 2> /dev/null | \ @@ -484,13 +487,18 @@ function xenguest_guest_start() # call pre init scripts for f in ${init_pre}; do - echo "$f ${guestname}" >> ${LOGFILE} 2>&1 - $f ${guestname} >> ${LOGFILE} 2>&1 - if [ $? -ne 0 ]; then - rm -f ${guestname}.cfg - popd > /dev/null 2>&1 - echo "${PREF} Error during pre init script of ${guestname}" - exit 1 + if [ -x "$f" ]; then + echo "( . $f )" >> ${LOGFILE} 2>&1 + ( . $f ) >> ${LOGFILE} 2>&1 + if [ $? -ne 0 ]; then + rm -f ${guestname}.cfg + popd > /dev/null 2>&1 + echo "Error in init script $f" >> ${LOGFILE} 2>&1 + echo "${PREF} Error during pre init script of ${guestname}" + exit 1 + fi + else + echo "$f is not executable. Skipping." >> ${LOGFILE} fi done @@ -506,15 +514,20 @@ function xenguest_guest_start() # call init scripts for f in ${init_d}; do - echo "$f ${guestname}" >> ${LOGFILE} 2>&1 - $f ${guestname} >> ${LOGFILE} 2>&1 - if [ $? -ne 0 ]; then - rm -f ${guestname}.cfg - echo "xl destroy ${guestname}" >> ${LOGFILE} 2>&1 - xl destroy ${guestname} >> ${LOGFILE} 2>&1 - popd > /dev/null 2>&1 - echo "${PREF} Error during init script of ${guestname}" - exit 1 + if [ -x "$f" ]; then + echo "( . $f )" >> ${LOGFILE} 2>&1 + ( . $f ) >> ${LOGFILE} 2>&1 + if [ $? -ne 0 ]; then + rm -f ${guestname}.cfg + echo "xl destroy ${guestname}" >> ${LOGFILE} 2>&1 + xl destroy ${guestname} >> ${LOGFILE} 2>&1 + popd > /dev/null 2>&1 + echo "Error in init script $f" >> ${LOGFILE} 2>&1 + echo "${PREF} Error during init script of ${guestname}" + exit 1 + fi + else + echo "$f is not executable. Skipping." >> ${LOGFILE} fi done @@ -530,15 +543,20 @@ function xenguest_guest_start() # call post init scripts for f in ${init_post}; do - echo "$f ${guestname}" >> ${LOGFILE} 2>&1 - $f ${guestname} >> ${LOGFILE} 2>&1 - if [ $? -ne 0 ]; then - rm -f ${guestname}.cfg - echo "xl destroy ${guestname}" >> ${LOGFILE} 2>&1 - xl destroy ${guestname} >> ${LOGFILE} 2>&1 - popd > /dev/null 2>&1 - echo "${PREF} Error during post init script of ${guestname}" - exit 1 + if [ -x "$f" ]; then + echo "( . $f )" >> ${LOGFILE} 2>&1 + ( . $f ) >> ${LOGFILE} 2>&1 + if [ $? -ne 0 ]; then + rm -f ${guestname}.cfg + echo "xl destroy ${guestname}" >> ${LOGFILE} 2>&1 + xl destroy ${guestname} >> ${LOGFILE} 2>&1 + popd > /dev/null 2>&1 + echo "Error in init script $f" >> ${LOGFILE} 2>&1 + echo "${PREF} Error during post init script of ${guestname}" + exit 1 + fi + else + echo "$f is not executable. Skipping." >> ${LOGFILE} fi done