Преглед изворни кода

support for NATed networks

Serghey Rodin пре 13 година
родитељ
комит
138ef6c7b0

+ 6 - 2
bin/v-add-sys-ip

@@ -1,6 +1,6 @@
 #!/bin/bash
 # info: add system ip address
-# options: IP MASK [INTERFACE] [USER] [IP_STATUS] [IP_NAME]
+# options: IP MASK [INTERFACE] [USER] [IP_STATUS] [IP_NAME] [NAT_IP]
 #
 # The function adds ip address into a system. It also creates rc scripts. You
 # can specify ip name which will be used as root domain for temporary aliases.
@@ -21,6 +21,7 @@ interface="${3-eth0}"
 user="${4-admin}"
 ip_status="${5-shared}"     # can be dedicated as well   
 ip_name=$6
+nat_ip=$7
 
 # Includes
 source $VESTA/conf/vesta.conf
@@ -33,7 +34,7 @@ source $VESTA/func/domain.sh
 #                    Verifications                         #
 #----------------------------------------------------------#
 
-check_args '2' "$#" 'IP MASK [INTERFACE] [USER] [IP_STATUS] [IP_NAME]'
+check_args '2' "$#" 'IP MASK [INTERFACE] [USER] [IP_STATUS] [IP_NAME] [NAT_IP]'
 validate_format 'ip' 'mask' 'interface' 'user' 'ip_status'
 is_ip_free
 is_object_valid 'user' 'USER' "$user"
@@ -41,6 +42,9 @@ is_object_unsuspended 'user' 'USER' "$user"
 if [ ! -z "$ip_name" ] ; then
     validate_format 'ip_name'
 fi
+if [ ! -z "$nat_ip" ] ; then
+    validate_format 'nat_ip'
+fi
 
 
 #----------------------------------------------------------#

+ 9 - 9
bin/v-add-web-domain

@@ -57,8 +57,11 @@ fi
 #                       Action                             #
 #----------------------------------------------------------#
 
-# Defining domain aliases
+# Define real ip in case of NAT
 IP=$ip
+ip=$(get_real_ip $ip)
+
+# Defining domain aliases
 ip_name=$(get_ip_name)
 ip_name_idn=$(idn -t --quiet -a "$ip_name")
 domain_alias="www.$domain"
@@ -81,15 +84,12 @@ email="$user@$domain"
 docroot="$HOMEDIR/$user/web/$domain/public_html"
 conf="$HOMEDIR/$user/conf/web/httpd.conf"
 tpl_file="$WEBTPL/apache_$template.tpl"
-elog=''
-cgi=''
-cgi_option='+ExecCGI'
 
 # Adding domain to the httpd.conf
 add_web_config
 
 # Building directory tree
-mkdir $HOMEDIR/$user/web/$domain \
+mkdir -p $HOMEDIR/$user/web/$domain \
       $HOMEDIR/$user/web/$domain/public_html \
       $HOMEDIR/$user/web/$domain/public_shtml \
       $HOMEDIR/$user/web/$domain/document_errors \
@@ -104,7 +104,7 @@ touch /var/log/httpd/domains/$domain.bytes \
       /var/log/httpd/domains/$domain.error.log
 
 # Adding symlink for logs
-ln -s /var/log/httpd/domains/$domain.*log $HOMEDIR/$user/web/$domain/logs/
+ln -f -s /var/log/httpd/domains/$domain.*log $HOMEDIR/$user/web/$domain/logs/
 
 # Adding domain skeleton
 if [ -e "$WEBTPL/skel/public_html/" ]; then
@@ -168,9 +168,9 @@ increase_user_value "$user" '$U_WEB_DOMAINS'
 increase_user_value "$user" '$U_WEB_ALIASES'
 
 # Defining domain variables
-str="DOMAIN='$domain' IP='$ip' IP6='' ALIAS='$aliases' TPL='$template'"
-str="$str CGI='yes' ELOG='yes' SSL='no' SSL_HOME='same' FTP_USER=''"
-str="$str FTP_MD5='' NGINX='' NGINX_EXT='' STATS='' STATS_USER=''"
+str="DOMAIN='$domain' IP='$IP' IP6='' ALIAS='$aliases' TPL='$template'"
+str="$str SSL='no' SSL_HOME='same' FTP_USER='' FTP_MD5=''"
+str="$str NGINX='' NGINX_EXT='' STATS='' STATS_USER=''"
 str="$str STATS_CRYPT='' U_DISK='0' U_BANDWIDTH='0' SUSPENDED='no'"
 str="$str TIME='$TIME' DATE='$DATE'"
 

+ 1 - 0
bin/v-add-web-domain-alias

@@ -50,6 +50,7 @@ is_package_full 'WEB_ALIASES'
 get_domain_values 'web'
 tpl_file="$WEBTPL/apache_$TPL.tpl"
 conf="$HOMEDIR/$user/conf/web/httpd.conf"
+ip=$(get_real_ip $IP)
 
 # Parsing domain aliases
 if [ -z "$ALIAS" ]; then

+ 2 - 0
bin/v-add-web-domain-nginx

@@ -24,6 +24,7 @@ restart="$5"
 source $VESTA/conf/vesta.conf
 source $VESTA/func/main.sh
 source $VESTA/func/domain.sh
+source $VESTA/func/ip.sh
 
 
 #----------------------------------------------------------#
@@ -57,6 +58,7 @@ NGINX="$template"
 NGINX_EXT="$extentions"
 tpl_file="$WEBTPL/nginx_$NGINX.tpl"
 conf="$HOMEDIR/$user/conf/web/nginx.conf"
