# rpmbuild -D "vswitch_version 0.8.9~1+build123" -D "xen_version 2.6.18-128.1.1.el5.xs5.1.0.483.1000xen" -D "build_number --with-build-number=123" -bb /usr/src/redhat/SPECS/vswitch-xen.spec
#
%define version %{vswitch_version}-%{xen_version}
-%define _prefix /root/vswitch
Name: vswitch
Summary: Virtual switch
Group: System Environment/Daemons
-URL: http://www.vswitch.org/
+URL: http://www.openvswitch.org/
Version: %{vswitch_version}
-License: GPL3
+
+# The entire source code is ASL 2.0 except datapath/ which is GPLv2
+License: ASL 2.0 and GPLv2
Release: 1
Source: openvswitch-%{vswitch_version}.tar.gz
Buildroot: /tmp/vswitch-xen-rpm
+Requires: kernel-xen = %(echo '%{xen_version}' | sed 's/xen$//')
+# The following Conflicts prevents the "vswitch" package generated by
+# this spec file from installing at the same time as the "openvswitch"
+# package shipped with XenServer 5.5.900. In fact, the packages
+# contain some files with identical names anyhow, so they will not
+# coexist, but adding an explicit Conflicts makes this conflict more
+# obvious.
+Conflicts: openvswitch
%description
The vswitch provides standard network bridging functions augmented with
%setup -q -n openvswitch-%{vswitch_version}
%build
-./configure --prefix=%{_prefix} --localstatedir=%{_localstatedir} --with-l26=/lib/modules/%{xen_version}/build --enable-ssl %{build_number}
-make
+./configure --prefix=/usr --localstatedir=%{_localstatedir} --with-l26=/lib/modules/%{xen_version}/build --enable-ssl %{build_number}
+make %{_smp_mflags}
%install
rm -rf $RPM_BUILD_ROOT
-make install DESTDIR=$RPM_BUILD_ROOT prefix=%{_prefix}
+make install DESTDIR=$RPM_BUILD_ROOT
install -d -m 755 $RPM_BUILD_ROOT/etc
install -d -m 755 $RPM_BUILD_ROOT/etc/init.d
install -m 755 xenserver/etc_init.d_vswitch \
install -m 755 xenserver/etc_init.d_vswitch-xapi-update \
$RPM_BUILD_ROOT/etc/init.d/vswitch-xapi-update
install -d -m 755 $RPM_BUILD_ROOT/etc/sysconfig
-install -m 755 xenserver/etc_sysconfig_vswitch.example \
- $RPM_BUILD_ROOT/etc/sysconfig/vswitch.example
install -d -m 755 $RPM_BUILD_ROOT/etc/logrotate.d
install -m 755 xenserver/etc_logrotate.d_vswitch \
$RPM_BUILD_ROOT/etc/logrotate.d/vswitch
install -d -m 755 $RPM_BUILD_ROOT/etc/xapi.d/plugins
install -m 755 xenserver/etc_xapi.d_plugins_vswitch-cfg-update \
$RPM_BUILD_ROOT/etc/xapi.d/plugins/vswitch-cfg-update
-install -d -m 755 $RPM_BUILD_ROOT%{_prefix}/scripts
+install -d -m 755 $RPM_BUILD_ROOT/usr/share/vswitch/scripts
install -m 755 xenserver/opt_xensource_libexec_interface-reconfigure \
- $RPM_BUILD_ROOT%{_prefix}/scripts/interface-reconfigure
+ $RPM_BUILD_ROOT/usr/share/vswitch/scripts/interface-reconfigure
install -m 755 xenserver/etc_xensource_scripts_vif \
- $RPM_BUILD_ROOT%{_prefix}/scripts/vif
-install -m 755 \
+ $RPM_BUILD_ROOT/usr/share/vswitch/scripts/vif
+install -m 755 xenserver/usr_share_vswitch_scripts_dump-vif-details \
+ $RPM_BUILD_ROOT/usr/share/vswitch/scripts/dump-vif-details
+install -m 755 xenserver/usr_sbin_xen-bugtool \
+ $RPM_BUILD_ROOT/usr/share/vswitch/scripts/xen-bugtool
+install -m 755 xenserver/usr_sbin_brctl \
+ $RPM_BUILD_ROOT/usr/share/vswitch/scripts/brctl
+install -m 755 xenserver/usr_share_vswitch_scripts_sysconfig.template \
+ $RPM_BUILD_ROOT/usr/share/vswitch/scripts/sysconfig.template
+install -m 644 \
xenserver/usr_lib_xsconsole_plugins-base_XSFeatureVSwitch.py \
- $RPM_BUILD_ROOT%{_prefix}/scripts/XSFeatureVSwitch.py
+ $RPM_BUILD_ROOT/usr/share/vswitch/scripts/XSFeatureVSwitch.py
-install -d -m 755 $RPM_BUILD_ROOT%{_prefix}/kernel_modules
-find datapath/linux-2.6 -name *.ko -exec install -m 755 \{\} $RPM_BUILD_ROOT%{_prefix}/kernel_modules/ \;
+install -d -m 755 $RPM_BUILD_ROOT/lib/modules/%{xen_version}/kernel/net/vswitch
+find datapath/linux-2.6 -name *.ko -exec install -m 755 \{\} $RPM_BUILD_ROOT/lib/modules/%{xen_version}/kernel/net/vswitch \;
# Get rid of stuff we don't want to make RPM happy.
-rm -rf \
- $RPM_BUILD_ROOT/root/vswitch/bin/ezio-term \
- $RPM_BUILD_ROOT/root/vswitch/bin/ovs-controller \
- $RPM_BUILD_ROOT/root/vswitch/bin/ovs-discover \
- $RPM_BUILD_ROOT/root/vswitch/bin/ovs-kill \
- $RPM_BUILD_ROOT/root/vswitch/bin/ovs-pki \
- $RPM_BUILD_ROOT/root/vswitch/bin/ovs-switchui \
- $RPM_BUILD_ROOT/root/vswitch/bin/ovs-wdt \
- $RPM_BUILD_ROOT/root/vswitch/bin/secchan \
- $RPM_BUILD_ROOT/root/vswitch/sbin/ovs-monitor \
- $RPM_BUILD_ROOT/root/vswitch/share/man/man8/ovs-controller.8 \
- $RPM_BUILD_ROOT/root/vswitch/share/man/man8/ovs-discover.8 \
- $RPM_BUILD_ROOT/root/vswitch/share/man/man8/ovs-kill.8 \
- $RPM_BUILD_ROOT/root/vswitch/share/man/man8/ovs-pki.8 \
- $RPM_BUILD_ROOT/root/vswitch/share/man/man8/secchan.8 \
- $RPM_BUILD_ROOT/root/vswitch/share/openvswitch
+rm \
+ $RPM_BUILD_ROOT/usr/bin/ovs-controller \
+ $RPM_BUILD_ROOT/usr/bin/ovs-discover \
+ $RPM_BUILD_ROOT/usr/bin/ovs-kill \
+ $RPM_BUILD_ROOT/usr/bin/ovs-openflowd \
+ $RPM_BUILD_ROOT/usr/bin/ovs-pki \
+ $RPM_BUILD_ROOT/usr/bin/ovs-wdt \
+ $RPM_BUILD_ROOT/usr/sbin/ovs-monitor \
+ $RPM_BUILD_ROOT/usr/share/man/man8/ovs-controller.8 \
+ $RPM_BUILD_ROOT/usr/share/man/man8/ovs-discover.8 \
+ $RPM_BUILD_ROOT/usr/share/man/man8/ovs-kill.8 \
+ $RPM_BUILD_ROOT/usr/share/man/man8/ovs-openflowd.8 \
+ $RPM_BUILD_ROOT/usr/share/man/man8/ovs-pki.8
+rm -f $RPM_BUILD_ROOT/lib/modules/%{xen_version}/kernel/net/vswitch/veth_mod.ko
+rm -r \
+ $RPM_BUILD_ROOT/usr/share/openvswitch/commands
+
+install -d -m 755 $RPM_BUILD_ROOT/var/lib/openvswitch
%clean
rm -rf $RPM_BUILD_ROOT
-%pre
+%post
if [ ! -f /etc/xensource-inventory ]; then
printf "XenSource inventory not present in /etc/xensource-inventory"
exit 1
fi
if [ "$1" = "1" ]; then
- if ! md5sum -c --status <<EOF
+ if md5sum -c --status <<EOF
+ca141d60061dcfdade73e75abc6529b5 /usr/sbin/brctl
b8e9835862ef1a9cec2a3f477d26c989 /etc/xensource/scripts/vif
51970ad613a3996d5997e18e44db47da /opt/xensource/libexec/interface-reconfigure
+5654c8c36699fcc8744ca9cd5b855414 /usr/sbin/xen-bugtool
EOF
then
- printf "\nThe original XenServer scripts replaced by this package\n"
- printf "are different than expected. This could lead to unexpected\n"
- printf "behavior of your server. Unless you are sure you know what\n"
- printf "you are doing, it is highly recomended that you remove this\n"
- printf "package immediately after the install completes, which\n"
- printf "will restore the XenServer scripts that you were previously\n"
- printf "using.\n\n"
+ printf "\nVerified host scripts from XenServer 5.5.0.\n\n"
+ elif md5sum -c --status <<EOF
+ca141d60061dcfdade73e75abc6529b5 /usr/sbin/brctl
+b8e9835862ef1a9cec2a3f477d26c989 /etc/xensource/scripts/vif
+ce451d3c985fd1db6497a363f0d9dedb /opt/xensource/libexec/interface-reconfigure
+2b53f500431fcba5276c896e9e4281b9 /usr/sbin/xen-bugtool
+EOF
+ then
+ printf "\nVerified host scripts from XenServer 5.5.900.\n\n"
+ else
+cat <<EOF
+
+The original XenServer scripts replaced by this package are not those
+of any supported version of XenServer. This could lead to unexpected
+behavior of your server. Unless you are sure you know what you are
+doing, it is highly recommended that you remove this package
+immediately after the install completes, which will restore the
+XenServer scripts that you were previously using.
+
+EOF
fi
fi
-if test ! -e /etc/ovs-vswitch.dbcache; then
+if test ! -e /var/lib/openvswitch/dbcache; then
if test "$1" = 1; then
printf "Creating xapi database cache... "
else
printf "Re-creating xapi database cache... "
fi
- source /etc/xensource-inventory
- if python - "$INSTALLATION_UUID" <<EOF
-import XenAPI
-import pickle
-import sys
-
-session = XenAPI.xapi_local()
-try:
- session.xenapi.login_with_password("root", "")
-
- vlans = session.xenapi.VLAN.get_all_records()
- bonds = session.xenapi.Bond.get_all_records()
- pifs = session.xenapi.PIF.get_all_records()
- networks = session.xenapi.network.get_all_records()
- host = session.xenapi.host.get_by_uuid(sys.argv[1])
-finally:
- session.xenapi.session.logout()
-
-dbcache_file = "/etc/ovs-vswitch.dbcache"
-f = open(dbcache_file, 'w')
-pickle.dump({'vlans': vlans,
- 'bonds': bonds,
- 'pifs': pifs,
- 'networks': networks}, f)
-pickle.dump({'host': host}, f)
-f.close()
-EOF
- then
+ if /usr/share/vswitch/scripts/interface-reconfigure init-dbcache; then
printf "done.\n"
else
printf "FAILED\n"
fi
fi
-%post
-source /etc/xensource-inventory
-
-xe host-param-set \
- "other-config:vSwitchVersion=%{version}" uuid="$INSTALLATION_UUID" ||
- echo "Could not set vSwitchVersion config parameter"
+# Ensure that modprobe will find our modules.
+depmod %{xen_version}
+
+if grep -F net.ipv4.conf.all.arp_filter /etc/sysctl.conf >/dev/null 2>&1; then :; else
+ cat >>/etc/sysctl.conf <<EOF
+# This works around an issue in xhad, which binds to a particular
+# Ethernet device, which in turn causes ICMP port unreachable messages
+# if packets are received are on the wrong interface, which in turn
+# can happen if we send out ARP replies on every interface (as Linux
+# does by default) instead of just on the interface that has the IP
+# address being ARPed for, which this sysctl setting in turn works
+# around.
+#
+# Bug #1378.
+net.ipv4.conf.all.arp_filter = 1
+EOF
+fi
# Ensure ovs-vswitchd.conf exists
touch /etc/ovs-vswitchd.conf
-# Replace original XenServer files
-mkdir -p %{_prefix}/xs-original \
+# Create default or update existing /etc/sysconfig/vswitch.
+SYSCONFIG=/etc/sysconfig/vswitch
+TEMPLATE=/usr/share/vswitch/scripts/sysconfig.template
+if [ ! -e $SYSCONFIG ]; then
+ cp $TEMPLATE $SYSCONFIG
+else
+ for var in $(awk -F'[ :]' '/^# [_A-Z0-9]+:/{print $2}' $TEMPLATE)
+ do
+ if ! grep $var $SYSCONFIG >/dev/null 2>&1; then
+ echo >> $SYSCONFIG
+ sed -n "/$var:/,/$var=/p" $TEMPLATE >> $SYSCONFIG
+ fi
+ done
+fi
+
+# Replace XenServer files by our versions.
+mkdir -p /usr/lib/vswitch/xs-original \
|| printf "Could not create script backup directory.\n"
for f in \
/opt/xensource/libexec/interface-reconfigure \
- /etc/xensource/scripts/vif
+ /etc/xensource/scripts/vif \
+ /usr/sbin/xen-bugtool \
+ /usr/sbin/brctl
do
s=$(basename "$f")
t=$(readlink "$f")
- if [ "$t" != "%{_prefix}/scripts/$s" ]; then
- mv "$f" %{_prefix}/xs-original/ \
+ if [ "$t" != "/usr/share/vswitch/scripts/$s" ]; then
+ mv "$f" /usr/lib/vswitch/xs-original/ \
|| printf "Could not save original XenServer $s script\n"
- ln -s "%{_prefix}/scripts/$s" "$f" \
+ ln -s "/usr/share/vswitch/scripts/$s" "$f" \
|| printf "Could not link to vSwitch $s script\n"
fi
done
# Install xsconsole plugin
plugin=$(readlink /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py)
-if [ "$plugin" != "/root/vswitch/scripts/XSFeatureVSwitch.py" ]; then
+if [ "$plugin" != "/usr/share/vswitch/scripts/XSFeatureVSwitch.py" ]; then
rm -f /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.py
- ln -s /root/vswitch/scripts/XSFeatureVSwitch.py /usr/lib/xsconsole/plugins-base/ || printf "Could not link to vSswitch xsconsole plugin.\n"
+ ln -s /usr/share/vswitch/scripts/XSFeatureVSwitch.py /usr/lib/xsconsole/plugins-base/ || printf "Could not link to vSswitch xsconsole plugin.\n"
fi
# Ensure all required services are set to run
# Restore original XenServer scripts
for f in \
/opt/xensource/libexec/interface-reconfigure \
- /etc/xensource/scripts/vif
+ /etc/xensource/scripts/vif \
+ /usr/sbin/xen-bugtool \
+ /usr/sbin/brctl
do
s=$(basename "$f")
- if [ ! -f "%{_prefix}/xs-original/$s" ]; then
- printf "Original XenServer $s script not present in %{_prefix}/xs-original\n"
+ if [ ! -f "/usr/lib/vswitch/xs-original/$s" ]; then
+ printf "Original XenServer $s script not present in /usr/lib/vswitch/xs-original\n"
printf "Could not restore original XenServer script.\n"
else
(rm -f "$f" \
- && mv "%{_prefix}/xs-original/$s" "$f") \
+ && mv "/usr/lib/vswitch/xs-original/$s" "$f") \
|| printf "Could not restore original XenServer $s script.\n"
fi
done
- find %{_prefix} -type d -depth -exec rmdir \{\} \; \
- || printf "Could not remove vSwitch install directory.\n"
-
- # Remove all configuration and log files
+ # Remove all configuration files
rm -f /etc/ovs-vswitchd.conf
rm -f /etc/sysconfig/vswitch
- rm -f /var/log/vswitch*
rm -f /etc/ovs-vswitchd.cacert
- if [ ! -f /etc/xensource-inventory ]; then
- printf "XenSource inventory not present in /etc/xensource-inventory\n"
- printf "Could not remove vSwitchVersion from XAPI database.\n"
- exit 1
- else
- source /etc/xensource-inventory
- xe host-param-remove \
- param-name=other-config param-key=vSwitchVersion \
- uuid="$INSTALLATION_UUID" ||
- echo "Could not clear vSwitchVersion config parameter."
- fi
-
printf "\nYou MUST reboot the server now to complete the change to\n"
printf "standard Xen networking. Attempts to modify networking on the\n"
printf "server or any hosted VM will fail until after the reboot and\n"
/etc/init.d/vswitch
/etc/init.d/vswitch-xapi-update
/etc/xapi.d/plugins/vswitch-cfg-update
-/etc/sysconfig/vswitch.example
/etc/logrotate.d/vswitch
/etc/profile.d/vswitch.sh
-/root/vswitch/kernel_modules/brcompat_mod.ko
-/root/vswitch/kernel_modules/openvswitch_mod.ko
-/root/vswitch/kernel_modules/veth_mod.ko
-/root/vswitch/scripts/interface-reconfigure
-/root/vswitch/scripts/vif
-/root/vswitch/scripts/XSFeatureVSwitch.py
+/lib/modules/%{xen_version}/kernel/net/vswitch/openvswitch_mod.ko
+/lib/modules/%{xen_version}/kernel/net/vswitch/brcompat_mod.ko
+/usr/share/vswitch/scripts/dump-vif-details
+/usr/share/vswitch/scripts/interface-reconfigure
+/usr/share/vswitch/scripts/vif
+/usr/share/vswitch/scripts/xen-bugtool
+/usr/share/vswitch/scripts/XSFeatureVSwitch.py
+/usr/share/vswitch/scripts/brctl
+/usr/share/vswitch/scripts/sysconfig.template
# Following two files are generated automatically by rpm. We don't
# really need them and they won't be used on the XenServer, but there
# isn't an obvious place to get rid of them since they are generated
# after the install script runs. Since they are small, we just
# include them.
-/root/vswitch/scripts/XSFeatureVSwitch.pyc
-/root/vswitch/scripts/XSFeatureVSwitch.pyo
-/root/vswitch/sbin/ovs-brcompatd
-/root/vswitch/sbin/ovs-vswitchd
-/root/vswitch/bin/ovs-appctl
-/root/vswitch/bin/ovs-cfg-mod
-/root/vswitch/bin/ovs-dpctl
-/root/vswitch/bin/ovs-ofctl
-/root/vswitch/share/man/man5/ovs-vswitchd.conf.5
-/root/vswitch/share/man/man8/ovs-appctl.8
-/root/vswitch/share/man/man8/ovs-brcompatd.8
-/root/vswitch/share/man/man8/ovs-cfg-mod.8
-/root/vswitch/share/man/man8/ovs-dpctl.8
-/root/vswitch/share/man/man8/ovs-ofctl.8
-/root/vswitch/share/man/man8/ovs-vswitchd.8
+/usr/share/vswitch/scripts/XSFeatureVSwitch.pyc
+/usr/share/vswitch/scripts/XSFeatureVSwitch.pyo
+/usr/sbin/ovs-brcompatd
+/usr/sbin/ovs-vswitchd
+/usr/bin/ovs-appctl
+/usr/bin/ovs-cfg-mod
+/usr/bin/ovs-dpctl
+/usr/bin/ovs-ofctl
+/usr/bin/ovs-vsctl
+/usr/share/man/man5/ovs-vswitchd.conf.5.gz
+/usr/share/man/man8/ovs-appctl.8.gz
+/usr/share/man/man8/ovs-brcompatd.8.gz
+/usr/share/man/man8/ovs-cfg-mod.8.gz
+/usr/share/man/man8/ovs-dpctl.8.gz
+/usr/share/man/man8/ovs-ofctl.8.gz
+/usr/share/man/man8/ovs-vsctl.8.gz
+/usr/share/man/man8/ovs-vswitchd.8.gz
+/var/lib/openvswitch