mirror of
https://github.com/samba-team/samba.git
synced 2024-12-23 17:34:34 +03:00
e70e77383c
This has bit-rotted, at least for NFS. It can be fixed but it is better to remove it because it adds a lot of unnecessary complexity. Variable event_name becomes unused so remove it. Also remove associated tests. To continue to manage/unmanage services while CTDB is running: * Start service by hand and then flag it as managed * Mark service as unmanaged and shut it down by hand In some cases CTDB does something fancy - e.g. start Samba under "nice", so care is needed. One technique is to disable the eventscript, mark as managed, run the startup event by hand and then re-enable the eventscript. Signed-off-by: Martin Schwenke <martin@meltin.net> Reviewed-by: Amitay Isaacs <amitay@gmail.com>
189 lines
4.2 KiB
Bash
Executable File
189 lines
4.2 KiB
Bash
Executable File
#!/bin/sh
|
|
# ctdb event script for Samba
|
|
|
|
[ -n "$CTDB_BASE" ] || \
|
|
CTDB_BASE=$(d=$(dirname "$0") ; cd -P "$d" ; dirname "$PWD")
|
|
|
|
. "${CTDB_BASE}/functions"
|
|
|
|
detect_init_style
|
|
|
|
case $CTDB_INIT_STYLE in
|
|
suse)
|
|
CTDB_SERVICE_SMB=${CTDB_SERVICE_SMB:-smb}
|
|
CTDB_SERVICE_NMB=${CTDB_SERVICE_NMB:-nmb}
|
|
;;
|
|
debian)
|
|
CTDB_SERVICE_SMB=${CTDB_SERVICE_SMB:-smbd}
|
|
CTDB_SERVICE_NMB=${CTDB_SERVICE_NMB:-nmbd}
|
|
;;
|
|
*)
|
|
# Use redhat style as default:
|
|
CTDB_SERVICE_SMB=${CTDB_SERVICE_SMB:-smb}
|
|
CTDB_SERVICE_NMB=${CTDB_SERVICE_NMB:-""}
|
|
;;
|
|
esac
|
|
|
|
# service_name is used by various functions
|
|
# shellcheck disable=SC2034
|
|
service_name="samba"
|
|
|
|
loadconfig
|
|
|
|
service_state_dir=$(ctdb_setup_service_state_dir) || exit $?
|
|
|
|
service_start ()
|
|
{
|
|
# 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
|
|
}
|
|
|
|
# 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
|
|
|
|
if [ -n "$CTDB_SERVICE_NMB" ] ; then
|
|
nice_service "$CTDB_SERVICE_NMB" start || die "Failed to start nmbd"
|
|
fi
|
|
|
|
nice_service "$CTDB_SERVICE_SMB" start || die "Failed to start samba"
|
|
}
|
|
|
|
service_stop ()
|
|
{
|
|
service "$CTDB_SERVICE_SMB" stop
|
|
program_stack_traces "smbd" 5
|
|
if [ -n "$CTDB_SERVICE_NMB" ] ; then
|
|
service "$CTDB_SERVICE_NMB" stop
|
|
fi
|
|
}
|
|
|
|
######################################################################
|
|
# Show the testparm output using a cached smb.conf to avoid delays due
|
|
# to registry access.
|
|
|
|
smbconf_cache="$service_state_dir/smb.conf.cache"
|
|
|
|
testparm_foreground_update ()
|
|
{
|
|
_timeout="$1"
|
|
|
|
# No need to remove these temporary files, since there are only 2
|
|
# of them.
|
|
_out="${smbconf_cache}.out"
|
|
_err="${smbconf_cache}.err"
|
|
|
|
timeout "$_timeout" testparm -v -s >"$_out" 2>"$_err"
|
|
case $? in
|
|
0) : ;;
|
|
124)
|
|
if [ -f "$smbconf_cache" ] ; then
|
|
echo "WARNING: smb.conf cache update timed out - using old cache file"
|
|
return 1
|
|
else
|
|
echo "ERROR: smb.conf cache create failed - testparm command timed out"
|
|
exit 1
|
|
fi
|
|
;;
|
|
*)
|
|
if [ -f "$smbconf_cache" ] ; then
|
|
echo "WARNING: smb.conf cache update failed - using old cache file"
|
|
cat "$_err"
|
|
return 1
|
|
else
|
|
echo "ERROR: smb.conf cache create failed - testparm failed with:"
|
|
cat "$_err"
|
|
exit 1
|
|
fi
|
|
esac
|
|
|
|
# Only using $$ here to avoid a collision. This is written into
|
|
# CTDB's own state directory so there is no real need for a secure
|
|
# temporary file.
|
|
_tmpfile="${smbconf_cache}.$$"
|
|
# Patterns to exclude...
|
|
_pat='^[[:space:]]+(registry[[:space:]]+shares|include|copy|winbind[[:space:]]+separator)[[:space:]]+='
|
|
grep -Ev "$_pat" <"$_out" >"$_tmpfile"
|
|
mv "$_tmpfile" "$smbconf_cache" # atomic
|
|
|
|
return 0
|
|
}
|
|
|
|
testparm_background_update ()
|
|
{
|
|
_timeout="$1"
|
|
|
|
testparm_foreground_update "$_timeout" >/dev/null 2>&1 </dev/null &
|
|
}
|
|
|
|
testparm_cat ()
|
|
{
|
|
testparm -s "$smbconf_cache" "$@" 2>/dev/null
|
|
}
|
|
|
|
list_samba_shares ()
|
|
{
|
|
testparm_cat |
|
|
sed -n -e 's@^[[:space:]]*path[[:space:]]*=[[:space:]]@@p' |
|
|
sed -e 's/"//g'
|
|
}
|
|
|
|
list_samba_ports ()
|
|
{
|
|
testparm_cat --parameter-name="smb ports" |
|
|
sed -e 's@,@ @g'
|
|
}
|
|
|
|
###########################
|
|
|
|
is_ctdb_managed_service || exit 0
|
|
|
|
###########################
|
|
|
|
case "$1" in
|
|
startup)
|
|
ctdb_service_start
|
|
;;
|
|
|
|
shutdown)
|
|
ctdb_service_stop
|
|
;;
|
|
|
|
monitor)
|
|
testparm_foreground_update 10
|
|
ret=$?
|
|
|
|
smb_ports="$CTDB_SAMBA_CHECK_PORTS"
|
|
if [ -z "$smb_ports" ] ; then
|
|
smb_ports=$(list_samba_ports)
|
|
[ -n "$smb_ports" ] || die "Failed to set smb ports"
|
|
fi
|
|
# Intentionally unquoted multi-word value here
|
|
# shellcheck disable=SC2086
|
|
ctdb_check_tcp_ports $smb_ports || exit $?
|
|
|
|
if [ "$CTDB_SAMBA_SKIP_SHARE_CHECK" != "yes" ] ; then
|
|
list_samba_shares | ctdb_check_directories || exit $?
|
|
fi
|
|
|
|
if [ $ret -ne 0 ] ; then
|
|
testparm_background_update 10
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
exit 0
|