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