]> arthur.barton.de Git - netdata.git/blob - netdata-installer.sh
detect stock versions of config files and replace them with the newer versions
[netdata.git] / netdata-installer.sh
1 #!/bin/bash
2
3 # reload the user profile
4 [ -f /etc/profile ] && . /etc/profile
5
6 # fix PKG_CHECK_MODULES error
7 if [ -d /usr/share/aclocal ]
8 then
9         ACLOCAL_PATH=${ACLOCAL_PATH-/usr/share/aclocal}
10         export ACLOCAL_PATH
11 fi
12
13 LC_ALL=C
14 umask 022
15
16 # you can set CFLAGS before running installer
17 CFLAGS="${CFLAGS--O3}"
18
19 # keep a log of this command
20 printf "\n# " >>netdata-installer.log
21 date >>netdata-installer.log
22 printf "CFLAGS=\"%s\" " "${CFLAGS}" >>netdata-installer.log
23 printf "%q " "$0" "${@}" >>netdata-installer.log
24 printf "\n" >>netdata-installer.log
25
26 ME="$0"
27 DONOTSTART=0
28 DONOTWAIT=0
29 NETDATA_PREFIX=
30 LIBS_ARE_HERE=0
31
32 usage() {
33         cat <<-USAGE
34
35         ${ME} <installer options>
36
37         Valid <installer options> are:
38
39            --install /PATH/TO/INSTALL
40
41                         If your give: --install /opt
42                         netdata will be installed in /opt/netdata
43
44            --dont-start-it
45
46                         Do not (re)start netdata.
47                         Just install it.
48
49            --dont-wait
50
51                         Do not wait for the user to press ENTER.
52                         Start immediately building it.
53
54            --zlib-is-really-here
55            --libs-are-really-here
56
57                         If you get errors about missing zlib,
58                         or libuuid but you know it is available,
59                         you have a broken pkg-config.
60                         Use this option to allow it continue
61                         without checking pkg-config.
62
63         Netdata will by default be compiled with gcc optimization -O3
64         If you need to pass different CFLAGS, use something like this:
65
66           CFLAGS="<gcc options>" ${ME} <installer options>
67
68         For the installer to complete successfully, you will need
69         these packages installed:
70
71            gcc make autoconf automake pkg-config zlib1g-dev (or zlib-devel)
72            uuid-dev (or libuuid-devel)
73
74         For the plugins, you will at least need:
75
76            curl nodejs
77
78 USAGE
79 }
80
81 md5sum="$(which md5sum 2>/dev/null || command -v md5sum 2>/dev/null)"
82 get_git_config_signatures() {
83         local x s file md5
84
85         [ ! -d "conf.d" ] && echo >&2 "Wrong directory." && return 1
86         [ -z "${md5sum}" -o ! -x "${md5sum}" ] && echo >&2 "No md5sum command." && return 1
87
88         echo >configs.signatures.tmp
89
90         for x in $(find conf.d -name \*.conf)
91         do
92                 x="${x/conf.d\//}"
93                 echo "${x}"
94                 for c in $(git log --follow "conf.d/${x}" | grep ^commit | cut -d ' ' -f 2)
95                 do
96                         git checkout ${c} "conf.d/${x}" || continue
97                         s="$(cat "conf.d/${x}" | md5sum | cut -d ' ' -f 1)"
98                         echo >>configs.signatures.tmp "${x}:${s}"
99                         echo "    ${s}"
100                 done
101                 git checkout HEAD "conf.d/${x}" || break
102         done
103
104         cat configs.signatures.tmp |\
105                 grep -v "^$" |\
106                 sort -u |\
107                 {
108                         echo "declare -A configs_signatures=("
109                         IFS=":"
110                         while read file md5
111                         do
112                                 echo "  ['${md5}']='${file}'"
113                         done
114                         echo ")"
115                 } >configs.signatures
116
117         rm configs.signatures.tmp
118
119         return 0
120 }
121
122
123 while [ ! -z "${1}" ]
124 do
125         if [ "$1" = "--install" ]
126                 then
127                 NETDATA_PREFIX="${2}/netdata"
128                 shift 2
129         elif [ "$1" = "--zlib-is-really-here" -o "$1" = "--libs-are-really-here" ]
130                 then
131                 LIBS_ARE_HERE=1
132                 shift 1
133         elif [ "$1" = "--dont-start-it" ]
134                 then
135                 DONOTSTART=1
136                 shift 1
137         elif [ "$1" = "--dont-wait" ]
138                 then
139                 DONOTWAIT=1
140                 shift 1
141         elif [ "$1" = "--help" -o "$1" = "-h" ]
142                 then
143                 usage
144                 exit 1
145         elif [ "$1" = "get_git_config_signatures" ]
146                 then
147                 get_git_config_signatures && exit 0
148                 exit 1
149         else
150                 echo >&2
151                 echo >&2 "ERROR:"
152                 echo >&2 "I cannot understand option '$1'."
153                 usage
154                 exit 1
155         fi
156 done
157
158 cat <<-BANNER
159
160         Welcome to netdata!
161         Nice to see you are giving it a try!
162
163         You are about to build and install netdata to your system.
164
165         It will be installed at these locations:
166
167           - the daemon    at ${NETDATA_PREFIX}/usr/sbin/netdata
168           - config files  at ${NETDATA_PREFIX}/etc/netdata
169           - web files     at ${NETDATA_PREFIX}/usr/share/netdata
170           - plugins       at ${NETDATA_PREFIX}/usr/libexec/netdata
171           - cache files   at ${NETDATA_PREFIX}/var/cache/netdata
172           - db files      at ${NETDATA_PREFIX}/var/lib/netdata
173           - log files     at ${NETDATA_PREFIX}/var/log/netdata
174           - pid file      at ${NETDATA_PREFIX}/var/run
175
176         This installer allows you to change the installation path.
177         Press Control-C and run the same command with --help for help.
178
179 BANNER
180
181 if [ "${UID}" -ne 0 ]
182         then
183         if [ -z "${NETDATA_PREFIX}" ]
184                 then
185                 cat <<-NONROOTNOPREFIX
186
187                 Sorry! This will fail!
188
189                 You are attempting to install netdata as non-root, but you plan to install it
190                 in system paths.
191
192                 Please set an installation prefix, like this:
193
194                         $0 ${@} --install /tmp
195
196                 or, run the installer as root:
197
198                         sudo $0 ${@}
199
200                 We suggest to install it as root, or certain data collectors will not be able
201                 to work. Netdata drops root privileges when running. So, if you plan to keep
202                 it, install it as root to get the full functionality.
203
204 NONROOTNOPREFIX
205                 exit 1
206
207         else
208                 cat <<-NONROOT
209
210                 IMPORTANT:
211                 You are about to install netdata as a non-root user.
212                 Netdata will work, but a few data collection modules that
213                 require root access will fail.
214
215                 If you installing permanently on your system, run the
216                 installer like this:
217
218                         sudo $0 ${@}
219
220 NONROOT
221         fi
222 fi
223
224 have_autotools=
225 if [ "$(type autoreconf 2> /dev/null)" ]
226 then
227         autoconf_maj_min() {
228                 local maj min IFS=.-
229
230                 maj=$1
231                 min=$2
232
233                 set -- $(autoreconf -V | sed -ne '1s/.* \([^ ]*\)$/\1/p')
234                 eval $maj=\$1 $min=\$2
235         }
236         autoconf_maj_min AMAJ AMIN
237
238         if [ "$AMAJ" -gt 2 ]
239         then
240                 have_autotools=Y
241         elif [ "$AMAJ" -eq 2 -a "$AMIN" -ge 60 ]
242         then
243                 have_autotools=Y
244         else
245                 echo "Found autotools $AMAJ.$AMIN"
246         fi
247 else
248         echo "No autotools found"
249 fi
250
251 if [ ! "$have_autotools" ]
252 then
253         if [ -f configure ]
254         then
255                 echo "Will skip autoreconf step"
256         else
257                 cat <<-"EOF"
258
259                 -------------------------------------------------------------------------------
260                 autotools 2.60 or later is required
261
262                 Sorry, you do not seem to have autotools 2.60 or later, which is
263                 required to build from the git sources of netdata.
264
265                 You can either install a suitable version of autotools and automake
266                 or download a netdata package which does not have these dependencies.
267
268                 Source packages where autotools have already been run are available
269                 here:
270                            https://firehol.org/download/netdata/
271
272                 The unsigned/master folder tracks the head of the git tree and released
273                 packages are also available.
274 EOF
275                 exit 1
276         fi
277 fi
278
279 if [ ${DONOTWAIT} -eq 0 ]
280         then
281         if [ ! -z "${NETDATA_PREFIX}" ]
282                 then
283                 read -p "Press ENTER to build and install netdata to '${NETDATA_PREFIX}' > "
284         else
285                 read -p "Press ENTER to build and install netdata to your system > "
286         fi
287 fi
288
289 build_error() {
290         cat <<-EOF
291
292         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
293
294         Sorry! NetData failed to build...
295
296         You many need to check these:
297
298         1. The package uuid-dev (or libuuid-devel) has to be installed.
299
300            If your system cannot find libuuid, although it is installed
301            run me with the option:  --libs-are-really-here
302
303         2. The package zlib1g-dev (or zlib-devel) has to be installed.
304
305            If your system cannot find zlib, although it is installed
306            run me with the option:  --libs-are-really-here
307
308         3. You need basic build tools installed, like:
309
310            gcc make autoconf automake pkg-config
311
312            Autoconf version 2.60 or higher is required.
313
314         If you still cannot get it to build, ask for help at github:
315
316            https://github.com/firehol/netdata/issues
317
318
319 EOF
320         trap - EXIT
321         exit 1
322 }
323
324 run() {
325         printf >>netdata-installer.log "# "
326         printf >>netdata-installer.log "%q " "${@}"
327         printf >>netdata-installer.log " ... "
328
329         printf >&2 "\n"
330         printf >&2 ":-----------------------------------------------------------------------------\n"
331         printf >&2 "Running command:\n"
332         printf >&2 "\n"
333         printf >&2 "%q " "${@}"
334         printf >&2 "\n"
335
336         "${@}"
337
338         local ret=$?
339         if [ ${ret} -ne 0 ]
340                 then
341                 printf >>netdata-installer.log "FAILED!\n"
342         else
343                 printf >>netdata-installer.log "OK\n"
344         fi
345
346         return ${ret}
347 }
348
349 if [ ${LIBS_ARE_HERE} -eq 1 ]
350         then
351         shift
352         echo >&2 "ok, assuming libs are really installed."
353         export ZLIB_CFLAGS=" "
354         export ZLIB_LIBS="-lz"
355         export UUID_CFLAGS=" "
356         export UUID_LIBS="-luuid"
357 fi
358
359 trap build_error EXIT
360
361 if [ "$have_autotools" ]
362 then
363         run ./autogen.sh || exit 1
364 fi
365
366 run ./configure \
367         --prefix="${NETDATA_PREFIX}/usr" \
368         --sysconfdir="${NETDATA_PREFIX}/etc" \
369         --localstatedir="${NETDATA_PREFIX}/var" \
370         --with-zlib --with-math --with-user=netdata \
371         CFLAGS="${CFLAGS}" || exit 1
372
373 # remove the build_error hook
374 trap - EXIT
375
376 if [ -f src/netdata ]
377         then
378         echo >&2 "Cleaning a possibly old compilation ..."
379         run make clean
380 fi
381
382 echo >&2 "Compiling netdata ..."
383 run make || exit 1
384
385 declare -A configs_signatures=()
386 if [ -f "configs.signatures" ]
387         then
388         source "configs.signatures" || echo >&2 "ERROR: Failed to load configs.signatures !"
389 fi
390
391 # backup user configurations
392 installer_backup_suffix="${PID}.${RANDOM}"
393 for x in $(find "${NETDATA_PREFIX}/etc/netdata/" -name '*.conf' -type f)
394 do
395         if [ -f "${x}" ]
396                 then
397                 if [ -z "${md5sum}" -o ! -x "${md5sum}" ]
398                         then
399                         cp -p "${x}" "${x}.installer_backup.${installer_backup_suffix}"
400                 else
401                         f="${x/*\/etc\/netdata\//}"
402                         md5="$(cat "${x}" | ${md5sum} | cut -d ' ' -f 1)"
403                         if [ "${configs_signatures[${md5}]}" = "${f}" ]
404                                 then
405                                 echo >&2 "File '${x}' is stock version."
406                         else
407                                 echo >&2 "File '${x}' has been edited by user."
408                                 cp -p "${x}" "${x}.installer_backup.${installer_backup_suffix}"
409                         fi
410                 fi
411
412         elif [ -f "${x}.installer_backup.${installer_backup_suffix}" ]
413                 then
414                 rm -f "${x}.installer_backup.${installer_backup_suffix}"
415         fi
416 done
417
418 echo >&2 "Installing netdata ..."
419 run make install || exit 1
420
421 # restore user configurations
422 for x in $(find "${NETDATA_PREFIX}/etc/netdata/" -name '*.conf' -type f)
423 do
424         if [ -f "${x}.installer_backup.${installer_backup_suffix}" ]
425                 then
426                 cp -p "${x}.installer_backup.${installer_backup_suffix}" "${x}"
427                 rm -f "${x}.installer_backup.${installer_backup_suffix}"
428         fi
429 done
430
431 NETDATA_ADDED_TO_DOCKER=0
432 if [ ${UID} -eq 0 ]
433         then
434         getent group netdata > /dev/null
435         if [ $? -ne 0 ]
436                 then
437                 echo >&2 "Adding netdata user group ..."
438                 run groupadd -r netdata
439         fi
440
441         getent passwd netdata > /dev/null
442         if [ $? -ne 0 ]
443                 then
444                 echo >&2 "Adding netdata user account ..."
445                 run useradd -r -g netdata -c netdata -s $(which nologin || echo '/bin/false') -d / netdata
446         fi
447
448         getent group docker > /dev/null
449         if [ $? -eq 0 ]
450                 then
451                 # find the users in the docker group
452                 docker=$(getent group docker | cut -d ':' -f 4)
453                 if [[ ",${docker}," =~ ,netdata, ]]
454                         then
455                         # netdata is already there
456                         :
457                 else
458                         # netdata is not in docker group
459                         echo >&2 "Adding netdata user to the docker group (needed to get container names) ..."
460                         run usermod -a -G docker netdata
461                 fi
462                 # let the uninstall script know
463                 NETDATA_ADDED_TO_DOCKER=1
464         fi
465
466         if [ -d /etc/logrotate.d -a ! -f /etc/logrotate.d/netdata ]
467                 then
468                 echo >&2 "Adding netdata logrotate configuration ..."
469                 run cp system/netdata.logrotate /etc/logrotate.d/netdata
470         fi
471 fi
472
473
474 # -----------------------------------------------------------------------------
475 # load options from the configuration file
476
477 # create an empty config if it does not exist
478 [ ! -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ] && touch "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
479
480 # function to extract values from the config file
481 config_option() {
482         local key="${1}" value="${2}" line=
483
484         if [ -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
485                 then
486                 line="$( grep "^[[:space:]]*${key}[[:space:]]*=[[:space:]]*" "${NETDATA_PREFIX}/etc/netdata/netdata.conf" | head -n 1 )"
487                 [ ! -z "${line}" ] && value="$( echo "${line}" | cut -d '=' -f 2 | sed -e "s/^[[:space:]]\+//g" -e "s/[[:space:]]\+$//g" )"
488         fi
489
490         echo "${value}"
491 }
492
493 # user
494 defuser="netdata"
495 [ ! "${UID}" = "0" ] && defuser="${USER}"
496 NETDATA_USER="$( config_option "run as user" "${defuser}" )"
497
498 NETDATA_WEB_USER="$( config_option "web files owner" "${defuser}" )"
499 NETDATA_WEB_GROUP="$( config_option "web files group" "${NETDATA_WEB_USER}" )"
500
501 # debug flags
502 defdebug=0
503 NETDATA_DEBUG="$( config_option "debug flags" ${defdebug} )"
504
505 # port
506 defport=19999
507 NETDATA_PORT="$( config_option "port" ${defport} )"
508
509 # directories
510 NETDATA_LIB_DIR="$( config_option "lib directory" "${NETDATA_PREFIX}/var/lib/netdata" )"
511 NETDATA_CACHE_DIR="$( config_option "cache directory" "${NETDATA_PREFIX}/var/cache/netdata" )"
512 NETDATA_WEB_DIR="$( config_option "web files directory" "${NETDATA_PREFIX}/usr/share/netdata/web" )"
513 NETDATA_LOG_DIR="$( config_option "log directory" "${NETDATA_PREFIX}/var/log/netdata" )"
514 NETDATA_CONF_DIR="$( config_option "config directory" "${NETDATA_PREFIX}/etc/netdata" )"
515 NETDATA_BIND="$( config_option "bind socket to IP" "*" )"
516 NETDATA_RUN_DIR="${NETDATA_PREFIX}/var/run"
517
518
519 # -----------------------------------------------------------------------------
520 # prepare the directories
521
522 # this is needed if NETDATA_PREFIX is not empty
523 if [ ! -d "${NETDATA_RUN_DIR}" ]
524         then
525         mkdir -p "${NETDATA_RUN_DIR}" || exit 1
526 fi
527
528 echo >&2
529 echo >&2 "Fixing directories (user: ${NETDATA_USER})..."
530 for x in "${NETDATA_WEB_DIR}" "${NETDATA_CONF_DIR}" "${NETDATA_CACHE_DIR}" "${NETDATA_LOG_DIR}" "${NETDATA_LIB_DIR}"
531 do
532         if [ ! -d "${x}" ]
533                 then
534                 echo >&2 "Creating directory '${x}'"
535                 run mkdir -p "${x}" || exit 1
536         fi
537
538         if [ ${UID} -eq 0 ]
539                 then
540                 if [ "${x}" = "${NETDATA_WEB_DIR}" ]
541                         then
542                         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}..."
543                 else
544                         run chown -R "${NETDATA_USER}:${NETDATA_USER}" "${x}" || echo >&2 "WARNING: Cannot change the ownership of the files in directory ${x} to ${NETDATA_USER}..."
545                 fi
546         fi
547
548         run chmod 0755 "${x}" || echo >&2 "WARNING: Cannot change the permissions of the directory ${x} to 0755..."
549 done
550
551 if [ ${UID} -eq 0 ]
552         then
553         run chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
554         run chmod 0755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
555         run setcap cap_dac_read_search,cap_sys_ptrace+ep "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
556         if [ $? -ne 0 ]
557                 then
558                 # fix apps.plugin to be setuid to root
559                 run chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
560                 run chmod 4755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
561         fi
562 fi
563
564 # -----------------------------------------------------------------------------
565 # check if we can re-start netdata
566
567 if [ ${DONOTSTART} -eq 1 ]
568         then
569         if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
570                 then
571                 echo >&2 "Generating empty config file in: ${NETDATA_PREFIX}/etc/netdata/netdata.conf"
572                 echo "# Get config from http://127.0.0.1:${NETDATA_PORT}/netdata.conf" >"${NETDATA_PREFIX}/etc/netdata/netdata.conf"
573
574                 if [ "${UID}" -eq 0 ]
575                         then
576                         chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
577                 fi
578                 chmod 0664 "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
579         fi
580         echo >&2 "OK. It is now installed and ready."
581         exit 0
582 fi
583
584 # -----------------------------------------------------------------------------
585 # stop a running netdata
586
587 isnetdata() {
588         [ -z "$1" -o ! -f "/proc/$1/stat" ] && return 1
589         [ "$(cat "/proc/$1/stat" | cut -d '(' -f 2 | cut -d ')' -f 1)" = "netdata" ] && return 0
590         return 1
591 }
592
593 stop_netdata_on_pid() {
594         local pid="$1" ret=0 count=0
595
596         isnetdata $pid || return 0
597
598         printf >&2 "Stopping netdata on pid $pid ..."
599         while [ ! -z "$pid" -a $ret -eq 0 ]
600         do
601                 if [ $count -gt 45 ]
602                         then
603                         echo >&2 "Cannot stop the running netdata on pid $pid."
604                         return 1
605                 fi
606
607                 count=$(( count + 1 ))
608
609                 run kill $pid 2>/dev/null
610                 ret=$?
611
612                 test $ret -eq 0 && printf >&2 "." && sleep 2
613         done
614
615         echo >&2
616         if [ $ret -eq 0 ]
617         then
618                 echo >&2 "SORRY! CANNOT STOP netdata ON PID $pid !"
619                 return 1
620         fi
621
622         echo >&2 "netdata on pid $pid stopped."
623         return 0
624 }
625
626 stop_all_netdata() {
627         local p
628
629         echo >&2 "Stopping a (possibly) running netdata..."
630
631         for p in $(cat "${NETDATA_RUN_DIR}/netdata.pid" 2>/dev/null) \
632                 $(cat /var/run/netdata.pid 2>/dev/null) \
633                 $(cat /var/run/netdata/netdata.pid 2>/dev/null) \
634                 $(pidof netdata 2>/dev/null)
635         do
636                 stop_netdata_on_pid $p
637         done
638 }
639
640 # -----------------------------------------------------------------------------
641 # check netdata for systemd
642
643 issystemd() {
644         # if the directory /etc/systemd/system does not exit, it is not systemd
645         [ ! -d /etc/systemd/system ] && return 1
646
647         # if pid 1 is systemd, it is systemd
648         [ "$(basename $(readlink /proc/1/exe) 2>/dev/null)" = "systemd" ] && return 0
649
650         # if systemd is running, it is systemd
651         pidof systemd >/dev/null 2>&1 && return 0
652
653         # else, it is not systemd
654         return 1
655 }
656
657 started=0
658 if [ "${UID}" -eq 0 ]
659         then
660
661         if issystemd
662         then
663                 # systemd is running on this system
664
665                 if [ ! -f /etc/systemd/system/netdata.service ]
666                 then
667                         echo >&2 "Installing systemd service..."
668                         run cp system/netdata.service /etc/systemd/system/netdata.service && \
669                                 run systemctl daemon-reload && \
670                                 run systemctl enable netdata
671                 else
672                         run service netdata stop
673                 fi
674
675                 stop_all_netdata
676                 run service netdata restart && started=1
677         fi
678
679         if [ ${started} -eq 0 ]
680         then
681                 # check if we can use the system service
682                 run service netdata stop
683                 stop_all_netdata
684                 run service netdata restart && started=1
685                 if [ ${started} -eq 0 ]
686                 then
687                         run service netdata start && started=1
688                 fi
689         fi
690 fi
691
692 if [ ${started} -eq 0 ]
693 then
694         # still not started...
695
696         stop_all_netdata
697
698         echo >&2 "Starting netdata..."
699         run ${NETDATA_PREFIX}/usr/sbin/netdata -P ${NETDATA_RUN_DIR}/netdata.pid "${@}"
700         if [ $? -ne 0 ]
701                 then
702                 echo >&2
703                 echo >&2 "SORRY! FAILED TO START NETDATA!"
704                 exit 1
705         else
706                 echo >&2 "OK. NetData Started!"
707         fi
708
709         echo >&2
710 fi
711
712 # -----------------------------------------------------------------------------
713 # save a config file, if it is not already there
714
715 if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
716         then
717         echo >&2
718         echo >&2 "-------------------------------------------------------------------------------"
719         echo >&2
720         echo >&2 "Downloading default configuration from netdata..."
721         sleep 5
722
723         # remove a possibly obsolete download
724         [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new"
725
726         # disable a proxy to get data from the local netdata
727         export http_proxy=
728         export https_proxy=
729
730         # try wget
731         wget 2>/dev/null -O "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf"
732         ret=$?
733
734         # try curl
735         if [ $ret -ne 0 -o ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ]
736                 then
737                 curl -s -o "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf"
738                 ret=$?
739         fi
740
741         if [ $ret -eq 0 -a -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ]
742                 then
743                 mv "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
744                 echo >&2 "New configuration saved for you to edit at ${NETDATA_PREFIX}/etc/netdata/netdata.conf"
745
746                 if [ "${UID}" -eq 0 ]
747                         then
748                         chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
749                 fi
750                 chmod 0664 "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
751         else
752                 echo >&2 "Cannnot download configuration from netdata daemon using url 'http://localhost:${NETDATA_PORT}/netdata.conf'"
753                 [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new"
754         fi
755 fi
756
757 # -----------------------------------------------------------------------------
758 # Check for KSM
759
760 ksm_is_available_but_disabled() {
761         cat <<-KSM1
762
763         -------------------------------------------------------------------------------
764         Memory de-duplication instructions
765
766         You have kernel memory de-duper (called Kernel Same-page Merging,
767         or KSM) available, but it is not currently enabled.
768
769         To enable it run:
770
771         echo 1 >/sys/kernel/mm/ksm/run
772         echo 1000 >/sys/kernel/mm/ksm/sleep_millisecs
773
774         If you enable it, you will save 40-60% of netdata memory.
775
776 KSM1
777 }
778
779 ksm_is_not_available() {
780         cat <<-KSM2
781
782         -------------------------------------------------------------------------------
783         Memory de-duplication not present in your kernel
784
785         It seems you do not have kernel memory de-duper (called Kernel Same-page
786         Merging, or KSM) available.
787
788         To enable it, you need a kernel built with CONFIG_KSM=y
789
790         If you can have it, you will save 40-60% of netdata memory.
791
792 KSM2
793 }
794
795 if [ -f "/sys/kernel/mm/ksm/run" ]
796         then
797         if [ $(cat "/sys/kernel/mm/ksm/run") != "1" ]
798                 then
799                 ksm_is_available_but_disabled
800         fi
801 else
802         ksm_is_not_available
803 fi
804
805 # -----------------------------------------------------------------------------
806 # Check for version.txt
807
808 if [ ! -s web/version.txt ]
809         then
810         cat <<-VERMSG
811
812         -------------------------------------------------------------------------------
813         Version update check warning
814
815         The way you downloaded netdata, we cannot find its version. This means the
816         Update check on the dashboard, will not work.
817
818         If you want to have version update check, please re-install it
819         following the procedure in:
820
821         https://github.com/firehol/netdata/wiki/Installation
822
823 VERMSG
824 fi
825
826 # -----------------------------------------------------------------------------
827 # apps.plugin warning
828
829 if [ "${UID}" -ne 0 ]
830         then
831         cat <<-SETUID_WARNING
832
833         -------------------------------------------------------------------------------
834         apps.plugin needs privileges
835
836         Since you have installed netdata as a normal user, to have apps.plugin collect
837         all the needed data, you have to give it the access rights it needs, by running
838         either of the following sets of commands:
839
840         To run apps.plugin with escalated capabilities:
841
842                 sudo chown root:${NETDATA_USER} "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
843                 sudo chmod 0750 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
844                 sudo setcap cap_dac_read_search,cap_sys_ptrace+ep "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
845
846         or, to run apps.plugin as root:
847
848                 sudo chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
849                 sudo chmod 4755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
850
851         apps.plugin is performing a hard-coded function of data collection for all
852         running processes. It cannot be instructed from the netdata daemon to perform
853         any task, so it is pretty safe to do this.
854
855 SETUID_WARNING
856 fi
857
858 # -----------------------------------------------------------------------------
859 # Keep un-install info
860
861 cat >netdata-uninstaller.sh <<-UNINSTALL
862         #!/bin/bash
863
864         # this script will uninstall netdata
865
866         if [ "\$1" != "--force" ]
867                 then
868                 echo >&2 "This script will REMOVE netdata from your system."
869                 echo >&2 "Run it again with --force to do it."
870                 exit 1
871         fi
872
873         echo >&2 "Stopping a possibly running netdata..."
874         for p in \$(pidof netdata); do kill \$p; done
875         sleep 2
876
877         deletedir() {
878                 if [ ! -z "\$1" -a -d "\$1" ]
879                         then
880                         echo
881                         echo "Deleting directory '\$1' ..."
882                         rm -I -R "\$1"
883                 fi
884         }
885
886         if [ ! -z "${NETDATA_PREFIX}" -a -d "${NETDATA_PREFIX}" ]
887                 then
888                 # installation prefix was given
889
890                 deletedir "${NETDATA_PREFIX}"
891
892         else
893                 # installation prefix was NOT given
894
895                 if [ -f "${NETDATA_PREFIX}/usr/sbin/netdata" ]
896                         then
897                         echo "Deleting ${NETDATA_PREFIX}/usr/sbin/netdata ..."
898                         rm -i "${NETDATA_PREFIX}/usr/sbin/netdata"
899                 fi
900
901                 deletedir "${NETDATA_PREFIX}/etc/netdata"
902                 deletedir "${NETDATA_PREFIX}/usr/share/netdata"
903                 deletedir "${NETDATA_PREFIX}/usr/libexec/netdata"
904                 deletedir "${NETDATA_PREFIX}/var/lib/netdata"
905                 deletedir "${NETDATA_PREFIX}/var/cache/netdata"
906                 deletedir "${NETDATA_PREFIX}/var/log/netdata"
907         fi
908
909         if [ -f /etc/logrotate.d/netdata ]
910                 then
911                 echo "Deleting /etc/logrotate.d/netdata ..."
912                 rm -i /etc/logrotate.d/netdata
913         fi
914
915         if [ -f /etc/systemd/system/netdata.service ]
916                 then
917                 echo "Deleting /etc/systemd/system/netdata.service ..."
918                 rm -i /etc/systemd/system/netdata.service
919         fi
920
921         getent passwd netdata > /dev/null
922         if [ $? -eq 0 ]
923                 then
924                 echo
925                 echo "You may also want to remove the user netdata"
926                 echo "by running:"
927                 echo "   userdel netdata"
928         fi
929
930         getent group netdata > /dev/null
931         if [ $? -eq 0 ]
932                 then
933                 echo
934                 echo "You may also want to remove the group netdata"
935                 echo "by running:"
936                 echo "   groupdel netdata"
937         fi
938
939         getent group docker > /dev/null
940         if [ $? -eq 0 -a "${NETDATA_ADDED_TO_DOCKER}" = "1" ]
941                 then
942                 echo
943                 echo "You may also want to remove the netdata user from the docker group"
944                 echo "by running:"
945                 echo "   gpasswd -d netdata docker"
946         fi
947
948 UNINSTALL
949 chmod 750 netdata-uninstaller.sh
950
951 # -----------------------------------------------------------------------------
952
953 if [ "${NETDATA_BIND}" = "*" ]
954         then
955         access="localhost"
956 else
957         access="${NETDATA_BIND}"
958 fi
959
960 cat <<-END
961
962
963         -------------------------------------------------------------------------------
964
965         OK. NetData is installed and it is running (listening to ${NETDATA_BIND}:${NETDATA_PORT}).
966
967         -------------------------------------------------------------------------------
968
969         INFO: Command line options changed. -pidfile, -nd and -ch are deprecated.
970         If you use custom startup scripts, please run netdata -h to see the 
971         corresponding options and update your scripts.
972
973         Hit http://${access}:${NETDATA_PORT}/ from your browser.
974
975         To stop netdata, just kill it, with:
976
977           killall netdata
978
979         To start it, just run it:
980
981           ${NETDATA_PREFIX}/usr/sbin/netdata
982
983
984         Enjoy!
985
986 END
987 echo >&2 "Uninstall script generated: ./netdata-uninstaller.sh"