#!/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."