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:-samba}
18 CTDB_SERVICE_NMB=${CTDB_SERVICE_NMB:-""}
21 # Use redhat style as default:
22 CTDB_SERVICE_SMB=${CTDB_SERVICE_SMB:-smb}
23 CTDB_SERVICE_NMB=${CTDB_SERVICE_NMB:-""}
27 # service_name is used by various functions
28 # shellcheck disable=SC2034
33 service_state_dir=$(ctdb_setup_service_state_dir) || exit $?
37 # make sure samba is not already started
38 service "$CTDB_SERVICE_SMB" stop > /dev/null 2>&1
39 if [ -n "$CTDB_SERVICE_NMB" ] ; then
40 service "$CTDB_SERVICE_NMB" stop > /dev/null 2>&1
42 killall -0 -q smbd && {
44 # make absolutely sure samba is dead
47 killall -0 -q nmbd && {
49 # make absolutely sure samba is dead
53 # start Samba service. Start it reniced, as under very heavy load
54 # the number of smbd processes will mean that it leaves few cycles
58 if [ -n "$CTDB_SERVICE_NMB" ] ; then
59 nice_service "$CTDB_SERVICE_NMB" start || die "Failed to start nmbd"
62 nice_service "$CTDB_SERVICE_SMB" start || die "Failed to start samba"
67 service "$CTDB_SERVICE_SMB" stop
68 program_stack_traces "smbd" 5
69 if [ -n "$CTDB_SERVICE_NMB" ] ; then
70 service "$CTDB_SERVICE_NMB" stop
74 ######################################################################
75 # Show the testparm output using a cached smb.conf to avoid delays due
78 smbconf_cache="$service_state_dir/smb.conf.cache"
80 testparm_foreground_update ()
84 # No need to remove these temporary files, since there are only 2
86 _out="${smbconf_cache}.out"
87 _err="${smbconf_cache}.err"
89 timeout "$_timeout" testparm -v -s >"$_out" 2>"$_err"
93 if [ -f "$smbconf_cache" ] ; then
94 echo "WARNING: smb.conf cache update timed out - using old cache file"
97 echo "ERROR: smb.conf cache create failed - testparm command timed out"
102 if [ -f "$smbconf_cache" ] ; then
103 echo "WARNING: smb.conf cache update failed - using old cache file"
107 echo "ERROR: smb.conf cache create failed - testparm failed with:"
113 # Only using $$ here to avoid a collision. This is written into
114 # CTDB's own state directory so there is no real need for a secure
116 _tmpfile="${smbconf_cache}.$$"
117 # Patterns to exclude...
118 _pat='^[[:space:]]+(registry[[:space:]]+shares|include|copy|winbind[[:space:]]+separator)[[:space:]]+='
119 grep -Ev "$_pat" <"$_out" >"$_tmpfile"
120 mv "$_tmpfile" "$smbconf_cache" # atomic
125 testparm_background_update ()
129 testparm_foreground_update "$_timeout" >/dev/null 2>&1 </dev/null &
134 testparm -s "$smbconf_cache" "$@" 2>/dev/null
140 sed -n -e 's@^[[:space:]]*path[[:space:]]*=[[:space:]]@@p' |
146 testparm_cat --parameter-name="smb ports" |
150 ###########################
152 ctdb_start_stop_service
154 is_ctdb_managed_service || exit 0
156 ###########################
168 testparm_foreground_update 10
171 smb_ports="$CTDB_SAMBA_CHECK_PORTS"
172 if [ -z "$smb_ports" ] ; then
173 smb_ports=$(list_samba_ports)
174 [ -n "$smb_ports" ] || die "Failed to set smb ports"
176 # Intentionally unquoted multi-word value here
177 # shellcheck disable=SC2086
178 ctdb_check_tcp_ports $smb_ports || exit $?
180 if [ "$CTDB_SAMBA_SKIP_SHARE_CHECK" != "yes" ] ; then
181 list_samba_shares | ctdb_check_directories || exit $?
184 if [ $ret -ne 0 ] ; then
185 testparm_background_update 10