summaryrefslogtreecommitdiffstats
path: root/tools/frrinit.sh.in
blob: 428d57c55b3d29f7668a42adae5de838c8d1d8bf (plain)
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
124
125
126
127
128
129
130
131
132
133
134
135
#!/bin/bash
#
### BEGIN INIT INFO
# Provides: frr
# Required-Start: $local_fs $network $remote_fs $syslog
# Required-Stop: $local_fs $network $remote_fs $syslog
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop the FRR routing suite
# Description: FRR is a routing suite for IP routing protocols like
#              BGP, OSPF, RIP and others. This script contols the main
#              "watchfrr" daemon.
### END INIT INFO
#
# This is the main init script for FRR.  It mostly wraps frrcommon.sh which
# provides the actual functions to start/stop/restart things.
#

if [ -r "/lib/lsb/init-functions" ]; then
	. /lib/lsb/init-functions
else
	log_success_msg() {
		echo "$@"
	}
	log_warning_msg() {
		echo "$@" >&2
	}
	log_failure_msg() {
		echo "$@" >&2
	}
fi

# "/usr/lib/frr/frrinit.sh start somenamespace"
FRR_PATHSPACE="$2"

self="`dirname $0`"
if [ -r "$self/frrcommon.sh" ]; then
	. "$self/frrcommon.sh"
else
	. "@CFG_SBIN@/frrcommon.sh"
fi

case "$1" in
start)
	daemon_list daemons
	watchfrr_options="$watchfrr_options $daemons"
	daemon_start watchfrr
	;;
stop)
	daemon_stop watchfrr
	all_stop --reallyall
	exit ${still_running:-0}
	;;

restart|force-reload)
	daemon_stop watchfrr
	all_stop --reallyall

	daemon_list daemons
	watchfrr_options="$watchfrr_options $daemons"
	daemon_start watchfrr
	;;

status)
	fail=0
	print_status watchfrr || fail=1
	all_status || fail=1
	exit $fail
	;;

reload)
	if [ ! -x "$RELOAD_SCRIPT" ]; then
		log_failure_msg "The frr-pythontools package is required for reload functionality."
		exit 1
	fi

	# systemd doesn't set WATCHDOG_USEC for reload commands.
	watchfrr_pidfile="$V_PATH/watchfrr.pid"
	watchfrr_pid="`cat \"$watchfrr_pidfile\"`"
	watchfrr_cmdline="`tr '\0' '\n' < /proc/$watchfrr_pid/cmdline`"
	if [ -d "/proc/$watchfrr_pid" ]; then
		wdt="`tr '\0' '\n' < /proc/$watchfrr_pid/environ | grep '^WATCHDOG_USEC='`"
		wdt="${wdt#WATCHDOG_USEC=}"
		[ -n "$wdt" ] && : ${WATCHDOG_USEC:=$wdt}
		[ -n "$WATCHDOG_USEC" ] && export WATCHDOG_USEC
	fi

	# restart watchfrr to pick up added daemons.
	# NB: This will NOT cause the other daemons to be restarted.
	daemon_list enabled_daemons disabled_daemons
	watchfrr_options="$watchfrr_options $enabled_daemons"
	daemon_stop watchfrr && \
		daemon_start watchfrr

	# If we disable an arbitrary daemon and do reload,
	# disabled daemon is still running and we should stop it.
	for daemon in $disabled_daemons; do
		if grep -q "$daemon" <<< "$watchfrr_cmdline"; then
			daemon_stop "$daemon" &
			pids="$pids $!"
		fi
	done

	for pid in $pids; do
		wait "$pid"
	done

	# make systemd not kill watchfrr after ExecReload completes
	# 3 goats were sacrificed to restore sanity after coding this
	watchfrr_pid="`cat \"$watchfrr_pidfile\"`"
	if [ -f "/proc/$watchfrr_pid/cgroup" -a -d "/sys/fs/cgroup/systemd" ]; then
		cg="`egrep '^[0-9]+:name=systemd:' \"/proc/$watchfrr_pid/cgroup\"`"
		cg="${cg#*:*:}"

		cgmain="$cg"
		cgmain="${cgmain%/.control}"
		cgmain="${cgmain%/control}"

		[ -n "$cg" -a "$cg" != "$cgmain" ] && \
			echo "$watchfrr_pid" > "/sys/fs/cgroup/systemd/$cgmain/tasks"
	fi

	NEW_CONFIG_FILE="${2:-$C_PATH/frr.conf}"
	[ ! -r $NEW_CONFIG_FILE ] && log_failure_msg "Unable to read new configuration file $NEW_CONFIG_FILE" && exit 1
	"$RELOAD_SCRIPT" --reload --bindir "$B_PATH" --confdir "$C_PATH" --rundir "$V_PATH" "$NEW_CONFIG_FILE" `echo $nsopt`
	exit 0
	;;

*)
	echo "Usage:"
	echo "    ${0} <start|stop|restart|force-reload|reload|status> [namespace]"
	echo "    ${0} stop namespace1"
	exit 1
	;;
esac