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