+ip=$(get_real_ip $IP)
 
 # Preparing domain values for the template substitution
 upd_web_domain_values

+ 1 - 0
bin/v-add-web-domain-ssl

@@ -65,6 +65,7 @@ get_domain_values 'web'
 conf="$HOMEDIR/$user/conf/web/shttpd.conf"
 tpl_file="$WEBTPL/apache_$TPL.stpl"
 SSL_HOME="$ssl_home"
+ip=$(get_real_ip $IP)
 
 # Preparing domain values for the template substitution
 upd_web_domain_values

+ 4 - 1
bin/v-change-sys-ip-name

@@ -24,7 +24,10 @@ source $VESTA/func/ip.sh
 #----------------------------------------------------------#
 
 check_args '2' "$#" 'IP IP_NAME'
-validate_format 'ip' 'ip_name'
+validate_format 'ip'
+if [ ! -z "$ip_name" ]; then
+    validate_format 'ip_name'
+fi
 is_ip_valid
 
 

+ 54 - 0
bin/v-change-sys-ip-nat

@@ -0,0 +1,54 @@
+#!/bin/bash
+# info: change ip nat address
+# options: IP NAT_IP
+#
+# The function for changing nat ip associated with ip.
+
+
+#----------------------------------------------------------#
+#                    Variable&Function                     #
+#----------------------------------------------------------#
+
+# Argument defenition
+ip=$1
+nat_ip=$2
+
+# Includes
+source $VESTA/conf/vesta.conf
+source $VESTA/func/main.sh
+source $VESTA/func/ip.sh
+
+
+#----------------------------------------------------------#
+#                    Verifications                         #
+#----------------------------------------------------------#
+
+check_args '2' "$#" 'IP NAT_IP'
+validate_format 'ip'
+if [ ! -z "$nat_ip" ]; then
+    validate_format 'nat_ip'
+fi
+is_ip_valid
+
+
+#----------------------------------------------------------#
+#                       Action                             #
+#----------------------------------------------------------#
+
+# Changing nat ip
+if [ -z "$(grep NAT= $VESTA/data/ips/$ip)" ]; then
+    sed -i "s/^TIME/NAT='$nat_ip'\nTIME/g" $VESTA/data/ips/$ip
+else
+    update_ip_value '$NAT' "$nat_ip"
+fi
+
+
+#----------------------------------------------------------#
+#                       Vesta                              #
+#----------------------------------------------------------#
+
+# Logging
+log_history "changed associated nat address on $ip to $nat_ip" '' 'admin'
+log_event "$OK" "$EVENT"
+
+exit

+ 4 - 3
bin/v-change-web-domain-ip

@@ -45,9 +45,10 @@ is_ip_avalable
 
 # Define variable for replace
 get_domain_values 'web'
+ip=$(get_real_ip $ip)
 tpl_file="$WEBTPL/apache_$TPL.tpl"
 conf="$HOMEDIR/$user/conf/web/httpd.conf"
-old=$IP
+old=$(get_real_ip $IP)
 new=$ip
 replace_web_config
 
@@ -82,7 +83,7 @@ increase_ip_value "$new"
 decrease_ip_value "$old"
 
 # Update config
-update_object_value 'web' 'DOMAIN' "$domain" '$IP' "$ip"
+update_object_value 'web' 'DOMAIN' "$domain" '$IP' "$3"
 
 # Restart web server
 if [ "$restart" != 'no' ]; then
@@ -90,7 +91,7 @@ if [ "$restart" != 'no' ]; then
 fi
 
 # Logging
-log_history "changed web domain $domain ip to $ip"
+log_history "changed web domain $domain ip to $3"
 log_event "$OK" "$EVENT"
 
 exit

+ 1 - 0
bin/v-change-web-domain-nginx-tpl

@@ -50,6 +50,7 @@ is_nginx_template_valid
 get_domain_values 'web'
 tpl_file="$WEBTPL/nginx_$NGINX.tpl"
 conf="$HOMEDIR/$user/conf/web/nginx.conf"
+ip=$(get_real_ip $IP)
 
 # Delete old vhost
 del_web_config

+ 1 - 7
bin/v-change-web-domain-tpl

@@ -43,6 +43,7 @@ is_apache_template_valid
 
 # Parsing domain values
 get_domain_values 'web'
+ip=$(get_real_ip $IP)
 
 # Deleting domain
 tpl_file="$WEBTPL/apache_$TPL.tpl"
@@ -61,13 +62,6 @@ fi
 upd_web_domain_values
 tpl_file="$WEBTPL/apache_$template.tpl"
 
-# Checking error log
-if [ "$ELOG" = 'no' ]; then
-    elog='#'
-else
-    elog=''
-fi
-
 # Adding domain to the httpd.conf
 add_web_config
 

+ 2 - 1
bin/v-delete-web-domain

@@ -46,6 +46,7 @@ is_object_unsuspended 'web' 'DOMAIN' "$domain"
 get_domain_values 'web'
 tpl_file="$WEBTPL/apache_$TPL.tpl"
 conf="$HOMEDIR/$user/conf/web/httpd.conf"
+ip=$(get_real_ip $IP)
 
 # Deleting domain
 del_web_config
@@ -146,7 +147,7 @@ if [ -z "$last_nginx" ]; then
 fi
 
 # Decrease counters
-decrease_ip_value "$IP"
+decrease_ip_value "$ip"
 decrease_user_value "$user" '$U_WEB_DOMAINS'
 decrease_user_value "$user" '$U_WEB_ALIASES' "$aliases"
 if [ "$SSL" = 'yes' ]; then

+ 1 - 0
bin/v-delete-web-domain-alias

