aboutsummaryrefslogtreecommitdiff
path: root/handlers/mysql
blob: b54ae95daf7d771513487f7737e6485954c50f9d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
#
# mysql handler script for backupninja
#

getconf backupdir /var/backups/mysql
getconf databases all
getconf ignores
getconf dbhost localhost
getconf hotcopy no
getconf sqldump no
getconf compress yes
getconf vsname

# authentication:
getconf user
getconf dbusername
getconf dbpassword
getconf configfile /etc/mysql/debian.cnf

if [ "$user" == "" ]; then
	userset=false;
	user=root;
else
	userset=true;
	userhome=`getent passwd "$user" | awk -F: '{print $6}'`
	[ -f $userhome/.my.cnf ] || fatal "Can't find config file in $userhome/.my.cnf"
fi

## Prepare ignore part of the command
## This only works for mysqldump at the moment

ignore=''
for i in $ignores; do
       ignore="$ignore --ignore-table=$i"
done

# If vservers are configured, decide if the handler should
# use them or if it should just operate on the host

if [ "$vservers" = "yes" ]
then
	if [ ! -z $vsname ]
	then		
		info "Using vserver '$vsname'"
		usevserver=1
	else
		info "No vserver name specified, actions will be performed on the host"
	fi
fi

# If needed, make sure that the specified vserver exists and is running.
if [ $usevserver ]
then
	info "Examining vserver '$vsname'"
	# does it exist ?
	vroot="$VROOTDIR/$vsname"
	[ -d $vroot ] || fatal "vserver '$vsname' does not exist at '$vroot'"
	# is it running ?
	$VSERVERINFO -q $vsname RUNNING
	if [ $? -ne 0 ]
	then
		fatal "vserver $vsname is not running."
	fi
fi
	
# create backup dirs, vroot variable will be empty if no vsname was specified
# and will proceed to operate on the host
[ -d $vroot$backupdir ] || mkdir -p $vroot$backupdir
[ -d $vroot$backupdir ] || fatal "Backup directory '$vroot$backupdir'"
hotdir="$backupdir/hotcopy"
dumpdir="$backupdir/sqldump"

if [ $usevserver ]
then
	[ "$sqldump" == "no" -o -d $vroot$dumpdir ] || $VSERVER $vsname exec mkdir -p $dumpdir
	[ "$hotcopy" == "no" -o -d $vroot$hotdir ] || $VSERVER $vsname exec mkdir -p $hotdir
else
	[ "$sqldump" == "no" -o -d $dumpdir ] || mkdir -p $dumpdir
	[ "$hotcopy" == "no" -o -d $hotdir ] || mkdir -p $hotdir
fi

#######################################################################
## AUTHENTICATION

#
# one of three authentication methods:
# 1. setting the user, so that /home/user/.my.cnf is used.
# 2. specifying the user and password in the handler config,
#    which generates a temporary .my.cnf in /root/.my.cnf
# 3. specify the config file with --defaults-file
#    (this option DOESN'T WORK WITH MYSQLHOTCOPY)
#

# create .my.cnf
# only if dbusername and dbpassword specified.
# we create a tmp file because we don't want to
# specify the password on the command line.

defaultsfile=""
if [ "$dbusername" != "" -a "$dbpassword" != "" ]
then
    if [ $usevserver ]
    then
    	home=`$VSERVER $vsname exec getent passwd "root" | awk -F: '{print $6}'`
    else
    	home=`getent passwd "root" | awk -F: '{print $6}'`
    fi
    [ -d $home ] || fatal "Can't find root's home directory ($home)."
    mycnf="$home/.my.cnf"
    if [ -f $mycnf ]
    then
	# rename temporarily
	tmpcnf="$home/my.cnf.disable"
	debug "mv $mycnf $tmpcnf"
	mv $mycnf $tmpcnf
    fi
    oldmask=`umask`
    umask 077
    cat > $mycnf <<EOF
