#!/bin/bash # reload the user profile [ -f /etc/profile ] && . /etc/profile LC_ALL=C # you can set CFLAGS before running installer CFLAGS="${CFLAGS--O3}" # keep a log of this command printf "\n# " >>netdata-installer.log date >>netdata-installer.log printf "CFLAGS=\"%s\" " "${CFLAGS}" >>netdata-installer.log printf "%q " "$0" "${@}" >>netdata-installer.log printf "\n" >>netdata-installer.log ME="$0" DONOTSTART=0 DONOTWAIT=0 NETDATA_PREFIX= ZLIB_IS_HERE=0 usage() { cat < Valid are: --install /PATH/TO/INSTALL If your give: --install /opt netdata will be installed in /opt/netdata --dont-start-it Do not (re)start netdata. Just install it. --dont-wait Do not wait for the user to press ENTER. Start immediately building it. --zlib-is-really-here If you get errors about missing zlib, but you know it is available, you have a broken pkg-config. Use this option to allow it continue without checking pkg-config. Netdata will by default be compiled with gcc optimization -O3 If you need to pass different CFLAGS, use something like this: CFLAGS="" $ME For the installer to complete successfully, you will need these packages installed: gcc make autoconf automake pkg-config zlib1g-dev For the plugins, you will at least need: curl node USAGE } while [ ! -z "${1}" ] do if [ "$1" = "--install" ] then NETDATA_PREFIX="${2}/netdata" shift 2 elif [ "$1" = "--zlib-is-really-here" ] then ZLIB_IS_HERE=1 shift 1 elif [ "$1" = "--dont-start-it" ] then DONOTSTART=1 shift 1 elif [ "$1" = "--dont-wait" ] then DONOTWAIT=1 shift 1 elif [ "$1" = "--help" -o "$1" = "-h" ] then usage exit 1 else echo >&2 echo >&2 "ERROR:" echo >&2 "I cannot understand option '$1'." usage exit 1 fi done cat < /dev/null)" ] then autoconf_maj_min() { local maj min IFS=.- maj=$1 min=$2 set -- $(autoreconf -V | sed -ne '1s/.* \([^ ]*\)$/\1/p') eval $maj=\$1 $min=\$2 } autoconf_maj_min AMAJ AMIN if [ "$AMAJ" -gt 2 ] then have_autotools=Y elif [ "$AMAJ" -eq 2 -a "$AMIN" -ge 60 ] then have_autotools=Y else echo "Found autotools $AMAJ.$AMIN" fi else echo "No autotools found" fi if [ ! "$have_autotools" ] then if [ -f configure ] then echo "Will skip autoreconf step" else cat <<-"EOF" ------------------------------------------------------------------------------- autotools 2.60 or later is required Sorry, you do not seem to have autotools 2.60 or later, which is required to build from the git sources of netdata. You can either install a suitable version of autotools and automake or download a netdata package which does not have these dependencies. Source packages where autotools have already been run are available here: https://firehol.org/download/netdata/ The unsigned/master folder tracks the head of the git tree and released packages are also available. EOF exit 1 fi fi if [ ${DONOTWAIT} -eq 0 ] then if [ ! -z "${NETDATA_PREFIX}" ] then read -p "Press ENTER to build and install netdata to '${NETDATA_PREFIX}' > " else read -p "Press ENTER to build and install netdata to your system > " fi fi build_error() { cat <&2 "\n" printf >&2 ":-----------------------------------------------------------------------------\n" printf >&2 "Running command:\n" printf >&2 "\n" printf >&2 "%q " "${@}" printf >&2 "\n" printf >&2 "\n" "${@}" } if [ ${ZLIB_IS_HERE} -eq 1 ] then shift echo >&2 "ok, assuming zlib is really installed." export ZLIB_CFLAGS=" " export ZLIB_LIBS="-lz" fi trap build_error EXIT if [ "$have_autotools" ] then run ./autogen.sh || exit 1 fi run ./configure \ --prefix="${NETDATA_PREFIX}/usr" \ --sysconfdir="${NETDATA_PREFIX}/etc" \ --localstatedir="${NETDATA_PREFIX}/var" \ --with-zlib --with-math --with-user=netdata \ CFLAGS="${CFLAGS}" || exit 1 # remove the build_error hook trap - EXIT if [ -f src/netdata ] then echo >&2 "Cleaning a possibly old compilation ..." run make clean fi echo >&2 "Compiling netdata ..." run make || exit 1 # backup user configurations for x in apps_groups.conf charts.d.conf do if [ -f "${NETDATA_PREFIX}/etc/netdata/${x}" ] then cp -p "${NETDATA_PREFIX}/etc/netdata/${x}" "${NETDATA_PREFIX}/etc/netdata/${x}.installer_backup" fi done echo >&2 "Installing netdata ..." run make install || exit 1 # restore user configurations for x in apps_groups.conf charts.d.conf do if [ -f "${NETDATA_PREFIX}/etc/netdata/${x}.installer_backup" ] then cp -p "${NETDATA_PREFIX}/etc/netdata/${x}.installer_backup" "${NETDATA_PREFIX}/etc/netdata/${x}" fi done if [ ${UID} -eq 0 ] then echo >&2 "Adding netdata user group ..." getent group netdata > /dev/null || run groupadd -r netdata echo >&2 "Adding netdata user account ..." getent passwd netdata > /dev/null || run useradd -r -g netdata -c netdata -s /sbin/nologin -d / netdata fi # ----------------------------------------------------------------------------- # load options from the configuration file # create an empty config if it does not exist [ ! -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ] && touch "${NETDATA_PREFIX}/etc/netdata/netdata.conf" # function to extract values from the config file config_option() { local key="${1}" value="${2}" line= if [ -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ] then line="$( grep "^[[:space:]]*${key}[[:space:]]*=[[:space:]]*" "${NETDATA_PREFIX}/etc/netdata/netdata.conf" | head -n 1 )" [ ! -z "${line}" ] && value="$( echo "${line}" | cut -d '=' -f 2 | sed -e "s/^[[:space:]]\+//g" -e "s/[[:space:]]\+$//g" )" fi echo "${value}" } # user defuser="netdata" [ ! "${UID}" = "0" ] && defuser="${USER}" NETDATA_USER="$( config_option "run as user" "${defuser}" )" NETDATA_WEB_USER="$( config_option "web files owner" "${defuser}" )" NETDATA_WEB_GROUP="$( config_option "web files group" "${NETDATA_WEB_USER}" )" # debug flags defdebug=0 NETDATA_DEBUG="$( config_option "debug flags" ${defdebug} )" # port defport=19999 NETDATA_PORT="$( config_option "port" ${defport} )" # directories NETDATA_CACHE_DIR="$( config_option "cache directory" "${NETDATA_PREFIX}/var/cache/netdata" )" NETDATA_WEB_DIR="$( config_option "web files directory" "${NETDATA_PREFIX}/usr/share/netdata/web" )" NETDATA_LOG_DIR="$( config_option "log directory" "${NETDATA_PREFIX}/var/log/netdata" )" NETDATA_CONF_DIR="$( config_option "config directory" "${NETDATA_PREFIX}/etc/netdata" )" NETDATA_RUN_DIR="${NETDATA_PREFIX}/var/run" # ----------------------------------------------------------------------------- # prepare the directories # this is needed if NETDATA_PREFIX is not empty if [ ! -d "${NETDATA_RUN_DIR}" ] then mkdir -p "${NETDATA_RUN_DIR}" || exit 1 fi echo >&2 "Fixing directories (user: ${NETDATA_USER})..." for x in "${NETDATA_WEB_DIR}" "${NETDATA_CONF_DIR}" "${NETDATA_CACHE_DIR}" "${NETDATA_LOG_DIR}" do if [ ! -d "${x}" ] then echo >&2 "Creating directory '${x}'" run mkdir -p "${x}" || exit 1 fi if [ ${UID} -eq 0 ] then if [ "${x}" = "${NETDATA_WEB_DIR}" ] then run chown -R "${NETDATA_WEB_USER}:${NETDATA_WEB_GROUP}" "${x}" || echo >&2 "WARNING: Cannot change the ownership of the files in directory ${x} to ${NETDATA_WEB_USER}:${NETDATA_WEB_GROUP}..." else run chown -R "${NETDATA_USER}:${NETDATA_USER}" "${x}" || echo >&2 "WARNING: Cannot change the ownership of the files in directory ${x} to ${NETDATA_USER}..." fi fi run chmod 0775 "${x}" || echo >&2 "WARNING: Cannot change the permissions of the directory ${x} to 0755..." done if [ ${UID} -eq 0 ] then # fix apps.plugin to be setuid to root run chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin" run chmod 4755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin" fi # ----------------------------------------------------------------------------- # check if we can re-start netdata if [ ${DONOTSTART} -eq 1 ] then if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ] then echo >&2 "Generating empty config file in: ${NETDATA_PREFIX}/etc/netdata/netdata.conf" echo "# Get config from http://127.0.0.1:${NETDATA_PORT}/netdata.conf" >"${NETDATA_PREFIX}/etc/netdata/netdata.conf" if [ "${UID}" -eq 0 ] then chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf" fi chmod 0664 "${NETDATA_PREFIX}/etc/netdata/netdata.conf" fi echo >&2 "OK. It is now installed and ready." exit 0 fi # ----------------------------------------------------------------------------- # stop a running netdata isnetdata() { [ -z "$1" -o ! -f "/proc/$1/stat" ] && return 1 [ "$(cat "/proc/$1/stat" | cut -d '(' -f 2 | cut -d ')' -f 1)" = "netdata" ] && return 0 return 1 } printf >&2 "Stopping a (possibly) running netdata..." ret=0 count=0 while [ $ret -eq 0 ] do if [ $count -gt 30 ] then echo >&2 "Cannot stop the running netdata." exit 1 fi count=$((count + 1)) pid=$(cat "${NETDATA_RUN_DIR}/netdata.pid" 2>/dev/null) # backwards compatibility [ -z "${pid}" ] && pid=$(cat /var/run/netdata.pid 2>/dev/null) [ -z "${pid}" ] && pid=$(cat /var/run/netdata/netdata.pid 2>/dev/null) isnetdata $pid || pid= if [ ! -z "${pid}" ] then run kill $pid 2>/dev/null ret=$? else run killall netdata 2>/dev/null ret=$? fi test $ret -eq 0 && printf >&2 "." && sleep 2 done echo >&2 echo >&2 # ----------------------------------------------------------------------------- # run netdata echo >&2 "Starting netdata..." run ${NETDATA_PREFIX}/usr/sbin/netdata -pidfile ${NETDATA_RUN_DIR}/netdata.pid "${@}" if [ $? -ne 0 ] then echo >&2 echo >&2 "SORRY! FAILED TO START NETDATA!" exit 1 else echo >&2 "OK. NetData Started!" fi # ----------------------------------------------------------------------------- # save a config file, if it is not already there if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ] then echo >&2 "Downloading default configuration from netdata..." sleep 5 # remove a possibly obsolete download [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" # disable a proxy to get data from the local netdata export http_proxy= export https_proxy= # try wget wget 2>/dev/null -O "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf" ret=$? # try curl if [ $ret -ne 0 -o ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] then curl -s -o "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf" ret=$? fi if [ $ret -eq 0 -a -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] then mv "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "${NETDATA_PREFIX}/etc/netdata/netdata.conf" echo >&2 "New configuration saved for you to edit at ${NETDATA_PREFIX}/etc/netdata/netdata.conf" if [ "${UID}" -eq 0 ] then chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf" fi chmod 0664 "${NETDATA_PREFIX}/etc/netdata/netdata.conf" else echo >&2 "Cannnot download configuration from netdata daemon using url 'http://localhost:${NETDATA_PORT}/netdata.conf'" [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" fi fi # ----------------------------------------------------------------------------- # Check for KSM ksm_is_available_but_disabled() { cat </sys/kernel/mm/ksm/run echo 1000 >/sys/kernel/mm/ksm/sleep_millisecs If you enable it, you will save 40-60% of netdata memory. KSM1 } ksm_is_not_available() { cat <netdata-uninstaller.sh <&2 "This script will REMOVE netdata from your system." echo >&2 "Run it again with --force to do it." exit 1 fi echo >&2 "Stopping a possibly running netdata..." killall netdata sleep 2 deletedir() { if [ ! -z "\$1" -a -d "\$1" ] then echo echo "Deleting directory '\$1' ..." rm -I -R "\$1" fi } if [ ! -z "${NETDATA_PREFIX}" -a -d "${NETDATA_PREFIX}" ] then # installation prefix was given deletedir "${NETDATA_PREFIX}" else # installation prefix was NOT given if [ -f "${NETDATA_PREFIX}/usr/sbin/netdata" ] then echo "Deleting ${NETDATA_PREFIX}/usr/sbin/netdata ..." rm -i "${NETDATA_PREFIX}/usr/sbin/netdata" fi deletedir "${NETDATA_PREFIX}/etc/netdata" deletedir "${NETDATA_PREFIX}/usr/share/netdata" deletedir "${NETDATA_PREFIX}/usr/libexec/netdata" deletedir "${NETDATA_PREFIX}/var/cache/netdata" deletedir "${NETDATA_PREFIX}/var/log/netdata" fi getent passwd netdata > /dev/null if [ $? -eq 0 ] then echo echo "You may also want to remove the user netdata" echo "by running:" echo " userdel netdata" fi getent group netdata > /dev/null if [ $? -eq 0 ] then echo echo "You may also want to remove the group netdata" echo "by running:" echo " groupdel netdata" fi UNINSTALL chmod 750 netdata-uninstaller.sh # ----------------------------------------------------------------------------- cat <&2 "Uninstall script generated: ./netdata-uninstaller.sh"