8c9d168cfbbe1bca6f2937e3718afe156ed0cfe4
[sliver-openvswitch.git] / xenserver / openvswitch-xen.spec.in
1 # Spec file for Open vSwitch.
2
3 # Copyright (C) 2009, 2010, 2011, 2012 Nicira Networks, Inc.
4 #
5 # Copying and distribution of this file, with or without modification,
6 # are permitted in any medium without royalty provided the copyright
7 # notice and this notice are preserved.  This file is offered as-is,
8 # without warranty of any kind.
9
10 # When building, the rpmbuild command line should define
11 # openvswitch_version, kernel_name, kernel_version, and kernel_flavor
12 # using -D arguments.
13 # for example:
14 #
15 #    rpmbuild -D "openvswitch_version 1.1.0+build123"
16 #      -D "kernel_name  NAME-xen"
17 #      -D "kernel_version 2.6.32.12-0.7.1.xs5.6.100.323.170596"
18 #      -D "kernel_flavor xen"
19 #      -bb /usr/src/redhat/SPECS/openvswitch-xen.spec
20
21 %if %{?openvswitch_version:0}%{!?openvswitch_version:1}
22 %define openvswitch_version @VERSION@
23 %endif
24
25 %if %{?kernel_name:0}%{!?kernel_name:1}
26 %define kernel %(rpm -qa 'kernel*xen-devel' | head -1)
27 %define kernel_name %(rpm -q --queryformat "%%{Name}" %{kernel} | sed 's/-devel//' | sed 's/kernel-//')
28 %define kernel_version %(rpm -q --queryformat "%%{Version}-%%{Release}" %{kernel})
29 %define kernel_flavor xen
30 %endif
31
32 %define xen_version %{kernel_version}%{kernel_flavor}
33
34 # bump this when breaking compatibility with userspace
35 %define module_abi_version 0
36
37 # build-supplemental-pack.sh requires this naming for kernel module packages
38 %define module_package modules-%{kernel_flavor}-%{kernel_version}
39
40 Name: openvswitch
41 Summary: Open vSwitch daemon/database/utilities
42 Group: System Environment/Daemons
43 URL: http://www.openvswitch.org/
44 Vendor: Nicira Networks, Inc.
45 Version: %{openvswitch_version}
46
47 License: ASL 2.0
48 Release: 1
49 Source: openvswitch-%{openvswitch_version}.tar.gz
50 Buildroot: /tmp/openvswitch-xen-rpm
51 Requires: openvswitch.ko.%{module_abi_version}
52
53 %description
54 Open vSwitch provides standard network bridging functions augmented with
55 support for the OpenFlow protocol for remote per-flow control of
56 traffic.
57
58 %package %{module_package}
59 Summary: Open vSwitch kernel module
60 Group: System Environment/Kernel
61 License: GPLv2
62 Provides: %{name}-modules-%{kernel_flavor} = %{kernel_version}, openvswitch.ko.%{module_abi_version}
63 Requires: kernel-%{kernel_name} = %{kernel_version}
64
65 %description %{module_package}
66 Open vSwitch Linux kernel module compiled against kernel version
67 %{xen_version}.
68
69 %prep
70 %setup -q -n openvswitch-%{openvswitch_version}
71
72 %build
73 ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=%{_localstatedir} --with-linux=/lib/modules/%{xen_version}/build --enable-ssl
74 make %{_smp_mflags}
75
76 %install
77 rm -rf $RPM_BUILD_ROOT
78 make install DESTDIR=$RPM_BUILD_ROOT
79 install -d -m 755 $RPM_BUILD_ROOT/etc
80 install -d -m 755 $RPM_BUILD_ROOT/etc/init.d
81 install -m 755 xenserver/etc_init.d_openvswitch \
82          $RPM_BUILD_ROOT/etc/init.d/openvswitch
83 install -m 755 xenserver/etc_init.d_openvswitch-xapi-update \
84          $RPM_BUILD_ROOT/etc/init.d/openvswitch-xapi-update
85 install -d -m 755 $RPM_BUILD_ROOT/etc/sysconfig
86 install -d -m 755 $RPM_BUILD_ROOT/etc/logrotate.d
87 install -m 755 xenserver/etc_logrotate.d_openvswitch \
88          $RPM_BUILD_ROOT/etc/logrotate.d/openvswitch
89 install -d -m 755 $RPM_BUILD_ROOT/etc/profile.d
90 install -m 755 xenserver/etc_profile.d_openvswitch.sh \
91          $RPM_BUILD_ROOT/etc/profile.d/openvswitch.sh
92 install -d -m 755 $RPM_BUILD_ROOT/etc/xapi.d/plugins
93 install -m 755 xenserver/etc_xapi.d_plugins_openvswitch-cfg-update \
94          $RPM_BUILD_ROOT/etc/xapi.d/plugins/openvswitch-cfg-update
95 install -d -m 755 $RPM_BUILD_ROOT/usr/share/openvswitch/scripts
96 install -m 755 xenserver/opt_xensource_libexec_interface-reconfigure \
97              $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/interface-reconfigure
98 install -m 644 xenserver/opt_xensource_libexec_InterfaceReconfigure.py \
99              $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/InterfaceReconfigure.py
100 install -m 644 xenserver/opt_xensource_libexec_InterfaceReconfigureBridge.py \
101              $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/InterfaceReconfigureBridge.py
102 install -m 644 xenserver/opt_xensource_libexec_InterfaceReconfigureVswitch.py \
103              $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/InterfaceReconfigureVswitch.py
104 install -m 755 xenserver/etc_xensource_scripts_vif \
105              $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/vif
106 install -m 755 xenserver/usr_share_openvswitch_scripts_ovs-xapi-sync \
107                $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/ovs-xapi-sync
108 install -m 755 xenserver/usr_share_openvswitch_scripts_sysconfig.template \
109          $RPM_BUILD_ROOT/usr/share/openvswitch/scripts/sysconfig.template
110 install -d -m 755 $RPM_BUILD_ROOT/usr/lib/xsconsole/plugins-base
111 install -m 644 \
112         xenserver/usr_lib_xsconsole_plugins-base_XSFeatureVSwitch.py \
113                $RPM_BUILD_ROOT/usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
114
115 install -d -m 755 $RPM_BUILD_ROOT/lib/modules/%{xen_version}/extra/openvswitch
116 find datapath/linux -name *.ko -exec install -m 755  \{\} $RPM_BUILD_ROOT/lib/modules/%{xen_version}/extra/openvswitch \;
117 install python/compat/uuid.py $RPM_BUILD_ROOT/usr/share/openvswitch/python
118 install python/compat/argparse.py $RPM_BUILD_ROOT/usr/share/openvswitch/python
119
120 install -d -m 755 $RPM_BUILD_ROOT/etc/xensource/bugtool
121 mv $RPM_BUILD_ROOT/usr/share/openvswitch/bugtool-plugins/* $RPM_BUILD_ROOT/etc/xensource/bugtool
122
123 # Get rid of stuff we don't want to make RPM happy.
124 rm \
125     $RPM_BUILD_ROOT/usr/bin/ovs-benchmark \
126     $RPM_BUILD_ROOT/usr/sbin/ovs-bugtool \
127     $RPM_BUILD_ROOT/usr/bin/ovs-controller \
128     $RPM_BUILD_ROOT/usr/bin/ovs-pki \
129     $RPM_BUILD_ROOT/usr/bin/ovs-test \
130     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-test.8 \
131     $RPM_BUILD_ROOT/usr/share/man/man1/ovs-benchmark.1 \
132     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-bugtool.8 \
133     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-controller.8 \
134     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-pki.8
135
136 install -d -m 755 $RPM_BUILD_ROOT/var/lib/openvswitch
137
138 %clean
139 rm -rf $RPM_BUILD_ROOT
140
141 %post
142 # A list of Citrix XenServer scripts that we might need to replace
143 # with our own versions.
144 scripts="
145     /etc/xensource/scripts/vif
146     /opt/xensource/libexec/InterfaceReconfigure.py
147     /opt/xensource/libexec/InterfaceReconfigureBridge.py
148     /opt/xensource/libexec/InterfaceReconfigureVswitch.py
149     /opt/xensource/libexec/interface-reconfigure"
150
151 # Calculate into $md5sums a comma-separated set of md5sums of the
152 # Citrix XenServer scripts that we might need to replace.  We might be
153 # upgrading an older version of the package that moved the files out
154 # of the way, so we need to look for the files in those out-of-the-way
155 # locations first.
156 md5sums=
157 for script in $scripts; do
158     b=$(basename "$script")
159     if test -e /usr/lib/openvswitch/xs-saved/"$b"; then
160         f=/usr/lib/openvswitch/xs-saved/"$b"
161     elif test -e /usr/lib/openvswitch/xs-original/"$b"; then
162         f=/usr/lib/openvswitch/xs-original/"$b"
163     elif test -e "$script" && test ! -h "$script"; then
164         f=$script
165     else
166         printf "\n$script: not found\n"
167         f=/dev/null
168     fi
169     md5sums="$md5sums,$(md5sum $f | awk '{print $1}')"
170 done
171 md5sums=${md5sums#,}
172
173 # Now check the md5sums against the known sets of md5sums:
174 #
175 #   - If they are known to be a version of XenServer scripts that we should
176 #     replace, we replace them (by putting $scripts into $replace_files).
177 #
178 #   - Otherwise, we guess that it's better not to replace them, because the
179 #     improvements that our versions of the scripts provide are minimal, so
180 #     it's better to avoid possibly breaking any changes made upstream by
181 #     Citrix.
182 case $md5sums in
183     cf09a68d9f8b434e79a4c83b01a3bb4b,395866df1b0b20c12c4dd2f7de0ecdb4,9d493545ae81463239d3162cbc798852,862d0939b441de9264a900628e950fe9,21f85db25599d7f026cd489385d58aa6)
184         keep_files=
185         replace_files=$scripts
186         printf "\nVerified host scripts from XenServer 6.0.0.\n"
187         ;;
188         
189     c5f48246577a17cf1b971fb5ce4e920b,2e2c912f86f9c536c89adc34ff3c2b2b,28d3ff72d72bdec4f37d70699f5edb76,67e1d0af16fc1ddf10009c5c063ad2ba,24bae6906d182ba47668174f8e480cc6)
190         keep_files=
191         replace_files=$scripts
192         printf "\nVerified host scripts from XenServer 5.6-FP1.\n"
193         ;;
194
195     *)
196         keep_files=$scripts
197         replace_files=
198         cat <<EOF
199
200 The host scripts on this machine are not those of any supported
201 version of XenServer.  On XenServer earlier than 5.6-FP1, your Open
202 vSwitch installation will not work.  On XenServer 5.6-FP1 or later,
203 Open vSwitch is not verified to work, which could lead to unexpected
204 behavior.
205
206 EOF
207         ;;
208 esac
209
210 if grep -F net.ipv4.conf.all.arp_filter /etc/sysctl.conf >/dev/null 2>&1; then :; else
211     cat >>/etc/sysctl.conf <<EOF
212 # This works around an issue in xhad, which binds to a particular
213 # Ethernet device, which in turn causes ICMP port unreachable messages
214 # if packets are received are on the wrong interface, which in turn
215 # can happen if we send out ARP replies on every interface (as Linux
216 # does by default) instead of just on the interface that has the IP
217 # address being ARPed for, which this sysctl setting in turn works
218 # around.
219 #
220 # Bug #1378.
221 net.ipv4.conf.all.arp_filter = 1
222 EOF
223 fi
224
225 if test ! -e /etc/openvswitch/conf.db; then
226     install -d -m 755 -o root -g root /etc/openvswitch
227
228     # Create ovs-vswitchd config database
229     ovsdb-tool -vANY:console:off create /etc/openvswitch/conf.db \
230             /usr/share/openvswitch/vswitch.ovsschema
231
232     # Create initial table in config database
233     ovsdb-tool -vANY:console:off transact /etc/openvswitch/conf.db \
234             '[{"op": "insert", "table": "Open_vSwitch", "row": {}}]' \
235             > /dev/null
236 fi
237
238 # Create default or update existing /etc/sysconfig/openvswitch.
239 SYSCONFIG=/etc/sysconfig/openvswitch
240 TEMPLATE=/usr/share/openvswitch/scripts/sysconfig.template
241 if [ ! -e $SYSCONFIG ]; then
242     cp $TEMPLATE $SYSCONFIG
243 else
244     for var in $(awk -F'[ :]' '/^# [_A-Z0-9]+:/{print $2}' $TEMPLATE)
245     do
246         if ! grep $var $SYSCONFIG >/dev/null 2>&1; then
247             echo >> $SYSCONFIG
248             sed -n "/$var:/,/$var=/p" $TEMPLATE >> $SYSCONFIG
249         fi
250     done
251 fi
252
253 # Deliberately break %postun in broken OVS builds that revert original
254 # XenServer scripts during rpm -U by moving the directory where it thinks
255 # they are saved.
256 if [ -d /usr/lib/openvswitch/xs-original ]; then
257     mkdir -p /usr/lib/openvswitch/xs-saved
258     mv /usr/lib/openvswitch/xs-original/* /usr/lib/openvswitch/xs-saved/ &&
259         rmdir /usr/lib/openvswitch/xs-original
260 fi
261
262 # Replace XenServer files by our versions.
263 mkdir -p /usr/lib/openvswitch/xs-saved \
264     || printf "Could not create script backup directory.\n"
265 for f in $replace_files; do
266     s=$(basename "$f")
267     t=$(readlink "$f")
268     if [ -f "$f" ] && [ "$t" != "/usr/share/openvswitch/scripts/$s" ]; then
269         mv "$f" /usr/lib/openvswitch/xs-saved/ \
270             || printf "Could not save original XenServer $s script\n"
271         ln -s "/usr/share/openvswitch/scripts/$s" "$f" \
272             || printf "Could not link to Open vSwitch $s script\n"
273     fi
274 done
275
276 # Clean up dangling symlinks to removed OVS replacement scripts no longer
277 # provided by OVS. Any time a replacement script is removed from OVS,
278 # it should be added here to ensure correct reversion from old versions of
279 # OVS that don't clean up dangling symlinks during the uninstall phase.
280 for orig in /usr/sbin/brctl /usr/sbin/xen-bugtool $keep_files; do
281     saved=/usr/lib/openvswitch/xs-saved/$(basename "$orig")
282     [ -e "$saved" ] && mv -f "$saved" "$orig"
283 done
284
285 # Ensure all required services are set to run
286 for s in openvswitch openvswitch-xapi-update; do
287     if chkconfig --list $s >/dev/null 2>&1; then
288         chkconfig --del $s || printf "Could not remove $s init script."
289     fi
290     chkconfig --add $s || printf "Could not add $s init script."
291     chkconfig $s on || printf "Could not enable $s init script."
292 done
293
294 if [ "$1" = "1" ]; then    # $1 = 1 for install
295     # Configure system to use Open vSwitch
296     /opt/xensource/bin/xe-switch-network-backend vswitch
297 else    # $1 = 2 for upgrade
298
299     mode=$(cat /etc/xensource/network.conf)
300     if [ "$mode" != "vswitch" ] && [ "$mode" != "openvswitch" ]; then
301         printf "\nThe server is not configured to run Open vSwitch.  To run in\n"
302         printf "vswitch mode, you must run the following command:\n\n"
303         printf "\txe-switch-network-backend vswitch"
304     else
305         printf "\nTo use the new Open vSwitch install, you should reboot the\n"
306         printf "server now.  Failure to do so may result in incorrect operation."
307     fi
308
309     printf "\n\n"
310 fi
311
312 %posttrans %{module_package}
313 # Ensure that modprobe will find our modules.
314 #
315 # This has to be in %posttrans instead of %post because older versions
316 # installed modules into a different directory and "rpm -U" runs the
317 # new version's %post before removing the old version's files, so if
318 # we use %post then depmod may find the old versions that are about to
319 # be removed.
320 depmod %{xen_version}
321
322 %preun
323 if [ "$1" = "0" ]; then     # $1 = 0 for uninstall
324     # Configure system to use bridge
325     /opt/xensource/bin/xe-switch-network-backend bridge
326
327     # The "openvswitch" service should have been removed from
328     # "xe-switch-network-backend bridge".
329     for s in openvswitch openvswitch-xapi-update; do
330         if chkconfig --list $s >/dev/null 2>&1; then
331             chkconfig --del $s || printf "Could not remove $s init script."
332         fi
333     done
334 fi
335
336 %postun
337 # Restore original XenServer scripts if the OVS equivalent no longer exists.
338 # This works both in the upgrade and erase cases.
339 # This lists every file that every version of OVS has ever replaced. Never
340 # remove old files that OVS no longer replaces, or upgrades from old versions
341 # will fail to restore the XS originals, leaving the system in a broken state.
342 # Also be sure to add removed script paths to the %post scriptlet above to
343 # prevent the same problem when upgrading from old versions of OVS that lack
344 # this restore-on-upgrade logic.
345 for f in \
346     /etc/xensource/scripts/vif \
347     /usr/sbin/brctl \
348     /usr/sbin/xen-bugtool \
349     /opt/xensource/libexec/interface-reconfigure \
350     /opt/xensource/libexec/InterfaceReconfigure.py \
351     /opt/xensource/libexec/InterfaceReconfigureBridge.py \
352     /opt/xensource/libexec/InterfaceReconfigureVswitch.py
353 do
354     # Only revert dangling symlinks.
355     if [ -h "$f" ] && [ ! -e "$f" ]; then
356         s=$(basename "$f")
357         if [ ! -f "/usr/lib/openvswitch/xs-saved/$s" ]; then
358             printf "Original XenServer $s script not present in /usr/lib/openvswitch/xs-saved\n" >&2
359             printf "Could not restore original XenServer script.\n" >&2
360         else
361             (rm -f "$f" \
362                 && mv "/usr/lib/openvswitch/xs-saved/$s" "$f") \
363                 || printf "Could not restore original XenServer $s script.\n" >&2
364         fi
365     fi
366 done
367
368 if [ "$1" = "0" ]; then     # $1 = 0 for uninstall
369     rm -f /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyc \
370         /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyo
371
372     rm -f /usr/share/openvswitch/scripts/InterfaceReconfigure.pyc \
373         /usr/share/openvswitch/scripts/InterfaceReconfigure.pyo \
374         /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyc \
375         /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyo \
376         /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyc \
377         /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyo
378
379     # Remove all configuration files
380     rm -f /etc/openvswitch/conf.db
381     rm -f /etc/sysconfig/openvswitch
382     rm -f /etc/openvswitch/vswitchd.cacert
383
384     # Remove saved XenServer scripts directory, but only if it's empty
385     rmdir -p /usr/lib/openvswitch/xs-saved 2>/dev/null
386 fi
387
388 exit 0
389
390 %files
391 %defattr(-,root,root)
392 /etc/init.d/openvswitch
393 /etc/init.d/openvswitch-xapi-update
394 /etc/xapi.d/plugins/openvswitch-cfg-update
395 /etc/xensource/bugtool/*
396 /etc/logrotate.d/openvswitch
397 /etc/profile.d/openvswitch.sh
398 /usr/share/openvswitch/python/
399 /usr/share/openvswitch/scripts/ovs-xapi-sync
400 /usr/share/openvswitch/scripts/interface-reconfigure
401 /usr/share/openvswitch/scripts/InterfaceReconfigure.py
402 /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.py
403 /usr/share/openvswitch/scripts/InterfaceReconfigureVswitch.py
404 /usr/share/openvswitch/scripts/vif
405 /usr/share/openvswitch/scripts/sysconfig.template
406 /usr/share/openvswitch/scripts/ovs-bugtool-*
407 /usr/share/openvswitch/scripts/ovs-save
408 /usr/share/openvswitch/scripts/ovs-ctl
409 /usr/share/openvswitch/scripts/ovs-lib
410 /usr/share/openvswitch/vswitch.ovsschema
411 /usr/sbin/ovs-vlan-bug-workaround
412 /usr/sbin/ovs-vswitchd
413 /usr/sbin/ovsdb-server
414 /usr/bin/ovs-appctl
415 /usr/bin/ovs-dpctl
416 /usr/bin/ovs-ofctl
417 /usr/bin/ovs-parse-leaks
418 /usr/bin/ovs-pcap
419 /usr/bin/ovs-tcpundump
420 /usr/bin/ovs-vlan-test
421 /usr/bin/ovs-vsctl
422 /usr/bin/ovsdb-client
423 /usr/bin/ovsdb-tool
424 /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
425 /usr/share/man/man1/ovsdb-client.1.gz
426 /usr/share/man/man1/ovsdb-server.1.gz
427 /usr/share/man/man1/ovsdb-tool.1.gz
428 /usr/share/man/man5/ovs-vswitchd.conf.db.5.gz
429 /usr/share/man/man8/ovs-appctl.8.gz
430 /usr/share/man/man8/ovs-ctl.8.gz
431 /usr/share/man/man8/ovs-dpctl.8.gz
432 /usr/share/man/man8/ovs-ofctl.8.gz
433 /usr/share/man/man8/ovs-parse-leaks.8.gz
434 /usr/share/man/man1/ovs-pcap.1.gz
435 /usr/share/man/man1/ovs-tcpundump.1.gz
436 /usr/share/man/man8/ovs-vlan-bug-workaround.8.gz
437 /usr/share/man/man8/ovs-vlan-test.8.gz
438 /usr/share/man/man8/ovs-vsctl.8.gz
439 /usr/share/man/man8/ovs-vswitchd.8.gz
440 /var/lib/openvswitch
441 %exclude /usr/lib/xsconsole/plugins-base/*.py[co]
442 %exclude /usr/sbin/ovs-brcompatd
443 %exclude /usr/share/man/man8/ovs-brcompatd.8.gz
444 %exclude /usr/share/openvswitch/scripts/*.py[co]
445 %exclude /usr/share/openvswitch/python/*.py[co]
446 %exclude /usr/share/openvswitch/python/ovs/*.py[co]
447 %exclude /usr/share/openvswitch/python/ovs/db/*.py[co]
448
449 %files %{module_package}
450 /lib/modules/%{xen_version}/extra/openvswitch/openvswitch.ko
451 %exclude /lib/modules/%{xen_version}/extra/openvswitch/brcompat.ko