3 # reload the user profile
4 [ -f /etc/profile ] && . /etc/profile
6 export PATH="${PATH}:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
8 # fix PKG_CHECK_MODULES error
9 if [ -d /usr/share/aclocal ]
11 ACLOCAL_PATH=${ACLOCAL_PATH-/usr/share/aclocal}
18 # Be nice on production environments
19 renice 19 $$ >/dev/null 2>/dev/null
21 processors=$(cat /proc/cpuinfo | grep ^processor | wc -l)
22 [ $(( processors )) -lt 1 ] && processors=1
24 # you can set CFLAGS before running installer
25 CFLAGS="${CFLAGS--O3}"
27 # keep a log of this command
28 printf "\n# " >>netdata-installer.log
29 date >>netdata-installer.log
30 printf "CFLAGS=\"%s\" " "${CFLAGS}" >>netdata-installer.log
31 printf "%q " "$0" "${@}" >>netdata-installer.log
32 printf "\n" >>netdata-installer.log
34 REINSTALL_PWD="${PWD}"
35 REINSTALL_COMMAND="$(printf "%q " "$0" "${@}"; printf "\n")"
39 l2=" |.-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-" \
40 l3=" | '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' " \
41 l4=" +----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+--->" \
43 netdata="netdata" start end msg="${*}"
45 [ ${#msg} -lt ${#netdata} ] && msg="${msg}${sp:0:$(( ${#netdata} - ${#msg}))}"
46 [ ${#msg} -gt $(( ${#l2} - 20 )) ] && msg="${msg:0:$(( ${#l2} - 23 ))}..."
48 start="$(( ${#l2} / 2 - 4 ))"
49 [ $(( start + ${#msg} + 4 )) -gt ${#l2} ] && start=$((${#l2} - ${#msg} - 4))
50 end=$(( ${start} + ${#msg} + 4 ))
54 echo >&2 "${l2:0:start}${sp:0:2}${netdata}${sp:0:$((end - start - 2 - ${#netdata}))}${l2:end:$((${#l2} - end))}"
55 echo >&2 "${l3:0:start}${sp:0:2}${msg}${sp:0:2}${l3:end:$((${#l2} - end))}"
60 service="$(which service 2>/dev/null || command -v service 2>/dev/null)"
61 systemctl="$(which systemctl 2>/dev/null || command -v systemctl 2>/dev/null)"
63 local cmd="${1}" action="${2}"
65 if [ ! -z "${service}" ]
67 run "${service}" "${cmd}" "${action}"
69 elif [ ! -z "${systemctl}" ]
71 run "${systemctl}" "${action}" "${cmd}"
84 banner "installer command line options"
87 ${ME} <installer options>
89 Valid <installer options> are:
91 --install /PATH/TO/INSTALL
93 If your give: --install /opt
94 netdata will be installed in /opt/netdata
98 Do not (re)start netdata.
103 Do not wait for the user to press ENTER.
104 Start immediately building it.
106 --zlib-is-really-here
107 --libs-are-really-here
109 If you get errors about missing zlib,
110 or libuuid but you know it is available,
111 you have a broken pkg-config.
112 Use this option to allow it continue
113 without checking pkg-config.
115 Netdata will by default be compiled with gcc optimization -O3
116 If you need to pass different CFLAGS, use something like this:
118 CFLAGS="<gcc options>" ${ME} <installer options>
120 For the installer to complete successfully, you will need
121 these packages installed:
123 gcc make autoconf automake pkg-config zlib1g-dev (or zlib-devel)
124 uuid-dev (or libuuid-devel)
126 For the plugins, you will at least need:
133 md5sum="$(which md5sum 2>/dev/null || command -v md5sum 2>/dev/null)"
134 get_git_config_signatures() {
137 [ ! -d "conf.d" ] && echo >&2 "Wrong directory." && return 1
138 [ -z "${md5sum}" -o ! -x "${md5sum}" ] && echo >&2 "No md5sum command." && return 1
140 echo >configs.signatures.tmp
142 for x in $(find conf.d -name \*.conf | sort)
146 for c in $(git log --follow "conf.d/${x}" | grep ^commit | cut -d ' ' -f 2)
148 git checkout ${c} "conf.d/${x}" || continue
149 s="$(cat "conf.d/${x}" | md5sum | cut -d ' ' -f 1)"
150 echo >>configs.signatures.tmp "${x}:${s}"
153 git checkout HEAD "conf.d/${x}" || break
156 cat configs.signatures.tmp |\
160 echo "declare -A configs_signatures=("
164 echo " ['${md5}']='${file}'"
167 } >configs.signatures
169 rm configs.signatures.tmp
175 while [ ! -z "${1}" ]
177 if [ "$1" = "--install" ]
179 NETDATA_PREFIX="${2}/netdata"
181 elif [ "$1" = "--zlib-is-really-here" -o "$1" = "--libs-are-really-here" ]
185 elif [ "$1" = "--dont-start-it" ]
189 elif [ "$1" = "--dont-wait" ]
193 elif [ "$1" = "--help" -o "$1" = "-h" ]
197 elif [ "$1" = "get_git_config_signatures" ]
199 get_git_config_signatures && exit 0
204 echo >&2 "I cannot understand option '$1'."
210 banner "real-time performance monitoring, done right!"
213 You are about to build and install netdata to your system.
215 It will be installed at these locations:
217 - the daemon at ${NETDATA_PREFIX}/usr/sbin/netdata
218 - config files at ${NETDATA_PREFIX}/etc/netdata
219 - web files at ${NETDATA_PREFIX}/usr/share/netdata
220 - plugins at ${NETDATA_PREFIX}/usr/libexec/netdata
221 - cache files at ${NETDATA_PREFIX}/var/cache/netdata
222 - db files at ${NETDATA_PREFIX}/var/lib/netdata
223 - log files at ${NETDATA_PREFIX}/var/log/netdata
224 - pid file at ${NETDATA_PREFIX}/var/run
226 This installer allows you to change the installation path.
227 Press Control-C and run the same command with --help for help.
231 if [ "${UID}" -ne 0 ]
233 if [ -z "${NETDATA_PREFIX}" ]
235 banner "wrong command line options!"
236 cat <<NONROOTNOPREFIX
238 Sorry! This will fail!
240 You are attempting to install netdata as non-root, but you plan to install it
243 Please set an installation prefix, like this:
245 $0 ${@} --install /tmp
247 or, run the installer as root:
251 We suggest to install it as root, or certain data collectors will not be able
252 to work. Netdata drops root privileges when running. So, if you plan to keep
253 it, install it as root to get the full functionality.
262 You are about to install netdata as a non-root user.
263 Netdata will work, but a few data collection modules that
264 require root access will fail.
266 If you installing permanently on your system, run the
276 if [ "$(type autoreconf 2> /dev/null)" ]
284 set -- $(autoreconf -V | sed -ne '1s/.* \([^ ]*\)$/\1/p')
285 eval $maj=\$1 $min=\$2
287 autoconf_maj_min AMAJ AMIN
292 elif [ "$AMAJ" -eq 2 -a "$AMIN" -ge 60 ]
296 echo "Found autotools $AMAJ.$AMIN"
299 echo "No autotools found"
302 if [ ! "$have_autotools" ]
306 echo "Will skip autoreconf step"
308 banner "autotools v2.60 required"
311 -------------------------------------------------------------------------------
312 autotools 2.60 or later is required
314 Sorry, you do not seem to have autotools 2.60 or later, which is
315 required to build from the git sources of netdata.
317 You can either install a suitable version of autotools and automake
318 or download a netdata package which does not have these dependencies.
320 Source packages where autotools have already been run are available
322 https://firehol.org/download/netdata/
324 The unsigned/master folder tracks the head of the git tree and released
325 packages are also available.
331 if [ ${DONOTWAIT} -eq 0 ]
333 if [ ! -z "${NETDATA_PREFIX}" ]
335 read -p "Press ENTER to build and install netdata to '${NETDATA_PREFIX}' > "
337 read -p "Press ENTER to build and install netdata to your system > "
342 banner "sorry, it failed to build..."
345 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
347 Sorry! netdata failed to build...
349 You many need to check these:
351 1. The package uuid-dev (or libuuid-devel) has to be installed.
353 If your system cannot find libuuid, although it is installed
354 run me with the option: --libs-are-really-here
356 2. The package zlib1g-dev (or zlib-devel) has to be installed.
358 If your system cannot find zlib, although it is installed
359 run me with the option: --libs-are-really-here
361 3. You need basic build tools installed, like:
363 gcc make autoconf automake pkg-config
365 Autoconf version 2.60 or higher is required.
367 If you still cannot get it to build, ask for help at github:
369 https://github.com/firehol/netdata/issues
378 printf >>netdata-installer.log "# "
379 printf >>netdata-installer.log "%q " "${@}"
380 printf >>netdata-installer.log " ... "
383 printf >&2 ":-----------------------------------------------------------------------------\n"
384 printf >&2 "Running command:\n"
386 printf >&2 "%q " "${@}"
394 printf >>netdata-installer.log "FAILED!\n"
396 printf >>netdata-installer.log "OK\n"
402 if [ ${LIBS_ARE_HERE} -eq 1 ]
405 echo >&2 "ok, assuming libs are really installed."
406 export ZLIB_CFLAGS=" "
407 export ZLIB_LIBS="-lz"
408 export UUID_CFLAGS=" "
409 export UUID_LIBS="-luuid"
412 trap build_error EXIT
414 if [ "$have_autotools" ]
416 run ./autogen.sh || exit 1
420 --prefix="${NETDATA_PREFIX}/usr" \
421 --sysconfdir="${NETDATA_PREFIX}/etc" \
422 --localstatedir="${NETDATA_PREFIX}/var" \
423 --with-zlib --with-math --with-user=netdata \
424 CFLAGS="${CFLAGS}" || exit 1
426 # remove the build_error hook
429 if [ -f src/netdata ]
431 echo >&2 "Cleaning a possibly old compilation ..."
435 echo >&2 "Compiling netdata ..."
436 run make -j${processors} || exit 1
438 if [ "${BASH_VERSINFO[0]}" -ge "4" ]
440 declare -A configs_signatures=()
441 if [ -f "configs.signatures" ]
443 source "configs.signatures" || echo >&2 "ERROR: Failed to load configs.signatures !"
447 # migrate existing configuration files
448 # for node.d and charts.d
449 if [ -d "${NETDATA_PREFIX}/etc/netdata" ]
451 # the configuration directory exists
453 if [ ! -d "${NETDATA_PREFIX}/etc/netdata/charts.d" ]
455 run mkdir "${NETDATA_PREFIX}/etc/netdata/charts.d"
458 # move the charts.d config files
459 for x in apache ap cpu_apps cpufreq example exim hddtemp load_average mem_apps mysql nginx nut opensips phpfpm postfix sensors squid tomcat
461 for y in "" ".old" ".orig"
463 if [ -f "${NETDATA_PREFIX}/etc/netdata/${x}.conf${y}" -a ! -f "${NETDATA_PREFIX}/etc/netdata/charts.d/${x}.conf${y}" ]
465 run mv -f "${NETDATA_PREFIX}/etc/netdata/${x}.conf${y}" "${NETDATA_PREFIX}/etc/netdata/charts.d/${x}.conf${y}"
470 if [ ! -d "${NETDATA_PREFIX}/etc/netdata/node.d" ]
472 run mkdir "${NETDATA_PREFIX}/etc/netdata/node.d"
475 # move the node.d config files
476 for x in named sma_webbox snmp
478 for y in "" ".old" ".orig"
480 if [ -f "${NETDATA_PREFIX}/etc/netdata/${x}.conf${y}" -a ! -f "${NETDATA_PREFIX}/etc/netdata/node.d/${x}.conf${y}" ]
482 run mv -f "${NETDATA_PREFIX}/etc/netdata/${x}.conf${y}" "${NETDATA_PREFIX}/etc/netdata/node.d/${x}.conf${y}"
488 # backup user configurations
489 installer_backup_suffix="${PID}.${RANDOM}"
490 for x in $(find "${NETDATA_PREFIX}/etc/netdata/" -name '*.conf' -type f)
494 # make a backup of the configuration file
495 cp -p "${x}" "${x}.old"
497 if [ -z "${md5sum}" -o ! -x "${md5sum}" ]
499 # we don't have md5sum - keep it
500 cp -p "${x}" "${x}.installer_backup.${installer_backup_suffix}"
502 # find it relative filename
503 f="${x/*\/etc\/netdata\//}"
506 md5="$(cat "${x}" | ${md5sum} | cut -d ' ' -f 1)"
509 if [ -f "conf.d/${f}" ]
511 cp "conf.d/${f}" "${x}.orig"
514 if [ "${BASH_VERSINFO[0]}" -ge "4" ]
516 if [ "${configs_signatures[${md5}]}" = "${f}" ]
518 # it is a stock version - don't keep it
519 echo >&2 "File '${x}' is stock version."
521 # edited by user - keep it
522 echo >&2 "File '${x}' has been edited by user."
523 cp -p "${x}" "${x}.installer_backup.${installer_backup_suffix}"
526 echo >&2 "File '${x}' cannot be check for custom edits."
527 cp -p "${x}" "${x}.installer_backup.${installer_backup_suffix}"
531 elif [ -f "${x}.installer_backup.${installer_backup_suffix}" ]
533 rm -f "${x}.installer_backup.${installer_backup_suffix}"
537 echo >&2 "Installing netdata ..."
538 run make install || exit 1
540 # restore user configurations
541 for x in $(find "${NETDATA_PREFIX}/etc/netdata/" -name '*.conf' -type f)
543 if [ -f "${x}.installer_backup.${installer_backup_suffix}" ]
545 cp -p "${x}.installer_backup.${installer_backup_suffix}" "${x}"
546 rm -f "${x}.installer_backup.${installer_backup_suffix}"
550 NETDATA_ADDED_TO_DOCKER=0
553 getent group netdata > /dev/null
556 echo >&2 "Adding netdata user group ..."
557 run groupadd -r netdata
560 getent passwd netdata > /dev/null
563 echo >&2 "Adding netdata user account ..."
564 run useradd -r -g netdata -c netdata -s $(which nologin || echo '/bin/false') -d / netdata
567 getent group docker > /dev/null
570 # find the users in the docker group
571 docker=$(getent group docker | cut -d ':' -f 4)
572 if [[ ",${docker}," =~ ,netdata, ]]
574 # netdata is already there
577 # netdata is not in docker group
578 echo >&2 "Adding netdata user to the docker group (needed to get container names) ..."
579 run usermod -a -G docker netdata
581 # let the uninstall script know
582 NETDATA_ADDED_TO_DOCKER=1
585 if [ -d /etc/logrotate.d -a ! -f /etc/logrotate.d/netdata ]
587 echo >&2 "Adding netdata logrotate configuration ..."
588 run cp system/netdata.logrotate /etc/logrotate.d/netdata
593 # -----------------------------------------------------------------------------
594 # load options from the configuration file
596 # create an empty config if it does not exist
597 [ ! -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ] && touch "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
599 # function to extract values from the config file
601 local key="${1}" value="${2}" line=
603 if [ -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
605 line="$( grep "^[[:space:]]*${key}[[:space:]]*=[[:space:]]*" "${NETDATA_PREFIX}/etc/netdata/netdata.conf" | head -n 1 )"
606 [ ! -z "${line}" ] && value="$( echo "${line}" | cut -d '=' -f 2 | sed -e "s/^[[:space:]]\+//g" -e "s/[[:space:]]\+$//g" )"
614 [ ! "${UID}" = "0" ] && defuser="${USER}"
615 NETDATA_USER="$( config_option "run as user" "${defuser}" )"
617 NETDATA_WEB_USER="$( config_option "web files owner" "${defuser}" )"
618 NETDATA_WEB_GROUP="$( config_option "web files group" "${NETDATA_WEB_USER}" )"
622 NETDATA_DEBUG="$( config_option "debug flags" ${defdebug} )"
626 NETDATA_PORT="$( config_option "default port" ${defport} )"
627 NETDATA_PORT2="$( config_option "port" ${defport} )"
629 if [ "${NETDATA_PORT}" != "${NETDATA_PORT2}" ]
631 if [ "${NETDATA_PORT2}" != "${defport}" ]
633 NETDATA_PORT="${NETDATA_PORT2}"
638 NETDATA_LIB_DIR="$( config_option "lib directory" "${NETDATA_PREFIX}/var/lib/netdata" )"
639 NETDATA_CACHE_DIR="$( config_option "cache directory" "${NETDATA_PREFIX}/var/cache/netdata" )"
640 NETDATA_WEB_DIR="$( config_option "web files directory" "${NETDATA_PREFIX}/usr/share/netdata/web" )"
641 NETDATA_LOG_DIR="$( config_option "log directory" "${NETDATA_PREFIX}/var/log/netdata" )"
642 NETDATA_CONF_DIR="$( config_option "config directory" "${NETDATA_PREFIX}/etc/netdata" )"
643 NETDATA_RUN_DIR="${NETDATA_PREFIX}/var/run"
646 # -----------------------------------------------------------------------------
647 # prepare the directories
649 # this is needed if NETDATA_PREFIX is not empty
650 if [ ! -d "${NETDATA_RUN_DIR}" ]
652 mkdir -p "${NETDATA_RUN_DIR}" || exit 1
656 echo >&2 "Fixing directories (user: ${NETDATA_USER})..."
657 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"
661 echo >&2 "Creating directory '${x}'"
662 run mkdir -p "${x}" || exit 1
667 if [ "${x}" = "${NETDATA_WEB_DIR}" ]
669 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}..."
671 run chown -R "${NETDATA_USER}:${NETDATA_USER}" "${x}" || echo >&2 "WARNING: Cannot change the ownership of the files in directory ${x} to ${NETDATA_USER}..."
675 run chmod 0755 "${x}" || echo >&2 "WARNING: Cannot change the permissions of the directory ${x} to 0755..."
680 run chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
681 run chmod 0755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
682 run setcap cap_dac_read_search,cap_sys_ptrace+ep "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
685 # fix apps.plugin to be setuid to root
686 run chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
687 run chmod 4755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
691 # -----------------------------------------------------------------------------
692 # check if we can re-start netdata
694 if [ ${DONOTSTART} -eq 1 ]
696 if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
698 echo >&2 "Generating empty config file in: ${NETDATA_PREFIX}/etc/netdata/netdata.conf"
699 echo "# Get config from http://127.0.0.1:${NETDATA_PORT}/netdata.conf" >"${NETDATA_PREFIX}/etc/netdata/netdata.conf"
701 if [ "${UID}" -eq 0 ]
703 chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
705 chmod 0664 "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
707 banner "is installed now!"
708 echo >&2 " enjoy real-time performance and health monitoring..."
712 # -----------------------------------------------------------------------------
713 # stop a running netdata
716 [ -z "$1" -o ! -f "/proc/$1/stat" ] && return 1
717 [ "$(cat "/proc/$1/stat" | cut -d '(' -f 2 | cut -d ')' -f 1)" = "netdata" ] && return 0
721 stop_netdata_on_pid() {
722 local pid="${1}" ret=0 count=0
724 isnetdata ${pid} || return 0
726 printf >&2 "Stopping netdata on pid ${pid} ..."
727 while [ ! -z "$pid" -a ${ret} -eq 0 ]
729 if [ ${count} -gt 45 ]
731 echo >&2 "Cannot stop the running netdata on pid ${pid}."
735 count=$(( count + 1 ))
737 run kill ${pid} 2>/dev/null
740 test ${ret} -eq 0 && printf >&2 "." && sleep 2
746 echo >&2 "SORRY! CANNOT STOP netdata ON PID ${pid} !"
750 echo >&2 "netdata on pid ${pid} stopped."
757 echo >&2 "Stopping a (possibly) running netdata..."
759 for p in $(cat "${NETDATA_RUN_DIR}/netdata.pid" 2>/dev/null) \
760 $(cat /var/run/netdata.pid 2>/dev/null) \
761 $(cat /var/run/netdata/netdata.pid 2>/dev/null) \
762 $(pidof netdata 2>/dev/null)
764 stop_netdata_on_pid ${p}
768 # -----------------------------------------------------------------------------
769 # check netdata for systemd
772 # if the directory /etc/systemd/system does not exit, it is not systemd
773 [ ! -d /etc/systemd/system ] && return 1
775 # if pid 1 is systemd, it is systemd
776 [ "$(basename $(readlink /proc/1/exe) 2>/dev/null)" = "systemd" ] && return 0
778 # if systemd is running, it is systemd
779 pidof systemd >/dev/null 2>&1 && return 0
781 # else, it is not systemd
786 if [ "${UID}" -eq 0 ]
791 # systemd is running on this system
793 if [ ! -f /etc/systemd/system/netdata.service ]
795 echo >&2 "Installing systemd service..."
796 run cp system/netdata.service /etc/systemd/system/netdata.service && \
797 run systemctl daemon-reload && \
798 run systemctl enable netdata
804 service netdata restart && started=1
807 if [ ${started} -eq 0 ]
809 # check if we can use the system service
812 service netdata restart && started=1
813 if [ ${started} -eq 0 ]
815 service netdata start && started=1
820 if [ ${started} -eq 0 ]
822 # still not started...
826 echo >&2 "Starting netdata..."
827 run ${NETDATA_PREFIX}/usr/sbin/netdata -P ${NETDATA_RUN_DIR}/netdata.pid "${@}"
831 echo >&2 "SORRY! FAILED TO START NETDATA!"
834 echo >&2 "OK. NetData Started!"
840 # -----------------------------------------------------------------------------
841 # save a config file, if it is not already there
843 if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
846 echo >&2 "-------------------------------------------------------------------------------"
848 echo >&2 "Downloading default configuration from netdata..."
851 # remove a possibly obsolete download
852 [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new"
854 # disable a proxy to get data from the local netdata
859 wget 2>/dev/null -O "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf"
863 if [ ${ret} -ne 0 -o ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ]
865 curl -s -o "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf"
869 if [ ${ret} -eq 0 -a -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ]
871 mv "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
872 echo >&2 "New configuration saved for you to edit at ${NETDATA_PREFIX}/etc/netdata/netdata.conf"
874 if [ "${UID}" -eq 0 ]
876 chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
878 chmod 0664 "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
880 echo >&2 "Cannnot download configuration from netdata daemon using url 'http://localhost:${NETDATA_PORT}/netdata.conf'"
881 [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new"
885 # -----------------------------------------------------------------------------
888 ksm_is_available_but_disabled() {
891 -------------------------------------------------------------------------------
892 Memory de-duplication instructions
894 You have kernel memory de-duper (called Kernel Same-page Merging,
895 or KSM) available, but it is not currently enabled.
899 echo 1 >/sys/kernel/mm/ksm/run
900 echo 1000 >/sys/kernel/mm/ksm/sleep_millisecs
902 If you enable it, you will save 40-60% of netdata memory.
907 ksm_is_not_available() {
910 -------------------------------------------------------------------------------
911 Memory de-duplication not present in your kernel
913 It seems you do not have kernel memory de-duper (called Kernel Same-page
914 Merging, or KSM) available.
916 To enable it, you need a kernel built with CONFIG_KSM=y
918 If you can have it, you will save 40-60% of netdata memory.
923 if [ -f "/sys/kernel/mm/ksm/run" ]
925 if [ $(cat "/sys/kernel/mm/ksm/run") != "1" ]
927 ksm_is_available_but_disabled
933 # -----------------------------------------------------------------------------
934 # Check for version.txt
936 if [ ! -s web/version.txt ]
940 -------------------------------------------------------------------------------
941 Version update check warning
943 The way you downloaded netdata, we cannot find its version. This means the
944 Update check on the dashboard, will not work.
946 If you want to have version update check, please re-install it
947 following the procedure in:
949 https://github.com/firehol/netdata/wiki/Installation
954 # -----------------------------------------------------------------------------
955 # apps.plugin warning
957 if [ "${UID}" -ne 0 ]
961 -------------------------------------------------------------------------------
962 apps.plugin needs privileges
964 Since you have installed netdata as a normal user, to have apps.plugin collect
965 all the needed data, you have to give it the access rights it needs, by running
966 either of the following sets of commands:
968 To run apps.plugin with escalated capabilities:
970 sudo chown root:${NETDATA_USER} "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
971 sudo chmod 0750 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
972 sudo setcap cap_dac_read_search,cap_sys_ptrace+ep "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
974 or, to run apps.plugin as root:
976 sudo chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
977 sudo chmod 4755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
979 apps.plugin is performing a hard-coded function of data collection for all
980 running processes. It cannot be instructed from the netdata daemon to perform
981 any task, so it is pretty safe to do this.
986 # -----------------------------------------------------------------------------
987 # Keep un-install info
989 cat >netdata-uninstaller.sh <<UNINSTALL
992 # this script will uninstall netdata
994 if [ "\$1" != "--force" ]
996 echo >&2 "This script will REMOVE netdata from your system."
997 echo >&2 "Run it again with --force to do it."
1001 echo >&2 "Stopping a possibly running netdata..."
1002 for p in \$(pidof netdata); do kill \$p; done
1006 if [ ! -z "\$1" -a -d "\$1" ]
1009 echo "Deleting directory '\$1' ..."
1014 if [ ! -z "${NETDATA_PREFIX}" -a -d "${NETDATA_PREFIX}" ]
1016 # installation prefix was given
1018 deletedir "${NETDATA_PREFIX}"
1021 # installation prefix was NOT given
1023 if [ -f "${NETDATA_PREFIX}/usr/sbin/netdata" ]
1025 echo "Deleting ${NETDATA_PREFIX}/usr/sbin/netdata ..."
1026 rm -i "${NETDATA_PREFIX}/usr/sbin/netdata"
1029 deletedir "${NETDATA_PREFIX}/etc/netdata"
1030 deletedir "${NETDATA_PREFIX}/usr/share/netdata"
1031 deletedir "${NETDATA_PREFIX}/usr/libexec/netdata"
1032 deletedir "${NETDATA_PREFIX}/var/lib/netdata"
1033 deletedir "${NETDATA_PREFIX}/var/cache/netdata"
1034 deletedir "${NETDATA_PREFIX}/var/log/netdata"
1037 if [ -f /etc/logrotate.d/netdata ]
1039 echo "Deleting /etc/logrotate.d/netdata ..."
1040 rm -i /etc/logrotate.d/netdata
1043 if [ -f /etc/systemd/system/netdata.service ]
1045 echo "Deleting /etc/systemd/system/netdata.service ..."
1046 rm -i /etc/systemd/system/netdata.service
1049 getent passwd netdata > /dev/null
1053 echo "You may also want to remove the user netdata"
1055 echo " userdel netdata"
1058 getent group netdata > /dev/null
1062 echo "You may also want to remove the group netdata"
1064 echo " groupdel netdata"
1067 getent group docker > /dev/null
1068 if [ $? -eq 0 -a "${NETDATA_ADDED_TO_DOCKER}" = "1" ]
1071 echo "You may also want to remove the netdata user from the docker group"
1073 echo " gpasswd -d netdata docker"
1077 chmod 750 netdata-uninstaller.sh
1079 # -----------------------------------------------------------------------------
1084 -------------------------------------------------------------------------------
1086 OK. NetData is installed and it is running.
1088 -------------------------------------------------------------------------------
1090 By default netdata listens on all IPs on port ${NETDATA_PORT},
1091 so you can access it with:
1093 http://this.machine.ip:${NETDATA_PORT}/
1095 To stop netdata, just kill it, with:
1099 To start it, just run it:
1101 ${NETDATA_PREFIX}/usr/sbin/netdata
1105 echo >&2 "Uninstall script generated: ./netdata-uninstaller.sh"
1109 cat >netdata-updater.sh.new <<REINSTALL
1113 [ "\${1}" = "-f" ] && force=1
1115 export PATH="\${PATH}:${PATH}"
1116 export CFLAGS="${CFLAGS}"
1118 INSTALL_UID="${UID}"
1119 if [ "\${INSTALL_UID}" != "\${UID}" ]
1121 echo >&2 "This script should be run as user with uid \${INSTALL_UID} but it now runs with uid \${UID}"
1125 # make sure we cd to the working directory
1126 cd "${REINSTALL_PWD}" || exit 1
1128 # make sure there is .git here
1129 [ \${force} -eq 0 -a ! -d .git ] && echo >&2 "No git structures found at: ${REINSTALL_PWD} (use -f for force re-install)" && exit 1
1131 # signal netdata to start saving its database
1132 # this is handy if your database is big
1133 pids=\$(pidof netdata)
1134 [ ! -z "\${pids}" ] && kill -USR1 \${pids}
1139 # we are running on a terminal
1140 # open fd 3 and send it to stderr
1144 # create a temporary file for the log
1145 tmp=\$(mktemp /tmp/netdata-updater-log-XXXXXX.log)
1146 # open fd 3 and send it to tmp
1151 echo >&3 "\$(date) : INFO: " "\${@}"
1159 echo >&3 "\$(date) : ERROR: " "\${@}"
1162 # this is what we will do if it fails (head-less only)
1164 error "FAILED TO UPDATE NETDATA : \${1}"
1166 if [ ! -z "\${tmp}" ]
1174 get_latest_commit_id() {
1176 grep ^commit 2>&3 |\\
1178 cut -d ' ' -f 2 2>&3
1182 [ -z "\${tmp}" ] && info "Running on a terminal - (this script also supports running headless from crontab)"
1188 info "Updating netdata source from github..."
1190 last_commit="\$(get_latest_commit_id)"
1191 [ \${force} -eq 0 -a -z "\${last_commit}" ] && failed "CANNOT GET LAST COMMIT ID (use -f for force re-install)"
1193 git pull >&3 2>&3 || failed "CANNOT FETCH LATEST SOURCE (use -f for force re-install)"
1195 new_commit="\$(get_latest_commit_id)"
1196 if [ \${force} -eq 0 ]
1198 [ -z "\${new_commit}" ] && failed "CANNOT GET NEW LAST COMMIT ID (use -f for force re-install)"
1199 [ "\${new_commit}" = "\${last_commit}" ] && info "Nothing to be done! (use -f to force re-install)" && exit 0
1201 elif [ \${force} -eq 0 ]
1203 failed "CANNOT FIND GIT STRUCTURES IN \$(pwd) (use -f for force re-install)"
1207 info "Re-installing netdata..."
1208 ${REINSTALL_COMMAND// --dont-wait/} --dont-wait >&3 2>&3 || failed "FAILED TO COMPILE/INSTALL NETDATA"
1210 [ ! -z "\${tmp}" ] && rm "\${tmp}" && tmp=
1214 # the installer updates this script - so we run and exit in a single line
1216 ###############################################################################
1217 ###############################################################################
1219 chmod 755 netdata-updater.sh.new
1220 mv -f netdata-updater.sh.new netdata-updater.sh
1221 echo >&2 "Update script generated : ./netdata-updater.sh"
1222 elif [ -f "netdata-updater.sh" ]
1224 rm "netdata-updater.sh"
1227 banner "is installed and running now!"
1228 echo >&2 " enjoy real-time performance and health monitoring..."