Răsfoiți Sursa

Add v-change-web-domain-docroot

* User can set domain to load document root from another domain under their account.
* A path outside of public_html can optionally be specified.
* Reset docroot to default by specifying 'default' instead of the target domain when running command.
Kristan Kenney 5 ani în urmă
părinte
comite
704b21ea8d

+ 3 - 0
CHANGELOG.md

@@ -3,9 +3,11 @@ All notable changes to this project will be documented in this file.
 
 ## [CURRENT] - Development
 ### Features
+- Added support for parking domains (specifying a custom document root folder). See `v-change-web-domain-docroot` for details.
 
 ### Bugfixes
 - Create mailhelo.conf if it doesnt exist to prevent a error message during grep.
+- Fixed an issue where document root value was not displayed when running `v-list-web-domains`.
  
 ## [1.2.1] - Service Release 1 (beta)
 ### Features
@@ -28,6 +30,7 @@ All notable changes to this project will be documented in this file.
 - Improved German translations (thanks **@ronald-at**)
 - Improved Russian translations (thanks **@Pleskan**)
 
+
 ## [1.2.0] - Major Release (Feature / Quality Update)
 ### Features
 - **NOTE:** Debian 8 is no longer supported as it has reached EOL (end-of-life) status.

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

@@ -169,7 +169,7 @@ time=$(echo "$time_n_date" |cut -f 1 -d \ )
 date=$(echo "$time_n_date" |cut -f 2 -d \ )
 
 # Adding domain in web.conf
-echo "DOMAIN='$domain' IP='$ip' IP6='' ALIAS='$ALIAS' TPL='$WEB_TEMPLATE'\
+echo "DOMAIN='$domain' IP='$ip' IP6='' CUSTOM_DOCROOT='' ALIAS='$ALIAS' TPL='$WEB_TEMPLATE'\
  SSL='no' SSL_FORCE='no' SSL_HOME='same' LETSENCRYPT='no' FTP_USER='' FTP_MD5=''\
  BACKEND='$BACKEND_TEMPLATE' PROXY='$PROXY_TEMPLATE' PROXY_EXT='$PROXY_EXT'\
  STATS='' STATS_USER='' STATS_CRYPT='' U_DISK='0' U_BANDWIDTH='0'\

+ 8 - 0
bin/v-add-web-domain-backend

@@ -41,6 +41,7 @@ check_hestia_demo_mode
 
 # Defining pool directory
 prepare_web_backend
+get_domain_values 'web'
 
 # Checking backend configuration
 if [ -e "$pool/$backend_type.conf" ]; then
@@ -65,6 +66,13 @@ cat $WEBTPL/$WEB_BACKEND/$template.tpl |\
         -e "s|%backend%|$backend_type|g"\
         -e "s|%backend_version%|$backend_version|g" > $pool/$backend_type.conf
 
+# Set correct document root path
+if [ ! -z "$CUSTOM_DOCROOT" ]; then
+    docroot="$CUSTOM_DOCROOT"
+    sed -i "s|/home\/$user\/web\/$domain\/public_html|$docroot|g"  $pool/$backend_type.conf
+else
+    docroot="$HOMEDIR/$user/web/$domain/public_html/"
+fi
 
 #----------------------------------------------------------#
 #                       Hestia                             #

+ 11 - 3
bin/v-change-web-domain-backend-tpl

@@ -39,6 +39,7 @@ is_object_unsuspended 'user' 'USER' "$user"
 is_object_valid 'web' 'DOMAIN' "$domain"
 is_object_unsuspended 'web' 'DOMAIN' "$domain"
 is_backend_template_valid $template
+get_domain_values 'web'
 
 # Perform verification if read-only mode is enabled
 check_hestia_demo_mode
@@ -48,11 +49,12 @@ check_hestia_demo_mode
 #                       Action                             #
 #----------------------------------------------------------#
 
-prepare_web_backend
-
-# Deleting backend
+# Deleting current backend
 delete_web_backend
 
