]> git.proxmox.com Git - mirror_frr.git/blob - solaris/quagga.init.in
delete CVS keywords
[mirror_frr.git] / solaris / quagga.init.in
1 #!/sbin/sh
2 #
3 # Copyright 2007 Sun Microsystems, Inc. All rights reserved.
4 # Use is subject to license terms.
5 #
6 # This file is part of Quagga.
7 #
8 # Quagga is free software; you can redistribute it and/or modify it
9 # under the terms of the GNU General Public License as published by the
10 # Free Software Foundation; either version 2, or (at your option) any
11 # later version.
12 #
13 # Quagga is distributed in the hope that it will be useful, but
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
19 # along with Quagga; see the file COPYING. If not, write to the Free
20 # Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
21 # 02111-1307, USA.
22 #
23 # Starts/stops the given daemon
24
25 SMFINCLUDE=/lib/svc/share/smf_include.sh
26 ROUTEADMINCLUDE=/lib/svc/share/routing_include.sh
27 GLOBAL_OPTIONS="PAfiug"
28 DAEMON_PATH=@sbindir@
29 USER=@enable_user@
30 GROUP=@enable_group@
31
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
77 # handle upgrade of SUNWzebra to Quagga
78 if [ -d "/etc/quagga" -a ! -f "/etc/quagga/${DAEMON}.conf" ] ; then
79 if [ -f "/etc/sfw/zebra/${DAEMON}.conf" ] ; then
80 cp "/etc/sfw/zebra/${DAEMON}.conf" \
81 "/etc/quagga/${DAEMON}.conf.upgrade" \
82 || exit $SMF_EXIT_ERR_FATAL
83 chown "${USER}:${GROUP}" "/etc/quagga/${DAEMON}.conf.upgrade" \
84 || exit $SMF_EXIT_ERR_FATAL
85 chmod 0600 "/etc/quagga/${DAEMON}.conf.upgrade" \
86 || exit $SMF_EXIT_ERR_FATAL
87 mv "/etc/quagga/${DAEMON}.conf.upgrade" "/etc/quagga/${DAEMON}.conf" \
88 || exit $SMF_EXIT_ERR_FATAL
89 fi
90 fi
91
92 if [ ! -f "/etc/quagga/${DAEMON}.conf" ] ; then
93 touch "/etc/quagga/${DAEMON}.conf.new" \
94 || exit $SMF_EXIT_ERR_FATAL
95 chown "${USER}:${GROUP}" "/etc/quagga/${DAEMON}.conf.new" \
96 || exit $SMF_EXIT_ERR_FATAL
97 chmod 0600 "/etc/quagga/${DAEMON}.conf.new" \
98 || exit $SMF_EXIT_ERR_FATAL
99 mv "/etc/quagga/${DAEMON}.conf.new" "/etc/quagga/${DAEMON}.conf" \
100 || exit $SMF_EXIT_ERR_FATAL
101 fi
102 }
103
104 # Relevant to S10+
105 quagga_is_globalzone () {
106 if [ "${QUAGGA_INIT_ZONENAME:=`/sbin/zonename`}" = "global" \
107 -o `/sbin/zonename -t` = "exclusive" ]; then
108 return 0
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
149 # certain daemons need zebra
150 routeadm_zebra_enable () {
151
152 if [ "$DAEMON" = "zebra" ]; then
153 return
154 fi
155
156 enable_zebra=`/usr/bin/svcprop -p \
157 routing/enable_zebra $SMF_FMRI 2> /dev/null`
158 if [ "$enable_zebra" != "false" ]; then
159 zenabled=`/usr/bin/svcprop -p general/enabled zebra:quagga`
160 zenabledt=`/usr/bin/svcprop -p general_ovr/enabled zebra:quagga`
161 if [ "$zenabled" = "true" -o "$zenabledt" = "true" ]; then
162 /usr/sbin/svcadm disable zebra:quagga
163 /usr/sbin/svcadm enable -st zebra:quagga
164 else
165 /usr/sbin/svcadm enable -st zebra:quagga
166 fi
167 if [ "$?" != "0" ]; then
168 echo "Could not enable zebra:quagga"
169 exit $SMF_EXIT_ERR_FATAL
170 fi
171 fi
172 }
173
174 # Include smf functions, if available. If not, define smf_present to indicate
175 # there is no SMF. Should allow this script to work pre-S10.
176 if [ -f "$SMFINCLUDE" ] ; then
177 . "$SMFINCLUDE";
178
179 # source the SMF-routeadm include if present..
180 if [ -f "$ROUTEADMINCLUDE" ] ; then
181 . "$ROUTEADMINCLUDE"
182 fi
183 else
184 # pre-SMF system, fake up any functions and exit codes
185 # which SMFINCLUDE usually provides.
186 smf_present () {
187 return 1
188 }
189 SMF_EXIT_OK=0;
190 SMF_EXIT_ERR_CONFIG=96;
191 SMF_EXIT_ERR_FATAL=95;
192 fi
193
194 # if there's no SMF, set some default DAEMON_ARGS
195 smf_present || DAEMON_ARGS=""
196
197 usage () {
198 if smf_present ; then
199 echo "Usage: $0 <daemon>";
200 else
201 echo "Usage: $0 <stop|start> <daemon> <daemon arguments>";
202 fi
203 echo "The --pid_file argument is implied";
204 echo "This help message: $0 <help|usage>";
205 }
206
207 # parse arguments, different according to SMF or not.
208 case $1 in
209 'help' | 'usage')
210 usage
211 exit $SMF_EXIT_OK
212 ;;
213 esac
214
215 if smf_present ; then
216 QUAGGA_METHOD="start"
217 else
218 QUAGGA_METHOD="$1"
219 shift;
220 fi
221
222 DAEMON="$1"
223
224 # daemon path must be given
225 if [ -z "$DAEMON_PATH/$DAEMON" ]; then
226 usage
227 exit $SMF_EXIT_ERR_FATAL
228 fi
229
230 # only bgpd is suitable for running in a non-global zone, at this
231 # time.
232 case "${DAEMON}" in
233 bgpd)
234 ;;
235 zebra | ospfd | ospf6d | ripd | ripngd )
236 quagga_is_globalzone || exit $SMF_EXIT_OK
237 ;;
238 *)
239 usage
240 exit $SMF_EXIT_ERR_CONFIG;
241 ;;
242 esac
243
244 # Older Quagga SMF packages pass daemon args on the commandline
245 # Newer SMF routeadm model uses properties for each argument
246 # so we must handle that.
247 if [ smf_present -a -f "$ROUTEADMINCLUDE" ]; then
248 handle_routeadm_upgrade $DAEMON;
249 DAEMON_ARGS=`routeadm_daemon_args`;
250 routeadm_zebra_enable $DAEMON;
251 else
252 if [ $# -gt 0 ] ; then
253 shift
254 DAEMON_ARGS="$@"
255 fi
256 fi
257
258 upgrade_config "$DAEMON"
259
260 if [ ! -f "@sysconfdir@/${DAEMON}.conf" ] ; then
261 echo "Could not find config file, @sysconfdir@/${DAEMON}.conf"
262 exit $SMF_EXIT_ERR_CONFIG
263 fi
264
265 # we need @quagga_statedir@ to exist, it probably is on tmpfs.
266 if [ ! -d @quagga_statedir@ ] ; then
267 mkdir -p @quagga_statedir@
268 chown @enable_user@:@enable_group@ @quagga_statedir@
269 chmod 751 @quagga_statedir@
270 fi
271
272 PIDFILE="@quagga_statedir@/${DAEMON}.pid"
273
274 start () {
275 if [ ! -x "$DAEMON_PATH/$DAEMON" ] ; then
276 echo "Error, could not find daemon, $DAEMON_PATH/$DAEMON"
277 exit $SMF_EXIT_ERR_FATAL
278 fi
279 eval exec $DAEMON_PATH/$DAEMON $DAEMON_ARGS --pid_file ${PIDFILE} &
280 }
281
282 stop_by_pidfile () {
283 if [ -f "${PIDFILE}" ]; then
284 /usr/bin/kill -TERM `/usr/bin/cat "${PIDFILE}"`
285 fi
286 }
287
288 case "$QUAGGA_METHOD" in
289 'start')
290 start
291 ;;
292 'stop')
293 stop_by_pidfile
294 ;;
295
296 *)
297 usage
298 exit $SMF_EXIT_ERR_FATAL
299 ;;
300 esac
301
302 exit $SMF_EXIT_OK;