Skip to content

Commit 2f37337

Browse files
authored
Merge pull request hestiacp#854 from hestiacp/fix-backup
Bugfix hestiacp#850 / hestiacp#848 Improve backup
2 parents 0235154 + 70ed813 commit 2f37337

File tree

6 files changed

+293
-21
lines changed

6 files changed

+293
-21
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ All notable changes to this project will be documented in this file.
4040
- Improved "Forgot password" function prevent brute forcing.
4141
- Update Backup counter propperly when v-delete-user-backup ran.
4242
- Dropped support for Debian 8 according to EOL.
43+
- Improved Backup function.
4344

4445
## [1.1.1] - 2020-03-24 - Hotfix
4546
### Features

bin/v-download-backup

Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
#!/bin/bash
2+
# info: Download backup
3+
# options: USER BACKUP
4+
#
5+
# The function download back-up from remote server
6+
7+
8+
#----------------------------------------------------------#
9+
# Variable&Function #
10+
#----------------------------------------------------------#
11+
12+
# Import Hestia variable for cron launch
13+
source /etc/profile
14+
15+
# Argument definition
16+
user=$1
17+
backup=$2
18+
19+
# Define backup dir
20+
if [ -z "$BACKUP" ]; then
21+
BACKUP=/backup
22+
fi
23+
24+
# Includes
25+
source $HESTIA/func/main.sh
26+
source $HESTIA/func/domain.sh
27+
source $HESTIA/func/ip.sh
28+
source $HESTIA/func/db.sh
29+
source $HESTIA/func/rebuild.sh
30+
source $HESTIA/conf/hestia.conf
31+
32+
# Defining FTP command function
33+
ftpc() {
34+
/usr/bin/ftp -n $HOST $PORT <<EOF
35+
quote USER $USERNAME
36+
quote PASS $PASSWORD
37+
lcd $BACKUP
38+
binary
39+
$1
40+
$2
41+
$3
42+
quit
43+
EOF
44+
}
45+
46+
# FTP backup download function
47+
ftp_download() {
48+
source $HESTIA/conf/ftp.backup.conf
49+
if [ -z "$PORT" ]; then
50+
PORT='21'
51+
fi
52+
if [ -z $BPATH ]; then
53+
ftpc "get $1"
54+
else
55+
ftpc "cd $BPATH" "get $1"
56+
fi
57+
}
58+
59+
# SFTP command function
60+
sftpc() {
61+
expect -f "-" <<EOF "$@"
62+
set timeout 60
63+
set count 0
64+
spawn /usr/bin/sftp -o StrictHostKeyChecking=no \
65+
-o Port=$PORT $USERNAME@$HOST
66+
expect {
67+
"password:" {
68+
send "$PASSWORD\r"
69+
exp_continue
70+
}
71+
-re "Couldn't|(.*)disconnect|(.*)stalled|(.*)not found" {
72+
set count \$argc
73+
set output "Disconnected."
74+
set rc $E_FTP
75+
exp_continue
76+
}
77+
-re ".*denied.*(publickey|password)." {
78+
set output "Permission denied, wrong publickey or password."
79+
set rc $E_CONNECT
80+
}
81+
-re "\[0-9]*%" {
82+
exp_continue
83+
}
84+
"sftp>" {
85+
if {\$count < \$argc} {
86+
set arg [lindex \$argv \$count]
87+
send "\$arg\r"
88+
incr count
89+
} else {
90+
send "exit\r"
91+
set output "Disconnected."
92+
if {[info exists rc] != 1} {
93+
set rc $OK
94+
}
95+
}
96+
exp_continue
97+
}
98+
timeout {
99+
set output "Connection timeout."
100+
set rc $E_CONNECT
101+
}
102+
}
103+
if {[info exists output] == 1} {
104+
puts "\$output"
105+
}
106+
exit \$rc
107+
EOF
108+
}
109+
110+
# SFTP backup download function
111+
sftp_download() {
112+
source $HESTIA/conf/sftp.backup.conf
113+
if [ -z "$PORT" ]; then
114+
PORT='22'
115+
fi
116+
cd $BACKUP
117+
if [ -z $BPATH ]; then
118+
sftpc "get $1" > /dev/null 2>&1
119+
else
120+
sftpc "cd $BPATH" "get $1" > /dev/null 2>&1
121+
fi
122+
123+
}
124+
125+
# Google backup download function
126+
google_download() {
127+
source $HESTIA/conf/google.backup.conf
128+
gsutil="$HESTIA/3rdparty/gsutil/gsutil"
129+
export BOTO_CONFIG="$HESTIA/conf/.google.backup.boto"
130+
${gsutil} cp gs://$BUCKET/$BPATH/$1 $BACKUP/ > /dev/null 2>&1
131+
if [ "$?" -ne 0 ]; then
132+
check_result "$E_CONNECT" "gsutil failed to download $1"
133+
fi
134+
}
135+
136+
137+
#----------------------------------------------------------#
138+
# Verifications #
139+
#----------------------------------------------------------#
140+
141+
check_args '2' "$#" 'USER BACKUP'
142+
is_format_valid 'user' 'backup'
143+
144+
#----------------------------------------------------------#
145+
# Action #
146+
#----------------------------------------------------------#
147+
148+
149+
# Checking available disk space
150+
disk_usage=$(df $BACKUP |tail -n1 |tr ' ' '\n' |grep % |cut -f 1 -d %)
151+
if [ "$disk_usage" -ge "$BACKUP_DISK_LIMIT" ]; then
152+
echo "Error: Not enough disk space" |$SENDMAIL -s "$subj" $email $notify
153+
sed -i "/ $user /d" $HESTIA/data/queue/backup.pipe
154+
check_result $E_DISK "Not enough disk space"
155+
fi
156+
157+
# Checking local backup
158+
if [ ! -e "$BACKUP/$backup" ]; then
159+
if [[ "$BACKUP_SYSTEM" =~ "google" ]]; then
160+
google_download $backup
161+
downloaded='yes'
162+
fi
163+
if [[ "$BACKUP_SYSTEM" =~ "sftp" ]] && [ -z "$downloaded" ]; then
164+
sftp_download $backup
165+
downloaded='yes'
166+
fi
167+
if [[ "$BACKUP_SYSTEM" =~ "ftp" ]] && [ -z "$downloaded" ]; then
168+
ftp_download $backup
169+
downloaded='yes'
170+
fi
171+
if [ -z "$downloaded" ]; then
172+
check_result $E_NOTEXIST "backup file $backup doesn't exist in '${BACKUP}' folder"
173+
else
174+
if [ -e "$BACKUP/$backup" ]; then
175+
chmod 0640 $BACKUP/$backup
176+
chown admin:admin $BACKUP/$backup
177+
echo "rm $BACKUP/$backup" | at now + 1 day
178+
fi
179+
fi
180+
fi
181+
182+
#----------------------------------------------------------#
183+
# Hestia #
184+
#----------------------------------------------------------#
185+
186+
# Send notification
187+
if [ -e "$BACKUP/$backup" ]; then
188+
cd $BACKUP
189+
subj="$user → Download of $backup has been completed"
190+
email=$(get_user_value '$CONTACT')
191+
echo "Download of $backup has been completed you are able to download it for 12 hours" |$SENDMAIL -s "$subj" $email $notify
192+
$BIN/v-add-user-notification $user "$subj" "Download of $backup has been completed you are able to download it for 12 hours"
193+
194+
fi
195+
196+
# Cleaning restore queue
197+
sed -i "/v-download-backup $user /d" $HESTIA/data/queue/backup.pipe
198+
199+
# Logging
200+
log_event "$OK" "$ARGUMENTS"
201+
202+
exit
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#!/bin/bash
2+
# info: Schedule a backup
3+
# options: USER BACKUP
4+
#
5+
# The function for scheduling user backup creation.
6+
7+
8+
#----------------------------------------------------------#
9+
# Variable&Function #
10+
#----------------------------------------------------------#
11+
12+
# Importing system variables
13+
source /etc/profile
14+
15+
# Argument definition
16+
user=$1
17+
backup=$2
18+
19+
# Includes
20+
source $HESTIA/func/main.sh
21+
source $HESTIA/func/domain.sh
22+
source $HESTIA/func/db.sh
23+
source $HESTIA/conf/hestia.conf
24+
25+
#----------------------------------------------------------#
26+
# Verifications #
27+
#----------------------------------------------------------#
28+
29+
check_args '2' "$#" 'USER BACKUP'
30+
is_format_valid 'user' 'backup'
31+
32+
#----------------------------------------------------------#
33+
# Action #
34+
#----------------------------------------------------------#
35+
36+
# Adding backup task to the queue
37+
echo "$BIN/v-download-backup $user $backup 2>&1" >>\
38+
$HESTIA/data/queue/backup.pipe
39+
40+
41+
#----------------------------------------------------------#
42+
# Hestia #
43+
#----------------------------------------------------------#
44+
45+
# Logging
46+
log_event "$OK" "$ARGUMENTS"
47+
48+
exit

