Przeglądaj źródła

backup/restore procedure

Serghey Rodin 13 lat temu
rodzic
commit
e23249a997

+ 1 - 1
bin/v-add-cron-job

@@ -40,7 +40,7 @@ is_object_unsuspended 'user' 'USER' "$user"
 is_package_full 'CRON_JOBS'
 get_next_cronjob
 validate_format 'job'
-is_object_free 'cron' 'JOB' "$job"
+is_object_new 'cron' 'JOB' "$job"
 
 
 #----------------------------------------------------------#

+ 1 - 1
bin/v-add-database

@@ -46,7 +46,7 @@ is_system_enabled "$DB_SYSTEM"
 is_type_valid "$DB_SYSTEM" "$type"
 is_object_valid 'user' 'USER' "$user"
 is_object_unsuspended 'user' 'USER' "$user"
-is_object_free 'db' 'DB' "$database"
+is_object_new 'db' 'DB' "$database"
 get_next_dbhost
 is_object_valid "../../../conf/$type" 'HOST' "$host"
 is_object_unsuspended "../../../conf/$type" 'HOST' "$host"

+ 8 - 9
bin/v-add-database-server

@@ -1,6 +1,6 @@
 #!/bin/bash
 # info: add new database server
-# options: TYPE HOST PORT DBUSER DBPASS [MAX_DB] [CHARSETS] [TEMPLATE]
+# options: TYPE HOST DBUSER DBPASS [MAX_DB] [CHARSETS] [TEMPLATE]
 #
 # The function add new database server to the server pool. It supports local
 # and remote database servers, which is useful for clusters. By adding a host
@@ -16,10 +16,9 @@
 # Argument defenition
 type=$1
 host=$2
-port=$3
-dbuser=$4
-dbpass=$5
-A5='******'
+dbuser=$3
+dbpass=$4
+A4='******'
 charsets=${7-UTF8,LATIN1,WIN1250,WIN1251,WIN1252,WIN1256,WIN1258,KOI8}
 template=${8-template1}
 
@@ -36,9 +35,9 @@ max_db=${6-500}
 #                    Verifications                         #
 #----------------------------------------------------------#
 
-args_usage='TYPE HOST PORT DBUSER DBPASS [MAX_DB] [CHARSETS] [TPL]'
+args_usage='TYPE HOST DBUSER DBPASS [MAX_DB] [CHARSETS] [TPL]'
 check_args '5' "$#" "$args_usage"
-validate_format 'host' 'port' 'dbuser' 'dbpass' 'max_db' 'charsets' 'template'
+validate_format 'host' 'dbuser' 'dbpass' 'max_db' 'charsets' 'template'
 is_system_enabled "$DB_SYSTEM"
 is_type_valid "$DB_SYSTEM" "$type"
 is_dbhost_new
@@ -54,10 +53,10 @@ esac
 
 # Concatentating db host string
 case $type in
-    mysql) str="HOST='$host' USER='$dbuser' PASSWORD='$dbpass' PORT='$port'";
+    mysql) str="HOST='$host' USER='$dbuser' PASSWORD='$dbpass'";
            str="$str CHARSETS='$charsets' MAX_DB='$max_db' U_SYS_USERS=''";
            str="$str U_DB_BASES='0' SUSPENDED='no' TIME='$TIME' DATE='$DATE'";;
-    pgsql) str="HOST='$host' USER='$dbuser' PASSWORD='$dbpass' PORT='$port'";
+    pgsql) str="HOST='$host' USER='$dbuser' PASSWORD='$dbpass'";
            str="$str CHARSETS='$charsets' TPL='$template' MAX_DB='$max_db'";
            str="$str U_SYS_USERS='' U_DB_BASES='0' SUSPENDED='no'";
            str="$str TIME='$TIME' DATE='$DATE'";;

+ 1 - 1
bin/v-add-dns-domain-record

@@ -46,7 +46,7 @@ is_object_unsuspended 'dns' 'DOMAIN' "$domain"
 is_package_full 'DNS_RECORDS'
 get_next_dnsrecord
 validate_format 'id'
-is_object_free "dns/$domain" 'ID' "$id"
+is_object_new "dns/$domain" 'ID' "$id"
 
 
 #----------------------------------------------------------#

+ 4 - 13
bin/v-add-domain

@@ -39,20 +39,11 @@ is_object_unsuspended 'user' 'USER' "$user"
 
 # Get ip if it wasn't defined
 if [ -z "$ip" ]; then