@@ -36,6 +36,7 @@ is_object_unsuspended 'user' 'USER' "$user"
 is_object_valid 'web' 'DOMAIN' "$domain"
 is_object_unsuspended 'web' 'DOMAIN' "$domain"
 get_domain_values 'web'
+ip=$(get_real_ip $IP)
 if [ -z "$(echo $ALIAS | tr ',' '\n' | grep ^$dom_alias$)" ]; then
     echo "Error: alias $dom_alias not exist"
     log_event "$E_NOTEXIST" "$EVENT"

+ 1 - 1
bin/v-list-sys-ip

@@ -74,7 +74,7 @@ conf=$VESTA/data/ips/$IP
 
 # Defining fileds to select
 fields='$IP $OWNER $STATUS $NAME $U_SYS_USERS $U_WEB_DOMAINS $INTERFACE
-    $NETMASK $TIME $DATE'
+    $NETMASK $NAT $TIME $DATE'
 
 # Listing ip
 case $format in 

+ 11 - 5
bin/v-list-sys-ips

@@ -61,9 +61,15 @@ shell_list_ips() {
     fi
 
     for IP in $ip_list; do
-        ip_data=$(cat $VESTA/data/ips/$IP)
-        eval $ip_data
-        eval echo "$fields"
+        source $VESTA/data/ips/$IP
+        for field in $fields; do
+            eval value=$field
+            if [ -z "$value" ]; then
+                value='NULL'
+            fi
+            echo -n "$value "
+        done
+        echo
     done
 }
 
