[Libvirt-cim] [PATCH 1/3] build: Fix incorrect provider registration in upgrade path

Viktor Mihajlovski mihajlov at linux.vnet.ibm.com
Tue Nov 5 09:03:31 UTC 2013


The scriplet logic was incorrectly assuming that the superseded package's
%postun script would be called before the superceding packages %pre/%post.
This effectively broke upgrades of libvirt-cim because all the providers
were deregistered.
We are now checking whether we are in an upgrade situation and if so
will not deregister the providers in postun.
Another enhancement is that we do a full deregistration in the %post
section for tog-pegasus now. This should make installs and upgrades more
robust against potentially damaged repositories (e.g., on development
systems).

As a reminder here's a short description of RPM's scriptlet processing.

action:         install upgrade uninstall
        %pre    1       >1       -
        %post   1       >1       -
        %preun  -       1        0
        %postun -       1        0

Scriptlet invocation order on upgrade
1. %pre(new_package)
2. %post(new_package)
3. %preun(old_package)
4. %postun(old_package)

Signed-off-by: Viktor Mihajlovski <mihajlov at linux.vnet.ibm.com>
---
 libvirt-cim.spec.in |  115 ++++++++++++++++++++++++++++++---------------------
 1 file changed, 68 insertions(+), 47 deletions(-)

diff --git a/libvirt-cim.spec.in b/libvirt-cim.spec.in
index 459650c..b50cbd1 100644
--- a/libvirt-cim.spec.in
+++ b/libvirt-cim.spec.in
@@ -64,7 +64,6 @@ mkdir -p $RPM_BUILD_ROOT at INFO_STORE@
 %clean
 rm -fr $RPM_BUILD_ROOT
 
