]> arthur.barton.de Git - netdata.git/blob - netdata-installer.sh
Merge pull request #1596 from l2isbad/varnish_add_v3_support
[netdata.git] / netdata-installer.sh
1 #!/usr/bin/env bash
2
3 # reload the user profile
4 [ -f /etc/profile ] && . /etc/profile
5
6 export PATH="${PATH}:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
7
8 # fix PKG_CHECK_MODULES error
9 if [ -d /usr/share/aclocal ]
10 then
11         ACLOCAL_PATH=${ACLOCAL_PATH-/usr/share/aclocal}
12         export ACLOCAL_PATH
13 fi
14
15 LC_ALL=C
16 umask 002
17
18 # Be nice on production environments
19 renice 19 $$ >/dev/null 2>/dev/null
20
21 processors=$(cat /proc/cpuinfo  | grep ^processor | wc -l)
22 [ $(( processors )) -lt 1 ] && processors=1
23
24 # you can set CFLAGS before running installer
25 CFLAGS="${CFLAGS--O3}"
26
27 # keep a log of this command
28 printf "\n# " >>netdata-installer.log
29 date >>netdata-installer.log
30 printf "CFLAGS=\"%s\" " "${CFLAGS}" >>netdata-installer.log
31 printf "%q " "$0" "${@}" >>netdata-installer.log
32 printf "\n" >>netdata-installer.log
33
34 REINSTALL_PWD="${PWD}"
35 REINSTALL_COMMAND="$(printf "%q " "$0" "${@}"; printf "\n")"
36
37 banner() {
38     local   l1="  ^"                                                                      \
39             l2="  |.-.   .-.   .-.   .-.   .-.   .-.   .-.   .-.   .-.   .-.   .-.   .-.   .-"  \
40             l3="  |   '-'   '-'   '-'   '-'   '-'   '-'   '-'   '-'   '-'   '-'   '-'   '-'  "  \
41             l4="  +----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+--->" \
42             sp="                                                                        " \
43             netdata="netdata" start end msg="${*}"
44
45     [ ${#msg} -lt ${#netdata} ] && msg="${msg}${sp:0:$(( ${#netdata} - ${#msg}))}"
46     [ ${#msg} -gt $(( ${#l2} - 20 )) ] && msg="${msg:0:$(( ${#l2} - 23 ))}..."
47
48     start="$(( ${#l2} / 2 - 4 ))"
49     [ $(( start + ${#msg} + 4 )) -gt ${#l2} ] && start=$((${#l2} - ${#msg} - 4))
50     end=$(( ${start} + ${#msg} + 4 ))
51
52     echo >&2
53     echo >&2 "${l1}"
54     echo >&2 "${l2:0:start}${sp:0:2}${netdata}${sp:0:$((end - start - 2 - ${#netdata}))}${l2:end:$((${#l2} - end))}"
55     echo >&2 "${l3:0:start}${sp:0:2}${msg}${sp:0:2}${l3:end:$((${#l2} - end))}"
56     echo >&2 "${l4}"
57     echo >&2
58 }
59
60 service="$(which service 2>/dev/null || command -v service 2>/dev/null)"
61 systemctl="$(which systemctl 2>/dev/null || command -v systemctl 2>/dev/null)"
62 service() {
63     local cmd="${1}" action="${2}"
64
65     if [ ! -z "${service}" ]
66     then
67         run "${service}" "${cmd}" "${action}"
68         return $?
69     elif [ ! -z "${systemctl}" ]
70     then
71         run "${systemctl}" "${action}" "${cmd}"
72         return $?
73     fi
74     return 1
75 }
76
77 ME="$0"
78 DONOTSTART=0
79 DONOTWAIT=0
80 NETDATA_PREFIX=
81 LIBS_ARE_HERE=0
82
83 usage() {
84     banner "installer command line options"
85     cat <<USAGE
86
87 ${ME} <installer options>
88
89 Valid <installer options> are:
90
91    --install /PATH/TO/INSTALL
92
93         If your give: --install /opt
94         netdata will be installed in /opt/netdata
95
96    --dont-start-it
97
98         Do not (re)start netdata.
99         Just install it.
100
101    --dont-wait
102
103         Do not wait for the user to press ENTER.
104         Start immediately building it.
105
106    --zlib-is-really-here
107    --libs-are-really-here
108
109         If you get errors about missing zlib,
110         or libuuid but you know it is available,
111         you have a broken pkg-config.
112         Use this option to allow it continue
113         without checking pkg-config.
114
115 Netdata will by default be compiled with gcc optimization -O3
116 If you need to pass different CFLAGS, use something like this:
117
118   CFLAGS="<gcc options>" ${ME} <installer options>
119
120 For the installer to complete successfully, you will need
121 these packages installed:
122
123    gcc make autoconf automake pkg-config zlib1g-dev (or zlib-devel)
124    uuid-dev (or libuuid-devel)
125
126 For the plugins, you will at least need:
127
128    curl nodejs
129
130 USAGE
131 }
132
133 md5sum="$(which md5sum 2>/dev/null || command -v md5sum 2>/dev/null)"
134 get_git_config_signatures() {
135     local x s file md5
136
137     [ ! -d "conf.d" ] && echo >&2 "Wrong directory." && return 1
138     [ -z "${md5sum}" -o ! -x "${md5sum}" ] && echo >&2 "No md5sum command." && return 1
139
140     echo >configs.signatures.tmp
141
142     for x in $(find conf.d -name \*.conf)
143     do
144             x="${x/conf.d\//}"
145             echo "${x}"
146             for c in $(git log --follow "conf.d/${x}" | grep ^commit | cut -d ' ' -f 2)
147             do
148                     git checkout ${c} "conf.d/${x}" || continue
149                     s="$(cat "conf.d/${x}" | md5sum | cut -d ' ' -f 1)"
150                     echo >>configs.signatures.tmp "${s}:${x}"
151                     echo "    ${s}"
152             done
153             git checkout HEAD "conf.d/${x}" || break
154     done
155
156     cat configs.signatures.tmp |\
157         grep -v "^$" |\
158         sort -u |\
159         {
160             echo "declare -A configs_signatures=("
161             IFS=":"
162             while read md5 file
163             do
164                 echo "  ['${md5}']='${file}'"
165             done
166             echo ")"
167         } >configs.signatures
168
169     rm configs.signatures.tmp
170
171     return 0
172 }
173
174
175 while [ ! -z "${1}" ]
176 do
177     if [ "$1" = "--install" ]
178         then
179         NETDATA_PREFIX="${2}/netdata"
180         shift 2
181     elif [ "$1" = "--zlib-is-really-here" -o "$1" = "--libs-are-really-here" ]
182         then
183         LIBS_ARE_HERE=1
184         shift 1
185     elif [ "$1" = "--dont-start-it" ]
186         then
187         DONOTSTART=1
188         shift 1
189     elif [ "$1" = "--dont-wait" ]
190         then
191         DONOTWAIT=1
192         shift 1
193     elif [ "$1" = "--help" -o "$1" = "-h" ]
194         then
195         usage
196         exit 1
197     elif [ "$1" = "get_git_config_signatures" ]
198         then
199         get_git_config_signatures && exit 0
200         exit 1
201     else
202         echo >&2
203         echo >&2 "ERROR:"
204         echo >&2 "I cannot understand option '$1'."
205         usage
206         exit 1
207     fi
208 done
209
210 banner "real-time performance monitoring, done right!"
211 cat <<BANNER
212
213   You are about to build and install netdata to your system.
214
215   It will be installed at these locations:
216
217    - the daemon    at ${NETDATA_PREFIX}/usr/sbin/netdata
218    - config files  at ${NETDATA_PREFIX}/etc/netdata
219    - web files     at ${NETDATA_PREFIX}/usr/share/netdata
220    - plugins       at ${NETDATA_PREFIX}/usr/libexec/netdata
221    - cache files   at ${NETDATA_PREFIX}/var/cache/netdata
222    - db files      at ${NETDATA_PREFIX}/var/lib/netdata
223    - log files     at ${NETDATA_PREFIX}/var/log/netdata
224    - pid file      at ${NETDATA_PREFIX}/var/run
225
226   This installer allows you to change the installation path.
227   Press Control-C and run the same command with --help for help.
228
229 BANNER
230
231 if [ "${UID}" -ne 0 ]
232     then
233     if [ -z "${NETDATA_PREFIX}" ]
234         then
235         banner "wrong command line options!"
236         cat <<NONROOTNOPREFIX
237
238 Sorry! This will fail!
239
240 You are attempting to install netdata as non-root, but you plan to install it
241 in system paths.
242
243 Please set an installation prefix, like this:
244
245     $0 ${@} --install /tmp
246
247 or, run the installer as root:
248
249     sudo $0 ${@}
250
251 We suggest to install it as root, or certain data collectors will not be able
252 to work. Netdata drops root privileges when running. So, if you plan to keep
253 it, install it as root to get the full functionality.
254
255 NONROOTNOPREFIX
256         exit 1
257
258     else
259         cat <<NONROOT
260
261 IMPORTANT:
262 You are about to install netdata as a non-root user.
263 Netdata will work, but a few data collection modules that
264 require root access will fail.
265
266 If you installing permanently on your system, run the
267 installer like this:
268
269     sudo $0 ${@}
270
271 NONROOT
272     fi
273 fi
274
275 have_autotools=
276 if [ "$(type autoreconf 2> /dev/null)" ]
277 then
278     autoconf_maj_min() {
279         local maj min IFS=.-
280
281         maj=$1
282         min=$2
283
284         set -- $(autoreconf -V | sed -ne '1s/.* \([^ ]*\)$/\1/p')
285         eval $maj=\$1 $min=\$2
286     }
287     autoconf_maj_min AMAJ AMIN
288
289     if [ "$AMAJ" -gt 2 ]
290     then
291         have_autotools=Y
292     elif [ "$AMAJ" -eq 2 -a "$AMIN" -ge 60 ]
293     then
294         have_autotools=Y
295     else
296         echo "Found autotools $AMAJ.$AMIN"
297     fi
298 else
299     echo "No autotools found"
300 fi
301
302 if [ ! "$have_autotools" ]
303 then
304     if [ -f configure ]
305     then
306         echo "Will skip autoreconf step"
307     else
308         banner "autotools v2.60 required"
309         cat <<"EOF"
310
311 -------------------------------------------------------------------------------
312 autotools 2.60 or later is required
313
314 Sorry, you do not seem to have autotools 2.60 or later, which is
315 required to build from the git sources of netdata.
316
317 You can either install a suitable version of autotools and automake
318 or download a netdata package which does not have these dependencies.
319
320 Source packages where autotools have already been run are available
321 here:
322        https://firehol.org/download/netdata/
323
324 The unsigned/master folder tracks the head of the git tree and released
325 packages are also available.
326 EOF
327         exit 1
328     fi
329 fi
330
331 if [ ${DONOTWAIT} -eq 0 ]
332     then
333     if [ ! -z "${NETDATA_PREFIX}" ]
334         then
335         read -p "Press ENTER to build and install netdata to '${NETDATA_PREFIX}' > "
336     else
337         read -p "Press ENTER to build and install netdata to your system > "
338     fi
339 fi
340
341 build_error() {
342     banner "sorry, it failed to build..."
343     cat <<EOF
344
345 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
346
347 Sorry! netdata failed to build...
348
349 You many need to check these:
350
351 1. The package uuid-dev (or libuuid-devel) has to be installed.
352
353    If your system cannot find libuuid, although it is installed
354    run me with the option:  --libs-are-really-here
355
356 2. The package zlib1g-dev (or zlib-devel) has to be installed.
357
358    If your system cannot find zlib, although it is installed
359    run me with the option:  --libs-are-really-here
360
361 3. You need basic build tools installed, like:
362
363    gcc make autoconf automake pkg-config
364
365    Autoconf version 2.60 or higher is required.
366
367 If you still cannot get it to build, ask for help at github:
368
369    https://github.com/firehol/netdata/issues
370
371
372 EOF
373     trap - EXIT
374     exit 1
375 }
376
377 run() {
378     printf >>netdata-installer.log "# "
379     printf >>netdata-installer.log "%q " "${@}"
380     printf >>netdata-installer.log " ... "
381
382     printf >&2 "\n"
383     printf >&2 ":-----------------------------------------------------------------------------\n"
384     printf >&2 "Running command:\n"
385     printf >&2 "\n"
386     printf >&2 "%q " "${@}"
387     printf >&2 "\n"
388
389     "${@}"
390
391     local ret=$?
392     if [ ${ret} -ne 0 ]
393         then
394         printf >>netdata-installer.log "FAILED!\n"
395     else
396         printf >>netdata-installer.log "OK\n"
397     fi
398
399     return ${ret}
400 }
401
402 if [ ${LIBS_ARE_HERE} -eq 1 ]
403     then
404     shift
405     echo >&2 "ok, assuming libs are really installed."
406     export ZLIB_CFLAGS=" "
407     export ZLIB_LIBS="-lz"
408     export UUID_CFLAGS=" "
409     export UUID_LIBS="-luuid"
410 fi
411
412 trap build_error EXIT
413
414 if [ "$have_autotools" ]
415 then
416     run ./autogen.sh || exit 1
417 fi
418
419 run ./configure \
420     --prefix="${NETDATA_PREFIX}/usr" \
421     --sysconfdir="${NETDATA_PREFIX}/etc" \
422     --localstatedir="${NETDATA_PREFIX}/var" \
423     --with-zlib --with-math --with-user=netdata \
424     CFLAGS="${CFLAGS}" || exit 1
425
426 # remove the build_error hook
427 trap - EXIT
428
429 if [ -f src/netdata ]
430     then
431     echo >&2 "Cleaning a possibly old compilation ..."
432     run make clean
433 fi
434
435 echo >&2 "Compiling netdata ..."
436 run make -j${processors} || exit 1
437
438 if [ "${BASH_VERSINFO[0]}" -ge "4" ]
439 then
440     declare -A configs_signatures=()
441     if [ -f "configs.signatures" ]
442         then
443         source "configs.signatures" || echo >&2 "ERROR: Failed to load configs.signatures !"
444     fi
445 fi
446
447 # migrate existing configuration files
448 # for node.d and charts.d
449 if [ -d "${NETDATA_PREFIX}/etc/netdata" ]
450     then
451     # the configuration directory exists
452
453     if [ ! -d "${NETDATA_PREFIX}/etc/netdata/charts.d" ]
454         then
455         run mkdir "${NETDATA_PREFIX}/etc/netdata/charts.d"
456     fi
457
458     # move the charts.d config files
459     for x in apache ap cpu_apps cpufreq example exim hddtemp load_average mem_apps mysql nginx nut opensips phpfpm postfix sensors squid tomcat
460     do
461         for y in "" ".old" ".orig"
462         do
463             if [ -f "${NETDATA_PREFIX}/etc/netdata/${x}.conf${y}" -a ! -f "${NETDATA_PREFIX}/etc/netdata/charts.d/${x}.conf${y}" ]
464                 then
465                 run mv -f "${NETDATA_PREFIX}/etc/netdata/${x}.conf${y}" "${NETDATA_PREFIX}/etc/netdata/charts.d/${x}.conf${y}"
466             fi
467         done
468     done
469
470     if [ ! -d "${NETDATA_PREFIX}/etc/netdata/node.d" ]
471         then
472         run mkdir "${NETDATA_PREFIX}/etc/netdata/node.d"
473     fi
474
475     # move the node.d config files
476     for x in named sma_webbox snmp
477     do
478         for y in "" ".old" ".orig"
479         do
480             if [ -f "${NETDATA_PREFIX}/etc/netdata/${x}.conf${y}" -a ! -f "${NETDATA_PREFIX}/etc/netdata/node.d/${x}.conf${y}" ]
481                 then
482                 run mv -f "${NETDATA_PREFIX}/etc/netdata/${x}.conf${y}" "${NETDATA_PREFIX}/etc/netdata/node.d/${x}.conf${y}"
483             fi
484         done
485     done
486 fi
487
488 # backup user configurations
489 installer_backup_suffix="${PID}.${RANDOM}"
490 for x in $(find "${NETDATA_PREFIX}/etc/netdata/" -name '*.conf' -type f)
491 do
492     if [ -f "${x}" ]
493         then
494         # make a backup of the configuration file
495         cp -p "${x}" "${x}.old"
496
497         if [ -z "${md5sum}" -o ! -x "${md5sum}" ]
498             then
499             # we don't have md5sum - keep it
500             cp -p "${x}" "${x}.installer_backup.${installer_backup_suffix}"
501         else
502             # find it relative filename
503             f="${x/*\/etc\/netdata\//}"
504
505             # find its checksum
506             md5="$(cat "${x}" | ${md5sum} | cut -d ' ' -f 1)"
507
508             # copy the original
509             if [ -f "conf.d/${f}" ]
510                 then
511                 cp "conf.d/${f}" "${x}.orig"
512             fi
513
514             if [ "${BASH_VERSINFO[0]}" -ge "4" ]
515             then
516                 if [ "${configs_signatures[${md5}]}" = "${f}" ]
517                 then
518                     # it is a stock version - don't keep it
519                     echo >&2 "File '${x}' is stock version."
520                 else
521                     # edited by user - keep it
522                     echo >&2 "File '${x}' has been edited by user."
523                     cp -p "${x}" "${x}.installer_backup.${installer_backup_suffix}"
524                 fi
525             else
526                 echo >&2 "File '${x}' cannot be check for custom edits."
527                 cp -p "${x}" "${x}.installer_backup.${installer_backup_suffix}"
528             fi
529         fi
530
531     elif [ -f "${x}.installer_backup.${installer_backup_suffix}" ]
532         then
533         rm -f "${x}.installer_backup.${installer_backup_suffix}"
534     fi
535 done
536
537 echo >&2 "Installing netdata ..."
538 run make install || exit 1
539
540 # restore user configurations
541 for x in $(find "${NETDATA_PREFIX}/etc/netdata/" -name '*.conf' -type f)
542 do
543     if [ -f "${x}.installer_backup.${installer_backup_suffix}" ]
544         then
545         cp -p "${x}.installer_backup.${installer_backup_suffix}" "${x}"
546         rm -f "${x}.installer_backup.${installer_backup_suffix}"
547     fi
548 done
549
550 echo >&2 "Fixing permissions ..."
551
552 check_cmd() {
553     which "${1}" >/dev/null 2>&1 && return 0
554     command -v "${1}" >/dev/null 2>&1 && return 0
555     return 1
556 }
557
558 portable_add_user() {
559     local username="${1}"
560
561     getent passwd "${username}" > /dev/null 2>&1
562     [ $? -eq 0 ] && return 0
563
564     echo >&2 "Adding ${username} user account ..."
565
566     local nologin="$(which nologin 2>/dev/null || command -v nologin 2>/dev/null || echo '/bin/false')"
567
568     # Linux
569     if check_cmd useradd
570     then
571         run useradd -r -g "${username}" -c "${username}" -s "${nologin}" -d / "${username}" && return 0
572     fi
573
574     # FreeBSD
575     if check_cmd pw
576     then
577         run pw useradd "${username}" -d / -g "${username}" -s "${nologin}" && return 0
578     fi
579
580     # BusyBox
581     if check_cmd adduser
582     then
583         run adduser -D -G "${username}" "${username}" && return 0
584     fi
585
586     echo >&2 "Failed to add ${username} user account !"
587
588     return 1
589 }
590
591 portable_add_group() {
592     local groupname="${1}"
593
594     getent group "${groupname}" > /dev/null 2>&1
595     [ $? -eq 0 ] && return 0
596
597     echo >&2 "Adding ${groupname} user group ..."
598
599     # Linux
600     if check_cmd groupadd
601     then
602         run groupadd -r "${groupname}" && return 0
603     fi
604
605     # FreeBSD
606     if check_cmd pw
607     then
608         run pw groupadd "${groupname}" && return 0
609     fi
610
611     # BusyBox
612     if check_cmd addgroup
613     then
614         run addgroup "${groupname}" && return 0
615     fi
616
617     echo >&2 "Failed to add ${groupname} user group !"
618     return 1
619 }
620
621 portable_add_user_to_group() {
622     local groupname="${1}" username="${2}"
623
624     getent group "${groupname}" > /dev/null 2>&1
625     [ $? -ne 0 ] && return 1
626
627     # find the user is already in the group
628     local users=$(getent group "${groupname}" | cut -d ':' -f 4)
629     if [[ ",${users}," =~ ,${username}, ]]
630         then
631         # username is already there
632         return 0
633     else
634         # username is not in group
635         echo >&2 "Adding ${username} user to the ${groupname} group ..."
636
637         # Linux
638         if check_cmd usermod
639         then
640             run usermod -a -G "${groupname}" "${username}" && return 0
641         fi
642
643         # FreeBSD
644         if check_cmd pw
645         then
646             run pw groupmod "${groupname}" -m "${username}" && return 0
647         fi
648
649         # BusyBox
650         if check_cmd addgroup
651         then
652             run addgroup "${username}" "${groupname}" && return 0
653         fi
654
655         echo >&2 "Failed to add user ${username} to group ${groupname} !"
656         return 1
657     fi
658 }
659
660 iscontainer() {
661     # man systemd-detect-virt
662     local cmd=$(which systemd-detect-virt 2>/dev/null || command -v systemd-detect-virt 2>/dev/null)
663     if [ ! -z "${cmd}" -a -x "${cmd}" ]
664         then
665         "${cmd}" --container >/dev/null 2>&1 && return 0
666     fi
667
668     # /proc/1/sched exposes the host's pid of our init !
669     # http://stackoverflow.com/a/37016302
670     local pid=$( cat /proc/1/sched | head -n 1 | { IFS='(),#:' read name pid th threads; echo $pid; } )
671     local p=$(( pid + 0 ))
672     [ ${pid} -ne 1 ] && return 0
673
674     # lxc sets environment variable 'container'
675     [ ! -z "${container}" ] && return 0
676
677     # docker creates /.dockerenv
678     # http://stackoverflow.com/a/25518345
679     [ -f "/.dockerenv" ] && return 0
680
681     # ubuntu and debian supply /bin/running-in-container
682     # https://www.apt-browse.org/browse/ubuntu/trusty/main/i386/upstart/1.12.1-0ubuntu4/file/bin/running-in-container
683     if [ -x "/bin/running-in-container" ]
684         then
685         "/bin/running-in-container" >/dev/null 2>&1 && return 0
686     fi
687
688     return 1
689 }
690
691 run find ./system/ -type f -a \! -name \*.in -a \! -name Makefile\* -a \! -name \*.conf -a \! -name \*.service -a \! -name \*.logrotate -exec chmod 755 {} \;
692
693 NETDATA_ADDED_TO_DOCKER=0
694 NETDATA_ADDED_TO_NGINX=0
695 NETDATA_ADDED_TO_VARNISH=0
696 NETDATA_ADDED_TO_HAPROXY=0
697 if [ ${UID} -eq 0 ]
698     then
699     portable_add_group netdata
700     portable_add_user netdata
701     portable_add_user_to_group docker netdata && NETDATA_ADDED_TO_DOCKER=1
702     portable_add_user_to_group nginx  netdata && NETDATA_ADDED_TO_NGINX=1
703     portable_add_user_to_group varnish  netdata && NETDATA_ADDED_TO_VARNISH=1
704     portable_add_user_to_group haproxy  netdata && NETDATA_ADDED_TO_HAPROXY=1
705
706     if [ -d /etc/logrotate.d -a ! -f /etc/logrotate.d/netdata ]
707         then
708         echo >&2 "Adding netdata logrotate configuration ..."
709         run cp system/netdata.logrotate /etc/logrotate.d/netdata
710     fi
711     
712     if [ -f /etc/logrotate.d/netdata ]
713         then
714         echo >&2 "Fixing netdata logrotate permissions ..."
715         run chmod 644 /etc/logrotate.d/netdata
716     fi
717 fi
718
719
720 # -----------------------------------------------------------------------------
721 # load options from the configuration file
722
723 # create an empty config if it does not exist
724 [ ! -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ] && touch "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
725
726 # function to extract values from the config file
727 config_option() {
728     local key="${1}" value="${2}" line=
729
730     if [ -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
731         then
732         line="$( grep "^[[:space:]]*${key}[[:space:]]*=[[:space:]]*" "${NETDATA_PREFIX}/etc/netdata/netdata.conf" | head -n 1 )"
733         [ ! -z "${line}" ] && value="$( echo "${line}" | cut -d '=' -f 2 | sed -e "s/^[[:space:]]\+//g" -e "s/[[:space:]]\+$//g" )"
734     fi
735
736     echo "${value}"
737 }
738
739 # the user netdata will run as
740 if [ "${UID}" = "0" ]
741     then
742     NETDATA_USER="$( config_option "run as user" "netdata" )"
743 else
744     NETDATA_USER="${USER}"
745 fi
746
747 # the owners of the web files
748 NETDATA_WEB_USER="$(  config_option "web files owner" "${NETDATA_USER}" )"
749 NETDATA_WEB_GROUP="$( config_option "web files group" "${NETDATA_WEB_USER}" )"
750
751 # debug flags
752 NETDATA_DEBUG="$( config_option "debug flags" 0 )"
753
754 # port
755 defport=19999
756 NETDATA_PORT="$( config_option "default port" ${defport} )"
757 NETDATA_PORT2="$( config_option "port" ${defport} )"
758
759 if [ "${NETDATA_PORT}" != "${NETDATA_PORT2}" ]
760 then
761     if [ "${NETDATA_PORT2}" != "${defport}" ]
762     then
763         NETDATA_PORT="${NETDATA_PORT2}"
764     fi
765 fi
766
767 # directories
768 NETDATA_LIB_DIR="$( config_option "lib directory" "${NETDATA_PREFIX}/var/lib/netdata" )"
769 NETDATA_CACHE_DIR="$( config_option "cache directory" "${NETDATA_PREFIX}/var/cache/netdata" )"
770 NETDATA_WEB_DIR="$( config_option "web files directory" "${NETDATA_PREFIX}/usr/share/netdata/web" )"
771 NETDATA_LOG_DIR="$( config_option "log directory" "${NETDATA_PREFIX}/var/log/netdata" )"
772 NETDATA_CONF_DIR="$( config_option "config directory" "${NETDATA_PREFIX}/etc/netdata" )"
773 NETDATA_RUN_DIR="${NETDATA_PREFIX}/var/run"
774
775
776 # -----------------------------------------------------------------------------
777 # prepare the directories
778
779 # this is needed if NETDATA_PREFIX is not empty
780 if [ ! -d "${NETDATA_RUN_DIR}" ]
781     then
782     mkdir -p "${NETDATA_RUN_DIR}" || exit 1
783 fi
784
785 echo >&2
786 echo >&2 "Fixing directories (user: ${NETDATA_USER})..."
787
788 # --- conf dir ----
789
790 for x in "python.d" "charts.d" "node.d"
791 do
792     if [ ! -d "${NETDATA_CONF_DIR}/${x}" ]
793         then
794         echo >&2 "Creating directory '${NETDATA_CONF_DIR}/${x}'"
795         run mkdir -p "${NETDATA_CONF_DIR}/${x}" || exit 1
796     fi
797 done
798 run chown -R "${NETDATA_USER}:${NETDATA_USER}" "${NETDATA_CONF_DIR}"
799 run find "${NETDATA_CONF_DIR}" -type f -exec chmod 0660 {} \;
800 run find "${NETDATA_CONF_DIR}" -type d -exec chmod 0775 {} \;
801
802 # --- web dir ----
803
804 if [ ! -d "${NETDATA_WEB_DIR}" ]
805     then
806     echo >&2 "Creating directory '${NETDATA_WEB_DIR}'"
807     run mkdir -p "${NETDATA_WEB_DIR}" || exit 1
808 fi
809 run chown -R "${NETDATA_WEB_USER}:${NETDATA_WEB_GROUP}" "${NETDATA_WEB_DIR}"
810 run find "${NETDATA_WEB_DIR}" -type f -exec chmod 0664 {} \;
811 run find "${NETDATA_WEB_DIR}" -type d -exec chmod 0775 {} \;
812
813 # --- data dirs ----
814
815 for x in "${NETDATA_LIB_DIR}" "${NETDATA_CACHE_DIR}" "${NETDATA_LOG_DIR}"
816 do
817     if [ ! -d "${x}" ]
818         then
819         echo >&2 "Creating directory '${x}'"
820         run mkdir -p "${x}" || exit 1
821     fi
822
823     run chown -R "${NETDATA_USER}:${NETDATA_USER}" "${x}"
824     #run find "${x}" -type f -exec chmod 0660 {} \;
825     #run find "${x}" -type d -exec chmod 0770 {} \;
826 done
827
828 run chmod 755 "${NETDATA_LOG_DIR}"
829
830 # --- plugins ----
831
832 if [ ${UID} -eq 0 ]
833     then
834     run chown "${NETDATA_USER}:root" "${NETDATA_LOG_DIR}"
835     run chown -R root "${NETDATA_PREFIX}/usr/libexec/netdata"
836     run find "${NETDATA_PREFIX}/usr/libexec/netdata" -type d -exec chmod 0755 {} \;
837     run find "${NETDATA_PREFIX}/usr/libexec/netdata" -type f -exec chmod 0644 {} \;
838     run find "${NETDATA_PREFIX}/usr/libexec/netdata" -type f -a -name \*.plugin -exec chmod 0755 {} \;
839     run find "${NETDATA_PREFIX}/usr/libexec/netdata" -type f -a -name \*.sh -exec chmod 0755 {} \;
840
841     setcap_ret=1
842     if ! iscontainer
843         then
844         run setcap cap_dac_read_search,cap_sys_ptrace+ep "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
845         setcap_ret=$?
846
847         if [ ${setcap_ret} -eq 0 ]
848             then
849             # if we managed to setcap
850             # but we fail to execute apps.plugin
851             # trigger setuid to root
852             "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin" -v >/dev/null 2>&1
853             setcap_ret=$?
854         fi
855     fi
856
857     if [ ${setcap_ret} -ne 0 ]
858         then
859         # fix apps.plugin to be setuid to root
860         run chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
861         run chmod 4755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
862     fi
863 else
864     run chown "${NETDATA_USER}:${NETDATA_USER}" "${NETDATA_LOG_DIR}"
865     run chown -R "${NETDATA_USER}:${NETDATA_USER}" "${NETDATA_PREFIX}/usr/libexec/netdata"
866     run find "${NETDATA_PREFIX}/usr/libexec/netdata" -type f -exec chmod 0755 {} \;
867     run find "${NETDATA_PREFIX}/usr/libexec/netdata" -type d -exec chmod 0755 {} \;
868 fi
869
870 # --- fix #1292 bug ---
871
872 [ -d "${NETDATA_PREFIX}/usr/libexec" ] && run chmod a+rX "${NETDATA_PREFIX}/usr/libexec"
873 [ -d "${NETDATA_PREFIX}/usr/share/netdata" ] && run chmod a+rX "${NETDATA_PREFIX}/usr/share/netdata"
874
875
876 # -----------------------------------------------------------------------------
877 # check if we can re-start netdata
878
879 if [ ${DONOTSTART} -eq 1 ]
880     then
881     if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
882         then
883         echo >&2 "Generating empty config file in: ${NETDATA_PREFIX}/etc/netdata/netdata.conf"
884         echo "# Get config from http://127.0.0.1:${NETDATA_PORT}/netdata.conf" >"${NETDATA_PREFIX}/etc/netdata/netdata.conf"
885
886         if [ "${UID}" -eq 0 ]
887             then
888             chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
889         fi
890         chmod 0644 "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
891     fi
892     banner "is installed now!"
893     echo >&2 "  enjoy real-time performance and health monitoring..."
894     exit 0
895 fi
896
897 # -----------------------------------------------------------------------------
898 # stop a running netdata
899
900 isnetdata() {
901     if [ -d /proc/self ]
902     then
903         [ -z "$1" -o ! -f "/proc/$1/stat" ] && return 1
904         [ "$(cat "/proc/$1/stat" | cut -d '(' -f 2 | cut -d ')' -f 1)" = "netdata" ] && return 0
905         return 1
906     fi
907     return 0
908 }
909
910 stop_netdata_on_pid() {
911     local pid="${1}" ret=0 count=0
912
913     isnetdata ${pid} || return 0
914
915     printf >&2 "Stopping netdata on pid ${pid} ..."
916     while [ ! -z "$pid" -a ${ret} -eq 0 ]
917     do
918         if [ ${count} -gt 45 ]
919             then
920             echo >&2 "Cannot stop the running netdata on pid ${pid}."
921             return 1
922         fi
923
924         count=$(( count + 1 ))
925
926         run kill ${pid} 2>/dev/null
927         ret=$?
928
929         test ${ret} -eq 0 && printf >&2 "." && sleep 2
930     done
931
932     echo >&2
933     if [ ${ret} -eq 0 ]
934     then
935         echo >&2 "SORRY! CANNOT STOP netdata ON PID ${pid} !"
936         return 1
937     fi
938
939     echo >&2 "netdata on pid ${pid} stopped."
940     return 0
941 }
942
943 stop_all_netdata() {
944     local p myns ns
945
946     myns="$(readlink /proc/self/ns/pid 2>/dev/null)"
947
948     echo >&2 "Stopping a (possibly) running netdata..."
949
950     for p in $(cat "${NETDATA_RUN_DIR}/netdata.pid" 2>/dev/null) \
951         $(cat /var/run/netdata.pid 2>/dev/null) \
952         $(cat /var/run/netdata/netdata.pid 2>/dev/null) \
953         $(pidof netdata 2>/dev/null)
954     do
955         ns="$(readlink /proc/${p}/ns/pid 2>/dev/null)"
956
957         if [ -z "${myns}" -o -z "${ns}" -o "${myns}" = "${ns}" ]
958             then
959             stop_netdata_on_pid ${p}
960         fi
961     done
962 }
963
964 # -----------------------------------------------------------------------------
965 # check for systemd
966
967 issystemd() {
968     local pids p myns ns systemctl
969
970     # if the directory /etc/systemd/system does not exit, it is not systemd
971     [ ! -d /etc/systemd/system ] && return 1
972
973     # if there is no systemctl command, it is not systemd
974     systemctl=$(which systemctl 2>/dev/null || command -v systemctl 2>/dev/null)
975     [ -z "${systemctl}" -o ! -x "${systemctl}" ] && return 1
976
977     # if pid 1 is systemd, it is systemd
978     [ "$(basename $(readlink /proc/1/exe) 2>/dev/null)" = "systemd" ] && return 0
979
980     # if systemd is not running, it is not systemd
981     pids=$(pidof systemd 2>/dev/null)
982     [ -z "${pids}" ] && return 1
983
984     # check if the running systemd processes are not in our namespace
985     myns="$(readlink /proc/self/ns/pid 2>/dev/null)"
986     for p in ${pids}
987     do
988         ns="$(readlink /proc/${p}/ns/pid 2>/dev/null)"
989
990         # if pid of systemd is in our namespace, it is systemd
991         [ ! -z "${myns}" && "${myns}" = "${ns}" ] && return 0
992     done
993
994     # else, it is not systemd
995     return 1
996 }
997
998 installed_init_d=0
999 install_non_systemd_init() {
1000     [ "${UID}" != 0 ] && return 1
1001
1002     local key="unknown"
1003     if [ -f /etc/os-release ]
1004         then
1005         source /etc/os-release || return 1
1006         key="${ID}-${VERSION_ID}"
1007
1008     elif [ -f /etc/centos-release ]
1009         then
1010         key=$(</etc/centos-release)
1011     fi
1012
1013     if [ -d /etc/init.d -a ! -f /etc/init.d/netdata ]
1014         then
1015         if [ "${key}" = "gentoo" ]
1016             then
1017             run cp system/netdata-openrc /etc/init.d/netdata && \
1018             run chmod 755 /etc/init.d/netdata && \
1019             run rc-update add netdata default && \
1020             installed_init_d=1
1021         
1022         elif [ "${key}" = "ubuntu-12.04" -o "${key}" = "ubuntu-14.04" -o "${key}" = "debian-7" ]
1023             then
1024             run cp system/netdata-lsb /etc/init.d/netdata && \
1025             run chmod 755 /etc/init.d/netdata && \
1026             run update-rc.d netdata defaults && \
1027             run update-rc.d netdata enable && \
1028             installed_init_d=1
1029
1030         elif [ "${key}" = "CentOS release 6.8 (Final)" -o "${key}" = "amzn-2016.09" ]
1031             then
1032             run cp system/netdata-init-d /etc/init.d/netdata && \
1033             run chmod 755 /etc/init.d/netdata && \
1034             run chkconfig netdata on && \
1035             installed_init_d=1
1036         fi
1037     fi
1038
1039     return 0
1040 }
1041
1042 started=0
1043 if [ "${UID}" -eq 0 ]
1044     then
1045
1046     if issystemd
1047     then
1048         # systemd is running on this system
1049
1050         if [ ! -f /etc/systemd/system/netdata.service ]
1051         then
1052             echo >&2 "Installing systemd service..."
1053             run cp system/netdata.service /etc/systemd/system/netdata.service && \
1054                 run systemctl daemon-reload && \
1055                 run systemctl enable netdata
1056         else
1057             service netdata stop
1058         fi
1059
1060         stop_all_netdata
1061         service netdata restart && started=1
1062     else
1063         install_non_systemd_init
1064     fi
1065
1066     if [ ${started} -eq 0 ]
1067     then
1068         # check if we can use the system service
1069         service netdata stop
1070         stop_all_netdata
1071         service netdata restart && started=1
1072         if [ ${started} -eq 0 ]
1073         then
1074             service netdata start && started=1
1075         fi
1076     fi
1077 fi
1078
1079 if [ ${started} -eq 0 ]
1080 then
1081     # still not started...
1082
1083     stop_all_netdata
1084
1085     echo >&2 "Starting netdata..."
1086     run ${NETDATA_PREFIX}/usr/sbin/netdata -P ${NETDATA_RUN_DIR}/netdata.pid "${@}"
1087     if [ $? -ne 0 ]
1088         then
1089         echo >&2
1090         echo >&2 "SORRY! FAILED TO START NETDATA!"
1091         exit 1
1092     else
1093         echo >&2 "OK. NetData Started!"
1094     fi
1095
1096     echo >&2
1097 fi
1098
1099 # -----------------------------------------------------------------------------
1100 # save a config file, if it is not already there
1101
1102 if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
1103     then
1104     echo >&2
1105     echo >&2 "-------------------------------------------------------------------------------"
1106     echo >&2
1107     echo >&2 "Downloading default configuration from netdata..."
1108     sleep 5
1109
1110     # remove a possibly obsolete download
1111     [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new"
1112
1113     # disable a proxy to get data from the local netdata
1114     export http_proxy=
1115     export https_proxy=
1116
1117     # try wget
1118     wget 2>/dev/null -O "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf"
1119     ret=$?
1120
1121     # try curl
1122     if [ ${ret} -ne 0 -o ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ]
1123         then
1124         curl -s -o "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf"
1125         ret=$?
1126     fi
1127
1128     if [ ${ret} -eq 0 -a -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ]
1129         then
1130         mv "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
1131         echo >&2 "New configuration saved for you to edit at ${NETDATA_PREFIX}/etc/netdata/netdata.conf"
1132
1133         if [ "${UID}" -eq 0 ]
1134             then
1135             chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
1136         fi
1137         chmod 0664 "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
1138     else
1139         echo >&2 "Cannnot download configuration from netdata daemon using url 'http://localhost:${NETDATA_PORT}/netdata.conf'"
1140         [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new"
1141     fi
1142 fi
1143
1144 # -----------------------------------------------------------------------------
1145 # Check for KSM
1146
1147 ksm_is_available_but_disabled() {
1148     cat <<KSM1
1149
1150 -------------------------------------------------------------------------------
1151 Memory de-duplication instructions
1152
1153 You have kernel memory de-duper (called Kernel Same-page Merging,
1154 or KSM) available, but it is not currently enabled.
1155
1156 To enable it run:
1157
1158 echo 1 >/sys/kernel/mm/ksm/run
1159 echo 1000 >/sys/kernel/mm/ksm/sleep_millisecs
1160
1161 If you enable it, you will save 40-60% of netdata memory.
1162
1163 KSM1
1164 }
1165
1166 ksm_is_not_available() {
1167     cat <<KSM2
1168
1169 -------------------------------------------------------------------------------
1170 Memory de-duplication not present in your kernel
1171
1172 It seems you do not have kernel memory de-duper (called Kernel Same-page
1173 Merging, or KSM) available.
1174
1175 To enable it, you need a kernel built with CONFIG_KSM=y
1176
1177 If you can have it, you will save 40-60% of netdata memory.
1178
1179 KSM2
1180 }
1181
1182 if [ -f "/sys/kernel/mm/ksm/run" ]
1183     then
1184     if [ $(cat "/sys/kernel/mm/ksm/run") != "1" ]
1185         then
1186         ksm_is_available_but_disabled
1187     fi
1188 else
1189     ksm_is_not_available
1190 fi
1191
1192 # -----------------------------------------------------------------------------
1193 # Check for version.txt
1194
1195 if [ ! -s web/version.txt ]
1196     then
1197     cat <<VERMSG
1198
1199 -------------------------------------------------------------------------------
1200 Version update check warning
1201
1202 The way you downloaded netdata, we cannot find its version. This means the
1203 Update check on the dashboard, will not work.
1204
1205 If you want to have version update check, please re-install it
1206 following the procedure in:
1207
1208 https://github.com/firehol/netdata/wiki/Installation
1209
1210 VERMSG
1211 fi
1212
1213 # -----------------------------------------------------------------------------
1214 # apps.plugin warning
1215
1216 if [ "${UID}" -ne 0 ]
1217     then
1218     cat <<SETUID_WARNING
1219
1220 -------------------------------------------------------------------------------
1221 apps.plugin needs privileges
1222
1223 Since you have installed netdata as a normal user, to have apps.plugin collect
1224 all the needed data, you have to give it the access rights it needs, by running
1225 either of the following sets of commands:
1226
1227 To run apps.plugin with escalated capabilities:
1228
1229     sudo chown root:${NETDATA_USER} "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
1230     sudo chmod 0750 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
1231     sudo setcap cap_dac_read_search,cap_sys_ptrace+ep "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
1232
1233 or, to run apps.plugin as root:
1234
1235     sudo chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
1236     sudo chmod 4755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
1237
1238 apps.plugin is performing a hard-coded function of data collection for all
1239 running processes. It cannot be instructed from the netdata daemon to perform
1240 any task, so it is pretty safe to do this.
1241
1242 SETUID_WARNING
1243 fi
1244
1245 # -----------------------------------------------------------------------------
1246 # Keep un-install info
1247
1248 cat >netdata-uninstaller.sh <<UNINSTALL
1249 #!/usr/bin/env bash
1250
1251 # this script will uninstall netdata
1252
1253 if [ "\$1" != "--force" ]
1254     then
1255     echo >&2 "This script will REMOVE netdata from your system."
1256     echo >&2 "Run it again with --force to do it."
1257     exit 1
1258 fi
1259
1260 echo >&2 "Stopping a possibly running netdata..."
1261 for p in \$(pidof netdata); do kill \$p; done
1262 sleep 2
1263
1264 deletedir() {
1265     if [ ! -z "\$1" -a -d "\$1" ]
1266         then
1267         echo
1268         echo "Deleting directory '\$1' ..."
1269         rm -I -R "\$1"
1270     fi
1271 }
1272
1273 if [ ! -z "${NETDATA_PREFIX}" -a -d "${NETDATA_PREFIX}" ]
1274     then
1275     # installation prefix was given
1276
1277     deletedir "${NETDATA_PREFIX}"
1278
1279 else
1280     # installation prefix was NOT given
1281
1282     if [ -f "${NETDATA_PREFIX}/usr/sbin/netdata" ]
1283         then
1284         echo "Deleting ${NETDATA_PREFIX}/usr/sbin/netdata ..."
1285         rm -i "${NETDATA_PREFIX}/usr/sbin/netdata"
1286     fi
1287
1288     deletedir "${NETDATA_PREFIX}/etc/netdata"
1289     deletedir "${NETDATA_PREFIX}/usr/share/netdata"
1290     deletedir "${NETDATA_PREFIX}/usr/libexec/netdata"
1291     deletedir "${NETDATA_PREFIX}/var/lib/netdata"
1292     deletedir "${NETDATA_PREFIX}/var/cache/netdata"
1293     deletedir "${NETDATA_PREFIX}/var/log/netdata"
1294 fi
1295
1296 if [ -f /etc/logrotate.d/netdata ]
1297     then
1298     echo "Deleting /etc/logrotate.d/netdata ..."
1299     rm -i /etc/logrotate.d/netdata
1300 fi
1301
1302 if [ -f /etc/systemd/system/netdata.service ]
1303     then
1304     echo "Deleting /etc/systemd/system/netdata.service ..."
1305     rm -i /etc/systemd/system/netdata.service
1306 fi
1307
1308 if [ -f /etc/init.d/netdata ]
1309     then
1310     echo "Deleting /etc/init.d/netdata ..."
1311     rm -i /etc/init.d/netdata
1312 fi
1313
1314 getent passwd netdata > /dev/null
1315 if [ $? -eq 0 ]
1316     then
1317     echo
1318     echo "You may also want to remove the user netdata"
1319     echo "by running:"
1320     echo "   userdel netdata"
1321 fi
1322
1323 getent group netdata > /dev/null
1324 if [ $? -eq 0 ]
1325     then
1326     echo
1327     echo "You may also want to remove the group netdata"
1328     echo "by running:"
1329     echo "   groupdel netdata"
1330 fi
1331
1332 getent group docker > /dev/null
1333 if [ $? -eq 0 -a "${NETDATA_ADDED_TO_DOCKER}" = "1" ]
1334     then
1335     echo
1336     echo "You may also want to remove the netdata user from the docker group"
1337     echo "by running:"
1338     echo "   gpasswd -d netdata docker"
1339 fi
1340
1341 getent group nginx > /dev/null
1342 if [ $? -eq 0 -a "${NETDATA_ADDED_TO_NGINX}" = "1" ]
1343     then
1344     echo
1345     echo "You may also want to remove the netdata user from the nginx group"
1346     echo "by running:"
1347     echo "   gpasswd -d netdata nginx"
1348 fi
1349
1350 getent group varnish > /dev/null
1351 if [ $? -eq 0 -a "${NETDATA_ADDED_TO_VARNISH}" = "1" ]
1352     then
1353     echo
1354     echo "You may also want to remove the netdata user from the varnish group"
1355     echo "by running:"
1356     echo "   gpasswd -d netdata varnish"
1357 fi
1358
1359 getent group haproxy > /dev/null
1360 if [ $? -eq 0 -a "${NETDATA_ADDED_TO_HAPROXY}" = "1" ]
1361     then
1362     echo
1363     echo "You may also want to remove the netdata user from the haproxy group"
1364     echo "by running:"
1365     echo "   gpasswd -d netdata haproxy"
1366 fi
1367
1368
1369 UNINSTALL
1370 chmod 750 netdata-uninstaller.sh
1371
1372 # -----------------------------------------------------------------------------
1373
1374 cat <<END
1375
1376
1377 -------------------------------------------------------------------------------
1378
1379 OK. NetData is installed and it is running.
1380
1381 -------------------------------------------------------------------------------
1382
1383 By default netdata listens on all IPs on port ${NETDATA_PORT},
1384 so you can access it with:
1385
1386 http://this.machine.ip:${NETDATA_PORT}/
1387
1388 To stop netdata, just kill it, with:
1389
1390   killall netdata
1391
1392 To start it, just run it:
1393
1394   ${NETDATA_PREFIX}/usr/sbin/netdata
1395
1396
1397 END
1398 echo >&2 "Uninstall script generated: ./netdata-uninstaller.sh"
1399
1400 if [ -d .git ]
1401     then
1402     cat >netdata-updater.sh.new <<REINSTALL
1403 #!/usr/bin/env bash
1404
1405 force=0
1406 [ "\${1}" = "-f" ] && force=1
1407
1408 export PATH="\${PATH}:${PATH}"
1409 export CFLAGS="${CFLAGS}"
1410
1411 INSTALL_UID="${UID}"
1412 if [ "\${INSTALL_UID}" != "\${UID}" ]
1413     then
1414     echo >&2 "This script should be run as user with uid \${INSTALL_UID} but it now runs with uid \${UID}"
1415     exit 1
1416 fi
1417
1418 # make sure we cd to the working directory
1419 cd "${REINSTALL_PWD}" || exit 1
1420
1421 # make sure there is .git here
1422 [ \${force} -eq 0 -a ! -d .git ] && echo >&2 "No git structures found at: ${REINSTALL_PWD} (use -f for force re-install)" && exit 1
1423
1424 # signal netdata to start saving its database
1425 # this is handy if your database is big
1426 pids=\$(pidof netdata)
1427 [ ! -z "\${pids}" ] && kill -USR1 \${pids}
1428
1429 tmp=
1430 if [ -t 2 ]
1431     then
1432     # we are running on a terminal
1433     # open fd 3 and send it to stderr
1434     exec 3>&2
1435 else
1436     # we are headless
1437     # create a temporary file for the log
1438     tmp=\$(mktemp /tmp/netdata-updater-log-XXXXXX.log)
1439     # open fd 3 and send it to tmp
1440     exec 3>\${tmp}
1441 fi
1442
1443 info() {
1444     echo >&3 "\$(date) : INFO: " "\${@}"
1445 }
1446
1447 emptyline() {
1448     echo >&3
1449 }
1450
1451 error() {
1452     echo >&3 "\$(date) : ERROR: " "\${@}"
1453 }
1454
1455 # this is what we will do if it fails (head-less only)
1456 failed() {
1457     error "FAILED TO UPDATE NETDATA : \${1}"
1458
1459     if [ ! -z "\${tmp}" ]
1460     then
1461         cat >&2 "\${tmp}"
1462         rm "\${tmp}"
1463     fi
1464     exit 1
1465 }
1466
1467 get_latest_commit_id() {
1468     git log -1           2>&3 |\\
1469         grep ^commit     2>&3 |\\
1470         head -n 1        2>&3 |\\
1471         cut -d ' ' -f 2  2>&3
1472 }
1473
1474 update() {
1475     [ -z "\${tmp}" ] && info "Running on a terminal - (this script also supports running headless from crontab)"
1476
1477     emptyline
1478
1479     if [ -d .git ]
1480         then
1481         info "Updating netdata source from github..."
1482
1483         last_commit="\$(get_latest_commit_id)"
1484         [ \${force} -eq 0 -a -z "\${last_commit}" ] && failed "CANNOT GET LAST COMMIT ID (use -f for force re-install)"
1485
1486         git pull >&3 2>&3 || failed "CANNOT FETCH LATEST SOURCE (use -f for force re-install)"
1487
1488         new_commit="\$(get_latest_commit_id)"
1489         if [ \${force} -eq 0 ]
1490             then
1491             [ -z "\${new_commit}" ] && failed "CANNOT GET NEW LAST COMMIT ID (use -f for force re-install)"
1492             [ "\${new_commit}" = "\${last_commit}" ] && info "Nothing to be done! (use -f to force re-install)" && exit 0
1493         fi
1494     elif [ \${force} -eq 0 ]
1495         then
1496         failed "CANNOT FIND GIT STRUCTURES IN \$(pwd) (use -f for force re-install)"
1497     fi
1498
1499     emptyline
1500     info "Re-installing netdata..."
1501     ${REINSTALL_COMMAND// --dont-wait/} --dont-wait >&3 2>&3 || failed "FAILED TO COMPILE/INSTALL NETDATA"
1502
1503     [ ! -z "\${tmp}" ] && rm "\${tmp}" && tmp=
1504     return 0
1505 }
1506
1507 # the installer updates this script - so we run and exit in a single line
1508 update && exit 0
1509 ###############################################################################
1510 ###############################################################################
1511 REINSTALL
1512     chmod 755 netdata-updater.sh.new
1513     mv -f netdata-updater.sh.new netdata-updater.sh
1514     echo >&2 "Update script generated   : ./netdata-updater.sh"
1515 elif [ -f "netdata-updater.sh" ]
1516     then
1517     rm "netdata-updater.sh"
1518 fi
1519
1520 banner "is installed and running now!"
1521 echo >&2 "  enjoy real-time performance and health monitoring..."
1522 echo >&2 
1523 exit 0