@@ -75,13 +81,13 @@ shell_list_ips() {
 # Defining fileds to select
 conf=$VESTA/data/ips/*
 fields="\$IP \$OWNER \$STATUS \$NAME \$U_SYS_USERS \$U_WEB_DOMAINS"
-fields="$fields \$INTERFACE \$NETMASK \$TIME \$DATE"
+fields="$fields \$INTERFACE \$NETMASK \$NAT \$TIME \$DATE"
 
 # Listing ip addresses
 case $format in 
     json)   json_list_ips ;;
     plain)  nohead=1; shell_list_ips ;;
-    shell)  fields='$IP $NETMASK $OWNER $STATUS $U_WEB_DOMAINS';
+    shell)  fields='$IP $NETMASK $NAT $OWNER $U_WEB_DOMAINS';
             shell_list_ips | column -t ;;
     *)      check_args '1' '0' '[FORMAT]'
 esac

+ 18 - 4
bin/v-list-user-ips

@@ -79,10 +79,24 @@ shell_list_user_ips() {
     for IP in $(ls $VESTA/data/ips/); do
         source $VESTA/data/ips/$IP
         if [ "$OWNER" = "$user" ]; then
-            eval echo "$fields"
+            for field in $fields; do
+                eval value=$field
+                if [ -z "$value" ]; then
+                    value='NULL'
+                fi
+                echo -n "$value "
+            done
+            echo
         else
             if  [ "$OWNER" = 'admin' ] && [ "$STATUS" = 'shared' ]; then
-                eval echo "$fields"
+                for field in $fields; do
+                    eval value=$field
+                    if [ -z "$value" ]; then
+                        value='NULL'
+                    fi
+                    echo -n "$value "
+                done
+                echo
             fi
         fi
     done
@@ -103,10 +117,10 @@ is_object_valid 'user' 'USER' "$user"
 #----------------------------------------------------------#
 
 # Defining fileds to select
-fields='$IP $OWNER $STATUS $NAME'
+fields='$IP $OWNER $STATUS $NAME $NAT'
 
 # Listing ips
-case $format in 
+case $format in
     json)   json_list_user_ips ;;
     plain)  nohead=1; shell_list_user_ips ;;
     shell)  shell_list_user_ips | column -t ;;

+ 2 - 2
bin/v-list-web-domain

@@ -75,8 +75,8 @@ is_object_valid 'web' 'DOMAIN' "$domain"
 conf=$USER_DATA/web.conf
 
 # Defining fileds to select
-fields='$DOMAIN $IP $IP6 $U_DISK $U_BANDWIDTH $TPL $ALIAS $CGI $ELOG $STATS
- $STATS_USER $SSL $SSL_HOME $FTP_USER $NGINX $NGINX_EXT $SUSPENDED $TIME $DATE'
+fields='$DOMAIN $IP $IP6 $U_DISK $U_BANDWIDTH $TPL $ALIAS $STATS $STATS_USER
+    $SSL $SSL_HOME $FTP_USER $NGINX $NGINX_EXT $SUSPENDED $TIME $DATE'
 
 # Listing domains
 case $format in 

+ 2 - 2
bin/v-list-web-domains

@@ -34,8 +34,8 @@ is_object_valid 'user' 'USER' "$user"
 conf=$USER_DATA/web.conf
 
 # Defining fileds to select
-fields="\$DOMAIN \$IP \$IP6 \$U_DISK \$U_BANDWIDTH \$TPL \$ALIAS \$CGI"
-fields="$fields \$ELOG \$STATS \$STATS_USER \$SSL \$SSL_HOME \$FTP_USER"
+fields="\$DOMAIN \$IP \$IP6 \$U_DISK \$U_BANDWIDTH \$TPL \$ALIAS"
+fields="$fields \$STATS \$STATS_USER \$SSL \$SSL_HOME \$FTP_USER"
 fields="$fields \$NGINX \$NGINX_EXT \$SUSPENDED \$TIME \$DATE"
 
 # Listing domains

+ 8 - 9
bin/v-rebuild-web-domains

@@ -60,14 +60,12 @@ for domain in $(shell_list) ; do
         $HOMEDIR/$user/web/$domain/private \
         $HOMEDIR/$user/web/$domain/stats \
         $HOMEDIR/$user/web/$domain/logs
-    if [ ! -e "$HOMEDIR/$user/web/$domain/logs/$domain.log" ]; then
-        ln -s /var/log/httpd/domains/$domain.error.log \
-            $HOMEDIR/$user/web/$domain/logs/$domain.log
-    fi
-    if [ ! -e "$HOMEDIR/$user/web/$domain/logs/$domain.error.log" ]; then
-        ln -s /var/log/httpd/domains/$domain.error.log \
-            $HOMEDIR/$user/web/$domain/logs/$domain.error.log
-    fi
+
+    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
@@ -98,6 +96,7 @@ for domain in $(shell_list) ; do
     # 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
@@ -209,7 +208,7 @@ for domain in $(shell_list) ; do
             chown root:nginx $conf
             chmod 640 $conf
         fi
-	ngix_change='yes'
+        ngix_change='yes'
     fi
     if [ "$SUSPENDED" = 'yes' ]; then
         suspended_web=$((suspended_web + 1))

+ 1 - 0
bin/v-suspend-web-domain

@@ -45,6 +45,7 @@ get_domain_values 'web'
 tpl_file="$WEBTPL/apache_$TPL.tpl"
 conf="$HOMEDIR/$user/conf/web/httpd.conf"
 SUSPENDED='yes'
+ip=$(get_real_ip $IP)
 
 # Preparing domain values for the template substitution
 upd_web_domain_values

+ 1 - 0
bin/v-unsuspend-web-domain

@@ -42,6 +42,7 @@ get_domain_values 'web'
 tpl_file="$WEBTPL/apache_$TPL.tpl"
 conf="$HOMEDIR/$user/conf/web/httpd.conf"
 SUSPENDED='no'
+ip=$(get_real_ip $IP)
 
 # Preparing domain values for the template substitution
 upd_web_domain_values

+ 3 - 4
func/domain.sh

@@ -256,9 +256,9 @@ add_web_config() {
             -e "s/%ssl_ca_str%/${ssl_ca_str////\/}/g" \
             -e "s/%ssl_ca%/${ssl_ca////\/}/g" \
             -e "s/%nginx_extentions%/${NGINX_EXT//,/|}/g" \
-            -e "s/%elog%/$elog/g" \
-            -e "s/%cgi%/$cgi/g" \
-            -e "s/%cgi_option%/$cgi_option/g" \
+            -e "s/%elog%//g" \
+            -e "s/%cgi%//g" \
+            -e "s/%cgi_option%/+ExecCGI/g" \
     >> $conf
 }
 
@@ -464,7 +464,6 @@ namehost_ip_disable() {
 
 # Update web domain values
 upd_web_domain_values() {
-    ip=$IP
     group="$user"
     email="$user@$domain"
     docroot="$HOMEDIR/$user/web/$domain/public_html"

+ 20 - 5
func/ip.sh

@@ -1,8 +1,7 @@
 # Validationg ip address
 is_ip_valid() {
-    #check_ifc=$(/sbin/ifconfig |grep "inet addr:$ip")
-    #if [ ! -e "$VESTA/data/ips/$ip" ] || [ -z "$check_ifc" ]; then
-    if [ ! -e "$VESTA/data/ips/$ip" ] ; then
+    check_nat=$(grep "^NAT='$ip'" $VESTA/data/ips/* 2>/dev/null)
+    if [ ! -e "$VESTA/data/ips/$ip" ] && [ -z "$check_nat" ] ; then
         echo "Error: IP $ip not exist"
         log_event "$E_NOTEXIST" "$EVENT"
         exit $E_NOTEXIST
@@ -11,7 +10,13 @@ is_ip_valid() {
 
 # Check if ip availabile for user
 is_ip_avalable() {
-    ip_data=$(cat $VESTA/data/ips/$ip)
+    if [ -e "$VESTA/data/ips/$ip" ]; then
+        ip_data=$(cat $VESTA/data/ips/$ip)
+    else
+        nated_ip=$(grep "^NAT='$ip'" $VESTA/data/ips/*)
+        nated_ip=$(echo "$nated_ip" | cut -f 1 -d : | cut -f 7 -d /)
+        ip_data=$(cat $VESTA/data/ips/$nated_ip)
+    fi
     owner=$(echo "$ip_data"|grep OWNER= | cut -f 2 -d \')
     status=$(echo "$ip_data"|grep STATUS= | cut -f 2 -d \')
     shared=no
@@ -90,7 +95,7 @@ update_ip_value() {
 
 # Get ip name
 get_ip_name() {
-    grep "NAME=" $VESTA/data/ips/$ip |cut -f 2 -d \'
+    grep "NAME=" $VESTA/data/ips/$ip | cut -f 2 -d \'
 }
 
 # Increase ip value
@@ -192,6 +197,7 @@ create_vesta_ip() {
     ip_data="$ip_data\nU_WEB_DOMAINS='0'"
     ip_data="$ip_data\nINTERFACE='$interface'"
     ip_data="$ip_data\nNETMASK='$mask'"
+    ip_data="$ip_data\nNAT='$nat_ip'"
     ip_data="$ip_data\nTIME='$TIME'"
     ip_data="$ip_data\nDATE='$DATE'"
     echo -e "$ip_data" >$VESTA/data/ips/$ip
@@ -205,3 +211,12 @@ create_ip_startup() {
     ip_data="$ip_data\nNETMASK=$mask"
     echo -e "$ip_data" > $iconf-$iface
 }
+
+get_real_ip() {
+    if [ -e "$VESTA/data/ips/$1" ]; then
+        echo $1
+    else
+        nated_ip=$(grep "^NAT='$1'" $VESTA/data/ips/*)
+        echo "$nated_ip" | cut -f 1 -d : | cut -f 7 -d /
+    fi
+}

+ 1 - 0
func/main.sh

@@ -752,6 +752,7 @@ validate_format(){
             max_db)         validate_format_int "$arg" ;;
             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" ;;

+ 3 - 1
web/add/ip/index.php

@@ -25,6 +25,7 @@ if ($_SESSION['user'] == 'admin') {
         $v_ip = escapeshellarg($_POST['v_ip']);
         $v_netmask = escapeshellarg($_POST['v_netmask']);
         $v_name = escapeshellarg($_POST['v_name']);
+        $v_nat = escapeshellarg($_POST['v_nat']);
 
         $v_interface = $_POST['v_interface'];
         $v_shared = $_POST['v_shared'];
@@ -51,7 +52,7 @@ if ($_SESSION['user'] == 'admin') {
             // Add IP
             $v_interface = escapeshellarg($_POST['v_interface']);
             $v_owner = $_POST['v_owner'];
-            exec (VESTA_CMD."v-add-sys-ip ".$v_ip." ".$v_netmask." ".$v_interface."  ".$v_owner." '".$ip_status."' ".$v_name, $output, $return_var);
+            exec (VESTA_CMD."v-add-sys-ip ".$v_ip." ".$v_netmask." ".$v_interface."  ".$v_owner." '".$ip_status."' ".$v_name." ".$v_nat, $output, $return_var);
             $v_owner = $_POST['v_owner'];
             $v_interface = $_POST['v_interface'];
             if ($return_var != 0) {
@@ -65,6 +66,7 @@ if ($_SESSION['user'] == 'admin') {
                 unset($v_ip);
                 unset($v_netmask);
                 unset($v_name);
+                unset($v_nat);
                 unset($output);
             }
         }

+ 2 - 1
web/delete/ip/index.php

@@ -13,7 +13,8 @@ if ($_SESSION['user'] == 'admin') {
     if ($return_var != 0) {
         $error = implode('<br>', $output);
         if (empty($error)) $error = _('Error: vesta did not return any output.');
-            $_SESSION['error_msg'] = $error;
+        if ($return_var == 4) $error = _('IP address is in use');
+        $_SESSION['error_msg'] = $error;
     }
     unset($output);
 

+ 13 - 0
web/edit/ip/index.php

@@ -36,6 +36,7 @@ if ($_SESSION['user'] == 'admin') {
         $v_netmask = $data[$v_ip]['NETMASK'];
         $v_interace = $data[$v_ip]['INTERFACE'];
         $v_name = $data[$v_ip]['NAME'];
+        $v_nat = $data[$v_ip]['NAT'];
         $v_ipstatus = $data[$v_ip]['STATUS'];
         if ($v_ipstatus == 'dedicated') $v_dedicated = 'yes';
         $v_owner = $data[$v_ip]['OWNER'];
@@ -104,6 +105,18 @@ if ($_SESSION['user'] == 'admin') {
                 unset($output);
             }
 
+            // Change Nat
+            if (($v_nat != $_POST['v_nat']) && (empty($_SESSION['error_msg']))) {
+                $v_nat = escapeshellarg($_POST['v_nat']);
+                exec (VESTA_CMD."v-change-sys-ip-nat ".$v_ip." ".$v_nat, $output, $return_var);
+                if ($return_var != 0) {
+                    $error = implode('<br>', $output);
+                    if (empty($error)) $error = _('Error code:',$return_var);
+                    $_SESSION['error_msg'] = $error;
+                }
+                unset($output);
+            }
+
             if (empty($_SESSION['error_msg'])) {
                 $_SESSION['ok_msg'] = _('Changes has been saved.');
             }

+ 3 - 1
web/inc/i18n/en.php

@@ -258,6 +258,7 @@ $LANG['en'] = array(
     'Shared'  => 'Shared',
     'Assigned user'  => 'Assigned user',
     'Assigned domain'  => 'Assigned domain',
+    'NAT IP association' => 'NAT IP association',
     'shell'  => 'shell',
     'web domains'  => 'web domains',
     'web aliases'  => 'web aliases',
@@ -356,8 +357,9 @@ $LANG['en'] = array(
     'Passwords not match'  => 'Passwords not match',
     'Please enter valid email address.'  => 'Please enter valid email address.',
     'Field "%s" can not be blank.'  => 'Field "%s" can not be blank.',
-    'Error code:'  => 'Error code:',
+    'Error code:'  => 'Error code: %s',
     'SERVICE_ACTION_FAILED'  => '"%s" "%s" failed',
+    'IP address is in use' => 'IP address is in use',
 
     'Welcome to Vesta Control Panel'  => 'Welcome to Vesta Control Panel',
     'MAIL_FROM'  => 'Vesta Control Panel <noreply@%s>',

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

@@ -259,6 +259,7 @@ $LANG['ru'] = array(
     'Shared' => 'Общий',
     'Assigned user' => 'Назначить пользователю',
     'Assigned domain' => 'Домен',
+    'NAT IP association' => 'Ассоциированный NAT IP',
     'shell' => 'ssh доступ',
     'web domains' => 'веб домены',
     'web aliases' => 'алиасы хостов',
@@ -359,6 +360,7 @@ $LANG['ru'] = array(
     'Field "%s" can not be blank.' => 'Поле "%s" не может быть пустым.',
     'Error code:' => 'Код ошибки: %s',
     'SERVICE_ACTION_FAILED' => 'Не удалось "%s" "%s"',
+    'IP address is in use' => 'IP адрес используется',
 
     'Welcome to Vesta Control Panel' => 'Добро пожаловать в панель управления Vesta',
     'MAIL_FROM' => 'Vesta Control Panel <noreply@%s>',

+ 12 - 0
web/templates/admin/add_ip.html

@@ -135,6 +135,18 @@
                                                 <input type="text" size="20" class="vst-input" name="v_name" <?php if (!empty($v_name)) echo "value=".$v_name; ?>>
                                             </td>
                                         </tr>
+                                        <tr>
+                                            <td class="vst-text" style="padding: 10 0 0 2px;">
+                                                <?php print _('NAT IP association');?> <span style="padding:0 0 0 6px; font-size: 10pt; color:#555;">(<?php print _('optional');?>)</span>
+                                            </td>
+                                        </tr>
+                                        <tr>
+                                            <td>
+                                                <input type="text" size="20" class="vst-input" name="v_nat" <?php if (!empty($v_nat)) echo "value=".$v_nat; ?>>
+                                            </td>
+                                        </tr>
+
+
                                     </table>
                                     <table class="data-col2">
                                         <tr>

+ 5 - 3
web/templates/admin/add_web.html

@@ -103,11 +103,13 @@
                                             <select class="vst-list" name="v_ip">
                                                 <?php
                                                     foreach ($ips as $key => $value) {
-                                                        echo "\t\t\t\t<option value=\"".$key."\"";
-                                                        if ((!empty($v_ip)) && ( $key == $_POST['v_ip'])){
+                                                        $display_ip = $key;
+                                                        if (!empty($value['NAT'])) $display_ip = $value['NAT'];
+                                                        echo "\t\t\t\t<option value=\"".$display_ip."\"";
+                                                        if ((!empty($v_ip)) && ( $display_ip == $_POST['v_ip'])){
                                                             echo ' selected';
                                                         }
-                                                        echo ">".$key."</option>\n";
+                                                        echo ">".$display_ip."</option>\n";
                                                     }
                                                 ?>
                                             </select>

+ 11 - 0
web/templates/admin/edit_ip.html

@@ -123,6 +123,17 @@
                                                 <input type="text" size="20" class="vst-input" name="v_name" <?php if (!empty($v_name)) echo "value=".$v_name; ?>>
                                             </td>
                                         </tr>
+                                        <tr>
+                                            <td class="vst-text" style="padding: 10 0 0 2px;">
+                                                <?php print _('NAT IP association');?> <span style="padding:0 0 0 6px; font-size: 10pt; color:#555;">(<?php print _('optional');?>)</span>
+                                            </td>
+                                        </tr>
+                                        <tr>
+                                            <td>
+                                                <input type="text" size="20" class="vst-input" name="v_nat" <?php if (!empty($v_nat)) echo "value=".$v_nat; ?>>
+                                            </td>
+                                        </tr>
+
                                     </table>
                                     <table class="data-col2">
                                         <tr>

+ 6 - 4
web/templates/admin/edit_web.html

@@ -95,12 +95,14 @@
                                                 <select class="vst-list" name="v_ip">
                                                     <?php
                                                         foreach ($ips as $key => $value) {
-                                                            echo "\n\t\t\t\t\t\t\t\t\t\t<option value=\"".$key."\"";
-                                                            $skey = "'".$key."'";
-                                                            if ((!empty($v_ip)) && ( $key == $v_ip ) || ( $skey == $v_ip )){
+                                                            $display_ip = $key;
+                                                            if (!empty($value['NAT'])) $display_ip = $value['NAT'];
+                                                            $skey = "'".$display_ip."'";
+                                                            echo "\n\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"".$display_ip."\"";
+                                                            if ((!empty($v_ip)) && ( $display_ip == $v_ip ) || ( $skey == $v_ip )){
                                                                 echo ' selected';
                                                             }
-                                                            echo ">".$key."</option>\n";
+                                                            echo ">".$display_ip."</option>\n";
                                                         }
                                                     ?>
                                                 </select>

+ 28 - 1
web/templates/admin/list_ip.html

@@ -20,6 +20,31 @@
                                                 </select>
                                                 <input type="submit" name="ok" value="›" class="button" style="width: 37px; font-size: 12px; height: 24px;">
                                             </div>
+                                            <?php
+                                                if (!empty($_SESSION['error_msg'])) {
+                                            ?> 
+                                            <div>
+                                                <script type="text/javascript">
+                                                    $(function() {
+                                                        $( "#dialog:ui-dialog" ).dialog( "destroy" );
+                                                        $( "#dialog-message" ).dialog({
+                                                            modal: true,
+                                                            buttons: {
+                                                                Ok: function() {
+                                                                    $( this ).dialog( "close" );
+                                                                }
+                                                            }
+                                                        });
+                                                    });
+                                                </script>
+                                                <div id="dialog-message" title="Error">
+                                                    <p><?php echo $_SESSION['error_msg'] ?></p>
+                                                </div>
+                                            </div>
+                                            <?php
+                                                    unset($_SESSION['error_msg']);
+                                                }
+                                            ?> 
                                         </td>
                                     </tr>
                                 </table>
@@ -64,7 +89,9 @@
                                     <table class="data-col2" width="830px">
                                         <tr>
                                             <td colspan=3 class="domain" style="padding: 0 0 0 4px;">
-                                                <b><?php echo $key ?></b><a class="aliases" style="padding:0 0 0 8px;"><?php echo  $data[$key]['NAME'] ?></a>
+                                                <b><?php echo $key ?></b>
+                                                <?php if (!empty($data[$key]['NAT'])) echo ' → <b>' . $data[$key]['NAT'] . '</b>'; ?>
+                                                <a class="aliases" style="padding:0 0 0 8px;"><?php echo  $data[$key]['NAME'] ?></a>
                                             </td>
                                         </tr>
                                         <tr>

+ 7 - 7
web/templates/admin/panel.html

@@ -9,26 +9,26 @@
                                 <tr>
                                     <td style="border-bottom: 1px solid #c4c4c4; height: 26px; border-left: 1px solid #c4c4c4; padding: 0 0 0 0px">
                                         <b><a class="top-<?php if($TAB == 'PACKAGE' ) echo 'selected-' ?>link" href="/list/package/">
-                                            <?php print _('Packages') ?>
+                                            <?php print _('Packages') ?> 
                                         </a></b>
                                         <b><a class="top-<?php if($TAB == 'IP' ) echo 'selected-' ?>link" href="/list/ip/">
-                                            <?php print _('IP') ?>
+                                            <?php print _('IP') ?> 
                                         </a></b>
                                         <b><a class="top-<?php if($TAB == 'RRD' ) echo 'selected-' ?>link" href="/list/rrd/">
-                                            <?php print _('Graphics') ?>
+                                            <?php print _('Graphics') ?> 
                                         </a></b>
                                         <b><a class="top-<?php if($TAB == 'STATS' ) echo 'selected-' ?>link" href="/list/stats/">
-                                            <?php print _('Statistics') ?>
+                                            <?php print _('Statistics') ?> 
                                         </a></b>
                                         <b><a class="top-<?php if($TAB == 'LOG' ) echo 'selected-' ?>link" href="/list/log/">
-                                            <?php print _('Log') ?>
+                                            <?php print _('Log') ?> 
                                         </a></b>
                                         <b><a class="top-<?php if($TAB == 'SERVICES' ) echo 'selected-' ?>link" href="/list/services/">
-                                            <?php print _('Services') ?>
+                                            <?php print _('Services') ?> 
                                         </a></b>
 
                                         <b><a class="top-<?php if($TAB == 'UPDATES' ) echo 'selected-' ?>link" href="/list/updates/">
-                                            <?php print _('Updates') ?>
+                                            <?php print _('Updates') ?> 
                                         </a></b>
                                     </td>
                                     <td style="border-bottom: 1px solid #c4c4c4; height: 26px; text-align: right; border-right: 1px solid #c4c4c4; padding: 0 24px 0 0px; weight:120px">

+ 5 - 3
web/templates/user/add_web.html

@@ -103,11 +103,13 @@
                                             <select class="vst-list" name="v_ip">
                                                 <?php
                                                     foreach ($ips as $key => $value) {
-                                                        echo "\t\t\t\t<option value=\"".$key."\"";
-                                                        if ((!empty($v_ip)) && ( $key == $_POST['v_ip'])){
+                                                        $display_ip = $key;
+                                                        if (!empty($value['NAT'])) $display_ip = $value['NAT'];
+                                                        echo "\t\t\t\t<option value=\"".$display_ip."\"";
+                                                        if ((!empty($v_ip)) && ( $display_ip == $_POST['v_ip'])){
                                                             echo ' selected';
                                                         }
-                                                        echo ">".$key."</option>\n";
+                                                        echo ">".$display_ip."</option>\n";
                                                     }
                                                 ?>
                                             </select>

+ 6 - 4
web/templates/user/edit_web.html

@@ -95,12 +95,14 @@
                                                 <select class="vst-list" name="v_ip">
                                                     <?php
                                                         foreach ($ips as $key => $value) {
-                                                            echo "\n\t\t\t\t\t\t\t\t\t\t<option value=\"".$key."\"";
-                                                            $skey = "'".$key."'";
-                                                            if ((!empty($v_ip)) && ( $key == $v_ip ) || ( $skey == $v_ip )){
+                                                            $display_ip = $key;
+                                                            if (!empty($value['NAT'])) $display_ip = $value['NAT'];
+                                                            $skey = "'".$display_ip."'";
+                                                            echo "\n\t\t\t\t\t\t\t\t\t\t\t\t<option value=\"".$display_ip."\"";
+                                                            if ((!empty($v_ip)) && ( $display_ip == $v_ip ) || ( $skey == $v_ip )){
                                                                 echo ' selected';
                                                             }
-                                                            echo ">".$key."</option>\n";
+                                                            echo ">".$display_ip."</option>\n";
                                                         }
                                                     ?>
                                                 </select>

+ 14 - 14
web/templates/user/panel.html

@@ -9,16 +9,16 @@
                                 <tr>
                                     <td style="border-bottom: 1px solid #c4c4c4; height: 26px; border-left: 1px solid #c4c4c4; padding: 0 0 0 0px">
                                         <b><a class="top-<?php if($TAB == 'STATS' ) echo 'selected-' ?>link" href="/list/stats/">
-                                            <?php print _('Statistics') ?>
+                                            <?php print _('Statistics') ?> 
                                         </a></b>
                                         <b><a class="top-<?php if($TAB == 'LOG' ) echo 'selected-' ?>link" href="/list/log/">
-                                            <?php print _('Log') ?>
+                                            <?php print _('Log') ?> 
                                         </a></b>
                                     </td>
                                     <td style="border-bottom: 1px solid #c4c4c4; height: 26px; text-align: right; border-right: 1px solid #c4c4c4; padding: 0 24px 0 0px; weight:120px">
                                         <b><?php if($user != $_SESSION['user']) echo 'admin / ' ?><?php echo $user ?></b>
                                         <a class="top-link" style="padding: 5px 0px 5px 2px; border:0px" href="/logout/">
-                                            <?php print _('Log out') ?>
+                                            <?php print _('Log out') ?> 
                                         </a>
                                     </td>
                                 </tr>
@@ -41,12 +41,12 @@
                                             <a class="nav-lnk" href="/list/web/">
                                             <span class="nav-<?php if($TAB == 'WEB' ) echo 'selected-' ?>block">
                                                 <p class="nav-<?php if($TAB == 'WEB' ) echo 'selected-' ?>header">
-                                                    <?php print _('WEB');?>
+                                                    <?php print _('WEB');?> 
                                                 </p>
                                                 <p class="nav-counters" style="decoration: none;">
                                                     <?php print _('domains');?>: <? echo $panel[$user]['U_WEB_DOMAINS']?><br>
                                                     <?php print _('aliases');?>: <? echo $panel[$user]['U_WEB_ALIASES']?><br>
-                                                    <?php print _('spnd');?>: <? echo $panel[$user]['SUSPENDED_WEB']?>
+                                                    <?php print _('spnd');?>: <? echo $panel[$user]['SUSPENDED_WEB']?> 
                                                 </p>
                                             </span>
                                             </a>
@@ -54,12 +54,12 @@
                                             <a class="nav-lnk" href="/list/dns/">
                                             <span class="nav-<?php if($TAB == 'DNS' ) echo 'selected-' ?>block">
                                                 <p class="nav-<?php if($TAB == 'DNS' ) echo 'selected-' ?>header">
-                                                    <?php print _('DNS');?>
+                                                    <?php print _('DNS');?> 
                                                 </p>
                                                 <p class="nav-counters" style="decoration: none;">
                                                     <?php print _('domains');?>: <? echo $panel[$user]['U_DNS_DOMAINS']?><br>
                                                     <?php print _('records');?>: <? echo $panel[$user]['U_DNS_RECORDS']?><br>
-                                                    <?php print _('spnd');?>: <? echo $panel[$user]['SUSPENDED_DNS']?>
+                                                    <?php print _('spnd');?>: <? echo $panel[$user]['SUSPENDED_DNS']?> 
                                                 </p>
                                             </span>
                                             </a>
@@ -67,12 +67,12 @@
                                             <a class="nav-lnk" href="/list/mail/">
                                             <span class="nav-<?php if($TAB == 'MAIL' ) echo 'selected-' ?>block">
                                                 <p class="nav-<?php if($TAB == 'MAIL' ) echo 'selected-' ?>header">
-                                                    <?php print _('MAIL');?>
+                                                    <?php print _('MAIL');?> 
                                                 </p>
                                                 <p class="nav-counters" style="decoration: none;">
                                                     <?php print _('domains');?>: <? echo $panel[$user]['U_MAIL_DOMAINS']?><br>
                                                     <?php print _('accounts');?>: <? echo $panel[$user]['U_MAIL_ACCOUNTS']?><br>
-                                                    <?php print _('spnd');?>: <? echo $panel[$user]['SUSPENDED_MAIL']?>
+                                                    <?php print _('spnd');?>: <? echo $panel[$user]['SUSPENDED_MAIL']?> 
                                                 </p>
                                             </span>
                                             </a>
@@ -80,11 +80,11 @@
                                             <a class="nav-lnk" href="/list/db/">
                                             <span class="nav-<?php if($TAB == 'DB' ) echo 'selected-' ?>block">
                                                 <p class="nav-<?php if($TAB == 'DB' ) echo 'selected-' ?>header">
-                                                    <?php print _('DB');?>
+                                                    <?php print _('DB');?> 
                                                 </p>
                                                 <p class="nav-counters" style="decoration: none;">
                                                     <?php print _('databases');?>: <? echo $panel[$user]['U_DATABASES']?><br>
-                                                    <?php print _('spnd');?>: <? echo $panel[$user]['SUSPENDED_DB']?>
+                                                    <?php print _('spnd');?>: <? echo $panel[$user]['SUSPENDED_DB']?>  
                                                 </p>
                                             </span>
                                             </a>
@@ -92,11 +92,11 @@
                                             <a class="nav-lnk" href="/list/cron/">
                                             <span class="nav-<?php if($TAB == 'CRON' ) echo 'selected-' ?>block">
                                                 <p class="nav-<?php if($TAB == 'CRON' ) echo 'selected-' ?>header">
-                                                    <?php print _('CRON');?>
+                                                    <?php print _('CRON');?> 
                                                 </p>
                                                 <p class="nav-counters" style="decoration: none;">
                                                     <?php print _('jobs');?>: <? echo $panel[$user]['U_CRON_JOBS']?><br>
-                                                    <?php print _('spnd');?>: <? echo $panel[$user]['SUSPENDED_CRON']?>
+                                                    <?php print _('spnd');?>: <? echo $panel[$user]['SUSPENDED_CRON']?> 
                                                 </p>
                                             </span>
                                             </a>
@@ -104,7 +104,7 @@
                                             <a class="nav-lnk" href="/list/backup/">
                                             <span class="nav-<?php if($TAB == 'BACKUP' ) echo 'selected-' ?>block">
                                                 <p class="nav-<?php if($TAB == 'BACKUP' ) echo 'selected-' ?>header">
-                                                    <?php print _('BACKUP');?>
+                                                    <?php print _('BACKUP');?> 
                                                 </p>
                                                 <p class="nav-counters" style="decoration: none;">
                                                     <?php print _('backups');?>: <? echo $panel[$user]['U_BACKUPS']?><br>