From: Simon Horman <horms@verge.net.au>
Date: Sat, 10 Sep 2011 06:09:31 +0000 (+0900)
Subject: Debian: fail gracefully if modules can't be loaded on install
X-Git-Tag: v1.2.2~12
X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=bab7890cf7f3a74bc0512353bd11f62bf4489e5e;p=sliver-openvswitch.git

Debian: fail gracefully if modules can't be loaded on install

By registering an error-handler for the init script used
in openvswitch-switch.postinst and detecting if module insertion fails,
it is possible to avoid failure to install in the case where the
openvswitch_mod module is not available.

This is done without altering the behaviour that the start target
of the openvswitch-switch init script will fail if module insertion fails.

This patch also adds a friendly hint as as to why starting
openvswitch-switch has failed if it is due to failure to insert
the openvswtich_mod. This message is displayed as necessary both
on package install and other calls to the start target of the
init script.

[Ben Pfaff fixed up == to = in postinst]
---

diff --git a/debian/openvswitch-switch.init b/debian/openvswitch-switch.init
index 3487afb49..3d187a056 100755
--- a/debian/openvswitch-switch.init
+++ b/debian/openvswitch-switch.init
@@ -41,7 +41,22 @@ ovs_ctl () {
     "$@"
 }
 
+load_kmod () {
+    ovs_ctl load-kmod || exit $?
+}
+
 start () {
+    if ovs_ctl load-kmod; then
+	:
+    else
+	echo "Module has probably not been built for this kernel."
+	if ! test -d /usr/share/doc/openvswitch-datapath-source; then
+	    echo "Install the openvswitch-datapath-source package, then read"
+	else
+            echo "For instructions, read"
+	fi
+	echo "/usr/share/doc/openvswitch-datapath-source/README.Debian"
+    fi
     set ovs_ctl ${1-start} --system-id=random
     if test X"$FORCE_COREFILES" != X; then
 	set "$@" --force-corefiles="$FORCE_COREFILES"
@@ -75,8 +90,11 @@ case $1 in
     force-reload-kmod)
         start force-reload-kmod
         ;;
+    load-kmod)
+        load_kmod
+        ;;
     *)
-        echo "Usage: $0 {start|stop|restart|force-reload|status|force-stop|force-reload-kmod}" >&2
+        echo "Usage: $0 {start|stop|restart|force-reload|status|force-stop|force-reload-kmod|load-kmod}" >&2
         exit 1
         ;;
 esac
diff --git a/debian/openvswitch-switch.postinst b/debian/openvswitch-switch.postinst
index 74b52ba90..c50853a11 100755
--- a/debian/openvswitch-switch.postinst
+++ b/debian/openvswitch-switch.postinst
@@ -44,6 +44,23 @@ case "$1" in
         ;;
 esac
 
+HAVE_KMOD="no"
+
+init_script_error () {
+	if test X"$HAVE_KMOD" = Xno; then
+		exit 0
+	fi
+	exit 1
+}
+
+# Do not fail package installation just because the kernel module
+# is not available.
+if test -x /etc/init.d/openvswitch-switch; then
+    if invoke-rc.d openvswitch-switch load-kmod; then
+	HAVE_KMOD="yes"
+    fi
+fi
+
 #DEBHELPER#
 
 exit 0
diff --git a/debian/rules b/debian/rules
index 5c80cc60b..accd26dbd 100755
--- a/debian/rules
+++ b/debian/rules
@@ -102,7 +102,8 @@ binary-common:
 	dh_installexamples
 	dh_installdebconf
 	dh_installlogrotate
-	dh_installinit -R
+	dh_installinit -R -Nopenvswitch-switch
+	dh_installinit -R -popenvswitch-switch --error-handler=init_script_error
 	dh_installcron
 	dh_installman
 	dh_link