]>
Commit | Line | Data |
---|---|---|
1b414a17 | 1 | #!/sbin/sh |
2 | # | |
c2be59ba | 3 | # Copyright 2007 Sun Microsystems, Inc. All rights reserved. |
1b414a17 | 4 | # Use is subject to license terms. |
5 | # | |
447a8fe9 | 6 | # This file is part of FRRouting. |
def09df7 | 7 | # |
447a8fe9 | 8 | # FRRouting is free software; you can redistribute it and/or modify |
7f8512d9 | 9 | # it under the terms of the GNU General Public License as published by the |
def09df7 PJ |
10 | # Free Software Foundation; either version 2, or (at your option) any |
11 | # later version. | |
12 | # | |
447a8fe9 | 13 | # FRRouting is distributed in the hope that it will be useful, but |
def09df7 PJ |
14 | # WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 | # General Public License for more details. | |
17 | # | |
18 | # You should have received a copy of the GNU General Public License | |
447a8fe9 | 19 | # along with FRRouting; see the file COPYING. If not, write to |
7f8512d9 MW |
20 | # the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
21 | # Boston, MA 02111-1307, USA. | |
def09df7 | 22 | # |
75db03eb | 23 | # Starts/stops the given daemon |
1b414a17 | 24 | |
25 | SMFINCLUDE=/lib/svc/share/smf_include.sh | |
c2be59ba PJ |
26 | ROUTEADMINCLUDE=/lib/svc/share/routing_include.sh |
27 | GLOBAL_OPTIONS="PAfiug" | |
75db03eb | 28 | DAEMON_PATH=@sbindir@ |
c2be59ba PJ |
29 | USER=@enable_user@ |
30 | GROUP=@enable_group@ | |
1b414a17 | 31 | |
c2be59ba PJ |
32 | # handle upgrade of daemon-args SMF property to new routeadm properties |
33 | # used during upgrade too by routeadm. | |
34 | # relevant to S10U4+ only. | |
35 | handle_routeadm_upgrade () { | |
36 | GLOBAL_OPTIONS="PAfiug" | |
37 | ||
38 | daemon_args=`get_daemon_args $SMF_FMRI` | |
39 | ||
40 | if [ -n "$daemon_args" ]; then | |
41 | set_daemon_value_property "$SMF_FMRI" "$daemon_args" \ | |
42 | "$GLOBAL_OPTIONS" "P" vty_port 0 | |
43 | set_daemon_value_property "$SMF_FMRI" "$daemon_args" \ | |
44 | "$GLOBAL_OPTIONS" "A" vty_address | |
45 | set_daemon_value_property "$SMF_FMRI" "$daemon_args" \ | |
46 | "$GLOBAL_OPTIONS" "f" config_file | |
47 | set_daemon_value_property "$SMF_FMRI" "$daemon_args" \ | |
48 | "$GLOBAL_OPTIONS" "i" pid_file | |
49 | set_daemon_value_property "$SMF_FMRI" "$daemon_args" \ | |
50 | "$GLOBAL_OPTIONS" "u" user | |
51 | set_daemon_value_property "$SMF_FMRI" "$daemon_args" \ | |
52 | "$GLOBAL_OPTIONS" "g" group | |
53 | ||
54 | case "$1" in | |
55 | zebra) | |
56 | set_daemon_boolean_property "$SMF_FMRI" "$daemon_args" \ | |
57 | "${GLOBAL_OPTIONS}b" "b" batch true false | |
58 | ;; | |
59 | ripd|ripngd) | |
60 | set_daemon_boolean_property "$SMF_FMRI" "$daemon_args" \ | |
61 | "${GLOBAL_OPTIONS}r" "r" retain true false | |
62 | ;; | |
63 | bgpd) | |
64 | set_daemon_boolean_property "$SMF_FMRI" "$daemon_args" \ | |
65 | "${GLOBAL_OPTIONS}rnp" "r" retain true false | |
66 | set_daemon_boolean_property "$SMF_FMRI" "$daemon_args" \ | |
67 | "${GLOBAL_OPTIONS}rnp" "n" no_kernel true false | |
68 | set_daemon_value_property "$SMF_FMRI" "$daemon_args" \ | |
69 | "${GLOBAL_OPTIONS}rnp" "p" bgp_port | |
70 | esac | |
71 | clear_daemon_args $SMF_FMRI | |
72 | fi | |
73 | } | |
74 | ||
75 | upgrade_config () { | |
76 | DAEMON=$1 | |
447a8fe9 | 77 | # handle upgrade of SUNWzebra to FRRouting |
7f8512d9 | 78 | if [ -d "/etc/frr" -a ! -f "/etc/frr/${DAEMON}.conf" ] ; then |
c2be59ba PJ |
79 | if [ -f "/etc/sfw/zebra/${DAEMON}.conf" ] ; then |
80 | cp "/etc/sfw/zebra/${DAEMON}.conf" \ | |
7f8512d9 | 81 | "/etc/frr/${DAEMON}.conf.upgrade" \ |
c2be59ba | 82 | || exit $SMF_EXIT_ERR_FATAL |
7f8512d9 | 83 | chown "${USER}:${GROUP}" "/etc/frr/${DAEMON}.conf.upgrade" \ |
c2be59ba | 84 | || exit $SMF_EXIT_ERR_FATAL |
7f8512d9 | 85 | chmod 0600 "/etc/frr/${DAEMON}.conf.upgrade" \ |
c2be59ba | 86 | || exit $SMF_EXIT_ERR_FATAL |
7f8512d9 | 87 | mv "/etc/frr/${DAEMON}.conf.upgrade" "/etc/frr/${DAEMON}.conf" \ |
c2be59ba PJ |
88 | || exit $SMF_EXIT_ERR_FATAL |
89 | fi | |
90 | fi | |
91 | ||
7f8512d9 MW |
92 | if [ ! -f "/etc/frr/${DAEMON}.conf" ] ; then |
93 | touch "/etc/frr/${DAEMON}.conf.new" \ | |
c2be59ba | 94 | || exit $SMF_EXIT_ERR_FATAL |
7f8512d9 | 95 | chown "${USER}:${GROUP}" "/etc/frr/${DAEMON}.conf.new" \ |
c2be59ba | 96 | || exit $SMF_EXIT_ERR_FATAL |
7f8512d9 | 97 | chmod 0600 "/etc/frr/${DAEMON}.conf.new" \ |
c2be59ba | 98 | || exit $SMF_EXIT_ERR_FATAL |
7f8512d9 | 99 | mv "/etc/frr/${DAEMON}.conf.new" "/etc/frr/${DAEMON}.conf" \ |
c2be59ba PJ |
100 | || exit $SMF_EXIT_ERR_FATAL |
101 | fi | |
102 | } | |
103 | ||
104 | # Relevant to S10+ | |
7f8512d9 MW |
105 | frr_is_globalzone () { |
106 | if [ "${FRR_INIT_ZONENAME:=`/sbin/zonename`}" = "global" \ | |
c2be59ba | 107 | -o `/sbin/zonename -t` = "exclusive" ]; then |
75db03eb | 108 | return 0 |
c2be59ba PJ |
109 | else |
110 | return 1 | |
111 | fi | |
112 | } | |
113 | ||
114 | routeadm_daemon_args () { | |
115 | # globals | |
116 | args="`get_daemon_option_from_property $SMF_FMRI config_file f`" | |
117 | args="${args} `get_daemon_option_from_property $SMF_FMRI vty_port P`" | |
118 | args="${args} `get_daemon_option_from_property $SMF_FMRI vty_address A`" | |
119 | args="${args} `get_daemon_option_from_property $SMF_FMRI pid_file i`" | |
120 | ||
121 | # user and group we need for config file upgrade.. | |
122 | SMF_USER=`get_routeadm_property $SMF_FMRI user` | |
123 | SMF_GROUP=`get_routeadm_property()$SMF_FMRI group` | |
124 | if [ "${SMF_USER}" ] ; then | |
125 | USER="${SMF_USER}" | |
126 | args="${args} -u ${SMF_USER}" | |
127 | fi | |
128 | if [ "${SMF_GROUP}" ] ; then | |
129 | GROUP="${SMF_GROUP}" | |
130 | args="${args} -g ${SMF_GROUP}" | |
131 | fi | |
132 | ||
133 | case $1 in | |
134 | zebra) | |
135 | args="${args} `get_daemon_option_from_boolean_property $SMF_FMRI batch -b true`" | |
136 | ;; | |
137 | ripd|ripngd) | |
138 | args="${args} `get_daemon_option_from_boolean_property $SMF_FMRI retain -r true`" | |
139 | ;; | |
140 | bgpd) | |
141 | args="${args} `get_daemon_option_from_boolean_property $SMF_FMRI retain -r true`" | |
142 | args="${args} `get_daemon_option_from_boolean_property $SMF_FMRI no_kernel -n true`" | |
143 | args="${args} `get_daemon_option_from_property $SMF_FMRI bgp_port p 179`" | |
144 | ;; | |
145 | esac | |
146 | echo ${args} | |
147 | } | |
148 | ||
75db03eb PJ |
149 | # Include smf functions, if available. If not, define smf_present to indicate |
150 | # there is no SMF. Should allow this script to work pre-S10. | |
1b414a17 | 151 | if [ -f "$SMFINCLUDE" ] ; then |
152 | . "$SMFINCLUDE"; | |
c2be59ba PJ |
153 | |
154 | # source the SMF-routeadm include if present.. | |
155 | if [ -f "$ROUTEADMINCLUDE" ] ; then | |
156 | . "$ROUTEADMINCLUDE" | |
157 | fi | |
75db03eb PJ |
158 | else |
159 | # pre-SMF system, fake up any functions and exit codes | |
160 | # which SMFINCLUDE usually provides. | |
161 | smf_present () { | |
162 | return 1 | |
163 | } | |
164 | SMF_EXIT_OK=0; | |
165 | SMF_EXIT_ERR_CONFIG=96; | |
166 | SMF_EXIT_ERR_FATAL=95; | |
1b414a17 | 167 | fi |
75db03eb PJ |
168 | |
169 | # if there's no SMF, set some default DAEMON_ARGS | |
170 | smf_present || DAEMON_ARGS="" | |
1b414a17 | 171 | |
172 | usage () { | |
75db03eb | 173 | if smf_present ; then |
c2be59ba | 174 | echo "Usage: $0 <daemon>"; |
75db03eb PJ |
175 | else |
176 | echo "Usage: $0 <stop|start> <daemon> <daemon arguments>"; | |
177 | fi | |
178 | echo "The --pid_file argument is implied"; | |
179 | echo "This help message: $0 <help|usage>"; | |
180 | } | |
1b414a17 | 181 | |
75db03eb | 182 | # parse arguments, different according to SMF or not. |
1b414a17 | 183 | case $1 in |
184 | 'help' | 'usage') | |
75db03eb | 185 | usage |
c2be59ba | 186 | exit $SMF_EXIT_OK |
75db03eb | 187 | ;; |
1b414a17 | 188 | esac |
189 | ||
75db03eb | 190 | if smf_present ; then |
7f8512d9 | 191 | FRR_METHOD="start" |
75db03eb | 192 | else |
7f8512d9 | 193 | FRR_METHOD="$1" |
75db03eb | 194 | shift; |
1b414a17 | 195 | fi |
196 | ||
75db03eb | 197 | DAEMON="$1" |
1b414a17 | 198 | |
75db03eb PJ |
199 | # daemon path must be given |
200 | if [ -z "$DAEMON_PATH/$DAEMON" ]; then | |
201 | usage | |
202 | exit $SMF_EXIT_ERR_FATAL | |
203 | fi | |
204 | ||
205 | # only bgpd is suitable for running in a non-global zone, at this | |
206 | # time. | |
207 | case "${DAEMON}" in | |
75db03eb | 208 | bgpd) |
e24f0638 | 209 | ;; |
c2be59ba | 210 | zebra | ospfd | ospf6d | ripd | ripngd ) |
7f8512d9 | 211 | frr_is_globalzone || exit $SMF_EXIT_OK |
1b414a17 | 212 | ;; |
213 | *) | |
75db03eb PJ |
214 | usage |
215 | exit $SMF_EXIT_ERR_CONFIG; | |
1b414a17 | 216 | ;; |
217 | esac | |
218 | ||
447a8fe9 | 219 | # Older FRRouting SMF packages pass daemon args on the commandline |
c2be59ba PJ |
220 | # Newer SMF routeadm model uses properties for each argument |
221 | # so we must handle that. | |
222 | if [ smf_present -a -f "$ROUTEADMINCLUDE" ]; then | |
223 | handle_routeadm_upgrade $DAEMON; | |
224 | DAEMON_ARGS=`routeadm_daemon_args`; | |
c2be59ba PJ |
225 | else |
226 | if [ $# -gt 0 ] ; then | |
227 | shift | |
228 | DAEMON_ARGS="$@" | |
229 | fi | |
230 | fi | |
231 | ||
232 | upgrade_config "$DAEMON" | |
233 | ||
234 | if [ ! -f "@sysconfdir@/${DAEMON}.conf" ] ; then | |
235 | echo "Could not find config file, @sysconfdir@/${DAEMON}.conf" | |
236 | exit $SMF_EXIT_ERR_CONFIG | |
237 | fi | |
238 | ||
7f8512d9 MW |
239 | # we need @frr_statedir@ to exist, it probably is on tmpfs. |
240 | if [ ! -d @frr_statedir@ ] ; then | |
241 | mkdir -p @frr_statedir@ | |
242 | chown @enable_user@:@enable_group@ @frr_statedir@ | |
243 | chmod 751 @frr_statedir@ | |
9b78d052 | 244 | fi |
245 | ||
7f8512d9 | 246 | PIDFILE="@frr_statedir@/${DAEMON}.pid" |
75db03eb | 247 | |
1b414a17 | 248 | start () { |
c2be59ba PJ |
249 | if [ ! -x "$DAEMON_PATH/$DAEMON" ] ; then |
250 | echo "Error, could not find daemon, $DAEMON_PATH/$DAEMON" | |
251 | exit $SMF_EXIT_ERR_FATAL | |
252 | fi | |
253 | eval exec $DAEMON_PATH/$DAEMON $DAEMON_ARGS --pid_file ${PIDFILE} & | |
1b414a17 | 254 | } |
255 | ||
3523bea8 | 256 | stop_by_pidfile () { |
1b414a17 | 257 | if [ -f "${PIDFILE}" ]; then |
258 | /usr/bin/kill -TERM `/usr/bin/cat "${PIDFILE}"` | |
259 | fi | |
260 | } | |
261 | ||
7f8512d9 | 262 | case "$FRR_METHOD" in |
1b414a17 | 263 | 'start') |
75db03eb | 264 | start |
1b414a17 | 265 | ;; |
266 | 'stop') | |
3523bea8 | 267 | stop_by_pidfile |
1b414a17 | 268 | ;; |
269 | ||
1b414a17 | 270 | *) |
271 | usage | |
c2be59ba | 272 | exit $SMF_EXIT_ERR_FATAL |
1b414a17 | 273 | ;; |
274 | esac | |
275 | ||
276 | exit $SMF_EXIT_OK; |