]> arthur.barton.de Git - netdata.git/blob - netdata-installer.sh
Merge pull request #1467 from l2isbad/python.d.plugin_minor_fixes
[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 run find ./system/ -type f -a \! -name \*.in -a \! -name Makefile\* -a \! -name \*.conf -a \! -name \*.service -a \! -name \*.logrotate -exec chmod 755 {} \;
661
662 NETDATA_ADDED_TO_DOCKER=0
663 NETDATA_ADDED_TO_NGINX=0
664 if [ ${UID} -eq 0 ]
665     then
666     portable_add_group netdata
667     portable_add_user netdata
668     portable_add_user_to_group docker netdata && NETDATA_ADDED_TO_DOCKER=1
669     portable_add_user_to_group nginx  netdata && NETDATA_ADDED_TO_NGINX=1
670
671     if [ -d /etc/logrotate.d -a ! -f /etc/logrotate.d/netdata ]
672         then
673         echo >&2 "Adding netdata logrotate configuration ..."
674         run cp system/netdata.logrotate /etc/logrotate.d/netdata
675     fi
676     
677     if [ -f /etc/logrotate.d/netdata ]
678         then
679         echo >&2 "Fixing netdata logrotate permissions ..."
680         run chmod 644 /etc/logrotate.d/netdata
681     fi
682 fi
683
684
685 # -----------------------------------------------------------------------------
686 # load options from the configuration file
687
688 # create an empty config if it does not exist
689 [ ! -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ] && touch "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
690
691 # function to extract values from the config file
692 config_option() {
693     local key="${1}" value="${2}" line=
694
695     if [ -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
696         then
697         line="$( grep "^[[:space:]]*${key}[[:space:]]*=[[:space:]]*" "${NETDATA_PREFIX}/etc/netdata/netdata.conf" | head -n 1 )"
698         [ ! -z "${line}" ] && value="$( echo "${line}" | cut -d '=' -f 2 | sed -e "s/^[[:space:]]\+//g" -e "s/[[:space:]]\+$//g" )"
699     fi
700
701     echo "${value}"
702 }
703
704 # the user netdata will run as
705 if [ "${UID}" = "0" ]
706     then
707     NETDATA_USER="$( config_option "run as user" "netdata" )"
708 else
709     NETDATA_USER="${USER}"
710 fi
711
712 # the owners of the web files
713 NETDATA_WEB_USER="$(  config_option "web files owner" "${NETDATA_USER}" )"
714 NETDATA_WEB_GROUP="$( config_option "web files group" "${NETDATA_WEB_USER}" )"
715
716 # debug flags
717 NETDATA_DEBUG="$( config_option "debug flags" 0 )"
718
719 # port
720 defport=19999
721 NETDATA_PORT="$( config_option "default port" ${defport} )"
722 NETDATA_PORT2="$( config_option "port" ${defport} )"
723
724 if [ "${NETDATA_PORT}" != "${NETDATA_PORT2}" ]
725 then
726     if [ "${NETDATA_PORT2}" != "${defport}" ]
727     then
728         NETDATA_PORT="${NETDATA_PORT2}"
729     fi
730 fi
731
732 # directories
733 NETDATA_LIB_DIR="$( config_option "lib directory" "${NETDATA_PREFIX}/var/lib/netdata" )"
734 NETDATA_CACHE_DIR="$( config_option "cache directory" "${NETDATA_PREFIX}/var/cache/netdata" )"
735 NETDATA_WEB_DIR="$( config_option "web files directory" "${NETDATA_PREFIX}/usr/share/netdata/web" )"
736 NETDATA_LOG_DIR="$( config_option "log directory" "${NETDATA_PREFIX}/var/log/netdata" )"
737 NETDATA_CONF_DIR="$( config_option "config directory" "${NETDATA_PREFIX}/etc/netdata" )"
738 NETDATA_RUN_DIR="${NETDATA_PREFIX}/var/run"
739
740
741 # -----------------------------------------------------------------------------
742 # prepare the directories
743
744 # this is needed if NETDATA_PREFIX is not empty
745 if [ ! -d "${NETDATA_RUN_DIR}" ]
746     then
747     mkdir -p "${NETDATA_RUN_DIR}" || exit 1
748 fi
749
750 echo >&2
751 echo >&2 "Fixing directories (user: ${NETDATA_USER})..."
752
753 # --- conf dir ----
754
755 for x in "python.d" "charts.d" "node.d"
756 do
757     if [ ! -d "${NETDATA_CONF_DIR}/${x}" ]
758         then
759         echo >&2 "Creating directory '${NETDATA_CONF_DIR}/${x}'"
760         run mkdir -p "${NETDATA_CONF_DIR}/${x}" || exit 1
761     fi
762 done
763 run chown -R "${NETDATA_USER}:${NETDATA_USER}" "${NETDATA_CONF_DIR}"
764 run find "${NETDATA_CONF_DIR}" -type f -exec chmod 0660 {} \;
765 run find "${NETDATA_CONF_DIR}" -type d -exec chmod 0775 {} \;
766
767 # --- web dir ----
768
769 if [ ! -d "${NETDATA_WEB_DIR}" ]
770     then
771     echo >&2 "Creating directory '${NETDATA_WEB_DIR}'"
772     run mkdir -p "${NETDATA_WEB_DIR}" || exit 1
773 fi
774 run chown -R "${NETDATA_WEB_USER}:${NETDATA_WEB_GROUP}" "${NETDATA_WEB_DIR}"
775 run find "${NETDATA_WEB_DIR}" -type f -exec chmod 0664 {} \;
776 run find "${NETDATA_WEB_DIR}" -type d -exec chmod 0775 {} \;
777
778 # --- data dirs ----
779
780 for x in "${NETDATA_LIB_DIR}" "${NETDATA_CACHE_DIR}" "${NETDATA_LOG_DIR}"
781 do
782     if [ ! -d "${x}" ]
783         then
784         echo >&2 "Creating directory '${x}'"
785         run mkdir -p "${x}" || exit 1
786     fi
787
788     run chown -R "${NETDATA_USER}:${NETDATA_USER}" "${x}"
789     #run find "${x}" -type f -exec chmod 0660 {} \;
790     #run find "${x}" -type d -exec chmod 0770 {} \;
791 done
792
793 run chown "${NETDATA_USER}:root" "${NETDATA_LOG_DIR}"
794 run chmod 755 "${NETDATA_LOG_DIR}"
795
796 # --- plugins ----
797
798 if [ ${UID} -eq 0 ]
799     then
800     run chown -R root "${NETDATA_PREFIX}/usr/libexec/netdata"
801     run find "${NETDATA_PREFIX}/usr/libexec/netdata" -type d -exec chmod 0755 {} \;
802     run find "${NETDATA_PREFIX}/usr/libexec/netdata" -type f -exec chmod 0644 {} \;
803     run find "${NETDATA_PREFIX}/usr/libexec/netdata" -type f -a -name \*.plugin -exec chmod 0755 {} \;
804     run find "${NETDATA_PREFIX}/usr/libexec/netdata" -type f -a -name \*.sh -exec chmod 0755 {} \;
805
806     run setcap cap_dac_read_search,cap_sys_ptrace+ep "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
807     if [ $? -ne 0 ]
808         then
809         # fix apps.plugin to be setuid to root
810         run chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
811         run chmod 4755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
812     fi
813 else
814     run chown -R "${NETDATA_USER}:${NETDATA_USER}" "${NETDATA_PREFIX}/usr/libexec/netdata"
815     run find "${NETDATA_PREFIX}/usr/libexec/netdata" -type f -exec chmod 0755 {} \;
816     run find "${NETDATA_PREFIX}/usr/libexec/netdata" -type d -exec chmod 0755 {} \;
817 fi
818
819 # --- fix #1292 bug ---
820
821 [ -d "${NETDATA_PREFIX}/usr/libexec" ] && run chmod a+rX "${NETDATA_PREFIX}/usr/libexec"
822 [ -d "${NETDATA_PREFIX}/usr/share/netdata" ] && run chmod a+rX "${NETDATA_PREFIX}/usr/share/netdata"
823
824
825 # -----------------------------------------------------------------------------
826 # check if we can re-start netdata
827
828 if [ ${DONOTSTART} -eq 1 ]
829     then
830     if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
831         then
832         echo >&2 "Generating empty config file in: ${NETDATA_PREFIX}/etc/netdata/netdata.conf"
833         echo "# Get config from http://127.0.0.1:${NETDATA_PORT}/netdata.conf" >"${NETDATA_PREFIX}/etc/netdata/netdata.conf"
834
835         if [ "${UID}" -eq 0 ]
836             then
837             chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
838         fi
839         chmod 0644 "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
840     fi
841     banner "is installed now!"
842     echo >&2 "  enjoy real-time performance and health monitoring..."
843     exit 0
844 fi
845
846 # -----------------------------------------------------------------------------
847 # stop a running netdata
848
849 isnetdata() {
850     if [ -d /proc/self ]
851     then
852         [ -z "$1" -o ! -f "/proc/$1/stat" ] && return 1
853         [ "$(cat "/proc/$1/stat" | cut -d '(' -f 2 | cut -d ')' -f 1)" = "netdata" ] && return 0
854         return 1
855     fi
856     return 0
857 }
858
859 stop_netdata_on_pid() {
860     local pid="${1}" ret=0 count=0
861
862     isnetdata ${pid} || return 0
863
864     printf >&2 "Stopping netdata on pid ${pid} ..."
865     while [ ! -z "$pid" -a ${ret} -eq 0 ]
866     do
867         if [ ${count} -gt 45 ]
868             then
869             echo >&2 "Cannot stop the running netdata on pid ${pid}."
870             return 1
871         fi
872
873         count=$(( count + 1 ))
874
875         run kill ${pid} 2>/dev/null
876         ret=$?
877
878         test ${ret} -eq 0 && printf >&2 "." && sleep 2
879     done
880
881     echo >&2
882     if [ ${ret} -eq 0 ]
883     then
884         echo >&2 "SORRY! CANNOT STOP netdata ON PID ${pid} !"
885         return 1
886     fi
887
888     echo >&2 "netdata on pid ${pid} stopped."
889     return 0
890 }
891
892 stop_all_netdata() {
893     local p myns ns
894
895     myns="$(readlink /proc/self/ns/pid 2>/dev/null)"
896
897     echo >&2 "Stopping a (possibly) running netdata..."
898
899     for p in $(cat "${NETDATA_RUN_DIR}/netdata.pid" 2>/dev/null) \
900         $(cat /var/run/netdata.pid 2>/dev/null) \
901         $(cat /var/run/netdata/netdata.pid 2>/dev/null) \
902         $(pidof netdata 2>/dev/null)
903     do
904         ns="$(readlink /proc/${p}/ns/pid 2>/dev/null)"
905
906         if [ -z "${myns}" -o -z "${ns}" -o "${myns}" = "${ns}" ]
907             then
908             stop_netdata_on_pid ${p}
909         fi
910     done
911 }
912
913 # -----------------------------------------------------------------------------
914 # check for systemd
915
916 issystemd() {
917     local pids p myns ns systemctl
918
919     # if the directory /etc/systemd/system does not exit, it is not systemd
920     [ ! -d /etc/systemd/system ] && return 1
921
922     # if there is no systemctl command, it is not systemd
923     systemctl=$(which systemctl 2>/dev/null || command -v systemctl 2>/dev/null)
924     [ -z "${systemctl}" -o ! -x "${systemctl}" ] && return 1
925
926     # if pid 1 is systemd, it is systemd
927     [ "$(basename $(readlink /proc/1/exe) 2>/dev/null)" = "systemd" ] && return 0
928
929     # if systemd is not running, it is not systemd
930     pids=$(pidof systemd 2>/dev/null)
931     [ -z "${pids}" ] && return 1
932
933     # check if the running systemd processes are not in our namespace
934     myns="$(readlink /proc/self/ns/pid 2>/dev/null)"
935     for p in ${pids}
936     do
937         ns="$(readlink /proc/${p}/ns/pid 2>/dev/null)"
938
939         # if pid of systemd is in our namespace, it is systemd
940         [ ! -z "${myns}" && "${myns}" = "${ns}" ] && return 0
941     done
942
943     # else, it is not systemd
944     return 1
945 }
946
947 installed_init_d=0
948 install_non_systemd_init() {
949     [ "${UID}" != 0 ] && return 1
950
951     local key="unknown"
952     if [ -f /etc/os-release ]
953         then
954         source /etc/os-release || return 1
955         key="${ID}-${VERSION_ID}"
956
957     elif [ -f /etc/centos-release ]
958         then
959         key=$(</etc/centos-release)
960     fi
961
962     if [ -d /etc/init.d -a ! -f /etc/init.d/netdata ]
963         then
964         if [ "${key}" = "gentoo" ]
965             then
966             run cp system/netdata-openrc /etc/init.d/netdata && \
967             run chmod 755 /etc/init.d/netdata && \
968             run rc-update add netdata default && \
969             installed_init_d=1
970         
971         elif [ "${key}" = "ubuntu-12.04" -o "${key}" = "ubuntu-14.04" -o "${key}" = "debian-7" ]
972             then
973             run cp system/netdata-lsb /etc/init.d/netdata && \
974             run chmod 755 /etc/init.d/netdata && \
975             run update-rc.d netdata defaults && \
976             run update-rc.d netdata enable && \
977             installed_init_d=1
978
979         elif [ "${key}" = "CentOS release 6.8 (Final)" -o "${key}" = "amzn-2016.09" ]
980             then
981             run cp system/netdata-init-d /etc/init.d/netdata && \
982             run chmod 755 /etc/init.d/netdata && \
983             run chkconfig netdata on && \
984             installed_init_d=1
985         fi
986     fi
987
988     return 0
989 }
990
991 started=0
992 if [ "${UID}" -eq 0 ]
993     then
994
995     if issystemd
996     then
997         # systemd is running on this system
998
999         if [ ! -f /etc/systemd/system/netdata.service ]
1000         then
1001             echo >&2 "Installing systemd service..."
1002             run cp system/netdata.service /etc/systemd/system/netdata.service && \
1003                 run systemctl daemon-reload && \
1004                 run systemctl enable netdata
1005         else
1006             service netdata stop
1007         fi
1008
1009         stop_all_netdata
1010         service netdata restart && started=1
1011     else
1012         install_non_systemd_init
1013     fi
1014
1015     if [ ${started} -eq 0 ]
1016     then
1017         # check if we can use the system service
1018         service netdata stop
1019         stop_all_netdata
1020         service netdata restart && started=1
1021         if [ ${started} -eq 0 ]
1022         then
1023             service netdata start && started=1
1024         fi
1025     fi
1026 fi
1027
1028 if [ ${started} -eq 0 ]
1029 then
1030     # still not started...
1031
1032     stop_all_netdata
1033
1034     echo >&2 "Starting netdata..."
1035     run ${NETDATA_PREFIX}/usr/sbin/netdata -P ${NETDATA_RUN_DIR}/netdata.pid "${@}"
1036     if [ $? -ne 0 ]
1037         then
1038         echo >&2
1039         echo >&2 "SORRY! FAILED TO START NETDATA!"
1040         exit 1
1041     else
1042         echo >&2 "OK. NetData Started!"
1043     fi
1044
1045     echo >&2
1046 fi
1047
1048 # -----------------------------------------------------------------------------
1049 # save a config file, if it is not already there
1050
1051 if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ]
1052     then
1053     echo >&2
1054     echo >&2 "-------------------------------------------------------------------------------"
1055     echo >&2
1056     echo >&2 "Downloading default configuration from netdata..."
1057     sleep 5
1058
1059     # remove a possibly obsolete download
1060     [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new"
1061
1062     # disable a proxy to get data from the local netdata
1063     export http_proxy=
1064     export https_proxy=
1065
1066     # try wget
1067     wget 2>/dev/null -O "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf"
1068     ret=$?
1069
1070     # try curl
1071     if [ ${ret} -ne 0 -o ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ]
1072         then
1073         curl -s -o "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf"
1074         ret=$?
1075     fi
1076
1077     if [ ${ret} -eq 0 -a -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ]
1078         then
1079         mv "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
1080         echo >&2 "New configuration saved for you to edit at ${NETDATA_PREFIX}/etc/netdata/netdata.conf"
1081
1082         if [ "${UID}" -eq 0 ]
1083             then
1084             chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
1085         fi
1086         chmod 0664 "${NETDATA_PREFIX}/etc/netdata/netdata.conf"
1087     else
1088         echo >&2 "Cannnot download configuration from netdata daemon using url 'http://localhost:${NETDATA_PORT}/netdata.conf'"
1089         [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new"
1090     fi
1091 fi
1092
1093 # -----------------------------------------------------------------------------
1094 # Check for KSM
1095
1096 ksm_is_available_but_disabled() {
1097     cat <<KSM1
1098
1099 -------------------------------------------------------------------------------
1100 Memory de-duplication instructions
1101
1102 You have kernel memory de-duper (called Kernel Same-page Merging,
1103 or KSM) available, but it is not currently enabled.
1104
1105 To enable it run:
1106
1107 echo 1 >/sys/kernel/mm/ksm/run
1108 echo 1000 >/sys/kernel/mm/ksm/sleep_millisecs
1109
1110 If you enable it, you will save 40-60% of netdata memory.
1111
1112 KSM1
1113 }
1114
1115 ksm_is_not_available() {
1116     cat <<KSM2
1117
1118 -------------------------------------------------------------------------------
1119 Memory de-duplication not present in your kernel
1120
1121 It seems you do not have kernel memory de-duper (called Kernel Same-page
1122 Merging, or KSM) available.
1123
1124 To enable it, you need a kernel built with CONFIG_KSM=y
1125
1126 If you can have it, you will save 40-60% of netdata memory.
1127
1128 KSM2
1129 }
1130
1131 if [ -f "/sys/kernel/mm/ksm/run" ]
1132     then
1133     if [ $(cat "/sys/kernel/mm/ksm/run") != "1" ]
1134         then
1135         ksm_is_available_but_disabled
1136     fi
1137 else
1138     ksm_is_not_available
1139 fi
1140
1141 # -----------------------------------------------------------------------------
1142 # Check for version.txt
1143
1144 if [ ! -s web/version.txt ]
1145     then
1146     cat <<VERMSG
1147
1148 -------------------------------------------------------------------------------
1149 Version update check warning
1150
1151 The way you downloaded netdata, we cannot find its version. This means the
1152 Update check on the dashboard, will not work.
1153
1154 If you want to have version update check, please re-install it
1155 following the procedure in:
1156
1157 https://github.com/firehol/netdata/wiki/Installation
1158
1159 VERMSG
1160 fi
1161
1162 # -----------------------------------------------------------------------------
1163 # apps.plugin warning
1164
1165 if [ "${UID}" -ne 0 ]
1166     then
1167     cat <<SETUID_WARNING
1168
1169 -------------------------------------------------------------------------------
1170 apps.plugin needs privileges
1171
1172 Since you have installed netdata as a normal user, to have apps.plugin collect
1173 all the needed data, you have to give it the access rights it needs, by running
1174 either of the following sets of commands:
1175
1176 To run apps.plugin with escalated capabilities:
1177
1178     sudo chown root:${NETDATA_USER} "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
1179     sudo chmod 0750 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
1180     sudo setcap cap_dac_read_search,cap_sys_ptrace+ep "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
1181
1182 or, to run apps.plugin as root:
1183
1184     sudo chown root "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
1185     sudo chmod 4755 "${NETDATA_PREFIX}/usr/libexec/netdata/plugins.d/apps.plugin"
1186
1187 apps.plugin is performing a hard-coded function of data collection for all
1188 running processes. It cannot be instructed from the netdata daemon to perform
1189 any task, so it is pretty safe to do this.
1190
1191 SETUID_WARNING
1192 fi
1193
1194 # -----------------------------------------------------------------------------
1195 # Keep un-install info
1196
1197 cat >netdata-uninstaller.sh <<UNINSTALL
1198 #!/usr/bin/env bash
1199
1200 # this script will uninstall netdata
1201
1202 if [ "\$1" != "--force" ]
1203     then
1204     echo >&2 "This script will REMOVE netdata from your system."
1205     echo >&2 "Run it again with --force to do it."
1206     exit 1
1207 fi
1208
1209 echo >&2 "Stopping a possibly running netdata..."
1210 for p in \$(pidof netdata); do kill \$p; done
1211 sleep 2
1212
1213 deletedir() {
1214     if [ ! -z "\$1" -a -d "\$1" ]
1215         then
1216         echo
1217         echo "Deleting directory '\$1' ..."
1218         rm -I -R "\$1"
1219     fi
1220 }
1221
1222 if [ ! -z "${NETDATA_PREFIX}" -a -d "${NETDATA_PREFIX}" ]
1223     then
1224     # installation prefix was given
1225
1226     deletedir "${NETDATA_PREFIX}"
1227
1228 else
1229     # installation prefix was NOT given
1230
1231     if [ -f "${NETDATA_PREFIX}/usr/sbin/netdata" ]
1232         then
1233         echo "Deleting ${NETDATA_PREFIX}/usr/sbin/netdata ..."
1234         rm -i "${NETDATA_PREFIX}/usr/sbin/netdata"
1235     fi
1236
1237     deletedir "${NETDATA_PREFIX}/etc/netdata"
1238     deletedir "${NETDATA_PREFIX}/usr/share/netdata"
1239     deletedir "${NETDATA_PREFIX}/usr/libexec/netdata"
1240     deletedir "${NETDATA_PREFIX}/var/lib/netdata"
1241     deletedir "${NETDATA_PREFIX}/var/cache/netdata"
1242     deletedir "${NETDATA_PREFIX}/var/log/netdata"
1243 fi
1244
1245 if [ -f /etc/logrotate.d/netdata ]
1246     then
1247     echo "Deleting /etc/logrotate.d/netdata ..."
1248     rm -i /etc/logrotate.d/netdata
1249 fi
1250
1251 if [ -f /etc/systemd/system/netdata.service ]
1252     then
1253     echo "Deleting /etc/systemd/system/netdata.service ..."
1254     rm -i /etc/systemd/system/netdata.service
1255 fi
1256
1257 if [ -f /etc/init.d/netdata ]
1258     then
1259     echo "Deleting /etc/init.d/netdata ..."
1260     rm -i /etc/init.d/netdata
1261 fi
1262
1263 getent passwd netdata > /dev/null
1264 if [ $? -eq 0 ]
1265     then
1266     echo
1267     echo "You may also want to remove the user netdata"
1268     echo "by running:"
1269     echo "   userdel netdata"
1270 fi
1271
1272 getent group netdata > /dev/null
1273 if [ $? -eq 0 ]
1274     then
1275     echo
1276     echo "You may also want to remove the group netdata"
1277     echo "by running:"
1278     echo "   groupdel netdata"
1279 fi
1280
1281 getent group docker > /dev/null
1282 if [ $? -eq 0 -a "${NETDATA_ADDED_TO_DOCKER}" = "1" ]
1283     then
1284     echo
1285     echo "You may also want to remove the netdata user from the docker group"
1286     echo "by running:"
1287     echo "   gpasswd -d netdata docker"
1288 fi
1289
1290 getent group nginx > /dev/null
1291 if [ $? -eq 0 -a "${NETDATA_ADDED_TO_NGINX}" = "1" ]
1292     then
1293     echo
1294     echo "You may also want to remove the netdata user from the nginx group"
1295     echo "by running:"
1296     echo "   gpasswd -d netdata nginx"
1297 fi
1298
1299 UNINSTALL
1300 chmod 750 netdata-uninstaller.sh
1301
1302 # -----------------------------------------------------------------------------
1303
1304 cat <<END
1305
1306
1307 -------------------------------------------------------------------------------
1308
1309 OK. NetData is installed and it is running.
1310
1311 -------------------------------------------------------------------------------
1312
1313 By default netdata listens on all IPs on port ${NETDATA_PORT},
1314 so you can access it with:
1315
1316 http://this.machine.ip:${NETDATA_PORT}/
1317
1318 To stop netdata, just kill it, with:
1319
1320   killall netdata
1321
1322 To start it, just run it:
1323
1324   ${NETDATA_PREFIX}/usr/sbin/netdata
1325
1326
1327 END
1328 echo >&2 "Uninstall script generated: ./netdata-uninstaller.sh"
1329
1330 if [ -d .git ]
1331     then
1332     cat >netdata-updater.sh.new <<REINSTALL
1333 #!/usr/bin/env bash
1334
1335 force=0
1336 [ "\${1}" = "-f" ] && force=1
1337
1338 export PATH="\${PATH}:${PATH}"
1339 export CFLAGS="${CFLAGS}"
1340
1341 INSTALL_UID="${UID}"
1342 if [ "\${INSTALL_UID}" != "\${UID}" ]
1343     then
1344     echo >&2 "This script should be run as user with uid \${INSTALL_UID} but it now runs with uid \${UID}"
1345     exit 1
1346 fi
1347
1348 # make sure we cd to the working directory
1349 cd "${REINSTALL_PWD}" || exit 1
1350
1351 # make sure there is .git here
1352 [ \${force} -eq 0 -a ! -d .git ] && echo >&2 "No git structures found at: ${REINSTALL_PWD} (use -f for force re-install)" && exit 1
1353
1354 # signal netdata to start saving its database
1355 # this is handy if your database is big
1356 pids=\$(pidof netdata)
1357 [ ! -z "\${pids}" ] && kill -USR1 \${pids}
1358
1359 tmp=
1360 if [ -t 2 ]
1361     then
1362     # we are running on a terminal
1363     # open fd 3 and send it to stderr
1364     exec 3>&2
1365 else
1366     # we are headless
1367     # create a temporary file for the log
1368     tmp=\$(mktemp /tmp/netdata-updater-log-XXXXXX.log)
1369     # open fd 3 and send it to tmp
1370     exec 3>\${tmp}
1371 fi
1372
1373 info() {
1374     echo >&3 "\$(date) : INFO: " "\${@}"
1375 }
1376
1377 emptyline() {
1378     echo >&3
1379 }
1380
1381 error() {
1382     echo >&3 "\$(date) : ERROR: " "\${@}"
1383 }
1384
1385 # this is what we will do if it fails (head-less only)
1386 failed() {
1387     error "FAILED TO UPDATE NETDATA : \${1}"
1388
1389     if [ ! -z "\${tmp}" ]
1390     then
1391         cat >&2 "\${tmp}"
1392         rm "\${tmp}"
1393     fi
1394     exit 1
1395 }
1396
1397 get_latest_commit_id() {
1398     git log -1           2>&3 |\\
1399         grep ^commit     2>&3 |\\
1400         head -n 1        2>&3 |\\
1401         cut -d ' ' -f 2  2>&3
1402 }
1403
1404 update() {
1405     [ -z "\${tmp}" ] && info "Running on a terminal - (this script also supports running headless from crontab)"
1406
1407     emptyline
1408
1409     if [ -d .git ]
1410         then
1411         info "Updating netdata source from github..."
1412
1413         last_commit="\$(get_latest_commit_id)"
1414         [ \${force} -eq 0 -a -z "\${last_commit}" ] && failed "CANNOT GET LAST COMMIT ID (use -f for force re-install)"
1415
1416         git pull >&3 2>&3 || failed "CANNOT FETCH LATEST SOURCE (use -f for force re-install)"
1417
1418         new_commit="\$(get_latest_commit_id)"
1419         if [ \${force} -eq 0 ]
1420             then
1421             [ -z "\${new_commit}" ] && failed "CANNOT GET NEW LAST COMMIT ID (use -f for force re-install)"
1422             [ "\${new_commit}" = "\${last_commit}" ] && info "Nothing to be done! (use -f to force re-install)" && exit 0
1423         fi
1424     elif [ \${force} -eq 0 ]
1425         then
1426         failed "CANNOT FIND GIT STRUCTURES IN \$(pwd) (use -f for force re-install)"
1427     fi
1428
1429     emptyline
1430     info "Re-installing netdata..."
1431     ${REINSTALL_COMMAND// --dont-wait/} --dont-wait >&3 2>&3 || failed "FAILED TO COMPILE/INSTALL NETDATA"
1432
1433     [ ! -z "\${tmp}" ] && rm "\${tmp}" && tmp=
1434     return 0
1435 }
1436
1437 # the installer updates this script - so we run and exit in a single line
1438 update && exit 0
1439 ###############################################################################
1440 ###############################################################################
1441 REINSTALL
1442     chmod 755 netdata-updater.sh.new
1443     mv -f netdata-updater.sh.new netdata-updater.sh
1444     echo >&2 "Update script generated   : ./netdata-updater.sh"
1445 elif [ -f "netdata-updater.sh" ]
1446     then
1447     rm "netdata-updater.sh"
1448 fi
1449
1450 banner "is installed and running now!"
1451 echo >&2 "  enjoy real-time performance and health monitoring..."
1452 echo >&2 
1453 exit 0