]> arthur.barton.de Git - netdata.git/blob - netdata-installer.sh
installer keeps old version of file and creates a new one with the stock version...
[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                 # make a backup of the configuration file
398                 cp -p "${x}" "${x}.old"
399
400                 if [ -z "${md5sum}" -o ! -x "${md5sum}" ]
401                         then
402                         # we don't have md5sum - keep it
403                         cp -p "${x}" "${x}.installer_backup.${installer_backup_suffix}"
404                 else
405                         # find it relative filename
406                         f="${x/*\/etc\/netdata\//}"
407
408                         # find its checksum
409                         md5="$(cat "${x}" | ${md5sum} | cut -d ' ' -f 1)"
410
411                         # copy the original
412                         if [ -f "conf.d/${f}" ]
413                                 then
414                                 cp "conf.d/${f}" "${x}.orig"
415                         fi
416
417                         if [ "${configs_signatures[${md5}]}" = "${f}" ]
418                                 then
419                                 # it is a stock version - don't keep it
420                                 echo >&2 "File '${x}' is stock version."
421                         else
422                                 # edited by user - keep it
423                                 echo >&2 "File '${x}' has been edited by user."
424                                 cp -p "${x}" "${x}.installer_backup.${installer_backup_suffix}"
425                         fi
426                 fi
427
428         elif [ -f "${x}.installer_backup.${installer_backup_suffix}" ]
429                 then
430                 rm -f "${x}.installer_backup.${installer_backup_suffix}"
431         fi
432 done
433
434 echo >&2 "Installing netdata ..."
435 run make install || exit 1
436
437 # restore user configurations
438 for x in $(find "${NETDATA_PREFIX}/etc/netdata/" -name '*.conf' -type f)
439 do
440         if [ -f "${x}.installer_backup.${installer_backup_suffix}" ]
441                 then
442                 cp -p "${x}.installer_backup.${installer_backup_suffix}" "${x}"
443                 rm -f "${x}.installer_backup.${installer_backup_suffix}"
444         fi
445 done
446
447 NETDATA_ADDED_TO_DOCKER=0
448 if [ ${UID} -eq 0 ]
449         then
450         getent group netdata > /dev/null
451         if [ $? -ne 0 ]
452                 then
453                 echo >&2 "Adding netdata user group ..."
454                 run groupadd -r netdata
455         fi
456
457         getent passwd netdata > /dev/null
458         if [ $? -ne 0 ]
459                 then
460                 echo >&2 "Adding netdata user account ..."
461                 run useradd -r -g netdata -c netdata -s $(which nologin || echo '/bin/false') -d / netdata
462         fi
463
464         getent group docker > /dev/null
465         if [ $? -eq 0 ]
466                 then
467                 # find the users in the docker group
468                 docker=$(getent group docker | cut -d ':' -f 4)
469                 if [[ ",${docker}," =~ ,netdata, ]]
470                         then
471                         # netdata is already there
472                         :
473                 else
474                         # netdata is not in docker group
475                         echo >&2 "Adding netdata user to the docker group (needed to get container names) ..."
476                         run usermod -a -G docker netdata
477                 fi
478                 # let the uninstall script know
479                 NETDATA_ADDED_TO_DOCKER=1
480         fi
481
482         if [ -d /etc/logrotate.d -a ! -f /etc/logrotate.d/netdata ]
483                 then
484                 echo >&2 "Adding netdata logrotate configuration ..."
485                 run cp system/netdata.logrotate /etc/logrotate.d/netdata
486         fi
487 fi
488
489
490 # -----------------------------------------------------------------------------
491 # load options from the configuration file
492
493 # create an empty config if it does not exist
494 [ ! -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ] && touch "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
495
496 # function to extract values from the config file
497 config_option() {
498         local key="${1}" value="${2}" line=
499
500         if [ -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
501                 then
502                 line="$( grep "^[[:space:]]*${key}[[:space:]]*=[[:space:]]*" "${NETDATA_PREFIX}/etc/netdata/netdata.conf" | head -n 1 )"
503                 [ ! -z "${line}" ] && value="$( echo "${line}" | cut -d '=' -f 2 | sed -e "s/^[[:space:]]\+//g" -e "s/[[:space:]]\+$//g" )"
504         fi
505
506         echo "${value}"
507 }
508
509 # user
510 defuser="netdata"
511 [ ! "${UID}" = "0" ] && defuser="${USER}"
512 NETDATA_USER="$( config_option "run as user" "${defuser}" )"
513
514 NETDATA_WEB_USER="$( config_option "web files owner" "${defuser}" )"
515 NETDATA_WEB_GROUP="$( config_option "web files group" "${NETDATA_WEB_USER}" )"
516
517 # debug flags
518 defdebug=0
519 NETDATA_DEBUG="$( config_option "debug flags" ${defdebug} )"
520
521 # port
522 defport=19999
523 NETDATA_PORT="$( config_option "port" ${defport} )"
524
525 # directories
526 NETDATA_LIB_DIR="$( config_option "lib directory" "${NETDATA_PREFIX}/var/lib/netdata" )"
527 NETDATA_CACHE_DIR="$( config_option "cache directory" "${NETDATA_PREFIX}/var/cache/netdata" )"
528 NETDATA_WEB_DIR="$( config_option "web files directory" "${NETDATA_PREFIX}/usr/share/netdata/web" )"
529 NETDATA_LOG_DIR="$( config_option "log directory" "${NETDATA_PREFIX}/var/log/netdata" )"
530 NETDATA_CONF_DIR="$( config_option "config directory" "${NETDATA_PREFIX}/etc/netdata" )"
531 NETDATA_BIND="$( config_option "bind socket to IP" "*" )"
532 NETDATA_RUN_DIR="${NETDATA_PREFIX}/var/run"
533
534
535 # -----------------------------------------------------------------------------
536 # prepare the directories
537
538 # this is needed if NETDATA_PREFIX is not empty
539 if [ ! -d "${NETDATA_RUN_DIR}" ]
540         then
541         mkdir -p "${NETDATA_RUN_DIR}" || exit 1
542 fi
543
544 echo >&2
545 echo >&2 "Fixing directories (user: ${NETDATA_USER})..."
546 for x in "${NETDATA_WEB_DIR}" "${NETDATA_CONF_DIR}" "${NETDATA_CACHE_DIR}" "${NETDATA_LOG_DIR}" "${NETDATA_LIB_DIR}"
547 do
548         if [ ! -d "${x}" ]
549                 then
550                 echo >&2 "Creating directory '${x}'"
551                 run mkdir -p "${x}" || exit 1
552         fi
553
554         if [ ${UID} -eq 0 ]
555                 then
556                 if [ "${x}" = "${NETDATA_WEB_DIR}" ]
557                         then
558                         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}..."
559                 else
560                         run chown -R "${NETDATA_USER}:${NETDATA_USER}" "${x}" || echo >&2 "WARNING: Cannot change the ownership of the files in directory ${x} to ${NETDATA_USER}..."
561                 fi
562         fi
563
564         run chmod 0755 "${x}" || echo >&2 "WARNING: Cannot change the permissions of the directory ${x} to 0755..."
565 done
566
567 if [ ${UID} -eq 0 ]
568         then
569         run chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
570         run chmod 0755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
571         run setcap cap_dac_read_search,cap_sys_ptrace+ep "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
572         if [ $? -ne 0 ]
573                 then
574                 # fix apps.plugin to be setuid to root
575                 run chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
576                 run chmod 4755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
577         fi
578 fi
579
580 # -----------------------------------------------------------------------------
581 # check if we can re-start netdata
582
583 if [ ${DONOTSTART} -eq 1 ]
584         then
585         if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
586                 then
587                 echo >&2 "Generating empty config file in: ${NETDATA_PREFIX}/etc/netdata/netdata.conf"
588                 echo "# Get config from http://127.0.0.1:${NETDATA_PORT}/netdata.conf" >"${NETDATA_PREFIX}/etc/netdata/netdata.conf"
589
590                 if [ "${UID}" -eq 0 ]
591                         then
592                         chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
593                 fi
594                 chmod 0664 "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
595         fi
596         echo >&2 "OK. It is now installed and ready."
597         exit 0
598 fi
599
600 # -----------------------------------------------------------------------------
601 # stop a running netdata
602
603 isnetdata() {
604         [ -z "$1" -o ! -f "/proc/$1/stat" ] && return 1
605         [ "$(cat "/proc/$1/stat" | cut -d '(' -f 2 | cut -d ')' -f 1)" = "netdata" ] && return 0
606         return 1
607 }
608
609 stop_netdata_on_pid() {
610         local pid="$1" ret=0 count=0
611
612         isnetdata $pid || return 0
613
614         printf >&2 "Stopping netdata on pid $pid ..."
615         while [ ! -z "$pid" -a $ret -eq 0 ]
616         do
617                 if [ $count -gt 45 ]
618                         then
619                         echo >&2 "Cannot stop the running netdata on pid $pid."
620                         return 1
621                 fi
622
623                 count=$(( count + 1 ))
624
625                 run kill $pid 2>/dev/null
626                 ret=$?
627
628                 test $ret -eq 0 && printf >&2 "." && sleep 2
629         done
630
631         echo >&2
632         if [ $ret -eq 0 ]
633         then
634                 echo >&2 "SORRY! CANNOT STOP netdata ON PID $pid !"
635                 return 1
636         fi
637
638         echo >&2 "netdata on pid $pid stopped."
639         return 0
640 }
641
642 stop_all_netdata() {
643         local p
644
645         echo >&2 "Stopping a (possibly) running netdata..."
646
647         for p in $(cat "${NETDATA_RUN_DIR}/netdata.pid" 2>/dev/null) \
648                 $(cat /var/run/netdata.pid 2>/dev/null) \
649                 $(cat /var/run/netdata/netdata.pid 2>/dev/null) \
650                 $(pidof netdata 2>/dev/null)
651         do
652                 stop_netdata_on_pid $p
653         done
654 }
655
656 # -----------------------------------------------------------------------------
657 # check netdata for systemd
658
659 issystemd() {
660         # if the directory /etc/systemd/system does not exit, it is not systemd
661         [ ! -d /etc/systemd/system ] && return 1
662
663         # if pid 1 is systemd, it is systemd
664         [ "$(basename $(readlink /proc/1/exe) 2>/dev/null)" = "systemd" ] && return 0
665
666         # if systemd is running, it is systemd
667         pidof systemd >/dev/null 2>&1 && return 0
668
669         # else, it is not systemd
670         return 1
671 }
672
673 started=0
674 if [ "${UID}" -eq 0 ]
675         then
676
677         if issystemd
678         then
679                 # systemd is running on this system
680
681                 if [ ! -f /etc/systemd/system/netdata.service ]
682                 then
683                         echo >&2 "Installing systemd service..."
684                         run cp system/netdata.service /etc/systemd/system/netdata.service && \
685                                 run systemctl daemon-reload && \
686                                 run systemctl enable netdata
687                 else
688                         run service netdata stop
689                 fi
690
691                 stop_all_netdata
692                 run service netdata restart && started=1
693         fi
694
695         if [ ${started} -eq 0 ]
696         then
697                 # check if we can use the system service
698                 run service netdata stop
699                 stop_all_netdata
700                 run service netdata restart && started=1
701                 if [ ${started} -eq 0 ]
702                 then
703                         run service netdata start && started=1
704                 fi
705         fi
706 fi
707
708 if [ ${started} -eq 0 ]
709 then
710         # still not started...
711
712         stop_all_netdata
713
714         echo >&2 "Starting netdata..."
715         run ${NETDATA_PREFIX}/usr/sbin/netdata -P ${NETDATA_RUN_DIR}/netdata.pid "${@}"
716         if [ $? -ne 0 ]
717                 then
718                 echo >&2
719                 echo >&2 "SORRY! FAILED TO START NETDATA!"
720                 exit 1
721         else
722                 echo >&2 "OK. NetData Started!"
723         fi
724
725         echo >&2
726 fi
727
728 # -----------------------------------------------------------------------------
729 # save a config file, if it is not already there
730
731 if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
732         then
733         echo >&2
734         echo >&2 "-------------------------------------------------------------------------------"
735         echo >&2
736         echo >&2 "Downloading default configuration from netdata..."
737         sleep 5
738
739         # remove a possibly obsolete download
740         [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new"
741
742         # disable a proxy to get data from the local netdata
743         export http_proxy=
744         export https_proxy=
745
746         # try wget
747         wget 2>/dev/null -O "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf"
748         ret=$?
749
750         # try curl
751         if [ $ret -ne 0 -o ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ]
752                 then
753                 curl -s -o "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf"
754                 ret=$?
755         fi
756
757         if [ $ret -eq 0 -a -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ]
758                 then
759                 mv "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
760                 echo >&2 "New configuration saved for you to edit at ${NETDATA_PREFIX}/etc/netdata/netdata.conf"
761
762                 if [ "${UID}" -eq 0 ]
763                         then
764                         chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
765                 fi
766                 chmod 0664 "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
767         else
768                 echo >&2 "Cannnot download configuration from netdata daemon using url 'http://localhost:${NETDATA_PORT}/netdata.conf'"
769                 [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new"
770         fi
771 fi
772
773 # -----------------------------------------------------------------------------
774 # Check for KSM
775
776 ksm_is_available_but_disabled() {
777         cat <<-KSM1
778
779         -------------------------------------------------------------------------------
780         Memory de-duplication instructions
781
782         You have kernel memory de-duper (called Kernel Same-page Merging,
783         or KSM) available, but it is not currently enabled.
784
785         To enable it run:
786
787         echo 1 >/sys/kernel/mm/ksm/run
788         echo 1000 >/sys/kernel/mm/ksm/sleep_millisecs
789
790         If you enable it, you will save 40-60% of netdata memory.
791
792 KSM1
793 }
794
795 ksm_is_not_available() {
796         cat <<-KSM2
797
798         -------------------------------------------------------------------------------
799         Memory de-duplication not present in your kernel
800
801         It seems you do not have kernel memory de-duper (called Kernel Same-page
802         Merging, or KSM) available.
803
804         To enable it, you need a kernel built with CONFIG_KSM=y
805
806         If you can have it, you will save 40-60% of netdata memory.
807
808 KSM2
809 }
810
811 if [ -f "/sys/kernel/mm/ksm/run" ]
812         then
813         if [ $(cat "/sys/kernel/mm/ksm/run") != "1" ]
814                 then
815                 ksm_is_available_but_disabled
816         fi
817 else
818         ksm_is_not_available
819 fi
820
821 # -----------------------------------------------------------------------------
822 # Check for version.txt
823
824 if [ ! -s web/version.txt ]
825         then
826         cat <<-VERMSG
827
828         -------------------------------------------------------------------------------
829         Version update check warning
830
831         The way you downloaded netdata, we cannot find its version. This means the
832         Update check on the dashboard, will not work.
833
834         If you want to have version update check, please re-install it
835         following the procedure in:
836
837         https://github.com/firehol/netdata/wiki/Installation
838
839 VERMSG
840 fi
841
842 # -----------------------------------------------------------------------------
843 # apps.plugin warning
844
845 if [ "${UID}" -ne 0 ]
846         then
847         cat <<-SETUID_WARNING
848
849         -------------------------------------------------------------------------------
850         apps.plugin needs privileges
851
852         Since you have installed netdata as a normal user, to have apps.plugin collect
853         all the needed data, you have to give it the access rights it needs, by running
854         either of the following sets of commands:
855
856         To run apps.plugin with escalated capabilities:
857
858                 sudo chown root:${NETDATA_USER} "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
859                 sudo chmod 0750 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
860                 sudo setcap cap_dac_read_search,cap_sys_ptrace+ep "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
861
862         or, to run apps.plugin as root:
863
864                 sudo chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
865                 sudo chmod 4755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
866
867         apps.plugin is performing a hard-coded function of data collection for all
868         running processes. It cannot be instructed from the netdata daemon to perform
869         any task, so it is pretty safe to do this.
870
871 SETUID_WARNING
872 fi
873
874 # -----------------------------------------------------------------------------
875 # Keep un-install info
876
877 cat >netdata-uninstaller.sh <<-UNINSTALL
878         #!/bin/bash
879
880         # this script will uninstall netdata
881
882         if [ "\$1" != "--force" ]
883                 then
884                 echo >&2 "This script will REMOVE netdata from your system."
885                 echo >&2 "Run it again with --force to do it."
886                 exit 1
887         fi
888
889         echo >&2 "Stopping a possibly running netdata..."
890         for p in \$(pidof netdata); do kill \$p; done
891         sleep 2
892
893         deletedir() {
894                 if [ ! -z "\$1" -a -d "\$1" ]
895                         then
896                         echo
897                         echo "Deleting directory '\$1' ..."
898                         rm -I -R "\$1"
899                 fi
900         }
901
902         if [ ! -z "${NETDATA_PREFIX}" -a -d "${NETDATA_PREFIX}" ]
903                 then
904                 # installation prefix was given
905
906                 deletedir "${NETDATA_PREFIX}"
907
908         else
909                 # installation prefix was NOT given
910
911                 if [ -f "${NETDATA_PREFIX}/usr/sbin/netdata" ]
912                         then
913                         echo "Deleting ${NETDATA_PREFIX}/usr/sbin/netdata ..."
914                         rm -i "${NETDATA_PREFIX}/usr/sbin/netdata"
915                 fi
916
917                 deletedir "${NETDATA_PREFIX}/etc/netdata"
918                 deletedir "${NETDATA_PREFIX}/usr/share/netdata"
919                 deletedir "${NETDATA_PREFIX}/usr/libexec/netdata"
920                 deletedir "${NETDATA_PREFIX}/var/lib/netdata"
921                 deletedir "${NETDATA_PREFIX}/var/cache/netdata"
922                 deletedir "${NETDATA_PREFIX}/var/log/netdata"
923         fi
924
925         if [ -f /etc/logrotate.d/netdata ]
926                 then
927                 echo "Deleting /etc/logrotate.d/netdata ..."
928                 rm -i /etc/logrotate.d/netdata
929         fi
930
931         if [ -f /etc/systemd/system/netdata.service ]
932                 then
933                 echo "Deleting /etc/systemd/system/netdata.service ..."
934                 rm -i /etc/systemd/system/netdata.service
935         fi
936
937         getent passwd netdata > /dev/null
938         if [ $? -eq 0 ]
939                 then
940                 echo
941                 echo "You may also want to remove the user netdata"
942                 echo "by running:"
943                 echo "   userdel netdata"
944         fi
945
946         getent group netdata > /dev/null
947         if [ $? -eq 0 ]
948                 then
949                 echo
950                 echo "You may also want to remove the group netdata"
951                 echo "by running:"
952                 echo "   groupdel netdata"
953         fi
954
955         getent group docker > /dev/null
956         if [ $? -eq 0 -a "${NETDATA_ADDED_TO_DOCKER}" = "1" ]
957                 then
958                 echo
959                 echo "You may also want to remove the netdata user from the docker group"
960                 echo "by running:"
961                 echo "   gpasswd -d netdata docker"
962         fi
963
964 UNINSTALL
965 chmod 750 netdata-uninstaller.sh
966
967 # -----------------------------------------------------------------------------
968
969 if [ "${NETDATA_BIND}" = "*" ]
970         then
971         access="localhost"
972 else
973         access="${NETDATA_BIND}"
974 fi
975
976 cat <<-END
977
978
979         -------------------------------------------------------------------------------
980
981         OK. NetData is installed and it is running (listening to ${NETDATA_BIND}:${NETDATA_PORT}).
982
983         -------------------------------------------------------------------------------
984
985         INFO: Command line options changed. -pidfile, -nd and -ch are deprecated.
986         If you use custom startup scripts, please run netdata -h to see the 
987         corresponding options and update your scripts.
988
989         Hit http://${access}:${NETDATA_PORT}/ from your browser.
990
991         To stop netdata, just kill it, with:
992
993           killall netdata
994
995         To start it, just run it:
996
997           ${NETDATA_PREFIX}/usr/sbin/netdata
998
999
1000         Enjoy!
1001
1002 END
1003 echo >&2 "Uninstall script generated: ./netdata-uninstaller.sh"