-    ip=$(grep -H "OWNER='$user'" $VESTA/data/ips/* 2>/dev/null|head -n1)
-    ip=$(echo "$ip" | cut -f 7 -d / | cut -f 1 -d :)
+    ip=$(get_user_ip $user)
     if [ -z "$ip" ]; then
-        # Check shared ips
-        admin_ips=$(grep -H "OWNER='admin'" $VESTA/data/ips/* 2>/dev/null)
-        admin_ips=$(echo "$admin_ips" | cut -f 7 -d / | cut -f 1 -d :)
-        for admin_ip in $admin_ips; do
-            if [ -z "$ip" ]; then
-                shared=$(grep "STATUS='shared'" $VESTA/data/ips/$admin_ip)
-                if [ ! -z "$shared" ]; then
-                    ip=$admin_ip
-                fi
-            fi
-        done
+        echo "Error: no avaiable IP address"
+        log_event "$E_NOTEXIST" "$EVENT"
+        exit $E_NOTEXIST
     fi
 fi
 

+ 16 - 11
bin/v-backup-user

@@ -54,9 +54,9 @@ else
     email=$(grep CONTACT $VESTA/data/users/admin/user.conf | cut -f 2 -d \')
 fi
 if [ -e "$VESTA/web/inc/mail-wrapper.php" ]; then
-    mail="$VESTA/web/inc/mail-wrapper.php"
+    send_mail="$VESTA/web/inc/mail-wrapper.php"
 else
-    mail=$(which mail)
+    send_mail=$(which mail)
 fi
 
 # Check load average
@@ -67,7 +67,7 @@ while [ "$la" -ge "$BACKUP_LA_LIMIT" ]; do
     echo
     sleep 60
     if [ "$i" -ge "15" ]; then
-        echo "LoadAverage $i is above threshold" | $mail -s "$subj" $email
+        echo "LoadAverage $i is above threshold" | $send_mail -s "$subj" $email
         echo "Error: LA is too high"
         sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
         log_event "$E_LA" "$EVENT"
@@ -79,9 +79,10 @@ done
 # Creating temporary directory
 tmpdir=$(mktemp -p $BACKUP -d)
 if [ "$?" -ne 0 ]; then
-    echo "Can't create tmp dir $tmpdir" | $mail -s "$subj" $email
+    echo "Can't create tmp dir $tmpdir" | $send_mail -s "$subj" $email
     echo "Error: can't create tmp dir"
     log_event "$E_NOTEXIST" "$EVENT"
+    exit $E_NOTEXIST
 fi
 
 # Backingup system configs
@@ -316,7 +317,7 @@ then
         cd $HOMEDIR/$user/mail/$domain
         accounts=$(ls)
         if [ ! -z "$accounts" ]; then
-            tar -cf $tmpdir/mail/$domain/accounts.tar  $accounts
+            tar -cpf $tmpdir/mail/$domain/accounts.tar  $accounts
         fi
 
         if [ ! -z "$BACKUP_GZIP" ] && [ ! -z $accounts ]; then
@@ -484,7 +485,8 @@ local_backup(){
 
     if [ "$disk_usage" -ge "$BACKUP_DISK_LIMIT" ]; then
         rm -rf $tmpdir
-        echo "Not enough disk space to run backup" | $mail -s "$subj" $email
+        echo "Not enough disk space to run backup" |\
+            $send_mail -s "$subj" $email
         echo "Error: Not enough disk space"
         sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
         log_event "$E_DISK" "$EVENT"
@@ -522,7 +524,7 @@ ftp_backup() {
     # Checking config
     if [ ! -e "$VESTA/conf/ftp.backup.conf" ]; then
         ftp_conf_error="Can't open  $VESTA/conf/ftp.backup.conf"
-        echo "$ftp_conf_error" | $mail -s "$subj" $email
+        echo "$ftp_conf_error" | $send_mail -s "$subj" $email
         echo "Error: $VESTA/conf/ftp.backup.conf does not exist"
         sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
         log_event "$E_NOTEXIST" "$EVENT"
@@ -535,7 +537,8 @@ ftp_backup() {
     # Checking variables
     if [ -z "$HOST" ] || [ -z "$USERNAME" ] || [ -z "$PASSWORD" ]; then
         rm -rf $tmpdir
-        echo "Can't parse ftp backup configuration" | $mail -s "$subj" $email
+        echo "Can't parse ftp backup configuration" |\
+            $send_mail -s "$subj" $email
         echo "Error: Parsing error"
         sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
         log_event "$E_PARSING" "$EVENT"
@@ -549,7 +552,8 @@ ftp_backup() {
     # Checking ftp connection
     if [ ! -z "$(ftpc)" ]; then
         rm -rf $tmpdir
-        echo "Can't login to ftp://$USERNAME@$HOST" | $mail -s "$subj" $email
+        echo "Can't login to ftp://$USERNAME@$HOST" |\
+            $send_mail -s "$subj" $email
         echo "Error: can't login to ftp"
         sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
         log_event "$E_FTP" "$EVENT"
@@ -562,7 +566,8 @@ ftp_backup() {
     ftp_result=$(ftpc "mkdir $ftmpdir" "rm $ftmpdir")
     if [ ! -z "$ftp_result" ] ; then
         rm -rf $tmpdir
-        echo "Can't create ftp backup folder" | $mail -s "$subj" $email
+        echo "Can't create ftp backup folder" |\
+            $send_mail -s "$subj" $email
         echo "Error: cant's create ftp folder"
         sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
         log_event "$E_FTP" "$EVENT"
@@ -660,7 +665,7 @@ sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
 if [ "$notify" != 'no' ]; then
     subj="$user → backup has been completed"
     email=$(get_user_value '$CONTACT')
-    echo -e "$msg" | $mail -s "$subj" $email
+    echo -e "$msg" | $send_mail -s "$subj" $email
 fi
 
 # Logging

+ 1 - 1
bin/v-list-database-server

@@ -69,7 +69,7 @@ is_object_valid "../../conf/$type" 'HOST' "$host"
 
 # Defining fileds to select
 conf=$VESTA/conf/$type.conf
-fields='$HOST $PORT $CHARSETS $MAX_DB $U_SYS_USERS $U_DB_BASES $TPL $SUSPENDED'
+fields='$HOST $CHARSETS $MAX_DB $U_SYS_USERS $U_DB_BASES $TPL $SUSPENDED'
 fields="$fields \$TIME \$DATE"
 
 # Listing database

+ 2 - 2
bin/v-list-database-servers

@@ -31,14 +31,14 @@ check_args '1' "$#" 'TYPE [FORMAT]'
 
 # Defining fileds to select
 conf=$VESTA/conf/$type.conf
-fields='$HOST $PORT $CHARSETS $MAX_DB $U_SYS_USERS $U_DB_BASES $TPL $SUSPENDED'
+fields='$HOST $CHARSETS $MAX_DB $U_SYS_USERS $U_DB_BASES $TPL $SUSPENDED'
 fields="$fields \$TIME \$DATE"
 
 # Listing database
 case $format in 
     json)   json_list ;;
     plain)  nohead=1; shell_list;;
-    shell)  fields='$HOST $PORT $MAX_DB $U_DB_BASES $SUSPENDED $DATE';
+    shell)  fields='$HOST $MAX_DB $U_DB_BASES $SUSPENDED $DATE';
             shell_list | column -t ;;
     *)      check_args '2' '0' 'TYPE [FORMAT]'
 esac

+ 107 - 0
bin/v-list-user-backup

@@ -0,0 +1,107 @@
+#!/bin/bash
+# info: list user backup
+# options: USER BACKUP [FORMAT]
+#
+# The function of obtaining the list of backup parameters. This call, just as
+# all v_list_* calls, supports 3 formats - json, shell and plain.
+
+
+#----------------------------------------------------------#
+#                    Variable&Function                     #
+#----------------------------------------------------------#
+
+# Argument defenition
+user=$1
+backup=$2
+format=${3-shell}
+
+# Includes
+source $VESTA/func/main.sh
+
+# Json function
+json_list_backup() {
+    i=1
+    fileds_count=$(echo "$fields" | wc -w)
+    line=$(grep "BACKUP='$backup'" $conf)
+
+    # Print top bracket
+    echo '{'
+
+    # Assing key=value
+    eval $line
+
+    # Starting output loop
+    for field in $fields; do
+        # Parsing key=value
+        eval value=$field
+
+        # Checking first field
+        if [ "$i" -eq 1 ]; then
+            echo -e "\t\"$value\": {"
+        else
+            if [ "$fileds_count" -eq "$i" ]; then
+                echo -e "\t\t\"${field//$/}\": \"$value\""
+            else
+                echo -e "\t\t\"${field//$/}\": \"$value\","
+            fi
+        fi
+        # Updating iterator
+        (( ++i))
+    done
+
+    # If there was any output
+    if [ -n "$value" ]; then
+        echo -e '        }'
+    fi
+    # Printing bottom json bracket
+    echo -e "}"
+}
+
+# Shell function
+shell_list_backup() {
+    line=$(grep "BACKUP='$backup'" $conf)
+
+    # Parsing key=value
+    eval $line
+
+    # Print result line
+    for field in $fields; do
+        eval key="$field"
+        echo "${field//$/}: $key "
+    done
+}
+
+
+#----------------------------------------------------------#
+#                    Verifications                         #
+#----------------------------------------------------------#
+
+check_args '2' "$#" 'USER BACKUP [FORMAT]'
+is_object_valid 'user' 'USER' "$user"
+is_object_valid 'backup' 'BACKUP' "$backup"
+
+
+#----------------------------------------------------------#
+#                       Action                             #
+#----------------------------------------------------------#
+
+# Defining config and fields to select
+conf=$USER_DATA/backup.conf
+
+fields="\$BACKUP \$TYPE \$SIZE \$VESTA \$PAM \$WEB \$DNS \$DB"
+fields="$fields \$MAIL \$CRON \$RUNTIME \$TIME \$DATE"
+
+# Listing backup
+case $format in 
+    json)   json_list_backup ;;
+    plain)  nohead=1; shell_list_backup ;;
+    shell)  shell_list_backup |column -t ;;
+    *)      check_args '2' '0' 'USER BACKUP [FORMAT]'
+esac
+
+
+#----------------------------------------------------------#
+#                       Vesta                              #
+#----------------------------------------------------------#
+
+exit

+ 5 - 0
bin/v-rebuild-databases

@@ -16,6 +16,7 @@ user=$1
 source $VESTA/conf/vesta.conf
 source $VESTA/func/main.sh
 source $VESTA/func/db.sh
+source $VESTA/func/rebuild.sh
 
 
 #----------------------------------------------------------#
@@ -34,12 +35,16 @@ is_object_valid 'user' 'USER' "$user"
 
 # Starting rebuild loop
 for database in $(search_objects 'db' 'SUSPENDED' "no" 'DB'); do
+
+    # Get database values
     get_database_values
+
     # Switching on db type
     case $TYPE in
         mysql) rebuild_mysql_database ;;
         pgsql) rebuild_pgsql_database ;;
     esac
+
 done
 
 

+ 2 - 48
bin/v-rebuild-dns-domains

@@ -17,6 +17,7 @@ restart=$2
 source $VESTA/conf/vesta.conf
 source $VESTA/func/main.sh
 source $VESTA/func/domain.sh
+source $VESTA/func/rebuild.sh
 
 
 #----------------------------------------------------------#
@@ -52,54 +53,7 @@ sed -i "/\/$user\/conf\/dns/d" /etc/named.conf
 
 # Starting loop
 for domain in $(search_objects 'dns' 'DOMAIN' "*" 'DOMAIN'); do
-    # Defining variables
-    get_domain_values 'dns'
-    domain_idn=$(idn -t --quiet -a "$domain")
-
-    # Checking zone file
-    if [ ! -e "$USER_DATA/dns/$domain.conf" ]; then
-        cat $DNSTPL/$TPL.tpl |\
-            sed -e "s/%ip%/$IP/g" \
-                -e "s/%domain_idn%/$domain_idn/g" \
-                -e "s/%domain%/$domain/g" \
-                -e "s/%ns1%/$ns1/g" \
-                -e "s/%ns2%/$ns2/g" \
-                -e "s/%ns3%/$ns3/g" \
-                -e "s/%ns4%/$ns4/g" \
-                -e "s/%time%/$TIME/g" \
-                -e "s/%date%/$DATE/g" > $USER_DATA/dns/$domain.conf
-    fi
-
-    # Sorting records
-    sort_dns_records
-
-    # Updating zone
-    update_domain_zone
-
-    # Set file permissions
-    chmod 640 $HOMEDIR/$user/conf/dns/$domain.db
-    chown root:named $HOMEDIR/$user/conf/dns/$domain.db
-
-    # Bind config check
-    nconf='/etc/named.conf'
-    if [ "$SUSPENDED" = 'yes' ]; then
-        rm_string=$(grep -n /etc/namedb/$domain.db $nconf | cut -d : -f 1)
-        if [ ! -z "$rm_string" ]; then
-            sed -i "$rm_string d" $nconf
-        fi
-        suspended_dns=$((suspended_dns + 1))
-    else
-        if [ -z "$(grep /$domain.db $nconf)" ]; then
-            named="zone \"$domain_idn\" {type master; file"
-            named="$named \"$HOMEDIR/$user/conf/dns/$domain.db\";};"
-            echo "$named" >> /etc/named.conf
-        fi
-    fi
-    user_domains=$((user_domains + 1))
-    records=$(wc -l $USER_DATA/dns/$domain.conf | cut -f 1 -d ' ')
-    user_records=$((user_records + records))
-    update_object_value 'dns' 'DOMAIN' "$domain" '$RECORDS' "$records"
-
+    rebuild_dns_domain_conf
 done
 
 

+ 2 - 114
bin/v-rebuild-mail-domains

@@ -16,6 +16,7 @@ user=$1
 source $VESTA/conf/vesta.conf
 source $VESTA/func/main.sh
 source $VESTA/func/domain.sh
+source $VESTA/func/rebuild.sh
 
 
 #----------------------------------------------------------#
@@ -48,120 +49,7 @@ fi
 
 # Starting loop
 for domain in $(search_objects 'mail' 'SUSPENDED' "*" 'DOMAIN'); do
-    # Defining variables
-    get_domain_values 'mail'
-
-    # Rebuilding config structure
-    rm -f /etc/exim/domains/$domain
-    mkdir -p $HOMEDIR/$user/conf/mail/$domain
-    ln -s $HOMEDIR/$user/conf/mail/$domain /etc/exim/domains/
-    rm -f $HOMEDIR/$user/conf/mail/$domain/aliases
-    rm -f $HOMEDIR/$user/conf/mail/$domain/protection
-    rm -f $HOMEDIR/$user/conf/mail/$domain/passwd
-    touch $HOMEDIR/$user/conf/mail/$domain/aliases
-    touch $HOMEDIR/$user/conf/mail/$domain/protection
-    touch $HOMEDIR/$user/conf/mail/$domain/passwd
-    chown -R dovecot:mail $HOMEDIR/$user/conf/mail/$domain
-    chown -R dovecot:mail /etc/exim/domains/$domain
-    chmod 770 $HOMEDIR/$user/conf/mail/$domain
-    chmod 660 $HOMEDIR/$user/conf/mail/$domain/*
-    chmod 770 /etc/exim/domains/$domain
-
-    # Adding antispam protection
-    if [ "$ANTISPAM" = 'yes' ]; then
-        echo 'antispam' >> $HOMEDIR/$user/conf/mail/$domain/protection
-    fi
-
-    # Adding antivirus protection
-    if [ "$ANTIVIRUS" = 'yes' ]; then
-        echo 'antivirus' >> $HOMEDIR/$user/conf/mail/$domain/protection
-    fi
-
-    # Adding dkim
-    if [ "$DKIM" = 'yes' ]; then
-        U_MAIL_DKMI=$((U_MAIL_DKMI + 1))
-        pem="$USER_DATA/mail/$domain.pem"
-        pub="$USER_DATA/mail/$domain.pub"
-        openssl genrsa -out $pem 512 &>/dev/null
-        openssl rsa -pubout -in $pem -out $pub &>/dev/null
-        chmod 660 $USER_DATA/mail/$domain.*
-
-        cp $pem $HOMEDIR/$user/conf/mail/$domain/dkim.pem
-        chown root:mail $HOMEDIR/$user/conf/mail/$domain/dkim.pem
-        chmod 660 $HOMEDIR/$user/conf/mail/$domain/dkim.pem
-
-        # Deleting old dkim records
-        records=$($BIN/v-list-dns-domain-records $user $domain plain)
-        dkim_records=$(echo "$records" |grep -w '_domainkey'|cut -f 1 -d ' ')
-        for id in $dkim_records; do
-            $BIN/v-delete-dns-domain-record $user $domain $id
-        done
-
-        # Adding dkim dns records
-        check_dns_domain=$(is_object_valid 'dns' 'DOMAIN' "$domain")
-        if [ "$?" -eq 0 ]; then
-            p=$(cat $pub|grep -v ' KEY---'|tr -d '\n')
-            record='_domainkey'
-            policy="\"t=y; o=~;\""
-            $BIN/v-add-dns-domain-record $user $domain $record TXT "$policy"
-
-            record='mail._domainkey'
-            slct="\"k=rsa\; p=$p\""
-            $BIN/v-add-dns-domain-record $user $domain $record TXT "$slct"
-        fi
-    fi
-
-    # Removing symbolic link
-    if [ "$SUSPENDED" = 'yes' ]; then
-        SUSPENDED_MAIL=$((SUSPENDED_MAIL +1))
-        rm -f /etc/exim/domains/$domain
-    fi
-
-    if [ ! -e $HOMEDIR/$user/mail/$domain ]; then
-        mkdir $HOMEDIR/$user/mail/$domain
-    fi
-    chown $user:mail $HOMEDIR/$user/mail/$domain
-    chmod 770 $HOMEDIR/$user/mail/$domain
-
-    dom_aliases=$HOMEDIR/$user/conf/mail/$domain/aliases
-    if [ ! -z "$CATCHALL" ]; then
-        echo "*@$domain:$CATCHALL" >> $dom_aliases
-    fi
-
-    # Rebuild domain accounts
-    accs=0
-    dom_diks=0
-    if [ -e "$USER_DATA/mail/$domain.conf" ]; then
-        accounts=$(search_objects "mail/$domain" 'SUSPENDED' "no" 'ACCOUNT')
-    else
-        accounts=''
-    fi
-
-    for account in $accounts; do
-        (( ++accs))
-        dom_diks=$((dom_diks + U_DISK))
-        object=$(grep "ACCOUNT='$account'" $USER_DATA/mail/$domain.conf)
-        eval "$object"
-        if [ "$SUSPENDED" = 'yes' ]; then
-            MD5='SUSPENDED'
-        fi
-
-        str="$account:$MD5:$user:mail::$HOMEDIR/$user:$QUOTA"
-        echo $str >> $HOMEDIR/$user/conf/mail/$domain/passwd
-
-        for malias in ${ALIAS//,/ }; do
-            echo "$malias@$domain:$account@$domain" >> $dom_aliases
-        done
-        if [ ! -z "$FWD" ]; then
-            echo "$account@$domain:$FWD" >> $dom_aliases
-        fi
-
-    done
-    update_object_value 'mail' 'DOMAIN' "$domain" '$ACCOUNTS' "$accs"
-    update_object_value 'mail' 'DOMAIN' "$domain" '$U_DISK' "$dom_diks"
-    U_MAIL_ACCOUNTS=$((U_MAIL_ACCOUNTS + accs))
-    U_DISK_MAIL=$((U_DISK_MAIL + dom_diks))
-    U_MAIL_DOMAINS=$((U_MAIL_DOMAINS + 1))
+    rebuild_mail_domain_conf
 done
 
 

+ 2 - 189
bin/v-rebuild-web-domains

@@ -18,6 +18,7 @@ source $VESTA/conf/vesta.conf
 source $VESTA/func/main.sh
 source $VESTA/func/domain.sh
 source $VESTA/func/ip.sh
+source $VESTA/func/rebuild.sh
 
 
 #----------------------------------------------------------#
@@ -50,195 +51,7 @@ rm -f $HOMEDIR/$user/conf/tmp_*.conf
 # Starting loop
 for domain in $(shell_list); do
     ((++ domain_counter))
-
-    # Rebuilding directories
-    mkdir -p $HOMEDIR/$user/web/$domain \
-        $HOMEDIR/$user/web/$domain/public_html \
-        $HOMEDIR/$user/web/$domain/public_shtml \
-        $HOMEDIR/$user/web/$domain/document_errors \
-        $HOMEDIR/$user/web/$domain/cgi-bin \
-        $HOMEDIR/$user/web/$domain/private \
-        $HOMEDIR/$user/web/$domain/stats \
-        $HOMEDIR/$user/web/$domain/logs
-
-    ln -f -s /var/log/httpd/domains/$domain.log \
-        $HOMEDIR/$user/web/$domain/logs/$domain.log
-    ln -f -s /var/log/httpd/domains/$domain.error.log \
-        $HOMEDIR/$user/web/$domain/logs/$domain.error.log
-
-    if [ ! -e "$WEBTPL/skel/document_errors/" ]; then
-        cp -r $WEBTPL/skel/document_errors/ $HOMEDIR/$user/web/$domain/
-    fi
-
-    touch /var/log/httpd/domains/$domain.bytes \
-          /var/log/httpd/domains/$domain.log \
-          /var/log/httpd/domains/$domain.error.log
-
-    chmod 551 $HOMEDIR/$user/web/$domain
-    chmod 751 $HOMEDIR/$user/web/$domain/private
-    chmod 751 $HOMEDIR/$user/web/$domain/cgi-bin
-    chmod 751 $HOMEDIR/$user/web/$domain/public_html
-    chmod 751 $HOMEDIR/$user/web/$domain/public_shtml
-    chmod 751 $HOMEDIR/$user/web/$domain/document_errors
-    chmod 551 $HOMEDIR/$user/web/$domain/stats
-    chmod 551 $HOMEDIR/$user/web/$domain/logs
-    chmod 640 /var/log/httpd/domains/$domain.*
-
-    chown $user:$user $HOMEDIR/$user/web/$domain
-    chown $user:$user $HOMEDIR/$user/web/$domain/private
-    chown $user:$user $HOMEDIR/$user/web/$domain/cgi-bin
-    chown $user:$user $HOMEDIR/$user/web/$domain/public_html
-    chown $user:$user $HOMEDIR/$user/web/$domain/public_shtml
-    chown -R $user:$user $HOMEDIR/$user/web/$domain/document_errors
-    chown root:$user /var/log/httpd/domains/$domain.*
-    chown root:apache $conf
-
-    # Parsing domain values
-    domain_idn=$(idn -t --quiet -a "$domain")
-    get_domain_values 'web'
-    ip=$(get_real_ip $IP)
-
-    # Preparing domain values for the template substitution
-    upd_web_domain_values
-
-    # Adding domain to the tmp_httpd.conf
-    tpl_file="$WEBTPL/apache_$TPL.tpl"
-    conf="$HOMEDIR/$user/conf/web/tmp_httpd.conf"
-    add_web_config
-    chown root:apache $conf
-    chmod 640 $conf
-
-    # Running template trigger
-    if [ -x $WEBTPL/apache_$TPL.sh ]; then
-        $WEBTPL/apache_$TPL.sh $user $domain $ip $HOMEDIR $docroot
-    fi
-
-    # Checking aliases
-    if [ ! -z "$ALIAS" ]; then
-        aliases=$(echo "$ALIAS"|tr ',' '\n'| wc -l)
-        user_aliases=$((user_aliases + aliases))
-    fi
-
-    # Checking stats
-    if [ ! -z "$STATS" ]; then
-        cat $WEBTPL/$STATS.tpl |\
-            sed -e "s/%ip%/$ip/g" \
-                -e "s/%web_port%/$WEB_PORT/g" \
-                -e "s/%web_ssl_port%/$WEB_SSL_PORT/g" \
-                -e "s/%proxy_port%/$PROXY_PORT/g" \
-                -e "s/%proxy_ssl_port%/$PROXY_SSL_PORT/g" \
-                -e "s/%domain_idn%/$domain_idn/g" \
-                -e "s/%domain%/$domain/g" \
-                -e "s/%user%/$user/g" \
-                -e "s/%home%/${HOMEDIR////\/}/g" \
-                -e "s/%alias%/${aliases//,/ }/g" \
-                -e "s/%alias_idn%/${aliases_idn//,/ }/g" \
-                > $HOMEDIR/$user/conf/web/$STATS.$domain.conf
-
-
-        if [ "$STATS" == 'awstats' ]; then
-            if [ ! -e "/etc/awstats/$STATS.$domain_idn.conf" ]; then
-                ln -s $HOMEDIR/$user/conf/web/$STATS.$domain.conf \
-                    /etc/awstats/$STATS.$domain_idn.conf
-            fi
-        fi
-
-        webstats="$BIN/v-update-web-domain-stat $user $domain"
-        check_webstats=$(grep "$webstats" $VESTA/data/queue/webstats.pipe)
-        if [ -z "$check_webstats" ]; then
-            echo "$webstats" >> $VESTA/data/queue/webstats.pipe
-        fi
-
-        if [ ! -z "$STATS_USER" ]; then
-            # Definining statistic dir
-            stats_dir="$HOMEDIR/$user/web/$domain/stats"
-
-            # Adding htaccess file
-            echo "AuthUserFile $stats_dir/.htpasswd" > $stats_dir/.htaccess
-            echo "AuthName \"Web Statistics\"" >> $stats_dir/.htaccess
-            echo "AuthType Basic" >> $stats_dir/.htaccess
-            echo "Require valid-user" >> $stats_dir/.htaccess
-
-            # Generating htaccess user and password
-            echo "$STATS_USER:$STATS_CRYPT" > $stats_dir/.htpasswd
-        fi
-    fi
-
-    # Checking ssl
-    if [ "$SSL" = 'yes' ]; then
-        # Adding domain to the shttpd.conf
-        conf="$HOMEDIR/$user/conf/web/tmp_shttpd.conf"
-        tpl_file="$WEBTPL/apache_$TPL.stpl"
-        add_web_config
-        chown root:apache $conf
-        chmod 640 $conf
-
-        cp -f $USER_DATA/ssl/$domain.crt \
-            $HOMEDIR/$user/conf/web/ssl.$domain.crt
-        cp -f $USER_DATA/ssl/$domain.key \
-            $HOMEDIR/$user/conf/web/ssl.$domain.key
-        cp -f $USER_DATA/ssl/$domain.pem \
-            $HOMEDIR/$user/conf/web/ssl.$domain.pem
-        if [ -e "$USER_DATA/ssl/$domain.ca" ]; then
-            cp -f $USER_DATA/ssl/$domain.ca \
-                $HOMEDIR/$user/conf/web/ssl.$domain.ca
-        fi
-
-        # Running template trigger
-        if [ -x $WEBTPL/apache_$TPL.sh ]; then
-            $WEBTPL/apache_$TPL.sh $user $domain $ip $HOMEDIR $sdocroot
-        fi
-
-        user_ssl=$((user_ssl + 1))
-        ssl_change='yes'
-    fi
-
-    # Checking nginx
-    if [ ! -z "$NGINX" ]; then
-        tpl_file="$WEBTPL/nginx_$NGINX.tpl"
-        conf="$HOMEDIR/$user/conf/web/tmp_nginx.conf"
-        add_web_config
-        chown root:nginx $conf
-        chmod 640 $conf
-
-        if [ "$SSL" = 'yes' ]; then
-            tpl_file="$WEBTPL/nginx_$NGINX.stpl"
-            conf="$HOMEDIR/$user/conf/web/tmp_snginx.conf"
-            add_web_config
-            chown root:nginx $conf
-            chmod 640 $conf
-        fi
-        ngix_change='yes'
-    fi
-    if [ "$SUSPENDED" = 'yes' ]; then
-        suspended_web=$((suspended_web + 1))
-    fi
-    user_domains=$((user_domains + 1))
-
-    # Checking ftp
-    if [ ! -z "$FTP_USER" ]; then
-        if [ -z "$(grep ^$FTP_USER: /etc/passwd)" ]; then
-            /usr/sbin/adduser -o -u $(id -u $user) -g $user -s /sbin/nologin \
-                -M -d "$HOMEDIR/$user/web/$domain" $FTP_USER > /dev/null 2>&1
-
-            shadow='/etc/shadow'
-            shdw=$(grep "^$FTP_USER:" $shadow)
-            shdw3=$(echo "$shdw" | cut -f3 -d :)
-            shdw4=$(echo "$shdw" | cut -f4 -d :)
-            shdw5=$(echo "$shdw" | cut -f5 -d :)
-            shdw6=$(echo "$shdw" | cut -f6 -d :)
-            shdw7=$(echo "$shdw" | cut -f7 -d :)
-            shdw8=$(echo "$shdw" | cut -f8 -d :)
-            shdw9=$(echo "$shdw" | cut -f9 -d :)
-            chmod u+w $shadow
-            sed -i "/^$FTP_USER:*/d" $shadow
-            shdw_str="$FTP_USER:$FTP_MD5:$shdw3:$shdw4:$shdw5:$shdw6"
-            shdw_str="$shdw_str:$shdw7:$shdw8:$shdw9"
-            echo "$shdw_str" >> $shadow
-            chmod u-w $shadow
-        fi
-    fi
-
+    rebuild_web_domain_conf
 done
 
 # Config path

+ 571 - 1
bin/v-restore-user

@@ -1,6 +1,6 @@
 #!/bin/bash
 # info: restore user
-# options: USER BACKUP
+# options: USER BACKUP [WEB] [DNS] [MAIL] [DB] [CRON] [UDIRS] [NOTIFY]
 #
 # The function for resotring user from backup.
 
@@ -12,28 +12,598 @@
 # Argument defenition
 user=$1
 backup=$2
+web=$3
+dns=$4
+mail=$5
+db=$6
+cron=$7
+u_dirs=$8
+notify=${9-no}
+
+# Define backup dir
+if [ -z "$BACKUP" ]; then
+    BACKUP=/home/backup/
+fi
 
 # Includes
 source $VESTA/conf/vesta.conf
 source $VESTA/func/main.sh
 source $VESTA/func/domain.sh
+source $VESTA/func/ip.sh
 source $VESTA/func/db.sh
+source $VESTA/func/rebuild.sh
+
+# Check backup function
+is_backup_valid() {
+    if [ ! -e "$BACKUP/$backup" ]; then
+        echo "Error: backup not exist"
+        log_event "$E_NOTEXIST" "$EVENT"
+        exit $E_NOTEXIST
+    fi
+}
 
 
 #----------------------------------------------------------#
 #                    Verifications                         #
 #----------------------------------------------------------#
 
+args='USER BACKUP [WEB] [DNS] [MAIL] [DB] [CRON] [UDIRS] [NOTIFY]'
+check_args '2' "$#" $args
+validate_format 'user' 'backup'
+is_object_valid 'user' 'USER' "$user"
+is_object_unsuspended 'user' 'USER' "$user"
+is_backup_valid
+
 
 #----------------------------------------------------------#
 #                       Action                             #
 #----------------------------------------------------------#
 
+# Set notification email and subject
+if [ "$notify" != 'no' ]; then
+    subj="$user → restore failed"
+    email=$(get_user_value '$CONTACT')
+else
+    subj="$user → restore failed"
+    email=$(grep CONTACT $VESTA/data/users/admin/user.conf | cut -f 2 -d \')
+fi
+if [ -e "$VESTA/web/inc/mail-wrapper.php" ]; then
+    send_mail="$VESTA/web/inc/mail-wrapper.php"
+else
+    send_mail=$(which mail)
+fi
+
+# Check disk usage
+disk_usage=$(df $BACKUP |tail -n1 |tr ' ' '\n' |grep % |cut -f 1 -d %)
+if [ "$disk_usage" -ge "$BACKUP_DISK_LIMIT" ]; then
+    rm -rf $tmpdir
+    echo "Not enough disk space to run backup" | $send_mail -s "$subj" $email
+    echo "Error: Not enough disk space"
+    sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
+    log_event "$E_DISK" "$EVENT"
+    exit $E_DISK
+fi
+
+# Check load average
+la=$(cat /proc/loadavg | cut -f 1 -d ' ' | cut -f 1 -d '.')
+i=0
+while [ "$la" -ge "$BACKUP_LA_LIMIT" ]; do
+    echo "$(date "+%F %T") Load Average $la"
+    echo
+    sleep 60
+    if [ "$i" -ge "15" ]; then
+        echo "LoadAverage $i is above threshold" | $send_mail -s "$subj" $email
+        echo "Error: LA is too high"
+        sed -i "/ $user /d" $VESTA/data/queue/backup.pipe
+        log_event "$E_LA" "$EVENT"
+        exit $E_LA
+    fi
+    (( ++i))
+done
+
+# Creating temporary directory
+tmpdir=$(mktemp -p $BACKUP -d)
+if [ "$?" -ne 0 ]; then
+    echo "Can't create tmp dir $tmpdir" | $send_mail -s "$subj" $email
+    echo "Error: can't create tmp dir"
+    log_event "$E_NOTEXIST" "$EVENT"
+    exit $E_NOTEXIST
+fi
+
+
+# WEB
+if [ "$web" != 'no' ]; then
+    echo "-- WEB --"
+    msg="$msg\n-- WEB --"
+
+    # Create domain list
+    domain_list=$(tar -tf $BACKUP/$backup | grep "^./web" |\
+        grep domain_data.tar.gz | cut -f 3 -d '/')
+    if [ ! -z "$web" ]; then
+        dom_include_list=$(mktemp)
+        for domain_include in ${web//,/ }; do
+            echo "^$domain_include$" >> $dom_include_list
+        done
+        domain_list=$(echo "$domain_list" | egrep -f $dom_include_list )
+        rm -f $dom_include_list
+    fi
+
+    for domain in $domain_list; do
+        echo -e "$(date "+%F %T") $domain"
+        msg="$msg\n$(date "+%F %T") $domain"
+
+        # unpack domain container
+        tar xf $BACKUP/$backup -C $tmpdir ./web/$domain
+        if [ "$?" -ne 0 ]; then
+            echo "Error: can't unpack $domain web contaner"
+            echo "Can't unpack $domain web contaner" |\
+                $send_mail -s "$subj" $email
+            rm -rf $tmpdir
+            exit $E_PARSING
+        fi
+
+        # Restore domain config
+        check_config=$(grep "DOMAIN='$domain'" $USER_DATA/web.conf)
+        if [ -z "$check_config" ]; then
+
+            # Parse domain config
+            eval $(cat $tmpdir/web/$domain/vesta/web.conf)
+
+            # Check if domain new
+            check_new=$(is_domain_new 'web' $domain)
+            if [ ! -z "$check_new" ]; then
+                echo "Error: web domain $domain belongs to another user"
+                echo "Web domain $domain belongs to another user" |\
+                    $sedn_mail -s "$subj" $email
+                rm -rf $tmpdir
+                log_event "$E_EXISTS" "$EVENT"
+                exit $E_EXISTS
+            fi
+
+            # Check if domain alias is new
+            for dom_alias in ${ALIAS//,/ }; do
+                check_new=$(is_domain_new 'web' $dom_alias)
+                if [ ! -z "$check_new" ]; then
+                    # Delete conflicting alias
+                    ALIAS=$(echo "$ALIAS" |\
+                        sed -e "s/,/\n/g"|\
+                        sed -e "s/^$dom_alias$//g"|\
+                        sed -e "/^$/d"|\
+                        sed -e ':a;N;$!ba;s/\n/,/g')
+                fi
+            done
+
+            # Check ip address
+            check_ip=$(is_ip_valid $IP)
+            if [ -z "$check_ip" ]; then
+                check_ip=$(is_ip_avalable $IP)
+            fi
+            if [ ! -z "$check_ip" ]; then
+                IP=$(get_user_ip $user)
+                if [ -z "$IP" ]; then
+                    echo "Error: no avaiable IP address"
+                    echo "No available IP address" |\
+                        $send_mail -s "$subj" $email
+                    log_event "$E_NOTEXIST" "$EVENT"
+                    exit $E_NOTEXIST
+                fi
+                echo "$IP" > $tmpdir/ip_mapping.$domain
+            fi
+
+            # Check apache template
+            check_tpl=$(is_apache_template_valid)
+            if [ ! -z "$check_tpl" ]; then
+                templates=$(ls -t $VESTA/data/templates/web/ |\
+                    grep 'apache' |\
+                    grep '\.tpl' |\
+                    cut -f 2 -d '_' |\
+                    cut -f 1 -d  '.')
+                if [ ! -z "$(echo $templates |grep default)" ]; then
+                    TPL=$(echo "$templates" |grep default |head -n1)
+                else
+                    TPL=$("$templates" |head -n1)
+                fi
+
+                if [ -z "$TPL" ]; then
+                    echo "Error: no avaiable web template"
+                    echo "No available web template" |\
+                        $send_mail -s "$subj" $email
+                    log_event "$E_NOTEXIST" "$EVENT"
+                    exit $E_NOTEXIST
+                fi
+            fi
+
+            # Check nginx template
+            if [ ! -z "$NGINX" ]; then
+                check_tpl=$(is_nginx_template_valid)
+                if [ ! -z "$check_tpl" ]; then
+                    templates=$(ls -t $VESTA/data/templates/web/ |\
+                        grep 'nginx' |\
+                        grep '\.tpl' |\
+                        cut -f 2 -d '_' |\
+                        cut -f 1 -d  '.')
+                    if [ ! -z "$(echo $templates |grep default)" ]; then
+                        NGINX=$(echo "$templates" |grep default |head -n1)
+                    else
+                        NGINX=$("$templates" |head -n1)
+                    fi
+
+                    if [ -z "$NGINX" ]; then
+                        echo "Error: no avaiable nginx template"
+                        echo "No available nginx tpl" |\
+                            $send_mail -s "$subj" $email
+                        log_event "$E_NOTEXIST" "$EVENT"
+                        exit $E_NOTEXIST
+                    fi
+                fi
+            fi
+
+            str="DOMAIN='$domain' IP='$IP' IP6='$IP6' ALIAS='$ALIAS'"
+            str="$str TPL='$TPL' SSL='$SSL' SSL_HOME='$SSL_HOME'"
+            str="$str FTP_USER='$FTP_USER' FTP_MD5='$FTP_MD5' NGINX='$NGINX'"
+            str="$str NGINX_EXT='$NGINX_EXT' STATS='$STATS'"
+            str="$str STATS_USER='$STATS_USER' STATS_CRYPT='$STATS_CRYPT'"
+            str="$str U_DISK='$U_DISK' U_BANDWIDTH='0' SUSPENDED='no'"
+            str="$str TIME='$(date +%T)' DATE='$(date +%F)'"
+            echo $str >> $USER_DATA/web.conf
+
+            # Rebuild web config
+            rebuild_web_domain_conf
+
+            # Adding apache virtualhost
+            httpd_conf='/etc/httpd/conf.d/vesta.conf'
+            tmp_conf="$HOMEDIR/$user/conf/web/tmp_httpd.conf"
+            conf="$HOMEDIR/$user/conf/web/httpd.conf"
+            cat $tmp_conf >> $conf
+            rm -f $tmp_conf
+            httpd_include=$(grep "$conf" $httpd_conf )
+            if [ -z "$httpd_include" ]; then
+                echo "Include $conf" >> $httpd_conf
+            fi
+
+            # Adding ssl apache virtuualhost
+            if [ "$ssl_change" = 'yes' ]; then
+                tmp_conf="$HOMEDIR/$user/conf/web/tmp_shttpd.conf"
+                conf="$HOMEDIR/$user/conf/web/shttpd.conf"
+                cat $tmp_conf >> $conf
+                rm -f $tmp_conf
+            fi
+            httpd_include=$(grep "$conf" $httpd_conf )
+            if [ -z "$httpd_include" ]; then
+                echo "Include $conf" >> $httpd_conf
+            fi
+
+            # Adding nginx virtualhost
+            nginx_conf='/etc/nginx/conf.d/vesta_users.conf'
+            if [ "$ngix_change" = 'yes' ]; then
+                tmp_conf="$HOMEDIR/$user/conf/web/tmp_nginx.conf"
+                conf="$HOMEDIR/$user/conf/web/nginx.conf"
+                cat $tmp_conf >> $conf
+                rm -f $tmp_conf
+            fi
+            nginx_include=$(grep "$conf" $nginx_conf )
+            if [ -z "$nginx_include" ]; then
+                echo "include $conf;" >> $nginx_conf
+            fi
+
+            # Adding ssl nginx virtualhost
+            if [ "$ngix_change" = 'yes' ] && [ "$ssl_change" = 'yes' ]; then
+                tmp_conf="$HOMEDIR/$user/conf/web/tmp_snginx.conf"
+                conf="$HOMEDIR/$user/conf/web/snginx.conf"
+                cat $tmp_conf >> $conf
+                rm -f $tmp_conf
+                nginx_include=$(grep "$conf" $nginx_conf )
+                if [ -z "$nginx_include" ]; then
+                    echo "include $conf;" >> $nginx_conf
+                fi
+            fi
+        fi
+
+        # Restore data
+        tar -xzpf $tmpdir/web/$domain/domain_data.tar.gz \
+            -C $HOMEDIR/$user/web/$domain/
+        if [ "$?" -ne 0 ]; then
+            echo "Error: can't unpack $domain data tarball"
+            echo "Can't can't unpack $domain data tarball" |\
+                $send_mail -s "$subj" $email
+            rm -rf $tmpdir
+            exit $E_PARSING
+        fi
+    done
+    echo
+    msg="$msg\n"
+fi
+
+# DNS
+if [ "$dns" != 'no' ]; then
+    echo "-- DNS --"
+    msg="$msg\n-- DNS --"
+
+    # Create domain list
+    domain_list=$(tar -tf $BACKUP/$backup | grep "^./dns" |\
+        grep dns.conf | cut -f 3 -d '/')
+    if [ ! -z "$dns" ]; then
+        dom_include_list=$(mktemp)
+        for domain_include in ${dns//,/ }; do
+            echo "^$domain_include$" >> $dom_include_list
+        done
+        domain_list=$(echo "$domain_list" | egrep -f $dom_include_list )
+        rm -f $dom_include_list
+    fi
+
+    for domain in $domain_list; do
+        echo -e "$(date "+%F %T") $domain"
+        msg="$msg\n$(date "+%F %T") $domain"
+
+        # unpack domain container
+        tar xf $BACKUP/$backup -C $tmpdir ./dns/$domain
+        if [ "$?" -ne 0 ]; then
+            echo "Error: can't unpack $domain dns contaner"
+            echo "Can't unpack $domain dns contaner" |\
+                $send_mail -s "$subj" $email
+            rm -rf $tmpdir
+            exit $E_PARSING
+        fi
+
+        # Restore domain config
+        check_config=$(grep "DOMAIN='$domain'" $USER_DATA/dns.conf)
+        if [ -z "$check_config" ]; then
+
+            # Parse domain config
+            eval $(cat $tmpdir/dns/$domain/vesta/dns.conf)
+
+            # Check if domain new
+            check_new=$(is_domain_new 'dns' $domain)
+            if [ ! -z "$check_new" ]; then
+                echo "Error: dns domain $domain belongs to another user"
+                echo "DNS domain $domain belongs to another user" |\
+                    $send_mail -s "$subj" $email
+                rm -rf $tmpdir
+                log_event "$E_EXISTS" "$EVENT"
+                exit $E_EXISTS
+            fi
+
+            # Check ip address
+            if [ -e "$tmpdir/ip_mapping.$domain" ]; then
+                OLD=$IP
+                IP=$(cat $tmpdir/ip_mapping.$domain)
+                sed -i "s/$OLD/$IP/g" $tmpdir/dns/$domain/vesta/$domain.conf
+            else
+                check_ip=$(is_ip_valid $IP)
+                if [ ! -z "$check_ip" ]; then
+                    if [ -z "$IP" ]; then
+                        IP=$(get_user_ip $user)
+                    fi
+                fi
+            fi
+            if [ -z "$IP" ]; then
+                echo "Error: no avaiable IP address"
+                echo "No available IP address" | $send_mail -s "$subj" $email
+                log_event "$E_NOTEXIST" "$EVENT"
+                exit $E_NOTEXIST
+            fi
+
+            # Check dns template
+            check_tpl=$(is_dns_template_valid)
+            if [ ! -z "$check_tpl" ]; then
+                templates=$(ls -t $VESTA/data/templates/dns/ |\
+                    grep '\.tpl' |\
+                    cut -f 1 -d  '.')
+                if [ ! -z "$(echo $templates |grep default)" ]; then
+                    TPL=$(echo "$templates" |grep default |head -n1)
+                else
+                    TPL=$("$templates" |head -n1)
+                fi
+
+                if [ -z "$TPL" ]; then
+                    echo "Error: no avaiable dns template"
+                    echo "No available dns template" |\
+                        $send_mail -s "$subj" $email
+                    log_event "$E_NOTEXIST" "$EVENT"
+                    exit $E_NOTEXIST
+                fi
+            fi
+
+            str="DOMAIN='$domain' IP='$IP' TPL='$TPL' TTL='$TTL' EXP='$EXP'"
+            str="$str SOA='$SOA' RECORDS='$RECORDS' SUSPENDED='no'"
+            str="$str TIME='$(date +%T)' DATE='$(date +%F)'"
+            echo $str >> $USER_DATA/dns.conf
+        fi
+
+        # Restore dns records
+        cp -f $tmpdir/dns/$domain/vesta/$domain.conf $USER_DATA/dns/
+
+        # Rebuild dns config
+        rebuild_dns_domain_conf
+    done
+    echo
+    msg="$msg\n"
+fi
+
+# MAIL
+if [ "$mail" != 'no' ]; then
+    echo "-- MAIL --"
+    msg="$msg\n-- MAIL --"
+
+    # Create domain list
+    domain_list=$(tar -tf $BACKUP/$backup | grep "^./mail" |\
+        grep mail.conf | cut -f 3 -d '/')
+    if [ ! -z "$mail" ]; then
+        dom_include_list=$(mktemp)
+        for domain_include in ${mail//,/ }; do
+            echo "^$domain_include$" >> $dom_include_list
+        done
+        domain_list=$(echo "$domain_list" | egrep -f $dom_include_list )
+        rm -f $dom_include_list
+    fi
+
+    for domain in $domain_list; do
+        echo -e "$(date "+%F %T") $domain"
+        msg="$msg\n$(date "+%F %T") $domain"
+
+        # unpack domain container
+        tar xf $BACKUP/$backup -C $tmpdir ./mail/$domain
+        if [ "$?" -ne 0 ]; then
+            echo "Error: can't unpack $domain mail contaner"
+            echo "Can't can't unpack $domain mail contaner" |\
+                $send_mail -s "$subj" $email
+            rm -rf $tmpdir
+            exit $E_PARSING
+        fi
+
+        # Restore domain config
+        check_config=$(grep "DOMAIN='$domain'" $USER_DATA/mail.conf)
+        if [ -z "$check_config" ]; then
+
+            # Parse domain config
+            eval $(cat $tmpdir/mail/$domain/vesta/mail.conf)
+
+            # Check if domain new
+            check_new=$(is_domain_new 'mail' $domain)
+            if [ ! -z "$check_new" ]; then
+                echo "Error: mail domain $domain belongs to another user"
+                echo "Mail domain $domain belongs to another user" |\
+                    $send_mail -s "$subj" $email
+                rm -rf $tmpdir
+                log_event "$E_EXISTS" "$EVENT"
+                exit $E_EXISTS
+            fi
+
+            str="DOMAIN='$domain' ANTIVIRUS='$ANTIVIRUS' ANTISPAM='$ANTISPAM'"
+            str="$str DKIM='$DKIM' ACCOUNTS='$ACCOUNTS' U_DISK='$U_DISK'"
+            str="$str CATCHALL='$CATCHALL' SUSPENDED='no'"
+            str="$str TIME='$(date +%T)' DATE='$(date +%F)'"
+            echo $str >> $USER_DATA/mail.conf
+        fi
+
+        # Restore DKIM
+        if [ -e "$tmpdir/mail/$domain/vesta/$domain.pem" ]; then
+            cp -f $tmpdir/mail/$domain/vesta/$domain.pem $USER_DATA/mail/
+            cp -f $tmpdir/mail/$domain/vesta/$domain.pub $USER_DATA/mail/
+        fi
+
+        # Restore email accounts
+        cp -f $tmpdir/mail/$domain/vesta/$domain.conf $USER_DATA/mail/
+
+        # Rebuild mail config
+        rebuild_mail_domain_conf
+
+        # Restore emails
+        if [ -e "$tmpdir/mail/$domain/accounts.tar.gz" ]; then
+            tar -xzpf $tmpdir/mail/$domain/accounts.tar.gz \
+                -C $HOMEDIR/$user/mail/$domain/
+            if [ "$?" -ne 0 ]; then
+                echo "Error: can't unpack $domain mail account tarball"
+                echo "Can't unpack $domain mail account tarball" |\
+                    $send_mail -s "$subj" $email
+                rm -rf $tmpdir
+                exit $E_PARSING
+            fi
+        fi
+    done
+    echo
+    msg="$msg\n"
+fi
+
+# DB
+if [ "$db" != 'no' ]; then
+    echo "-- DB --"
+    msg="$msg\n-- DB --"
+
+    # Create domain list
+    db_list=$(tar -tf $BACKUP/$backup | grep "^./db" |\
+        grep db.conf | cut -f 3 -d '/')
+    if [ ! -z "$db" ]; then
+        db_include_list=$(mktemp)
+        for db_include in ${db//,/ }; do
+            echo "^$db_include$" >> $db_include_list
+        done
+        db_list=$(echo "$db_list" | egrep -f $db_include_list )
+        rm -f $db_include_list
+    fi
+
+    for db in $db_list; do
+        echo -e "$(date "+%F %T") $db"
+        msg="$msg\n$(date "+%F %T") $db"
+
+        # unpack db container
+        tar xf $BACKUP/$backup -C $tmpdir ./db/$db
+        if [ "$?" -ne 0 ]; then
+            echo "Error: can't unpack $db database contaner"
+            echo "Can't unpack $db database contaner" |\
+                $send_mail -s "$subj" $email
+            rm -rf $tmpdir
+            exit $E_PARSING
+        fi
+
+        # Restore domain config
+        check_config=$(grep "DB='$db'" $USER_DATA/db.conf)
+        if [ -z "$check_config" ]; then
+
+            # Parse domain config
+            eval $(cat $tmpdir/db/$db/vesta/db.conf)
+            str="DB='$db' DBUSER='$DBUSER' MD5='$MD5' HOST='$HOST'"
+            str="$str TYPE='$TYPE' CHARSET='$CHARSET' U_DISK='$U_DISK'"
+            str="$str SUSPENDED='no' TIME='$(date +%T)' DATE='$(date +%F)'"
+            echo $str >> $USER_DATA/db.conf
+        fi
+
+        # Unzip database dump
+        gzip -d $tmpdir/db/$db/$db.*.sql.gz
+
+        # Get database values
+        get_database_values
+
+        # Rebuild db
+        case $TYPE in
+            mysql) rebuild_mysql_database;
+                    import_mysql_database $tmpdir/db/$db/$db.$TYPE.sql ;;
+            pgsql) rebuild_pgsql_database;
+                    import_pgsql_database $tmpdir/db/$db/$db.$TYPE.sql ;;
+        esac
+    done
+    echo
+    msg="$msg\n"
+fi
+
+# Cron
+if [ "$cron" != 'no' ]; then
+    echo "-- CRON --"
+    msg="$msg\n-- CRON --"
+
+    echo -e "$(date "+%F %T") $db"
+    msg="$msg\n$(date "+%F %T") $db"
+
+    # unpack db container
+    tar xf $BACKUP/$backup -C $tmpdir ./cron
+    if [ "$?" -ne 0 ]; then
+        echo "Error: can't unpack cron contaner"
+        echo "Can't unpack cron contaner" | $send_mail -s "$subj" $email
+        rm -rf $tmpdir
+        exit $E_PARSING
+    fi
+
+    # Restore cron records
+    cp $tmpdir/cron/cron.conf $USER_DATA/cron.conf
+
+    # Rebuild cron
+    sync_cron_jobs
+
+    echo
+    msg="$msg\n"
+fi
+
+# Remove temporary data
+rm -rf $tmpdir
+
 
 #----------------------------------------------------------#
 #                       Vesta                              #
 #----------------------------------------------------------#
 
+# Update user counters
+$BIN/v-update-user-counters $user
+
 # Logging
 log_event "$OK" "$EVENT"
 

+ 2 - 3
bin/v-update-sys-rrd-mysql

@@ -73,11 +73,10 @@ for host in $hosts; do
         for key in $host_str; do
             eval ${key%%=*}=${key#*=}
         done
-        sql="mysql -h $HOST -u $USER -p$PASSWORD -P$PORT -e"
+        sql="mysql -h $HOST -u $USER -p$PASSWORD -e"
 
         # Checking empty vars
-        if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $PORT ]
-        then
+        if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ]; then
             echo "Error: config is broken"
             log_event "$E_PARSING" "$EVENT"
             exit $E_PARSING

+ 2 - 3
bin/v-update-sys-rrd-pgsql

@@ -75,11 +75,10 @@ for host in $hosts; do
         done
 
         export PGPASSWORD="$PASSWORD"
-        sql="psql -h $HOST -U $USER -p $PORT -c"
+        sql="psql -h $HOST -U $USER -c"
 
         # Checking empty vars
-        if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $TPL ]
-        then
+        if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ]; then
             echo "Error: config is broken"
             log_event "$E_PARSING" "$EVENT"
             exit $E_PARSING

+ 71 - 136
func/db.sh

@@ -19,7 +19,7 @@ get_next_dbhost() {
                 old_weight='100'
                 for db in $host_str; do
                     eval $db
-                    let weight="$U_DB_BASES * 100 / $MAX_DB" &>/dev/null
+                    let weight="$U_DB_BASES * 100 / $MAX_DB" >/dev/null 2>&1
                     if [ "$old_weight" -gt "$weight" ]; then
                         host="$HOST"
                         old_weight="$weight"
@@ -88,14 +88,14 @@ decrease_dbhost_values() {
 add_mysql_database() {
     host_str=$(grep "HOST='$host'" $VESTA/conf/mysql.conf)
     eval $host_str
-    if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $PORT ]; then
+    if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ]; then
         echo "Error: mysql config parsing failed"
         log_event "$E_PARSING" "$EVENT"
         exit $E_PARSING
     fi
 
     query='SELECT VERSION()'
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
     if [ '0' -ne "$?" ]; then
         echo "Error: Connection failed"
         log_event  "$E_DB $EVENT"
@@ -104,18 +104,18 @@ add_mysql_database() {
 
 
     query="CREATE DATABASE \`$database\` CHARACTER SET $charset"
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
 
     query="GRANT ALL ON \`$database\`.* TO \`$dbuser\`@\`%\`
         IDENTIFIED BY '$dbpass'"
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
 
     query="GRANT ALL ON \`$database\`.* TO \`$dbuser\`@localhost
         IDENTIFIED BY '$dbpass'"
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
 
     query="SHOW GRANTS FOR \`$dbuser\`"
-    md5=$(mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query")
+    md5=$(mysql -h $HOST -u $USER -p$PASSWORD -e "$query")
     md5=$(echo "$md5" |grep 'PASSWORD' |tr ' ' '\n' |tail -n1 |cut -f 2 -d \')
 }
 
@@ -131,7 +131,7 @@ add_pgsql_database() {
     fi
 
     query='SELECT VERSION()'
-    psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null
+    psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
     if [ '0' -ne "$?" ];  then
         echo "Error: Connection failed"
         log_event "$E_DB" "$EVENT"
@@ -139,7 +139,7 @@ add_pgsql_database() {
     fi
 
     query="CREATE ROLE $dbuser WITH LOGIN PASSWORD '$dbpass'"
-    psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null
+    psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
 
     query="CREATE DATABASE $database OWNER $dbuser"
     if [ "$TPL" = 'template0' ]; then
@@ -147,16 +147,16 @@ add_pgsql_database() {
     else
         query="$query TEMPLATE $TPL"
     fi
-    psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null
+    psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
 
     query="GRANT ALL PRIVILEGES ON DATABASE $database TO $dbuser"
-    psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null
+    psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
 
     query="GRANT CONNECT ON DATABASE template1 to $dbuser"
-    psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null
+    psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
 
     query="SELECT rolpassword FROM pg_authid WHERE rolname='$dbuser';"
-    md5=$(psql -h $HOST -U $USER -p $PORT -c "$query"|grep md5|cut -f 2 -d \ )
+    md5=$(psql -h $HOST -U $USER -c "$query"|grep md5|cut -f 2 -d \ )
 }
 
 # Check if database host do not exist in config 
@@ -174,7 +174,7 @@ is_dbhost_new() {
 # Check MySQL database host
 is_mysql_host_alive() {
     query='SELECT VERSION()'
-    mysql -h $host -u $dbuser -p$dbpass -P $port -e "$query" &> /dev/null
+    mysql -h $host -u $dbuser -p$dbpass -e "$query" > /dev/null 2>&1
     if [ '0' -ne "$?" ]; then
         echo "Error: Connection to $host failed"
         log_event "$E_DB" "$EVENT"
@@ -185,7 +185,7 @@ is_mysql_host_alive() {
 # Check PostgreSQL database host
 is_pgsql_host_alive() {
     export PGPASSWORD="$dbpass"
-    psql -h $host -U $dbuser -p $port -c "SELECT VERSION()" &> /dev/null
+    psql -h $host -U $dbuser -c "SELECT VERSION()" > /dev/null 2>&1
     if [ '0' -ne "$?" ];  then
         echo "Error: Connection to $host failed"
         log_event "$E_DB" "$EVENT"
@@ -203,14 +203,14 @@ get_database_values() {
 change_mysql_password() {
     host_str=$(grep "HOST='$HOST'" $VESTA/conf/mysql.conf)
     eval $host_str
-    if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $PORT ]; then
+    if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ]; then
         echo "Error: mysql config parsing failed"
         log_event "$E_PARSING" "$EVENT"
         exit $E_PARSING
     fi
 
     query='SELECT VERSION()'
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
     if [ '0' -ne "$?" ]; then
         echo "Error: Connection failed"
         log_event "$E_DB $EVENT"
@@ -219,14 +219,14 @@ change_mysql_password() {
 
     query="GRANT ALL ON \`$database\`.* TO \`$DBUSER\`@\`%\`
         IDENTIFIED BY '$dbpass'"
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
 
     query="GRANT ALL ON \`$database\`.* TO \`$DBUSER\`@localhost
         IDENTIFIED BY '$dbpass'"
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
 
     query="SHOW GRANTS FOR '$DBUSER'"
-    md5=$(mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query")
+    md5=$(mysql -h $HOST -u $USER -p$PASSWORD -e "$query")
     md5=$(echo "$md5" |grep 'PASSWORD' |tr ' ' '\n' |tail -n1 |cut -f 2 -d \')
 }
 
@@ -242,7 +242,7 @@ change_pgsql_password() {
     fi
 
     query='SELECT VERSION()'
-    psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null
+    psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
     if [ '0' -ne "$?" ];  then
         echo "Error: Connection failed"
         log_event "$E_DB" "$EVENT"
@@ -250,24 +250,24 @@ change_pgsql_password() {
     fi
 
     query="ALTER ROLE $DBUSER WITH LOGIN PASSWORD '$dbpass'"
-    psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null
+    psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
 
     query="SELECT rolpassword FROM pg_authid WHERE rolname='$DBUSER';"
-    md5=$(psql -h $HOST -U $USER -p $PORT -c "$query"|grep md5|cut -f 2 -d \ )
+    md5=$(psql -h $HOST -U $USER -c "$query"|grep md5|cut -f 2 -d \ )
 }
 
 # Delete MySQL database
 delete_mysql_database() {
     host_str=$(grep "HOST='$HOST'" $VESTA/conf/mysql.conf)
     eval $host_str
-    if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $PORT ]; then
+    if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ]; then
         echo "Error: mysql config parsing failed"
         log_event "$E_PARSING" "$EVENT"
         exit $E_PARSING
     fi
 
     query='SELECT VERSION()'
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
     if [ '0' -ne "$?" ]; then
         echo "Error: Connection failed"
         log_event  "$E_DB $EVENT"
@@ -275,20 +275,20 @@ delete_mysql_database() {
     fi
 
     query="DROP DATABASE \`$database\`"
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
 
     query="REVOKE ALL ON \`$database\`.* FROM \`$DBUSER\`@\`%\`"
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
 
     query="REVOKE ALL ON \`$database\`.* FROM \`$DBUSER\`@localhost"
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
 
     if [ "$(grep "DBUSER='$DBUSER'" $USER_DATA/db.conf |wc -l)" -lt 2 ]; then
         query="DROP USER '$DBUSER'@'%'"
-        mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
+        mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
 
         query="DROP USER '$DBUSER'@'localhost'"
-        mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
+        mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
     fi
 }
 
@@ -304,7 +304,7 @@ delete_pgsql_database() {
     fi
 
     query='SELECT VERSION()'
-    psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null
+    psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
     if [ '0' -ne "$?" ];  then
         echo "Error: Connection failed"
         log_event "$E_DB" "$EVENT"
@@ -312,16 +312,16 @@ delete_pgsql_database() {
     fi
 
     query="REVOKE ALL PRIVILEGES ON DATABASE $database FROM $DBUSER"
-    psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null
+    psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
 
     query="DROP DATABASE $database"
-    psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null
+    psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
 
     if [ "$(grep "DBUSER='$DBUSER'" $USER_DATA/db.conf |wc -l)" -lt 2 ]; then
         query="REVOKE CONNECT ON DATABASE template1 FROM $db_user"
-        psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null
+        psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
         query="DROP ROLE $db_user"
-        psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null
+        psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
     fi
 }
 
@@ -329,39 +329,41 @@ delete_pgsql_database() {
 dump_mysql_database() {
     host_str=$(grep "HOST='$HOST'" $VESTA/conf/mysql.conf)
     eval $host_str
-    if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $PORT ]; then
+    if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ]; then
         rm -rf $tmpdir
-        echo "Can't parse mysql config" | $mail -s "$subj" $email
+        echo "Can't parse mysql config" | $send_mail -s "$subj" $email
         echo "Error: mysql config parsing failed"
         log_event "$E_PARSING" "$EVENT"
         exit $E_PARSING
     fi
 
     query='SELECT VERSION()'
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
     if [ '0' -ne "$?" ]; then
         rm -rf $tmpdir
-        echo "Can't connect to mysql server $HOST" | $mail -s "$subj" $email
+        echo "Can't connect to mysql server $HOST" |\
+            $send_mail -s "$subj" $email
         echo "Error: Connection failed"
         log_event  "$E_DB $EVENT"
         exit $E_DB
     fi
 
-    mysqldump -h $HOST -u $USER -p$PASSWORD -P$PORT -r $dump $database
+    mysqldump -h $HOST -u $USER -p$PASSWORD -r $dump $database
     if [ '0' -ne "$?" ]; then
         rm -rf $tmpdir
-        echo "Can't dump mysql database $database" | $mail -s "$subj" $email
+        echo "Can't dump mysql database $database" |\
+            $send_mail -s "$subj" $email
         echo "Error: dump $database failed"
         log_event  "$E_DB $EVENT"
         exit $E_DB
     fi
 
     query="SHOW GRANTS FOR '$DBUSER'@'localhost'"
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" |\
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" |\
         grep -v "Grants for" > $grants
 
     query="SHOW GRANTS FOR '$DBUSER'@'%'"
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" |\
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" |\
         grep -v "Grants for" > $grants
 }
 
@@ -372,35 +374,38 @@ dump_pgsql_database() {
     export PGPASSWORD="$PASSWORD"
     if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $TPL ]; then
         rm -rf $tmpdir
-        echo "Can't parse pgsql config" | $mail -s "$subj" $email
+        echo "Can't parse pgsql config" |\
+            $send_mail -s "$subj" $email
         echo "Error: postgresql config parsing failed"
         log_event "$E_PARSING" "$EVENT"
         exit $E_PARSING
     fi
 
     query='SELECT VERSION()'
-    psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null
+    psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
     if [ '0' -ne "$?" ];  then
         rm -rf $tmpdir
-        echo "Can't connect to pgsql server $HOST" | $mail -s "$subj" $email
+        echo "Can't connect to pgsql server $HOST" |\
+            $send_mail -s "$subj" $email
         echo "Error: Connection failed"
         log_event "$E_DB" "$EVENT"
         exit $E_DB
     fi
 
-    pg_dump -h $HOST -U $USER -p $PORT -c -d -O -x -i -f $dump $database \
+    pg_dump -h $HOST -U $USER -c -d -O -x -i -f $dump $database \
         2> /dev/null
 
     if [ '0' -ne "$?" ]; then
         rm -rf $tmpdir
-        echo "Can't dump pgsql database $database" | $mail -s "$subj" $email
+        echo "Can't dump pgsql database $database" |\
+            $send_mail -s "$subj" $email
         echo "Error: dump $database failed"
         log_event  "$E_DB $EVENT"
         exit $E_DB
     fi
 
     query="SELECT rolpassword FROM pg_authid WHERE rolname='$DBUSER';"
-    md5=$(psql -h $HOST -U $USER -p $PORT -c "$query"|head -n1|cut -f 2 -d \ )
+    md5=$(psql -h $HOST -U $USER -c "$query" | head -n1 | cut -f 2 -d \ )
     pw_str="UPDATE pg_authid SET rolpassword='$md5' WHERE rolname='$DBUSER';"
     gr_str="GRANT ALL PRIVILEGES ON DATABASE $database to '$DBUSER'"
     echo -e "$pw_str\n$gr_str" >> $grants
@@ -421,14 +426,14 @@ is_dbhost_free() {
 suspend_mysql_database() {
     host_str=$(grep "HOST='$HOST'" $VESTA/conf/mysql.conf)
     eval $host_str
-    if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $PORT ]; then
+    if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ]; then
         echo "Error: mysql config parsing failed"
         log_event "$E_PARSING" "$EVENT"
         exit $E_PARSING
     fi
 
     query='SELECT VERSION()'
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
     if [ '0' -ne "$?" ]; then
         echo "Error: Connection failed"
         log_event  "$E_DB $EVENT"
@@ -436,10 +441,10 @@ suspend_mysql_database() {
     fi
 
     query="REVOKE ALL ON \`$database\`.* FROM \`$DBUSER\`@\`%\`"
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
 
     query="REVOKE ALL ON \`$database\`.* FROM \`$DBUSER\`@localhost"
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
 }
 
 # Suspend PostgreSQL database
@@ -454,7 +459,7 @@ suspend_pgsql_database() {
     fi
 
     query='SELECT VERSION()'
-    psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null
+    psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
     if [ '0' -ne "$?" ];  then
         echo "Error: Connection failed"
         log_event "$E_DB" "$EVENT"
@@ -462,21 +467,21 @@ suspend_pgsql_database() {
     fi
 
     query="REVOKE ALL PRIVILEGES ON $database FROM $DBUSER"
-    psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null
+    psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
 }
 
 # Unsuspend MySQL database
 unsuspend_mysql_database() {
     host_str=$(grep "HOST='$HOST'" $VESTA/conf/mysql.conf)
     eval $host_str
-    if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $PORT ]; then
+    if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ]; then
         echo "Error: mysql config parsing failed"
         log_event "$E_PARSING" "$EVENT"
         exit $E_PARSING
     fi
 
     query='SELECT VERSION()'
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
     if [ '0' -ne "$?" ]; then
         echo "Error: Connection failed"
         log_event  "$E_DB $EVENT"
@@ -484,10 +489,10 @@ unsuspend_mysql_database() {
     fi
 
     query="GRANT ALL ON \`$database\`.* FROM \`$DBUSER\`@\`%\`"
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
 
     query="GRANT ALL ON \`$database\`.* TO \`$DBUSER\`@localhost"
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
 }
 
 # Unsuspend PostgreSQL database
@@ -502,7 +507,7 @@ unsuspend_pgsql_database() {
     fi
 
     query='SELECT VERSION()'
-    psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null
+    psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
     if [ '0' -ne "$?" ];  then
         echo "Error: Connection failed"
         log_event "$E_DB" "$EVENT"
@@ -510,21 +515,21 @@ unsuspend_pgsql_database() {
     fi
 
     query="GRANT ALL PRIVILEGES ON DATABASE $database TO $DBUSER"
-    psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null
+    psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
 }
 
 # Get MySQL disk usage
 get_mysql_disk_usage() {
     host_str=$(grep "HOST='$HOST'" $VESTA/conf/mysql.conf)
     eval $host_str
-    if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $PORT ]; then
+    if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ]; then
         echo "Error: mysql config parsing failed"
         log_event "$E_PARSING" "$EVENT"
         exit $E_PARSING
     fi
 
     query='SELECT VERSION()'
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
     if [ '0' -ne "$?" ]; then
         echo "Error: Connection failed"
         log_event  "$E_DB $EVENT"
@@ -533,7 +538,7 @@ get_mysql_disk_usage() {
 
     query="SELECT SUM( data_length + index_length ) / 1024 / 1024 \"Size\"
         FROM information_schema.TABLES WHERE table_schema='$database'"
-    usage=$(mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" |tail -n1)
+    usage=$(mysql -h $HOST -u $USER -p$PASSWORD -e "$query" |tail -n1)
     if [ "$usage" == 'NULL' ] || [ "${usage:0:1}" -eq '0' ]; then
         usage=1
     fi
@@ -553,7 +558,7 @@ get_pgsql_disk_usage() {
     fi
 
     query='SELECT VERSION()'
-    psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null
+    psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
     if [ '0' -ne "$?" ];  then
         echo "Error: Connection failed"
         log_event "$E_DB" "$EVENT"
@@ -561,7 +566,7 @@ get_pgsql_disk_usage() {
     fi
 
     query="SELECT pg_database_size('$database');"
-    usage=$(psql -h $HOST -U $USER -p $PORT -c "$query")
+    usage=$(psql -h $HOST -U $USER -c "$query")
     usage=$(echo "$usage" | grep -v "-" | grep -v 'row' | sed -e "/^$/d")
     usage=$(echo "$usage" | grep -v "pg_database_size" | awk '{print $1}')
     if [ -z "$usage" ]; then
@@ -573,73 +578,3 @@ get_pgsql_disk_usage() {
     fi
 }
 
-# Rebuild MySQL database
-rebuild_mysql_database() {
-    host_str=$(grep "HOST='$HOST'" $VESTA/conf/mysql.conf)
-    eval $host_str
-    if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $PORT ]; then
-        echo "Error: mysql config parsing failed"
-        log_event "$E_PARSING" "$EVENT"
-        exit $E_PARSING
-    fi
-
-    query='SELECT VERSION()'
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
-    if [ '0' -ne "$?" ]; then
-        echo "Error: Connection failed"
-        log_event  "$E_DB $EVENT"
-        exit $E_DB
-    fi
-
-    query="CREATE DATABASE \`$database\` CHARACTER SET $CHARSET"
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
-
-    query="GRANT ALL ON \`$database\`.* TO \`$DBUSER\`@\`%\`"
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
-
-    query="GRANT ALL ON \`$database\`.* TO \`$DBUSER\`@localhost"
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
-
-    query="UPDATE mysql.user SET Password='$MD5' WHERE User='$DBUSER';"
-    mysql -h $HOST -u $USER -p$PASSWORD -P $PORT -e "$query" &> /dev/null
-}
-
-# Rebuild PostgreSQL database
-rebuild_pgsql_database() {
-    host_str=$(grep "HOST='$HOST'" $VESTA/conf/pgsql.conf)
-    eval $host_str
-    export PGPASSWORD="$PASSWORD"
-    if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $TPL ]; then
-        echo "Error: postgresql config parsing failed"
-        log_event "$E_PARSING" "$EVENT"
-        exit $E_PARSING
-    fi
-
-    query='SELECT VERSION()'
-    psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null
-    if [ '0' -ne "$?" ];  then
-        echo "Error: Connection failed"
-        log_event "$E_DB" "$EVENT"
-        exit $E_DB
-    fi
-
-    query="CREATE ROLE $DBUSER"
-    psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null
-
-    query="UPDATE pg_authid SET rolpassword='$MD5' WHERE rolname='$DBUSER'"
-    psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null
-
-    query="CREATE DATABASE $database OWNER $DBUSER"
-    if [ "$TPL" = 'template0' ]; then
-        query="$query ENCODING '$CHARSET' TEMPLATE $TPL"
-    else
-        query="$query TEMPLATE $TPL"
-    fi
-    psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null
-
-    query="GRANT ALL PRIVILEGES ON DATABASE $database TO $DBUSER"
-    psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null
-
-    query="GRANT CONNECT ON DATABASE template1 to $dbuser"
-    psql -h $HOST -U $USER -p $PORT -c "$query" &> /dev/null
-}

+ 31 - 8
func/ip.sh

@@ -1,8 +1,9 @@
 # Validationg ip address
 is_ip_valid() {
-    check_nat=$(grep -H "^NAT='$ip'" $VESTA/data/ips/* 2>/dev/null)
-    if [ ! -e "$VESTA/data/ips/$ip" ] && [ -z "$check_nat" ] ; then
-        echo "Error: IP $ip not exist"
+    userip=${1-$ip}
+    check_nat=$(grep -H "^NAT='$userip'" $VESTA/data/ips/* 2>/dev/null)
+    if [ ! -e "$VESTA/data/ips/$userip" ] && [ -z "$check_nat" ] ; then
+        echo "Error: IP $userip not exist"
         log_event "$E_NOTEXIST" "$EVENT"
         exit $E_NOTEXIST
     fi
@@ -10,10 +11,11 @@ is_ip_valid() {
 
 # Check if ip availabile for user
 is_ip_avalable() {
-    if [ -e "$VESTA/data/ips/$ip" ]; then
-        ip_data=$(cat $VESTA/data/ips/$ip)
+    userip=${1-$ip}
+    if [ -e "$VESTA/data/ips/$userip" ]; then
+        ip_data=$(cat $VESTA/data/ips/$userip)
     else
-        nated_ip=$(grep -H "^NAT='$ip'" $VESTA/data/ips/*)
+        nated_ip=$(grep -H "^NAT='$userip'" $VESTA/data/ips/* 2>/dev/null)
         nated_ip=$(echo "$nated_ip" | cut -f 1 -d : | cut -f 7 -d /)
         ip_data=$(cat $VESTA/data/ips/$nated_ip)
     fi
@@ -24,7 +26,7 @@ is_ip_avalable() {
         shared='yes'
     fi
     if [ "$owner" != "$user" ] && [ "$shared" != 'yes' ]; then
-        echo "Error: User $user don't have permission to use $ip"
+        echo "Error: User $user don't have permission to use $userip"
         log_event "$E_FORBIDEN" "$EVENT"
         exit $E_FORBIDEN
     fi
@@ -196,6 +198,7 @@ create_ip_startup() {
     echo -e "$ip_data" > $iconf-$iface
 }
 
+# Get real ip address
 get_real_ip() {
     if [ -e "$VESTA/data/ips/$1" ]; then
         echo $1
@@ -203,4 +206,24 @@ get_real_ip() {
         nated_ip=$(grep -H "^NAT='$1'" $VESTA/data/ips/*)
         echo "$nated_ip" | cut -f 1 -d : | cut -f 7 -d /
     fi
-}
+}
+
+# Get user ip
+get_user_ip(){
+    ip=$(grep -H "OWNER='$1'" $VESTA/data/ips/* 2>/dev/null | head -n1)
+    ip=$(echo "$ip" | cut -f 7 -d / | cut -f 1 -d :)
+
+    if [ -z "$ip" ]; then
+        admin_ips=$(grep -H "OWNER='admin'" $VESTA/data/ips/* 2>/dev/null)
+        admin_ips=$(echo "$admin_ips" | cut -f 7 -d / | cut -f 1 -d :)
+        for admin_ip in $admin_ips; do
+            if [ -z "$ip" ]; then
+                shared=$(grep "STATUS='shared'" $VESTA/data/ips/$admin_ip)
+                if [ ! -z "$shared" ]; then
+                    ip=$admin_ip
+                fi
+            fi
+        done
+    fi
+    echo "$ip"
+}

+ 15 - 15
func/main.sh

@@ -170,8 +170,8 @@ is_backup_scheduled() {
     fi
 }
 
-# Check if object is free and can be created
-is_object_free() {
+# Check if object is new
+is_object_new() {
     if [ $2 = 'USER' ]; then
         if [ -d "$USER_DATA" ]; then
             object="OK"
@@ -588,7 +588,7 @@ validate_format_username() {
 validate_format_domain() {
     exclude="[!|@|#|$|^|&|*|(|)|+|=|{|}|:|,|<|>|?|_|/|\|\"|'|;|%|\`| ]"
     if [[ "$1" =~ $exclude ]] || [[ "$1" =~ "^[0-9]+$" ]]; then
-        echo "Error: domain $1 is not valid"
+        echo "Error: $2 $1 is not valid"
         log_event "$E_INVALID" "$EVENT"
         exit $E_INVALID
     fi
@@ -687,10 +687,10 @@ validate_format_dvalue() {
         validate_format_ip "$1"
     fi
     if [ "$rtype" = 'NS' ]; then
-        validate_format_domain "$1"
+        validate_format_domain "$1" 'ns_record'
     fi
     if [ "$rtype" = 'MX' ]; then
-        validate_format_domain "$1"
+        validate_format_domain "$1" 'mx_record'
         validate_format_int "$priority"
     fi
 
@@ -730,7 +730,7 @@ validate_format(){
             antispam)       validate_format_boolean "$arg" 'antispam' ;;
             antivirus)      validate_format_boolean "$arg" 'antivirus' ;;
             autoreply)      validate_format_autoreply "$arg" ;;
-            backup)         validate_format_date "$arg" ;;
+            backup)         validate_format_domain "$arg" 'backup' ;;
             charset)        validate_format_name "$arg" "$arg_name" ;;
             charsets)       validate_format_common "$arg" 'charsets' ;;
             database)       validate_format_database "$arg" 'database';;
@@ -739,8 +739,8 @@ validate_format(){
             dbuser)         validate_format_database "$arg" 'db_user';;
             dkim)           validate_format_boolean "$arg" 'dkim' ;;
             dkim_size)      validate_format_key_size "$arg" ;;
-            domain)         validate_format_domain "$arg" ;;
-            dom_alias)      validate_format_domain_alias "$arg" ;;
+            domain)         validate_format_domain "$arg" 'domain';;
+            dom_alias)      validate_format_domain_alias "$arg" 'alias';;
             dvalue)         validate_format_dvalue "$arg";;
             email)          validate_format_email "$arg" ;;
             exp)            validate_format_date "$arg" ;;
@@ -749,12 +749,12 @@ validate_format(){
             forward)        validate_format_email "$arg" ;;
             ftp_password)   validate_format_password "$arg" ;;
             ftp_user)       validate_format_username "$arg" "$arg_name" ;;
-            host)           validate_format_domain "$arg" "$arg_name" ;;
+            host)           validate_format_domain "$arg" "$arg_name" 'host';;
             hour)           validate_format_mhdmw "$arg" $arg_name ;;
             id)             validate_format_int "$arg" ;;
             interface)      validate_format_interface "$arg" ;;
             ip)             validate_format_ip "$arg" ;;
-            ip_name)        validate_format_domain "$arg" ;;
+            ip_name)        validate_format_domain "$arg" 'domain';;
             ip_status)      validate_format_ip_status "$arg" ;;
             job)            validate_format_int "$arg" ;;
             key)            validate_format_username "$arg" "$arg_name" ;;
@@ -765,10 +765,10 @@ validate_format(){
             min)            validate_format_mhdmw "$arg" $arg_name ;;
             month)          validate_format_mhdmw "$arg" $arg_name ;;
             nat_ip)         validate_format_ip "$arg" ;;
-            ns1)            validate_format_domain "$arg" ;;
-            ns2)            validate_format_domain "$arg" ;;
-            ns3)            validate_format_domain "$arg" ;;
-            ns4)            validate_format_domain "$arg" ;;
+            ns1)            validate_format_domain "$arg" 'name_server';;
+            ns2)            validate_format_domain "$arg" 'name_server';;
+            ns3)            validate_format_domain "$arg" 'name_server';;
+            ns4)            validate_format_domain "$arg" 'name_server';;
             package)        validate_format_name "$arg" "$arg_name" ;;
             password)       validate_format_password "$arg" ;;
             port)           validate_format_int "$arg" ;;
@@ -777,7 +777,7 @@ validate_format(){
             record)         validate_format_common "$arg" 'record';;
             rtype)          validate_format_dns_type "$arg" ;;
             shell)          validate_format_shell "$arg" ;;
-            soa)            validate_format_domain "$arg" ;;
+            soa)            validate_format_domain "$arg" 'soa_record';;
             stats_pass)     validate_format_password "$arg" ;;
             stats_user)     validate_format_username "$arg" "$arg_name" ;;
             template)       validate_format_name "$arg" "$arg_name" ;;

+ 484 - 0
func/rebuild.sh

@@ -0,0 +1,484 @@
+# WEB domain rebuild
+rebuild_web_domain_conf() {
+
+    # Get domain values
+    domain_idn=$(idn -t --quiet -a "$domain")
+    get_domain_values 'web'
+    ip=$(get_real_ip $IP)
+
+    # Preparing domain values for the template substitution
+    upd_web_domain_values
+
+    # Rebuilding directories
+    mkdir -p $HOMEDIR/$user/web/$domain \
+        $HOMEDIR/$user/web/$domain/public_html \
+        $HOMEDIR/$user/web/$domain/public_shtml \
+        $HOMEDIR/$user/web/$domain/document_errors \
+        $HOMEDIR/$user/web/$domain/cgi-bin \
+        $HOMEDIR/$user/web/$domain/private \
+        $HOMEDIR/$user/web/$domain/stats \
+        $HOMEDIR/$user/web/$domain/logs
+
+    # Create domain logs
+    touch /var/log/httpd/domains/$domain.bytes \
+          /var/log/httpd/domains/$domain.log \
+          /var/log/httpd/domains/$domain.error.log
+
+    # Create symlinks
+    cd $HOMEDIR/$user/web/$domain/logs/
+    ln -f -s /var/log/httpd/domains/$domain.log .
+    ln -f -s /var/log/httpd/domains/$domain.error.log .
+    cd - > /dev/null
+
+    # Propagate html skeleton
+    if [ ! -e "$WEBTPL/skel/document_errors/" ]; then
+        cp -r $WEBTPL/skel/document_errors/ $HOMEDIR/$user/web/$domain/
+    fi
+
+    # Set folder permissions
+    chmod 551 $HOMEDIR/$user/web/$domain
+    chmod 751 $HOMEDIR/$user/web/$domain/private
+    chmod 751 $HOMEDIR/$user/web/$domain/cgi-bin
+    chmod 751 $HOMEDIR/$user/web/$domain/public_html
+    chmod 751 $HOMEDIR/$user/web/$domain/public_shtml
+    chmod 751 $HOMEDIR/$user/web/$domain/document_errors
+    chmod 551 $HOMEDIR/$user/web/$domain/stats
+    chmod 551 $HOMEDIR/$user/web/$domain/logs
+    chmod 640 /var/log/httpd/domains/$domain.*
+
+    # Set ownership
+    chown $user:$user $HOMEDIR/$user/web/$domain
+    chown $user:$user $HOMEDIR/$user/web/$domain/private
+    chown $user:$user $HOMEDIR/$user/web/$domain/cgi-bin
+    chown $user:$user $HOMEDIR/$user/web/$domain/public_html
+    chown $user:$user $HOMEDIR/$user/web/$domain/public_shtml
+    chown -R $user:$user $HOMEDIR/$user/web/$domain/document_errors
+    chown root:$user /var/log/httpd/domains/$domain.*
+
+
+    # Adding tmp_httpd.conf
+    tpl_file="$WEBTPL/apache_$TPL.tpl"
+    conf="$HOMEDIR/$user/conf/web/tmp_httpd.conf"
+    add_web_config
+    chown root:apache $conf
+    chmod 640 $conf
+
+    # Running template trigger
+    if [ -x $WEBTPL/apache_$TPL.sh ]; then
+        $WEBTPL/apache_$TPL.sh $user $domain $ip $HOMEDIR $docroot
+    fi
+
+    # Checking aliases
+    if [ ! -z "$ALIAS" ]; then
+        aliases=$(echo "$ALIAS"|tr ',' '\n'| wc -l)
+        user_aliases=$((user_aliases + aliases))
+    fi
+
+    # Checking stats
+    if [ ! -z "$STATS" ]; then
+        cat $WEBTPL/$STATS.tpl |\
+            sed -e "s/%ip%/$ip/g" \
+                -e "s/%web_port%/$WEB_PORT/g" \
+                -e "s/%web_ssl_port%/$WEB_SSL_PORT/g" \
+                -e "s/%proxy_port%/$PROXY_PORT/g" \
+                -e "s/%proxy_ssl_port%/$PROXY_SSL_PORT/g" \
+                -e "s/%domain_idn%/$domain_idn/g" \
+                -e "s/%domain%/$domain/g" \
+                -e "s/%user%/$user/g" \
+                -e "s/%home%/${HOMEDIR////\/}/g" \
+                -e "s/%alias%/${aliases//,/ }/g" \
+                -e "s/%alias_idn%/${aliases_idn//,/ }/g" \
+                > $HOMEDIR/$user/conf/web/$STATS.$domain.conf
+
+        if [ "$STATS" == 'awstats' ]; then
+            if [ ! -e "/etc/awstats/$STATS.$domain_idn.conf" ]; then
+                ln -s $HOMEDIR/$user/conf/web/$STATS.$domain.conf \
+                    /etc/awstats/$STATS.$domain_idn.conf
+            fi
+        fi
+
+        webstats="$BIN/v-update-web-domain-stat $user $domain"
+        check_webstats=$(grep "$webstats" $VESTA/data/queue/webstats.pipe)
+        if [ -z "$check_webstats" ]; then
+            echo "$webstats" >> $VESTA/data/queue/webstats.pipe
+        fi
+
+        if [ ! -z "$STATS_USER" ]; then
+            stats_dir="$HOMEDIR/$user/web/$domain/stats"
+
+            # Adding htaccess file
+            echo "AuthUserFile $stats_dir/.htpasswd" > $stats_dir/.htaccess
+            echo "AuthName \"Web Statistics\"" >> $stats_dir/.htaccess
+            echo "AuthType Basic" >> $stats_dir/.htaccess
+            echo "Require valid-user" >> $stats_dir/.htaccess
+
+            # Generating htaccess user and password
+            echo "$STATS_USER:$STATS_CRYPT" > $stats_dir/.htpasswd
+        fi
+    fi
+
+    # Checking ssl
+    if [ "$SSL" = 'yes' ]; then
+        # Adding domain to the shttpd.conf
+        conf="$HOMEDIR/$user/conf/web/tmp_shttpd.conf"
+        tpl_file="$WEBTPL/apache_$TPL.stpl"
+        add_web_config
+        chown root:apache $conf
+        chmod 640 $conf
+
+        cp -f $USER_DATA/ssl/$domain.crt \
+            $HOMEDIR/$user/conf/web/ssl.$domain.crt
+        cp -f $USER_DATA/ssl/$domain.key \
+            $HOMEDIR/$user/conf/web/ssl.$domain.key
+        cp -f $USER_DATA/ssl/$domain.pem \
+            $HOMEDIR/$user/conf/web/ssl.$domain.pem
+        if [ -e "$USER_DATA/ssl/$domain.ca" ]; then
+            cp -f $USER_DATA/ssl/$domain.ca \
+                $HOMEDIR/$user/conf/web/ssl.$domain.ca
+        fi
+
+        # Running template trigger
+        if [ -x $WEBTPL/apache_$TPL.sh ]; then
+            $WEBTPL/apache_$TPL.sh $user $domain $ip $HOMEDIR $sdocroot
+        fi
+
+        user_ssl=$((user_ssl + 1))
+        ssl_change='yes'
+    fi
+
+    # Checking nginx
+    if [ ! -z "$NGINX" ]; then
+        tpl_file="$WEBTPL/nginx_$NGINX.tpl"
+        conf="$HOMEDIR/$user/conf/web/tmp_nginx.conf"
+        add_web_config
+        chown root:nginx $conf
+        chmod 640 $conf
+
+        if [ "$SSL" = 'yes' ]; then
+            tpl_file="$WEBTPL/nginx_$NGINX.stpl"
+            conf="$HOMEDIR/$user/conf/web/tmp_snginx.conf"
+            add_web_config
+            chown root:nginx $conf
+            chmod 640 $conf
+        fi
+        ngix_change='yes'
+    fi
+    if [ "$SUSPENDED" = 'yes' ]; then
+        suspended_web=$((suspended_web + 1))
+    fi
+    user_domains=$((user_domains + 1))
+
+    # Checking ftp
+    if [ ! -z "$FTP_USER" ]; then
+        if [ -z "$(grep ^$FTP_USER: /etc/passwd)" ]; then
+            /usr/sbin/adduser -o -u $(id -u $user) -g $user -s /sbin/nologin \
+                -M -d "$HOMEDIR/$user/web/$domain" $FTP_USER > /dev/null 2>&1
+
+            shadow='/etc/shadow'
+            shdw=$(grep "^$FTP_USER:" $shadow)
+            shdw3=$(echo "$shdw" | cut -f3 -d :)
+            shdw4=$(echo "$shdw" | cut -f4 -d :)
+            shdw5=$(echo "$shdw" | cut -f5 -d :)
+            shdw6=$(echo "$shdw" | cut -f6 -d :)
+            shdw7=$(echo "$shdw" | cut -f7 -d :)
+            shdw8=$(echo "$shdw" | cut -f8 -d :)
+            shdw9=$(echo "$shdw" | cut -f9 -d :)
+            chmod u+w $shadow
+            sed -i "/^$FTP_USER:*/d" $shadow
+            shdw_str="$FTP_USER:$FTP_MD5:$shdw3:$shdw4:$shdw5:$shdw6"
+            shdw_str="$shdw_str:$shdw7:$shdw8:$shdw9"
+            echo "$shdw_str" >> $shadow
+            chmod u-w $shadow
+        fi
+    fi
+}
+
+# DNS domain rebuild
+rebuild_dns_domain_conf() {
+
+    # Get domain values
+    get_domain_values 'dns'
+    domain_idn=$(idn -t --quiet -a "$domain")
+
+    # Checking zone file
+    if [ ! -e "$USER_DATA/dns/$domain.conf" ]; then
+        cat $DNSTPL/$TPL.tpl |\
+            sed -e "s/%ip%/$IP/g" \
+                -e "s/%domain_idn%/$domain_idn/g" \
+                -e "s/%domain%/$domain/g" \
+                -e "s/%ns1%/$ns1/g" \
+                -e "s/%ns2%/$ns2/g" \
+                -e "s/%ns3%/$ns3/g" \
+                -e "s/%ns4%/$ns4/g" \
+                -e "s/%time%/$TIME/g" \
+                -e "s/%date%/$DATE/g" > $USER_DATA/dns/$domain.conf
+    fi
+
+    # Sorting records
+    sort_dns_records
+
+    # Updating zone
+    update_domain_zone
+
+    # Set file permissions
+    chmod 640 $HOMEDIR/$user/conf/dns/$domain.db
+    chown root:named $HOMEDIR/$user/conf/dns/$domain.db
+
+    # Bind config check
+    nconf='/etc/named.conf'
+    if [ "$SUSPENDED" = 'yes' ]; then
+        rm_string=$(grep -n /etc/namedb/$domain.db $nconf | cut -d : -f 1)
+        if [ ! -z "$rm_string" ]; then
+            sed -i "$rm_string d" $nconf
+        fi
+        suspended_dns=$((suspended_dns + 1))
+    else
+        if [ -z "$(grep /$domain.db $nconf)" ]; then
+            named="zone \"$domain_idn\" {type master; file"
+            named="$named \"$HOMEDIR/$user/conf/dns/$domain.db\";};"
+            echo "$named" >> /etc/named.conf
+        fi
+    fi
+    user_domains=$((user_domains + 1))
+    records=$(wc -l $USER_DATA/dns/$domain.conf | cut -f 1 -d ' ')
+    user_records=$((user_records + records))
+    update_object_value 'dns' 'DOMAIN' "$domain" '$RECORDS' "$records"
+}
+
+# MAIL domain rebuild
+rebuild_mail_domain_conf() {
+
+    # Get domain values
+    get_domain_values 'mail'
+
+    # Rebuilding config structure
+    rm -f /etc/exim/domains/$domain
+    mkdir -p $HOMEDIR/$user/conf/mail/$domain
+    ln -s $HOMEDIR/$user/conf/mail/$domain /etc/exim/domains/
+    rm -f $HOMEDIR/$user/conf/mail/$domain/aliases
+    rm -f $HOMEDIR/$user/conf/mail/$domain/protection
+    rm -f $HOMEDIR/$user/conf/mail/$domain/passwd
+    touch $HOMEDIR/$user/conf/mail/$domain/aliases
+    touch $HOMEDIR/$user/conf/mail/$domain/protection
+    touch $HOMEDIR/$user/conf/mail/$domain/passwd
+    chown -R dovecot:mail $HOMEDIR/$user/conf/mail/$domain
+    chown -R dovecot:mail /etc/exim/domains/$domain
+    chmod 770 $HOMEDIR/$user/conf/mail/$domain
+    chmod 660 $HOMEDIR/$user/conf/mail/$domain/*
+    chmod 770 /etc/exim/domains/$domain
+
+    # Adding antispam protection
+    if [ "$ANTISPAM" = 'yes' ]; then
+        echo 'antispam' >> $HOMEDIR/$user/conf/mail/$domain/protection
+    fi
+
+    # Adding antivirus protection
+    if [ "$ANTIVIRUS" = 'yes' ]; then
+        echo 'antivirus' >> $HOMEDIR/$user/conf/mail/$domain/protection
+    fi
+
+    # Adding dkim
+    if [ "$DKIM" = 'yes' ]; then
+        U_MAIL_DKMI=$((U_MAIL_DKMI + 1))
+        pem="$USER_DATA/mail/$domain.pem"
+        pub="$USER_DATA/mail/$domain.pub"
+        openssl genrsa -out $pem 512 &>/dev/null
+        openssl rsa -pubout -in $pem -out $pub &>/dev/null
+        chmod 660 $USER_DATA/mail/$domain.*
+
+        cp $pem $HOMEDIR/$user/conf/mail/$domain/dkim.pem
+        chown root:mail $HOMEDIR/$user/conf/mail/$domain/dkim.pem
+        chmod 660 $HOMEDIR/$user/conf/mail/$domain/dkim.pem
+
+        # Deleting old dkim records
+        records=$($BIN/v-list-dns-domain-records $user $domain plain)
+        dkim_records=$(echo "$records" |grep -w '_domainkey'|cut -f 1 -d ' ')
+        for id in $dkim_records; do
+            $BIN/v-delete-dns-domain-record $user $domain $id
+        done
+
+        # Adding dkim dns records
+        check_dns_domain=$(is_object_valid 'dns' 'DOMAIN' "$domain")
+        if [ "$?" -eq 0 ]; then
+            p=$(cat $pub|grep -v ' KEY---'|tr -d '\n')
+            record='_domainkey'
+            policy="\"t=y; o=~;\""
+            $BIN/v-add-dns-domain-record $user $domain $record TXT "$policy"
+
+            record='mail._domainkey'
+            slct="\"k=rsa\; p=$p\""
+            $BIN/v-add-dns-domain-record $user $domain $record TXT "$slct"
+        fi
+    fi
+
+    # Removing symbolic link
+    if [ "$SUSPENDED" = 'yes' ]; then
+        SUSPENDED_MAIL=$((SUSPENDED_MAIL +1))
+        rm -f /etc/exim/domains/$domain
+    fi
+
+    if [ ! -e $HOMEDIR/$user/mail/$domain ]; then
+        mkdir $HOMEDIR/$user/mail/$domain
+    fi
+    chown $user:mail $HOMEDIR/$user/mail/$domain
+    chmod 770 $HOMEDIR/$user/mail/$domain
+
+    dom_aliases=$HOMEDIR/$user/conf/mail/$domain/aliases
+    if [ ! -z "$CATCHALL" ]; then
+        echo "*@$domain:$CATCHALL" >> $dom_aliases
+    fi
+
+    # Rebuild domain accounts
+    accs=0
+    dom_diks=0
+    if [ -e "$USER_DATA/mail/$domain.conf" ]; then
+        accounts=$(search_objects "mail/$domain" 'SUSPENDED' "no" 'ACCOUNT')
+    else
+        accounts=''
+    fi
+
+    for account in $accounts; do
+        (( ++accs))
+        dom_diks=$((dom_diks + U_DISK))
+        object=$(grep "ACCOUNT='$account'" $USER_DATA/mail/$domain.conf)
+        eval "$object"
+        if [ "$SUSPENDED" = 'yes' ]; then
+            MD5='SUSPENDED'
+        fi
+
+        str="$account:$MD5:$user:mail::$HOMEDIR/$user:$QUOTA"
+        echo $str >> $HOMEDIR/$user/conf/mail/$domain/passwd
+
+        for malias in ${ALIAS//,/ }; do
+            echo "$malias@$domain:$account@$domain" >> $dom_aliases
+        done
+        if [ ! -z "$FWD" ]; then
+            echo "$account@$domain:$FWD" >> $dom_aliases
+        fi
+
+    done
+    update_object_value 'mail' 'DOMAIN' "$domain" '$ACCOUNTS' "$accs"
+    update_object_value 'mail' 'DOMAIN' "$domain" '$U_DISK' "$dom_diks"
+    U_MAIL_ACCOUNTS=$((U_MAIL_ACCOUNTS + accs))
+    U_DISK_MAIL=$((U_DISK_MAIL + dom_diks))
+    U_MAIL_DOMAINS=$((U_MAIL_DOMAINS + 1))
+}
+
+
+# Rebuild MySQL
+rebuild_mysql_database() {
+
+    host_str=$(grep "HOST='$HOST'" $VESTA/conf/mysql.conf)
+    eval $host_str
+    if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ]; then
+        echo "Error: mysql config parsing failed"
+        if [ ! -z "$send_mail" ]; then
+            echo "Can't parse MySQL DB config" | $send_mail -s "$subj" $email
+        fi
+        log_event "$E_PARSING" "$EVENT"
+        exit $E_PARSING
+    fi
+
+    query='SELECT VERSION()'
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
+    if [ '0' -ne "$?" ]; then
+        echo "Error: Database connection to $HOST failed"
+        if [ ! -z "$send_mail" ]; then
+            echo "Database connection to MySQL host $HOST failed" |\
+                $send_mail -s "$subj" $email
+        fi
+        log_event  "$E_DB $EVENT"
+        exit $E_DB
+    fi
+
+    query="CREATE DATABASE \`$DB\` CHARACTER SET $CHARSET"
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
+
+    query="GRANT ALL ON \`$DB\`.* TO \`$DBUSER\`@\`%\`"
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
+
+    query="GRANT ALL ON \`$DB\`.* TO \`$DBUSER\`@localhost"
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
+
+    query="UPDATE mysql.user SET Password='$MD5' WHERE User='$DBUSER';"
+    mysql -h $HOST -u $USER -p$PASSWORD -e "$query" > /dev/null 2>&1
+}
+
+# Rebuild PostgreSQL
+rebuild_pgsql_database() {
+
+    host_str=$(grep "HOST='$HOST'" $VESTA/conf/pgsql.conf)
+    eval $host_str
+    export PGPASSWORD="$PASSWORD"
+    if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $TPL ]; then
+        echo "Error: postgresql config parsing failed"
+        if [ ! -z "$send_mail" ]; then
+            echo "Can't parse PostgreSQL config" | $send_mail -s "$subj" $email
+        fi
+        log_event "$E_PARSING" "$EVENT"
+        exit $E_PARSING
+    fi
+
+    query='SELECT VERSION()'
+    psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
+    if [ '0' -ne "$?" ];  then
+        echo "Error: Connection failed"
+        if [ ! -z "$send_mail" ]; then
+            echo "Database connection to PostgreSQL host $HOST failed" |\
+                $send_mail -s "$subj" $email
+        fi
+        log_event "$E_DB" "$EVENT"
+        exit $E_DB
+    fi
+
+    query="CREATE ROLE $DBUSER"
+    psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
+
+    query="UPDATE pg_authid SET rolpassword='$MD5' WHERE rolname='$DBUSER'"
+    psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
+
+    query="CREATE DATABASE $DB OWNER $DBUSER"
+    if [ "$TPL" = 'template0' ]; then
+        query="$query ENCODING '$CHARSET' TEMPLATE $TPL"
+    else
+        query="$query TEMPLATE $TPL"
+    fi
+    psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
+
+    query="GRANT ALL PRIVILEGES ON DATABASE $DB TO $DBUSER"
+    psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
+
+    query="GRANT CONNECT ON DATABASE template1 to $dbuser"
+    psql -h $HOST -U $USER -c "$query" > /dev/null 2>&1
+}
+
+
+# Import MySQL dump
+import_mysql_database() {
+
+    host_str=$(grep "HOST='$HOST'" $VESTA/conf/mysql.conf)
+    eval $host_str
+    if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ]; then
+        echo "Error: mysql config parsing failed"
+        log_event "$E_PARSING" "$EVENT"
+        exit $E_PARSING
+    fi
+
+    mysql -h $HOST -u $USER -p$PASSWORD $DB < $1 > /dev/null 2>&1
+}
+
+
+# Import PostgreSQL dump
+import_pgsql_database() {
+
+    host_str=$(grep "HOST='$HOST'" $VESTA/conf/pgsql.conf)
+    eval $host_str
+    export PGPASSWORD="$PASSWORD"
+    if [ -z $HOST ] || [ -z $USER ] || [ -z $PASSWORD ] || [ -z $TPL ]; then
+        echo "Error: postgresql config parsing failed"
+        log_event "$E_PARSING" "$EVENT"
+        exit $E_PARSING
+    fi
+
+    psql -h $HOST -U $USER $DB < $1 > /dev/null 2>&1
+}

+ 2 - 0
web/inc/i18n/en.php

@@ -34,6 +34,7 @@ $LANG['en'] = array(
     'Add Database'  => 'Add Database',
     'Add Cron Job'  => 'Add Cron Job',
     'Create Backup'  => 'Create Backup',
+    'Restore All'  => 'Restore All',
     'Add Package'  => 'Add Package',
     'Add IP'  => 'Add IP',
     'Search'  => 'Search',
@@ -72,6 +73,7 @@ $LANG['en'] = array(
     'open %s'  => 'open %s',
     'download'  => 'download',
     'restore'  => 'restore',
+    'configure restore settings'  => 'configure restore settings',
     'stop'  => 'stop',
     'start'  => 'start',
     'restart'  => 'restart',

+ 2 - 0
web/inc/i18n/es.php

@@ -33,6 +33,7 @@ $LANG['es'] = array(
     'Add Database'  => 'Añadir BD',
     'Add Cron Job'  => 'Añadir Trabajo',
     'Create Backup'  => 'Crear Respaldo',
+    'Restore All'  => 'Restaurar Todos',
     'Add Package'  => 'Añadir Plan',
     'Add IP'  => 'Añadir IP',
     'Search'  => 'Buscar',
@@ -71,6 +72,7 @@ $LANG['es'] = array(
     'open %s'  => 'abrir %s',
     'download'  => 'descargar',
     'restore'  => 'restaurar',
+    'configure restore settings'  => 'configurar las opciones de restauración',
     'stop'  => 'detener',
     'start'  => 'iniciar',
     'restart'  => 'reiniciar',

+ 1 - 0
web/inc/i18n/ua.php

@@ -35,6 +35,7 @@ $LANG['ua'] = array(
     'Add Database' => 'Додати БД',
     'Add Cron Job' => 'Додати задание',
     'Create Backup' => 'Створити архів',
+    'Restore All'  => 'Відновити все',
     'Add Package' => 'Додати пакет',
     'Add IP' => 'Додати IP',
     'Search' => 'Пошук',

+ 13 - 5
web/list/backup/index.php

@@ -12,11 +12,19 @@ include($_SERVER['DOCUMENT_ROOT'].'/templates/header.html');
 top_panel($user,$TAB);
 
 // Data
-exec (VESTA_CMD."v-list-user-backups $user json", $output, $return_var);
-$data = json_decode(implode('', $output), true);
-$data = array_reverse($data,true);
-unset($output);
-include($_SERVER['DOCUMENT_ROOT'].'/templates/admin/list_backup.html');
+if (empty($_GET['backup'])){
+    exec (VESTA_CMD."v-list-user-backups $user json", $output, $return_var);
+    $data = json_decode(implode('', $output), true);
+    $data = array_reverse($data,true);
+    unset($output);
+    include($_SERVER['DOCUMENT_ROOT'].'/templates/admin/list_backup.html');
+} else {
+    exec (VESTA_CMD."v-list-user-backup $user '".$_GET['backup']."' json", $output, $return_var);
+    $data = json_decode(implode('', $output), true);
+    $data = array_reverse($data,true);
+    unset($output);
+    include($_SERVER['DOCUMENT_ROOT'].'/templates/admin/list_backup_detail.html');
+}
 
 // Back uri
 $_SESSION['back'] = $_SERVER['REQUEST_URI'];

+ 3 - 3
web/templates/admin/list_backup.html

@@ -87,10 +87,10 @@
                                             </div>
                                         </span>
                                     </a>
-                                    <a href="#" id="restore_link_<?php echo "$i"?>" class="data-controls">
+                                    <a href="/list/backup/?backup=<?php echo $key ?>" class="data-controls">
                                         <span>
-                                            <img src="/images/restore.png" width="6px" height="8px">
-                                            <?php print _('restore');?> 
+                                            <img src="/images/more.png" width="8px" height="8px">
+                                            <?php print _('configure restore settings') ?>
                                         </span>
                                     </a>
                                     <a href="/download/backup/?backup=<?php echo $key ?>" target="_blank" class="data-controls">

+ 282 - 0
web/templates/admin/list_backup_detail.html

@@ -0,0 +1,282 @@
+                               <table class="submenu">
+                                    <tr>
+                                        <td style="padding: 2px 0 0 6px">
+                                            <div class="submenu-button-block">
+                                                <button class="submenu-button" onclick="location.href='/add/backup/'"> <?php print _('Restore All');?> </button>
+                                            </div>
+                                            <div class="submenu-search-block">
+                                                <form action="/search/" method="get">
+                                                    <input type="text" name="q" class="submenu-search-field">
+                                                    <input type="submit" value="<?php print _('Search');?>" class="submenu-button" style="width: 96px;">
+                                                </form>
+                                            </div>
+                                            <div class="submenu-select-block">
+                                                <form action="/bulk/backup/" method="post" id="objects">
+                                                <a class="submenu-select-link" href='javascript:checkedAll("objects");'> <?php print _('toggle all');?> </a>
+                                                <select class="submenu-select-dropdown" name="action">
+                                                    <option><?php print _('apply to selected');?></option>
+                                                    <option><?php print _('delete');?></option>
+                                                </select>
+                                                <input type="submit" name="ok" value="›" class="submenu-button" style="width: 36px;">
+                                            </div>
+                                            <?php
+                                                if (!empty($_SESSION['backup_msg'])) {
+                                            ?>
+                                            <div>
+                                                <script type="text/javascript">
+                                                    $(function() {
+                                                        $( "#dialog:ui-dialog" ).dialog( "destroy" );
+                                                        $( "#dialog-message" ).dialog({
+                                                            modal: true,
+                                                            buttons: {
+                                                                Ok: function() {
+                                                                    $( this ).dialog( "close" );
+                                                                }
+                                                            }
+                                                        });
+                                                    });
+                                                </script>
+                                                <div id="dialog-message" title="<?php print _('Backup System') ?>">
+                                                    <p><?php echo $_SESSION['backup_msg'] ?></p>
+                                                </div>
+                                            </div>
+                                            <?php
+                                                    unset($_SESSION['backup_msg']);
+                                                }
+                                            ?>
+                                        </td>
+                                    </tr>
+                                </table>
+                            </td>
+                        </tr>
+                    </table>
+
+                    <div id="vstobjects">
+                        <div style="height:10px; font-size:0;"></div>
+                        <table class="data" style="background: #ebe9dc;">
+                            <tr>
+                                <td style="padding: 8px 2px 8px 0;">
+                                    <a class="name" style="color: #555; font-size: 10pt;"><b><?php print _('Listing');?>  <?php echo $_GET['backup'] ?> </b></a>
+                                </td>
+                            </tr>
+                        </table>
+                        <div style="height:10px; font-size:0;"></div>
+                        <table class="data">
+
+                            <?php
+                                $backup = $_GET['backup'];
+                                if (!empty($data[$backup]['VESTA'])) {
+                            ?> 
+
+                            <tr class="data-row">
+                                <td class="data-dotted" style="padding: 0px 10px 0px 0px" width="150">
+                                    <table class="data-col1">
+                                        <tr><td style="padding: 18 0 4 18;"><input type="checkbox" name="backup[]" value="<?php echo $key ?>" ></td></tr>
+                                    </table>
+                                </td>
+                                <td class="data-dotted" width="830px" style="vertical-align:top;">
+                                    <a href="#" id="restore_link_<?php echo "$i"?>" class="data-controls">
+                                        <span>
+                                            <img src="/images/restore.png" width="6px" height="8px">
+                                            <?php print _('restore');?> 
+                                        </span>
+                                    </a>
+                                    <table class="data-col2" width="830px">
+                                        <tr>
+                                            <td class="cron" style="width: 170px; font-size: 14px;">
+                                                <?php echo _('sys') ?>
+                                            </td>
+                                            <td class="domain" style="padding: 0 0 0 4px;">
+                                                <b><?php echo _('user data') ?></b>
+                                            </td>
+                                        </tr>
+                                    </table>
+                                </td>
+                            </tr>
+
+                            <?php
+                                }
+                            ?> 
+
+
+                            <?php
+                                $web = explode(',',$data[$backup]['WEB']);
+                                foreach ($web as $key) {
+                            ?> 
+
+                            <tr class="data-row">
+                                <td class="data-dotted" style="padding: 0px 10px 0px 0px" width="150">
+                                    <table class="data-col1">
+                                        <tr><td style="padding: 18 0 4 18;"><input type="checkbox" name="backup[]" value="<?php echo $key ?>" ></td></tr>
+                                    </table>
+                                </td>
+                                <td class="data-dotted" width="830px" style="vertical-align:top;">
+                                    <a href="#" id="restore_link_<?php echo "$i"?>" class="data-controls">
+                                        <span>
+                                            <img src="/images/restore.png" width="6px" height="8px">
+                                            <?php print _('restore');?> 
+                                        </span>
+                                    </a>
+                                    <table class="data-col2" width="830px">
+                                        <tr>
+                                            <td class="cron" style="width: 170px; font-size: 14px;">
+                                                <?php echo 'web ' . _('domain') ?>
+                                            </td>
+                                            <td class="domain" style="padding: 0 0 0 4px;">
+                                                <b><?php echo $key ?></b>
+                                            </td>
+                                        </tr>
+                                    </table>
+                                </td>
+                            </tr>
+
+                            <?php
+                                }
+                            ?> 
+
+                            <?php
+                                $dns = explode(',',$data[$backup]['DNS']);
+                                foreach ($dns as $key) {
+                            ?> 
+
+                            <tr class="data-row">
+                                <td class="data-dotted" style="padding: 0px 10px 0px 0px" width="150">
+                                    <table class="data-col1">
+                                        <tr><td style="padding: 18 0 4 18;"><input type="checkbox" name="backup[]" value="<?php echo $key ?>" ></td></tr>
+                                    </table>
+                                </td>
+                                <td class="data-dotted" width="830px" style="vertical-align:top;">
+                                    <a href="#" id="restore_link_<?php echo "$i"?>" class="data-controls">
+                                        <span>
+                                            <img src="/images/restore.png" width="6px" height="8px">
+                                            <?php print _('restore');?> 
+                                        </span>
+                                    </a>
+                                    <table class="data-col2" width="830px">
+                                        <tr>
+                                            <td class="cron" style="width: 170px; font-size: 14px;">
+                                                <?php echo 'dns ' . _('domain') ?>
+                                            </td>
+                                            <td class="domain" style="padding: 0 0 0 4px;">
+                                                <b><?php echo $key ?></b>
+                                            </td>
+                                        </tr>
+                                    </table>
+                                </td>
+                            </tr>
+
+                            <?php
+                                }
+                            ?> 
+
+                            <?php
+                                $mail = explode(',',$data[$backup]['MAIL']);
+                                foreach ($mail as $key) {
+                            ?> 
+
+                            <tr class="data-row">
+                                <td class="data-dotted" style="padding: 0px 10px 0px 0px" width="150">
+                                    <table class="data-col1">
+                                        <tr><td style="padding: 18 0 4 18;"><input type="checkbox" name="backup[]" value="<?php echo $key ?>" ></td></tr>
+                                    </table>
+                                </td>
+                                <td class="data-dotted" width="830px" style="vertical-align:top;">
+                                    <a href="#" id="restore_link_<?php echo "$i"?>" class="data-controls">
+                                        <span>
+                                            <img src="/images/restore.png" width="6px" height="8px">
+                                            <?php print _('restore');?> 
+                                        </span>
+                                    </a>
+                                    <table class="data-col2" width="830px">
+                                        <tr>
+                                            <td class="cron" style="width: 170px; font-size: 14px;">
+                                                <?php echo 'mail ' . _('domain') ?>
+                                            </td>
+                                            <td class="domain" style="padding: 0 0 0 4px;">
+                                                <b><?php echo $key ?></b>
+                                            </td>
+                                        </tr>
+                                    </table>
+                                </td>
+                            </tr>
+
+                            <?php
+                                }
+                            ?> 
+
+                            <?php
+                                $db = explode(',',$data[$backup]['DB']);
+                                foreach ($db as $key) {
+                            ?> 
+
+                            <tr class="data-row">
+                                <td class="data-dotted" style="padding: 0px 10px 0px 0px" width="150">
+                                    <table class="data-col1">
+                                        <tr><td style="padding: 18 0 4 18;"><input type="checkbox" name="backup[]" value="<?php echo $key ?>" ></td></tr>
+                                    </table>
+                                </td>
+                                <td class="data-dotted" width="830px" style="vertical-align:top;">
+                                    <a href="#" id="restore_link_<?php echo "$i"?>" class="data-controls">
+                                        <span>
+                                            <img src="/images/restore.png" width="6px" height="8px">
+                                            <?php print _('restore');?> 
+                                        </span>
+                                    </a>
+                                    <table class="data-col2" width="830px">
+                                        <tr>
+                                            <td class="cron" style="width: 170px; font-size: 14px;">
+                                                <?php echo _('database') ?>
+                                            </td>
+                                            <td class="domain" style="padding: 0 0 0 4px;">
+                                                <b><?php echo $key ?></b>
+                                            </td>
+                                        </tr>
+                                    </table>
+                                </td>
+                            </tr>
+
+                            <?php
+                                }
+                            ?> 
+
+                            <?php
+                                $backup = $_GET['backup'];
+                                if (!empty($data[$backup]['CRON'])) {
+                            ?> 
+
+                            <tr class="data-row">
+                                <td class="data-dotted" style="padding: 0px 10px 0px 0px" width="150">
+                                    <table class="data-col1">
+                                        <tr><td style="padding: 18 0 4 18;"><input type="checkbox" name="backup[]" value="<?php echo $key ?>" ></td></tr>
+                                    </table>
+                                </td>
+                                <td class="data-dotted" width="830px" style="vertical-align:top;">
+                                    <a href="#" id="restore_link_<?php echo "$i"?>" class="data-controls">
+                                        <span>
+                                            <img src="/images/restore.png" width="6px" height="8px">
+                                            <?php print _('restore');?> 
+                                        </span>
+                                    </a>
+                                    <table class="data-col2" width="830px">
+                                        <tr>
+                                            <td class="cron" style="width: 170px; font-size: 14px;">
+                                                <?php echo _('cron') ?>
+                                            </td>
+                                            <td class="domain" style="padding: 0 0 0 4px;">
+                                                <b><?php echo 'cron ' . _('records') ?></b>
+                                            </td>
+                                        </tr>
+                                    </table>
+                                </td>
+                            </tr>
+
+                            <?php
+                                }
+                            ?> 
+
+
+                        </table>
+                        </form>
+
+                    </div>
+

+ 1 - 12
web/templates/admin/list_dns_rec.html

@@ -53,8 +53,7 @@
                                     <td class="data-dotted" style="padding: 0px 10px 0px 0px" width="150">
                                         <table class="data-col1">
                                             <tr><td style="padding: 18 0 4 18;"><input type="checkbox" name="record[]" value="<?php echo $data[$key]['ID']?>" > <input type="hidden" name="domain" value="<?php echo $_GET['domain'] ?>" ></td></tr>
-                                            <tr><td><a class="data-date" title="<?php echo  $data[$key]['DATE']."  ".$data[$key]['TIME'] ?>"><?php echo  strftime("%d %b %Y", strtotime($data[$key]['DATE'])) ?></td></tr>
-                                            <tr><td class="data-<?php echo $status ?>"><b><?php echo _($status); ?></b></td></tr>
+                                            <tr><td></td></tr>
                                         </table>
                                     </td>
                                     <td class="data-dotted" width="830px" style="vertical-align:top;">
@@ -68,16 +67,6 @@
                                                 </div>
                                             </span>
                                         </a>
-                                        <a id="<?php echo $spnd_action ?>_link_<?php echo $i ?>" class="data-controls do_<?php echo $spnd_action ?>">
-                                            <span class="do_<?php echo $spnd_action ?>">
-                                                <img src="/images/suspend.png" width="7px" height="8px">
-                                                <?php echo _($spnd_action); ?> 
-                                                <input type="hidden" name="<?php echo $spnd_action ?>_url" value="/<?php echo $spnd_action ?>/dns/?domain=<?php echo $_GET['domain'] ?>&record_id=<?php echo $data[$key]['ID'] ?>" />
-                                                <div id="<?php echo $spnd_action ?>_dialog_<?php echo $i ?>" class="confirmation-text-suspention hidden" title="<?php print _('Confirmation');?>">
-                                                    <p class="counter-value"><?php print _('RECORD_ACTION_CONFIRMATION',_($spnd_action),$data[$key]['RECORD']);?></p>
-                                                </div>
-                                            </span>
-                                        </a>
                                         <a href="/edit/dns/?domain=<?php echo $_GET['domain'] ?>&record_id=<?php echo $data[$key]['ID'] ?>" class="data-controls">
                                             <span>
                                                 <img src="/images/edit.png" width="8px" height="8px">

+ 5 - 5
web/templates/header.html

@@ -96,7 +96,7 @@
                 height:110px;
                 width:161px;
                 margin: 0;
-                border-bottom: 1px solid #d3d3d3;
+                border-bottom: 1px solid #e3e3e3;
             }
 
             .nav-lnk {
@@ -115,7 +115,7 @@
                 width: 118px;
                 float:left;
                 cursor: pointer;
-                border-bottom: 1px solid #d3d3d3;
+                border-bottom: 1px solid #e3e3e3;
 
             }
 
@@ -342,7 +342,7 @@
                 margin: 0;
                 width: 990px;
                 height: 10px;
-                border-top:1px dotted #d3d3d3;
+                border-top:1px dotted #e3e3e3;
             }
 
             .data-spacer {
@@ -361,7 +361,7 @@
             .data-dotted {
                 text-align: left;
                 vertical-align:top;
-                border-top:1px dotted #d3d3d3;
+                border-top:1px dotted #e3e3e3;
                 padding: 0 0 26px 0;
                 margin: 0;
             }
@@ -425,7 +425,7 @@
             .data-controls {
                 float: right;
                 height: 16px;
-                border-left: 1px solid #d3d3d3;
+                border-left: 1px solid #e3e3e3;
                 font-size: 8pt;
                 padding: 2px 12px 1px 6px;
                 letter-spacing: 0.1em;

+ 1 - 2
web/templates/user/list_dns_rec.html

@@ -51,8 +51,7 @@
                                     <td class="data-dotted" style="padding: 0px 10px 0px 0px" width="150">
                                         <table class="data-col1">
                                             <tr><td style="padding: 18 0 4 18;"><input type="checkbox" name="record[]" value="<?php echo $data[$key]['ID']?>" > <input type="hidden" name="domain" value="<?php echo $_GET['domain'] ?>" ></td></tr>
-                                            <tr><td><a class="data-date" title="<?php echo  $data[$key]['DATE']."  ".$data[$key]['TIME'] ?>"><?php echo  strftime("%d %b %Y", strtotime($data[$key]['DATE'])) ?></td></tr>
-                                            <tr><td class="data-<?php echo $status ?>"><b><?php echo _($status); ?></b></td></tr>
+                                            <tr><td></td></tr>
                                         </table>
                                     </td>
                                     <td class="data-dotted" width="830px" style="vertical-align:top;">