From: Costa Tsaousis Date: Mon, 13 Feb 2017 14:59:44 +0000 (+0200) Subject: Merge pull request #1782 from l2isbad/web_log_improvements X-Git-Tag: ab-debian_0.20170221.01-0ab1~1^2~18 X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f7175dd846f5aeb3d5b528c76938801c472cf59d;hp=5377fc698d5998c6f26eda4ccb9fa9636eef5190;p=netdata.git Merge pull request #1782 from l2isbad/web_log_improvements web_log plugin: response statuses chart added --- diff --git a/.travis.yml b/.travis.yml index 8f8a3586..b7e04bfb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,9 +33,7 @@ before_script: script: # make release packages - fakeroot ./packaging/git-build - # default build - - ./autogen.sh && ./configure && make -j4 - # test installer + # test build and installer - fakeroot ./netdata-installer.sh --install $HOME --dont-wait --dont-start-it # # Deploy as required diff --git a/Makefile.am b/Makefile.am index ab77bc73..e78bbbbd 100644 --- a/Makefile.am +++ b/Makefile.am @@ -60,4 +60,5 @@ dist_noinst_SCRIPTS= \ coverity-scan.sh \ docker-build.sh \ netdata-installer.sh \ + installer/functions.sh \ $(NULL) diff --git a/conf.d/python.d/web_log.conf b/conf.d/python.d/web_log.conf index ff993dc9..3b67a8cb 100644 --- a/conf.d/python.d/web_log.conf +++ b/conf.d/python.d/web_log.conf @@ -70,9 +70,11 @@ # ---------------------------------------------------------------------- # WEB SERVER CONFIGURATION # -# Make sure the log directory and file can be read by user 'netdata'. +# Make sure the web server log directory and the web server log files +# can be read by user 'netdata'. # -# Preferable Log Format. You need to change to this to collect all metrics. +# To enable the timings chart and the requests size dimension, the +# web server needs to log them. This is how to add them: # # nginx: # log_format netdata '$remote_addr - $remote_user [$time_local] ' @@ -81,9 +83,10 @@ # '"$http_referer" "$http_user_agent"'; # access_log /var/log/nginx/access.log netdata; # -# apache: -# LogFormat "%h %l %u %t \"%r\" %>s %O %I %D \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined -# LogFormat "%h %l %u %t \"%r\" %>s %O %I %D \"%{Referer}i\" \"%{User-Agent}i\"" combined +# apache (you need mod_logio enabled): +# LogFormat "%h %l %u %t \"%r\" %>s %O %I %D \"%{Referer}i\" \"%{User-Agent}i\"" vhost_netdata +# LogFormat "%h %l %u %t \"%r\" %>s %O %I %D \"%{Referer}i\" \"%{User-Agent}i\"" netdata +# CustomLog "/var/log/apache2/access.log" netdata # ---------------------------------------------------------------------- # AUTO-DETECTION JOBS diff --git a/configs.signatures b/configs.signatures index a56a63de..82cad14a 100644 --- a/configs.signatures +++ b/configs.signatures @@ -173,6 +173,7 @@ declare -A configs_signatures=( ['6a47af861ad3dd112124c37fbf09672b']='apps_groups.conf' ['6b39de5d85db45115db236347a6896d4']='health.d/named.conf' ['6b917300747e7e8314844237e2462261']='python.d/apache_cache.conf' + ['6bb278bd9e171c4cb5c0fe639231288b']='python.d/web_log.conf' ['6bf0de6e3b251b765b10a71d8c5c319d']='python.d/apache.conf' ['6c9f2f0abe49a6f1a69db052ebcef1bf']='python.d/elasticsearch.conf' ['6ca08ea2a238cad26578b8b85edae160']='health.d/udp_errors.conf' diff --git a/configure.ac b/configure.ac index 20a74696..1dffbe0f 100644 --- a/configure.ac +++ b/configure.ac @@ -12,7 +12,8 @@ define([VERSION_SUFFIX], [_rolling]) dnl Set to "1" for a first RPM release of a new version PACKAGE_RPM_RELEASE="0.0.$(echo VERSION_SUFFIX | sed s/^_//)" -define([VERSION_STRING], m4_esyscmd_s(git describe 2>/dev/null | sed 's/^v//')) +# We do not use m4_esyscmd_s to support older autoconf. +define([VERSION_STRING], m4_esyscmd(git describe 2>/dev/null | sed 's/^v//' | tr -d '\n')) m4_ifval(VERSION_STRING, [], [define([VERSION_STRING], VERSION_NUMBER)]) AC_INIT([netdata], VERSION_STRING[]VERSION_SUFFIX) diff --git a/installer/functions.sh b/installer/functions.sh new file mode 100644 index 00000000..02b061d8 --- /dev/null +++ b/installer/functions.sh @@ -0,0 +1,318 @@ +# no shebang necessary - this is a library to be sourced + +# ----------------------------------------------------------------------------- +# checking the availability of commands + +which_cmd() { + which "${1}" 2>/dev/null || \ + command -v "${1}" 2>/dev/null +} + +check_cmd() { + which_cmd "${1}" >/dev/null 2>&1 && return 0 + return 1 +} + + +# ----------------------------------------------------------------------------- + +setup_terminal() { + # Is stderr on the terminal? If not, then fail + test -t 2 || return 1 + + if check_cmd tput + then + if [ $(( $(tput colors 2>/dev/null) )) -ge 8 ] + then + # Enable colors + TPUT_RESET="$(tput sgr 0)" + TPUT_BLACK="$(tput setaf 0)" + TPUT_RED="$(tput setaf 1)" + TPUT_GREEN="$(tput setaf 2)" + TPUT_YELLOW="$(tput setaf 3)" + TPUT_BLUE="$(tput setaf 4)" + TPUT_PURPLE="$(tput setaf 5)" + TPUT_CYAN="$(tput setaf 6)" + TPUT_WHITE="$(tput setaf 7)" + TPUT_BGBLACK="$(tput setab 0)" + TPUT_BGRED="$(tput setab 1)" + TPUT_BGGREEN="$(tput setab 2)" + TPUT_BGYELLOW="$(tput setab 3)" + TPUT_BGBLUE="$(tput setab 4)" + TPUT_BGPURPLE="$(tput setab 5)" + TPUT_BGCYAN="$(tput setab 6)" + TPUT_BGWHITE="$(tput setab 7)" + TPUT_BOLD="$(tput bold)" + TPUT_DIM="$(tput dim)" + TPUT_UNDERLINED="$(tput smul)" + TPUT_BLINK="$(tput blink)" + TPUT_INVERTED="$(tput rev)" + TPUT_STANDOUT="$(tput smso)" + TPUT_BELL="$(tput bel)" + TPUT_CLEAR="$(tput clear)" + fi + fi + + return 0 +} +setup_terminal + +progress() { + echo >&2 " --- ${TPUT_DIM}${TPUT_BOLD}${*}${TPUT_RESET} --- " +} + +# ----------------------------------------------------------------------------- + +netdata_banner() { + local l1=" ^" \ + l2=" |.-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-" \ + l3=" | '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' " \ + l4=" +----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+--->" \ + sp=" " \ + netdata="netdata" start end msg="${*}" chartcolor="${TPUT_DIM}" + + [ ${#msg} -lt ${#netdata} ] && msg="${msg}${sp:0:$(( ${#netdata} - ${#msg}))}" + [ ${#msg} -gt $(( ${#l2} - 20 )) ] && msg="${msg:0:$(( ${#l2} - 23 ))}..." + + start="$(( ${#l2} / 2 - 4 ))" + [ $(( start + ${#msg} + 4 )) -gt ${#l2} ] && start=$((${#l2} - ${#msg} - 4)) + end=$(( ${start} + ${#msg} + 4 )) + + echo >&2 + echo >&2 "${chartcolor}${l1}${TPUT_RESET}" + echo >&2 "${chartcolor}${l2:0:start}${sp:0:2}${TPUT_RESET}${TPUT_BOLD}${TPUT_GREEN}${netdata}${TPUT_RESET}${chartcolor}${sp:0:$((end - start - 2 - ${#netdata}))}${l2:end:$((${#l2} - end))}${TPUT_RESET}" + echo >&2 "${chartcolor}${l3:0:start}${sp:0:2}${TPUT_RESET}${TPUT_BOLD}${TPUT_CYAN}${msg}${TPUT_RESET}${chartcolor}${sp:0:2}${l3:end:$((${#l2} - end))}${TPUT_RESET}" + echo >&2 "${chartcolor}${l4}${TPUT_RESET}" + echo >&2 +} + +# ----------------------------------------------------------------------------- +# portable service command + +service_cmd="$(which_cmd service)" +systemctl_cmd="$(which_cmd systemctl)" +service() { + local cmd="${1}" action="${2}" + + if [ ! -z "${service_cmd}" ] + then + run "${service_cmd}" "${cmd}" "${action}" + return $? + elif [ ! -z "${systemctl_cmd}" ] + then + run "${systemctl_cmd}" "${action}" "${cmd}" + return $? + fi + return 1 +} + +# ----------------------------------------------------------------------------- + +run_ok() { + printf >&2 "${TPUT_BGGREEN}${TPUT_WHITE}${TPUT_BOLD} OK ${TPUT_RESET} ${*} \n\n" +} + +run_failed() { + printf >&2 "${TPUT_BGRED}${TPUT_WHITE}${TPUT_BOLD} FAILED ${TPUT_RESET} ${*} \n\n" +} + +run_logfile="/dev/null" +run() { + local user="${USER}" dir="$(basename "${PWD}")" info info_console + + if [ "${UID}" = "0" ] + then + info="[root ${dir}]# " + info_console="[${TPUT_DIM}${dir}${TPUT_RESET}]# " + else + info="[${user} ${dir}]$ " + info_console="[${TPUT_DIM}${dir}${TPUT_RESET}]$ " + fi + + printf >> "${run_logfile}" "${info}" + printf >> "${run_logfile}" "%q " "${@}" + printf >> "${run_logfile}" " ... " + + printf >&2 "${info_console}${TPUT_BOLD}${TPUT_YELLOW}" + printf >&2 "%q " "${@}" + printf >&2 "${TPUT_RESET}\n" + + "${@}" + + local ret=$? + if [ ${ret} -ne 0 ] + then + run_failed + printf >> "${run_logfile}" "FAILED with exit code ${ret}\n" + else + run_ok + printf >> "${run_logfile}" "OK\n" + fi + + return ${ret} +} + +portable_add_user() { + local username="${1}" + + getent passwd "${username}" > /dev/null 2>&1 + [ $? -eq 0 ] && echo >&2 "User '${username}' already exists." && return 0 + + echo >&2 "Adding ${username} user account ..." + + local nologin="$(which nologin 2>/dev/null || command -v nologin 2>/dev/null || echo '/bin/false')" + + # Linux + if check_cmd useradd + then + run useradd -r -g "${username}" -c "${username}" -s "${nologin}" -d / "${username}" && return 0 + fi + + # FreeBSD + if check_cmd pw + then + run pw useradd "${username}" -d / -g "${username}" -s "${nologin}" && return 0 + fi + + # BusyBox + if check_cmd adduser + then + run adduser -D -G "${username}" "${username}" && return 0 + fi + + echo >&2 "Failed to add ${username} user account !" + + return 1 +} + +portable_add_group() { + local groupname="${1}" + + getent group "${groupname}" > /dev/null 2>&1 + [ $? -eq 0 ] && echo >&2 "Group '${groupname}' already exists." && return 0 + + echo >&2 "Adding ${groupname} user group ..." + + # Linux + if check_cmd groupadd + then + run groupadd -r "${groupname}" && return 0 + fi + + # FreeBSD + if check_cmd pw + then + run pw groupadd "${groupname}" && return 0 + fi + + # BusyBox + if check_cmd addgroup + then + run addgroup "${groupname}" && return 0 + fi + + echo >&2 "Failed to add ${groupname} user group !" + return 1 +} + +portable_add_user_to_group() { + local groupname="${1}" username="${2}" + + getent group "${groupname}" > /dev/null 2>&1 + [ $? -ne 0 ] && echo >&2 "Group '${groupname}' does not exist." && return 1 + + # find the user is already in the group + local users=$(getent group "${groupname}" | cut -d ':' -f 4) + if [[ ",${users}," =~ ,${username}, ]] + then + # username is already there + echo >&2 "User '${username}' is already in group '${groupname}'." + return 0 + else + # username is not in group + echo >&2 "Adding ${username} user to the ${groupname} group ..." + + # Linux + if check_cmd usermod + then + run usermod -a -G "${groupname}" "${username}" && return 0 + fi + + # FreeBSD + if check_cmd pw + then + run pw groupmod "${groupname}" -m "${username}" && return 0 + fi + + # BusyBox + if check_cmd addgroup + then + run addgroup "${username}" "${groupname}" && return 0 + fi + + echo >&2 "Failed to add user ${username} to group ${groupname} !" + return 1 + fi +} + +iscontainer() { + # man systemd-detect-virt + local cmd=$(which_cmd systemd-detect-virt) + if [ ! -z "${cmd}" -a -x "${cmd}" ] + then + "${cmd}" --container >/dev/null 2>&1 && return 0 + fi + + # /proc/1/sched exposes the host's pid of our init ! + # http://stackoverflow.com/a/37016302 + local pid=$( cat /proc/1/sched | head -n 1 | { IFS='(),#:' read name pid th threads; echo $pid; } ) + local p=$(( pid + 0 )) + [ ${pid} -ne 1 ] && return 0 + + # lxc sets environment variable 'container' + [ ! -z "${container}" ] && return 0 + + # docker creates /.dockerenv + # http://stackoverflow.com/a/25518345 + [ -f "/.dockerenv" ] && return 0 + + # ubuntu and debian supply /bin/running-in-container + # https://www.apt-browse.org/browse/ubuntu/trusty/main/i386/upstart/1.12.1-0ubuntu4/file/bin/running-in-container + if [ -x "/bin/running-in-container" ] + then + "/bin/running-in-container" >/dev/null 2>&1 && return 0 + fi + + return 1 +} + +issystemd() { + local pids p myns ns systemctl + + # if the directory /etc/systemd/system does not exit, it is not systemd + [ ! -d /etc/systemd/system ] && return 1 + + # if there is no systemctl command, it is not systemd + systemctl=$(which systemctl 2>/dev/null || command -v systemctl 2>/dev/null) + [ -z "${systemctl}" -o ! -x "${systemctl}" ] && return 1 + + # if pid 1 is systemd, it is systemd + [ "$(basename $(readlink /proc/1/exe) 2>/dev/null)" = "systemd" ] && return 0 + + # if systemd is not running, it is not systemd + pids=$(pidof systemd 2>/dev/null) + [ -z "${pids}" ] && return 1 + + # check if the running systemd processes are not in our namespace + myns="$(readlink /proc/self/ns/pid 2>/dev/null)" + for p in ${pids} + do + ns="$(readlink /proc/${p}/ns/pid 2>/dev/null)" + + # if pid of systemd is in our namespace, it is systemd + [ ! -z "${myns}" && "${myns}" = "${ns}" ] && return 0 + done + + # else, it is not systemd + return 1 +} diff --git a/netdata-installer.sh b/netdata-installer.sh index 606b6c76..95a02b5f 100755 --- a/netdata-installer.sh +++ b/netdata-installer.sh @@ -10,13 +10,33 @@ if [ "${netdata_source_dir}" != "${installer_dir}" -a "${installer_dir}" != "." echo >&2 "Warninng: you are currently in '${netdata_source_dir}' but the installer is in '${installer_dir}'." fi + +# ----------------------------------------------------------------------------- # reload the user profile + [ -f /etc/profile ] && . /etc/profile # make sure /etc/profile does not change our current directory cd "${netdata_source_dir}" || exit 1 + +# ----------------------------------------------------------------------------- +# load the required functions + +if [ -f "${installer_dir}/installer/functions.sh" ] + then + source "${installer_dir}/installer/functions.sh" || exit 1 +else + source "${netdata_source_dir}/installer/functions.sh" || exit 1 +fi + +# make sure we save all commands we run +run_logfile="netdata-installer.log" + + +# ----------------------------------------------------------------------------- # fix PKG_CHECK_MODULES error + if [ -d /usr/share/aclocal ] then ACLOCAL_PATH=${ACLOCAL_PATH-/usr/share/aclocal} @@ -46,46 +66,7 @@ printf "\n" >>netdata-installer.log REINSTALL_PWD="${PWD}" REINSTALL_COMMAND="$(printf "%q " "$0" "${@}"; printf "\n")" -banner() { - local l1=" ^" \ - l2=" |.-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-" \ - l3=" | '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' " \ - l4=" +----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+--->" \ - sp=" " \ - netdata="netdata" start end msg="${*}" - - [ ${#msg} -lt ${#netdata} ] && msg="${msg}${sp:0:$(( ${#netdata} - ${#msg}))}" - [ ${#msg} -gt $(( ${#l2} - 20 )) ] && msg="${msg:0:$(( ${#l2} - 23 ))}..." - - start="$(( ${#l2} / 2 - 4 ))" - [ $(( start + ${#msg} + 4 )) -gt ${#l2} ] && start=$((${#l2} - ${#msg} - 4)) - end=$(( ${start} + ${#msg} + 4 )) - - echo >&2 - echo >&2 "${l1}" - echo >&2 "${l2:0:start}${sp:0:2}${netdata}${sp:0:$((end - start - 2 - ${#netdata}))}${l2:end:$((${#l2} - end))}" - echo >&2 "${l3:0:start}${sp:0:2}${msg}${sp:0:2}${l3:end:$((${#l2} - end))}" - echo >&2 "${l4}" - echo >&2 -} - setcap="$(which setcap 2>/dev/null || command -v setcap 2>/dev/null)" -service="$(which service 2>/dev/null || command -v service 2>/dev/null)" -systemctl="$(which systemctl 2>/dev/null || command -v systemctl 2>/dev/null)" -service() { - local cmd="${1}" action="${2}" - - if [ ! -z "${service}" ] - then - run "${service}" "${cmd}" "${action}" - return $? - elif [ ! -z "${systemctl}" ] - then - run "${systemctl}" "${action}" "${cmd}" - return $? - fi - return 1 -} ME="$0" DONOTSTART=0 @@ -94,7 +75,7 @@ NETDATA_PREFIX= LIBS_ARE_HERE=0 usage() { - banner "installer command line options" + netdata_banner "installer command line options" cat < @@ -220,66 +201,74 @@ do fi done -banner "real-time performance monitoring, done right!" -cat < " + 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" else - read -p "Press ENTER to build and install netdata to your system > " + 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" fi fi build_error() { - banner "sorry, it failed to build..." + netdata_banner "sorry, it failed to build..." cat <>netdata-installer.log "# " - printf >>netdata-installer.log "%q " "${@}" - printf >>netdata-installer.log " ... " - - printf >&2 "\n" - printf >&2 ":-----------------------------------------------------------------------------\n" - printf >&2 "Running command (in $(pwd)):\n" - printf >&2 "\n" - printf >&2 "%q " "${@}" - printf >&2 "\n" - - "${@}" - - local ret=$? - if [ ${ret} -ne 0 ] - then - printf >>netdata-installer.log "FAILED!\n" - else - printf >>netdata-installer.log "OK\n" - fi - - return ${ret} -} - if [ ${LIBS_ARE_HERE} -eq 1 ] then shift @@ -424,6 +388,11 @@ fi trap build_error EXIT + +# ----------------------------------------------------------------------------- +echo >&2 +progress "Run autotools to configure the build environment" + if [ "$have_autotools" ] then run ./autogen.sh || exit 1 @@ -439,23 +408,19 @@ run ./configure \ # remove the build_error hook trap - EXIT -if [ -f src/netdata ] - then - echo >&2 "Cleaning a possibly old compilation ..." - run make clean -fi +# ----------------------------------------------------------------------------- +progress "Cleanup compilation directory" + +[ -f src/netdata ] && run make clean + +# ----------------------------------------------------------------------------- +progress "Compile netdata" -echo >&2 "Compiling netdata ..." run make -j${processors} || exit 1 -if [ "${BASH_VERSINFO[0]}" -ge "4" ] -then - declare -A configs_signatures=() - if [ -f "configs.signatures" ] - then - source "configs.signatures" || echo >&2 "ERROR: Failed to load configs.signatures !" - fi -fi + +# ----------------------------------------------------------------------------- +progress "Migrate configuration files for node.d.plugin and charts.d.plugin" # migrate existing configuration files # for node.d and charts.d @@ -498,6 +463,18 @@ if [ -d "${NETDATA_PREFIX}/etc/netdata" ] done fi +# ----------------------------------------------------------------------------- +progress "Backup existing netdata configuration before installing it" + +if [ "${BASH_VERSINFO[0]}" -ge "4" ] +then + declare -A configs_signatures=() + if [ -f "configs.signatures" ] + then + source "configs.signatures" || echo >&2 "ERROR: Failed to load configs.signatures !" + fi +fi + # backup user configurations installer_backup_suffix="${PID}.${RANDOM}" for x in $(find "${NETDATA_PREFIX}/etc/netdata/" -name '*.conf' -type f) @@ -510,7 +487,8 @@ do if [ -z "${md5sum}" -o ! -x "${md5sum}" ] then # we don't have md5sum - keep it - cp -p "${x}" "${x}.installer_backup.${installer_backup_suffix}" + echo >&2 "File '${TPUT_CYAN}${x}${TPUT_RESET}' ${TPUT_RET}is not known to distribution${TPUT_RESET}. Keeping it." + run cp -p "${x}" "${x}.installer_backup.${installer_backup_suffix}" else # find it relative filename f="${x/*\/etc\/netdata\//}" @@ -529,15 +507,15 @@ do if [ "${configs_signatures[${md5}]}" = "${f}" ] then # it is a stock version - don't keep it - echo >&2 "File '${x}' is stock version." + echo >&2 "File '${TPUT_CYAN}${x}${TPUT_RESET}' is stock version." else # edited by user - keep it - echo >&2 "File '${x}' has been edited by user." - cp -p "${x}" "${x}.installer_backup.${installer_backup_suffix}" + echo >&2 "File '${TPUT_CYAN}${x}${TPUT_RESET}' ${TPUT_RED} has been edited by user${TPUT_RESET}. Keeping it." + run cp -p "${x}" "${x}.installer_backup.${installer_backup_suffix}" fi else - echo >&2 "File '${x}' cannot be check for custom edits." - cp -p "${x}" "${x}.installer_backup.${installer_backup_suffix}" + echo >&2 "File '${TPUT_CYAN}${x}${TPUT_RESET}' ${TPUT_RET}cannot be checked for custom edits${TPUT_RESET}. Keeping it." + run cp -p "${x}" "${x}.installer_backup.${installer_backup_suffix}" fi fi @@ -547,161 +525,34 @@ do fi done -echo >&2 "Installing netdata ..." + +# ----------------------------------------------------------------------------- +progress "Install netdata" + run make install || exit 1 -# restore user configurations + +# ----------------------------------------------------------------------------- +progress "Restore user edited netdata configuration files" + for x in $(find "${NETDATA_PREFIX}/etc/netdata/" -name '*.conf' -type f) do if [ -f "${x}.installer_backup.${installer_backup_suffix}" ] then - cp -p "${x}.installer_backup.${installer_backup_suffix}" "${x}" - rm -f "${x}.installer_backup.${installer_backup_suffix}" + run cp -p "${x}.installer_backup.${installer_backup_suffix}" "${x}" && \ + run rm -f "${x}.installer_backup.${installer_backup_suffix}" fi done -echo >&2 "Fixing permissions ..." - -check_cmd() { - which "${1}" >/dev/null 2>&1 && return 0 - command -v "${1}" >/dev/null 2>&1 && return 0 - return 1 -} - -portable_add_user() { - local username="${1}" - - getent passwd "${username}" > /dev/null 2>&1 - [ $? -eq 0 ] && return 0 - - echo >&2 "Adding ${username} user account ..." - - local nologin="$(which nologin 2>/dev/null || command -v nologin 2>/dev/null || echo '/bin/false')" - # Linux - if check_cmd useradd - then - run useradd -r -g "${username}" -c "${username}" -s "${nologin}" -d / "${username}" && return 0 - fi - - # FreeBSD - if check_cmd pw - then - run pw useradd "${username}" -d / -g "${username}" -s "${nologin}" && return 0 - fi - - # BusyBox - if check_cmd adduser - then - run adduser -D -G "${username}" "${username}" && return 0 - fi - - echo >&2 "Failed to add ${username} user account !" - - return 1 -} - -portable_add_group() { - local groupname="${1}" - - getent group "${groupname}" > /dev/null 2>&1 - [ $? -eq 0 ] && return 0 - - echo >&2 "Adding ${groupname} user group ..." - - # Linux - if check_cmd groupadd - then - run groupadd -r "${groupname}" && return 0 - fi - - # FreeBSD - if check_cmd pw - then - run pw groupadd "${groupname}" && return 0 - fi - - # BusyBox - if check_cmd addgroup - then - run addgroup "${groupname}" && return 0 - fi - - echo >&2 "Failed to add ${groupname} user group !" - return 1 -} - -portable_add_user_to_group() { - local groupname="${1}" username="${2}" - - getent group "${groupname}" > /dev/null 2>&1 - [ $? -ne 0 ] && return 1 - - # find the user is already in the group - local users=$(getent group "${groupname}" | cut -d ':' -f 4) - if [[ ",${users}," =~ ,${username}, ]] - then - # username is already there - return 0 - else - # username is not in group - echo >&2 "Adding ${username} user to the ${groupname} group ..." - - # Linux - if check_cmd usermod - then - run usermod -a -G "${groupname}" "${username}" && return 0 - fi - - # FreeBSD - if check_cmd pw - then - run pw groupmod "${groupname}" -m "${username}" && return 0 - fi - - # BusyBox - if check_cmd addgroup - then - run addgroup "${username}" "${groupname}" && return 0 - fi - - echo >&2 "Failed to add user ${username} to group ${groupname} !" - return 1 - fi -} - -iscontainer() { - # man systemd-detect-virt - local cmd=$(which systemd-detect-virt 2>/dev/null || command -v systemd-detect-virt 2>/dev/null) - if [ ! -z "${cmd}" -a -x "${cmd}" ] - then - "${cmd}" --container >/dev/null 2>&1 && return 0 - fi - - # /proc/1/sched exposes the host's pid of our init ! - # http://stackoverflow.com/a/37016302 - local pid=$( cat /proc/1/sched | head -n 1 | { IFS='(),#:' read name pid th threads; echo $pid; } ) - local p=$(( pid + 0 )) - [ ${pid} -ne 1 ] && return 0 - - # lxc sets environment variable 'container' - [ ! -z "${container}" ] && return 0 - - # docker creates /.dockerenv - # http://stackoverflow.com/a/25518345 - [ -f "/.dockerenv" ] && return 0 +# ----------------------------------------------------------------------------- +progress "Fix generated files permissions" - # ubuntu and debian supply /bin/running-in-container - # https://www.apt-browse.org/browse/ubuntu/trusty/main/i386/upstart/1.12.1-0ubuntu4/file/bin/running-in-container - if [ -x "/bin/running-in-container" ] - then - "/bin/running-in-container" >/dev/null 2>&1 && return 0 - fi +run find ./system/ -type f -a \! -name \*.in -a \! -name Makefile\* -a \! -name \*.conf -a \! -name \*.service -a \! -name \*.logrotate -exec chmod 755 {} \; - return 1 -} -run find ./system/ -type f -a \! -name \*.in -a \! -name Makefile\* -a \! -name \*.conf -a \! -name \*.service -a \! -name \*.logrotate -exec chmod 755 {} \; +# ----------------------------------------------------------------------------- +progress "Add user netdata to required user groups" NETDATA_ADDED_TO_DOCKER=0 NETDATA_ADDED_TO_NGINX=0 @@ -712,31 +563,39 @@ if [ ${UID} -eq 0 ] then portable_add_group netdata portable_add_user netdata - portable_add_user_to_group docker netdata && NETDATA_ADDED_TO_DOCKER=1 - portable_add_user_to_group nginx netdata && NETDATA_ADDED_TO_NGINX=1 + portable_add_user_to_group docker netdata && NETDATA_ADDED_TO_DOCKER=1 + portable_add_user_to_group nginx netdata && NETDATA_ADDED_TO_NGINX=1 portable_add_user_to_group varnish netdata && NETDATA_ADDED_TO_VARNISH=1 portable_add_user_to_group haproxy netdata && NETDATA_ADDED_TO_HAPROXY=1 - portable_add_user_to_group adm netdata && NETDATA_ADDED_TO_ADM=1 + portable_add_user_to_group adm netdata && NETDATA_ADDED_TO_ADM=1 + run_ok +else + run_failed "The installer does not run as root." +fi +# ----------------------------------------------------------------------------- +progress "Install logrotate configuration for netdata" + +if [ ${UID} -eq 0 ] + then if [ -d /etc/logrotate.d -a ! -f /etc/logrotate.d/netdata ] then - echo >&2 "Adding netdata logrotate configuration ..." run cp system/netdata.logrotate /etc/logrotate.d/netdata fi if [ -f /etc/logrotate.d/netdata ] then - echo >&2 "Fixing netdata logrotate permissions ..." run chmod 644 /etc/logrotate.d/netdata fi fi # ----------------------------------------------------------------------------- -# load options from the configuration file +progress "Read installation options from netdata.conf" # create an empty config if it does not exist -[ ! -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ] && touch "${NETDATA_PREFIX}/etc/netdata/netdata.conf" +[ ! -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ] && \ + touch "${NETDATA_PREFIX}/etc/netdata/netdata.conf" # function to extract values from the config file config_option() { @@ -789,17 +648,14 @@ NETDATA_RUN_DIR="${NETDATA_PREFIX}/var/run" # ----------------------------------------------------------------------------- -# prepare the directories +progress "Fix permissions of netdata directories (using user '${NETDATA_USER}')" -# this is needed if NETDATA_PREFIX is not empty if [ ! -d "${NETDATA_RUN_DIR}" ] then - mkdir -p "${NETDATA_RUN_DIR}" || exit 1 + # this is needed if NETDATA_PREFIX is not empty + run mkdir -p "${NETDATA_RUN_DIR}" || exit 1 fi -echo >&2 -echo >&2 "Fixing directories (user: ${NETDATA_USER})..." - # --- conf dir ---- for x in "python.d" "charts.d" "node.d" @@ -887,33 +743,82 @@ fi # --- fix #1292 bug --- -[ -d "${NETDATA_PREFIX}/usr/libexec" ] && run chmod a+rX "${NETDATA_PREFIX}/usr/libexec" +[ -d "${NETDATA_PREFIX}/usr/libexec" ] && run chmod a+rX "${NETDATA_PREFIX}/usr/libexec" [ -d "${NETDATA_PREFIX}/usr/share/netdata" ] && run chmod a+rX "${NETDATA_PREFIX}/usr/share/netdata" + # ----------------------------------------------------------------------------- -# check if we can re-start netdata +progress "Install netdata at system init" -if [ ${DONOTSTART} -eq 1 ] - then - if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ] +installed_init_d=0 +install_non_systemd_init() { + [ "${UID}" != 0 ] && return 1 + + local key="unknown" + if [ -f /etc/os-release ] then - echo >&2 "Generating empty config file in: ${NETDATA_PREFIX}/etc/netdata/netdata.conf" - echo "# Get config from http://127.0.0.1:${NETDATA_PORT}/netdata.conf" >"${NETDATA_PREFIX}/etc/netdata/netdata.conf" + source /etc/os-release || return 1 + key="${ID}-${VERSION_ID}" - if [ "${UID}" -eq 0 ] + elif [ -f /etc/centos-release ] + then + key=$(&2 " enjoy real-time performance and health monitoring..." - exit 0 + + return 0 +} + +if [ "${UID}" -eq 0 ] + then + + if issystemd + then + # systemd is running on this system + + if [ ! -f /etc/systemd/system/netdata.service ] + then + echo >&2 "Installing systemd service..." + run cp system/netdata.service /etc/systemd/system/netdata.service && \ + run systemctl daemon-reload && \ + run systemctl enable netdata + fi + else + install_non_systemd_init + fi fi + # ----------------------------------------------------------------------------- -# stop a running netdata +# check if we can re-start netdata + +started=0 isnetdata() { if [ -d /proc/self ] @@ -963,7 +868,7 @@ stop_all_netdata() { myns="$(readlink /proc/self/ns/pid 2>/dev/null)" - echo >&2 "Stopping a (possibly) running netdata..." + # echo >&2 "Stopping a (possibly) running netdata (namespace '${myns}')..." for p in $(cat "${NETDATA_RUN_DIR}/netdata.pid" 2>/dev/null) \ $(cat /var/run/netdata.pid 2>/dev/null) \ @@ -979,111 +884,25 @@ stop_all_netdata() { done } -# ----------------------------------------------------------------------------- -# check for systemd - -issystemd() { - local pids p myns ns systemctl - - # if the directory /etc/systemd/system does not exit, it is not systemd - [ ! -d /etc/systemd/system ] && return 1 - - # if there is no systemctl command, it is not systemd - systemctl=$(which systemctl 2>/dev/null || command -v systemctl 2>/dev/null) - [ -z "${systemctl}" -o ! -x "${systemctl}" ] && return 1 - - # if pid 1 is systemd, it is systemd - [ "$(basename $(readlink /proc/1/exe) 2>/dev/null)" = "systemd" ] && return 0 - - # if systemd is not running, it is not systemd - pids=$(pidof systemd 2>/dev/null) - [ -z "${pids}" ] && return 1 - - # check if the running systemd processes are not in our namespace - myns="$(readlink /proc/self/ns/pid 2>/dev/null)" - for p in ${pids} - do - ns="$(readlink /proc/${p}/ns/pid 2>/dev/null)" - - # if pid of systemd is in our namespace, it is systemd - [ ! -z "${myns}" && "${myns}" = "${ns}" ] && return 0 - done - - # else, it is not systemd - return 1 -} - -installed_init_d=0 -install_non_systemd_init() { - [ "${UID}" != 0 ] && return 1 - - local key="unknown" - if [ -f /etc/os-release ] - then - source /etc/os-release || return 1 - key="${ID}-${VERSION_ID}" - - elif [ -f /etc/centos-release ] - then - key=$("${NETDATA_PREFIX}/etc/netdata/netdata.conf" - elif [ "${key}" = "CentOS release 6.8 (Final)" -o "${key}" = "amzn-2016.09" ] + if [ "${UID}" -eq 0 ] then - run cp system/netdata-init-d /etc/init.d/netdata && \ - run chmod 755 /etc/init.d/netdata && \ - run chkconfig netdata on && \ - installed_init_d=1 + chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf" fi + chmod 0644 "${NETDATA_PREFIX}/etc/netdata/netdata.conf" fi - return 0 -} - -started=0 -if [ "${UID}" -eq 0 ] - then +else - if issystemd - then - # systemd is running on this system + progress "Start netdata" - if [ ! -f /etc/systemd/system/netdata.service ] + if [ "${UID}" -eq 0 ] then - echo >&2 "Installing systemd service..." - run cp system/netdata.service /etc/systemd/system/netdata.service && \ - run systemctl daemon-reload && \ - run systemctl enable netdata - else - service netdata stop - fi - - stop_all_netdata - service netdata restart && started=1 - else - install_non_systemd_init - fi - - if [ ${started} -eq 0 ] - then - # check if we can use the system service service netdata stop stop_all_netdata service netdata restart && started=1 @@ -1092,89 +911,88 @@ if [ "${UID}" -eq 0 ] service netdata start && started=1 fi fi -fi -if [ ${started} -eq 0 ] -then - # still not started... + if [ ${started} -eq 0 ] + then + # still not started... - stop_all_netdata + stop_all_netdata + + echo >&2 "Starting netdata..." + run ${NETDATA_PREFIX}/usr/sbin/netdata -P ${NETDATA_RUN_DIR}/netdata.pid "${@}" + if [ $? -ne 0 ] + then + echo >&2 + echo >&2 "SORRY! FAILED TO START NETDATA!" + exit 1 + else + echo >&2 "OK. NetData Started!" + fi - echo >&2 "Starting netdata..." - run ${NETDATA_PREFIX}/usr/sbin/netdata -P ${NETDATA_RUN_DIR}/netdata.pid "${@}" - if [ $? -ne 0 ] - then echo >&2 - echo >&2 "SORRY! FAILED TO START NETDATA!" - exit 1 - else - echo >&2 "OK. NetData Started!" fi - echo >&2 -fi + # ----------------------------------------------------------------------------- + # save a config file, if it is not already there -# ----------------------------------------------------------------------------- -# save a config file, if it is not already there - -if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ] - then - echo >&2 - echo >&2 "-------------------------------------------------------------------------------" - echo >&2 - echo >&2 "Downloading default configuration from netdata..." - sleep 5 - - # remove a possibly obsolete download - [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" + if [ ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf" ] + then + echo >&2 + echo >&2 "-------------------------------------------------------------------------------" + echo >&2 + echo >&2 "Downloading default configuration from netdata..." + sleep 5 - # disable a proxy to get data from the local netdata - export http_proxy= - export https_proxy= + # remove a possibly obsolete download + [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" - # try wget - wget 2>/dev/null -O "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf" - ret=$? + # disable a proxy to get data from the local netdata + export http_proxy= + export https_proxy= - # try curl - if [ ${ret} -ne 0 -o ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] - then - curl -s -o "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf" + # try wget + wget 2>/dev/null -O "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf" ret=$? - fi - if [ ${ret} -eq 0 -a -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] - then - mv "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "${NETDATA_PREFIX}/etc/netdata/netdata.conf" - echo >&2 "New configuration saved for you to edit at ${NETDATA_PREFIX}/etc/netdata/netdata.conf" + # try curl + if [ ${ret} -ne 0 -o ! -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] + then + curl -s -o "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "http://localhost:${NETDATA_PORT}/netdata.conf" + ret=$? + fi - if [ "${UID}" -eq 0 ] + if [ ${ret} -eq 0 -a -s "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] then - chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf" + mv "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" "${NETDATA_PREFIX}/etc/netdata/netdata.conf" + echo >&2 "New configuration saved for you to edit at ${NETDATA_PREFIX}/etc/netdata/netdata.conf" + + if [ "${UID}" -eq 0 ] + then + chown "${NETDATA_USER}" "${NETDATA_PREFIX}/etc/netdata/netdata.conf" + fi + chmod 0664 "${NETDATA_PREFIX}/etc/netdata/netdata.conf" + else + echo >&2 "Cannnot download configuration from netdata daemon using url 'http://localhost:${NETDATA_PORT}/netdata.conf'" + [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" fi - chmod 0664 "${NETDATA_PREFIX}/etc/netdata/netdata.conf" - else - echo >&2 "Cannnot download configuration from netdata daemon using url 'http://localhost:${NETDATA_PORT}/netdata.conf'" - [ -f "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" ] && rm "${NETDATA_PREFIX}/etc/netdata/netdata.conf.new" fi fi # ----------------------------------------------------------------------------- -# Check for KSM +progress "Check KSM (kernel memory deduper)" ksm_is_available_but_disabled() { cat </sys/kernel/mm/ksm/run -echo 1000 >/sys/kernel/mm/ksm/sleep_millisecs + ${TPUT_YELLOW}${TPUT_BOLD}echo 1 >/sys/kernel/mm/ksm/run${TPUT_RESET} + ${TPUT_YELLOW}${TPUT_BOLD}echo 1000 >/sys/kernel/mm/ksm/sleep_millisecs${TPUT_RESET} If you enable it, you will save 40-60% of netdata memory. @@ -1184,8 +1002,7 @@ KSM1 ksm_is_not_available() { cat <netdata-uninstaller.sh <&2 "Uninstall script generated: ./netdata-uninstaller.sh" +echo >&2 "Uninstall script generated: ${TPUT_RED}${TPUT_BOLD}./netdata-uninstaller.sh${TPUT_RESET}" if [ -d .git ] then @@ -1538,13 +1347,32 @@ update && exit 0 REINSTALL chmod 755 netdata-updater.sh.new mv -f netdata-updater.sh.new netdata-updater.sh - echo >&2 "Update script generated : ./netdata-updater.sh" + echo >&2 "Update script generated : ${TPUT_GREEN}${TPUT_BOLD}./netdata-updater.sh${TPUT_RESET}" + echo >&2 + echo >&2 "${TPUT_DIM}${TPUT_BOLD}netdata-updater.sh${TPUT_RESET}${TPUT_DIM} can work from cron. It will trigger an email from cron" + echo >&2 "only if it fails (it does not print anything if it can update netdata).${TPUT_RESET}" + if [ "${UID}" -eq 0 -a -d "/etc/cron.daily" -a ! -f "/etc/cron.daily/netdata-updater.sh" ] + then + echo >&2 "${TPUT_DIM}Run this to automatically check and install netdata updates once per day:${TPUT_RESET}" + echo >&2 + echo >&2 "${TPUT_YELLOW}${TPUT_BOLD}ln -s ${PWD}/netdata-updater.sh /etc/cron.daily/netdata-updater.sh${TPUT_RESET}" + fi elif [ -f "netdata-updater.sh" ] then rm "netdata-updater.sh" fi -banner "is installed and running now!" +# ----------------------------------------------------------------------------- +echo >&2 +progress "We are done!" + +if [ ${started} -eq 1 ] + then + netdata_banner "is installed and running now!" +else + netdata_banner "is installed now!" +fi + echo >&2 " enjoy real-time performance and health monitoring..." echo >&2 exit 0 diff --git a/src/apps_plugin.c b/src/apps_plugin.c index 6996b380..af634c0a 100644 --- a/src/apps_plugin.c +++ b/src/apps_plugin.c @@ -2960,7 +2960,7 @@ static void parse_args(int argc, char **argv) "\n" " netdata apps.plugin %s\n" " Copyright (C) 2016-2017 Costa Tsaousis \n" - " Released under GNU Public License v3 or later.\n" + " Released under GNU General Public License v3 or later.\n" " All rights reserved.\n" "\n" " This program is a data collector plugin for netdata.\n" diff --git a/src/main.c b/src/main.c index e453107b..8dcc5d70 100644 --- a/src/main.c +++ b/src/main.c @@ -256,7 +256,7 @@ void help(int exitcode) { " +----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+--->\n" "\n" " Copyright (C) 2016-2017, Costa Tsaousis \n" - " Released under GNU Public License v3 or later.\n" + " Released under GNU General Public License v3 or later.\n" " All rights reserved.\n" "\n" " Home Page : https://my-netdata.io\n" @@ -332,8 +332,7 @@ static const char *verify_required_directory(const char *dir) { return dir; } -int main(int argc, char **argv) -{ +int main(int argc, char **argv) { char *hostname = "localhost"; int i, check_config = 0; int config_loaded = 0; @@ -507,6 +506,16 @@ int main(int argc, char **argv) } } +#ifdef _SC_OPEN_MAX + // close all open file descriptors, except the standard ones + // the caller may have left open files (lxc-attach has this issue) + { + int fd; + for(fd = (int) (sysconf(_SC_OPEN_MAX) - 1); fd > 2; fd--) + if(fd_is_valid(fd)) close(fd); + } +#endif + if(!config_loaded) load_config(NULL, 0); diff --git a/web/index.html b/web/index.html index 19a5fd5e..7bba3f4d 100644 --- a/web/index.html +++ b/web/index.html @@ -873,6 +873,7 @@ submenu_names: {}, data: null, hostname: 'netdata_server', // will be overwritten by the netdata server + version: 'unknown', categories: [], categories_idx: {}, families: [], @@ -1420,7 +1421,7 @@ sidebar += '
  • add more charts
  • '; sidebar += '
  • add more alarms
  • '; - sidebar += '
  • netdata on ' + data.hostname.toString() + ', collects every ' + ((data.update_every == 1)?'second':data.update_every.toString() + ' seconds') + ' ' + data.dimensions_count.toLocaleString() + ' metrics, presented as ' + data.charts_count.toLocaleString() + ' charts and monitored by ' + data.alarms_count.toLocaleString() + ' alarms, using ' + Math.round(data.rrd_memory_bytes / 1024 / 1024).toLocaleString() + ' MB of memory for ' + Math.round(data.history / (3600/data.update_every)).toLocaleString() + ' ' + ((data.history == (3600/data.update_every))?'hour':'hours').toString() + ' of real-time history.
  • '; + sidebar += '
  • netdata on ' + data.hostname.toString() + ', collects every ' + ((data.update_every == 1)?'second':data.update_every.toString() + ' seconds') + ' ' + data.dimensions_count.toLocaleString() + ' metrics, presented as ' + data.charts_count.toLocaleString() + ' charts and monitored by ' + data.alarms_count.toLocaleString() + ' alarms, using ' + Math.round(data.rrd_memory_bytes / 1024 / 1024).toLocaleString() + ' MB of memory for ' + Math.round(data.history / (3600/data.update_every)).toLocaleString() + ' ' + ((data.history == (3600/data.update_every))?'hour':'hours').toString() + ' of real-time history.
     
    netdata
    v' + data.version.toString() +'
  • '; sidebar += ''; div.innerHTML = html; document.getElementById('sidebar').innerHTML = sidebar; @@ -2252,11 +2253,13 @@ if(data !== null) { options.hostname = data.hostname; options.data = data; + options.version = data.version; netdataDashboard.os = data.os; // update the dashboard hostname document.getElementById('hostname').innerHTML = options.hostname; document.getElementById('hostname').href = NETDATA.serverDefault; + document.getElementById('netdataVersion').innerHTML = options.version; // update the dashboard title document.title = options.hostname + ' netdata dashboard'; @@ -2288,8 +2291,23 @@ document.getElementById('versionCheckLog').innerHTML = msg; } - function getNetdataVersion(callback) { - versionLog('Downloading installed version info from netdata...'); + function getNetdataCommitIdFromVersion() { + var s = options.version.split('-'); + + if(s.length !== 3) return null; + if(s[2][0] == 'g') { + var v = s[2].split('_')[0].substring(1, 8); + if(v.length === 7) { + versionLog('Installed git commit id of netdata is ' + v); + document.getElementById('netdataCommitId').innerHTML = v; + return v; + } + } + return null; + } + + function getNetdataCommitId(force, callback) { + versionLog('Downloading installed git commit id from netdata...'); $.ajax({ url: 'version.txt', @@ -2299,24 +2317,34 @@ }) .done(function(data) { data = data.replace(/(\r\n|\n|\r| |\t)/gm,""); - if(data.length !== 40) { - versionLog('Received version string is invalid.'); - callback(null); + + var c = getNetdataCommitIdFromVersion(); + if(c !== null && data.length === 40 && data.substring(0, 7) !== c) { + versionLog('Installed files commit id and internal netdata git commit id do not match'); + data = c; } - else { - versionLog('Installed version of netdata is ' + data); - document.getElementById('netdataVersion').innerHTML = data; + + if(data.length >= 7) { + versionLog('Installed git commit id of netdata is ' + data); + document.getElementById('netdataCommitId').innerHTML = data.substring(0, 7); callback(data); } }) .fail(function() { - versionLog('Failed to download installed version info from netdata!'); - callback(null); + versionLog('Failed to download installed git commit id from netdata!'); + + if(force === true) { + var c = getNetdataCommitIdFromVersion(); + if(c === null) versionLog('Cannot find the git commit id of netdata.'); + callback(c); + } + else + callback(null); }); } function getGithubLatestCommit(callback) { - versionLog('Downloading latest version info from github...'); + versionLog('Downloading latest git commit id info from github...'); $.ajax({ url: 'https://api.github.com/repos/firehol/netdata/commits', @@ -2324,17 +2352,17 @@ cache: false }) .done(function(data) { - versionLog('Latest version info from github is ' + data[0].sha); + versionLog('Latest git commit id from github is ' + data[0].sha); callback(data[0].sha); }) .fail(function() { - versionLog('Failed to download installed version info from github!'); + versionLog('Failed to download installed git commit id from github!'); callback(null); }); } - function checkForUpdate(callback) { - getNetdataVersion(function(sha1) { + function checkForUpdate(force, callback) { + getNetdataCommitId(force, function(sha1) { if(sha1 === null) callback(null, null); getGithubLatestCommit(function(sha2) { @@ -2364,26 +2392,26 @@ } } - checkForUpdate(function(sha1, sha2) { + checkForUpdate(force, function(sha1, sha2) { var save = false; if(sha1 === null) { save = false; - versionLog('

    Failed to get your netdata version!

    You can always get the latest version of netdata from its github page.

    '); + versionLog('

    Failed to get your netdata git commit id!

    You can always get the latest netdata from its github page.

    '); } else if(sha2 === null) { save = false; - versionLog('

    Failed to get the latest version from github.

    You can always get the latest version of netdata from its github page.

    '); + versionLog('

    Failed to get the latest git commit id from github.

    You can always get the latest netdata from its github page.

    '); } else if(sha1 === sha2) { save = true; - versionLog('

    You already have the latest version of netdata!

    No update yet?
    Probably, we need some motivation to keep going on!

    If you haven\'t already, give netdata a Star at its github page.

    '); + versionLog('

    You already have the latest netdata!

    No update yet?
    Probably, we need some motivation to keep going on!

    If you haven\'t already, give netdata a Star at its github page.

    '); } else { save = true; var compare = 'https://github.com/firehol/netdata/compare/' + sha1.toString() + '...' + sha2.toString(); - versionLog('

    New version of netdata available!

    Latest version: ' + sha2.toString() + '

    Click here for the changes log since your installed version, and
    click here for directions on updating your netdata installation.

    We suggest to review the changes log for new features you may be interested, or important bug fixes you may need.
    Keeping your netdata updated, is generally a good idea.

    '); + versionLog('

    New version of netdata available!

    Latest commit: ' + sha2.substring(0, 7).toString() + '

    Click here for the changes log since your installed version, and
    click here for directions on updating your netdata installation.

    We suggest to review the changes log for new features you may be interested, or important bug fixes you may need.
    Keeping your netdata updated, is generally a good idea.

    '); document.getElementById('update_badge').innerHTML = '!'; } @@ -3312,7 +3340,8 @@