3 export PATH="${PATH}:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
5 netdata_source_dir="$(pwd)"
6 installer_dir="$(dirname "${0}")"
8 if [ "${netdata_source_dir}" != "${installer_dir}" -a "${installer_dir}" != "." ]
10 echo >&2 "Warninng: you are currently in '${netdata_source_dir}' but the installer is in '${installer_dir}'."
14 # -----------------------------------------------------------------------------
15 # reload the user profile
17 [ -f /etc/profile ] && . /etc/profile
19 # make sure /etc/profile does not change our current directory
20 cd "${netdata_source_dir}" || exit 1
23 # -----------------------------------------------------------------------------
24 # load the required functions
26 if [ -f "${installer_dir}/installer/functions.sh" ]
28 source "${installer_dir}/installer/functions.sh" || exit 1
30 source "${netdata_source_dir}/installer/functions.sh" || exit 1
33 # make sure we save all commands we run
34 run_logfile="netdata-installer.log"
37 # -----------------------------------------------------------------------------
38 # fix PKG_CHECK_MODULES error
40 if [ -d /usr/share/aclocal ]
42 ACLOCAL_PATH=${ACLOCAL_PATH-/usr/share/aclocal}
49 # Be nice on production environments
50 renice 19 $$ >/dev/null 2>/dev/null
52 processors=$(cat /proc/cpuinfo 2>/dev/null | grep ^processor | wc -l)
53 [ $(( processors )) -lt 1 ] && processors=1
55 # you can set CFLAGS before running installer
56 CFLAGS="${CFLAGS--O2}"
57 [ "z${CFLAGS}" = "z-O3" ] && CFLAGS="-O2"
59 # keep a log of this command
60 printf "\n# " >>netdata-installer.log
61 date >>netdata-installer.log
62 printf "CFLAGS=\"%s\" " "${CFLAGS}" >>netdata-installer.log
63 printf "%q " "$0" "${@}" >>netdata-installer.log
64 printf "\n" >>netdata-installer.log
66 REINSTALL_PWD="${PWD}"
67 REINSTALL_COMMAND="$(printf "%q " "$0" "${@}"; printf "\n")"
69 setcap="$(which setcap 2>/dev/null || command -v setcap 2>/dev/null)"
76 NETDATA_CONFIGURE_OPTIONS="${NETDATA_CONFIGURE_OPTIONS-}"
79 netdata_banner "installer command line options"
82 ${ME} <installer options>
84 Valid <installer options> are:
86 --install /PATH/TO/INSTALL
88 If you give: --install /opt
89 netdata will be installed in /opt/netdata
93 Do not (re)start netdata.
98 Do not wait for the user to press ENTER.
99 Start immediately building it.
101 --enable-plugin-freeipmi
102 --disable-plugin-freeipmi
104 Enable/disable the FreeIPMI plugin.
105 Default: enable it when libipmimonitoring is available.
110 Enable/disable Link-Time-Optimization
113 --zlib-is-really-here
114 --libs-are-really-here
116 If you get errors about missing zlib,
117 or libuuid but you know it is available,
118 you have a broken pkg-config.
119 Use this option to allow it continue
120 without checking pkg-config.
122 Netdata will by default be compiled with gcc optimization -O2
123 If you need to pass different CFLAGS, use something like this:
125 CFLAGS="<gcc options>" ${ME} <installer options>
127 For the installer to complete successfully, you will need
128 these packages installed:
130 gcc make autoconf automake pkg-config zlib1g-dev (or zlib-devel)
131 uuid-dev (or libuuid-devel)
133 For the plugins, you will at least need:
140 md5sum="$(which md5sum 2>/dev/null || command -v md5sum 2>/dev/null || command -v md5 2>/dev/null)"
141 get_git_config_signatures() {
144 [ ! -d "conf.d" ] && echo >&2 "Wrong directory." && return 1
145 [ -z "${md5sum}" -o ! -x "${md5sum}" ] && echo >&2 "No md5sum command." && return 1
147 echo >configs.signatures.tmp
149 for x in $(find conf.d -name \*.conf)
153 for c in $(git log --follow "conf.d/${x}" | grep ^commit | cut -d ' ' -f 2)
155 git checkout ${c} "conf.d/${x}" || continue
156 s="$(cat "conf.d/${x}" | ${md5sum} | cut -d ' ' -f 1)"
157 echo >>configs.signatures.tmp "${s}:${x}"
160 git checkout HEAD "conf.d/${x}" || break
163 cat configs.signatures.tmp |\
167 echo "declare -A configs_signatures=("
171 echo " ['${md5}']='${file}'"
174 } >configs.signatures
176 rm configs.signatures.tmp
182 while [ ! -z "${1}" ]
184 if [ "$1" = "--install" ]
186 NETDATA_PREFIX="${2}/netdata"
188 elif [ "$1" = "--zlib-is-really-here" -o "$1" = "--libs-are-really-here" ]
192 elif [ "$1" = "--dont-start-it" ]
196 elif [ "$1" = "--dont-wait" ]
200 elif [ "$1" = "--enable-plugin-freeipmi" ]
202 NETDATA_CONFIGURE_OPTIONS="${NETDATA_CONFIGURE_OPTIONS} --enable-plugin-freeipmi"
204 elif [ "$1" = "--disable-plugin-freeipmi" ]
206 NETDATA_CONFIGURE_OPTIONS="${NETDATA_CONFIGURE_OPTIONS} --disable-plugin-freeipmi"
208 elif [ "$1" = "--enable-lto" ]
210 NETDATA_CONFIGURE_OPTIONS="${NETDATA_CONFIGURE_OPTIONS} --enable-lto"
212 elif [ "$1" = "--disable-lto" ]
214 NETDATA_CONFIGURE_OPTIONS="${NETDATA_CONFIGURE_OPTIONS} --disable-lto"
216 elif [ "$1" = "--help" -o "$1" = "-h" ]
220 elif [ "$1" = "get_git_config_signatures" ]
222 get_git_config_signatures && exit 0
227 echo >&2 "I cannot understand option '$1'."
233 netdata_banner "real-time performance monitoring, done right!"
236 You are about to build and install netdata to your system.
238 It will be installed at these locations:
240 - the daemon at ${TPUT_CYAN}${NETDATA_PREFIX}/usr/sbin/netdata${TPUT_RESET}
241 - config files in ${TPUT_CYAN}${NETDATA_PREFIX}/etc/netdata${TPUT_RESET}
242 - web files in ${TPUT_CYAN}${NETDATA_PREFIX}/usr/share/netdata${TPUT_RESET}
243 - plugins in ${TPUT_CYAN}${NETDATA_PREFIX}/usr/libexec/netdata${TPUT_RESET}
244 - cache files in ${TPUT_CYAN}${NETDATA_PREFIX}/var/cache/netdata${TPUT_RESET}
245 - db files in ${TPUT_CYAN}${NETDATA_PREFIX}/var/lib/netdata${TPUT_RESET}
246 - log files in ${TPUT_CYAN}${NETDATA_PREFIX}/var/log/netdata${TPUT_RESET}
249 [ "${UID}" -eq 0 ] && cat <<BANNER2
250 - pid file at ${TPUT_CYAN}${NETDATA_PREFIX}/var/run/netdata.pid${TPUT_RESET}
251 - logrotate file at ${TPUT_CYAN}/etc/logrotate.d/netdata${TPUT_RESET}
256 This installer allows you to change the installation path.
257 Press Control-C and run the same command with --help for help.
261 if [ "${UID}" -ne 0 ]
263 if [ -z "${NETDATA_PREFIX}" ]
265 netdata_banner "wrong command line options!"
266 cat <<NONROOTNOPREFIX
268 ${TPUT_RED}${TPUT_BOLD}Sorry! This will fail!${TPUT_RESET}
270 You are attempting to install netdata as non-root, but you plan
271 to install it in system paths.
273 Please set an installation prefix, like this:
275 $0 ${@} --install /tmp
277 or, run the installer as root:
281 We suggest to install it as root, or certain data collectors will
282 not be able to work. Netdata drops root privileges when running.
283 So, if you plan to keep it, install it as root to get the full
292 ${TPUT_RED}${TPUT_BOLD}IMPORTANT${TPUT_RESET}:
293 You are about to install netdata as a non-root user.
294 Netdata will work, but a few data collection modules that
295 require root access will fail.
297 If you installing netdata permanently on your system, run
298 the installer like this:
300 ${TPUT_YELLOW}${TPUT_BOLD}sudo $0 ${@}${TPUT_RESET}
307 if [ "$(type autoreconf 2> /dev/null)" ]
315 set -- $(autoreconf -V | sed -ne '1s/.* \([^ ]*\)$/\1/p')
316 eval $maj=\$1 $min=\$2
318 autoconf_maj_min AMAJ AMIN
323 elif [ "$AMAJ" -eq 2 -a "$AMIN" -ge 60 ]
327 echo "Found autotools $AMAJ.$AMIN"
330 echo "No autotools found"
333 if [ ! "$have_autotools" ]
337 echo "Will skip autoreconf step"
339 netdata_banner "autotools v2.60 required"
342 -------------------------------------------------------------------------------
343 autotools 2.60 or later is required
345 Sorry, you do not seem to have autotools 2.60 or later, which is
346 required to build from the git sources of netdata.
348 You can either install a suitable version of autotools and automake
349 or download a netdata package which does not have these dependencies.
351 Source packages where autotools have already been run are available
353 https://firehol.org/download/netdata/
355 The unsigned/master folder tracks the head of the git tree and released
356 packages are also available.
362 if [ ${DONOTWAIT} -eq 0 ]
364 if [ ! -z "${NETDATA_PREFIX}" ]
366 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"
368 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"
373 netdata_banner "sorry, it failed to build..."
376 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
378 Sorry! netdata failed to build...
380 You many need to check these:
382 1. The package uuid-dev (or libuuid-devel) has to be installed.
384 If your system cannot find libuuid, although it is installed
385 run me with the option: --libs-are-really-here
387 2. The package zlib1g-dev (or zlib-devel) has to be installed.
389 If your system cannot find zlib, although it is installed
390 run me with the option: --libs-are-really-here
392 3. You need basic build tools installed, like:
394 gcc make autoconf automake pkg-config
396 Autoconf version 2.60 or higher is required.
398 If you still cannot get it to build, ask for help at github:
400 https://github.com/firehol/netdata/issues
408 if [ ${LIBS_ARE_HERE} -eq 1 ]
411 echo >&2 "ok, assuming libs are really installed."
412 export ZLIB_CFLAGS=" "
413 export ZLIB_LIBS="-lz"
414 export UUID_CFLAGS=" "
415 export UUID_LIBS="-luuid"
418 trap build_error EXIT
421 # -----------------------------------------------------------------------------
423 progress "Run autotools to configure the build environment"
425 if [ "$have_autotools" ]
427 run ./autogen.sh || exit 1
431 --prefix="${NETDATA_PREFIX}/usr" \
432 --sysconfdir="${NETDATA_PREFIX}/etc" \
433 --localstatedir="${NETDATA_PREFIX}/var" \
436 --with-user=netdata \
437 ${NETDATA_CONFIGURE_OPTIONS} \
438 CFLAGS="${CFLAGS}" || exit 1
440 # remove the build_error hook
443 # -----------------------------------------------------------------------------
444 progress "Cleanup compilation directory"
446 [ -f src/netdata ] && run make clean
448 # -----------------------------------------------------------------------------
449 progress "Compile netdata"
451 run make -j${processors} || exit 1
454 # -----------------------------------------------------------------------------
455 progress "Migrate configuration files for node.d.plugin and charts.d.plugin"
457 # migrate existing configuration files
458 # for node.d and charts.d
459 if [ -d "${NETDATA_PREFIX}/etc/netdata" ]
461 # the configuration directory exists
463 if [ ! -d "${NETDATA_PREFIX}/etc/netdata/charts.d" ]
465 run mkdir "${NETDATA_PREFIX}/etc/netdata/charts.d"
468 # move the charts.d config files
469 for x in apache ap cpu_apps cpufreq example exim hddtemp load_average mem_apps mysql nginx nut opensips phpfpm postfix sensors squid tomcat
471 for y in "" ".old" ".orig"
473 if [ -f "${NETDATA_PREFIX}/etc/netdata/${x}.conf${y}" -a ! -f "${NETDATA_PREFIX}/etc/netdata/charts.d/${x}.conf${y}" ]
475 run mv -f "${NETDATA_PREFIX}/etc/netdata/${x}.conf${y}" "${NETDATA_PREFIX}/etc/netdata/charts.d/${x}.conf${y}"
480 if [ ! -d "${NETDATA_PREFIX}/etc/netdata/node.d" ]
482 run mkdir "${NETDATA_PREFIX}/etc/netdata/node.d"
485 # move the node.d config files
486 for x in named sma_webbox snmp
488 for y in "" ".old" ".orig"
490 if [ -f "${NETDATA_PREFIX}/etc/netdata/${x}.conf${y}" -a ! -f "${NETDATA_PREFIX}/etc/netdata/node.d/${x}.conf${y}" ]
492 run mv -f "${NETDATA_PREFIX}/etc/netdata/${x}.conf${y}" "${NETDATA_PREFIX}/etc/netdata/node.d/${x}.conf${y}"
498 # -----------------------------------------------------------------------------
499 progress "Backup existing netdata configuration before installing it"
501 if [ "${BASH_VERSINFO[0]}" -ge "4" ]
503 declare -A configs_signatures=()
504 if [ -f "configs.signatures" ]
506 source "configs.signatures" || echo >&2 "ERROR: Failed to load configs.signatures !"
510 config_signature_matches() {
511 local md5="${1}" file="${2}"
513 if [ "${BASH_VERSINFO[0]}" -ge "4" ]
515 [ "${configs_signatures[${md5}]}" = "${file}" ] && return 0
519 if [ -f "configs.signatures" ]
521 grep "\['${md5}'\]='${file}'" "configs.signatures" >/dev/null
528 # backup user configurations
529 installer_backup_suffix="${PID}.${RANDOM}"
530 for x in $(find "${NETDATA_PREFIX}/etc/netdata/" -name '*.conf' -type f)
534 # make a backup of the configuration file
535 cp -p "${x}" "${x}.old"
537 if [ -z "${md5sum}" -o ! -x "${md5sum}" ]
539 # we don't have md5sum - keep it
540 echo >&2 "File '${TPUT_CYAN}${x}${TPUT_RESET}' ${TPUT_RET}is not known to distribution${TPUT_RESET}. Keeping it."
541 run cp -p "${x}" "${x}.installer_backup.${installer_backup_suffix}"
543 # find it relative filename
544 f="${x/*\/etc\/netdata\//}"
547 md5="$(cat "${x}" | ${md5sum} | cut -d ' ' -f 1)"
550 if [ -f "conf.d/${f}" ]
552 cp "conf.d/${f}" "${x}.orig"
555 if config_signature_matches "${md5}" "${f}"
557 # it is a stock version - don't keep it
558 echo >&2 "File '${TPUT_CYAN}${x}${TPUT_RESET}' is stock version."
560 # edited by user - keep it
561 echo >&2 "File '${TPUT_CYAN}${x}${TPUT_RESET}' ${TPUT_RED} has been edited by user${TPUT_RESET}. Keeping it."
562 run cp -p "${x}" "${x}.installer_backup.${installer_backup_suffix}"
566 elif [ -f "${x}.installer_backup.${installer_backup_suffix}" ]
568 rm -f "${x}.installer_backup.${installer_backup_suffix}"
573 # -----------------------------------------------------------------------------
574 progress "Install netdata"
576 run make install || exit 1
579 # -----------------------------------------------------------------------------
580 progress "Restore user edited netdata configuration files"
582 for x in $(find "${NETDATA_PREFIX}/etc/netdata/" -name '*.conf' -type f)
584 if [ -f "${x}.installer_backup.${installer_backup_suffix}" ]
586 run cp -p "${x}.installer_backup.${installer_backup_suffix}" "${x}" && \
587 run rm -f "${x}.installer_backup.${installer_backup_suffix}"
592 # -----------------------------------------------------------------------------
593 progress "Fix generated files permissions"
595 run find ./system/ -type f -a \! -name \*.in -a \! -name Makefile\* -a \! -name \*.conf -a \! -name \*.service -a \! -name \*.logrotate -exec chmod 755 {} \;
598 # -----------------------------------------------------------------------------
599 progress "Add user netdata to required user groups"
601 NETDATA_ADDED_TO_DOCKER=0
602 NETDATA_ADDED_TO_NGINX=0
603 NETDATA_ADDED_TO_VARNISH=0
604 NETDATA_ADDED_TO_HAPROXY=0
605 NETDATA_ADDED_TO_ADM=0
606 NETDATA_ADDED_TO_NSD=0
609 portable_add_group netdata
610 portable_add_user netdata
611 portable_add_user_to_group docker netdata && NETDATA_ADDED_TO_DOCKER=1
612 portable_add_user_to_group nginx netdata && NETDATA_ADDED_TO_NGINX=1
613 portable_add_user_to_group varnish netdata && NETDATA_ADDED_TO_VARNISH=1
614 portable_add_user_to_group haproxy netdata && NETDATA_ADDED_TO_HAPROXY=1
615 portable_add_user_to_group adm netdata && NETDATA_ADDED_TO_ADM=1
616 portable_add_user_to_group nsd netdata && NETDATA_ADDED_TO_NSD=1
619 run_failed "The installer does not run as root."
622 # -----------------------------------------------------------------------------
623 progress "Install logrotate configuration for netdata"
627 if [ -d /etc/logrotate.d -a ! -f /etc/logrotate.d/netdata ]
629 run cp system/netdata.logrotate /etc/logrotate.d/netdata
632 if [ -f /etc/logrotate.d/netdata ]
634 run chmod 644 /etc/logrotate.d/netdata
639 # -----------------------------------------------------------------------------
640 progress "Read installation options from netdata.conf"
642 # create an empty config if it does not exist
643 [ ! -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ] && \
644 touch "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
646 # function to extract values from the config file
648 local key="${1}" value="${2}" line=
650 if [ -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
652 line="$( grep "^[[:space:]]*${key}[[:space:]]*=[[:space:]]*" "${NETDATA_PREFIX}/etc/netdata/netdata.conf" | head -n 1 )"
653 [ ! -z "${line}" ] && value="$( echo "${line}" | cut -d '=' -f 2 | sed -e "s/^[[:space:]]\+//g" -e "s/[[:space:]]\+$//g" )"
659 # the user netdata will run as
660 if [ "${UID}" = "0" ]
662 NETDATA_USER="$( config_option "run as user" "netdata" )"
664 NETDATA_USER="${USER}"
667 # the owners of the web files
668 NETDATA_WEB_USER="$( config_option "web files owner" "${NETDATA_USER}" )"
669 NETDATA_WEB_GROUP="$( config_option "web files group" "${NETDATA_WEB_USER}" )"
672 NETDATA_DEBUG="$( config_option "debug flags" 0 )"
676 NETDATA_PORT="$( config_option "default port" ${defport} )"
677 NETDATA_PORT2="$( config_option "port" ${defport} )"
679 if [ "${NETDATA_PORT}" != "${NETDATA_PORT2}" ]
681 if [ "${NETDATA_PORT2}" != "${defport}" ]
683 NETDATA_PORT="${NETDATA_PORT2}"
688 NETDATA_LIB_DIR="$( config_option "lib directory" "${NETDATA_PREFIX}/var/lib/netdata" )"
689 NETDATA_CACHE_DIR="$( config_option "cache directory" "${NETDATA_PREFIX}/var/cache/netdata" )"
690 NETDATA_WEB_DIR="$( config_option "web files directory" "${NETDATA_PREFIX}/usr/share/netdata/web" )"
691 NETDATA_LOG_DIR="$( config_option "log directory" "${NETDATA_PREFIX}/var/log/netdata" )"
692 NETDATA_CONF_DIR="$( config_option "config directory" "${NETDATA_PREFIX}/etc/netdata" )"
693 NETDATA_RUN_DIR="${NETDATA_PREFIX}/var/run"
696 # -----------------------------------------------------------------------------
697 progress "Fix permissions of netdata directories (using user '${NETDATA_USER}')"
699 if [ ! -d "${NETDATA_RUN_DIR}" ]
701 # this is needed if NETDATA_PREFIX is not empty
702 run mkdir -p "${NETDATA_RUN_DIR}" || exit 1
707 for x in "python.d" "charts.d" "node.d"
709 if [ ! -d "${NETDATA_CONF_DIR}/${x}" ]
711 echo >&2 "Creating directory '${NETDATA_CONF_DIR}/${x}'"
712 run mkdir -p "${NETDATA_CONF_DIR}/${x}" || exit 1
715 run chown -R "${NETDATA_USER}:${NETDATA_USER}" "${NETDATA_CONF_DIR}"
716 run find "${NETDATA_CONF_DIR}" -type f -exec chmod 0660 {} \;
717 run find "${NETDATA_CONF_DIR}" -type d -exec chmod 0775 {} \;
721 if [ ! -d "${NETDATA_WEB_DIR}" ]
723 echo >&2 "Creating directory '${NETDATA_WEB_DIR}'"
724 run mkdir -p "${NETDATA_WEB_DIR}" || exit 1
726 run chown -R "${NETDATA_WEB_USER}:${NETDATA_WEB_GROUP}" "${NETDATA_WEB_DIR}"
727 run find "${NETDATA_WEB_DIR}" -type f -exec chmod 0664 {} \;
728 run find "${NETDATA_WEB_DIR}" -type d -exec chmod 0775 {} \;
732 for x in "${NETDATA_LIB_DIR}" "${NETDATA_CACHE_DIR}" "${NETDATA_LOG_DIR}"
736 echo >&2 "Creating directory '${x}'"
737 run mkdir -p "${x}" || exit 1
740 run chown -R "${NETDATA_USER}:${NETDATA_USER}" "${x}"
741 #run find "${x}" -type f -exec chmod 0660 {} \;
742 #run find "${x}" -type d -exec chmod 0770 {} \;
745 run chmod 755 "${NETDATA_LOG_DIR}"
751 # find the admin group
753 test -z "${admin_group}" && getent group root >/dev/null 2>&1 && admin_group="root"
754 test -z "${admin_group}" && getent group daemon >/dev/null 2>&1 && admin_group="daemon"
755 test -z "${admin_group}" && admin_group="${NETDATA_USER}"
757 run chown "${NETDATA_USER}:${admin_group}" "${NETDATA_LOG_DIR}"
758 run chown -R root "${NETDATA_PREFIX}/usr/libexec/netdata"
759 run find "${NETDATA_PREFIX}/usr/libexec/netdata" -type d -exec chmod 0755 {} \;
760 run find "${NETDATA_PREFIX}/usr/libexec/netdata" -type f -exec chmod 0644 {} \;
761 run find "${NETDATA_PREFIX}/usr/libexec/netdata" -type f -a -name \*.plugin -exec chmod 0755 {} \;
762 run find "${NETDATA_PREFIX}/usr/libexec/netdata" -type f -a -name \*.sh -exec chmod 0755 {} \;
767 if [ ! -z "${setcap}" ]
769 run setcap cap_dac_read_search,cap_sys_ptrace+ep "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
773 if [ ${setcap_ret} -eq 0 ]
775 # if we managed to setcap
776 # but we fail to execute apps.plugin
777 # trigger setuid to root
778 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin" -t >/dev/null 2>&1
783 if [ ${setcap_ret} -ne 0 ]
785 # fix apps.plugin to be setuid to root
786 run chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
787 run chmod 4755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
790 if [ -f "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/freeipmi.plugin" ]
792 run chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/freeipmi.plugin"
793 run chmod 4755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/freeipmi.plugin"
797 run chown "${NETDATA_USER}:${NETDATA_USER}" "${NETDATA_LOG_DIR}"
798 run chown -R "${NETDATA_USER}:${NETDATA_USER}" "${NETDATA_PREFIX}/usr/libexec/netdata"
799 run find "${NETDATA_PREFIX}/usr/libexec/netdata" -type f -exec chmod 0755 {} \;
800 run find "${NETDATA_PREFIX}/usr/libexec/netdata" -type d -exec chmod 0755 {} \;
803 # --- fix #1292 bug ---
805 [ -d "${NETDATA_PREFIX}/usr/libexec" ] && run chmod a+rX "${NETDATA_PREFIX}/usr/libexec"
806 [ -d "${NETDATA_PREFIX}/usr/share/netdata" ] && run chmod a+rX "${NETDATA_PREFIX}/usr/share/netdata"
810 # -----------------------------------------------------------------------------
811 progress "Install netdata at system init"
814 install_non_systemd_init() {
815 [ "${UID}" != 0 ] && return 1
818 if [ -f /etc/os-release ]
820 source /etc/os-release || return 1
821 key="${ID}-${VERSION_ID}"
823 elif [ -f /etc/centos-release ]
825 key=$(</etc/centos-release)
828 if [ -d /etc/init.d -a ! -f /etc/init.d/netdata ]
830 if [ "${key}" = "gentoo" ]
832 run cp system/netdata-openrc /etc/init.d/netdata && \
833 run chmod 755 /etc/init.d/netdata && \
834 run rc-update add netdata default && \
837 elif [ "${key}" = "ubuntu-12.04" -o "${key}" = "ubuntu-14.04" -o "${key}" = "debian-7" ]
839 run cp system/netdata-lsb /etc/init.d/netdata && \
840 run chmod 755 /etc/init.d/netdata && \
841 run update-rc.d netdata defaults && \
842 run update-rc.d netdata enable && \
845 elif [ "${key}" = "CentOS release 6.8 (Final)" -o "${key}" = "amzn-2016.09" ]
847 run cp system/netdata-init-d /etc/init.d/netdata && \
848 run chmod 755 /etc/init.d/netdata && \
849 run chkconfig netdata on && \
857 if [ "${UID}" -eq 0 ]
862 # systemd is running on this system
864 if [ ! -f /etc/systemd/system/netdata.service ]
866 echo >&2 "Installing systemd service..."
867 run cp system/netdata.service /etc/systemd/system/netdata.service && \
868 run systemctl daemon-reload && \
869 run systemctl enable netdata
872 install_non_systemd_init
877 # -----------------------------------------------------------------------------
878 # check if we can re-start netdata
885 [ -z "$1" -o ! -f "/proc/$1/stat" ] && return 1
886 [ "$(cat "/proc/$1/stat" | cut -d '(' -f 2 | cut -d ')' -f 1)" = "netdata" ] && return 0
892 stop_netdata_on_pid() {
893 local pid="${1}" ret=0 count=0
895 isnetdata ${pid} || return 0
897 printf >&2 "Stopping netdata on pid ${pid} ..."
898 while [ ! -z "$pid" -a ${ret} -eq 0 ]
900 if [ ${count} -gt 45 ]
902 echo >&2 "Cannot stop the running netdata on pid ${pid}."
906 count=$(( count + 1 ))
908 run kill ${pid} 2>/dev/null
911 test ${ret} -eq 0 && printf >&2 "." && sleep 2
917 echo >&2 "SORRY! CANNOT STOP netdata ON PID ${pid} !"
921 echo >&2 "netdata on pid ${pid} stopped."
928 myns="$(readlink /proc/self/ns/pid 2>/dev/null)"
930 # echo >&2 "Stopping a (possibly) running netdata (namespace '${myns}')..."
932 for p in $(cat "${NETDATA_RUN_DIR}/netdata.pid" 2>/dev/null) \
933 $(cat /var/run/netdata.pid 2>/dev/null) \
934 $(cat /var/run/netdata/netdata.pid 2>/dev/null) \
935 $(pidof netdata 2>/dev/null)
937 ns="$(readlink /proc/${p}/ns/pid 2>/dev/null)"
939 if [ -z "${myns}" -o -z "${ns}" -o "${myns}" = "${ns}" ]
941 stop_netdata_on_pid ${p}
946 if [ ${DONOTSTART} -eq 1 ]
948 if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
950 echo "# Get config from http://127.0.0.1:${NETDATA_PORT}/netdata.conf" >"${NETDATA_PREFIX}/etc/netdata/netdata.conf"
952 if [ "${UID}" -eq 0 ]
954 chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
956 chmod 0644 "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
961 progress "Start netdata"
963 if [ "${UID}" -eq 0 ]
967 service netdata restart && started=1
968 if [ ${started} -eq 0 ]
970 service netdata start && started=1
974 if [ ${started} -eq 0 ]
976 # still not started...
980 echo >&2 "Starting netdata..."
981 run ${NETDATA_PREFIX}/usr/sbin/netdata -P ${NETDATA_RUN_DIR}/netdata.pid "${@}"
985 echo >&2 "SORRY! FAILED TO START NETDATA!"
988 echo >&2 "OK. NetData Started!"
994 # -----------------------------------------------------------------------------
995 # save a config file, if it is not already there
997 if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
1000 echo >&2 "-------------------------------------------------------------------------------"
1002 echo >&2 "Downloading default configuration from netdata..."
1005 # remove a possibly obsolete download
1006 [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new"
1008 # disable a proxy to get data from the local netdata
1013 wget 2>/dev/null -O "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf"
1017 if [ ${ret} -ne 0 -o ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ]
1019 curl -s -o "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf"
1023 if [ ${ret} -eq 0 -a -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ]
1025 mv "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
1026 echo >&2 "New configuration saved for you to edit at ${NETDATA_PREFIX}/etc/netdata/netdata.conf"
1028 if [ "${UID}" -eq 0 ]
1030 chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
1032 chmod 0664 "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
1034 echo >&2 "Cannnot download configuration from netdata daemon using url 'http://localhost:${NETDATA_PORT}/netdata.conf'"
1035 [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new"
1040 # -----------------------------------------------------------------------------
1041 progress "Check KSM (kernel memory deduper)"
1043 ksm_is_available_but_disabled() {
1046 ${TPUT_BOLD}Memory de-duplication instructions${TPUT_RESET}
1048 You have kernel memory de-duper (called Kernel Same-page Merging,
1049 or KSM) available, but it is not currently enabled.
1053 ${TPUT_YELLOW}${TPUT_BOLD}echo 1 >/sys/kernel/mm/ksm/run${TPUT_RESET}
1054 ${TPUT_YELLOW}${TPUT_BOLD}echo 1000 >/sys/kernel/mm/ksm/sleep_millisecs${TPUT_RESET}
1056 If you enable it, you will save 40-60% of netdata memory.
1061 ksm_is_not_available() {
1064 ${TPUT_BOLD}Memory de-duplication not present in your kernel${TPUT_RESET}
1066 It seems you do not have kernel memory de-duper (called Kernel Same-page
1067 Merging, or KSM) available.
1069 To enable it, you need a kernel built with CONFIG_KSM=y
1071 If you can have it, you will save 40-60% of netdata memory.
1076 if [ -f "/sys/kernel/mm/ksm/run" ]
1078 if [ $(cat "/sys/kernel/mm/ksm/run") != "1" ]
1080 ksm_is_available_but_disabled
1083 ksm_is_not_available
1086 # -----------------------------------------------------------------------------
1087 progress "Check version.txt"
1089 if [ ! -s web/version.txt ]
1093 ${TPUT_BOLD}Version update check warning${TPUT_RESET}
1095 The way you downloaded netdata, we cannot find its version. This means the
1096 Update check on the dashboard, will not work.
1098 If you want to have version update check, please re-install it
1099 following the procedure in:
1101 https://github.com/firehol/netdata/wiki/Installation
1106 # -----------------------------------------------------------------------------
1107 progress "Check apps.plugin"
1109 if [ "${UID}" -ne 0 ]
1111 cat <<SETUID_WARNING
1113 ${TPUT_BOLD}apps.plugin needs privileges${TPUT_RESET}
1115 Since you have installed netdata as a normal user, to have apps.plugin collect
1116 all the needed data, you have to give it the access rights it needs, by running
1117 either of the following sets of commands:
1119 To run apps.plugin with escalated capabilities:
1121 ${TPUT_YELLOW}${TPUT_BOLD}sudo chown root:${NETDATA_USER} \"${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin\"${TPUT_RESET}
1122 ${TPUT_YELLOW}${TPUT_BOLD}sudo chmod 0750 \"${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin\"${TPUT_RESET}
1123 ${TPUT_YELLOW}${TPUT_BOLD}sudo setcap cap_dac_read_search,cap_sys_ptrace+ep \"${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin\"${TPUT_RESET}
1125 or, to run apps.plugin as root:
1127 ${TPUT_YELLOW}${TPUT_BOLD}sudo chown root \"${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin\"${TPUT_RESET}
1128 ${TPUT_YELLOW}${TPUT_BOLD}sudo chmod 4755 \"${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin\"${TPUT_RESET}
1130 apps.plugin is performing a hard-coded function of data collection for all
1131 running processes. It cannot be instructed from the netdata daemon to perform
1132 any task, so it is pretty safe to do this.
1137 # -----------------------------------------------------------------------------
1138 progress "Generate netdata-uninstaller.sh"
1140 cat >netdata-uninstaller.sh <<UNINSTALL
1143 # this script will uninstall netdata
1145 if [ "\$1" != "--force" ]
1147 echo >&2 "This script will REMOVE netdata from your system."
1148 echo >&2 "Run it again with --force to do it."
1152 echo >&2 "Stopping a possibly running netdata..."
1153 for p in \$(pidof netdata); do kill \$p; done
1157 if [ ! -z "\$1" -a -d "\$1" ]
1160 echo "Deleting directory '\$1' ..."
1165 if [ ! -z "${NETDATA_PREFIX}" -a -d "${NETDATA_PREFIX}" ]
1167 # installation prefix was given
1169 deletedir "${NETDATA_PREFIX}"
1172 # installation prefix was NOT given
1174 if [ -f "${NETDATA_PREFIX}/usr/sbin/netdata" ]
1176 echo "Deleting ${NETDATA_PREFIX}/usr/sbin/netdata ..."
1177 rm -i "${NETDATA_PREFIX}/usr/sbin/netdata"
1180 deletedir "${NETDATA_PREFIX}/etc/netdata"
1181 deletedir "${NETDATA_PREFIX}/usr/share/netdata"
1182 deletedir "${NETDATA_PREFIX}/usr/libexec/netdata"
1183 deletedir "${NETDATA_PREFIX}/var/lib/netdata"
1184 deletedir "${NETDATA_PREFIX}/var/cache/netdata"
1185 deletedir "${NETDATA_PREFIX}/var/log/netdata"
1188 if [ -f /etc/logrotate.d/netdata ]
1190 echo "Deleting /etc/logrotate.d/netdata ..."
1191 rm -i /etc/logrotate.d/netdata
1194 if [ -f /etc/systemd/system/netdata.service ]
1196 echo "Deleting /etc/systemd/system/netdata.service ..."
1197 rm -i /etc/systemd/system/netdata.service
1200 if [ -f /etc/init.d/netdata ]
1202 echo "Deleting /etc/init.d/netdata ..."
1203 rm -i /etc/init.d/netdata
1206 getent passwd netdata > /dev/null
1210 echo "You may also want to remove the user netdata"
1212 echo " userdel netdata"
1215 getent group netdata > /dev/null
1219 echo "You may also want to remove the group netdata"
1221 echo " groupdel netdata"
1224 getent group docker > /dev/null
1225 if [ $? -eq 0 -a "${NETDATA_ADDED_TO_DOCKER}" = "1" ]
1228 echo "You may also want to remove the netdata user from the docker group"
1230 echo " gpasswd -d netdata docker"
1233 getent group nginx > /dev/null
1234 if [ $? -eq 0 -a "${NETDATA_ADDED_TO_NGINX}" = "1" ]
1237 echo "You may also want to remove the netdata user from the nginx group"
1239 echo " gpasswd -d netdata nginx"
1242 getent group varnish > /dev/null
1243 if [ $? -eq 0 -a "${NETDATA_ADDED_TO_VARNISH}" = "1" ]
1246 echo "You may also want to remove the netdata user from the varnish group"
1248 echo " gpasswd -d netdata varnish"
1251 getent group haproxy > /dev/null
1252 if [ $? -eq 0 -a "${NETDATA_ADDED_TO_HAPROXY}" = "1" ]
1255 echo "You may also want to remove the netdata user from the haproxy group"
1257 echo " gpasswd -d netdata haproxy"
1260 getent group adm > /dev/null
1261 if [ $? -eq 0 -a "${NETDATA_ADDED_TO_ADM}" = "1" ]
1264 echo "You may also want to remove the netdata user from the adm group"
1266 echo " gpasswd -d netdata adm"
1269 getent group nsd > /dev/null
1270 if [ $? -eq 0 -a "${NETDATA_ADDED_TO_NSD}" = "1" ]
1273 echo "You may also want to remove the netdata user from the nsd group"
1275 echo " gpasswd -d netdata nsd"
1280 chmod 750 netdata-uninstaller.sh
1282 # -----------------------------------------------------------------------------
1283 progress "Basic netdata instructions"
1287 netdata by default listens on all IPs on port ${NETDATA_PORT},
1288 so you can access it with:
1290 ${TPUT_CYAN}${TPUT_BOLD}http://this.machine.ip:${NETDATA_PORT}/${TPUT_RESET}
1292 To stop netdata, just kill it, with:
1294 ${TPUT_YELLOW}${TPUT_BOLD}killall netdata${TPUT_RESET}
1296 To start it, just run it:
1298 ${TPUT_YELLOW}${TPUT_BOLD}${NETDATA_PREFIX}/usr/sbin/netdata${TPUT_RESET}
1302 echo >&2 "Uninstall script generated: ${TPUT_RED}${TPUT_BOLD}./netdata-uninstaller.sh${TPUT_RESET}"
1306 cat >netdata-updater.sh.new <<REINSTALL
1310 [ "\${1}" = "-f" ] && force=1
1312 export PATH="\${PATH}:${PATH}"
1313 export CFLAGS="${CFLAGS}"
1314 export NETDATA_CONFIGURE_OPTIONS="${NETDATA_CONFIGURE_OPTIONS}"
1316 INSTALL_UID="${UID}"
1317 if [ "\${INSTALL_UID}" != "\${UID}" ]
1319 echo >&2 "This script should be run as user with uid \${INSTALL_UID} but it now runs with uid \${UID}"
1323 # make sure we cd to the working directory
1324 cd "${REINSTALL_PWD}" || exit 1
1326 # make sure there is .git here
1327 [ \${force} -eq 0 -a ! -d .git ] && echo >&2 "No git structures found at: ${REINSTALL_PWD} (use -f for force re-install)" && exit 1
1329 # signal netdata to start saving its database
1330 # this is handy if your database is big
1331 pids=\$(pidof netdata)
1332 [ ! -z "\${pids}" ] && kill -USR1 \${pids}
1337 # we are running on a terminal
1338 # open fd 3 and send it to stderr
1342 # create a temporary file for the log
1343 tmp=\$(mktemp /tmp/netdata-updater-log-XXXXXX.log)
1344 # open fd 3 and send it to tmp
1349 echo >&3 "\$(date) : INFO: " "\${@}"
1357 echo >&3 "\$(date) : ERROR: " "\${@}"
1360 # this is what we will do if it fails (head-less only)
1362 error "FAILED TO UPDATE NETDATA : \${1}"
1364 if [ ! -z "\${tmp}" ]
1372 get_latest_commit_id() {
1374 grep ^commit 2>&3 |\\
1376 cut -d ' ' -f 2 2>&3
1380 [ -z "\${tmp}" ] && info "Running on a terminal - (this script also supports running headless from crontab)"
1386 info "Updating netdata source from github..."
1388 last_commit="\$(get_latest_commit_id)"
1389 [ \${force} -eq 0 -a -z "\${last_commit}" ] && failed "CANNOT GET LAST COMMIT ID (use -f for force re-install)"
1391 git pull >&3 2>&3 || failed "CANNOT FETCH LATEST SOURCE (use -f for force re-install)"
1393 new_commit="\$(get_latest_commit_id)"
1394 if [ \${force} -eq 0 ]
1396 [ -z "\${new_commit}" ] && failed "CANNOT GET NEW LAST COMMIT ID (use -f for force re-install)"
1397 [ "\${new_commit}" = "\${last_commit}" ] && info "Nothing to be done! (use -f to force re-install)" && exit 0
1399 elif [ \${force} -eq 0 ]
1401 failed "CANNOT FIND GIT STRUCTURES IN \$(pwd) (use -f for force re-install)"
1405 info "Re-installing netdata..."
1406 ${REINSTALL_COMMAND// --dont-wait/} --dont-wait >&3 2>&3 || failed "FAILED TO COMPILE/INSTALL NETDATA"
1408 [ ! -z "\${tmp}" ] && rm "\${tmp}" && tmp=
1412 # the installer updates this script - so we run and exit in a single line
1414 ###############################################################################
1415 ###############################################################################
1417 chmod 755 netdata-updater.sh.new
1418 mv -f netdata-updater.sh.new netdata-updater.sh
1419 echo >&2 "Update script generated : ${TPUT_GREEN}${TPUT_BOLD}./netdata-updater.sh${TPUT_RESET}"
1421 echo >&2 "${TPUT_DIM}${TPUT_BOLD}netdata-updater.sh${TPUT_RESET}${TPUT_DIM} can work from cron. It will trigger an email from cron"
1422 echo >&2 "only if it fails (it does not print anything if it can update netdata).${TPUT_RESET}"
1423 if [ "${UID}" -eq 0 -a -d "/etc/cron.daily" -a ! -f "/etc/cron.daily/netdata-updater.sh" ]
1425 echo >&2 "${TPUT_DIM}Run this to automatically check and install netdata updates once per day:${TPUT_RESET}"
1427 echo >&2 "${TPUT_YELLOW}${TPUT_BOLD}ln -s ${PWD}/netdata-updater.sh /etc/cron.daily/netdata-updater.sh${TPUT_RESET}"
1429 elif [ -f "netdata-updater.sh" ]
1431 rm "netdata-updater.sh"
1434 # -----------------------------------------------------------------------------
1436 progress "We are done!"
1438 if [ ${started} -eq 1 ]
1440 netdata_banner "is installed and running now!"
1442 netdata_banner "is installed now!"
1445 echo >&2 " enjoy real-time performance and health monitoring..."