mirror of
https://git.freebsd.org/ports.git
synced 2025-05-15 16:51:52 -04:00
123 lines
3.5 KiB
Bash
123 lines
3.5 KiB
Bash
#!/bin/sh
|
|
|
|
# PROVIDE: netdata
|
|
# REQUIRE: LOGIN
|
|
# KEYWORD: shutdown
|
|
|
|
#
|
|
# Add the following line to /etc/rc.conf to enable netdata:
|
|
# netdata_enable (bool): Set to "NO" by default.
|
|
# 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_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
|
|
err 1 "${netdata_conf} sets 'run as user = $cfusr', but rc.conf* sets '${netdata_user}'. Both must be consistent."
|
|
}
|
|
|
|
# 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=
|
|
echo "Stopping ${name}."
|
|
_list="$rc_pid $(pgrep -P $rc_pid)"
|
|
kill -TERM $_list
|
|
pwait -t 3 $_list 2>/dev/null
|
|
wtim=3
|
|
while :; do
|
|
_nlist=
|
|
for _j in $_list ; do
|
|
if kill -0 $_j 2>/dev/null ; then
|
|
_nlist="$_nlist${_nlist:+" "}$_j"
|
|
fi
|
|
done
|
|
if [ -z "$_nlist" ] ; then
|
|
break
|
|
fi
|
|
_list=$_nlist
|
|
echo -n ${_prefix:-"Waiting for PIDS: "}$_list
|
|
_prefix=", "
|
|
sleep 1
|
|
pwait -t 2 $_list 2>/dev/null
|
|
if [ $? -eq 124 ] ; then
|
|
wtim=$(($wtim + 3))
|
|
if [ $wtim -ge ${netdata_stop_maxwait} ] ; then
|
|
[ -n "$_prefix" ] && echo .
|
|
_prefix=
|
|
warn "${procname} has not terminated in ${netdata_stop_maxwait} s. Using SIGKILL $_list."
|
|
kill -KILL $_list
|
|
break
|
|
fi
|
|
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}"
|
|
|
|
required_files="${netdata_conf}"
|
|
|
|
start_precmd=check_user_consistency
|
|
|
|
stop_cmd=stop_cmd
|
|
stop_postcmd=stop_postcmd # netdata always leaves its pid file behind.
|
|
|
|
run_rc_command "$1"
|