Skip to content

Commit 7d84caf

Browse files
committed
backup: consider backup exclusion when calculating required storage
* Instead of relying on the precalculated total size, properly calculate the size and take exclusions into account
1 parent 077c0b1 commit 7d84caf

File tree

1 file changed

+106
-1
lines changed

1 file changed

+106
-1
lines changed

bin/v-backup-user

Lines changed: 106 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,111 @@ source $HESTIA/func/backup.sh
3131
# shellcheck source=/usr/local/hestia/conf/hestia.conf
3232
source $HESTIA/conf/hestia.conf
3333

34+
# Return Disk Usage
35+
get_user_disk_usage() {
36+
u_usage=0
37+
web_exclusions=''
38+
mail_exclusions=''
39+
db_exclusions=''
40+
user_exclusions=''
41+
42+
# Parsing excludes
43+
if [ -e "$USER_DATA/backup-excludes.conf" ]; then
44+
web_exclusions=$(grep 'WEB=' $USER_DATA/backup-excludes.conf |\
45+
awk -F "WEB='" '{print $2}' | cut -f 1 -d \')
46+
mail_exclusions=$(grep 'MAIL=' $USER_DATA/backup-excludes.conf |\
47+
awk -F "MAIL='" '{print $2}' | cut -f 1 -d \')
48+
db_exclusions=$(grep 'DB=' $USER_DATA/backup-excludes.conf |\
49+
awk -F "DB='" '{print $2}' | cut -f 1 -d \')
50+
user_exclusions=$(grep 'USER=' $USER_DATA/backup-excludes.conf |\
51+
awk -F "USER='" '{print $2}' | cut -f 1 -d \')
52+
fi
53+
54+
if [ -f "$USER_DATA/web.conf" ] && [ "$web_exclusions" != '*' ]; then
55+
usage=0
56+
domains=$(grep 'DOMAIN=' $USER_DATA/web.conf |\
57+
awk -F "DOMAIN='" '{print $2}' | cut -f 1 -d \')
58+
59+
for domain in $domains; do
60+
exclusion=$(echo -e "$web_exclusions" |tr ',' '\n' |grep "^$domain$")
61+
if [ -z "$exclusion" ]; then
62+
# Defining home directory
63+
home_dir="$HOMEDIR/$user/web/$domain/"
64+
exlusion=$(echo -e "$web_exclusions" |tr ',' '\n' |grep "^$domain:")
65+
fargs=()
66+
67+
if [ ! -z "$exlusion" ]; then
68+
xdirs="$(echo -e "$exlusion" |tr ':' '\n' |grep -v $domain)"
69+
for xpath in $xdirs; do
70+
fargs+=(--exclude=$xpath)
71+
done
72+
fi
73+
74+
# Checking home directory exist
75+
if [ -e "$home_dir" ]; then
76+
disk_usage=$(nice -n 19 du -shm $home_dir ${fargs[@]} | cut -f 1 )
77+
u_usage=$((u_usage + disk_usage))
78+
fi
79+
fi
80+
done
81+
fi
82+
83+
if [ -f "$USER_DATA/mail.conf" ] && [ "$mail_exclusions" != '*' ]; then
84+
usage=0
85+
domains=$(grep 'DOMAIN=' $USER_DATA/mail.conf |\
86+
awk -F "DOMAIN='" '{print $2}' | cut -f 1 -d \')
87+
88+
for domain in $domains; do
89+
check_exl=$(echo "$mail_exclusions" |tr ',' '\n' |grep "^$domain$")
90+
if [ -f "$USER_DATA/mail/$domain.conf" ] && [ -z "$check_exl" ]; then
91+
accounts=$(grep 'ACCOUNT=' $USER_DATA/mail/$domain.conf |\
92+
awk -F "ACCOUNT='" '{print $2}' | cut -f 1 -d \')
93+
94+
for account in $accounts; do
95+
home_dir=$HOMEDIR/$user/mail/$domain/$account
96+
exclusion=$(echo "$mail_exclusions" |tr ',' '\n' |grep "$domain:")
97+
exclusion=$(echo "$exclusion" |tr ':' '\n' |grep -E "^$account|\*")
98+
99+
if [ -z "$exclusion" ] && [ -e "$home_dir" ]; then
100+
disk_usage=$(nice -n 19 du -shm $home_dir | cut -f 1 )
101+
u_usage=$((u_usage + disk_usage))
102+
fi
103+
done
104+
fi
105+
done
106+
fi
107+
108+
if [ -f "$USER_DATA/db.conf" ] && [ "$db_exclusions" != '*' ]; then
109+
usage=0
110+
databases=$(grep 'DB=' $USER_DATA/db.conf |\
111+
awk -F "DB='" '{print $2}' | cut -f 1 -d \')
112+
for database in $databases; do
113+
exclusion=$(echo "$db_exclusions" |tr ',' '\n' |grep "^$database$")
114+
if [ -z "$exclusion" ]; then
115+
# Get database values
116+
get_database_values
117+
118+
# Switching on db type
119+
case $DB_SYSTEM in
120+
mysql) get_mysql_disk_usage ;;
121+
pgsql) get_pgsql_disk_usage ;;
122+
esac
123+
u_usage=$((u_usage + usage))
124+
fi
125+
done
126+
fi
127+
128+
if [ "$user_exclusions" != '*' ]; then
129+
fargs=()
130+
for xpath in $(echo "$user_exclusions" |tr ',' '\n'); do
131+
fargs+=(--exclude=$xpath)
132+
done
133+
usage=$(du -shm $HOMEDIR/$user --exclude $HOMEDIR/$user/web --exclude $HOMEDIR/$user/mail --exclude $HOMEDIR/$user/conf ${fargs[@]} |cut -f 1 )
134+
u_usage=$((u_usage + usage))
135+
fi
136+
137+
echo ${u_usage}
138+
}
34139

35140
#----------------------------------------------------------#
36141
# Verifications #
@@ -73,7 +178,7 @@ subj="$user → backup failed"
73178
email=$(grep CONTACT $HESTIA/data/users/admin/user.conf |cut -f 2 -d \')
74179

75180
# Validate available disk space (take usage * 2, due to the backup handling)
76-
let u_disk=$(grep "U_DISK=" $HESTIA/data/users/$user/user.conf |cut -f 2 -d \')*2
181+
let u_disk=$(($(get_user_disk_usage) * 2))
77182
let v_disk=$(($(stat -f --format="%a*%S" $BACKUP)))/1024/1024
78183

79184
if [ "$u_disk" -gt "$v_disk" ]; then

0 commit comments

Comments
 (0)