|
1 #!/sbin/sh |
|
2 # |
|
3 # |
|
4 # CDDL HEADER START |
|
5 # |
|
6 # The contents of this file are subject to the terms of the |
|
7 # Common Development and Distribution License (the "License"). |
|
8 # You may not use this file except in compliance with the License. |
|
9 # |
|
10 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE |
|
11 # or http://www.opensolaris.org/os/licensing. |
|
12 # See the License for the specific language governing permissions |
|
13 # and limitations under the License. |
|
14 # |
|
15 # When distributing Covered Code, include this CDDL HEADER in each |
|
16 # file and include the License file at usr/src/OPENSOLARIS.LICENSE. |
|
17 # If applicable, add the following below this CDDL HEADER, with the |
|
18 # fields enclosed by brackets "[]" replaced with your own identifying |
|
19 # information: Portions Copyright [yyyy] [name of copyright owner] |
|
20 # |
|
21 # CDDL HEADER END |
|
22 # |
|
23 # |
|
24 |
|
25 # |
|
26 # Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. |
|
27 # |
|
28 |
|
29 . /lib/svc/share/smf_include.sh |
|
30 . /lib/svc/share/net_include.sh |
|
31 |
|
32 typeset -r OVS_OVSDB_FMRI=svc:/application/openvswitch/ovsdb-server:default |
|
33 typeset -r OVS_VSWITCHD_FMRI=svc:/application/openvswitch/vswitch-server:default |
|
34 |
|
35 typeset -r OVS_USRLIB_DIR=/usr/lib/ovs |
|
36 typeset -r OVS_VARLIB_DIR=/var/lib/ovs |
|
37 typeset -r OVS_TMP_DIR=/var/run/ovs |
|
38 typeset -r OVS_LOG_DIR=/var/log/ovs |
|
39 |
|
40 typeset -r OVS_USER=_ovs |
|
41 typeset -r OVS_GROUP=_ovs |
|
42 |
|
43 typeset -r OVS_SBIN_DIR=/usr/sbin |
|
44 typeset -r OVSDB_TOOL=${OVS_SBIN_DIR}/ovsdb-tool |
|
45 typeset -r OVS_VSCTL=${OVS_SBIN_DIR}/ovs-vsctl |
|
46 |
|
47 typeset -r OVS_VSWITCHD=ovs-vswitchd |
|
48 typeset -r OVSDB_SERVER=ovsdb-server |
|
49 typeset -r OVS_CLEAN=ovs-clean.py |
|
50 typeset -r OVSDB_SERVER_PATH=${OVS_USRLIB_DIR}/${OVSDB_SERVER} |
|
51 typeset -r OVS_VSWITCHD_PATH=${OVS_USRLIB_DIR}/${OVS_VSWITCHD} |
|
52 typeset -r OVS_CLEAN_PATH=${OVS_USRLIB_DIR}/${OVS_CLEAN} |
|
53 |
|
54 typeset -r OVSDB_REMOTE=${OVS_TMP_DIR}/db.sock |
|
55 |
|
56 typeset -r PFEXEC=/usr/bin/pfexec |
|
57 typeset -r MKDIR=/usr/bin/mkdir |
|
58 typeset -r CHOWN=/usr/bin/chown |
|
59 typeset -r PKILL=/usr/bin/pkill |
|
60 typeset -r DLADM=/usr/sbin/dladm |
|
61 typeset -r FLOWADM=/usr/sbin/flowadm |
|
62 |
|
63 errlog () { |
|
64 echo $1 >&2 |
|
65 } |
|
66 |
|
67 create_ovs_tempdir() { |
|
68 if [[ ! -d ${OVS_TMP_DIR} ]]; then |
|
69 ${PFEXEC} ${MKDIR} -m 775 ${OVS_TMP_DIR} || exit $SMF_EXIT_ERR_CONFIG |
|
70 ${PFEXEC} ${CHOWN} ${OVS_USER}:${OVS_GROUP} ${OVS_TMP_DIR} |
|
71 fi |
|
72 } |
|
73 |
|
74 start_ovsdb_server() { |
|
75 typeset -i OVSDB_INIT=0 |
|
76 typeset -r OVSDB_DATABASE=${OVS_VARLIB_DIR}/etc/conf.db |
|
77 |
|
78 create_ovs_tempdir |
|
79 |
|
80 if [[ ! -f ${OVSDB_DATABASE} ]]; then |
|
81 typeset -r OVSDB_SCHEMA=${OVS_USRLIB_DIR}/share/vswitch.ovsschema |
|
82 |
|
83 echo "Creating ${OVSDB_DATABASE} from ${OVSDB_SCHEMA}" |
|
84 ${OVSDB_TOOL} create ${OVSDB_DATABASE} ${OVSDB_SCHEMA} |
|
85 if [ $? -ne 0 ]; then |
|
86 errlog "Error creating database, exiting" |
|
87 return 1 |
|
88 fi |
|
89 OVSDB_INIT=1 |
|
90 fi |
|
91 |
|
92 typeset -r OVSDB_LOGFILE=${OVS_LOG_DIR}/ovsdb-server.log |
|
93 typeset -r OVSDB_PIDFILE=${OVS_TMP_DIR}/ovsdb-server.pid |
|
94 |
|
95 ${OVSDB_SERVER_PATH} ${OVSDB_DATABASE} \ |
|
96 -vconsole:emer -vsyslog:err -vfile:info \ |
|
97 --remote=punix:${OVSDB_REMOTE} \ |
|
98 --remote=db:Open_vSwitch,Open_vSwitch,manager_options \ |
|
99 --private-key=db:Open_vSwitch,SSL,private_key \ |
|
100 --certificate=db:Open_vSwitch,SSL,certificate \ |
|
101 --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert \ |
|
102 --no-chdir --log-file=${OVSDB_LOGFILE} \ |
|
103 --pidfile=${OVSDB_PIDFILE} \ |
|
104 --detach |
|
105 if [ $? -ne 0 ]; then |
|
106 errlog "${OVSDB_SERVER_PATH} failed with $?" |
|
107 exit $SMF_EXIT_ERR_FATAL |
|
108 fi |
|
109 |
|
110 if [ ${OVSDB_INIT} -ne 0 ]; then |
|
111 echo "Initializing OVSDB database" |
|
112 ${OVS_VSCTL} --no-wait init |
|
113 if [ $? -ne 0 ]; then |
|
114 errlog "${OVSDB_VSCTL} failed with $?" |
|
115 exit $SMF_EXIT_ERR_FATAL |
|
116 fi |
|
117 fi |
|
118 } |
|
119 |
|
120 stop_vswitch_server() { |
|
121 typeset BRIDGENAME |
|
122 |
|
123 $PKILL -x -u ${OVS_USER} -z `smf_zonename` ${OVS_VSWITCHD} |
|
124 if [[ $? -ne 0 && $? -ne 1 ]]; then |
|
125 errlog "pkill of ${OVS_VSWITCHD} failed with $?" |
|
126 fi |
|
127 |
|
128 ${OVS_VSCTL} list-br | |
|
129 while read BRIDGENAME; do |
|
130 ${OVS_CLEAN_PATH} delete-vnic ${BRIDGENAME} |
|
131 if [ $? -ne 0 ]; then |
|
132 errlog "Error $? removing ${BRIDGENAME} VNIC" |
|
133 fi |
|
134 done |
|
135 ${OVS_CLEAN_PATH} reset-ofports |
|
136 if [ $? -ne 0 ]; then |
|
137 errlog "Error $? resetting OF ports" |
|
138 fi |
|
139 |
|
140 ${OVS_CLEAN_PATH} remove-flows |
|
141 if [ $? -ne 0 ]; then |
|
142 errlog "Error $? removing OF flows" |
|
143 fi |
|
144 |
|
145 ${OVS_CLEAN_PATH} delete-etherstub ovs.etherstub0 |
|
146 if [ $? -ne 0 ]; then |
|
147 errlog "Error $? deleting the OVS etherstub" |
|
148 fi |
|
149 |
|
150 } |
|
151 |
|
152 start_vswitch_server() { |
|
153 typeset -r VSWITCHD_LOGFILE=${OVS_LOG_DIR}/ovs-vswitchd.log |
|
154 typeset -r VSWITCHD_PIDFILE=${OVS_TMP_DIR}/ovs-vswitchd.pid |
|
155 |
|
156 create_ovs_tempdir |
|
157 |
|
158 ${OVS_VSWITCHD_PATH} unix:${OVSDB_REMOTE} \ |
|
159 -vconsole:emer -vsyslog:err -vfile:info --mlockall --no-chdir \ |
|
160 --log-file=${VSWITCHD_LOGFILE} \ |
|
161 --pidfile=${VSWITCHD_PIDFILE} \ |
|
162 --detach |
|
163 if [ $? -ne 0 ]; then |
|
164 errlog "${OVS_VSWITCHD} failed with $?" |
|
165 exit $SMF_EXIT_ERR_FATAL |
|
166 fi |
|
167 } |
|
168 |
|
169 case "$1" in |
|
170 'start') |
|
171 case "$SMF_FMRI" in |
|
172 "${OVS_OVSDB_FMRI}") |
|
173 start_ovsdb_server |
|
174 ;; |
|
175 "${OVS_VSWITCHD_FMRI}") |
|
176 start_vswitch_server |
|
177 ;; |
|
178 *) |
|
179 echo "$SMF_FMRI does not support start method" |
|
180 exit $SMF_EXIT_ERR_FATAL |
|
181 ;; |
|
182 esac |
|
183 ;; |
|
184 'stop') |
|
185 case "$SMF_FMRI" in |
|
186 "${OVS_VSWITCHD_FMRI}") |
|
187 stop_vswitch_server |
|
188 ;; |
|
189 *) |
|
190 echo "$SMF_FMRI does not support stop method" |
|
191 exit $SMF_EXIT_ERR_FATAL |
|
192 ;; |
|
193 esac |
|
194 ;; |
|
195 *) |
|
196 echo "Service must be invoked from within SMF" |
|
197 exit $SMF_EXIT_ERR_FATAL |
|
198 ;; |
|
199 esac |
|
200 |
|
201 exit $SMF_EXIT_OK |