#!/usr/bin/env bash umask 022 dir="@pythondir_POST@" target="${dir}/python_modules" pv="$(python -V 2>&1)" # parse parameters while [ ! -z "${1}" ] do case "${1}" in -p|--python) pv="Python ${2}" shift 2 ;; -d|--dir) dir="${2}" target="${dir}/python_modules" echo >&2 "Will install python modules in: '${target}'" shift 2 ;; -s|--system) target= echo >&2 "Will install python modules system-wide" shift ;; -h|--help) echo "${0} [--dir netdata-python.d-path] [--system]" echo "Please make sure you have installed packages: python-pip (or python3-pip) python-dev libyaml-dev libmysqlclient-dev" exit 0 ;; *) echo >&2 "Cannot understand parameter: ${1}" exit 1 ;; esac done if [ ! -z "${target}" -a ! -d "${target}" ] then echo >&2 "Cannot find directory: '${target}'" exit 1 fi if [[ "${pv}" =~ ^Python\ 2.* ]] then pv=2 pip="$(which pip2 2>/dev/null)" elif [[ "${pv}" =~ ^Python\ 3.* ]] then pv=3 pip="$(which pip3 2>/dev/null)" else echo >&2 "Cannot detect python version. Is python installed?" exit 1 fi [ -z "${pip}" ] && pip="$(which pip 2>/dev/null)" if [ -z "${pip}" ] then echo >&2 "pip command is required to install python v${pv} modules." [ "${pv}" = "2" ] && echo >&2 "Please install python-pip." [ "${pv}" = "3" ] && echo >&2 "Please install python3-pip." exit 1 fi echo >&2 "Working for python version ${pv} (pip command: '${pip}')" echo >&2 "Installing netdata python modules in: '${target}'" run() { printf "Running command:\n# " printf "%q " "${@}" printf "\n" "${@}" } # try to install all the python modules given as parameters # until the first that succeeds failed="" installed="" errors=0 pip_install() { local ret x msg="${1}" shift echo >&2 echo >&2 echo >&2 "Installing one of: ${*}" for x in "${@}" do echo >&2 echo >&2 "attempting to install: ${x}" if [ ! -z "${target}" ] then run "${pip}" install --target "${target}" "${x}" ret=$? else run "${pip}" install "${x}" ret=$? fi [ ${ret} -eq 0 ] && break echo >&2 "failed to install: ${x}. ${msg}" done if [ ${ret} -ne 0 ] then echo >&2 echo >&2 echo >&2 "FAILED: could not install any of: ${*}. ${msg}" echo >&2 echo >&2 errors=$(( errors + 1 )) failed="${failed}|${*}" else echo >&2 echo >&2 echo >&2 "SUCCESS: we have: ${x}" echo >&2 echo >&2 installed="${installed} ${x}" fi return ${ret} } if [ "${pv}" = "2" ] then pip_install "is libyaml-dev and python-dev installed?" pyyaml pip_install "is libmysqlclient-dev and python-dev installed?" mysqlclient mysql-python pymysql else pip_install "is libyaml-dev and python-dev installed?" pyyaml pip_install "is libmysqlclient-dev and python-dev installed?" mysql-python mysqlclient pymysql fi echo >&2 echo >&2 if [ ${errors} -ne 0 ] then echo >&2 "Failed to install ${errors} modules: ${failed}" if [ ! -z "${target}" ] then echo >&2 echo >&2 "If you are getting errors during cleanup from pip, there is a known bug" echo >&2 "in certain versions of pip that prevents installing packages local to an" echo >&2 "application. To install them system-wide please run:" echo >&2 "$0 --system" fi exit 1 else echo >&2 "All done. We have: ${installed}" exit 0 fi