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