2007-06-01 14:54:26 +04:00
#!/bin/sh
# ctdb event script for Samba
2007-09-14 08:14:03 +04:00
. $CTDB_BASE/functions
2007-06-01 14:54:26 +04:00
2009-01-16 15:33:13 +03:00
detect_init_style
case $CTDB_INIT_STYLE in
suse)
2009-03-09 02:20:30 +03:00
CTDB_SERVICE_SMB=${CTDB_SERVICE_SMB:-smb}
CTDB_SERVICE_NMB=${CTDB_SERVICE_NMB:-nmb}
CTDB_SERVICE_WINBIND=${CTDB_SERVICE_WINBIND:-winbind}
2009-01-16 15:33:13 +03:00
;;
2009-09-15 13:33:35 +04:00
debian)
2009-03-09 02:20:30 +03:00
CTDB_SERVICE_SMB=${CTDB_SERVICE_SMB:-samba}
CTDB_SERVICE_NMB=${CTDB_SERVICE_NMB:-""}
CTDB_SERVICE_WINBIND=${CTDB_SERVICE_WINBIND:-winbind}
2009-01-16 15:33:13 +03:00
;;
*)
# should not happen, but for now use redhat style as default:
2009-03-09 02:20:30 +03:00
CTDB_SERVICE_SMB=${CTDB_SERVICE_SMB:-smb}
CTDB_SERVICE_NMB=${CTDB_SERVICE_NMB:-""}
CTDB_SERVICE_WINBIND=${CTDB_SERVICE_WINBIND:-winbind}
2009-01-16 15:33:13 +03:00
;;
esac
2009-11-19 08:48:19 +03:00
service_name="samba"
service_start="start_samba"
service_stop="stop_samba"
loadconfig
2007-06-01 14:54:26 +04:00
2009-11-19 08:48:19 +03:00
start_samba() {
# create the state directory for samba
2011-08-04 11:14:11 +04:00
mkdir -p $CTDB_VARDIR/state/samba
2009-11-19 08:48:19 +03:00
# make sure samba is not already started
2010-11-18 06:34:48 +03:00
is_ctdb_managed_service "samba" && {
2009-11-19 08:48:19 +03:00
service "$CTDB_SERVICE_SMB" stop > /dev/null 2>&1
service "$CTDB_SERVICE_NMB" stop > /dev/null 2>&1
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
}
}
2010-03-26 19:33:51 +03:00
# make sure winbind is not already started
2010-11-18 08:03:47 +03:00
check_ctdb_manages_winbind && {
2009-11-19 08:48:19 +03:00
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
}
2010-03-26 19:33:51 +03:00
}
# start the winbind service
2010-11-18 08:03:47 +03:00
check_ctdb_manages_winbind && {
2011-05-10 02:25:27 +04:00
service "$CTDB_SERVICE_WINBIND" start || {
echo failed to start winbind
exit 1
}
2009-11-19 08:48:19 +03:00
}
# 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
2010-11-18 06:34:48 +03:00
is_ctdb_managed_service "samba" && {
2011-04-13 06:08:09 +04:00
net serverid wipe
2010-12-08 03:08:19 +03:00
2011-05-10 02:25:27 +04:00
nice_service "$CTDB_SERVICE_NMB" start || {
echo failed to start nmbd
exit 1
}
nice_service "$CTDB_SERVICE_SMB" start || {
echo failed to start samba
exit 1
}
2009-11-19 08:48:19 +03:00
}
2010-11-18 07:40:19 +03:00
return 0
2009-11-19 08:48:19 +03:00
}
stop_samba() {
# shutdown Samba when ctdb goes down
2010-11-18 06:34:48 +03:00
is_ctdb_managed_service "samba" && {
2009-11-19 08:48:19 +03:00
service "$CTDB_SERVICE_SMB" stop
service "$CTDB_SERVICE_NMB" stop
}
# stop the winbind service
2010-11-18 08:03:47 +03:00
check_ctdb_manages_winbind && {
2009-11-19 08:48:19 +03:00
service "$CTDB_SERVICE_WINBIND" stop
}
2010-11-18 07:40:19 +03:00
return 0
2009-11-19 08:48:19 +03:00
}
2007-06-02 12:51:05 +04:00
2007-06-17 21:15:08 +04:00
# set default samba cleanup period - in minutes
[ -z "$SAMBA_CLEANUP_PERIOD" ] && {
SAMBA_CLEANUP_PERIOD=10
}
2008-07-23 09:36:23 +04:00
# we keep a cached copy of smb.conf here
2010-09-03 06:35:25 +04:00
smbconf_cache="$CTDB_VARDIR/state/samba/smb.conf.cache"
2008-07-23 09:36:23 +04:00
#############################################
# update the smb.conf cache in the foreground
testparm_foreground_update() {
2010-09-03 06:35:25 +04:00
mkdir -p "$CTDB_VARDIR/state/samba" || exit 1
2008-07-23 09:36:23 +04:00
testparm -s 2> /dev/null | egrep -v 'registry.shares.=|include.=' > "$smbconf_cache"
}
#############################################
# update the smb.conf cache in the background
testparm_background_update() {
# if the cache doesn't exist, then update in the foreground
[ -f $smbconf_cache ] || {
testparm_foreground_update
}
# otherwise do a background update
(
tmpfile="${smbconf_cache}.$$"
testparm -s > $tmpfile 2> /dev/null &
# remember the pid of the teamparm process
pid="$!"
# give it 10 seconds to run
timeleft=10
while [ $timeleft -gt 0 ]; do
timeleft=$(($timeleft - 1))
# see if the process still exists
2011-04-13 06:08:09 +04:00
kill -0 $pid > /dev/null 2>&1 || {
2008-07-23 09:36:23 +04:00
# it doesn't exist, grab its exit status
wait $pid
[ $? = 0 ] || {
echo "50.samba: smb.conf background update exited with status $?"
rm -f "${tmpfile}"
exit 1
}
# put the new smb.conf contents in the cache (atomic rename)
# make sure we remove references to the registry while doing
# this to ensure that running testparm on the cache does
# not use the registry
egrep -v 'registry.shares.=|include.=' < "$tmpfile" > "${tmpfile}.2"
rm -f "$tmpfile"
mv -f "${tmpfile}.2" "$smbconf_cache" || {
echo "50.samba: failed to update background cache"
rm -f "${tmpfile}.2"
exit 1
}
exit 0
}
# keep waiting for testparm to finish
sleep 1
done
# it took more than 10 seconds - kill it off
rm -f "${tmpfile}"
2011-04-13 06:08:09 +04:00
kill -9 "$pid" > /dev/null 2>&1
2008-07-23 09:36:23 +04:00
echo "50.samba: timed out updating smbconf cache in background"
exit 1
) &
}
##################################################
# show the testparm output using a cached smb.conf
# to avoid registry access
testparm_cat() {
[ -f $smbconf_cache ] || {
testparm_foreground_update
}
testparm -s "$smbconf_cache" "$@" 2>/dev/null
}
2010-11-18 08:03:47 +03:00
# function to see if ctdb manages winbind - this overrides with extra
# logic if $CTDB_MANAGES_WINBIND is not set or null.
2008-05-14 14:57:04 +04:00
check_ctdb_manages_winbind() {
2010-11-18 08:03:47 +03:00
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
2007-11-18 07:14:54 +03:00
}
2009-11-20 08:45:36 +03:00
list_samba_shares ()
{
testparm_cat |
sed -n -e 's@^[[:space:]]*path[[:space:]]*=[[:space:]]@@p' |
sed -e 's/"//g'
}
2007-06-17 21:15:08 +04:00
###########################
# periodic cleanup function
periodic_cleanup() {
# running smbstatus scrubs any dead entries from the connections
# and sessionid database
2008-10-20 02:45:15 +04:00
# echo "Running periodic cleanup of samba databases"
2009-05-06 02:18:21 +04:00
smbstatus -np > /dev/null 2>&1 &
2007-06-17 21:15:08 +04:00
}
2010-11-18 03:04:52 +03:00
###########################
ctdb_start_stop_service
2010-11-18 07:40:19 +03:00
ctdb_start_stop_service "winbind"
2010-11-18 03:04:52 +03:00
is_ctdb_managed_service || is_ctdb_managed_service "winbind" || exit 0
###########################
2009-12-01 09:43:47 +03:00
case "$1" in
2007-06-01 14:54:26 +04:00
startup)
2009-11-19 08:48:19 +03:00
ctdb_service_start
2007-06-01 14:54:26 +04:00
;;
shutdown)
2009-11-19 08:48:19 +03:00
ctdb_service_stop
2007-06-01 14:54:26 +04:00
;;
2007-06-06 06:08:42 +04:00
monitor)
2007-06-17 20:34:29 +04:00
# Create a dummy file to track when we need to do periodic cleanup
# of samba databases
2010-09-03 06:35:25 +04:00
[ -f $CTDB_VARDIR/state/samba/periodic_cleanup ] || {
touch $CTDB_VARDIR/state/samba/periodic_cleanup
2007-06-17 20:34:29 +04:00
}
2011-04-13 06:08:09 +04:00
[ `find $CTDB_VARDIR/state/samba/periodic_cleanup -mmin +$SAMBA_CLEANUP_PERIOD | wc -l` -eq 1 ] && {
2007-06-17 20:34:29 +04:00
# Cleanup the databases
2007-06-17 21:15:08 +04:00
periodic_cleanup
2010-09-03 06:35:25 +04:00
touch $CTDB_VARDIR/state/samba/periodic_cleanup
2007-06-17 20:34:29 +04:00
}
2010-11-18 06:34:48 +03:00
is_ctdb_managed_service "samba" && {
2009-09-03 20:59:24 +04:00
[ "$CTDB_SAMBA_SKIP_SHARE_CHECK" = "yes" ] || {
testparm_background_update
2009-02-20 02:58:34 +03:00
2009-09-03 20:59:24 +04:00
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
}
}
2009-11-20 08:45:36 +03:00
list_samba_shares |
ctdb_check_directories_probe || {
2009-09-03 20:59:24 +04:00
testparm_foreground_update
2009-11-20 08:45:36 +03:00
list_samba_shares |
ctdb_check_directories
} || exit $?
2009-02-20 02:58:34 +03:00
}
2007-06-06 06:08:42 +04:00
2009-09-03 20:59:24 +04:00
smb_ports="$CTDB_SAMBA_CHECK_PORTS"
[ -z "$smb_ports" ] && {
smb_ports=`testparm_cat --parameter-name="smb ports"`
}
2009-11-13 10:28:25 +03:00
ctdb_check_tcp_ports $smb_ports || exit $?
2008-07-15 05:03:35 +04:00
}
2007-06-17 06:05:29 +04:00
# check winbind is OK
2010-11-18 08:03:47 +03:00
check_ctdb_manages_winbind && {
2010-01-12 13:02:44 +03:00
ctdb_check_command "winbind" "wbinfo -p"
2007-11-14 08:17:52 +03:00
}
2007-06-06 06:08:42 +04:00
;;
2011-02-18 02:44:55 +03:00
takeip|releaseip)
iface=$2
ip=$3
maskbits=$4
smbcontrol winbindd ip-dropped $ip >/dev/null 2>/dev/null
;;
2009-12-01 09:43:47 +03:00
*)
ctdb_standard_event_handler "$@"
2009-11-19 08:48:19 +03:00
;;
2007-06-01 14:54:26 +04:00
esac
exit 0