2 # ctdb event script for Samba
4 [ -n "$CTDB_BASE" ] || \
5 CTDB_BASE=$(d=$(dirname "$0") ; cd -P "$d" ; dirname "$PWD")
7 . "${CTDB_BASE}/functions"
11 case $CTDB_INIT_STYLE in
13 CTDB_SERVICE_SMB=${CTDB_SERVICE_SMB:-smb}
14 CTDB_SERVICE_NMB=${CTDB_SERVICE_NMB:-nmb}
17 CTDB_SERVICE_SMB=${CTDB_SERVICE_SMB:-smbd}
18 CTDB_SERVICE_NMB=${CTDB_SERVICE_NMB:-nmbd}
21 # Use redhat style as default:
22 CTDB_SERVICE_SMB=${CTDB_SERVICE_SMB:-smb}
23 CTDB_SERVICE_NMB=${CTDB_SERVICE_NMB:-""}
31 ctdb_setup_state_dir "service" "$service_name"
35 # make sure samba is not already started
36 service "$CTDB_SERVICE_SMB" stop > /dev/null 2>&1
37 if [ -n "$CTDB_SERVICE_NMB" ] ; then
38 service "$CTDB_SERVICE_NMB" stop > /dev/null 2>&1
40 killall -0 -q smbd && {
42 # make absolutely sure samba is dead
45 killall -0 -q nmbd && {
47 # make absolutely sure samba is dead
51 # start Samba service. Start it reniced, as under very heavy load
52 # the number of smbd processes will mean that it leaves few cycles
54 if [ -n "$CTDB_SERVICE_NMB" ] ; then
55 nice_service "$CTDB_SERVICE_NMB" start || die "Failed to start nmbd"
58 nice_service "$CTDB_SERVICE_SMB" start || die "Failed to start samba"
63 service "$CTDB_SERVICE_SMB" stop
64 program_stack_traces "smbd" 5
65 if [ -n "$CTDB_SERVICE_NMB" ] ; then
66 service "$CTDB_SERVICE_NMB" stop
70 ######################################################################
71 # Show the testparm output using a cached smb.conf to avoid delays due
74 # script_state_dir set by ctdb_setup_state_dir()
75 # shellcheck disable=SC2154
76 smbconf_cache="$script_state_dir/smb.conf.cache"
78 testparm_foreground_update ()
82 # No need to remove these temporary files, since there are only 2
84 _out="${smbconf_cache}.out"
85 _err="${smbconf_cache}.err"
87 timeout "$_timeout" testparm -v -s >"$_out" 2>"$_err"
91 if [ -f "$smbconf_cache" ] ; then
92 echo "WARNING: smb.conf cache update timed out - using old cache file"
95 echo "ERROR: smb.conf cache create failed - testparm command timed out"
100 if [ -f "$smbconf_cache" ] ; then
101 echo "WARNING: smb.conf cache update failed - using old cache file"
105 echo "ERROR: smb.conf cache create failed - testparm failed with:"
111 # Only using $$ here to avoid a collision. This is written into
112 # CTDB's own state directory so there is no real need for a secure
114 _tmpfile="${smbconf_cache}.$$"
115 # Patterns to exclude...
116 _pat='^[[:space:]]+(registry[[:space:]]+shares|include|copy|winbind[[:space:]]+separator)[[:space:]]+='
117 grep -Ev "$_pat" <"$_out" >"$_tmpfile"
118 mv "$_tmpfile" "$smbconf_cache" # atomic
123 testparm_background_update ()
127 testparm_foreground_update "$_timeout" >/dev/null 2>&1 </dev/null &
132 testparm -s "$smbconf_cache" "$@" 2>/dev/null
138 sed -n -e 's@^[[:space:]]*path[[:space:]]*=[[:space:]]@@p' |
144 testparm_cat --parameter-name="smb ports" |
148 ###########################
150 [ "$CTDB_MANAGES_SAMBA" = "yes" ] || exit 0
152 ###########################
164 testparm_foreground_update 10
167 smb_ports="$CTDB_SAMBA_CHECK_PORTS"
168 if [ -z "$smb_ports" ] ; then
169 smb_ports=$(list_samba_ports)
170 [ -n "$smb_ports" ] || die "Failed to set smb ports"
172 # Intentionally unquoted multi-word value here
173 # shellcheck disable=SC2086
174 ctdb_check_tcp_ports $smb_ports || exit $?
176 if [ "$CTDB_SAMBA_SKIP_SHARE_CHECK" != "yes" ] ; then
177 list_samba_shares | ctdb_check_directories || exit $?
180 if [ $ret -ne 0 ] ; then
181 testparm_background_update 10