From 5cb12f2eeffdfcb7696bdcb652b581cfd13d1c3a Mon Sep 17 00:00:00 2001 From: Andrew Evans Date: Thu, 17 Feb 2011 12:51:34 -0800 Subject: [PATCH] xenserver: Revert only the XenServer scripts no longer replaced by OVS. Commit d66880ee (xenserver: Clean up /usr/sbin/brctl dangling symlink.) attempted to revert the original XenServer-shipped versions of scripts replaced by OVS during an RPM upgrade, but the logic was incorrect. It assumed that %postun of the package being replaced was run before the %post of the new version replacing it. The reverse is actually true. Make upgrade and erase cases both work correctly by simply checking whether any of the files ever replaced in any OVS version are dangling symlinks, and if so, attempt to copy the saved XenServer original back to its rightful place. In the upgrade case, if the newly-installed version of OVS lacks any of the scripts in the previous version, those will be reverted. In the erase case, none of the OVS replacements will exist, so they will all be dangling symlinks and will all be reverted. Furthermore, replace any dangling symlink from /usr/sbin/xen-bugtool to the now-nonexistent OVS replacement (caused by commit 92dbd5c9 (xenserver: Replace customized xen-bugtool with plugin to collect qdisc info.)). Lastly, prevent accidental reversion of files replaced by OVS during rpm -U (also caused by commit 92dbd5c9). Bug #4696. --- xenserver/openvswitch-xen.spec | 87 ++++++++++++++++++++++------------ 1 file changed, 58 insertions(+), 29 deletions(-) diff --git a/xenserver/openvswitch-xen.spec b/xenserver/openvswitch-xen.spec index 25e8a96c..a5df6d6e 100644 --- a/xenserver/openvswitch-xen.spec +++ b/xenserver/openvswitch-xen.spec @@ -181,8 +181,17 @@ else done fi +# Deliberately break %postun in broken OVS builds that revert original +# XenServer scripts during rpm -U by moving the directory where it thinks +# they are saved. +if [ -d /usr/lib/openvswitch/xs-original ]; then + mkdir -p /usr/lib/openvswitch/xs-saved + mv /usr/lib/openvswitch/xs-original/* /usr/lib/openvswitch/xs-saved/ && + rmdir /usr/lib/openvswitch/xs-original +fi + # Replace XenServer files by our versions. -mkdir -p /usr/lib/openvswitch/xs-original \ +mkdir -p /usr/lib/openvswitch/xs-saved \ || printf "Could not create script backup directory.\n" for f in \ /opt/xensource/libexec/interface-reconfigure \ @@ -194,19 +203,24 @@ do s=$(basename "$f") t=$(readlink "$f") if [ -f "$f" ] && [ "$t" != "/usr/share/openvswitch/scripts/$s" ]; then - mv "$f" /usr/lib/openvswitch/xs-original/ \ + mv "$f" /usr/lib/openvswitch/xs-saved/ \ || printf "Could not save original XenServer $s script\n" ln -s "/usr/share/openvswitch/scripts/$s" "$f" \ || printf "Could not link to Open vSwitch $s script\n" fi done -# Bug #4667: one-time cleanup of brctl removal in commit 54f16a10 -# (xenserver: Remove brctl wrapper script). -if [ -h /usr/sbin/brctl ] && - [ "$(readlink /usr/sbin/brctl)" = /usr/share/openvswitch/scripts/brctl ]; then - mv -f /usr/lib/openvswitch/xs-original/brctl /usr/sbin/ -fi +# Clean up dangling symlinks to removed OVS replacement scripts no longer +# provided by OVS. Any time a replacement script is removed from OVS, +# it should be added here to ensure correct reversion from old versions of +# OVS that don't clean up dangling symlinks during the uninstall phase. +for orig in \ + /usr/sbin/brctl \ + /usr/sbin/xen-bugtool +do + saved=/usr/lib/openvswitch/xs-saved/$(basename "$orig") + [ -e "$saved" ] && mv -f "$saved" "$orig" +done # Ensure all required services are set to run for s in openvswitch openvswitch-xapi-update; do @@ -240,42 +254,57 @@ fi %postun -rm -f /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyc \ - /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyo - -rm -f /usr/share/openvswitch/scripts/InterfaceReconfigure.pyc \ - /usr/share/openvswitch/scripts/InterfaceReconfigure.pyo \ - /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyc \ - /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyo \ - /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyc \ - /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyo - -# Restore original XenServer scripts +# Restore original XenServer scripts if the OVS equivalent no longer exists. +# This works both in the upgrade and erase cases. +# This lists every file that every version of OVS has ever replaced. Never +# remove old files that OVS no longer replaces, or upgrades from old versions +# will fail to restore the XS originals, leaving the system in a broken state. +# Also be sure to add removed script paths to the %post scriptlet above to +# prevent the same problem when upgrading from old versions of OVS that lack +# this restore-on-upgrade logic. for f in \ + /etc/xensource/scripts/vif \ + /usr/sbin/brctl \ + /usr/sbin/xen-bugtool \ /opt/xensource/libexec/interface-reconfigure \ /opt/xensource/libexec/InterfaceReconfigure.py \ /opt/xensource/libexec/InterfaceReconfigureBridge.py \ - /opt/xensource/libexec/InterfaceReconfigureVswitch.py \ - /etc/xensource/scripts/vif + /opt/xensource/libexec/InterfaceReconfigureVswitch.py do - s=$(basename "$f") - if [ ! -f "/usr/lib/openvswitch/xs-original/$s" ]; then - printf "Original XenServer $s script not present in /usr/lib/openvswitch/xs-original\n" - printf "Could not restore original XenServer script.\n" - else - (rm -f "$f" \ - && mv "/usr/lib/openvswitch/xs-original/$s" "$f") \ - || printf "Could not restore original XenServer $s script.\n" + # Only revert dangling symlinks. + if [ -h "$f" ] && [ ! -e "$f" ]; then + s=$(basename "$f") + if [ ! -f "/usr/lib/openvswitch/xs-saved/$s" ]; then + printf "Original XenServer $s script not present in /usr/lib/openvswitch/xs-saved\n" >&2 + printf "Could not restore original XenServer script.\n" >&2 + else + (rm -f "$f" \ + && mv "/usr/lib/openvswitch/xs-saved/$s" "$f") \ + || printf "Could not restore original XenServer $s script.\n" >&2 + fi fi done if [ "$1" = "0" ]; then # $1 = 1 for upgrade + rm -f /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyc \ + /usr/lib/xsconsole/plugins-base/XSFeatureVSwitch.pyo + + rm -f /usr/share/openvswitch/scripts/InterfaceReconfigure.pyc \ + /usr/share/openvswitch/scripts/InterfaceReconfigure.pyo \ + /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyc \ + /usr/share/openvswitch/scripts/InterfaceReconfigureBridge.pyo \ + /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyc \ + /usr/share/openvswitch/scripts/InterfaceReconfigureVSwitch.pyo + # Remove all configuration files rm -f /etc/openvswitch/conf.db rm -f /etc/sysconfig/openvswitch rm -f /etc/openvswitch/vswitchd.cacert rm -f /var/xapi/network.dbcache + # Remove saved XenServer scripts directory, but only if it's empty + rmdir -p /usr/lib/openvswitch/xs-saved 2>/dev/null + # Configure system to use bridge echo bridge > /etc/xensource/network.conf -- 2.30.2