summaryrefslogtreecommitdiffstats
path: root/python.d/python-modules-installer.sh
diff options
context:
space:
mode:
Diffstat (limited to 'python.d/python-modules-installer.sh')
-rw-r--r--python.d/python-modules-installer.sh158
1 files changed, 158 insertions, 0 deletions
diff --git a/python.d/python-modules-installer.sh b/python.d/python-modules-installer.sh
new file mode 100644
index 000000000..cda3c6662
--- /dev/null
+++ b/python.d/python-modules-installer.sh
@@ -0,0 +1,158 @@
+#!/usr/bin/env bash
+
+umask 022
+
+dir="/usr/local/libexec/netdata/python.d"
+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