#!/bin/sh # # $FreeBSD: head/net-mgmt/netdata/files/netdata.in 530693 2020-04-04 17:26:35Z mandree $ # # 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"