diff --git a/bin/v-add-cron-job b/bin/v-add-cron-job
index 08784e1f5..7569fb286 100755
--- a/bin/v-add-cron-job
+++ b/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"
#----------------------------------------------------------#
diff --git a/bin/v-add-database b/bin/v-add-database
index 923a48a5c..9d036884a 100755
--- a/bin/v-add-database
+++ b/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"
diff --git a/bin/v-add-database-server b/bin/v-add-database-server
index 480070971..81144472e 100755
--- a/bin/v-add-database-server
+++ b/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'";;
diff --git a/bin/v-add-dns-domain-record b/bin/v-add-dns-domain-record
index 12a64c3ad..70196692c 100755
--- a/bin/v-add-dns-domain-record
+++ b/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"
#----------------------------------------------------------#
diff --git a/bin/v-add-domain b/bin/v-add-domain
index b5d6afb42..2619663ef 100755
--- a/bin/v-add-domain
+++ b/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
diff --git a/bin/v-backup-user b/bin/v-backup-user
index 3ed8729ba..13a3ee1e0 100755
--- a/bin/v-backup-user
+++ b/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
diff --git a/bin/v-list-database-server b/bin/v-list-database-server
index f459c7d0d..a3ab0d89c 100755
--- a/bin/v-list-database-server
+++ b/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
diff --git a/bin/v-list-database-servers b/bin/v-list-database-servers
index 3a436f769..6dde6ca13 100755
--- a/bin/v-list-database-servers
+++ b/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
diff --git a/bin/v-list-user-backup b/bin/v-list-user-backup
new file mode 100755
index 000000000..4bdd5fd99
--- /dev/null
+++ b/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
diff --git a/bin/v-rebuild-databases b/bin/v-rebuild-databases
index eee88915b..456a4065d 100755
--- a/bin/v-rebuild-databases
+++ b/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
diff --git a/bin/v-rebuild-dns-domains b/bin/v-rebuild-dns-domains
index bd14a88a8..72f95f785 100755
--- a/bin/v-rebuild-dns-domains
+++ b/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
diff --git a/bin/v-rebuild-mail-domains b/bin/v-rebuild-mail-domains
index b913e64d3..eb50acd4b 100755
--- a/bin/v-rebuild-mail-domains
+++ b/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
diff --git a/bin/v-rebuild-web-domains b/bin/v-rebuild-web-domains
index afb0942c5..308e72ebd 100755
--- a/bin/v-rebuild-web-domains
+++ b/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
diff --git a/bin/v-restore-user b/bin/v-restore-user
index 84cc3e383..96d0ed4d3 100755
--- a/bin/v-restore-user
+++ b/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"
diff --git a/bin/v-update-sys-rrd-mysql b/bin/v-update-sys-rrd-mysql
index bc74f5049..1c8cc5816 100755
--- a/bin/v-update-sys-rrd-mysql
+++ b/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
diff --git a/bin/v-update-sys-rrd-pgsql b/bin/v-update-sys-rrd-pgsql
index 8aec1a280..985dc4f2a 100755
--- a/bin/v-update-sys-rrd-pgsql
+++ b/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
diff --git a/func/db.sh b/func/db.sh
index 88575960b..a99ea4b20 100644
--- a/func/db.sh
+++ b/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
-}
diff --git a/func/ip.sh b/func/ip.sh
index 7ca9d5d47..aa542f63a 100644
--- a/func/ip.sh
+++ b/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
-}
\ No newline at end of file
+}
+
+# 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"
+}
diff --git a/func/main.sh b/func/main.sh
index 8ec733387..305e573d0 100644
--- a/func/main.sh
+++ b/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" ;;
diff --git a/func/rebuild.sh b/func/rebuild.sh
new file mode 100644
index 000000000..fb27052e3
--- /dev/null
+++ b/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
+}
diff --git a/web/inc/i18n/en.php b/web/inc/i18n/en.php
index 3b025d39e..8f6378c8c 100644
--- a/web/inc/i18n/en.php
+++ b/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',
diff --git a/web/inc/i18n/es.php b/web/inc/i18n/es.php
index b04cbe2cf..6fe4afa30 100644
--- a/web/inc/i18n/es.php
+++ b/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',
diff --git a/web/inc/i18n/ua.php b/web/inc/i18n/ua.php
index 1a98a0748..60fe2d983 100644
--- a/web/inc/i18n/ua.php
+++ b/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' => 'Пошук',
diff --git a/web/list/backup/index.php b/web/list/backup/index.php
index 44c9230a1..4c13cb7e3 100644
--- a/web/list/backup/index.php
+++ b/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'];
diff --git a/web/templates/admin/list_backup.html b/web/templates/admin/list_backup.html
index c9748366f..8bfaf341b 100644
--- a/web/templates/admin/list_backup.html
+++ b/web/templates/admin/list_backup.html
@@ -87,10 +87,10 @@
- " class="data-controls">
+
-
-
+
+
diff --git a/web/templates/admin/list_backup_detail.html b/web/templates/admin/list_backup_detail.html
new file mode 100644
index 000000000..5c7b517d2
--- /dev/null
+++ b/web/templates/admin/list_backup_detail.html
@@ -0,0 +1,282 @@
+
+
+
+
+
+
+
diff --git a/web/templates/admin/list_dns_rec.html b/web/templates/admin/list_dns_rec.html
index de836101d..c53702b7d 100644
--- a/web/templates/admin/list_dns_rec.html
+++ b/web/templates/admin/list_dns_rec.html
@@ -53,8 +53,7 @@
|
@@ -68,16 +67,6 @@
-
-
-
-
-
-
-
-
diff --git a/web/templates/header.html b/web/templates/header.html
index 6813a059f..003a6bbac 100644
--- a/web/templates/header.html
+++ b/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;
diff --git a/web/templates/user/list_dns_rec.html b/web/templates/user/list_dns_rec.html
index 545986a48..dc1e6b092 100644
--- a/web/templates/user/list_dns_rec.html
+++ b/web/templates/user/list_dns_rec.html
@@ -51,8 +51,7 @@
|
|
|