Debian: fail gracefully if modules can't be loaded on install
authorSimon Horman <horms@verge.net.au>
Sat, 10 Sep 2011 06:09:31 +0000 (15:09 +0900)
committerBen Pfaff <blp@nicira.com>
Mon, 12 Sep 2011 16:31:18 +0000 (09:31 -0700)
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]

debian/openvswitch-switch.init
debian/openvswitch-switch.postinst
debian/rules

index 3487afb4910acf67165f72003936ab9ffaa22637..3d187a05642dbf266a5e40485c436761ee95db1f 100755 (executable)
@@ -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
index 74b52ba90f09644982d1b98fcaf9efed7ba6bb94..c50853a11879da0501c88060c5734745b1139f5f 100755 (executable)
@@ -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
index c4a3ba7c2b441f1fd8ff3de60bb75f8a8bcd1324..1773cc71d1276c705bbe8da1cc766c1da322838e 100755 (executable)
@@ -117,7 +117,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