background the smbstatus -n command
[metze/ctdb/wip.git] / config / events.d / 50.samba
1 #!/bin/sh
2 # ctdb event script for Samba
3
4 PATH=/bin:/usr/bin:$PATH
5
6 . $CTDB_BASE/functions
7 loadconfig ctdb
8
9 cmd="$1"
10 shift
11
12 [ "$CTDB_MANAGES_SAMBA" = "yes" ] || exit 0
13
14 # set default samba cleanup period - in minutes
15 [ -z "$SAMBA_CLEANUP_PERIOD" ] && {
16     SAMBA_CLEANUP_PERIOD=10
17 }
18
19
20 # autodetect use of winbind if not set in config file
21 [ -z "$CTDB_MANAGES_WINBIND" ] && {
22     secmode=`testparm -s --parameter-name=security 2> /dev/null`
23     case $secmode in
24         ADS|DOMAIN)
25             CTDB_MANAGES_WINBIND="yes";
26             ;;
27         *)
28             CTDB_MANAGES_WINBIND="no";
29             ;;
30     esac
31 }
32
33 ###########################
34 # periodic cleanup function
35 periodic_cleanup() {
36     # running smbstatus scrubs any dead entries from the connections
37     # and sessionid database
38     echo "`date` Running periodic cleanup of samba databases"
39     smbstatus -n > /dev/null 2>&1 &
40 }
41
42 case $cmd in 
43      startup)
44         # create the state directory for samba
45         /bin/mkdir -p $CTDB_BASE/state/samba
46
47         # make sure samba is not already started
48         service smb stop > /dev/null 2>&1
49         killall -0 -q smbd && {
50             sleep 1
51             # make absolutely sure samba is dead
52             killall -q -9 smbd
53         }
54
55         # restart the winbind service
56         [ "$CTDB_MANAGES_WINBIND" = "yes" ] && {
57                 service winbind stop > /dev/null 2>&1
58                 killall -0 -q winbindd && {
59                     sleep 1
60                     # make absolutely sure winbindd is dead
61                     killall -q -9 winbindd
62                 }
63                 service winbind start
64         }
65
66         # start Samba service. Start it reniced, as under very heavy load 
67         # the number of smbd processes will mean that it leaves few cycles for
68         # anything else
69         nice service smb start
70         ;;
71         
72      takeip)
73         # nothing special for Samba
74         ;;
75
76      releaseip)
77         # nothing special for Samba
78         ;;
79
80      recovered)
81         # nothing special for Samba
82         exit 0
83         ;;
84
85      shutdown)
86         # shutdown Samba when ctdb goes down
87         service smb stop
88
89         # stop the winbind service
90         [ "$CTDB_MANAGES_WINBIND" = "yes" ] && {
91                 service winbind stop
92         }
93         ;;
94
95      monitor)
96         # Create a dummy file to track when we need to do periodic cleanup
97         # of samba databases
98         [ -f $CTDB_BASE/state/samba/periodic_cleanup ] || {
99                 touch $CTDB_BASE/state/samba/periodic_cleanup
100         }
101         [ `/usr/bin/find $CTDB_BASE/state/samba/periodic_cleanup -mmin +$SAMBA_CLEANUP_PERIOD | wc -l` -eq 1 ] && {
102                 # Cleanup the databases
103                 periodic_cleanup
104                 touch $CTDB_BASE/state/samba/periodic_cleanup
105         }
106
107         testparm -s 2>&1 | egrep '^WARNING|^ERROR|^Unknown' && {
108             echo "`date` ERROR: testparm shows smb.conf is not clean"
109             exit 1
110         }
111
112         smb_dirs=`testparm -s 2> /dev/null | egrep '^\s*path = '  | cut -d= -f2`
113         ctdb_check_directories "Samba" $smb_dirs        
114
115         smb_ports=`testparm -s --parameter-name="smb ports" 2> /dev/null`
116         ctdb_check_tcp_ports "Samba" $smb_ports
117
118         # check winbind is OK
119         [ "$CTDB_MANAGES_WINBIND" = "yes" ] && {
120                 ctdb_check_command "winbind" "wbinfo -p"
121         }
122         ;;
123
124 esac
125
126 # ignore unknown commands
127 exit 0