forked from outroll/vesta
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathv-update-user-backups
executable file
·278 lines (241 loc) · 7.21 KB
/
v-update-user-backups
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
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
#!/bin/bash
# info: update user backups
# options: USER
#
# The function rescan backup directory and updates backup database.
#----------------------------------------------------------#
# Variable&Function #
#----------------------------------------------------------#
# Includes
source $VESTA/func/main.sh
source $VESTA/conf/vesta.conf
# Argument defenition
user=$1
type="${2-$BACKUP_SYSTEM}"
# Defining tar parser function
get_backup_info() {
backup=$1
backup_type="$2"
backup_name=$(basename $backup )
backup_date=$(echo $backup_name |cut -f 2 -d '.' )
backup_time=$(stat --printf=%y $backup |cut -f 2 -d ' ' |cut -f 1 -d '.')
backup_size=$(du -sm $backup |cut -f 1 )
backup_data=$(tar -tf $backup)
vst_data=$(echo "$backup_data" |grep "^./vesta/" |grep -v "^./vesta/$")
if [ -z "$vst_data" ]; then
vst=''
else
vst='yes'
fi
pam_data=$(echo "$backup_data" |grep "^./pam/" |grep -v "^./pam/$")
if [ -z "$pam_data" ]; then
pam=''
else
pam='yes'
fi
web_data=$(echo "$backup_data" |grep "^./web/" |grep -v "^./web/$" |sort)
if [ -z "$web_data" ]; then
web=''
else
i=1
for domain in $web_data; do
domain="$(basename $domain |sed 's/.tar.gz$//')"
if [ "$i" -eq 1 ]; then
web="$domain"
i=2
else
web="$web,$domain"
fi
done
fi
dns_data=$(echo "$backup_data" |grep "^./dns/" |grep ".db$" |sort)
if [ -z "$dns_data" ]; then
dns=''
else
i=1
for domain in $dns_data; do
domain="$(basename $domain |sed 's/.db$//')"
if [ "$i" -eq 1 ]; then
dns="$domain"
i=2
else
dns="$dns,$domain"
fi
done
fi
mail_data=$(echo "$backup_data"|grep "^./mail/"|grep -v "^./mail/$"|sort)
if [ -z "$mail_data" ]; then
ml=''
else
i=1
for domain in $mail_data; do
domain="$(basename $domain |sed 's/.tar.gz$//')"
if [ "$i" -eq 1 ]; then
ml="$domain"
i=2
else
ml="$ml,$domain"
fi
done
fi
db_data=$(echo "$backup_data"|grep "^./db/"|grep ".sql.gz$"|sort)
if [ -z "$db_data" ]; then
db=''
else
i=1
for dbase in $db_data; do
dbase=$(basename $dbase |sed "s/.\(my\|pg\)sql.sql.gz$//")
if [ "$i" -eq 1 ]; then
db="$dbase"
i=2
else
db="$db,$dbase"
fi
done
fi
ssl_data=$(echo "$backup_data"|grep "^./ssl/"|grep ".crt$"|sort)
if [ -z "$ssl_data" ]; then
ssl=''
else
i=1
for certificate in $ssl_data; do
certificate=$(basename $certificate |sed "s/.crt$//")
if [ "$i" -eq 1 ]; then
ssl="$certificate"
i=2
else
ssl="$ssl,$certificate"
fi
done
fi
cron_data=$(echo "$backup_data" |grep "^./cron/" |grep -v "^./cron/$")
if [ -z "$cron_data" ]; then
cron=''
else
cron='yes'
fi
echo -n "DATE='$backup_date' TIME='$backup_time' RUNTIME='0'"
echo -n " SIZE='$backup_size' TYPE='$backup_type' VESTA='$vst' PAM='$pam'"
echo " WEB='$web' DNS='$dns' MAIL='$ml' DB='$db' SSL='$ssl' CRON='$cron'"
}
# Defining ftp command function
ftpc() {
ftp -n $HOST $PORT <<EOF
quote USER $USERNAME
quote PASS $PASSWORD
binary
cd $BPATH
$1
quit
EOF
}
init_ftp_variables() {
source $VESTA/conf/ftp.backup.conf
if [ -z "$HOST" ] || [ -z "$USERNAME" ] || [ -z "$PASSWORD" ] ||\
[ -z "$BPATH" ]; then
echo "Error: Parsing error"
log_event "$E_PARSING" "$EVENT"
exit $E_PARSING
fi
}
check_ftp_connection(){
ftmpdir=$(mktemp -u -p $BPATH)
command="mkdir $ftmpdir
ls $ftmpdir
rm $ftmpdir"
if [ ! -z "$(ftpc "$command")" ] ; then
echo "Error: FTP error"
log_event "$E_FTP" "$EVENT"
exit $E_FTP
fi
}
#----------------------------------------------------------#
# Verifications #
#----------------------------------------------------------#
check_args '1' "$#" 'USER'
is_system_enabled "$BACKUP_SYSTEM" 'BACKUP_SYSTEM'
validate_format 'user'
is_object_valid 'user' 'USER' "$user"
la=$(cat /proc/loadavg |cut -f 1 -d ' '|cut -f 1 -d '.')
if [ "$la" -ge "$BACKUP_LA_LIMIT" ]; then
log_event "$E_LA" "$EVENT"
exit $E_LA
fi
#----------------------------------------------------------#
# Action #
#----------------------------------------------------------#
# Checking tmp file
tmp_file="$USER_DATA/backup.conf_tmp"
if [ -e "$tmp_file" ]; then
rm -f $tmp_file
fi
# Checking local
if [ "$type" = 'local' ]; then
backups=$(ls $BACKUP |grep "^$user."|sort)
for backup in $backups; do
get_backup_info $BACKUP/$backup $type >> $tmp_file
done
fi
# Checking ftp
if [ "$type" = 'ftp' ]; then
tmpdir=$(mktemp -p $BACKUP -d)
ftmpdir=$(basename $tmpdir)
init_ftp_variables
check_ftp_connection
backups=$(ftpc ls|awk '{print $9}'|grep "^$user.")
for backup in $backups; do
cd $tmpdir
if [ ! -z "$(ftpc "get $backup")" ]; then
echo "Error: FTP transfer error"
log_event "$E_FTP" "$EVENT"
exit $E_FTP
fi
get_backup_info $tmpdir/$backup $type >> $tmp_file
rm -f $tmpdir/$backup
done
rm -rf $tmpdir
fi
# Checking both local and ftp
if [ "$type" = 'ftp,local' ] || [ "$type" = 'local,ftp' ]; then
tmpdir=$(mktemp -p $BACKUP -d)
ftmpdir=$(basename $tmpdir)
init_ftp_variables
check_ftp_connection
ftp_backups=$(ftpc ls|awk '{print $9}'|grep "^$user.")
local_backups=$(ls $BACKUP/ |grep "^$user." |sort)
backups=$(echo -e "$local_backups\n$ftp_backups" |\
sort |uniq -c | awk '{print $1" "$2}')
for backup in $(echo "$backups"|grep "^1 "|cut -f 2 -d ' '); do
check_ftp=$(echo $ftp_backups|grep -w $backup)
if [ ! -z "$check_ftp" ]; then
cd $tmpdir
if [ ! -z "$(ftpc "get $backup")" ]; then
echo "Error: FTP transfer error"
log_event "$E_FTP" "$EVENT"
exit $E_FTP
fi
get_backup_info $tmpdir/$backup ftp >> $tmp_file
rm -f $tmpdir/$backup
else
get_backup_info $BACKUP/$backup local >> $tmp_file
fi
done
for backup in $(echo "$backups"|grep "^2 "|cut -f 2 -d ' '); do
get_backup_info $BACKUP/$backup $type >> $tmp_file
done
rm -rf $tmpdir
fi
# Checking if there was any output
if [ -e "$tmp_file" ]; then
cat $tmp_file | sort > $USER_DATA/backup.conf
rm $tmp_file
else
rm $USER_DATA/backup.conf
touch $USER_DATA/backup.conf
fi
#----------------------------------------------------------#
# Vesta #
#----------------------------------------------------------#
# Logging
log_event "$OK" "$EVENT"
exit