summaryrefslogtreecommitdiff
path: root/net-mgmt/netdata/files/netdata.in
blob: c070b886b57613d4e1d6e1bb110b45054bc8d27b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/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"