diff options
author | Matthias Andree <mandree@FreeBSD.org> | 2020-04-04 23:41:26 +0800 |
---|---|---|
committer | Matthias Andree <mandree@FreeBSD.org> | 2020-04-04 23:41:26 +0800 |
commit | de951c087ff647f3823278a81c523f8d49941616 (patch) | |
tree | 5d8e0e335f33ab275f47cfccb520bacdf91374cd /net-mgmt | |
parent | b8e7118f9c1ffc61a86b96eb52d762d8d3da8499 (diff) | |
download | freebsd-ports-gnome-de951c087ff647f3823278a81c523f8d49941616.tar.gz freebsd-ports-gnome-de951c087ff647f3823278a81c523f8d49941616.tar.zst freebsd-ports-gnome-de951c087ff647f3823278a81c523f8d49941616.zip |
net-mgmt/netdata rc script overhaul, fix termination, user config
This script overhaul does the following:
- Read "run as user" from the netdata configuration file,
and use that to override the default user "netdata", in case
it is not set in /etc/rc.conf* and friends.
- Kill all children of the PID in the netdata_pid file, too,
because 1.20.0 would leave some plugin processing lingering.
- Timeout the termination after (configurable) 30 seconds and
issue SIGKILL
- Cleanup the netdata_pid file after stop, so that a subsequent
start with a less privileged user (say, start as root, stop,
start as netdata) will work properly.
- Document all variables, including the all-new netdata_stop_maxwait,
in the header of the script.
- Quote parameter expansions where appropriate.
PR: 235006
Reported by: Dries Michiels <driesm.michiels@gmail.com>
Reviewed by: Dries Michiels <driesm.michiels@gmail.com>
Approved by: maintainer timeout (mmohki@, ~ 1 year)
Diffstat (limited to 'net-mgmt')
-rw-r--r-- | net-mgmt/netdata/Makefile | 2 | ||||
-rw-r--r-- | net-mgmt/netdata/files/netdata.in | 95 |
2 files changed, 92 insertions, 5 deletions
diff --git a/net-mgmt/netdata/Makefile b/net-mgmt/netdata/Makefile index 8540b3c64eb6..86b0a77bbab8 100644 --- a/net-mgmt/netdata/Makefile +++ b/net-mgmt/netdata/Makefile @@ -3,7 +3,7 @@ PORTNAME= netdata PORTVERSION= 1.20.0 -PORTREVISION= 1 +PORTREVISION= 2 DISTVERSIONPREFIX= v CATEGORIES= net-mgmt diff --git a/net-mgmt/netdata/files/netdata.in b/net-mgmt/netdata/files/netdata.in index bfbdbe04c2a0..d1c93e6609c5 100644 --- a/net-mgmt/netdata/files/netdata.in +++ b/net-mgmt/netdata/files/netdata.in @@ -13,24 +13,111 @@ # Set it to "YES" to enable netdata. # netdata_args (str): Custom additional arguments to be passed # to netdata (default empty). +# netdata_conf (str): Custom configuration file for netdata +# (default: %%ETCDIR%%/netdata.conf) +# netdata_user (str): Custom user to run netdata as +# (default: read from netdata_conf if +# it is set there, or "netdata") +# netdata_stop_maxwait (int): Maximum time to wait for termination on stop +# before resorting to SIGKILL to stop netdata. # +# Written 2017 - 2019 Mahdi Mokhtari (mmokhi@) +# Written 2020 Matthias Andree (mandree@) with support by Dries Michiels + . /etc/rc.subr name="netdata" rcvar=netdata_enable +SED=/usr/bin/sed +TR=/usr/bin/tr load_rc_config $name : ${netdata_enable="NO"} -: ${netdata_user="netdata"} +: ${netdata_conf="%%ETCDIR%%/${name}.conf"} : ${netdata_pid="%%NETDATA_PERST%%/${name}.pid"} +: # netdata_user set below, it may also be pulled from the netdata_conf file +: ${netdata_stop_maxwait=30} + +# read netdata_conf and print the "run as user =" RHS, or print nothing if unset +# +# only permits ASCII letters, digits, dash, underscore - does not permit +# backtick, curly braces, angle brackets, backslash although passwd(5) would +# permit these. +get_user_from_conf() { + $SED -n '/^\[global\]/,/^\[/{s/^[[:space:]]*run as user.*=[[:space:]]*\(.*\)[[:space:]]*$/\1/p;}' "${netdata_conf}" \ + | $TR -c -d 'a-zA-Z0-9_-' +} + +# check if the rc.conf* file set and netdata_conf agree on the name to run the bundle as +check_user_consistency() { + cfusr=$(get_user_from_conf) + if [ -z "$cfusr" -o "$cfusr" = "${netdata_user}" ] ; then return 0 ; fi + echo >&2 "$0: ERROR: ${netdata_conf} sets 'run as user = $cfusr', but rc.conf* sets '${netdata_user}'. Both must be consistent." + return 1 +} + +# this is more or less a copy of /etc/rc.subr from 12.1-RELEASE +# around Early April 2020, but with a timeout, killing children, +# and SIGKILL added because sometimes netdata hangs. +stop_cmd() { + rc_pid=$(check_pidfile "${netdata_pid}" "${procname}") + if [ -z "$rc_pid" ] ; then + [ -n "$fc_fast" ] && return 0 + _run_rc_notrunning + return 1 + fi + _prefix= + slave_pids=$(pgrep -P $rc_pid) + echo "Stopping ${name}." + _list="$rc_pid $slave_pids" + kill -TERM $_list + wtim=0 + while :; do + _nlist= + for _j in $_list ; do + if kill -0 $_j 2>/dev/null ; then + _nlist="$_nlist $_j" + [ -n "$_prefix" ] && sleep 1 + fi + done + if [ -z "$_nlist" ] ; then + break + fi + _list=$_nlist + echo -n ${_prefix:-"Waiting for PIDS: "}$_list + _prefix=", " + pwait -t 2 $_list 2>/dev/null + wtim=$(($wtim + 3)) + if [ $wtim -gt ${netdata_stop_maxwait} ] ; then + echo -n "${_prefix}SIGKILL $_list" + kill -KILL $_list + break + fi + done + [ -n "$_prefix" ] && echo . +} + +stop_postcmd() { + rm -f "${netdata_pid}" +} + +# obtain default user, first from configuration, or default to "netdata" + _netdata_user_default=$(get_user_from_conf) +: ${_netdata_user_default:="netdata"} +# and then, if rc.conf* don't set it, use the default +: ${netdata_user="${_netdata_user_default}"} procname="%%PREFIX%%/sbin/${name}" command="/usr/sbin/daemon" -command_args="-c -f ${procname} -u ${netdata_user} -P ${netdata_pid} ${netdata_args}" +command_args="-c -f \"${procname}\" -u \"${netdata_user}\" -P \"${netdata_pid}\" ${netdata_args}" -required_files="%%ETCDIR%%/${name}.conf" +required_files="${netdata_conf}" -run_rc_command "$1" +start_precmd=check_user_consistency +stop_cmd=stop_cmd +stop_postcmd=stop_postcmd # netdata always leaves its pid file behind. + +run_rc_command "$1" |