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 openvswtich-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. --- v2 * Avoid using if !, as it may have portability problems * Avoid duplicated 'echo "/usr/share/doc..."' v3 * Do not ignore module insertion failure on start, instead add extra logic to the postinst script. As suggested by Ben Phaff --- debian/openvswitch-switch.init | 20 +++++++++++++++++++- debian/openvswitch-switch.postinst | 17 +++++++++++++++++ debian/rules | 3 ++- 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/debian/openvswitch-switch.init b/debian/openvswitch-switch.init index 3487afb..3d187a0 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 74b52ba..9e8aaaf 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 5c80cc6..accd26d 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 -- 1.7.5.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev