aboutsummaryrefslogtreecommitdiffstats
path: root/net-mgmt
diff options
context:
space:
mode:
authorMatthias Andree <mandree@FreeBSD.org>2020-04-04 23:41:26 +0800
committerMatthias Andree <mandree@FreeBSD.org>2020-04-04 23:41:26 +0800
commitde951c087ff647f3823278a81c523f8d49941616 (patch)
tree5d8e0e335f33ab275f47cfccb520bacdf91374cd /net-mgmt
parentb8e7118f9c1ffc61a86b96eb52d762d8d3da8499 (diff)
downloadfreebsd-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/Makefile2
-rw-r--r--net-mgmt/netdata/files/netdata.in95
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"