-%pre
 %define REGISTRATION %{_datadir}/%{name}/*.registration
 %define SCHEMA %{_datadir}/%{name}/*.mof
 
@@ -77,24 +76,46 @@ rm -fr $RPM_BUILD_ROOT
 %define CIMV2_REG %{_datadir}/%{name}/{HostedResourcePool,ElementCapabilities,HostedService,HostedDependency,ElementConformsToProfile,HostedAccessPoint}.registration
 %define CIMV2_MOF %{_datadir}/%{name}/{HostedResourcePool,ElementCapabilities,HostedService,HostedDependency,RegisteredProfile,ComputerSystem,ElementConformsToProfile,HostedAccessPoint}.mof
 
+%pre
 # _If_ there is already a version of this installed, we must deregister
 # the classes we plan to install in post, otherwise we may corrupt
 # the pegasus repository.  This is convention in other provider packages
-%{_datadir}/%{name}/provider-register.sh -d -t pegasus \
-	-n @CIM_VIRT_NS@ \
-	-r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
+if [ $1 -gt 1 ]
+then
+    if [ -x /usr/sbin/cimserver ]
+    then
+	%{_datadir}/%{name}/provider-register.sh -d -t pegasus \
+	    -n @CIM_VIRT_NS@ \
+	    -r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
+	%{_datadir}/%{name}/provider-register.sh -d -t pegasus \
+            -n root/interop \
+            -r %{INTEROP_REG} -m %{INTEROP_MOF} -v >/dev/null 2>&1 || true
+	%{_datadir}/%{name}/provider-register.sh -d -t pegasus \
+            -n root/PG_InterOp \
+            -r %{PGINTEROP_REG} -m %{PGINTEROP_MOF} -v >/dev/null 2>&1 || true
+	%{_datadir}/%{name}/provider-register.sh -d -t pegasus \
+            -n root/cimv2\
+        -r %{CIMV2_REG} -m %{CIMV2_MOF} -v >/dev/null 2>&1 || true
+    fi
 
 # Remove open-pegasus-specific providers installed in sfcb repository
 # by older libvirt-cim packages
-%{_datadir}/%{name}/provider-register.sh -d -t sfcb \
-    -n root/PG_InterOp \
-    -r %{PGINTEROP_REG} -m %{PGINTEROP_MOF} >/dev/null 2>&1 || true
-
+    if [ -x /usr/sbin/sfcbd ]
+    then
+	%{_datadir}/%{name}/provider-register.sh -d -t sfcb \
+	    -n root/PG_InterOp \
+	    -r %{PGINTEROP_REG} -m %{PGINTEROP_MOF} >/dev/null 2>&1 || true
+    fi
+fi
 
 %post
 /sbin/ldconfig
 
-%{_datadir}/%{name}/install_base_schema.sh %{_datadir}/%{name}
+if [ $1 -eq 1 ]
+then
+# Install the CIM base schema if this is the initial install
+    %{_datadir}/%{name}/install_base_schema.sh %{_datadir}/%{name}
+fi
 
 %if 0%{?fedora} >= 17 || 0%{?rhel} >= 7
     if [ "`systemctl is-active tog-pegasus.service`" = "active" ]
@@ -112,65 +133,65 @@ rm -fr $RPM_BUILD_ROOT
 
 if [ -x /usr/sbin/cimserver ]
 then
-%{_datadir}/%{name}/provider-register.sh -t pegasus \
+    %{_datadir}/%{name}/provider-register.sh -t pegasus \
 	-n @CIM_VIRT_NS@ \
 	-r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -t pegasus \
-        -n @CIM_VIRT_NS@ \
-        -r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -t pegasus \
+    %{_datadir}/%{name}/provider-register.sh -t pegasus \
         -n root/interop \
         -r %{INTEROP_REG} -m %{INTEROP_MOF} -v >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -t pegasus \
+    %{_datadir}/%{name}/provider-register.sh -t pegasus \
         -n root/PG_InterOp \
         -r %{PGINTEROP_REG} -m %{PGINTEROP_MOF} -v >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -t pegasus \
+    %{_datadir}/%{name}/provider-register.sh -t pegasus \
         -n root/cimv2\
         -r %{CIMV2_REG} -m %{CIMV2_MOF} -v >/dev/null 2>&1 || true
 fi
 if [ -x /usr/sbin/sfcbd ]
 then
-%{_datadir}/%{name}/provider-register.sh -t sfcb \
-	-n root/virt \
-	-r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -t sfcb \
+    %{_datadir}/%{name}/provider-register.sh -t sfcb \
         -n root/virt \
         -r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -t sfcb \
+    %{_datadir}/%{name}/provider-register.sh -t sfcb \
         -n root/interop \
         -r %{INTEROP_REG} -m %{INTEROP_MOF} -v >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -t sfcb \
+    %{_datadir}/%{name}/provider-register.sh -t sfcb \
         -n root/cimv2\
         -r %{CIMV2_REG} -m %{CIMV2_MOF} -v >/dev/null 2>&1 || true
 fi
 
 %preun
-if [ -x /usr/sbin/cimserver ]
+# The uninstall scriptlets are called after the install scriptlets
+# in the upgrade case. Therefore we must only deregister the providers
+# when $1 == 0 (final remove).
+if [ $1 -eq 0 ]
 then
-%{_datadir}/%{name}/provider-register.sh -d -t pegasus \
-	-n root/virt \
-	-r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -d -t pegasus \
-	-n root/interop \
-	-r %{INTEROP_REG} -m %{INTEROP_MOF} >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -d -t pegasus \
-	-n root/PG_InterOp \
-	-r %{PGINTEROP_REG} -m %{PGINTEROP_MOF} >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -d -t pegasus \
-	-n root/cimv2 \
-	-r %{CIMV2_REG} -m %{CIMV2_MOF} >/dev/null 2>&1 || true
-fi
-if [ -x /usr/sbin/sfcbd ]
-then
-%{_datadir}/%{name}/provider-register.sh -d -t sfcb \
-	-n root/virt \
-	-r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -d -t sfcb \
-	-n root/interop \
-	-r %{INTEROP_REG} -m %{INTEROP_MOF} >/dev/null 2>&1 || true
-%{_datadir}/%{name}/provider-register.sh -d -t sfcb \
-	-n root/cimv2 \
-	-r %{CIMV2_REG} -m %{CIMV2_MOF} >/dev/null 2>&1 || true
+    if [ -x /usr/sbin/cimserver ]
+    then
+	%{_datadir}/%{name}/provider-register.sh -d -t pegasus \
+	    -n root/virt \
+	    -r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
+	%{_datadir}/%{name}/provider-register.sh -d -t pegasus \
+	    -n root/interop \
+	    -r %{INTEROP_REG} -m %{INTEROP_MOF} >/dev/null 2>&1 || true
+	%{_datadir}/%{name}/provider-register.sh -d -t pegasus \
+	    -n root/PG_InterOp \
+	    -r %{PGINTEROP_REG} -m %{PGINTEROP_MOF} >/dev/null 2>&1 || true
+	%{_datadir}/%{name}/provider-register.sh -d -t pegasus \
+	    -n root/cimv2 \
+	    -r %{CIMV2_REG} -m %{CIMV2_MOF} >/dev/null 2>&1 || true
+    fi
+    if [ -x /usr/sbin/sfcbd ]
+    then
+	%{_datadir}/%{name}/provider-register.sh -d -t sfcb \
+	    -n root/virt \
+	    -r %{REGISTRATION} -m %{SCHEMA} >/dev/null 2>&1 || true
+	%{_datadir}/%{name}/provider-register.sh -d -t sfcb \
+	    -n root/interop \
+	    -r %{INTEROP_REG} -m %{INTEROP_MOF} >/dev/null 2>&1 || true
+	%{_datadir}/%{name}/provider-register.sh -d -t sfcb \
+	    -n root/cimv2 \
+	    -r %{CIMV2_REG} -m %{CIMV2_MOF} >/dev/null 2>&1 || true
+    fi
 fi
 
 %postun -p /sbin/ldconfig
-- 
1.7.9.5




More information about the Libvirt-cim mailing list