+# Prepare new backend configuration
+prepare_web_backend
+
 # Allocating backend port
 backend_port=9000
 ports=$(grep -v '^;' $pool/* 2>/dev/null |grep listen |grep -o :[0-9].*)
@@ -72,6 +74,12 @@ cat $WEBTPL/$WEB_BACKEND/$template.tpl |\
         -e "s|%backend%|$backend_type|g"\
         -e "s|%backend_version%|$backend_version|g" > $pool/$backend_type.conf
 
+# Set correct document root path
+if [ ! -z "$CUSTOM_DOCROOT" ]; then
+    docroot="$CUSTOM_DOCROOT"
+    sed -i "s|/home\/$user\/web\/$domain\/public_html|$docroot|g"  $pool/$backend_type.conf
+fi
+
 # Checking backend pool configuration
 if [ "$backend_type" = "$user" ]; then
     conf=$USER_DATA/web.conf

+ 112 - 0
bin/v-change-web-domain-docroot

@@ -0,0 +1,112 @@
+#!/bin/bash
+# info: Changes the document root for an existing web domain
+
+# options: USER DOMAIN TARGET_DOMAIN [DIRECTORY]
+# example usage:
+# add custom docroot:    v-change-web-domain-docroot admin domain.tld otherdomain.tld
+#                        points domain.tld to otherdomain.tld's document root.
+#
+# remove custom docroot: v-change-web-domain-docroot admin test.local default
+#                        returns document root to default value for domain.
+
+# This call changes the document root of a chosen web domain
+# to another available domain under the user context.
+
+
+#----------------------------------------------------------#
+#                    Variable&Function                     #
+#----------------------------------------------------------#
+
+# Argument definition
+user=$1
+domain=$2
+
+# Export target domain and directory
+# so they are correctly passed through to domain.sh
+export target_domain=$3
+export target_directory=$4
+
+# Includes
+source $HESTIA/func/main.sh
+source $HESTIA/func/domain.sh
+source $HESTIA/conf/hestia.conf
+
+# Additional argument formatting
+format_domain
+
+#----------------------------------------------------------#
+#                    Verifications                         #
+#----------------------------------------------------------#
+
+check_args '2' "$#" 'USER DOMAIN TARGET_DOMAIN [DIRECTORY]'
+is_system_enabled "$WEB_SYSTEM" 'WEB_SYSTEM'
+# Check to ensure that target domain is valid if we're
+# not setting the docroot value back to defaults
+if [ "$target_domain" != "default" ]; then
+    is_format_valid 'user' 'domain' 'target_domain'
+    is_object_valid 'web' 'DOMAIN' "$target_domain"
+else
+    is_format_valid 'user' 'domain'
+fi
+is_object_valid 'user' 'USER' "$user" "$user"
+is_object_unsuspended 'user' 'USER' "$user"
+is_object_valid 'web' 'DOMAIN' "$domain"
+is_object_unsuspended 'web' 'DOMAIN' "$domain"
+is_object_value_empty 'web' 'DOMAIN' "$domain" '$docroot'
+is_dir_symlink "$HOMEDIR/$user/web"
+is_dir_symlink "$HOMEDIR/$user/web/$target_domain"
+
+# Perform verification if read-only mode is enabled
+check_hestia_demo_mode
+
+#----------------------------------------------------------#
+#                       Action                             #
+#----------------------------------------------------------#
+
+# Unset existing custom document root path
+if [ ! -z "$CUSTOM_DOCROOT" ]; then
+    update_object_value 'web' 'DOMAIN' "$domain" '$CUSTOM_DOCROOT' ""
+fi
+
+# If target domain value is 'default', remove the custom document root
+# value and rebuild web domain to restore default configuration.
+# Otherwise, set target document root path accordingly based on passed values.
+if [ "$target_domain" = "default" ]; then
+    update_object_value 'web' 'DOMAIN' "$domain" '$CUSTOM_DOCROOT' ""
+else
+    # Check for existence of specified directory under target domain's public_html folder
+    if [ ! -z "$target_directory" ]; then
+        if [ ! -e "$HOMEDIR/$user/web/$target_domain/public_html/$target_directory" ]; then
+            echo "ERROR: Directory $target_directory does not exist under $HOMEDIR/$user/$target_domain/public_html/."
+            exit 1
+        else
+            CUSTOM_DOCROOT="$HOMEDIR/$user/web/$target_domain/public_html/$target_directory/"
+        fi
+    else
+        CUSTOM_DOCROOT="$HOMEDIR/$user/web/$target_domain/public_html/"
+    fi
+    add_object_key 'web' 'DOMAIN' "$domain" 'CUSTOM_DOCROOT' 'IP6'
+    update_object_value 'web' 'DOMAIN' "$domain" '$CUSTOM_DOCROOT' "$CUSTOM_DOCROOT"
+fi
+
+#----------------------------------------------------------#
+#                       Hestia                             #
+#----------------------------------------------------------#
+
+# Rebuild domain configuration
+$BIN/v-rebuild-web-domain $user $domain
+
+# Logging
+if [ "$target_domain" = "default" ]; then
+    log_history "set web domain $domain to use default document root."
+else
+    log_history "set web domain $domain to use document root from $target_domain."
+fi
+
+log_event "$OK" "$ARGUMENTS"
+
+# Unset variables
+unset target_domain
+unset target_directory
+
+exit

+ 11 - 6
bin/v-list-web-domain

@@ -23,6 +23,7 @@ json_list() {
     echo '    "'$DOMAIN'": {
         "IP": "'$IP'",
         "IP6": "'$IP6'",
+        "DOCUMENT_ROOT": "'$DOCROOT'",
         "U_DISK": "'$U_DISK'",
         "U_BANDWIDTH": "'$U_BANDWIDTH'",
         "TPL": "'$TPL'",
@@ -40,7 +41,6 @@ json_list() {
         "BACKEND": "'$BACKEND'",
         "PROXY": "'$PROXY'",
         "PROXY_EXT": "'$PROXY_EXT'",
-        "DOCUMENT_ROOT": "'$HOMEDIR/$user/web/$domain/public_html'",
         "SUSPENDED": "'$SUSPENDED'",
         "TIME": "'$TIME'",
         "DATE": "'$DATE'"
@@ -50,10 +50,10 @@ json_list() {
 
 # SHELL list function
 shell_list() {
-    source $HESTIA/conf/hestia.conf
     echo "DOMAIN:         $DOMAIN"
     echo "ALIAS:          ${ALIAS//,/ }"
     echo "IP:             $IP"
+    echo "DOCUMENT_ROOT:  $DOCROOT"
     if [ ! -z "$IP6" ]; then
         echo "IP6:            $IP6"
     fi
@@ -95,7 +95,7 @@ shell_list() {
 
 # PLAIN list function
 plain_list() {
-    echo -ne "$DOMAIN\t$IP\t$IP6\t$U_DISK\t$U_BANDWIDTH\t$TPL\t"
+    echo -ne "$DOMAIN\t$IP\t$IP6\t$DOCROOT\t$U_DISK\t$U_BANDWIDTH\t$TPL\t"
     echo -ne "$ALIAS\t$STATS\t$STATS_USER\t$SSL\t$SSL_FORCE\t$SSL_HSTS\t$SSL_HOME\t,$LETSENCRYPT"
     echo -ne "$FTP_USER\t$FTP_PATH\t$AUTH_USER\t$BACKEND\t$PROXY\t"
     echo -e "$PROXY_EXT\t$SUSPENDED\t$TIME\t$DATE"
@@ -103,10 +103,10 @@ plain_list() {
 
 # CSV list function
 csv_list() {
-    echo -n "DOMAIN,IP,IP6,U_DISK,U_BANDWIDTH,TPL,ALIAS,STATS,STATS_USER,SSL,"
+    echo -n "DOMAIN,IP,IP6,DOCROOT,U_DISK,U_BANDWIDTH,TPL,ALIAS,STATS,STATS_USER,SSL,"
     echo -n "SSL_FORCE,SSL_HSTS,SSL_HOME,LETSENCRYPT,FTP_USER,FTP_PATH,AUTH_USER,BACKEND,PROXY,PROXY_EXT,"
     echo "SUSPENDED,TIME,DATE"
-    echo -n "$DOMAIN,$IP,$IP6,$U_DISK,$U_BANDWIDTH,$TPL,\"$ALIAS\",$STATS"
+    echo -n "$DOMAIN,$IP,$IP6,$DOCROOT,$U_DISK,$U_BANDWIDTH,$TPL,\"$ALIAS\",$STATS"
     echo -n "\"$STATS_USER\",$SSL,$SSL_FORCE,$SSL_HSTS,$SSL_HOME,$LETSENCRYPT,\"$FTP_USER\",\"$FTP_PATH\","
     echo -n "\"$AUTH_USER\",$BACKEND,$PROXY,\"$PROXY_EXT\",$SUSPENDED,$TIME,"
     echo  "$DATE"
@@ -130,6 +130,12 @@ is_object_valid 'web' 'DOMAIN' "$domain"
 # Parsing domain
 parse_object_kv_list $(grep "DOMAIN='$domain'" $USER_DATA/web.conf)
 
+if [ ! -z "$CUSTOM_DOCROOT" ]; then
+    DOCROOT="$CUSTOM_DOCROOT"
+else
+    DOCROOT="$HOMEDIR/$user/web/$DOMAIN/public_html/"
+fi
+
 # Listing data
 case $format in
     json)   json_list ;;
@@ -138,7 +144,6 @@ case $format in
     shell)  shell_list ;;
 esac
 
-
 #----------------------------------------------------------#
 #                       Hestia                             #
 #----------------------------------------------------------#

+ 25 - 4
bin/v-list-web-domains

@@ -24,9 +24,16 @@ json_list() {
     echo "{"
     while read str; do
         parse_object_kv_list "$str"
+        # Set correct document root path
+        if [ ! -z "$CUSTOM_DOCROOT" ]; then
+            DOCROOT="$CUSTOM_DOCROOT"
+        else
+            DOCROOT="$HOMEDIR/$user/web/$DOMAIN/public_html/"
+        fi
         echo -n '    "'$DOMAIN'": {
         "IP": "'$IP'",
         "IP6": "'$IP6'",
+        "DOCUMENT_ROOT": "'$DOCROOT'",
         "U_DISK": "'$U_DISK'",
         "U_BANDWIDTH": "'$U_BANDWIDTH'",
         "TPL": "'$TPL'",
@@ -72,7 +79,13 @@ plain_list() {
     IFS=$'\n'
     while read str; do
         parse_object_kv_list "$str"
-        echo -ne "$DOMAIN\t$IP\t$IP6\t$U_DISK\t$U_BANDWIDTH\t$TPL\t"
+        # Set correct document root path
+        if [ ! -z "$CUSTOM_DOCROOT" ]; then
+            DOCROOT="$CUSTOM_DOCROOT"
+        else
+            DOCROOT="$HOMEDIR/$user/web/$DOMAIN/public_html/"
+        fi
+        echo -ne "$DOMAIN\t$IP\t$IP6\t$DOCROOT\t$U_DISK\t$U_BANDWIDTH\t$TPL\t"
         echo -ne "$ALIAS\t$STATS\t$STATS_USER\t$SSL\t$SSL_HOME\t$LETSENCRYPT\t"
         echo -ne "$FTP_USER\t$FTP_PATH\t$AUTH_USER\t$BACKEND\t$PROXY\t"
         echo -e "$PROXY_EXT\t$SUSPENDED\t$TIME\t$DATE"
@@ -82,12 +95,18 @@ plain_list() {
 # CSV list function
 csv_list() {
     IFS=$'\n'
-    echo -n "DOMAIN,IP,IP6,U_DISK,U_BANDWIDTH,TPL,ALIAS,STATS,STATS_USER,"
+    echo -n "DOMAIN,IP,IP6,DOCROOT,U_DISK,U_BANDWIDTH,TPL,ALIAS,STATS,STATS_USER,"
     echo -n "SSL,SSL_HOME,LETSENCRYPT,FTP_USER,FTP_PATH,AUTH_USER,BACKEND,PROXY,"
     echo "PROXY_EXT,SUSPENDED,TIME,DATE"
     while read str; do
         parse_object_kv_list "$str"
-        echo -n "$DOMAIN,$IP,$IP6,$U_DISK,$U_BANDWIDTH,$TPL,"
+        # Set correct document root path
+        if [ ! -z "$CUSTOM_DOCROOT" ]; then
+            DOCROOT="$CUSTOM_DOCROOT"
+        else
+            DOCROOT="$HOMEDIR/$user/web/$DOMAIN/public_html/"
+        fi
+        echo -n "$DOMAIN,$IP,$IP6,$DOCROOT,$U_DISK,$U_BANDWIDTH,$TPL,"
         echo -n "\"$ALIAS\",$STATS,\"$STATS_USER\",$SSL,$SSL_HOME,$LETSENCRYPT,"
         echo -n "\"$FTP_USER\",\"$FTP_PATH\",\"$AUTH_USER\",$BACKEND,$PROXY,"
         echo "\"$PROXY_EXT\",$SUSPENDED,$TIME,$DATE"
@@ -113,9 +132,11 @@ case $format in
     json)   json_list ;;
     plain)  plain_list ;;
     csv)    csv_list ;;
-    shell)  shell_list |column -t ;;
+    shell)  shell_list ;;
 esac
 
+unset docroot
+
 
 #----------------------------------------------------------#
 #                       Hestia                             #

+ 26 - 1
func/domain.sh

@@ -159,7 +159,7 @@ prepare_web_domain_values() {
     docroot="$HOMEDIR/$user/web/$domain/public_html"
     sdocroot="$docroot"
     if [ "$SSL_HOME" = 'single' ]; then
-        sdocroot="$HOMEDIR/$user/web/$domain/public_shtml" ;
+        sdocroot="$HOMEDIR/$user/web/$domain/public_shtml"
     fi
 
     if [ ! -z "$WEB_BACKEND" ]; then
@@ -179,6 +179,31 @@ prepare_web_domain_values() {
     if [ ! -e "$USER_DATA/ssl/$domain.ca" ]; then
         ssl_ca_str='#'
     fi
+
+    # Set correct document root
+    if [ ! -z "$CUSTOM_DOCROOT" ]; then
+        # Custom document root has been set by the user, import from configuration
+        custom_docroot="$CUSTOM_DOCROOT"
+        docroot="$custom_docroot"
+        sdocroot="$docroot"
+    elif [ ! -z "$CUSTOM_DOCROOT" ] && [ ! -z "$target_directory" ]; then
+        # Custom document root has been specified with a different target than public_html
+        if [ -d "$HOMEDIR/$user/web/$target_domain/public_html/$target_directory/" ]; then
+            custom_docroot="$HOMEDIR/$user/web/$target_domain/public_html/$target_directory"
+            docroot="$custom_docroot"
+            sdocroot="$docroot"
+        fi
+    elif [ ! -z "$CUSTOM_DOCROOT" ] && [ -z "$target_directory" ]; then
+        # Set custom document root to target domain's public_html folder
+        custom_docroot="$HOMEDIR/$user/web/$target_domain/public_html"
+        docroot="$custom_docroot"
+        sdocroot="$docroot"
+    else
+        # No custom document root specified, use default
+        docroot="$HOMEDIR/$user/web/$domain/public_html"
+        sdocroot="$docroot"
+    fi
+
     if [ "$SUSPENDED" = 'yes' ]; then
         docroot="$HESTIA/data/templates/web/suspend"
         sdocroot="$HESTIA/data/templates/web/suspend"