blob: bf25191bc5dc16f90e26e8fde928116113b718b7 [file] [log] [blame]
#!/bin/sh
# Exit as soon as there is an unexpected error.
set -e
#
# usage: install.sh
# curl -sSL https://raw.githubusercontent.com/vmware/cloud-init-vmware-guestinfo/master/install.sh | sh -
#
# The repository from which to fetch the cloud-init datasource and config files.
REPO_SLUG="${REPO_SLUG:-https://raw.githubusercontent.com/vmware/cloud-init-vmware-guestinfo}"
# The git reference to use. This can be a branch or tag name as well as a commit ID.
GIT_REF="${GIT_REF:-master}"
if ! command -v curl >/dev/null 2>&1; then
echo "curl is required" 1>&2
exit 1
fi
if ! command -v python >/dev/null 2>&1 && \
! command -v python3 >/dev/null 2>&1; then
echo "python 2 or 3 is required" 1>&2
exit 1
fi
# PYTHON_VERSION may be 2 or 3 and indicates which version of Python
# is used by cloud-init. This variable is not set until PY_MOD_CLOUD_INIT
# is resolved.
PYTHON_VERSION=
get_py_mod_dir() {
_script='import os; import '"${1-}"'; print(os.path.dirname('"${1-}"'.__file__));'
case "${PYTHON_VERSION}" in
2)
python -c ''"${_script}"'' 2>/dev/null || echo ""
;;
3)
python3 -c ''"${_script}"'' 2>/dev/null || echo ""
;;
*)
{ python3 -c ''"${_script}"'' || python -c ''"${_script}"'' || echo ""; } 2>/dev/null
;;
esac
}
# PY_MOD_CLOUD_INIT is set to the the "cloudinit" directory in either
# the Python2 or Python3 lib directory. This is also used to determine
# which version of Python is repsonsible for running cloud-init.
PY_MOD_CLOUD_INIT="$(get_py_mod_dir cloudinit)"
if [ -z "${PY_MOD_CLOUD_INIT}" ]; then
echo "cloudinit is required" 1>&2
exit 1
fi
if echo "${PY_MOD_CLOUD_INIT}" | grep -q python2; then
PYTHON_VERSION=2
else
PYTHON_VERSION=3
fi
echo "using python ${PYTHON_VERSION}"
# The python modules deepmerge and netifaces are required. If they are
# already installed, an assumption is made they are the correct versions.
# Otherwise an attempt is made to install them with pip.
if [ -z "$(get_py_mod_dir deepmerge)" ] || [ -z "$(get_py_mod_dir netifaces)" ]; then
echo "installing requirements"
if [ -z "$(get_py_mod_dir pip)" ]; then
echo "pip is required" 1>&2
exit 1
fi
_requirements="requirements.txt"
if [ ! -f "${_requirements}" ]; then
_requirements="$(mktemp)"
curl -sSL -o "${_requirements}" "${REPO_SLUG}/${GIT_REF}/requirements.txt"
fi
case "${PYTHON_VERSION}" in
2)
python -m pip install -r "${_requirements}"
;;
3)
python3 -m pip install -r "${_requirements}"
;;
esac
fi
# Download the cloud init datasource into the cloud-init's "sources" directory.
echo "installing datasource"
curl -sSL -o "${PY_MOD_CLOUD_INIT}/sources/DataSourceVMwareGuestInfo.py" \
"${REPO_SLUG}/${GIT_REF}/DataSourceVMwareGuestInfo.py"
# Make sure that the datasource can execute without error on this host.
echo "validating datasource"
case "${PYTHON_VERSION}" in
2)
python "${PY_MOD_CLOUD_INIT}/sources/DataSourceVMwareGuestInfo.py" 1>/dev/null
;;
3)
python3 "${PY_MOD_CLOUD_INIT}/sources/DataSourceVMwareGuestInfo.py" 1>/dev/null
;;
esac
# Add the configuration file that tells cloud-init what datasource to use.
echo "installing config"
mkdir -p /etc/cloud/cloud.cfg.d
curl -sSL -o /etc/cloud/cloud.cfg.d/99-DataSourceVMwareGuestInfo.cfg \
"${REPO_SLUG}/${GIT_REF}/99-DataSourceVMwareGuestInfo.cfg"
# Download program used by ds-identify to determine whether or not the
# VMwareGuestInfo datasource is useable.
echo "installing dscheck"
curl -sSL -o "/usr/bin/dscheck_VMwareGuestInfo" \
"${REPO_SLUG}/${GIT_REF}/dscheck_VMwareGuestInfo.sh"
chmod 0755 "/usr/bin/dscheck_VMwareGuestInfo"
echo "So long, and thanks for all the fish."