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 @@ + + + + + + + + + +
+
+ + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ " class="data-controls"> + + + + + + + + + + +
+ + + +
+
+ + +
+
+ " class="data-controls"> + + + + + + + + + + +
+ + + +
+
+ + +
+
+ " class="data-controls"> + + + + + + + + + + +
+ + + +
+
+ + +
+
+ " class="data-controls"> + + + + + + + + + + +
+ + + +
+
+ + +
+
+ " class="data-controls"> + + + + + + + + + + +
+ + + +
+
+ + +
+
+ " class="data-controls"> + + + + + + + + + + +
+ + + +
+
+ + +
+ 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 @@ - - +
">