diff options
author | Martin Schwenke <martin@meltin.net> | 2012-08-16 14:41:11 +1000 |
---|---|---|
committer | Amitay Isaacs <amitay@gmail.com> | 2012-10-03 08:46:32 +1000 |
commit | f3ae31e74135c242ad45262596ee6d1d5ac035f5 (patch) | |
tree | 1a3d7e184f8410b1547fde038ce6421a2ef10de1 | |
parent | e2d4250731b1d14aff8c89dcc9ebbd528880856d (diff) | |
download | samba-f3ae31e74135c242ad45262596ee6d1d5ac035f5.tar.gz samba-f3ae31e74135c242ad45262596ee6d1d5ac035f5.tar.xz samba-f3ae31e74135c242ad45262596ee6d1d5ac035f5.zip |
Eventscripts: split 50.samba into 49.winbind and 50.samba
winbind and samba can be separately managed. This makes the service
starting and stopping code way too complicated, and even adds a small
amount of complexity to the monitoring code. The sensible option is
to split this eventscript in two.
There are two potentially backward incompatible changes here:
* Functionality has been removed that allowed 50.samba to manage
winbind when CTDB_MANAGES_WINBIND was unset but the smb.conf
"security" parameter was set to "ADS" or "DOMAIN".
Maintaining this functionality would have required moving the
testparm-related code to the functions file, deciding where the
cache file should go, and then calling it from both 49.winbind and
50.samba. This feature wasn't of great value and asking
administrators to set an extra variable in exchange for code
simplicity seems like a reasonable deal.
* External code will need to be changed if it calls 50.samba directly
with winbind-related expectations. This is fairly obvious!
Signed-off-by: Martin Schwenke <martin@meltin.net>
(This used to be ctdb commit 34535ae64420926b9a3bf7d453fed4e6f4c90115)
-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" |