X-Git-Url: https://arthur.barton.de/gitweb/?p=netdata.git;a=blobdiff_plain;f=netdata-installer.sh;h=f926f14f2809ed7610673729ece7dd2fc8cdf973;hp=f38d1c665c17eff67b7979616348e5cba49e8149;hb=32e8eda4c4d6370e96233a69cab861b2ebb5cc9a;hpb=e95a54e3835e81ca9c859859af170bd7c7cb53d7 diff --git a/netdata-installer.sh b/netdata-installer.sh index f38d1c66..f926f14f 100755 --- a/netdata-installer.sh +++ b/netdata-installer.sh @@ -1,9 +1,42 @@ #!/usr/bin/env bash +export PATH="${PATH}:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin" + +netdata_source_dir="$(pwd)" +installer_dir="$(dirname "${0}")" + +if [ "${netdata_source_dir}" != "${installer_dir}" -a "${installer_dir}" != "." ] + then + echo >&2 "Warninng: you are currently in '${netdata_source_dir}' but the installer is in '${installer_dir}'." +fi + + +# ----------------------------------------------------------------------------- # reload the user profile + [ -f /etc/profile ] && . /etc/profile +# make sure /etc/profile does not change our current directory +cd "${netdata_source_dir}" || exit 1 + + +# ----------------------------------------------------------------------------- +# load the required functions + +if [ -f "${installer_dir}/installer/functions.sh" ] + then + source "${installer_dir}/installer/functions.sh" || exit 1 +else + source "${netdata_source_dir}/installer/functions.sh" || exit 1 +fi + +# make sure we save all commands we run +run_logfile="netdata-installer.log" + + +# ----------------------------------------------------------------------------- # fix PKG_CHECK_MODULES error + if [ -d /usr/share/aclocal ] then ACLOCAL_PATH=${ACLOCAL_PATH-/usr/share/aclocal} @@ -11,10 +44,17 @@ then fi LC_ALL=C -umask 022 +umask 002 + +# Be nice on production environments +renice 19 $$ >/dev/null 2>/dev/null + +processors=$(cat /proc/cpuinfo 2>/dev/null | grep ^processor | wc -l) +[ $(( processors )) -lt 1 ] && processors=1 # you can set CFLAGS before running installer -CFLAGS="${CFLAGS--O3}" +CFLAGS="${CFLAGS--O2}" +[ "z${CFLAGS}" = "z-O3" ] && CFLAGS="-O2" # keep a log of this command printf "\n# " >>netdata-installer.log @@ -23,545 +63,640 @@ printf "CFLAGS=\"%s\" " "${CFLAGS}" >>netdata-installer.log printf "%q " "$0" "${@}" >>netdata-installer.log printf "\n" >>netdata-installer.log +REINSTALL_PWD="${PWD}" +REINSTALL_COMMAND="$(printf "%q " "$0" "${@}"; printf "\n")" + +setcap="$(which setcap 2>/dev/null || command -v setcap 2>/dev/null)" + ME="$0" DONOTSTART=0 DONOTWAIT=0 NETDATA_PREFIX= LIBS_ARE_HERE=0 +NETDATA_CONFIGURE_OPTIONS="${NETDATA_CONFIGURE_OPTIONS-}" usage() { - cat <<-USAGE + netdata_banner "installer command line options" + cat < + +Valid are: + + --install /PATH/TO/INSTALL - ${ME} + If you give: --install /opt + netdata will be installed in /opt/netdata - Valid are: + --dont-start-it - --install /PATH/TO/INSTALL + Do not (re)start netdata. + Just install it. - If your give: --install /opt - netdata will be installed in /opt/netdata + --dont-wait - --dont-start-it + Do not wait for the user to press ENTER. + Start immediately building it. - Do not (re)start netdata. - Just install it. + --enable-plugin-freeipmi + --disable-plugin-freeipmi - --dont-wait + Enable/disable the FreeIPMI plugin. + Default: enable it when libipmimonitoring is available. - Do not wait for the user to press ENTER. - Start immediately building it. + --enable-plugin-nfacct + --disable-plugin-nfacct - --zlib-is-really-here - --libs-are-really-here + Enable/disable the nfacct plugin. + Default: enable it when libmnl and libnetfilter_acct are available. - If you get errors about missing zlib, - or libuuid but you know it is available, - you have a broken pkg-config. - Use this option to allow it continue - without checking pkg-config. + --enable-lto + --disable-lto - Netdata will by default be compiled with gcc optimization -O3 - If you need to pass different CFLAGS, use something like this: + Enable/disable Link-Time-Optimization + Default: enabled - CFLAGS="" ${ME} + --zlib-is-really-here + --libs-are-really-here - For the installer to complete successfully, you will need - these packages installed: + If you get errors about missing zlib, + or libuuid but you know it is available, + you have a broken pkg-config. + Use this option to allow it continue + without checking pkg-config. - gcc make autoconf automake pkg-config zlib1g-dev (or zlib-devel) - uuid-dev (or libuuid-devel) +Netdata will by default be compiled with gcc optimization -O2 +If you need to pass different CFLAGS, use something like this: - For the plugins, you will at least need: + CFLAGS="" ${ME} - curl nodejs +For the installer to complete successfully, you will need +these packages installed: + + gcc make autoconf automake pkg-config zlib1g-dev (or zlib-devel) + uuid-dev (or libuuid-devel) + +For the plugins, you will at least need: + + curl nodejs USAGE } -md5sum="$(which md5sum 2>/dev/null || command -v md5sum 2>/dev/null)" +md5sum="$(which md5sum 2>/dev/null || command -v md5sum 2>/dev/null || command -v md5 2>/dev/null)" get_git_config_signatures() { - local x s file md5 - - [ ! -d "conf.d" ] && echo >&2 "Wrong directory." && return 1 - [ -z "${md5sum}" -o ! -x "${md5sum}" ] && echo >&2 "No md5sum command." && return 1 - - echo >configs.signatures.tmp - - for x in $(find conf.d -name \*.conf) - do - x="${x/conf.d\//}" - echo "${x}" - for c in $(git log --follow "conf.d/${x}" | grep ^commit | cut -d ' ' -f 2) - do - git checkout ${c} "conf.d/${x}" || continue - s="$(cat "conf.d/${x}" | md5sum | cut -d ' ' -f 1)" - echo >>configs.signatures.tmp "${x}:${s}" - echo " ${s}" - done - git checkout HEAD "conf.d/${x}" || break - done - - cat configs.signatures.tmp |\ - grep -v "^$" |\ - sort -u |\ - { - echo "declare -A configs_signatures=(" - IFS=":" - while read file md5 - do - echo " ['${md5}']='${file}'" - done - echo ")" - } >configs.signatures - - rm configs.signatures.tmp - - return 0 + local x s file md5 + + [ ! -d "conf.d" ] && echo >&2 "Wrong directory." && return 1 + [ -z "${md5sum}" -o ! -x "${md5sum}" ] && echo >&2 "No md5sum command." && return 1 + + echo >configs.signatures.tmp + + for x in $(find conf.d -name \*.conf) + do + x="${x/conf.d\//}" + echo "${x}" + for c in $(git log --follow "conf.d/${x}" | grep ^commit | cut -d ' ' -f 2) + do + git checkout ${c} "conf.d/${x}" || continue + s="$(cat "conf.d/${x}" | ${md5sum} | cut -d ' ' -f 1)" + echo >>configs.signatures.tmp "${s}:${x}" + echo " ${s}" + done + git checkout HEAD "conf.d/${x}" || break + done + + cat configs.signatures.tmp |\ + grep -v "^$" |\ + sort -u |\ + { + echo "declare -A configs_signatures=(" + IFS=":" + while read md5 file + do + echo " ['${md5}']='${file}'" + done + echo ")" + } >configs.signatures + + rm configs.signatures.tmp + + return 0 } while [ ! -z "${1}" ] do - if [ "$1" = "--install" ] - then - NETDATA_PREFIX="${2}/netdata" - shift 2 - elif [ "$1" = "--zlib-is-really-here" -o "$1" = "--libs-are-really-here" ] - then - LIBS_ARE_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 - elif [ "$1" = "get_git_config_signatures" ] - then - get_git_config_signatures && exit 0 - exit 1 - else - echo >&2 - echo >&2 "ERROR:" - echo >&2 "I cannot understand option '$1'." - usage - exit 1 - fi + if [ "$1" = "--install" ] + then + NETDATA_PREFIX="${2}/netdata" + shift 2 + elif [ "$1" = "--zlib-is-really-here" -o "$1" = "--libs-are-really-here" ] + then + LIBS_ARE_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" = "--enable-plugin-freeipmi" ] + then + NETDATA_CONFIGURE_OPTIONS="${NETDATA_CONFIGURE_OPTIONS} --enable-plugin-freeipmi" + shift 1 + elif [ "$1" = "--disable-plugin-freeipmi" ] + then + NETDATA_CONFIGURE_OPTIONS="${NETDATA_CONFIGURE_OPTIONS} --disable-plugin-freeipmi" + shift 1 + elif [ "$1" = "--enable-plugin-nfacct" ] + then + NETDATA_CONFIGURE_OPTIONS="${NETDATA_CONFIGURE_OPTIONS} --enable-plugin-nfacct" + shift 1 + elif [ "$1" = "--disable-plugin-nfacct" ] + then + NETDATA_CONFIGURE_OPTIONS="${NETDATA_CONFIGURE_OPTIONS} --disable-plugin-nfacct" + shift 1 + elif [ "$1" = "--enable-lto" ] + then + NETDATA_CONFIGURE_OPTIONS="${NETDATA_CONFIGURE_OPTIONS} --enable-lto" + shift 1 + elif [ "$1" = "--disable-lto" ] + then + NETDATA_CONFIGURE_OPTIONS="${NETDATA_CONFIGURE_OPTIONS} --disable-lto" + shift 1 + elif [ "$1" = "--help" -o "$1" = "-h" ] + then + usage + exit 1 + elif [ "$1" = "get_git_config_signatures" ] + then + get_git_config_signatures && exit 0 + exit 1 + else + echo >&2 + echo >&2 "ERROR:" + echo >&2 "I cannot understand option '$1'." + usage + exit 1 + fi done -cat <<-BANNER - - Welcome to netdata! - Nice to see you are giving it a try! +netdata_banner "real-time performance monitoring, done right!" +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 + 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" + echo "No autotools found" fi if [ ! "$have_autotools" ] then - if [ -f configure ] - then - echo "Will skip autoreconf step" - else - cat <<-"EOF" + if [ -f configure ] + then + echo "Will skip autoreconf step" + else + netdata_banner "autotools v2.60 required" + cat <<"EOF" - ------------------------------------------------------------------------------- - autotools 2.60 or later is required +------------------------------------------------------------------------------- +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. +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. +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/ +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. +The unsigned/master folder tracks the head of the git tree and released +packages are also available. EOF - exit 1 - fi + 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 + then + if [ ! -z "${NETDATA_PREFIX}" ] + then + eval "read >&2 -ep \$'\001${TPUT_BOLD}${TPUT_GREEN}\002Press ENTER to build and install netdata to \'\001${TPUT_CYAN}\002${NETDATA_PREFIX}\001${TPUT_YELLOW}\002\'\001${TPUT_RESET}\002 > ' -e -r REPLY" + else + eval "read >&2 -ep \$'\001${TPUT_BOLD}${TPUT_GREEN}\002Press ENTER to build and install netdata to your system\001${TPUT_RESET}\002 > ' -e -r REPLY" + fi fi build_error() { - cat <<-EOF + netdata_banner "sorry, it failed to build..." + cat <>netdata-installer.log "# " - printf >>netdata-installer.log "%q " "${@}" - printf >>netdata-installer.log " ... " - - printf >&2 "\n" - printf >&2 ":-----------------------------------------------------------------------------\n" - printf >&2 "Running command:\n" - printf >&2 "\n" - printf >&2 "%q " "${@}" - printf >&2 "\n" - - "${@}" - - local ret=$? - if [ ${ret} -ne 0 ] - then - printf >>netdata-installer.log "FAILED!\n" - else - printf >>netdata-installer.log "OK\n" - fi - - return ${ret} + trap - EXIT + exit 1 } if [ ${LIBS_ARE_HERE} -eq 1 ] - then - shift - echo >&2 "ok, assuming libs are really installed." - export ZLIB_CFLAGS=" " - export ZLIB_LIBS="-lz" - export UUID_CFLAGS=" " - export UUID_LIBS="-luuid" + then + shift + echo >&2 "ok, assuming libs are really installed." + export ZLIB_CFLAGS=" " + export ZLIB_LIBS="-lz" + export UUID_CFLAGS=" " + export UUID_LIBS="-luuid" fi trap build_error EXIT + +# ----------------------------------------------------------------------------- +echo >&2 +progress "Run autotools to configure the build environment" + if [ "$have_autotools" ] then - run ./autogen.sh || exit 1 + 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 + --prefix="${NETDATA_PREFIX}/usr" \ + --sysconfdir="${NETDATA_PREFIX}/etc" \ + --localstatedir="${NETDATA_PREFIX}/var" \ + --with-zlib \ + --with-math \ + --with-user=netdata \ + ${NETDATA_CONFIGURE_OPTIONS} \ + 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 +# ----------------------------------------------------------------------------- +progress "Cleanup compilation directory" -echo >&2 "Compiling netdata ..." -run make || exit 1 +[ -f src/netdata ] && run make clean -declare -A configs_signatures=() -if [ -f "configs.signatures" ] - then - source "configs.signatures" || echo >&2 "ERROR: Failed to load configs.signatures !" -fi +# ----------------------------------------------------------------------------- +progress "Compile netdata" + +run make -j${processors} || exit 1 + + +# ----------------------------------------------------------------------------- +progress "Migrate configuration files for node.d.plugin and charts.d.plugin" # migrate existing configuration files # for node.d and charts.d if [ -d "${NETDATA_PREFIX}/etc/netdata" ] - then - # the configuration directory exists - - if [ ! -d "${NETDATA_PREFIX}/etc/netdata/charts.d" ] - then - run mkdir "${NETDATA_PREFIX}/etc/netdata/charts.d" - fi - - # move the charts.d config files - for x in apache ap cpu_apps cpufreq example exim hddtemp load_average mem_apps mysql nginx nut opensips phpfpm postfix sensors squid tomcat - do - for y in "" ".old" ".orig" - do - if [ -f "${NETDATA_PREFIX}/etc/netdata/${x}.conf${y}" ] - then - run mv -f "${NETDATA_PREFIX}/etc/netdata/${x}.conf${y}" "${NETDATA_PREFIX}/etc/netdata/charts.d/${x}.conf${y}" - fi - done - done - - if [ ! -d "${NETDATA_PREFIX}/etc/netdata/node.d" ] - then - run mkdir "${NETDATA_PREFIX}/etc/netdata/node.d" - fi - - # move the node.d config files - for x in named sma_webbox snmp - do - for y in "" ".old" ".orig" - do - if [ -f "${NETDATA_PREFIX}/etc/netdata/${x}.conf${y}" ] - then - run mv -f "${NETDATA_PREFIX}/etc/netdata/${x}.conf${y}" "${NETDATA_PREFIX}/etc/netdata/node.d/${x}.conf${y}" - fi - done - done + then + # the configuration directory exists + + if [ ! -d "${NETDATA_PREFIX}/etc/netdata/charts.d" ] + then + run mkdir "${NETDATA_PREFIX}/etc/netdata/charts.d" + fi + + # move the charts.d config files + for x in apache ap cpu_apps cpufreq example exim hddtemp load_average mem_apps mysql nginx nut opensips phpfpm postfix sensors squid tomcat + do + for y in "" ".old" ".orig" + do + if [ -f "${NETDATA_PREFIX}/etc/netdata/${x}.conf${y}" -a ! -f "${NETDATA_PREFIX}/etc/netdata/charts.d/${x}.conf${y}" ] + then + run mv -f "${NETDATA_PREFIX}/etc/netdata/${x}.conf${y}" "${NETDATA_PREFIX}/etc/netdata/charts.d/${x}.conf${y}" + fi + done + done + + if [ ! -d "${NETDATA_PREFIX}/etc/netdata/node.d" ] + then + run mkdir "${NETDATA_PREFIX}/etc/netdata/node.d" + fi + + # move the node.d config files + for x in named sma_webbox snmp + do + for y in "" ".old" ".orig" + do + if [ -f "${NETDATA_PREFIX}/etc/netdata/${x}.conf${y}" -a ! -f "${NETDATA_PREFIX}/etc/netdata/node.d/${x}.conf${y}" ] + then + run mv -f "${NETDATA_PREFIX}/etc/netdata/${x}.conf${y}" "${NETDATA_PREFIX}/etc/netdata/node.d/${x}.conf${y}" + fi + done + done fi +# ----------------------------------------------------------------------------- +progress "Backup existing netdata configuration before installing it" + +if [ "${BASH_VERSINFO[0]}" -ge "4" ] +then + declare -A configs_signatures=() + if [ -f "configs.signatures" ] + then + source "configs.signatures" || echo >&2 "ERROR: Failed to load configs.signatures !" + fi +fi + +config_signature_matches() { + local md5="${1}" file="${2}" + + if [ "${BASH_VERSINFO[0]}" -ge "4" ] + then + [ "${configs_signatures[${md5}]}" = "${file}" ] && return 0 + return 1 + fi + + if [ -f "configs.signatures" ] + then + grep "\['${md5}'\]='${file}'" "configs.signatures" >/dev/null + return $? + fi + + return 1 +} + # backup user configurations installer_backup_suffix="${PID}.${RANDOM}" for x in $(find "${NETDATA_PREFIX}/etc/netdata/" -name '*.conf' -type f) do - if [ -f "${x}" ] - then - # make a backup of the configuration file - cp -p "${x}" "${x}.old" - - if [ -z "${md5sum}" -o ! -x "${md5sum}" ] - then - # we don't have md5sum - keep it - cp -p "${x}" "${x}.installer_backup.${installer_backup_suffix}" - else - # find it relative filename - f="${x/*\/etc\/netdata\//}" - - # find its checksum - md5="$(cat "${x}" | ${md5sum} | cut -d ' ' -f 1)" - - # copy the original - if [ -f "conf.d/${f}" ] - then - cp "conf.d/${f}" "${x}.orig" - fi - - if [ "${configs_signatures[${md5}]}" = "${f}" ] - then - # it is a stock version - don't keep it - echo >&2 "File '${x}' is stock version." - else - # edited by user - keep it - echo >&2 "File '${x}' has been edited by user." - cp -p "${x}" "${x}.installer_backup.${installer_backup_suffix}" - fi - fi - - elif [ -f "${x}.installer_backup.${installer_backup_suffix}" ] - then - rm -f "${x}.installer_backup.${installer_backup_suffix}" - fi + if [ -f "${x}" ] + then + # make a backup of the configuration file + cp -p "${x}" "${x}.old" + + if [ -z "${md5sum}" -o ! -x "${md5sum}" ] + then + # we don't have md5sum - keep it + echo >&2 "File '${TPUT_CYAN}${x}${TPUT_RESET}' ${TPUT_RET}is not known to distribution${TPUT_RESET}. Keeping it." + run cp -p "${x}" "${x}.installer_backup.${installer_backup_suffix}" + else + # find it relative filename + f="${x/*\/etc\/netdata\//}" + + # find its checksum + md5="$(cat "${x}" | ${md5sum} | cut -d ' ' -f 1)" + + # copy the original + if [ -f "conf.d/${f}" ] + then + cp "conf.d/${f}" "${x}.orig" + fi + + if config_signature_matches "${md5}" "${f}" + then + # it is a stock version - don't keep it + echo >&2 "File '${TPUT_CYAN}${x}${TPUT_RESET}' is stock version." + else + # edited by user - keep it + echo >&2 "File '${TPUT_CYAN}${x}${TPUT_RESET}' ${TPUT_RED} has been edited by user${TPUT_RESET}. Keeping it." + run cp -p "${x}" "${x}.installer_backup.${installer_backup_suffix}" + fi + fi + + elif [ -f "${x}.installer_backup.${installer_backup_suffix}" ] + then + rm -f "${x}.installer_backup.${installer_backup_suffix}" + fi done -echo >&2 "Installing netdata ..." + +# ----------------------------------------------------------------------------- +progress "Install netdata" + run make install || exit 1 -# restore user configurations + +# ----------------------------------------------------------------------------- +progress "Restore user edited netdata configuration files" + for x in $(find "${NETDATA_PREFIX}/etc/netdata/" -name '*.conf' -type f) do - if [ -f "${x}.installer_backup.${installer_backup_suffix}" ] - then - cp -p "${x}.installer_backup.${installer_backup_suffix}" "${x}" - rm -f "${x}.installer_backup.${installer_backup_suffix}" - fi + if [ -f "${x}.installer_backup.${installer_backup_suffix}" ] + then + run cp -p "${x}.installer_backup.${installer_backup_suffix}" "${x}" && \ + run rm -f "${x}.installer_backup.${installer_backup_suffix}" + fi done + +# ----------------------------------------------------------------------------- +progress "Fix generated files permissions" + +run find ./system/ -type f -a \! -name \*.in -a \! -name Makefile\* -a \! -name \*.conf -a \! -name \*.service -a \! -name \*.logrotate -exec chmod 755 {} \; + + +# ----------------------------------------------------------------------------- +progress "Add user netdata to required user groups" + NETDATA_ADDED_TO_DOCKER=0 +NETDATA_ADDED_TO_NGINX=0 +NETDATA_ADDED_TO_VARNISH=0 +NETDATA_ADDED_TO_HAPROXY=0 +NETDATA_ADDED_TO_ADM=0 +NETDATA_ADDED_TO_NSD=0 +if [ ${UID} -eq 0 ] + then + portable_add_group netdata + portable_add_user netdata + portable_add_user_to_group docker netdata && NETDATA_ADDED_TO_DOCKER=1 + portable_add_user_to_group nginx netdata && NETDATA_ADDED_TO_NGINX=1 + portable_add_user_to_group varnish netdata && NETDATA_ADDED_TO_VARNISH=1 + portable_add_user_to_group haproxy netdata && NETDATA_ADDED_TO_HAPROXY=1 + portable_add_user_to_group adm netdata && NETDATA_ADDED_TO_ADM=1 + portable_add_user_to_group nsd netdata && NETDATA_ADDED_TO_NSD=1 + run_ok +else + run_failed "The installer does not run as root." +fi + +# ----------------------------------------------------------------------------- +progress "Install logrotate configuration for netdata" + if [ ${UID} -eq 0 ] - then - getent group netdata > /dev/null - if [ $? -ne 0 ] - then - echo >&2 "Adding netdata user group ..." - run groupadd -r netdata - fi - - getent passwd netdata > /dev/null - if [ $? -ne 0 ] - then - echo >&2 "Adding netdata user account ..." - run useradd -r -g netdata -c netdata -s $(which nologin || echo '/bin/false') -d / netdata - fi - - getent group docker > /dev/null - if [ $? -eq 0 ] - then - # find the users in the docker group - docker=$(getent group docker | cut -d ':' -f 4) - if [[ ",${docker}," =~ ,netdata, ]] - then - # netdata is already there - : - else - # netdata is not in docker group - echo >&2 "Adding netdata user to the docker group (needed to get container names) ..." - run usermod -a -G docker netdata - fi - # let the uninstall script know - NETDATA_ADDED_TO_DOCKER=1 - fi - - if [ -d /etc/logrotate.d -a ! -f /etc/logrotate.d/netdata ] - then - echo >&2 "Adding netdata logrotate configuration ..." - run cp system/netdata.logrotate /etc/logrotate.d/netdata - fi + then + if [ -d /etc/logrotate.d -a ! -f /etc/logrotate.d/netdata ] + then + run cp system/netdata.logrotate /etc/logrotate.d/netdata + fi + + if [ -f /etc/logrotate.d/netdata ] + then + run chmod 644 /etc/logrotate.d/netdata + fi fi # ----------------------------------------------------------------------------- -# load options from the configuration file +progress "Read installation options from netdata.conf" # create an empty config if it does not exist -[ ! -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ] && touch "${NETDATA_PREFIX}/etc/netdata/netdata.conf" +[ ! -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= + 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 + 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}" + echo "${value}" } -# user -defuser="netdata" -[ ! "${UID}" = "0" ] && defuser="${USER}" -NETDATA_USER="$( config_option "run as user" "${defuser}" )" +# the user netdata will run as +if [ "${UID}" = "0" ] + then + NETDATA_USER="$( config_option "run as user" "netdata" )" +else + NETDATA_USER="${USER}" +fi -NETDATA_WEB_USER="$( config_option "web files owner" "${defuser}" )" +# the owners of the web files +NETDATA_WEB_USER="$( config_option "web files owner" "${NETDATA_USER}" )" NETDATA_WEB_GROUP="$( config_option "web files group" "${NETDATA_WEB_USER}" )" # debug flags -defdebug=0 -NETDATA_DEBUG="$( config_option "debug flags" ${defdebug} )" +NETDATA_DEBUG="$( config_option "debug flags" 0 )" # port defport=19999 -NETDATA_PORT="$( config_option "port" ${defport} )" +NETDATA_PORT="$( config_option "default port" ${defport} )" +NETDATA_PORT2="$( config_option "port" ${defport} )" + +if [ "${NETDATA_PORT}" != "${NETDATA_PORT2}" ] +then + if [ "${NETDATA_PORT2}" != "${defport}" ] + then + NETDATA_PORT="${NETDATA_PORT2}" + fi +fi # directories NETDATA_LIB_DIR="$( config_option "lib directory" "${NETDATA_PREFIX}/var/lib/netdata" )" @@ -569,476 +704,758 @@ NETDATA_CACHE_DIR="$( config_option "cache directory" "${NETDATA_PREFIX}/var/cac 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_BIND="$( config_option "bind socket to IP" "*" )" NETDATA_RUN_DIR="${NETDATA_PREFIX}/var/run" # ----------------------------------------------------------------------------- -# prepare the directories +progress "Fix permissions of netdata directories (using user '${NETDATA_USER}')" -# this is needed if NETDATA_PREFIX is not empty if [ ! -d "${NETDATA_RUN_DIR}" ] - then - mkdir -p "${NETDATA_RUN_DIR}" || exit 1 + then + # this is needed if NETDATA_PREFIX is not empty + run mkdir -p "${NETDATA_RUN_DIR}" || exit 1 fi -echo >&2 -echo >&2 "Fixing directories (user: ${NETDATA_USER})..." -for x in "${NETDATA_WEB_DIR}" "${NETDATA_CONF_DIR}" "${NETDATA_CACHE_DIR}" "${NETDATA_LOG_DIR}" "${NETDATA_LIB_DIR}" "${NETDATA_CONF_DIR}/python.d" "${NETDATA_CONF_DIR}/charts.d" "${NETDATA_CONF_DIR}/node.d" +# --- conf dir ---- + +for x in "python.d" "charts.d" "node.d" +do + if [ ! -d "${NETDATA_CONF_DIR}/${x}" ] + then + echo >&2 "Creating directory '${NETDATA_CONF_DIR}/${x}'" + run mkdir -p "${NETDATA_CONF_DIR}/${x}" || exit 1 + fi +done +run chown -R "${NETDATA_USER}:${NETDATA_USER}" "${NETDATA_CONF_DIR}" +run find "${NETDATA_CONF_DIR}" -type f -exec chmod 0660 {} \; +run find "${NETDATA_CONF_DIR}" -type d -exec chmod 0775 {} \; + +# --- web dir ---- + +if [ ! -d "${NETDATA_WEB_DIR}" ] + then + echo >&2 "Creating directory '${NETDATA_WEB_DIR}'" + run mkdir -p "${NETDATA_WEB_DIR}" || exit 1 +fi +run chown -R "${NETDATA_WEB_USER}:${NETDATA_WEB_GROUP}" "${NETDATA_WEB_DIR}" +run find "${NETDATA_WEB_DIR}" -type f -exec chmod 0664 {} \; +run find "${NETDATA_WEB_DIR}" -type d -exec chmod 0775 {} \; + +# --- data dirs ---- + +for x in "${NETDATA_LIB_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 0755 "${x}" || echo >&2 "WARNING: Cannot change the permissions of the directory ${x} to 0755..." + if [ ! -d "${x}" ] + then + echo >&2 "Creating directory '${x}'" + run mkdir -p "${x}" || exit 1 + fi + + run chown -R "${NETDATA_USER}:${NETDATA_USER}" "${x}" + #run find "${x}" -type f -exec chmod 0660 {} \; + #run find "${x}" -type d -exec chmod 0770 {} \; done +run chmod 755 "${NETDATA_LOG_DIR}" + +# --- plugins ---- + if [ ${UID} -eq 0 ] - then - run chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin" - run chmod 0755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin" - run setcap cap_dac_read_search,cap_sys_ptrace+ep "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin" - if [ $? -ne 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 + then + # find the admin group + admin_group= + test -z "${admin_group}" && getent group root >/dev/null 2>&1 && admin_group="root" + test -z "${admin_group}" && getent group daemon >/dev/null 2>&1 && admin_group="daemon" + test -z "${admin_group}" && admin_group="${NETDATA_USER}" + + run chown "${NETDATA_USER}:${admin_group}" "${NETDATA_LOG_DIR}" + run chown -R root "${NETDATA_PREFIX}/usr/libexec/netdata" + run find "${NETDATA_PREFIX}/usr/libexec/netdata" -type d -exec chmod 0755 {} \; + run find "${NETDATA_PREFIX}/usr/libexec/netdata" -type f -exec chmod 0644 {} \; + run find "${NETDATA_PREFIX}/usr/libexec/netdata" -type f -a -name \*.plugin -exec chmod 0755 {} \; + run find "${NETDATA_PREFIX}/usr/libexec/netdata" -type f -a -name \*.sh -exec chmod 0755 {} \; + + setcap_ret=1 + if ! iscontainer + then + if [ ! -z "${setcap}" ] + then + run setcap cap_dac_read_search,cap_sys_ptrace+ep "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin" + setcap_ret=$? + fi + + if [ ${setcap_ret} -eq 0 ] + then + # if we managed to setcap + # but we fail to execute apps.plugin + # trigger setuid to root + "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin" -t >/dev/null 2>&1 + setcap_ret=$? + fi + fi + + if [ ${setcap_ret} -ne 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 + + if [ -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/freeipmi.plugin" ] + then + run chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/freeipmi.plugin" + run chmod 4755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/freeipmi.plugin" + fi + +else + run chown "${NETDATA_USER}:${NETDATA_USER}" "${NETDATA_LOG_DIR}" + run chown -R "${NETDATA_USER}:${NETDATA_USER}" "${NETDATA_PREFIX}/usr/libexec/netdata" + run find "${NETDATA_PREFIX}/usr/libexec/netdata" -type f -exec chmod 0755 {} \; + run find "${NETDATA_PREFIX}/usr/libexec/netdata" -type d -exec chmod 0755 {} \; fi +# --- fix #1292 bug --- + +[ -d "${NETDATA_PREFIX}/usr/libexec" ] && run chmod a+rX "${NETDATA_PREFIX}/usr/libexec" +[ -d "${NETDATA_PREFIX}/usr/share/netdata" ] && run chmod a+rX "${NETDATA_PREFIX}/usr/share/netdata" + + + # ----------------------------------------------------------------------------- -# check if we can re-start netdata +progress "Install netdata at system init" + +installed_init_d=0 +install_non_systemd_init() { + [ "${UID}" != 0 ] && return 1 + + local key="unknown" + if [ -f /etc/os-release ] + then + source /etc/os-release || return 1 + key="${ID}-${VERSION_ID}" + + elif [ -f /etc/centos-release ] + then + key=$(&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 +if [ "${UID}" -eq 0 ] + then + + if issystemd + then + # systemd is running on this system + + if [ ! -f /etc/systemd/system/netdata.service ] + then + echo >&2 "Installing systemd service..." + run cp system/netdata.service /etc/systemd/system/netdata.service && \ + run systemctl daemon-reload && \ + run systemctl enable netdata + fi + else + install_non_systemd_init + fi fi + # ----------------------------------------------------------------------------- -# stop a running netdata +# check if we can re-start netdata + +started=0 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 + if [ -d /proc/self ] + then + [ -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 + fi + return 0 } stop_netdata_on_pid() { - local pid="$1" ret=0 count=0 + local pid="${1}" ret=0 count=0 - isnetdata $pid || return 0 + isnetdata ${pid} || return 0 - printf >&2 "Stopping netdata on pid $pid ..." - while [ ! -z "$pid" -a $ret -eq 0 ] - do - if [ $count -gt 45 ] - then - echo >&2 "Cannot stop the running netdata on pid $pid." - return 1 - fi + printf >&2 "Stopping netdata on pid ${pid} ..." + while [ ! -z "$pid" -a ${ret} -eq 0 ] + do + if [ ${count} -gt 45 ] + then + echo >&2 "Cannot stop the running netdata on pid ${pid}." + return 1 + fi - count=$(( count + 1 )) + count=$(( count + 1 )) - run kill $pid 2>/dev/null - ret=$? + run kill ${pid} 2>/dev/null + ret=$? - test $ret -eq 0 && printf >&2 "." && sleep 2 - done + test ${ret} -eq 0 && printf >&2 "." && sleep 2 + done - echo >&2 - if [ $ret -eq 0 ] - then - echo >&2 "SORRY! CANNOT STOP netdata ON PID $pid !" - return 1 - fi + echo >&2 + if [ ${ret} -eq 0 ] + then + echo >&2 "SORRY! CANNOT STOP netdata ON PID ${pid} !" + return 1 + fi - echo >&2 "netdata on pid $pid stopped." - return 0 + echo >&2 "netdata on pid ${pid} stopped." + return 0 } stop_all_netdata() { - local p - - echo >&2 "Stopping a (possibly) running netdata..." - - for p in $(cat "${NETDATA_RUN_DIR}/netdata.pid" 2>/dev/null) \ - $(cat /var/run/netdata.pid 2>/dev/null) \ - $(cat /var/run/netdata/netdata.pid 2>/dev/null) \ - $(pidof netdata 2>/dev/null) - do - stop_netdata_on_pid $p - done -} - -# ----------------------------------------------------------------------------- -# check netdata for systemd + local p myns ns -issystemd() { - # if the directory /etc/systemd/system does not exit, it is not systemd - [ ! -d /etc/systemd/system ] && return 1 + myns="$(readlink /proc/self/ns/pid 2>/dev/null)" - # if pid 1 is systemd, it is systemd - [ "$(basename $(readlink /proc/1/exe) 2>/dev/null)" = "systemd" ] && return 0 + # echo >&2 "Stopping a (possibly) running netdata (namespace '${myns}')..." - # if systemd is running, it is systemd - pidof systemd >/dev/null 2>&1 && return 0 + for p in $(cat "${NETDATA_RUN_DIR}/netdata.pid" 2>/dev/null) \ + $(cat /var/run/netdata.pid 2>/dev/null) \ + $(cat /var/run/netdata/netdata.pid 2>/dev/null) \ + $(pidof netdata 2>/dev/null) + do + ns="$(readlink /proc/${p}/ns/pid 2>/dev/null)" - # else, it is not systemd - return 1 + if [ -z "${myns}" -o -z "${ns}" -o "${myns}" = "${ns}" ] + then + stop_netdata_on_pid ${p} + fi + done } -started=0 -if [ "${UID}" -eq 0 ] - then - - if issystemd - then - # systemd is running on this system - - if [ ! -f /etc/systemd/system/netdata.service ] - then - echo >&2 "Installing systemd service..." - run cp system/netdata.service /etc/systemd/system/netdata.service && \ - run systemctl daemon-reload && \ - run systemctl enable netdata - else - run service netdata stop - fi - - stop_all_netdata - run service netdata restart && started=1 - fi - - if [ ${started} -eq 0 ] - then - # check if we can use the system service - run service netdata stop - stop_all_netdata - run service netdata restart && started=1 - if [ ${started} -eq 0 ] - then - run service netdata start && started=1 - fi - fi -fi +if [ ${DONOTSTART} -eq 1 ] + then + if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ] + then + 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 0644 "${NETDATA_PREFIX}/etc/netdata/netdata.conf" + fi -if [ ${started} -eq 0 ] -then - # still not started... - - stop_all_netdata - - echo >&2 "Starting netdata..." - run ${NETDATA_PREFIX}/usr/sbin/netdata -P ${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 - - echo >&2 -fi +else -# ----------------------------------------------------------------------------- -# save a config file, if it is not already there - -if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ] - then - echo >&2 - echo >&2 "-------------------------------------------------------------------------------" - echo >&2 - 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 + progress "Start netdata" + + if [ "${UID}" -eq 0 ] + then + service netdata stop + stop_all_netdata + service netdata restart && started=1 + if [ ${started} -eq 0 ] + then + service netdata start && started=1 + fi + fi + + if [ ${started} -eq 0 ] + then + # still not started... + + stop_all_netdata + + echo >&2 "Starting netdata..." + run ${NETDATA_PREFIX}/usr/sbin/netdata -P ${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 + + echo >&2 + fi + + # ----------------------------------------------------------------------------- + # save a config file, if it is not already there + + if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ] + then + echo >&2 + echo >&2 "-------------------------------------------------------------------------------" + echo >&2 + 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 fi # ----------------------------------------------------------------------------- -# Check for KSM +progress "Check KSM (kernel memory deduper)" ksm_is_available_but_disabled() { - cat <<-KSM1 + cat </sys/kernel/mm/ksm/run - echo 1000 >/sys/kernel/mm/ksm/sleep_millisecs + ${TPUT_YELLOW}${TPUT_BOLD}echo 1 >/sys/kernel/mm/ksm/run${TPUT_RESET} + ${TPUT_YELLOW}${TPUT_BOLD}echo 1000 >/sys/kernel/mm/ksm/sleep_millisecs${TPUT_RESET} - If you enable it, you will save 40-60% of netdata memory. +If you enable it, you will save 40-60% of netdata memory. KSM1 } ksm_is_not_available() { - cat <<-KSM2 + cat <netdata-uninstaller.sh <<-UNINSTALL - #!/bin/bash - - # this script will uninstall netdata - - if [ "\$1" != "--force" ] - then - echo >&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..." - for p in \$(pidof netdata); do kill \$p; done - 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/lib/netdata" - deletedir "${NETDATA_PREFIX}/var/cache/netdata" - deletedir "${NETDATA_PREFIX}/var/log/netdata" - fi - - if [ -f /etc/logrotate.d/netdata ] - then - echo "Deleting /etc/logrotate.d/netdata ..." - rm -i /etc/logrotate.d/netdata - fi - - if [ -f /etc/systemd/system/netdata.service ] - then - echo "Deleting /etc/systemd/system/netdata.service ..." - rm -i /etc/systemd/system/netdata.service - 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 - - getent group docker > /dev/null - if [ $? -eq 0 -a "${NETDATA_ADDED_TO_DOCKER}" = "1" ] - then - echo - echo "You may also want to remove the netdata user from the docker group" - echo "by running:" - echo " gpasswd -d netdata docker" - fi +progress "Generate netdata-uninstaller.sh" + +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..." +for p in \$(pidof netdata); do kill \$p; done +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/lib/netdata" + deletedir "${NETDATA_PREFIX}/var/cache/netdata" + deletedir "${NETDATA_PREFIX}/var/log/netdata" +fi + +if [ -f /etc/logrotate.d/netdata ] + then + echo "Deleting /etc/logrotate.d/netdata ..." + rm -i /etc/logrotate.d/netdata +fi + +if [ -f /etc/systemd/system/netdata.service ] + then + echo "Deleting /etc/systemd/system/netdata.service ..." + rm -i /etc/systemd/system/netdata.service +fi + +if [ -f /etc/init.d/netdata ] + then + echo "Deleting /etc/init.d/netdata ..." + rm -i /etc/init.d/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 + +getent group docker > /dev/null +if [ $? -eq 0 -a "${NETDATA_ADDED_TO_DOCKER}" = "1" ] + then + echo + echo "You may also want to remove the netdata user from the docker group" + echo "by running:" + echo " gpasswd -d netdata docker" +fi + +getent group nginx > /dev/null +if [ $? -eq 0 -a "${NETDATA_ADDED_TO_NGINX}" = "1" ] + then + echo + echo "You may also want to remove the netdata user from the nginx group" + echo "by running:" + echo " gpasswd -d netdata nginx" +fi + +getent group varnish > /dev/null +if [ $? -eq 0 -a "${NETDATA_ADDED_TO_VARNISH}" = "1" ] + then + echo + echo "You may also want to remove the netdata user from the varnish group" + echo "by running:" + echo " gpasswd -d netdata varnish" +fi + +getent group haproxy > /dev/null +if [ $? -eq 0 -a "${NETDATA_ADDED_TO_HAPROXY}" = "1" ] + then + echo + echo "You may also want to remove the netdata user from the haproxy group" + echo "by running:" + echo " gpasswd -d netdata haproxy" +fi + +getent group adm > /dev/null +if [ $? -eq 0 -a "${NETDATA_ADDED_TO_ADM}" = "1" ] + then + echo + echo "You may also want to remove the netdata user from the adm group" + echo "by running:" + echo " gpasswd -d netdata adm" +fi + +getent group nsd > /dev/null +if [ $? -eq 0 -a "${NETDATA_ADDED_TO_NSD}" = "1" ] + then + echo + echo "You may also want to remove the netdata user from the nsd group" + echo "by running:" + echo " gpasswd -d netdata nsd" +fi + UNINSTALL chmod 750 netdata-uninstaller.sh # ----------------------------------------------------------------------------- +progress "Basic netdata instructions" + +cat <&2 "Uninstall script generated: ${TPUT_RED}${TPUT_BOLD}./netdata-uninstaller.sh${TPUT_RESET}" + +if [ -d .git ] + then + cat >netdata-updater.sh.new <&2 "This script should be run as user with uid \${INSTALL_UID} but it now runs with uid \${UID}" + exit 1 +fi + +# make sure we cd to the working directory +cd "${REINSTALL_PWD}" || exit 1 + +# make sure there is .git here +[ \${force} -eq 0 -a ! -d .git ] && echo >&2 "No git structures found at: ${REINSTALL_PWD} (use -f for force re-install)" && exit 1 + +# signal netdata to start saving its database +# this is handy if your database is big +pids=\$(pidof netdata) +[ ! -z "\${pids}" ] && kill -USR1 \${pids} + +tmp= +if [ -t 2 ] + then + # we are running on a terminal + # open fd 3 and send it to stderr + exec 3>&2 else - access="${NETDATA_BIND}" + # we are headless + # create a temporary file for the log + tmp=\$(mktemp /tmp/netdata-updater-log-XXXXXX.log) + # open fd 3 and send it to tmp + exec 3>\${tmp} fi -cat <<-END +info() { + echo >&3 "\$(date) : INFO: " "\${@}" +} + +emptyline() { + echo >&3 +} + +error() { + echo >&3 "\$(date) : ERROR: " "\${@}" +} +# this is what we will do if it fails (head-less only) +failed() { + error "FAILED TO UPDATE NETDATA : \${1}" - ------------------------------------------------------------------------------- + if [ ! -z "\${tmp}" ] + then + cat >&2 "\${tmp}" + rm "\${tmp}" + fi + exit 1 +} - OK. NetData is installed and it is running (listening to ${NETDATA_BIND}:${NETDATA_PORT}). +get_latest_commit_id() { + git log -1 2>&3 |\\ + grep ^commit 2>&3 |\\ + head -n 1 2>&3 |\\ + cut -d ' ' -f 2 2>&3 +} - ------------------------------------------------------------------------------- +update() { + [ -z "\${tmp}" ] && info "Running on a terminal - (this script also supports running headless from crontab)" - INFO: Command line options changed. -pidfile, -nd and -ch are deprecated. - If you use custom startup scripts, please run netdata -h to see the - corresponding options and update your scripts. + emptyline - Hit http://${access}:${NETDATA_PORT}/ from your browser. + if [ -d .git ] + then + info "Updating netdata source from github..." - To stop netdata, just kill it, with: + last_commit="\$(get_latest_commit_id)" + [ \${force} -eq 0 -a -z "\${last_commit}" ] && failed "CANNOT GET LAST COMMIT ID (use -f for force re-install)" - killall netdata + git pull >&3 2>&3 || failed "CANNOT FETCH LATEST SOURCE (use -f for force re-install)" - To start it, just run it: + new_commit="\$(get_latest_commit_id)" + if [ \${force} -eq 0 ] + then + [ -z "\${new_commit}" ] && failed "CANNOT GET NEW LAST COMMIT ID (use -f for force re-install)" + [ "\${new_commit}" = "\${last_commit}" ] && info "Nothing to be done! (use -f to force re-install)" && exit 0 + fi + elif [ \${force} -eq 0 ] + then + failed "CANNOT FIND GIT STRUCTURES IN \$(pwd) (use -f for force re-install)" + fi - ${NETDATA_PREFIX}/usr/sbin/netdata + emptyline + info "Re-installing netdata..." + ${REINSTALL_COMMAND// --dont-wait/} --dont-wait >&3 2>&3 || failed "FAILED TO COMPILE/INSTALL NETDATA" + [ ! -z "\${tmp}" ] && rm "\${tmp}" && tmp= + return 0 +} - Enjoy! +# the installer updates this script - so we run and exit in a single line +update && exit 0 +############################################################################### +############################################################################### +REINSTALL + chmod 755 netdata-updater.sh.new + mv -f netdata-updater.sh.new netdata-updater.sh + echo >&2 "Update script generated : ${TPUT_GREEN}${TPUT_BOLD}./netdata-updater.sh${TPUT_RESET}" + echo >&2 + echo >&2 "${TPUT_DIM}${TPUT_BOLD}netdata-updater.sh${TPUT_RESET}${TPUT_DIM} can work from cron. It will trigger an email from cron" + echo >&2 "only if it fails (it does not print anything if it can update netdata).${TPUT_RESET}" + if [ "${UID}" -eq 0 -a -d "/etc/cron.daily" -a ! -f "/etc/cron.daily/netdata-updater.sh" ] + then + echo >&2 "${TPUT_DIM}Run this to automatically check and install netdata updates once per day:${TPUT_RESET}" + echo >&2 + echo >&2 "${TPUT_YELLOW}${TPUT_BOLD}ln -s ${PWD}/netdata-updater.sh /etc/cron.daily/netdata-updater.sh${TPUT_RESET}" + fi +elif [ -f "netdata-updater.sh" ] + then + rm "netdata-updater.sh" +fi -END -echo >&2 "Uninstall script generated: ./netdata-uninstaller.sh" +# ----------------------------------------------------------------------------- +echo >&2 +progress "We are done!" + +if [ ${started} -eq 1 ] + then + netdata_banner "is installed and running now!" +else + netdata_banner "is installed now!" +fi + +echo >&2 " enjoy real-time performance and health monitoring..." +echo >&2 +exit 0