diff options
-rwxr-xr-x | ctdb/Makefile.in | 1 | ||||
-rwxr-xr-x | ctdb/config/events.d/49.winbind | 75 | ||||
-rwxr-xr-x | ctdb/config/events.d/50.samba | 195 | ||||
-rw-r--r-- | ctdb/packaging/RPM/ctdb.spec.in | 1 | ||||
-rwxr-xr-x | ctdb/tests/eventscripts/49.winbind.monitor.001.sh | 11 | ||||
-rwxr-xr-x | ctdb/tests/eventscripts/49.winbind.monitor.050.sh | 17 | ||||
-rwxr-xr-x | ctdb/tests/eventscripts/49.winbind.monitor.051.sh | 18 | ||||
-rwxr-xr-x | ctdb/tests/eventscripts/49.winbind.monitor.101.sh | 11 | ||||
-rwxr-xr-x | ctdb/tests/eventscripts/49.winbind.monitor.102.sh (renamed from ctdb/tests/eventscripts/50.samba.monitor.102.sh) | 2 | ||||
-rwxr-xr-x | ctdb/tests/eventscripts/50.samba.monitor.050.sh | 1 | ||||
-rwxr-xr-x | ctdb/tests/eventscripts/50.samba.monitor.051.sh | 2 | ||||
-rw-r--r-- | ctdb/tests/eventscripts/scripts/local.sh | 49 |
12 files changed, 225 insertions, 158 deletions
diff --git a/ctdb/Makefile.in b/ctdb/Makefile.in index cbb987a57a..48cb57c5d6 100755 --- a/ctdb/Makefile.in +++ b/ctdb/Makefile.in @@ -341,6 +341,7 @@ install: all $(PMDA_INSTALL) ${INSTALLCMD} -m 755 config/events.d/40.vsftpd $(DESTDIR)$(etcdir)/ctdb/events.d ${INSTALLCMD} -m 644 config/events.d/40.fs_use $(DESTDIR)$(etcdir)/ctdb/events.d ${INSTALLCMD} -m 755 config/events.d/41.httpd $(DESTDIR)$(etcdir)/ctdb/events.d + ${INSTALLCMD} -m 755 config/events.d/49.winbind $(DESTDIR)$(etcdir)/ctdb/events.d ${INSTALLCMD} -m 755 config/events.d/50.samba $(DESTDIR)$(etcdir)/ctdb/events.d ${INSTALLCMD} -m 755 config/events.d/60.nfs $(DESTDIR)$(etcdir)/ctdb/events.d ${INSTALLCMD} -m 755 config/events.d/60.ganesha $(DESTDIR)$(etcdir)/ctdb/events.d diff --git a/ctdb/config/events.d/49.winbind b/ctdb/config/events.d/49.winbind new file mode 100755 index 0000000000..b67951ba15 --- /dev/null +++ b/ctdb/config/events.d/49.winbind @@ -0,0 +1,75 @@ +#!/bin/sh +# ctdb event script for winbind + +. $CTDB_BASE/functions + +detect_init_style + +CTDB_SERVICE_WINBIND=${CTDB_SERVICE_WINBIND:-winbind} + +service_name="winbind" + +loadconfig + +ctdb_setup_service_state_dir + +service_start () +{ + service "$CTDB_SERVICE_WINBIND" stop >/dev/null 2>&1 + killall -0 -q winbindd && { + sleep 1 + # make absolutely sure winbindd is dead + killall -q -9 winbindd + } + + service "$CTDB_SERVICE_WINBIND" start || \ + die "Failed to start winbind" +} + +service_stop () +{ + service "$CTDB_SERVICE_WINBIND" stop +} + +service_reconfigure () +{ + # winbind automatically reloads config - no restart needed. + : +} + +########################### + +ctdb_start_stop_service + +is_ctdb_managed_service || exit 0 + +ctdb_service_check_reconfigure + +########################### + +case "$1" in + startup) + ctdb_service_start + ;; + + shutdown) + ctdb_service_stop + ;; + + monitor) + ctdb_check_command "winbind" "wbinfo -p" + ;; + + takeip|releaseip) + iface=$2 + ip=$3 + maskbits=$4 + + smbcontrol winbindd ip-dropped $ip >/dev/null 2>/dev/null + ;; + *) + ctdb_standard_event_handler "$@" + ;; +esac + +exit 0 diff --git a/ctdb/config/events.d/50.samba b/ctdb/config/events.d/50.samba index bf143bf26e..4d9f12165d 100755 --- a/ctdb/config/events.d/50.samba +++ b/ctdb/config/events.d/50.samba @@ -9,18 +9,15 @@ case $CTDB_INIT_STYLE in suse) CTDB_SERVICE_SMB=${CTDB_SERVICE_SMB:-smb} CTDB_SERVICE_NMB=${CTDB_SERVICE_NMB:-nmb} - CTDB_SERVICE_WINBIND=${CTDB_SERVICE_WINBIND:-winbind} ;; debian) CTDB_SERVICE_SMB=${CTDB_SERVICE_SMB:-samba} CTDB_SERVICE_NMB=${CTDB_SERVICE_NMB:-""} - CTDB_SERVICE_WINBIND=${CTDB_SERVICE_WINBIND:-winbind} ;; *) - # should not happen, but for now use redhat style as default: + # Use redhat style as default: CTDB_SERVICE_SMB=${CTDB_SERVICE_SMB:-smb} CTDB_SERVICE_NMB=${CTDB_SERVICE_NMB:-""} - CTDB_SERVICE_WINBIND=${CTDB_SERVICE_WINBIND:-winbind} ;; esac @@ -32,89 +29,40 @@ ctdb_setup_service_state_dir service_start () { - # If set then we force-start the relevant service. - _service_name="$1" - - # make sure samba is not already started - if [ "$_service_name" = "samba" ] || \ - is_ctdb_managed_service "samba" ; then - service "$CTDB_SERVICE_SMB" stop > /dev/null 2>&1 - if [ -n "$CTDB_SERVICE_NMB" ] ; then - service "$CTDB_SERVICE_NMB" stop > /dev/null 2>&1 - fi - killall -0 -q smbd && { - sleep 1 - # make absolutely sure samba is dead - killall -q -9 smbd - } - - killall -0 -q nmbd && { - sleep 1 - # make absolutely sure samba is dead - killall -q -9 nmbd - } - fi - - # make sure winbind is not already started - if [ "$_service_name" = "winbind" ] || \ - check_ctdb_manages_winbind ; then - service "$CTDB_SERVICE_WINBIND" stop > /dev/null 2>&1 - killall -0 -q winbindd && { - sleep 1 - # make absolutely sure winbindd is dead - killall -q -9 winbindd - } + # make sure samba is not already started + service "$CTDB_SERVICE_SMB" stop > /dev/null 2>&1 + if [ -n "$CTDB_SERVICE_NMB" ] ; then + service "$CTDB_SERVICE_NMB" stop > /dev/null 2>&1 + fi + killall -0 -q smbd && { + sleep 1 + # make absolutely sure samba is dead + killall -q -9 smbd + } + killall -0 -q nmbd && { + sleep 1 + # make absolutely sure samba is dead + killall -q -9 nmbd + } - fi + # start Samba service. Start it reniced, as under very heavy load + # the number of smbd processes will mean that it leaves few cycles + # for anything else + net serverid wipe - # start the winbind service - if [ "$_service_name" = "winbind" ] || \ - check_ctdb_manages_winbind ; then - service "$CTDB_SERVICE_WINBIND" start || { - echo failed to start winbind - exit 1 - } - fi + if [ -n "$CTDB_SERVICE_NMB" ] ; then + nice_service "$CTDB_SERVICE_NMB" start || die "Failed to start nmbd" + fi - # start Samba service. Start it reniced, as under very heavy load - # the number of smbd processes will mean that it leaves few cycles for - # anything else - if [ "$_service_name" = "samba" ] || \ - is_ctdb_managed_service "samba" ; then - net serverid wipe - - if [ -n "$CTDB_SERVICE_NMB" ] ; then - nice_service "$CTDB_SERVICE_NMB" start || { - echo failed to start nmbd - exit 1 - } - fi - nice_service "$CTDB_SERVICE_SMB" start || { - echo failed to start samba - exit 1 - } - fi + nice_service "$CTDB_SERVICE_SMB" start || die "Failed to start samba" } service_stop () { - # If set then we force-stop the relevant service. - _service_name="$1" - - # shutdown Samba when ctdb goes down - if [ "$_service_name" = "samba" ] || \ - is_ctdb_managed_service "samba" ; then - service "$CTDB_SERVICE_SMB" stop - if [ -n "$CTDB_SERVICE_NMB" ] ; then - service "$CTDB_SERVICE_NMB" stop - fi - fi - - # stop the winbind service - if [ "$_service_name" = "winbind" ] || \ - check_ctdb_manages_winbind ; then - service "$CTDB_SERVICE_WINBIND" stop - fi + service "$CTDB_SERVICE_SMB" stop + if [ -n "$CTDB_SERVICE_NMB" ] ; then + service "$CTDB_SERVICE_NMB" stop + fi } service_reconfigure () @@ -148,7 +96,7 @@ testparm_background_update() { # otherwise do a background update ( tmpfile="${smbconf_cache}.$$" - testparm -s > $tmpfile 2> /dev/null & + testparm -v -s > $tmpfile 2> /dev/null & # remember the pid of the teamparm process pid="$!" # give it 10 seconds to run @@ -195,30 +143,7 @@ testparm_cat() { [ -f $smbconf_cache ] || { testparm_foreground_update } - testparm -s "$smbconf_cache" "$@" 2>/dev/null -} - -# function to see if ctdb manages winbind - this overrides with extra -# logic if $CTDB_MANAGES_WINBIND is not set or null. -check_ctdb_manages_winbind() { - if is_ctdb_managed_service "winbind" ; then - return 0 - elif [ -n "$CTDB_MANAGES_WINBIND" ] ; then - # If this variable is set we want to respect it. We return - # false here because we know it is not set to "yes" - if it - # were then the 1st "if" above would have succeeded. - return 1 - else - _secmode=`testparm_cat --parameter-name=security` - case "$_secmode" in - ADS|DOMAIN) - return 0 - ;; - *) - return 1 - ;; - esac - fi + testparm -v -s "$smbconf_cache" "$@" 2>/dev/null } list_samba_shares () @@ -241,9 +166,10 @@ periodic_cleanup() { ########################### ctdb_start_stop_service -ctdb_start_stop_service "winbind" -is_ctdb_managed_service || is_ctdb_managed_service "winbind" || exit 0 +is_ctdb_managed_service || exit 0 + +ctdb_service_check_reconfigure ########################### @@ -269,46 +195,29 @@ case "$1" in touch "$periodic_cleanup_file" } - is_ctdb_managed_service "samba" && { - [ "$CTDB_SAMBA_SKIP_SHARE_CHECK" = "yes" ] || { - testparm_background_update - - testparm_cat | egrep '^WARNING|^ERROR|^Unknown' && { - testparm_foreground_update - testparm_cat | egrep '^WARNING|^ERROR|^Unknown' && { - echo "ERROR: testparm shows smb.conf is not clean" - exit 1 - } - } - - list_samba_shares | - ctdb_check_directories_probe || { - testparm_foreground_update - list_samba_shares | - ctdb_check_directories - } || exit $? - } + if [ "$CTDB_SAMBA_SKIP_SHARE_CHECK" != "yes" ] ; then + testparm_background_update - smb_ports="$CTDB_SAMBA_CHECK_PORTS" - [ -z "$smb_ports" ] && { - smb_ports=`testparm_cat --parameter-name="smb ports"` - } - ctdb_check_tcp_ports $smb_ports || exit $? - } + testparm_cat | egrep '^WARNING|^ERROR|^Unknown' && { + testparm_foreground_update + testparm_cat | egrep '^WARNING|^ERROR|^Unknown' && \ + die "ERROR: testparm shows smb.conf is not clean" + } + + list_samba_shares | ctdb_check_directories_probe || { + testparm_foreground_update + list_samba_shares | + ctdb_check_directories + } || exit $? + fi - # check winbind is OK - check_ctdb_manages_winbind && { - ctdb_check_command "winbind" "wbinfo -p" - } + smb_ports="$CTDB_SAMBA_CHECK_PORTS" + if [ -z "$smb_ports" ] ; then + smb_ports=`testparm_cat --parameter-name="smb ports"` + fi + ctdb_check_tcp_ports $smb_ports || exit $? ;; - takeip|releaseip) - iface=$2 - ip=$3 - maskbits=$4 - - smbcontrol winbindd ip-dropped $ip >/dev/null 2>/dev/null - ;; *) ctdb_standard_event_handler "$@" ;; diff --git a/ctdb/packaging/RPM/ctdb.spec.in b/ctdb/packaging/RPM/ctdb.spec.in index 381739ca96..6a6398bdc7 100644 --- a/ctdb/packaging/RPM/ctdb.spec.in +++ b/ctdb/packaging/RPM/ctdb.spec.in @@ -139,6 +139,7 @@ rm -rf $RPM_BUILD_ROOT %{_sysconfdir}/ctdb/events.d/40.fs_use %{_sysconfdir}/ctdb/events.d/40.vsftpd %{_sysconfdir}/ctdb/events.d/41.httpd +%{_sysconfdir}/ctdb/events.d/49.winbind %{_sysconfdir}/ctdb/events.d/50.samba %{_sysconfdir}/ctdb/events.d/60.nfs %{_sysconfdir}/ctdb/events.d/60.ganesha diff --git a/ctdb/tests/eventscripts/49.winbind.monitor.001.sh b/ctdb/tests/eventscripts/49.winbind.monitor.001.sh new file mode 100755 index 0000000000..94253d82f6 --- /dev/null +++ b/ctdb/tests/eventscripts/49.winbind.monitor.001.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +. "${TEST_SCRIPTS_DIR}/unit.sh" + +define_test "not managed, check no-op" + +setup_winbind "down" + +ok_null + +simple_test diff --git a/ctdb/tests/eventscripts/49.winbind.monitor.050.sh b/ctdb/tests/eventscripts/49.winbind.monitor.050.sh new file mode 100755 index 0000000000..448c2049aa --- /dev/null +++ b/ctdb/tests/eventscripts/49.winbind.monitor.050.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +. "${TEST_SCRIPTS_DIR}/unit.sh" + +define_test "auto-start, simple" + +setup_winbind "down" + +export CTDB_SERVICE_AUTOSTARTSTOP="yes" +export CTDB_MANAGED_SERVICES="foo winbind bar" + +ok <<EOF +Starting service "winbind" - now managed +Starting winbind: OK +EOF + +simple_test diff --git a/ctdb/tests/eventscripts/49.winbind.monitor.051.sh b/ctdb/tests/eventscripts/49.winbind.monitor.051.sh new file mode 100755 index 0000000000..52f9fa2a9a --- /dev/null +++ b/ctdb/tests/eventscripts/49.winbind.monitor.051.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +. "${TEST_SCRIPTS_DIR}/unit.sh" + +define_test "auto-stop, simple" + +setup_winbind + +export CTDB_SERVICE_AUTOSTARTSTOP="yes" +export CTDB_MANAGED_SERVICES="foo" +unset CTDB_MANAGES_WINBIND + +ok <<EOF +Stopping service "winbind" - no longer managed +Stopping winbind: OK +EOF + +simple_test diff --git a/ctdb/tests/eventscripts/49.winbind.monitor.101.sh b/ctdb/tests/eventscripts/49.winbind.monitor.101.sh new file mode 100755 index 0000000000..ec2952b76b --- /dev/null +++ b/ctdb/tests/eventscripts/49.winbind.monitor.101.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +. "${TEST_SCRIPTS_DIR}/unit.sh" + +define_test "all OK" + +setup_winbind + +ok_null + +simple_test diff --git a/ctdb/tests/eventscripts/50.samba.monitor.102.sh b/ctdb/tests/eventscripts/49.winbind.monitor.102.sh index a2263f3c60..77e2a32d98 100755 --- a/ctdb/tests/eventscripts/50.samba.monitor.102.sh +++ b/ctdb/tests/eventscripts/49.winbind.monitor.102.sh @@ -4,7 +4,7 @@ define_test "winbind down" -setup_samba +setup_winbind wbinfo_down required_result 1 "ERROR: winbind - wbinfo -p returned error" diff --git a/ctdb/tests/eventscripts/50.samba.monitor.050.sh b/ctdb/tests/eventscripts/50.samba.monitor.050.sh index f6560d022a..e465add0b8 100755 --- a/ctdb/tests/eventscripts/50.samba.monitor.050.sh +++ b/ctdb/tests/eventscripts/50.samba.monitor.050.sh @@ -11,7 +11,6 @@ export CTDB_MANAGED_SERVICES="foo samba winbind bar" ok <<EOF Starting service "samba" - now managed -Starting winbind: OK Starting smb: OK EOF diff --git a/ctdb/tests/eventscripts/50.samba.monitor.051.sh b/ctdb/tests/eventscripts/50.samba.monitor.051.sh index 4a66269b5d..b61046c53d 100755 --- a/ctdb/tests/eventscripts/50.samba.monitor.051.sh +++ b/ctdb/tests/eventscripts/50.samba.monitor.051.sh @@ -9,12 +9,10 @@ setup_samba export CTDB_SERVICE_AUTOSTARTSTOP="yes" export CTDB_MANAGED_SERVICES="foo" unset CTDB_MANAGES_SAMBA -unset CTDB_MANAGES_WINBIND ok <<EOF Stopping service "samba" - no longer managed Stopping smb: OK -Stopping winbind: OK EOF simple_test diff --git a/ctdb/tests/eventscripts/scripts/local.sh b/ctdb/tests/eventscripts/scripts/local.sh index e1ae84ceae..e572a5dba7 100644 --- a/ctdb/tests/eventscripts/scripts/local.sh +++ b/ctdb/tests/eventscripts/scripts/local.sh @@ -374,7 +374,7 @@ setup_ctdb_policy_routing () ###################################################################### -# Samba fakery +# Samba/winbind fakery setup_samba () { @@ -384,16 +384,15 @@ setup_samba () debug "Marking Samba services as up, listening and managed by CTDB" # Get into known state. - for i in "samba" "winbind" ; do - eventscript_call ctdb_service_managed "$i" - done + eventscript_call ctdb_service_managed "samba" + # All possible service names for all known distros. - for i in "smb" "nmb" "winbind" "samba" ; do + for i in "smb" "nmb" "samba" ; do service "$i" force-started done export CTDB_SAMBA_SKIP_SHARE_CHECK="no" - export CTDB_MANAGED_SERVICES="foo samba winbind bar" + export CTDB_MANAGED_SERVICES="foo samba bar" export FAKE_TCP_LISTEN="0.0.0.0:445 0.0.0.0:139" export FAKE_WBINFO_FAIL="no" @@ -405,18 +404,16 @@ setup_samba () else debug "Marking Samba services as down, not listening and not managed by CTDB" # Get into known state. - for i in "samba" "winbind" ; do - eventscript_call ctdb_service_unmanaged "$i" - done + eventscript_call ctdb_service_unmanaged "samba" + # All possible service names for all known distros. - for i in "smb" "nmb" "winbind" "samba" ; do + for i in "smb" "nmb" "samba" ; do service "$i" force-stopped done export CTDB_SAMBA_SKIP_SHARE_CHECK="no" export CTDB_MANAGED_SERVICES="foo bar" unset CTDB_MANAGES_SAMBA - unset CTDB_MANAGES_WINBIND export FAKE_TCP_LISTEN="" export FAKE_WBINFO_FAIL="yes" @@ -427,6 +424,36 @@ setup_samba () rm -f "$CTDB_VARDIR/state/samba/smb.conf.cache" } +setup_winbind () +{ + setup_ctdb + + if [ "$1" != "down" ] ; then + + debug "Marking Winbind service as up and managed by CTDB" + # Get into known state. + eventscript_call ctdb_service_managed "winbind" + + service "winbind" force-started + + export CTDB_MANAGED_SERVICES="foo winbind bar" + + export FAKE_WBINFO_FAIL="no" + + else + debug "Marking Winbind service as down and not managed by CTDB" + # Get into known state. + eventscript_call ctdb_service_unmanaged "winbind" + + service "winbind" force-stopped + + export CTDB_MANAGED_SERVICES="foo bar" + unset CTDB_MANAGES_WINBIND + + export FAKE_WBINFO_FAIL="yes" + fi +} + wbinfo_down () { debug "Making wbinfo commands fail" |