# auto generated backupninja mysql conf
[mysql]
user=$dbusername
password="$dbpassword"

[mysqldump]
user=$dbusername
password="$dbpassword"

[mysqlhotcopy]
user=$dbusername
password="$dbpassword"
EOF
	umask $oldmask
	defaultsfile="--defaults-file=$mycnf"
elif [ "$userset" == "false" ]; then
	# if user is set, don't use $configfile
	defaultsfile="--defaults-file=$configfile"
fi

#######################################################################
## HOT COPY

if [ "$hotcopy" == "yes" ]; then 
	if [ "$databases" == "all" ]; then
		if [ $usevserver ]
		then
			execstr="$VSERVER $vsname exec $MYSQLHOTCOPY --quiet --allowold --regexp /.\*/./.\*/ $hotdir"
		else
			execstr="$MYSQLHOTCOPY --quiet --allowold --regexp /.\*/./.\*/ $hotdir"
		fi
		debug "su $user -c '$execstr'"
		if [ ! $test ]; then
			output=`su $user -c "$execstr" 2>&1`
			code=$?
			if [ "$code" == "0" ]; then
				debug $output
				info "Successfully finished hotcopy of all mysql databases"
			else
				warning $output
				warning "Failed to hotcopy all mysql databases"
			fi
		fi
	else	
		for db in $databases; do
			if [ $usevserver ]
			then
				execstr="$VSERVER $vsname exec $MYSQLHOTCOPY --allowold $db $hotdir"
			else
				execstr="$MYSQLHOTCOPY --allowold $db $hotdir"
			fi
			debug "su $user -c '$execstr'"
			if [ ! $test ]; then
				output=`su $user -c "$execstr" 2>&1`
				code=$?
				if [ "$code" == "0" ]; then
					debug $output
					info "Successfully finished hotcopy of mysql database $db"
				else
					warning $output
					warning "Failed to hotcopy mysql database $db"
				fi
			fi
		done
	fi
fi

##########################################################################
## SQL DUMP

if [ "$sqldump" == "yes" ]; then
	if [ "$databases" == "all" ]; then
		if [ $usevserver ]
		then
			databases=`echo 'show databases' | $VSERVER $vsname exec su $user -c "$MYSQL $defaultsfile" | grep -v Database`
			if [ $? -ne 0 ]
			then
			    fatal "Something unexpected happened, the defaults file may have gone missing or is corrupt"
			fi
		else
			databases=`echo 'show databases' | su $user -c "$MYSQL $defaultsfile" | grep -v Database`
			if [ $? -ne 0 ]
			then
			    fatal "Something unexpected happened, the defaults file may have gone missing or is corrupt"
			fi
		fi
	fi

	for db in $databases; do
		if [ $usevserver ]
		then
			execstr="$VSERVER $vsname exec $MYSQLDUMP $defaultsfile --lock-tables --complete-insert --add-drop-table --quick --quote-names $ignore $db > $vroot$dumpdir/${db}.sql"
		else
			execstr="$MYSQLDUMP $defaultsfile --lock-tables --complete-insert --add-drop-table --quick --quote-names $ignore $db > $dumpdir/${db}.sql"
		fi
		debug "su $user -c '$execstr'"
		if [ ! $test ]; then
			output=`su $user -c "$execstr" 2>&1`
			code=$?
			if [ "$code" == "0" ]; then
				debug $output
				info "Successfully finished dump of mysql database $db"
			else
				warning $output
				warning "Failed to dump mysql databases $db"
			fi
		fi
	done
	
	if [ "$compress" == "yes" ]; then
		output=`$GZIP -f $vroot$dumpdir/*.sql 2>&1`
		debug $output
	fi
fi

# clean up tmp config file
if [ "$dbusername" != "" ]; then
	## clean up tmp config file
	debug "rm $mycnf"
	rm $mycnf
	if [ -f "$tmpcnf" ]; then
		debug "mv $tmpcnf $mycnf"
		mv $tmpcnf $mycnf
	fi
fi

return 0