web/download/backup/index.php

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,31 @@
11
<?php
22
// Init
33
error_reporting(NULL);
4+
ob_start();
45
session_start();
56
include($_SERVER['DOCUMENT_ROOT']."/inc/main.php");
6-
$backup = basename($_GET['backup']);
77

8-
// Check if the backup exists
9-
if (!file_exists('/backup/'.$backup)) {
10-
exit(0);
8+
// Check token
9+
if ((!isset($_GET['token'])) || ($_SESSION['token'] != $_GET['token'])) {
10+
header('Location: /login/');
11+
exit();
1112
}
1213

13-
// Data
14-
if ($_SESSION['user'] == 'admin') {
15-
header('Content-type: application/gzip');
16-
header("Content-Disposition: attachment; filename=\"".$backup."\";" );
17-
header("X-Accel-Redirect: /backup/" . $backup);
18-
}
14+
$v_username = escapeshellarg($user);
15+
exec (HESTIA_CMD."v-schedule-user-backup ".$v_username, $output, $return_var);
16+
if ($return_var == 0) {
17+
$_SESSION['error_msg'] = __('BACKUP_SCHEDULED');
18+
} else {
19+
$_SESSION['error_msg'] = implode('<br>', $output);
20+
if (empty($_SESSION['error_msg'])) {
21+
$_SESSION['error_msg'] = __('Error: hestia did not return any output.');
22+
}
1923

20-
if ((!empty($_SESSION['user'])) && ($_SESSION['user'] != 'admin')) {
21-
if (strpos($backup, $user.'.') === 0) {
22-
header('Content-type: application/gzip');
23-
header("Content-Disposition: attachment; filename=\"".$backup."\";" );
24-
header("X-Accel-Redirect: /backup/" . $backup);
24+
if ($return_var == 4) {
25+
$_SESSION['error_msg'] = __('BACKUP_EXISTS');
2526
}
27+
2628
}
29+
unset($output);
30+
header("Location: /list/backup/");
31+
exit;

web/edit/server/index.php

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -388,18 +388,20 @@
388388
if (empty($_SESSION['error_msg'])) {
389389
if ((!empty($_POST['v_backup_host'])) && (empty($v_backup_host))) {
390390
$v_backup_host = escapeshellarg($_POST['v_backup_host']);
391+
$v_backup_port = escapeshellarg($_POST['v_backup_port']);
391392
$v_backup_type = escapeshellarg($_POST['v_backup_type']);
392393
$v_backup_username = escapeshellarg($_POST['v_backup_username']);
393394
$v_backup_password = escapeshellcmd($_POST['v_backup_password']);
394395
$v_backup_bpath = escapeshellarg($_POST['v_backup_bpath']);
395-
exec (HESTIA_CMD."v-add-backup-host ". $v_backup_type ." ". $v_backup_host ." ". $v_backup_username ." '". $v_backup_password ."' ". $v_backup_bpath, $output, $return_var);
396+
exec (HESTIA_CMD."v-add-backup-host ". $v_backup_type ." ". $v_backup_host ." ". $v_backup_username ." '". $v_backup_password ."' ". $v_backup_bpath." ".$v_backup_port, $output, $return_var);
396397
check_return_code($return_var,$output);
397398
unset($output);
398399
if (empty($_SESSION['error_msg'])) $v_backup_host = $_POST['v_backup_host'];
399400
if (empty($_SESSION['error_msg'])) $v_backup_type = $_POST['v_backup_type'];
400401
if (empty($_SESSION['error_msg'])) $v_backup_username = $_POST['v_backup_username'];
401402
if (empty($_SESSION['error_msg'])) $v_backup_password = $_POST['v_backup_password'];
402403
if (empty($_SESSION['error_msg'])) $v_backup_bpath = $_POST['v_backup_bpath'];
404+
if (empty($_SESSION['error_msg'])) $v_backup_port = $_POST['v_backup_port'];
403405
$v_backup_new = 'yes';
404406
$v_backup_adv = 'yes';
405407
$v_backup_remote_adv = 'yes';
@@ -411,20 +413,21 @@
411413
if ((!empty($_POST['v_backup_host'])) && ($_POST['v_backup_type'] != $v_backup_type)) {
412414
exec (HESTIA_CMD."v-delete-backup-host '". $v_backup_type ."'", $output, $return_var);
413415
unset($output);
414-
415416
$v_backup_host = escapeshellarg($_POST['v_backup_host']);
417+
$v_backup_port = escapeshellarg($_POST['v_backup_port']);
416418
$v_backup_type = escapeshellarg($_POST['v_backup_type']);
417419
$v_backup_username = escapeshellarg($_POST['v_backup_username']);
418420
$v_backup_password = escapeshellcmd($_POST['v_backup_password']);
419421
$v_backup_bpath = escapeshellarg($_POST['v_backup_bpath']);
420-
exec (HESTIA_CMD."v-add-backup-host ". $v_backup_type ." ". $v_backup_host ." ". $v_backup_username ." '". $v_backup_password ."' ". $v_backup_bpath, $output, $return_var);
422+
exec (HESTIA_CMD."v-add-backup-host ". $v_backup_type ." ". $v_backup_host ." ". $v_backup_username ." '". $v_backup_password ."' ". $v_backup_bpath." ".$v_backup_port, $output, $return_var);
421423
check_return_code($return_var,$output);
422424
unset($output);
423425
if (empty($_SESSION['error_msg'])) $v_backup_host = $_POST['v_backup_host'];
424426
if (empty($_SESSION['error_msg'])) $v_backup_type = $_POST['v_backup_type'];
425427
if (empty($_SESSION['error_msg'])) $v_backup_username = $_POST['v_backup_username'];
426428
if (empty($_SESSION['error_msg'])) $v_backup_password = $_POST['v_backup_password'];
427429
if (empty($_SESSION['error_msg'])) $v_backup_bpath = $_POST['v_backup_bpath'];
430+
if (empty($_SESSION['error_msg'])) $v_backup_port = $_POST['v_backup_port'];
428431
$v_backup_adv = 'yes';
429432
$v_backup_remote_adv = 'yes';
430433
}
@@ -433,20 +436,22 @@
433436
// Change remote backup host
434437
if (empty($_SESSION['error_msg'])) {
435438
if ((!empty($_POST['v_backup_host'])) && ($_POST['v_backup_type'] == $v_backup_type) && (!isset($v_backup_new))) {
436-
if (($_POST['v_backup_host'] != $v_backup_host) || ($_POST['v_backup_username'] != $v_backup_username) || ($_POST['v_backup_password'] != $v_backup_password) || ($_POST['v_backup_bpath'] != $v_backup_bpath)){
439+
if (($_POST['v_backup_host'] != $v_backup_host) || ($_POST['v_backup_username'] != $v_backup_username) || ($_POST['v_backup_password'] != $v_backup_password) || ($_POST['v_backup_bpath'] != $v_backup_bpath || $_POST['v_backup_port'] != $v_backup_port)){
437440
$v_backup_host = escapeshellarg($_POST['v_backup_host']);
441+
$v_backup_port = escapeshellarg($_POST['v_backup_port']);
438442
$v_backup_type = escapeshellarg($_POST['v_backup_type']);
439443
$v_backup_username = escapeshellarg($_POST['v_backup_username']);
440444
$v_backup_password = escapeshellcmd($_POST['v_backup_password']);
441445
$v_backup_bpath = escapeshellarg($_POST['v_backup_bpath']);
442-
exec (HESTIA_CMD."v-add-backup-host ". $v_backup_type ." ". $v_backup_host ." ". $v_backup_username ." '". $v_backup_password ."' ". $v_backup_bpath, $output, $return_var);
446+
exec (HESTIA_CMD."v-add-backup-host ". $v_backup_type ." ". $v_backup_host ." ". $v_backup_username ." '". $v_backup_password ."' ". $v_backup_bpath." ".$v_backup_port, $output, $return_var);
443447
check_return_code($return_var,$output);
444448
unset($output);
445449
if (empty($_SESSION['error_msg'])) $v_backup_host = $_POST['v_backup_host'];
446450
if (empty($_SESSION['error_msg'])) $v_backup_type = $_POST['v_backup_type'];
447451
if (empty($_SESSION['error_msg'])) $v_backup_username = $_POST['v_backup_username'];
448452
if (empty($_SESSION['error_msg'])) $v_backup_password = $_POST['v_backup_password'];
449453
if (empty($_SESSION['error_msg'])) $v_backup_bpath = $_POST['v_backup_bpath'];
454+
if (empty($_SESSION['error_msg'])) $v_backup_port = $_POST['v_backup_port'];
450455
$v_backup_adv = 'yes';
451456
$v_backup_remote_adv = 'yes';
452457
}

0 commit comments

Comments
 (0)