summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Schwenke <martin@meltin.net>2012-08-16 14:41:11 +1000
committerAmitay Isaacs <amitay@gmail.com>2012-10-03 08:46:32 +1000
commitf3ae31e74135c242ad45262596ee6d1d5ac035f5 (patch)
tree1a3d7e184f8410b1547fde038ce6421a2ef10de1
parente2d4250731b1d14aff8c89dcc9ebbd528880856d (diff)
downloadsamba-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-xctdb/Makefile.in1
-rwxr-xr-xctdb/config/events.d/49.winbind75
-rwxr-xr-xctdb/config/events.d/50.samba195
-rw-r--r--ctdb/packaging/RPM/ctdb.spec.in1
-rwxr-xr-xctdb/tests/eventscripts/49.winbind.monitor.001.sh11
-rwxr-xr-xctdb/tests/eventscripts/49.winbind.monitor.050.sh17
-rwxr-xr-xctdb/tests/eventscripts/49.winbind.monitor.051.sh18
-rwxr-xr-xctdb/tests/eventscripts/49.winbind.monitor.101.sh11
-rwxr-xr-xctdb/tests/eventscripts/49.winbind.monitor.102.sh (renamed from ctdb/tests/eventscripts/50.samba.monitor.102.sh)2
-rwxr-xr-xctdb/tests/eventscripts/50.samba.monitor.050.sh1
-rwxr-xr-xctdb/tests/eventscripts/50.samba.monitor.051.sh2
-rw-r--r--ctdb/tests/eventscripts/scripts/local.sh49
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"