Fix build error on XenServer
[sliver-openvswitch.git] / xenserver / openvswitch-xen.spec.in
1 # Spec file for Open vSwitch.
2
3 # Copyright (C) 2009, 2010, 2011, 2012 Nicira, 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, 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-l3ping \
129     $RPM_BUILD_ROOT/usr/bin/ovs-pki \
130     $RPM_BUILD_ROOT/usr/bin/ovs-test \
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-l3ping.8 \
135     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-pki.8 \
136     $RPM_BUILD_ROOT/usr/share/man/man8/ovs-test.8
137
138 install -d -m 755 $RPM_BUILD_ROOT/var/lib/openvswitch
139
140 %clean
141 rm -rf $RPM_BUILD_ROOT
142
143 %post
144 # A list of Citrix XenServer scripts that we might need to replace
145 # with our own versions.
146 scripts="
147     /etc/xensource/scripts/vif
148     /opt/xensource/libexec/InterfaceReconfigure.py
149     /opt/xensource/libexec/InterfaceReconfigureBridge.py
150     /opt/xensource/libexec/InterfaceReconfigureVswitch.py
151     /opt/xensource/libexec/interface-reconfigure"
152
153 # Calculate into $md5sums a comma-separated set of md5sums of the
154 # Citrix XenServer scripts that we might need to replace.  We might be
155 # upgrading an older version of the package that moved the files out
156 # of the way, so we need to look for the files in those out-of-the-way
157 # locations first.
158 md5sums=
159 for script in $scripts; do
160     b=$(basename "$script")
161     if test -e /usr/lib/openvswitch/xs-saved/"$b"; then
162         f=/usr/lib/openvswitch/xs-saved/"$b"
163     elif test -e /usr/lib/openvswitch/xs-original/"$b"; then
164         f=/usr/lib/openvswitch/xs-original/"$b"
165     elif test -e "$script" && test ! -h "$script"; then
166         f=$script
167     else
168         printf "\n$script: not found\n"
169         f=/dev/null
170     fi
171     md5sums="$md5sums,$(md5sum $f | awk '{print $1}')"
172 done
173 md5sums=${md5sums#,}
174
175 # Now check the md5sums against the known sets of md5sums:
176 #
177 #   - If they are known to be a version of XenServer scripts that we should
178 #     replace, we replace them (by putting $scripts into $replace_files).
179 #
180 #   - Otherwise, we guess that it's better not to replace them, because the
181 #     improvements that our versions of the scripts provide are minimal, so
182 #     it's better to avoid possibly breaking any changes made upstream by
183 #     Citrix.
184 case $md5sums in
185     cf09a68d9f8b434e79a4c83b01a3bb4b,395866df1b0b20c12c4dd2f7de0ecdb4,9d493545ae81463239d3162cbc798852,862d0939b441de9264a900628e950fe9,21f85db25599d7f026cd489385d58aa6)
186         keep_files=
187         replace_files=$scripts
188         printf "\nVerified host scripts from XenServer 6.0.0.\n"
189         ;;
190
191     c5f48246577a17cf1b971fb5ce4e920b,2e2c912f86f9c536c89adc34ff3c2b2b,28d3ff72d72bdec4f37d70699f5edb76,67e1d0af16fc1ddf10009c5c063ad2ba,f3feff30aa3b3f8b514664a96a8dc0ab)
192         keep_files=
193         replace_files=$scripts
194         printf "\nVerified host scripts from XenServer 5.6-SP2.\n"
195         ;;
196         
197     c5f48246577a17cf1b971fb5ce4e920b,2e2c912f86f9c536c89adc34ff3c2b2b,28d3ff72d72bdec4f37d70699f5edb76,67e1d0af16fc1ddf10009c5c063ad2ba,24bae6906d182ba47668174f8e480cc6)
198         keep_files=
199         replace_files=$scripts
200         printf "\nVerified host scripts from XenServer 5.6-FP1.\n"
201         ;;
202
203     *)
204         keep_files=$scripts
205         replace_files=
206         cat <<EOF
207
208 The host scripts on this machine are not those of any supported
209 version of XenServer.  On XenServer earlier than 5.6-FP1, your Open
210 vSwitch installation will not work.  On XenServer 5.6-FP1 or later,
211 Open vSwitch is not verified to work, which could lead to unexpected
212 behavior.
213
214 EOF
215         ;;
216 esac
217
218 if grep -F net.ipv4.conf.all.arp_filter /etc/sysctl.conf >/dev/null 2>&1; then :; else
219     cat >>/etc/sysctl.conf <<EOF
220 # This works around an issue in xhad, which binds to a particular
221 # Ethernet device, which in turn causes ICMP port unreachable messages
222 # if packets are received are on the wrong interface, which in turn
223 # can happen if we send out ARP replies on every interface (as Linux
224 # does by default) instead of just on the interface that has the IP
225 # address being ARPed for, which this sysctl setting in turn works
226 # around.
227 #
228 # Bug #1378.
229 net.ipv4.conf.all.arp_filter = 1
230 EOF
231 fi
232
233 if test ! -e /etc/openvswitch/conf.db; then
234     install -d -m 755 -o root -g root /etc/openvswitch
235
236     # Create ovs-vswitchd config database
237     ovsdb-tool -vconsole:off create /etc/openvswitch/conf.db \
238             /usr/share/openvswitch/vswitch.ovsschema
239
240     # Create initial table in config database
241     ovsdb-tool -vconsole:off transact /etc/openvswitch/conf.db \
242             '[{"op": "insert", "table": "Open_vSwitch", "row": {}}]' \
243             > /dev/null
244 fi
245
246 # Create default or update existing /etc/sysconfig/openvswitch.
247 SYSCONFIG=/etc/sysconfig/openvswitch
248 TEMPLATE=/usr/share/openvswitch/scripts/sysconfig.template
249 if [ ! -e $SYSCONFIG ]; then
250     cp $TEMPLATE $SYSCONFIG
251 else
252     for var in $(awk -F'[ :]' '/^# [_A-Z0-9]+:/{print $2}' $TEMPLATE)
253     do
254         if ! grep $var $SYSCONFIG >/dev/null 2>&1; then
255             echo >> $SYSCONFIG
256             sed -n "/$var:/,/$var=/p" $TEMPLATE >> $SYSCONFIG
257         fi
258     done
259 fi
260
261 # Deliberately break %postun in broken OVS builds that revert original
262 # XenServer scripts during rpm -U by moving the directory where it thinks
263 # they are saved.
264 if [ -d /usr/lib/openvswitch/xs-original ]; then
265     mkdir -p /usr/lib/openvswitch/xs-saved
266     mv /usr/lib/openvswitch/xs-original/* /usr/lib/openvswitch/xs-saved/ &&
267         rmdir /usr/lib/openvswitch/xs-original
268 fi
269
270 # Replace XenServer files by our versions.
271 mkdir -p /usr/lib/openvswitch/xs-saved \
272     || printf "Could not create script backup directory.\n"
273 for f in $replace_files; do
274     s=$(basename "$f")
275     t=$(readlink "$f")
276     if [ -f "$f" ] && [ "$t" != "/usr/share/openvswitch/scripts/$s" ]; then
277         mv "$f" /usr/lib/openvswitch/xs-saved/ \
278             || printf "Could not save original XenServer $s script\n"
279         ln -s "/usr/share/openvswitch/scripts/$s" "$f" \
280             || printf "Could not link to Open vSwitch $s script\n"
281     fi
282 done
283
284 # Clean up dangling symlinks to removed OVS replacement scripts no longer
285 # provided by OVS. Any time a replacement script is removed from OVS,
286 # it should be added here to ensure correct reversion from old versions of
287 # OVS that don't clean up dangling symlinks during the uninstall phase.
288 for orig in /usr/sbin/brctl /usr/sbin/xen-bugtool $keep_files; do
289     saved=/usr/lib/openvswitch/xs-saved/$(basename "$orig")
290     [ -e "$saved" ] && mv -f "$saved" "$orig"
291 done
292
293 # Ensure all required services are set to run
294 for s in openvswitch openvswitch-xapi-update; do
295     if chkconfig --list $s >/dev/null 2>&1; then
296         chkconfig --del $s || printf "Could not remove $s init script.\n"
297     fi
298     chkconfig --add $s || printf "Could not add $s init script.\n"
299     chkconfig $s on || printf "Could not enable $s init script.\n"
300 done
301
302 if [ "$1" = "1" ]; then    # $1 = 1 for install
303     # Configure system to use Open vSwitch
304     /opt/xensource/bin/xe-switch-network-backend vswitch
305 else    # $1 = 2 for upgrade
306
307     mode=$(cat /etc/xensource/network.conf)
308     if [ "$mode" != "vswitch" ] && [ "$mode" != "openvswitch" ]; then
309         printf "\nThe server is not configured to run Open vSwitch.  To run in\n"
310         printf "vswitch mode, you must run the following command:\n\n"
311         printf "\txe-switch-network-backend vswitch"
312         printf "\n\n"
313     fi
314 fi
315
316 %posttrans %{module_package}
317 # Ensure that modprobe will find our modules.
318 #
319 # This has to be in %posttrans instead of %post because older versions
320 # installed modules into a different directory and "rpm -U" runs the
321 # new version's %post before removing the old version's files, so if
322 # we use %post then depmod may find the old versions that are about to
323 # be removed.
324 depmod %{xen_version}
325
326 mode=$(cat /etc/xensource/network.conf)
327 if [ "$mode" = "vswitch" ] || [ "$mode" = "openvswitch" ]; then
328     printf "\nTo use the newly installed Open vSwitch kernel module, you\n"
329     printf "will either have to reboot the hypervisor or follow any\n"
330     printf "workarounds provided by your administration guide. Failure to do\n"
331     printf "so may result in incorrect operation."
332     printf "\n\n"
333 fi
334
335 %preun
336 if [ "$1" = "0" ]; then     # $1 = 0 for uninstall
337     # Configure system to use bridge
338     /opt/xensource/bin/xe-switch-network-backend bridge
339
340     # The "openvswitch" service should have been removed from
341     # "xe-switch-network-backend bridge".
342     for s in openvswitch openvswitch-xapi-update; do
343         if chkconfig --list $s >/dev/null 2>&1; then
344             chkconfig --del $s || printf "Could not remove $s init script."
345         fi
346     done
347 fi
348
349 %postun
350 # Restore original XenServer scripts if the OVS equivalent no longer exists.
351 # This works both in the upgrade and erase cases.
352 # This lists every file that every version of OVS has ever replaced. Never
353 # remove old files that OVS no longer replaces, or upgrades from old versions
354 # will fail to restore the XS originals, leaving the system in a broken state.
355 # Also be sure to add removed script paths to the %post scriptlet above to
356 # prevent the same problem when upgrading from old versions of OVS that lack
357 # this restore-on-upgrade logic.
358 for f in \
359     /etc/xensource/scripts/vif \
360     /usr/sbin/brctl \
361     /usr/sbin/xen-bugtool \
362     /opt/xensource/libexec/interface-reconfigure \
363     /opt/xensource/libexec/InterfaceReconfigure.py \
364     /opt/xensource/libexec/InterfaceReconfigureBridge.py \
365     /opt/xensource/libexec/InterfaceReconfigureVswitch.py
366 do
367     # Only revert dangling symlinks.
368     if [ -h "$f" ] && [ ! -e "$f" ]; then
369         s=$(basename "$f")
370         if [ ! -f "/usr/lib/openvswitch/xs-saved/$s" ]; then
371             printf "Original XenServer $s script not present in /usr/lib/openvswitch/xs-saved\n" >&2
372             printf "Could not restore original XenServer script.\n" >&2
373         else
374             (rm -f "$f" \
375                 && mv "/usr/lib/openvswitch/xs-saved/$s" "$f") \
376                 || printf "Could not restore original XenServer $s script.\n" >&2
377         fi
378     fi
379 done
380
381 if [ "$1" = "0" ]; then     # $1 = 0 for uninstall
382     rm -f /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyc \
383         /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyo
384
385     rm -f /usr/share/openvswitch/scripts/InterfaceReconfigure.pyc \
386         /usr/share/openvswitch/scripts/InterfaceReconfigure.pyo \
387         /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyc \
388         /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyo \
389         /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyc \
390         /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyo
391
392     # Remove all configuration files
393     rm -f /etc/openvswitch/conf.db
394     rm -f /etc/sysconfig/openvswitch
395     rm -f /etc/openvswitch/vswitchd.cacert
396
397     # Remove saved XenServer scripts directory, but only if it's empty
398     rmdir -p /usr/lib/openvswitch/xs-saved 2>/dev/null
399 fi
400
401 exit 0
402
403 %files
404 %defattr(-,root,root)
405 /etc/init.d/openvswitch
406 /etc/init.d/openvswitch-xapi-update
407 /etc/xapi.d/plugins/openvswitch-cfg-update
408 /etc/xensource/bugtool/*
409 /etc/logrotate.d/openvswitch
410 /etc/profile.d/openvswitch.sh
411 /usr/share/openvswitch/python/
412 /usr/share/openvswitch/scripts/ovs-check-dead-ifs
413 /usr/share/openvswitch/scripts/ovs-xapi-sync
414 /usr/share/openvswitch/scripts/interface-reconfigure
415 /usr/share/openvswitch/scripts/InterfaceReconfigure.py
416 /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.py
417 /usr/share/openvswitch/scripts/InterfaceReconfigureVswitch.py
418 /usr/share/openvswitch/scripts/vif
419 /usr/share/openvswitch/scripts/sysconfig.template
420 /usr/share/openvswitch/scripts/ovs-bugtool-*
421 /usr/share/openvswitch/scripts/ovs-save
422 /usr/share/openvswitch/scripts/ovs-ctl
423 /usr/share/openvswitch/scripts/ovs-lib
424 /usr/share/openvswitch/vswitch.ovsschema
425 /usr/sbin/ovs-vlan-bug-workaround
426 /usr/sbin/ovs-vswitchd
427 /usr/sbin/ovsdb-server
428 /usr/bin/ovs-appctl
429 /usr/bin/ovs-dpctl
430 /usr/bin/ovs-ofctl
431 /usr/bin/ovs-parse-leaks
432 /usr/bin/ovs-pcap
433 /usr/bin/ovs-tcpundump
434 /usr/bin/ovs-vlan-test
435 /usr/bin/ovs-vsctl
436 /usr/bin/ovsdb-client
437 /usr/bin/ovsdb-tool
438 /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
439 /usr/share/man/man1/ovsdb-client.1.gz
440 /usr/share/man/man1/ovsdb-server.1.gz
441 /usr/share/man/man1/ovsdb-tool.1.gz
442 /usr/share/man/man5/ovs-vswitchd.conf.db.5.gz
443 /usr/share/man/man8/ovs-appctl.8.gz
444 /usr/share/man/man8/ovs-ctl.8.gz
445 /usr/share/man/man8/ovs-dpctl.8.gz
446 /usr/share/man/man8/ovs-ofctl.8.gz
447 /usr/share/man/man8/ovs-parse-leaks.8.gz
448 /usr/share/man/man1/ovs-pcap.1.gz
449 /usr/share/man/man1/ovs-tcpundump.1.gz
450 /usr/share/man/man8/ovs-vlan-bug-workaround.8.gz
451 /usr/share/man/man8/ovs-vlan-test.8.gz
452 /usr/share/man/man8/ovs-vsctl.8.gz
453 /usr/share/man/man8/ovs-vswitchd.8.gz
454 /var/lib/openvswitch
455 %exclude /usr/lib/xsconsole/plugins-base/*.py[co]
456 %exclude /usr/sbin/ovs-brcompatd
457 %exclude /usr/share/man/man8/ovs-brcompatd.8.gz
458 %exclude /usr/share/openvswitch/scripts/*.py[co]
459 %exclude /usr/share/openvswitch/python/*.py[co]
460 %exclude /usr/share/openvswitch/python/ovs/*.py[co]
461 %exclude /usr/share/openvswitch/python/ovs/db/*.py[co]
462
463 %files %{module_package}
464 /lib/modules/%{xen_version}/extra/openvswitch/openvswitch.ko
465 %exclude /lib/modules/%{xen_version}/extra/openvswitch/brcompat.ko