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