diff --git a/bin/v_backup_sys_user b/bin/v_backup_sys_user index 94b4663d..28983632 100755 --- a/bin/v_backup_sys_user +++ b/bin/v_backup_sys_user @@ -27,12 +27,14 @@ check_args '1' "$#" 'user [output]' # Checking argument format format_validation 'user' -# Checking web system is enabled +# Checking backup system is enabled is_system_enabled 'backup' # Checking user is_user_valid +# Checking user backups +is_backup_enabled #----------------------------------------------------------# @@ -56,8 +58,31 @@ fi echo "1.0" >$tmpdir/backup_version echo "$VERSION" > $tmpdir/vesta_version +# Checking excludes +OLD_IFS="$IFS" +IFS=$'\n' +if [ -e "$V_USERS/$user/backup.excludes" ]; then + if [ -z "$output" ]; then + echo "-- Excludes --" + fi + + for exclude in $(cat $V_USERS/$user/backup.excludes); do + if [ -z "$output" ]; then + echo -e "\t $exclude" + fi + # Indirect variable references (a bit of black magic) + eval ${exclude%%=*}=${exclude#*=} + done + + if [ -z "$output" ]; then + echo + fi +fi +IFS="$OLD_IFS" + # WEB domains -if [ ! -z "$WEB_SYSTEM" ] && [ "$WEB_SYSTEM" != 'no' ]; then +if [ ! -z "$WEB_SYSTEM" ] && [ "$WEB_SYSTEM" != 'no' ] && [ "$WEB" != '*' ] +then if [ -z "$output" ]; then echo "-- WEB --" fi @@ -68,8 +93,17 @@ if [ ! -z "$WEB_SYSTEM" ] && [ "$WEB_SYSTEM" != 'no' ]; then field='$DOMAIN' search_string='DOMAIN=' domains=$(dom_clear_search) + domain_list='' + # Cleaning excludes for domain in $domains; do + check_exl=$(echo "$WEB"|grep -w $domain) + if [ -z "$check_exl" ]; then + web_list="$web_list $domain" + fi + done + + for domain in $web_list; do if [ -z "$output" ]; then echo -e "\t$(date +%H:%m:%S) $domain" fi @@ -139,7 +173,10 @@ if [ ! -z "$WEB_SYSTEM" ] && [ "$WEB_SYSTEM" != 'no' ]; then tar -rf $tmpdir/web/$domain/$domain.tar conf cert mv $tmpdir/web/$domain/$domain.tar $tmpdir/web/ rm -rf $tmpdir/web/$domain - gzip -$V_BACKUP_GZIP $tmpdir/web/$domain.tar + + if [ ! -z "$V_BACKUP_GZIP" ]; then + gzip -$V_BACKUP_GZIP $tmpdir/web/$domain.tar + fi done if [ -z "$output" ]; then @@ -149,7 +186,8 @@ if [ ! -z "$WEB_SYSTEM" ] && [ "$WEB_SYSTEM" != 'no' ]; then fi # DNS domains -if [ ! -z "$DNS_SYSTEM" ] && [ "$DNS_SYSTEM" != 'no' ]; then +if [ ! -z "$DNS_SYSTEM" ] && [ "$DNS_SYSTEM" != 'no' ] && [ "$DNS" != '*' ] +then if [ -z "$output" ]; then echo "-- DNS --" fi @@ -161,7 +199,15 @@ if [ ! -z "$DNS_SYSTEM" ] && [ "$DNS_SYSTEM" != 'no' ]; then search_string='DOMAIN=' domains=$(dom_clear_search) + # Cleaning excludes for domain in $domains; do + check_exl=$(echo "$DNS"|grep -w $domain) + if [ -z "$check_exl" ]; then + dns_list="$dns_list $domain" + fi + done + + for domain in $dns_list; do if [ -z "$output" ]; then echo -e "\t$(date +%H:%m:%S) $domain" fi @@ -189,7 +235,7 @@ fi # TBD # DatbaBases -if [ ! -z "$DB_SYSTEM" ] && [ "$DB_SYSTEM" != 'no' ]; then +if [ ! -z "$DB_SYSTEM" ] && [ "$DB_SYSTEM" != 'no' ] && [ "$DB" != '*' ]; then if [ -z "$output" ]; then echo "-- DB --" fi @@ -201,12 +247,36 @@ if [ ! -z "$DB_SYSTEM" ] && [ "$DB_SYSTEM" != 'no' ]; then search_string='DB=' dbs=$(dom_clear_search) - for db in $dbs; do - if [ -z "$output" ]; then - echo -e "\t$(date +%H:%m:%S) $db" + # Cleaning excludes + for database in $dbs; do + check_exl=$(echo "$DB"|grep -w $database) + if [ -z "$check_exl" ]; then + db_list="$db_list $database" fi done + for database in $db_list; do + type=$(get_db_value '$TYPE') + host=$(get_db_value '$HOST') + db_user=$(get_db_value '$USER') + dump="$tmpdir/db/$database.$type.sql" + grants="$tmpdir/db/$database.$type.$db_user" + + if [ -z "$output" ]; then + echo -e "\t$(date +%H:%m:%S) $database $type" + fi + + case $type in + mysql) dump_db_mysql ;; + pgsql) dump_db_pgsql ;; + esac + + if [ ! -z "$V_BACKUP_GZIP" ]; then + gzip -$V_BACKUP_GZIP $dump + fi + + done + if [ -z "$output" ]; then echo fi @@ -214,7 +284,8 @@ if [ ! -z "$DB_SYSTEM" ] && [ "$DB_SYSTEM" != 'no' ]; then fi # Cron jobs -if [ ! -z "$CRON_SYSTEM" ] && [ "$CRON_SYSTEM" != 'no' ]; then +if [ ! -z "$CRON_SYSTEM" ] && [ "$CRON_SYSTEM" != 'no' ] && [ "$CRON" != '*' ] +then if [ -z "$output" ]; then echo "-- CRON --" fi @@ -238,7 +309,7 @@ if [ ! -z "$CRON_SYSTEM" ] && [ "$CRON_SYSTEM" != 'no' ]; then fi # SSL CERTIFICATES -if [ ! -z "$WEB_SSL" ] && [ "$WEB_SSL" != 'no' ]; then +if [ ! -z "$WEB_SSL" ] && [ "$WEB_SSL" != 'no' ] && [ "$SSL" != '*' ]; then if [ -z "$output" ]; then echo "-- CERTIFICATES --" fi @@ -293,6 +364,33 @@ if [ -e "$V_USERS/$user/history.log" ]; then cp -r $V_USERS/$user/history.log $tmpdir/vesta/ fi +if [ -e "$V_USERS/$user/backup.excludes" ]; then + if [ -z "$output" ]; then + echo -e "\t$(date +%H:%m:%S) backup.excludes" + fi + cp -r $V_USERS/$user/backup.excludes $tmpdir/vesta/ +fi + +if [ -z "$output" ]; then + echo +fi + +# Move tmp backup to local storage +if [ "$BACKUP_SYSTEM" = 'local' ]; then + if [ -z "$output" ]; then + echo "ARCHIVE $V_BACKUP/$user.$V_DATE.tar" + fi + + # Checking retention + check_ret=$() + + cd $tmpdir + tar -cf $V_BACKUP/$user.$V_DATE.tar . +fi + +cd / +rm -rf $tmpdir + if [ -z "$output" ]; then echo fi diff --git a/conf/vars.conf b/conf/vars.conf index fd1fe3ff..2a7928b3 100644 --- a/conf/vars.conf +++ b/conf/vars.conf @@ -23,9 +23,9 @@ V_LOCK=/var/lock/vesta V_HOME='/home' V_TMP='/tmp' V_BACKUP='/backup' -V_BACKUP_GZIP='5' # Other vars +V_BACKUP_GZIP='5' V_SUSPEND_URL='vestacp.com/faq/acc_suspended/' V_SCRIPT=$(basename $0) V_EVENT="$(date +%m-%d-%y" "%H:%m:%S) $V_SCRIPT $*" diff --git a/func/db_func.sh b/func/db_func.sh index 9477df70..72770810 100644 --- a/func/db_func.sh +++ b/func/db_func.sh @@ -432,7 +432,7 @@ create_db_pgsql() { $sql "CREATE ROLE $db_user WITH LOGIN PASSWORD '$db_password'" $sql "GRANT ALL PRIVILEGES ON DATABASE $database TO $db_user" - export PGPASSWORD='pgsqk' + export PGPASSWORD='pgsql' } is_db_host_new() { @@ -563,7 +563,7 @@ change_db_pgsql_password() { fi $sql "ALTER ROLE $db_user WITH LOGIN PASSWORD '$db_password'" >/dev/null - export PGPASSWORD='pgsqk' + export PGPASSWORD='pgsql' } get_db_value() { @@ -670,7 +670,7 @@ del_db_pgsql() { else $sql "REVOKE ALL PRIVILEGES ON $database FROM $db_user">/dev/null fi - export PGPASSWORD='pgsqk' + export PGPASSWORD='pgsql' } @@ -687,6 +687,77 @@ del_db_vesta() { sed -i "$string d" $conf } +dump_db_mysql() { + # Defining vars + host_str=$(grep "HOST='$host'" $V_DB/mysql.conf) + for key in $host_str; do + eval ${key%%=*}=${key#*=} + done + sql="mysql -h $HOST -u $USER -p$PASSWORD -P$PORT -e" + dumper="mysqldump -h $HOST -u $USER -p$PASSWORD -P$PORT -r" + + # Checking empty vars + if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $PORT ]; then + echo "Error: config is broken" + log_event 'debug' "$E_PARSE_ERROR $V_EVENT" + exit $E_PARSE_ERROR + fi + + # Checking connection + $sql "SELECT VERSION()" >/dev/null 2>&1; code="$?" + if [ '0' -ne "$code" ]; then + echo "Error: Connect failed" + log_event 'debug' "$E_DBHOST_UNAVAILABLE $V_EVENT" + exit $E_DBHOST_UNAVAILABLE + fi + + # Dumping database + $dumper $dump $database + + # Dumping user grants + $sql "SHOW GRANTS FOR $db_user@localhost" | grep -v "Grants for" > $grants + $sql "SHOW GRANTS FOR $db_user@'%'" | grep -v "Grants for" >> $grants +} + +dump_db_pgsql() { + # Defining vars + host_str=$(grep "HOST='$host'" $V_DB/pgsql.conf) + for key in $host_str; do + eval ${key%%=*}=${key#*=} + done + + export PGPASSWORD="$PASSWORD" + sql="psql -h $HOST -U $USER -d $TPL -p $PORT -c" + dumper="pg_dump -h $HOST -U $USER -p $PORT -c -d -O -x -i -f" + # Checking empty vars + if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $TPL ]; then + echo "Error: config is broken" + log_event 'debug' "$E_PARSE_ERROR $V_EVENT" + exit $E_PARSE_ERROR + fi + + # Checking connection + $sql "SELECT VERSION()" >/dev/null 2>&1;code="$?" + if [ '0' -ne "$code" ]; then + echo "Error: Connect failed" + log_event 'debug' "$E_DBHOST_UNAVAILABLE $V_EVENT" + exit $E_DBHOST_UNAVAILABLE + fi + + # Dumping database + $dumper $dump $database + + # Dumping user grants + md5=$($sql "SELECT rolpassword FROM pg_authid WHERE rolname='$db_user';") + md5=$(echo "$md5" | head -n 1 | cut -f 2 -d ' ') + pw_str="UPDATE pg_authid SET rolpassword='$md5' WHERE rolname='$db_user';" + gr_str="GRANT ALL PRIVILEGES ON DATABASE $database to '$db_user'" + echo -e "$pw_str\n$gr_str" >> $grants + export PGPASSWORD='pgsql' +} + + + is_db_host_free() { # Defining vars host_str=$(grep "HOST='$host'" $V_DB/$type.conf) @@ -801,7 +872,7 @@ suspend_db_pgsql() { # Suspending user $sql "REVOKE ALL PRIVILEGES ON $database FROM $db_user">/dev/null - export PGPASSWORD='pgsqk' + export PGPASSWORD='pgsql' } unsuspend_db_mysql() { @@ -859,7 +930,7 @@ unsuspend_db_pgsql() { # Unsuspending user $sql "GRANT ALL PRIVILEGES ON DATABASE $database TO $db_user" >/dev/null - export PGPASSWORD='pgsqk' + export PGPASSWORD='pgsql' } db_clear_search() { @@ -946,9 +1017,10 @@ get_disk_db_pgsql() { fi # Raw query + raq_query=$($sql "SELECT pg_database_size('$database');") - raw_size=$(echo raq_query | grep -v "-" | grep -v 'row' | sed -e "/^$/d"|\ - awk '{print $1}') + raw_size=$(echo "$raq_query" | grep -v "-" | grep -v 'row' |\ + sed -e "/^$/d" |grep -v "pg_database_size" | awk '{print $1}') # Checking null output (this means error btw) if [ -z "$raw_size" ]; then @@ -956,7 +1028,7 @@ get_disk_db_pgsql() { fi # Converting to MB - size=$(expr $raw_size \ 1048576) + size=$(expr $raw_size / 1048576) # Rounding zero size if [ "$size" -eq '0' ]; then diff --git a/func/shared_func.sh b/func/shared_func.sh index 85368e70..36d16d2e 100644 --- a/func/shared_func.sh +++ b/func/shared_func.sh @@ -1364,3 +1364,12 @@ get_config_value() { # Print value echo "$value" } + +is_backup_enabled() { + backups=$(grep "BACKUPS='" $V_USERS/$user/user.conf |cut -f 2 -d \') + if [ -z "$backups" ] || [[ "$backups" -le '0' ]]; then + echo "Error: User backups are disabled" + log_event 'debug' "$E_BACKUP_DISABLED $V_EVENT" + exit $E_BACKUP_DISABLED + fi +}