eventscripts: Rewrite the smb.conf cache file handling
[ctdb.git] / config / events.d / 50.samba
1 #!/bin/sh
2 # ctdb event script for Samba
3
4 [ -n "$CTDB_BASE" ] || \
5     export CTDB_BASE=$(cd -P $(dirname "$0") ; dirname "$PWD")
6
7 . $CTDB_BASE/functions
8
9 detect_init_style
10
11 case $CTDB_INIT_STYLE in
12         suse)
13                 CTDB_SERVICE_SMB=${CTDB_SERVICE_SMB:-smb}
14                 CTDB_SERVICE_NMB=${CTDB_SERVICE_NMB:-nmb}
15                 ;;
16         debian)
17                 CTDB_SERVICE_SMB=${CTDB_SERVICE_SMB:-samba}
18                 CTDB_SERVICE_NMB=${CTDB_SERVICE_NMB:-""}
19                 ;;
20         *)
21                 # Use redhat style as default:
22                 CTDB_SERVICE_SMB=${CTDB_SERVICE_SMB:-smb}
23                 CTDB_SERVICE_NMB=${CTDB_SERVICE_NMB:-""}
24                 ;;
25 esac
26
27 service_name="samba"
28
29 loadconfig
30
31 ctdb_setup_service_state_dir
32
33 service_start ()
34 {
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
39     fi
40     killall -0 -q smbd && {
41         sleep 1
42         # make absolutely sure samba is dead
43         killall -q -9 smbd
44     }
45     killall -0 -q nmbd && {
46         sleep 1
47         # make absolutely sure samba is dead
48         killall -q -9 nmbd
49     }
50
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
53     # for anything else
54     net serverid wipe
55
56     if [ -n "$CTDB_SERVICE_NMB" ] ; then
57         nice_service "$CTDB_SERVICE_NMB" start || die "Failed to start nmbd"
58     fi
59
60     nice_service "$CTDB_SERVICE_SMB" start || die "Failed to start samba"
61 }
62
63 service_stop ()
64 {
65     service "$CTDB_SERVICE_SMB" stop
66     if [ -n "$CTDB_SERVICE_NMB" ] ; then
67         service "$CTDB_SERVICE_NMB" stop
68     fi
69 }
70
71 ######################################################################
72 # Show the testparm output using a cached smb.conf to avoid delays due
73 # to registry access.
74
75 smbconf_cache="$service_state_dir/smb.conf.cache"
76
77 testparm_foreground_update ()
78 {
79     _timeout="$1"
80
81     if ! _out=$(timeout $_timeout testparm -v -s 2>/dev/null) ; then
82         if [ -f "$smbconf_cache" ] ; then
83             echo "WARNING: smb.conf cache update failed - using old cache file"
84             return 1
85         else
86             die "ERROR: smb.conf cache create failed"
87         fi
88     fi
89
90     _tmpfile="${smbconf_cache}.$$"
91     # Patterns to exclude...
92     pat='^[[:space:]]+(registry[[:space:]]+shares|include|copy|winbind[[:space:]]+separator)[[:space:]]+='    
93     echo "$_out" | grep -Ev "$pat" >"$_tmpfile"
94     mv "$_tmpfile" "$smbconf_cache" # atomic
95
96     return 0
97 }
98
99 testparm_background_update ()
100 {
101     _timeout="$1"
102
103     testparm_foreground_update $_timeout >/dev/null 2>&1 </dev/null &
104 }
105
106 testparm_cat ()
107 {
108     testparm -s "$smbconf_cache" "$@" 2>/dev/null
109 }
110
111 list_samba_shares ()
112 {
113     testparm_cat |
114     sed -n -e 's@^[[:space:]]*path[[:space:]]*=[[:space:]]@@p' |
115     sed -e 's/"//g'
116 }
117
118 list_samba_ports ()
119 {
120     testparm_cat --parameter-name="smb ports" |
121     sed -e 's@,@ @g'
122 }
123
124 ###########################
125
126 ctdb_start_stop_service
127
128 is_ctdb_managed_service || exit 0
129
130 ###########################
131
132 case "$1" in
133      startup)
134         ctdb_service_start
135         ;;
136
137      shutdown)
138         ctdb_service_stop
139         ;;
140
141      monitor)
142         testparm_foreground_update 10
143         ret=$?
144
145         smb_ports="$CTDB_SAMBA_CHECK_PORTS"
146         if [ -z "$smb_ports" ] ; then
147             smb_ports=$(list_samba_ports)
148             [ -n "$smb_ports" ] || die "Failed to set smb ports"
149         fi
150         ctdb_check_tcp_ports $smb_ports || exit $?
151
152         if [ "$CTDB_SAMBA_SKIP_SHARE_CHECK" != "yes" ] ; then
153             list_samba_shares | ctdb_check_directories || exit $?
154         fi
155
156         if [ $ret -ne 0 ] ; then
157             testparm_background_update 10
158         fi
159         ;;
160
161     *)
162         ctdb_standard_event_handler "$@"
163         ;;
164 esac
165
166 exit 0