2 # ctdb event script for Samba
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}
16 CTDB_SERVICE_SMB=${CTDB_SERVICE_SMB:-smbd}
19 # Use redhat style as default:
20 CTDB_SERVICE_SMB=${CTDB_SERVICE_SMB:-smb}
28 ctdb_setup_state_dir "service" "$service_name"
30 generate_smb_interfaces_config()
33 pub_iface_list=$public_ifaces
35 for iface in $pub_iface_list;
37 public_ifaces="$public_ifaces \"$iface;options=dynamic\""
40 if [ -n "$CTDB_SAMBA_INTERFACES_EXTRA" ]; then
41 public_ifaces="$public_ifaces $CTDB_SAMBA_INTERFACES_EXTRA"
44 cat <<EOT > "$CTDB_SAMBA_INTERFACES_FILE"
45 bind interfaces only = yes
46 interfaces = lo $public_ifaces
52 # make sure samba is not already started
53 service "$CTDB_SERVICE_SMB" stop >/dev/null 2>&1
54 killall -0 -q smbd && {
56 # make absolutely sure samba is dead
59 if [ -n "$CTDB_SAMBA_INTERFACES_FILE" ]; then
60 generate_smb_interfaces_config
62 # start Samba service. Start it reniced, as under very heavy load
63 # the number of smbd processes will mean that it leaves few cycles
65 nice_service "$CTDB_SERVICE_SMB" start || die "Failed to start samba"
70 service "$CTDB_SERVICE_SMB" stop
71 program_stack_traces "smbd" 5
74 ######################################################################
75 # Show the testparm output using a cached smb.conf to avoid delays due
78 # script_state_dir set by ctdb_setup_state_dir()
79 # shellcheck disable=SC2154
80 smbconf_cache="$script_state_dir/smb.conf.cache"
82 testparm_foreground_update()
86 # No need to remove these temporary files, since there are only 2
88 _out="${smbconf_cache}.out"
89 _err="${smbconf_cache}.err"
91 timeout "$_timeout" testparm -v -s >"$_out" 2>"$_err"
95 if [ -f "$smbconf_cache" ]; then
96 echo "WARNING: smb.conf cache update timed out - using old cache file"
99 echo "ERROR: smb.conf cache create failed - testparm command timed out"
104 if [ -f "$smbconf_cache" ]; then
105 echo "WARNING: smb.conf cache update failed - using old cache file"
109 echo "ERROR: smb.conf cache create failed - testparm failed with:"
116 # Only using $$ here to avoid a collision. This is written into
117 # CTDB's own state directory so there is no real need for a secure
119 _tmpfile="${smbconf_cache}.$$"
120 # Patterns to exclude...
121 _pat='^[[:space:]]+(registry[[:space:]]+shares|include|copy|winbind[[:space:]]+separator)[[:space:]]+='
122 grep -Ev "$_pat" <"$_out" >"$_tmpfile"
123 mv "$_tmpfile" "$smbconf_cache" # atomic
128 testparm_background_update()
132 testparm_foreground_update "$_timeout" >/dev/null 2>&1 </dev/null &
140 -e "s|^[[:space:]]*${_param}[[:space:]]*=[[:space:]]\(..*\)|\1|p" \
147 testparm_get "path" | sed -e 's/"//g'
152 testparm_get "smb ports"
155 ###########################
167 testparm_foreground_update 10
170 smb_ports="$CTDB_SAMBA_CHECK_PORTS"
171 if [ -z "$smb_ports" ]; then
172 smb_ports=$(list_samba_ports)
173 [ -n "$smb_ports" ] || die "Failed to set smb ports"
175 # Intentionally unquoted multi-word value here
176 # shellcheck disable=SC2086
177 ctdb_check_tcp_ports $smb_ports || exit $?
179 if [ "$CTDB_SAMBA_SKIP_SHARE_CHECK" != "yes" ]; then
180 list_samba_shares | ctdb_check_directories || exit $?
183 if [ $ret -ne 0 ]; then
184 testparm_background_update 10