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
|