diff options
Diffstat (limited to '')
-rw-r--r-- | installer/functions.sh | 340 |
1 files changed, 327 insertions, 13 deletions
diff --git a/installer/functions.sh b/installer/functions.sh index 36d10ec7..c847ba1c 100644 --- a/installer/functions.sh +++ b/installer/functions.sh @@ -1,5 +1,9 @@ # no shebang necessary - this is a library to be sourced +# make sure we have a UID +[ -z "${UID}" ] && UID="$(id -u)" + + # ----------------------------------------------------------------------------- # checking the availability of commands @@ -81,7 +85,7 @@ setup_terminal() { return 0 } -setup_terminal +setup_terminal || echo >/dev/null progress() { echo >&2 " --- ${TPUT_DIM}${TPUT_BOLD}${*}${TPUT_RESET} --- " @@ -120,13 +124,13 @@ systemctl_cmd="$(which_cmd systemctl)" service() { local cmd="${1}" action="${2}" - if [ ! -z "${service_cmd}" ] + if [ ! -z "${systemctl_cmd}" ] then - run "${service_cmd}" "${cmd}" "${action}" + run "${systemctl_cmd}" "${action}" "${cmd}" return $? - elif [ ! -z "${systemctl_cmd}" ] + elif [ ! -z "${service_cmd}" ] then - run "${systemctl_cmd}" "${action}" "${cmd}" + run "${service_cmd}" "${cmd}" "${action}" return $? fi return 1 @@ -142,9 +146,22 @@ run_failed() { printf >&2 "${TPUT_BGRED}${TPUT_WHITE}${TPUT_BOLD} FAILED ${TPUT_RESET} ${*} \n\n" } +ESCAPED_PRINT_METHOD= +printf "%q " test >/dev/null 2>&1 +[ $? -eq 0 ] && ESCAPED_PRINT_METHOD="printfq" +escaped_print() { + if [ "${ESCAPED_PRINT_METHOD}" = "printfq" ] + then + printf "%q " "${@}" + else + printf "%s" "${*}" + fi + return 0 +} + run_logfile="/dev/null" run() { - local user="${USER}" dir="$(basename "${PWD}")" info info_console + local user="${USER--}" dir="${PWD}" info info_console if [ "${UID}" = "0" ] then @@ -156,11 +173,11 @@ run() { fi printf >> "${run_logfile}" "${info}" - printf >> "${run_logfile}" "%q " "${@}" + escaped_print >> "${run_logfile}" "${@}" printf >> "${run_logfile}" " ... " printf >&2 "${info_console}${TPUT_BOLD}${TPUT_YELLOW}" - printf >&2 "%q " "${@}" + escaped_print >&2 "${@}" printf >&2 "${TPUT_RESET}\n" "${@}" @@ -178,10 +195,53 @@ run() { return ${ret} } +getent_cmd="$(which_cmd getent)" +portable_check_user_exists() { + local username="${1}" found= + + if [ ! -z "${getent_cmd}" ] + then + "${getent_cmd}" passwd "${username}" >/dev/null 2>&1 + return $? + fi + + found="$(cut -d ':' -f 1 </etc/passwd | grep "^${username}$")" + [ "${found}" = "${username}" ] && return 0 + return 1 +} + +portable_check_group_exists() { + local groupname="${1}" found= + + if [ ! -z "${getent_cmd}" ] + then + "${getent_cmd}" group "${groupname}" >/dev/null 2>&1 + return $? + fi + + found="$(cut -d ':' -f 1 </etc/group | grep "^${groupname}$")" + [ "${found}" = "${groupname}" ] && return 0 + return 1 +} + +portable_check_user_in_group() { + local username="${1}" groupname="${2}" users= + + if [ ! -z "${getent_cmd}" ] + then + users="$(getent group "${groupname}" | cut -d ':' -f 4)" + else + users="$(grep "^${groupname}:" </etc/group | cut -d ':' -f 4)" + fi + + [[ ",${users}," =~ ,${username}, ]] && return 0 + return 1 +} + portable_add_user() { local username="${1}" - getent passwd "${username}" > /dev/null 2>&1 + portable_check_user_exists "${username}" [ $? -eq 0 ] && echo >&2 "User '${username}' already exists." && return 0 echo >&2 "Adding ${username} user account ..." @@ -214,7 +274,7 @@ portable_add_user() { portable_add_group() { local groupname="${1}" - getent group "${groupname}" > /dev/null 2>&1 + portable_check_group_exists "${groupname}" [ $? -eq 0 ] && echo >&2 "Group '${groupname}' already exists." && return 0 echo >&2 "Adding ${groupname} user group ..." @@ -244,12 +304,11 @@ portable_add_group() { portable_add_user_to_group() { local groupname="${1}" username="${2}" - getent group "${groupname}" > /dev/null 2>&1 + portable_check_group_exists "${groupname}" [ $? -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}, ]] + if portable_check_user_in_group "${username}" "${groupname}" then # username is already there echo >&2 "User '${username}' is already in group '${groupname}'." @@ -342,3 +401,258 @@ issystemd() { # else, it is not systemd return 1 } + +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/redhat-release ] + then + key=$(</etc/redhat-release) + fi + + if [ -d /etc/init.d -a ! -f /etc/init.d/netdata ] + then + if [ "${key}" = "gentoo" ] + then + echo >&2 "Installing OpenRC init file..." + run cp system/netdata-openrc /etc/init.d/netdata && \ + run chmod 755 /etc/init.d/netdata && \ + run rc-update add netdata default && \ + return 0 + + elif [ "${key}" = "debian-7" \ + -o "${key}" = "ubuntu-12.04" \ + -o "${key}" = "ubuntu-14.04" \ + ] + then + echo >&2 "Installing LSB init file..." + run cp system/netdata-lsb /etc/init.d/netdata && \ + run chmod 755 /etc/init.d/netdata && \ + run update-rc.d netdata defaults && \ + run update-rc.d netdata enable && \ + return 0 + elif [[ "${key}" =~ ^(amzn-201[567]|CentOS release 6|Red Hat Enterprise Linux Server release 6).* ]] + then + echo >&2 "Installing init.d file..." + run cp system/netdata-init-d /etc/init.d/netdata && \ + run chmod 755 /etc/init.d/netdata && \ + run chkconfig netdata on && \ + return 0 + else + echo >&2 "I don't know what init file to install on system '${key}'. Open a github issue to help us fix it." + return 1 + fi + elif [ -f /etc/init.d/netdata ] + then + echo >&2 "file '/etc/init.d/netdata' already exists." + return 0 + else + echo >&2 "I don't know what init file to install on system '${key}'. Open a github issue to help us fix it." + fi + + return 1 +} + +NETDATA_START_CMD="netdata" +NETDATA_STOP_CMD="killall netdata" + +install_netdata_service() { + if [ "${UID}" -eq 0 ] + then + if issystemd + then + # systemd is running on this system + NETDATA_START_CMD="systemctl start netdata" + NETDATA_STOP_CMD="systemctl stop netdata" + + 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 && \ + return 0 + else + echo >&2 "file '/etc/systemd/system/netdata.service' already exists." + return 0 + fi + else + install_non_systemd_init + local ret=$? + + if [ ${ret} -eq 0 ] + then + NETDATA_START_CMD="service netdata start" + NETDATA_STOP_CMD="service netdata stop" + fi + + return ${ret} + fi + fi + + return 1 +} + + +# ----------------------------------------------------------------------------- +# stop netdata + +pidisnetdata() { + if [ -d /proc/self ] + then + [ -z "$1" -o ! -f "/proc/$1/stat" ] && return 1 + [ "$(cat "/proc/$1/stat" | cut -d '(' -f 2 | cut -d ')' -f 1)" = "netdata" ] && return 0 + return 1 + fi + return 0 +} + +stop_netdata_on_pid() { + local pid="${1}" ret=0 count=0 + + pidisnetdata ${pid} || return 0 + + printf >&2 "Stopping netdata on pid ${pid} ..." + while [ ! -z "$pid" -a ${ret} -eq 0 ] + do + if [ ${count} -gt 45 ] + then + echo >&2 "Cannot stop the running netdata on pid ${pid}." + return 1 + fi + + count=$(( count + 1 )) + + run kill ${pid} 2>/dev/null + ret=$? + + test ${ret} -eq 0 && printf >&2 "." && sleep 2 + done + + echo >&2 + if [ ${ret} -eq 0 ] + then + echo >&2 "SORRY! CANNOT STOP netdata ON PID ${pid} !" + return 1 + fi + + echo >&2 "netdata on pid ${pid} stopped." + return 0 +} + +stop_all_netdata() { + local p myns ns + + myns="$(readlink /proc/self/ns/pid 2>/dev/null)" + + # echo >&2 "Stopping a (possibly) running netdata (namespace '${myns}')..." + + for p in \ + $(cat /var/run/netdata.pid 2>/dev/null) \ + $(cat /var/run/netdata/netdata.pid 2>/dev/null) \ + $(pidof netdata 2>/dev/null) + do + ns="$(readlink /proc/${p}/ns/pid 2>/dev/null)" + + if [ -z "${myns}" -o -z "${ns}" -o "${myns}" = "${ns}" ] + then + stop_netdata_on_pid ${p} + fi + done +} + +# ----------------------------------------------------------------------------- +# restart netdata + +restart_netdata() { + local netdata="${1}" + shift + + local started=0 + + progress "Start netdata" + + if [ "${UID}" -eq 0 ] + then + service netdata stop + stop_all_netdata + service netdata restart && started=1 + + if [ ${started} -eq 0 ] + then + service netdata start && started=1 + fi + fi + + if [ ${started} -eq 0 ] + then + # still not started... + + run stop_all_netdata + run "${netdata}" "${@}" + return $? + fi + + return 0 +} + +# ----------------------------------------------------------------------------- +# install netdata logrotate + +install_netdata_logrotate() { + if [ ${UID} -eq 0 ] + then + if [ -d /etc/logrotate.d ] + then + if [ ! -f /etc/logrotate.d/netdata ] + then + run cp system/netdata.logrotate /etc/logrotate.d/netdata + fi + + if [ -f /etc/logrotate.d/netdata ] + then + run chmod 644 /etc/logrotate.d/netdata + fi + + return 0 + fi + fi + + return 1 +} + +# ----------------------------------------------------------------------------- +# add netdata user and group + +NETDATA_ADDED_TO_DOCKER=0 +NETDATA_ADDED_TO_NGINX=0 +NETDATA_ADDED_TO_VARNISH=0 +NETDATA_ADDED_TO_HAPROXY=0 +NETDATA_ADDED_TO_ADM=0 +NETDATA_ADDED_TO_NSD=0 +NETDATA_ADDED_TO_PROXY=0 +NETDATA_ADDED_TO_SQUID=0 +add_netdata_user_and_group() { + if [ ${UID} -eq 0 ] + then + portable_add_group netdata || return 1 + portable_add_user netdata || return 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 nsd netdata && NETDATA_ADDED_TO_NSD=1 + portable_add_user_to_group proxy netdata && NETDATA_ADDED_TO_PROXY=1 + portable_add_user_to_group squid netdata && NETDATA_ADDED_TO_SQUID=1 + return 0 + fi + + return 1 +} |