Set correct python version for non-chroot scripts

Some phases of diskimage-builder run outside the chroot environment,
such as the extra-data.d scripts, and don't have access to dib-python.
This means these scripts may choose the wrong python version by using
"#!/usr/bin/env python" to execute. The svc-map element is an example.

This patch creates a temporary directory and symbolic link for the
correct version of python, then manipulates the environment PATH
to preference the symbolic link "python" command.
This will allow elements with these scripts to work correctly with
the version of python diskimage-builder is running under.

Change-Id: I289d621e1bfbba0eb174dff977d1a5c92c04e4fa
Co-Authored-By: Ian Wienand <iwienand@redhat.com>
This commit is contained in:
Michael Johnson 2019-12-03 16:55:25 -08:00 committed by Carlos Goncalves
parent 4ca306cc0e
commit 9c7b8d1714
3 changed files with 18 additions and 0 deletions

View File

@ -241,6 +241,14 @@ function cleanup_image_dir () {
rm -rf --one-file-system $TMP_IMAGE_DIR rm -rf --one-file-system $TMP_IMAGE_DIR
} }
function cleanup_temp_python_exec () {
if [ ! -z "$DIB_ORIGINAL_PATH" ]; then
export PATH=$DIB_ORIGINAL_PATH
fi
rm "$DIB_PYTHON_EXEC_TMP/python" || true
rmdir "$DIB_PYTHON_EXEC_TMP" || true
}
# Run a directory of hooks outside the target (that is, no chrooting). # Run a directory of hooks outside the target (that is, no chrooting).
function run_d() { function run_d() {
check_element check_element

View File

@ -175,6 +175,14 @@ export DIB_DEBUG_TRACE
export DIB_IMAGE_CACHE=${DIB_IMAGE_CACHE:-~/.cache/image-create} export DIB_IMAGE_CACHE=${DIB_IMAGE_CACHE:-~/.cache/image-create}
mkdir -p $DIB_IMAGE_CACHE mkdir -p $DIB_IMAGE_CACHE
# Setup a symbolic link to the correct python exec so that element
# scripts running outside the chroot using "#!/usr/bin/env python" get
# the right python version.
export DIB_ORIGINAL_PATH=$PATH
export DIB_PYTHON_EXEC_TMP=$(mktemp -d -t --tmpdir=$HOME .DIB_PYTHON_TMP.XXXXXXXX)
ln -s "$DIB_PYTHON_EXEC" "$DIB_PYTHON_EXEC_TMP/python"
export PATH=$DIB_PYTHON_EXEC_TMP:$DIB_ORIGINAL_PATH
# We have a couple of critical sections (touching parts of the host # We have a couple of critical sections (touching parts of the host
# system or download images to common cache) that we use flock around. # system or download images to common cache) that we use flock around.
# Use this directory for lockfiles. # Use this directory for lockfiles.
@ -591,6 +599,7 @@ fi
# Remove the leftovers, i.e. the temporary image directory. # Remove the leftovers, i.e. the temporary image directory.
cleanup_image_dir cleanup_image_dir
cleanup_temp_python_exec
# Restore fd 1&2 from the outfilter.py redirect back to the original # Restore fd 1&2 from the outfilter.py redirect back to the original
# saved fd. Note small hack that we can't really wait properly for # saved fd. Note small hack that we can't really wait properly for

View File

@ -43,6 +43,7 @@ function cleanup () {
dib-block-device umount dib-block-device umount
cleanup_build_dir cleanup_build_dir
cleanup_image_dir cleanup_image_dir
cleanup_temp_python_exec
} }
# Helper function to run a command inside the chroot # Helper function to run a command inside the chroot