Просмотр исходного кода

Merge remote-tracking branch 'origin/main' into feature/osal

Ernesto Nicolás Carrea 5 лет назад
Родитель
Сommit
45e8ced991
100 измененных файлов с 1540 добавлено и 468 удалено
  1. 23 4
      CHANGELOG.md
  2. 1 1
      README.md
  3. 0 1
      bin/v-add-mail-domain-ssl
  4. 0 1
      bin/v-add-sys-webmail
  5. 3 0
      bin/v-add-user
  6. 2 2
      bin/v-add-user-2fa
  7. 1 1
      bin/v-add-web-domain
  8. 11 3
      bin/v-add-web-domain-backend
  9. 1 1
      bin/v-add-web-domain-ssl
  10. 1 1
      bin/v-add-web-domain-stats
  11. 5 3
      bin/v-change-user-package
  12. 2 6
      bin/v-change-user-php-cli
  13. 11 3
      bin/v-change-web-domain-backend-tpl
  14. 112 0
      bin/v-change-web-domain-docroot
  15. 1 1
      bin/v-delete-dns-domain
  16. 1 1
      bin/v-delete-mail-domain-dkim
  17. 2 2
      bin/v-delete-user-2fa
  18. 1 1
      bin/v-delete-web-domain-stats-user
  19. 37 30
      bin/v-list-sys-config
  20. 12 4
      bin/v-list-sys-services
  21. 12 6
      bin/v-list-web-domain
  22. 25 4
      bin/v-list-web-domains
  23. 1 5
      bin/v-rebuild-users
  24. 1 1
      bin/v-search-domain-owner
  25. 2 2
      bin/v-update-web-domain-stat
  26. 26 1
      func/domain.sh
  27. 19 0
      func/main.sh
  28. 11 1
      func/rebuild.sh
  29. 570 228
      func/upgrade.sh
  30. 1 1
      install/deb/filemanager/filegator/configuration.php
  31. 1 1
      install/deb/templates/web/awstats/index.tpl
  32. 3 3
      install/deb/templates/web/awstats/nav.tpl
  33. 11 2
      install/hst-install-debian.sh
  34. 11 2
      install/hst-install-ubuntu.sh
  35. 46 0
      install/upgrade/upgrade.conf
  36. 0 0
      install/upgrade/versions/0.9.8-29.sh
  37. 0 13
      install/upgrade/versions/1.0.1.sh
  38. 0 0
      install/upgrade/versions/1.0.2.sh
  39. 0 0
      install/upgrade/versions/1.0.3.sh
  40. 7 0
      install/upgrade/versions/1.0.4.sh
  41. 0 0
      install/upgrade/versions/1.0.5.sh
  42. 0 0
      install/upgrade/versions/1.0.6.sh
  43. 0 8
      install/upgrade/versions/1.00.0-190618.sh
  44. 0 0
      install/upgrade/versions/1.1.0.sh
  45. 0 0
      install/upgrade/versions/1.1.1.sh
  46. 0 10
      install/upgrade/versions/1.2.0.sh
  47. 9 0
      install/upgrade/versions/1.2.1.sh
  48. 0 10
      install/upgrade/versions/1.2.2.sh
  49. 7 0
      install/upgrade/versions/1.2.3.sh
  50. 7 0
      install/upgrade/versions/1.3.0.sh
  51. 0 22
      install/upgrade/versions/previous/1.0.4.sh
  52. 0 17
      install/upgrade/versions/previous/1.2.1.sh
  53. 1 1
      src/deb/hestia/control
  54. 48 14
      src/deb/hestia/postinst
  55. 1 1
      web/add/db/index.php
  56. 1 1
      web/add/mail/index.php
  57. 1 1
      web/add/user/index.php
  58. 31 1
      web/add/web/index.php
  59. 1 1
      web/css/src/styles.css
  60. 0 0
      web/css/styles.min.css
  61. 2 2
      web/edit/db/index.php
  62. 2 2
      web/edit/mail/index.php
  63. 22 0
      web/edit/server/index.php
  64. 3 1
      web/edit/user/index.php
  65. 40 2
      web/edit/web/index.php
  66. BIN
      web/images/logo-header.png
  67. 70 0
      web/images/logo-header.svg
  68. 146 0
      web/images/logo.svg
  69. 8 4
      web/inc/i18n/ar.php
  70. 8 4
      web/inc/i18n/az.php
  71. 8 4
      web/inc/i18n/bg.php
  72. 9 4
      web/inc/i18n/bs.php
  73. 11 4
      web/inc/i18n/cn.php
  74. 4 0
      web/inc/i18n/cz.php
  75. 5 0
      web/inc/i18n/da.php
  76. 8 4
      web/inc/i18n/de.php
  77. 8 4
      web/inc/i18n/el.php
  78. 4 0
      web/inc/i18n/en.php
  79. 6 0
      web/inc/i18n/es.php
  80. 5 0
      web/inc/i18n/fa.php
  81. 4 0
      web/inc/i18n/fi.php
  82. 6 2
      web/inc/i18n/fr.php
  83. 4 0
      web/inc/i18n/hr.php
  84. 4 0
      web/inc/i18n/hu.php
  85. 4 0
      web/inc/i18n/id.php
  86. 8 4
      web/inc/i18n/it.php
  87. 4 0
      web/inc/i18n/ja.php
  88. 4 0
      web/inc/i18n/ka.php
  89. 4 0
      web/inc/i18n/ko.php
  90. 4 0
      web/inc/i18n/nl.php
  91. 4 0
      web/inc/i18n/no.php
  92. 4 0
      web/inc/i18n/pl.php
  93. 4 0
      web/inc/i18n/pt-BR.php
  94. 4 0
      web/inc/i18n/pt.php
  95. 4 0
      web/inc/i18n/ro.php
  96. 8 4
      web/inc/i18n/ru.php
  97. 4 0
      web/inc/i18n/se.php
  98. 4 0
      web/inc/i18n/sr.php
  99. 4 0
      web/inc/i18n/th.php
  100. 4 0
      web/inc/i18n/tr.php

+ 23 - 4
CHANGELOG.md

@@ -1,9 +1,27 @@
 # Changelog
 All notable changes to this project will be documented in this file.
 
-## [CURRENT] - Development
+## [1.3.0] - Major Release (Feature / Quality Update)
 ### Features
-- Use stronger ciphers and Disable TLS v1.1 for vsftpd.
+- Users can now choose to point a domain to a different document root (similar to domain parking).
+- The software update procedure will now perform a system health check prior to installation and repair missing environment variables.
+- Administrators now have control over software update notifications through the following settings in `$HESTIA/conf/hestia.conf` and through the Control Panel web interface:
+    - `UPGRADE_SEND_EMAIL` = Sends an email notification to admin email address
+    - `UPGRADE_SEND_EMAIL_LOG` = Sends installation log output to admin email address
+- Upgrade process will now save logs to the `hst_backups` directory.
+
+## Bugfixes
+
+## [1.2.3] - Service Release
+### Features
+- No new features have been introduced in this release.
+
+### Bugfixes
+- Fixes an issue where non-ASCII characters were rejected in the password field.
+
+## [1.2.2] - Service Release
+### Features
+- No new features have been introduced in this release.
 
 ### Bugfixes
 - Create mailhelo.conf if it doesnt exist to prevent a error message during grep.
@@ -20,8 +38,10 @@ All notable changes to this project will be documented in this file.
 - Reworked the Let's Encrypt renew functionality to skip removed aliases.
 - Improved reliability of list handling when using IP lists.
 - Enforce minimum password requirements with visual indication of password strength.
+- Fixed an issue where user display name value was incorrectly set when changing packages.
 - Improved installer version detection.
- 
+- Improved detection of MariaDB and MySQL services.
+
 ## [1.2.1] - Service Release
 ### Features
 - Consolidated First and Last Name fields to a singular name field to simply input.
@@ -61,7 +81,6 @@ All notable changes to this project will be documented in this file.
 - Added BATS system for testing the functionality of Bash scripts (WIP).
 - Added **v-change-sys-db-alias** to change phpMyAdmin and phpPgAdmin access points (`v-change-sys-db-alias pma/pga myCustomURL`).
 
-
 ### Bugfixes
 - Prevent ability to change the password of a non-Hestia user account. Thanks to **Alexandre Zanni**!
 - Adjust Let's Encrypt validation check for IDN domains, thanks to **@zanami**!

+ 1 - 1
README.md

@@ -2,7 +2,7 @@
 
 [Hestia Control Panel](https://www.hestiacp.com/)
 ==================================================
-**Latest stable release:** Version 1.2.1 | [View Changelog](https://github.com/hestiacp/hestiacp/blob/release/CHANGELOG.md)<br>
+**Latest stable release:** Version 1.2.3 | [View Changelog](https://github.com/hestiacp/hestiacp/blob/release/CHANGELOG.md)<br>
 
 **Web:** [www.hestiacp.com](https://www.hestiacp.com/)<br>
 **Documentation:** [docs.hestiacp.com](https://docs.hestiacp.com/)<br>

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

@@ -28,7 +28,6 @@ if [[ "$domain" =~ .*\.$ ]]; then
     domain=$(echo "$domain" |sed -e "s/\.$//")
 fi
 
-domain=$(idn -t --quiet -u "$domain" )
 domain_idn=$(idn -t --quiet -a "$domain")
 
 # Includes

+ 0 - 1
bin/v-add-sys-webmail

@@ -26,7 +26,6 @@ if [[ "$domain" =~ .*\.$ ]]; then
     domain=$(echo "$domain" |sed -e "s/\.$//")
 fi
 
-domain=$(idn -t --quiet -u "$domain" )
 domain_idn=$(idn -t --quiet -a "$domain")
 
 # Includes

+ 3 - 0
bin/v-add-user

@@ -183,6 +183,9 @@ CONTACT='$email'
 CRON_REPORTS='yes'
 MD5='$(awk -v user=$user -F : 'user == $1 {print $2}' /etc/shadow)'
 RKEY='$(generate_password)'
+TWOFA=''
+QRCODE=''
+PHPCLI=''
 SUSPENDED='no'
 SUSPENDED_USERS='0'
 SUSPENDED_WEB='0'

+ 2 - 2
bin/v-add-user-2fa

@@ -51,8 +51,8 @@ secret=${array[0]}
 qrcode=${array[1]}
 
 # Save the secret in user config (needs encryption?)
-sed -i "/RKEY/a TWOFA='$secret'" $USER_DATA/user.conf
-sed -i "/TWOFA/a QRCODE='$qrcode'" $USER_DATA/user.conf
+update_user_value "$user" '$TWOFA' "$secret"
+update_user_value "$user" '$QRCODE' "$qrcode"
 
 #----------------------------------------------------------#
 #                       Hestia                             #

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

@@ -170,7 +170,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'\

+ 11 - 3
bin/v-add-web-domain-backend

@@ -41,11 +41,12 @@ check_hestia_demo_mode
 
 # Defining pool directory
 prepare_web_backend
+get_domain_values 'web'
 
 # Checking backend configuration
-if [ -e "$pool/$backend_type.conf" ]; then
-    exit
-fi
+#if [ -e "$pool/$backend_type.conf" ]; then
+#    exit
+#fi
 
 # Allocating backend port
 backend_port=9000
@@ -66,6 +67,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                             #

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

@@ -32,7 +32,7 @@ if [[ "$domain" =~ .*\.$ ]]; then
     domain=$(echo "$domain" |sed -e "s/\.$//")
 fi
 
-domain=$(idn -t --quiet -u "$domain" )
+domain=$domain
 domain_idn=$(idn -t --quiet -a "$domain")
 
 # Includes

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

@@ -76,7 +76,7 @@ cat $WEBTPL/$type/$type.tpl |\
         -e "s|%user%|$user|g" \
         -e "s|%apache_group%|$WEB_RGROUPS|g"\
         -e "s|%home%|$HOMEDIR|g" \
-        -e "s|%alias%|${aliases//,/ }|g" \
+        -e "s|%alias%|$stats_alias|g" \
         -e "s|%alias_idn%|$stats_alias|g" \
     > $HOMEDIR/$user/conf/web/$domain/$type.conf
 

+ 5 - 3
bin/v-change-user-package

@@ -78,8 +78,7 @@ is_package_avalable() {
 change_user_package() {
     eval $(cat $USER_DATA/user.conf)
     eval $(cat $HESTIA/data/packages/$package.pkg |egrep -v "TIME|DATE")
-    echo "FNAME='$FNAME'
-LNAME='$LNAME'
+    echo "NAME='$NAME'
 PACKAGE='$package'
 WEB_TEMPLATE='$WEB_TEMPLATE'
 BACKEND_TEMPLATE='$BACKEND_TEMPLATE'
@@ -102,6 +101,9 @@ CONTACT='$CONTACT'
 CRON_REPORTS='$CRON_REPORTS'
 MD5='$MD5'
 RKEY='$RKEY'
+TWOFA='$TWOFA'
+QRCODE='$QRCODE'
+PHPCLI='$PHPCLI'
 SUSPENDED='$SUSPENDED'
 SUSPENDED_USERS='$SUSPENDED_USERS'
 SUSPENDED_WEB='$SUSPENDED_WEB'
@@ -166,7 +168,7 @@ shell=$(grep -w "$shell_conf" /etc/shells |head -n1)
 
 # Run template trigger
 if [ -x "$HESTIA/data/packages/$package.sh" ]; then
-    $HESTIA/data/packages/$package.sh "$user" "$CONTACT" "$FNAME" "$LNAME"
+    $HESTIA/data/packages/$package.sh "$user" "$CONTACT" "$NAME"
 fi
 
 # Update disk quota

+ 2 - 6
bin/v-change-user-php-cli

@@ -62,12 +62,8 @@ sed -i "/alias php='env/d" "$FILE"
 
 echo "alias php='env php$version'" >> $FILE
 
-# Change language
-if [ -z "$(grep PHPCLI $USER_DATA/user.conf)" ]; then
-    sed -i "s/^TIME/PHPCLI='$version'\nTIME/g" $USER_DATA/user.conf
-else
-    update_user_value "$user" '$PHPCLI' "$version"
-fi
+update_user_value "$user" '$PHPCLI' "$version"
+
 
 #----------------------------------------------------------#
 #                       Hestia                             #

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

@@ -40,6 +40,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
@@ -49,11 +50,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].*)
@@ -74,6 +76,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

+ 1 - 1
bin/v-delete-dns-domain

@@ -12,7 +12,7 @@
 
 # Argument definition
 user=$1
-domain=$(idn -t --quiet -u "$2" )
+domain=$2
 restart="$3"
 
 # Includes

+ 1 - 1
bin/v-delete-mail-domain-dkim

@@ -11,7 +11,7 @@
 
 # Argument definition
 user=$1
-domain=$(idn -t --quiet -u "$2" )
+domain=$2
 domain=$(echo $domain | tr '[:upper:]' '[:lower:]')
 
 # Includes

+ 2 - 2
bin/v-delete-user-2fa

@@ -43,8 +43,8 @@ if [ -z "$TWOFA" ]; then
 fi
 
 # Remove 2FA from user config
-sed -i '/TWOFA=/d' $USER_DATA/user.conf
-sed -i '/QRCODE=/d' $USER_DATA/user.conf
+update_user_value "$user" '$TWOFA' ""
+update_user_value "$user" '$QRCODE' ""
 
 #----------------------------------------------------------#
 #                       Hestia                             #

+ 1 - 1
bin/v-delete-web-domain-stats-user

@@ -14,7 +14,7 @@
 
 # Argument definition
 user=$1
-domain=$(idn -t --quiet -u "$2" )
+domain=$2
 restart=$3
 
 # Includes

+ 37 - 30
bin/v-list-sys-config

@@ -12,6 +12,7 @@
 # Argument definition
 format=${1-shell}
 
+source $HESTIA/func/main.sh
 source $HESTIA/conf/hestia.conf
 
 # JSON list function
@@ -45,6 +46,8 @@ json_list() {
         "REPOSITORY": "'$REPOSITORY'",
         "VERSION": "'$VERSION'",
         "RELEASE_BRANCH": "'$RELEASE_BRANCH'",
+        "UPGRADE_SEND_EMAIL": "'$UPGRADE_SEND_EMAIL'",
+        "UPGRADE_SEND_EMAIL_LOG": "'$UPGRADE_SEND_EMAIL_LOG'",
         "DEMO_MODE": "'$DEMO_MODE'",
         "THEME": "'$THEME'",
         "LANGUAGE": "'$LANGUAGE'",
@@ -61,24 +64,24 @@ json_list() {
 # Shell list
 shell_list() {
     if [ ! -z "$WEB_SYSTEM" ]; then
-        echo "WEB Server:       $WEB_SYSTEM:$WEB_PORT ($WEB_RGROUPS)"
-        echo "SSL Support:      $WEB_SSL:$WEB_SSL_PORT"
+        echo "Web Server:                       $WEB_SYSTEM:$WEB_PORT ($WEB_RGROUPS)"
+        echo "SSL Support:                      $WEB_SSL:$WEB_SSL_PORT"
     fi
     if [ ! -z "$WEB_BACKEND" ]; then
-        echo "WEB Backend:      $WEB_BACKEND"
+        echo "Web Backend:                      $WEB_BACKEND"
     fi
     if [ ! -z "$PROXY_SYSTEM" ]; then
-        echo "Proxy Server:     $PROXY_SYSTEM:$PROXY_PORT"
-        echo "Proxy SSL:        $PROXY_SYSTEM:$PROXY_SSL_PORT"
+        echo "Proxy Server:                     $PROXY_SYSTEM:$PROXY_PORT"
+        echo "Proxy SSL:                        $PROXY_SYSTEM:$PROXY_SSL_PORT"
     fi
     if [ ! -z "$STATS_SYSTEM" ]; then
-        echo "Web Stats:        ${STATS_SYSTEM//,/, }"
+        echo "Statistics Engine:                ${STATS_SYSTEM//,/, }"
     fi
     if [ ! -z "$FTP_SYSTEM" ]; then
-        echo "FTP Server:       $FTP_SYSTEM"
+        echo "FTP Server:                       $FTP_SYSTEM"
     fi
     if [ ! -z "$MAIL_SYSTEM" ]; then
-        echo -n "Mail Server:      $MAIL_SYSTEM"
+        echo -n "Mail Server:                      $MAIL_SYSTEM"
         if [ ! -z "$IMAP_SYSTEM" ]; then
             echo -n " + $IMAP_SYSTEM"
         fi
@@ -90,56 +93,56 @@ shell_list() {
         fi
         echo
         if [ ! -z "$WEBMAIL_ALIAS" ]; then
-            echo "Webmail alias:    $WEBMAIL_ALIAS"
+            echo "Webmail alias:                    $WEBMAIL_ALIAS"
         fi
     fi
     if [ ! -z "$DB_SYSTEM" ]; then
-        echo "Database:         ${DB_SYSTEM//,/, }"
+        echo "Database:                         ${DB_SYSTEM//,/, }"
         if [ ! -z "$DB_PMA_ALIAS" ]; then
-            echo "PMA ALIAS:          $DB_PMA_ALIAS"
+            echo "phpMyAdmin Alias:                 $DB_PMA_ALIAS"
         fi
         if [ ! -z "$DB_PGA_ALIAS" ]; then
-            echo "PGA ALIAS:          $DB_PGA_ALIAS"
+            echo "phpPgAdmin Alias:                 $DB_PGA_ALIAS"
         fi
     fi
     if [ ! -z "$DNS_SYSTEM" ]; then
-        echo -n "DNS server:       $DNS_SYSTEM"
+        echo -n "DNS Server:                       $DNS_SYSTEM"
         if [ ! -z "$DNS_CLUSTER" ]; then
             echo -n " (cluster)"
         fi
         echo
     fi
     if [ ! -z "$CRON_SYSTEM" ]; then
-        echo "CRON:             $CRON_SYSTEM"
+        echo "CRON daemon:                      $CRON_SYSTEM"
     fi
     if [ ! -z "$FIREWALL_SYSTEM" ]; then
-        echo -n "Firewall:         $FIREWALL_SYSTEM"
+        echo -n "Firewall:                         $FIREWALL_SYSTEM"
         if [ ! -z "$FIREWALL_EXTENSION" ]; then
             echo -n "+ $FIREWALL_EXTENSION"
         fi
         echo
     fi
     if [ ! -z "$BACKUP_SYSTEM" ]; then
-        echo "Backups:          ${BACKUP_SYSTEM//,/, }"
-        if [ ! -z "$BACKUP" ]; then
-            echo "Backup Dir:         $BACKUP"
-        fi
+        echo "Backups:                          ${BACKUP_SYSTEM//,/, }"
+        echo "Backup Directory:                 $BACKUP"
     fi
     if [ ! -z "$DISK_QUOTA" ]; then
-        echo "Disk Quota:       $DISK_QUOTA"
+        echo "Disk Quota enabled:               $DISK_QUOTA"
     fi
     if [ ! -z "$LANGUAGE" ] && [ "$LANGUAGE" != 'en' ]; then
-        echo "Language:         $LANGUAGE"
+        echo "System Language:                  $LANGUAGE"
     fi
-    echo "Version:          $VERSION"
+    echo "Version:                          $VERSION"
     if [ ! -z "$DEMO_MODE" ]; then
-        echo "Demo Mode:        $DEMO_MODE"
+        echo "Demo Mode:                        $DEMO_MODE"
     fi
     if [ ! -z "$FILE_MANAGER" ]; then
-        echo "File Manager:        $FILE_MANAGER"
+        echo "File Manager enabled:             $FILE_MANAGER"
     fi
-    echo "Release Branch:   $RELEASE_BRANCH"
-    echo "Theme:            $THEME"
+    echo "Release Branch:                   $RELEASE_BRANCH"
+    echo "Theme:                            $THEME"
+    echo "Updates: Notify by email:         $UPGRADE_SEND_EMAIL"
+    echo "Updates: Email install log:       $UPGRADE_SEND_EMAIL_LOG"
 }
 
 # PLAIN list function
@@ -150,8 +153,9 @@ plain_list() {
     echo -ne "$ANTIVIRUS_SYSTEM\t$ANTISPAM_SYSTEM\t$DB_SYSTEM\t"
     echo -ne "$DNS_SYSTEM\t$DNS_CLUSTER\t$STATS_SYSTEM\t$BACKUP_SYSTEM\t"
     echo -ne "$CRON_SYSTEM\t$DISK_QUOTA\t$FIREWALL_SYSTEM\t$FIREWALL_EXTENSION\t"
-    echo -ne "$FILE_MANAGER\t$REPOSITORY\t$VERSION\t$DEMO_MODE\t$RELEASE_BRANCH\t$THEME\t"
-    echo -e "$LANGUAGE\t$BACKUP_GZIP\t$BACKUP\t$WEBMAIL_ALIAS\t$DB_PMA_URL\t$DB_PGA_URL"
+    echo -ne "$FILE_MANAGER\t$REPOSITORY\t$VERSION\t$DEMO_MODE\t$RELEASE_BRANCH\t"
+    echo -ne "$UPGRADE_SEND_EMAIL\t$UPGRADE_SEND_EMAIL_LOG\t$THEME\t$LANGUAGE\t$BACKUP_GZIP\t"
+    echo -e  "$BACKUP\t$WEBMAIL_ALIAS\t$DB_PMA_URL\t$DB_PGA_URL"
 }
 
 
@@ -164,7 +168,9 @@ csv_list() {
     echo -n "'DNS_SYSTEM','DNS_CLUSTER','STATS_SYSTEM','BACKUP_SYSTEM',"
     echo -n "'CRON_SYSTEM','DISK_QUOTA','FIREWALL_SYSTEM',"
     echo -n "'FIREWALL_EXTENSION','FILE_MANAGER','REPOSITORY',"
-    echo -n "'VERSION','LANGUAGE','BACKUP_GZIP','BACKUP','WEBMAIL_ALIAS',"
+    echo -n "'VERSION','DEMO_MODE','RELEASE_BRANCH',"
+    echo -n "'UPGRADE_SEND_EMAIL','UPGRADE_SEND_EMAIL_LOG',"
+    echo -n "'THEME', 'LANGUAGE','BACKUP_GZIP','BACKUP','WEBMAIL_ALIAS',"
     echo -n "'DB_PMA_ALIAS','DB_PGA_ALIAS'"
     echo
     echo -n "'$WEB_SYSTEM','$WEB_RGROUPS','$WEB_PORT','$WEB_SSL',"
@@ -173,7 +179,8 @@ csv_list() {
     echo -n "'$ANTIVIRUS_SYSTEM','$ANTISPAM_SYSTEM','$DB_SYSTEM','$DNS_SYSTEM',"
     echo -n "'$DNS_CLUSTER','$STATS_SYSTEM','$BACKUP_SYSTEM','$CRON_SYSTEM',"
     echo -n "'$DISK_QUOTA','$FIREWALL_SYSTEM','$FIREWALL_EXTENSION','$FILE_MANAGER',"
-    echo -n "'$REPOSITORY', '$VERSION','$DEMO_MODE','$RELEASE_BRANCH','$THEME','$LANGUAGE',"
+    echo -n "'$REPOSITORY', '$VERSION','$DEMO_MODE','$RELEASE_BRANCH',"
+    echo -n "'$UPGRADE_SEND_EMAIL','$UPGRADE_SEND_EMAIL_LOG','$THEME','$LANGUAGE',"
     echo -n "'$BACKUP_GZIP','$BACKUP','$WEBMAIL_ALIAS','$DB_PMA_URL','$DB_PGA_URL'"
     echo
 }

+ 12 - 4
bin/v-list-sys-services

@@ -221,16 +221,24 @@ fi
 # Checking DB system
 if [ ! -z "$DB_SYSTEM" ] && [ "$DB_SYSTEM" != 'remote' ]; then
     for db in ${DB_SYSTEM//,/ }; do
-        proc_name=''
         service="$db"
+        proc_name=''
         if [ "$service" = 'mysql' ]; then
-            if [ -d "/etc/sysconfig" ]; then
-                service='mysqld'
+            if [ -e "/lib/systemd/system/mariadb.service" ]; then
+                service='mariadb'
                 proc_name='mysqld'
-                if [ -e "/usr/lib/systemd/system/mariadb.service" ]; then
+            fi
+            if [ -f /usr/bin/mysqladmin ]; then
+                mariadb_v=`mysqladmin --version | awk 'NR==1{print $5}' | head -c 4`
+                if [ $mariadb_v = "10.5" ]; then
                     service='mariadb'
+                    proc_name='mariadbd'
                 fi
             fi
+            if [ -d "/etc/sysconfig" ]; then
+                service='mysqld'
+                proc_name='mysqld'
+            fi
         fi
         if [ "$service" == 'pgsql' ]; then
             service='postgresql'

+ 12 - 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,7 @@ json_list() {
         "BACKEND": "'$BACKEND'",
         "PROXY": "'$PROXY'",
         "PROXY_EXT": "'$PROXY_EXT'",
-        "DOCUMENT_ROOT": "'$HOMEDIR/$user/web/$domain/public_html'",
+        "CUSTOM_DOCROOT": "'$CUSTOM_DOCROOT'",
         "SUSPENDED": "'$SUSPENDED'",
         "TIME": "'$TIME'",
         "DATE": "'$DATE'"
@@ -50,10 +51,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 +96,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 +104,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 +131,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 +145,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                             #

+ 1 - 5
bin/v-rebuild-users

@@ -1,6 +1,6 @@
 #!/bin/bash
 # info: rebuild system user
-# options: USER [RESTART]
+# options: [RESTART]
 #
 # The function rebuilds system user accounts.
 
@@ -24,10 +24,6 @@ export PATH=$PATH:/usr/sbin
 #                    Verifications                         #
 #----------------------------------------------------------#
 
-check_args '1' "$#" 'USER [RESTART]'
-is_format_valid 'user'
-is_object_valid 'user' 'USER' "$user"
-is_object_unsuspended 'user' 'USER' "$user"
 
 
 #----------------------------------------------------------#

+ 1 - 1
bin/v-search-domain-owner

@@ -10,7 +10,7 @@
 #----------------------------------------------------------#
 
 # Argument definition
-domain=$(idn -t --quiet -u "$1" )
+domain=$1
 type=${2-any}
 
 # Includes

+ 2 - 2
bin/v-update-web-domain-stat

@@ -81,8 +81,8 @@ build_awstats() {
     fi
 
     # Logo check
-    if [ ! -e "$dir/logo.png" ]; then
-        cp -r $HESTIA/web/images/logo.png $dir/
+    if [ ! -e "$dir/logo.svg" ]; then
+        cp -r $HESTIA/web/images/logo.svg $dir/
     fi
 
     # Icon directory check

+ 26 - 1
func/domain.sh

@@ -162,7 +162,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
@@ -182,6 +182,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"

+ 19 - 0
func/main.sh

@@ -47,6 +47,25 @@ E_RRD=18
 E_UPDATE=19
 E_RESTART=20
 
+# Detect operating system
+detect_os() {
+    if [ -e "/etc/os-release" ]; then
+        get_os_type=$(grep "^ID=" /etc/os-release | cut -f 2 -d '=')
+        if [ "$get_os_type" = "ubuntu" ]; then
+            if [ -e '/usr/bin/lsb_release' ]; then
+                OS_VERSION="$(lsb_release -s -r)"
+                OS_TYPE='Ubuntu'            
+            fi
+        elif [ "$get_os_type" = "debian" ]; then
+            OS_TYPE='Debian'
+            OS_VERSION=$(cat /etc/debian_version|grep -o "[0-9]\{1,2\}"|head -n1)
+        fi
+    else
+        OS_TYPE="Unsupported OS"
+        OS_VERSION="Unknown"
+    fi
+}
+
 # Generate time stamp
 new_timestamp() {
     time_n_date=$(date +'%T %F')

+ 11 - 1
func/rebuild.sh

@@ -17,10 +17,20 @@ rebuild_user_conf() {
     # Update FNAME LNAME to NAME
     if [ -z "$NAME" ]; then 
         NAME="$FNAME $LNAME"
+        if [ -z $FNAME ]; then NAME=""; fi
+        
         sed -i "s/FNAME='$FNAME'/NAME='$NAME'/g" $USER_DATA/user.conf
         sed -i "/LNAME='$LNAME'/d" $USER_DATA/user.conf  
     fi
-
+    if [ -z "${TWOFA+x}" ]; then 
+        sed -i "/RKEY/a TWOFA=''" $USER_DATA/user.conf 
+    fi
+    if [ -z "${QRCODE+x}" ]; then
+        sed -i "/TWOFA/a QRCODE=''" $USER_DATA/user.conf 
+    fi
+    if [ -z "${PHPCLI+x}" ]; then 
+        sed -i "/QRCODE/a PHPCLI=''" $USER_DATA/user.conf 
+    fi
     # Run template trigger
     if [ -x "$HESTIA/data/packages/$PACKAGE.sh" ]; then
         $HESTIA/data/packages/$PACKAGE.sh "$user" "$CONTACT" "$NAME"

+ 570 - 228
func/upgrade.sh

@@ -6,64 +6,318 @@
 #######                Functions & Initialization             #######
 #####################################################################
 
+is_debug_build() {
+    if [[ "$new_version" =~ "alpha" ]] || [[ "$new_version" =~ "beta" ]]; then
+        DEBUG_MODE="true"
+    fi
+
+    # Remove pre-release designation tags from display version
+    DISPLAY_VER=$(echo $new_version | sed "s|~alpha||g" | sed "s|~beta||g")
+}
+
+upgrade_health_check() {
+    echo "============================================================================="
+    echo "[ ! ] Performing system health check before proceeding with installation...  "
+    # Perform basic health check against hestia.conf to ensure that
+    # system variables exist and are set to expected defaults.
+
+    if [ -z "$VERSION" ]; then
+        export VERSION="1.1.0"
+        $BIN/v-change-sys-config-value 'VERSION' "$VERSION"
+        echo
+        echo "[ ! ] Unable to detect installed version of Hestia Control Panel."
+        echo "      Setting default version to $VERSION and processing upgrade steps."
+        echo
+    fi
+
+    # Release branch
+    if [ -z "$RELEASE_BRANCH" ]; then
+        echo "[ ! ] Adding missing variable to hestia.conf: RELEASE_BRANCH ('release')"
+        $BIN/v-change-sys-config-value 'RELEASE_BRANCH' 'release'
+    fi
+
+    # Webmail alias
+    if [ ! -z "$IMAP_SYSTEM" ]; then
+        if [ -z "$WEBMAIL_ALIAS" ]; then
+            echo "[ ! ] Adding missing variable to hestia.conf: WEBMAIL_ALIAS ('webmail')"
+            $BIN/v-change-sys-config-value 'WEBMAIL_ALIAS' 'webmail'
+        fi
+    fi
+
+    # phpMyAdmin/phpPgAdmin alias
+    if [ ! -z "$DB_SYSTEM" ]; then
+        if [ "$DB_SYSTEM" = "mysql" ]; then
+            if [ -z "$DB_PMA_ALIAS" ]; then 
+                echo "[ ! ] Adding missing variable to hestia.conf: DB_PMA_ALIAS ('phpMyAdmin')"
+                $BIN/v-change-sys-config-value 'DB_PMA_ALIAS' 'phpMyAdmin'
+            fi
+        fi
+        if [ "$DB_SYSTEM" = "pgsql" ]; then
+            if [ -z "$DB_PGA_ALIAS" ]; then 
+                echo "[ ! ] Adding missing variable to hestia.conf: DB_PGA_ALIAS ('phpPgAdmin')"
+                $BIN/v-change-sys-config-value 'DB_PGA_ALIAS' 'phpPgAdmin'
+            fi
+        fi
+    fi
+
+    # Backup compression level
+    if [ -z "$BACKUP_GZIP" ]; then 
+        echo "[ ! ] Adding missing variable to hestia.conf: BACKUP_GZIP ('9')"
+        $BIN/v-change-sys-config-value 'BACKUP_GZIP' '9'
+    fi
+
+    # Theme
+    if [ -z "$THEME" ]; then 
+        echo "[ ! ] Adding missing variable to hestia.conf: THEME ('default')"
+        $BIN/v-change-sys-theme 'default'
+    fi
+
+    # Default language
+    if [ -z "$LANGUAGE" ]; then 
+        echo "[ ! ] Adding missing variable to hestia.conf: LANGUAGE ('en')"
+        $BIN/v-change-sys-language 'en'
+    fi
+
+    # Disk Quota
+    if [ -z "$DISK_QUOTA" ]; then 
+        echo "[ ! ] Adding missing variable to hestia.conf: DISK_QUOTA ('no')"
+        $BIN/v-change-sys-config-value 'DISK_QUOTA' 'no'
+    fi
+
+    # CRON daemon
+    if [ -z "$CRON_SYSTEM" ]; then 
+        echo "[ ! ] Adding missing variable to hestia.conf: CRON_SYSTEM ('cron')"
+        $BIN/v-change-sys-config-value 'CRON_SYSTEM' 'cron'
+    fi
+
+    # Backend port
+    if [ -z "$BACKEND_PORT" ]; then 
+        echo "[ ! ] Adding missing variable to hestia.conf: BACKEND_PORT ('8083')"
+        $BIN/v-change-sys-port '8083' >/dev/null 2>&1
+    fi
+
+    # Upgrade: Send email notification
+    if [ -z "$UPGRADE_SEND_EMAIL" ]; then 
+        echo "[ ! ] Adding missing variable to hestia.conf: UPGRADE_SEND_EMAIL ('true')"
+        $BIN/v-change-sys-config-value 'UPGRADE_SEND_EMAIL' 'true'
+    fi
+
+    # Upgrade: Send email notification
+    if [ -z "$UPGRADE_SEND_EMAIL_LOG" ]; then 
+        echo "[ ! ] Adding missing variable to hestia.conf: UPGRADE_SEND_EMAIL_LOG ('false')"
+        $BIN/v-change-sys-config-value 'UPGRADE_SEND_EMAIL_LOG' 'false'
+    fi
+
+    # File Manager
+    if [ -z "$FILE_MANAGER" ]; then
+        echo "[ ! ] Adding missing variable to hestia.conf: FILE_MANAGER ('true')"
+        echo "[ ! ] File Manager is enabled but not installed, repairing components..."
+        $BIN/v-add-sys-filemanager quiet
+    fi
+    echo "[ * ] Health check complete. Starting upgrade from $VERSION to $new_version..."
+    echo "============================================================================="
+}
+
 upgrade_welcome_message() {
     echo
-    echo '                _   _           _   _        ____ ____                  '
-    echo '               | | | | ___  ___| |_(_) __ _ / ___|  _ \                 '
-    echo '               | |_| |/ _ \/ __| __| |/ _` | |   | |_) |                '
-    echo '               |  _  |  __/\__ \ |_| | (_| | |___|  __/                 '
-    echo '               |_| |_|\___||___/\__|_|\__,_|\____|_|                    '
-    echo "                                                                        "
-    echo "                  Hestia Control Panel Software Update                  "
-    echo "                            Version: $new_version                       "
-    echo "========================================================================"
+    echo '                  _   _           _   _        ____ ____                      '
+    echo '                 | | | | ___  ___| |_(_) __ _ / ___|  _ \                     '
+    echo '                 | |_| |/ _ \/ __| __| |/ _` | |   | |_) |                    '
+    echo '                 |  _  |  __/\__ \ |_| | (_| | |___|  __/                     '
+    echo '                 |_| |_|\___||___/\__|_|\__,_|\____|_|                        '
+    echo "                                                                              "
+    echo "                    Hestia Control Panel Software Update                      "
+    echo "                               Version: ${DISPLAY_VER}                         "
+    if [[ "$new_version" =~ "beta" ]]; then
+        echo "                                BETA RELEASE                               "
+    fi
+    if [[ "$new_version" =~ "alpha" ]]; then
+        echo "                            DEVELOPMENT SNAPSHOT                           "
+        echo "                      NOT INTENDED FOR PRODUCTION USE                      "
+        echo "                            USE AT YOUR OWN RISK                           "
+    fi
     echo
-    echo "[ ! ] IMPORTANT INFORMATION:                                              "
+    echo "=============================================================================="
     echo
-    echo "Default configuration files and templates may be modified or replaced   "
-    echo "during the upgrade process. You may restore these files from:           "
-    echo ""
-    echo "Backup directory: $HESTIA_BACKUP/                                       "
+    echo "[ ! ] IMPORTANT INFORMATION:                                                  "
     echo
-    echo "This process may take a few minutes, please wait...                     "
+    echo "Default configuration files and templates may be modified or replaced         "
+    echo "during the upgrade process. You may restore these files from:                 "
+    echo ""
+    echo "Backup directory: $HESTIA_BACKUP/                                             "
+    echo "Installation log: $LOG                                                        "
+}
+
+upgrade_welcome_message_log() {
+    echo "=============================================================================="
+    echo "Hestia Control Panel Software Update Log"
+    echo "=============================================================================="
     echo
-    echo "========================================================================"
+    echo "OPERATING SYSTEM:      $OS_TYPE ($OS_VERSION)"
+    echo "CURRENT VERSION:       $VERSION"
+    echo "NEW VERSION:           $new_version"
+    echo "RELEASE BRANCH:        $RELEASE_BRANCH"
+    if [[ "$new_version" =~ "alpha" ]]; then
+        echo "BUILD TYPE:            Development snapshot"
+    elif [[ "$new_version" =~ "beta" ]]; then
+        echo "BUILD TYPE:            Beta release"
+    else
+        echo "BUILD TYPE:            Production release"
+    fi
+    echo 
+    echo "INSTALLER OPTIONS:"
+    echo "============================================================================="
+    echo "Send email notification on upgrade complete:      $UPGRADE_SEND_EMAIL"
+    echo "Send installed log output to admin email:         $UPGRADE_SEND_EMAIL_LOG"
+    echo 
+}
+
+upgrade_step_message() {
     echo
+    echo "[ - ] Now applying any necessary patches from version v$version_step..."
 }
 
 upgrade_complete_message() {
-    # Add notification to panel
-    $HESTIA/bin/v-add-user-notification admin 'Upgrade complete' 'Your server has been updated to Hestia Control Panel <b>v'$new_version'</b>.<br><br>Please tell us about any bugs or issues by opening an issue report on <a href="https://github.com/hestiacp/hestiacp/issues" target="_new"><i class="fab fa-github"></i> GitHub</a> or e-mail <a href="mailto:info@hestiacp.com?Subject="['$new_version'] Bug Report: ">info@hestiacp.com</a>.<br><br><b>Have a wonderful day!</b><br><br><i class="fas fa-heart status-icon red"></i> The Hestia Control Panel development team'
-
     # Echo message to console output
+    echo "============================================================================="
     echo
-    echo "========================================================================"
-    echo
-    echo "Upgrade complete! If you encounter any issues or find a bug,            "
-    echo "please take a moment to report it to us on GitHub at the URL below:     "
-    echo "https://github.com/hestiacp/hestiacp/issues                             "
+    echo "Upgrade complete! If you encounter any issues or find a bug,                 "
+    echo "please take a moment to report it to us on GitHub at the URL below:          "
+    echo "https://github.com/hestiacp/hestiacp/issues                                  "
     echo
-    echo "We hope that you enjoy using this version of Hestia Control Panel,      "
-    echo "have a wonderful day!                                                   "
+    echo "We hope that you enjoy using this version of Hestia Control Panel,           "
+    echo "have a wonderful day!                                                        "
     echo
-    echo "Sincerely,                                                              "
-    echo "The Hestia Control Panel development team                               "
+    echo "Sincerely,                                                                   "
+    echo "The Hestia Control Panel development team                                    "
     echo
-    echo "Web:      https://www.hestiacp.com/                                     "
-    echo "Forum:    https://forum.hestiacp.com/                                   "
-    echo "GitHub:   https://github.com/hestiacp/hestiacp/                        "
-    echo "E-mail:   info@hestiacp.com                                             "
+    echo "Web:      https://www.hestiacp.com/                                          "
+    echo "Forum:    https://forum.hestiacp.com/                                        "
+    echo "GitHub:   https://github.com/hestiacp/hestiacp/                              "
+    echo "E-mail:   info@hestiacp.com                                                  "
     echo 
-    echo "Made with love & pride by the open-source community around the world.   "
+    echo "Made with love & pride by the open-source community around the world.        "
     echo
+    echo "============================================================================="
     echo
 }
 
+upgrade_complete_message_log() {
+    echo 
+    echo "============================================================================="
+    echo "UPGRADE COMPLETE.                                                            "
+    echo "Please report any issues on GitHub:                                          "
+    echo "https://github.com/hestiacp/hestiacp/issues                                  "
+    echo "============================================================================="
+    echo 
+}
+
+upgrade_cleanup_message() {
+    echo "============================================================================="
+    echo "Installation tasks complete, performing clean-up...                          "
+    echo "============================================================================="
+}
+
+upgrade_get_version() {
+    # Retrieve new version number for Hestia Control Panel from .deb package
+    new_version=$(dpkg -l | awk '$2=="hestia" { print $3 }')
+}
+
+upgrade_set_version() {
+    # Set new version number in hestia.conf
+    sed -i "/VERSION/d" $HESTIA/conf/hestia.conf
+    echo "VERSION='$@'" >> $HESTIA/conf/hestia.conf
+}
+
+upgrade_send_notification_to_panel () {
+    # Add notification to panel if variable is set to true or is not set
+    if [[ "$new_version" =~ "alpha" ]]; then
+        # Send notifications for development releases
+        $HESTIA/bin/v-add-user-notification admin 'Development snapshot installed' '<b>Version:</b> '$new_version'<br><b>Code Branch:</b> '$RELEASE_BRANCH'<br><br>Please tell us about any bugs or issues by opening an issue report on <a href="https://github.com/hestiacp/hestiacp/issues" target="_new"><i class="fab fa-github"></i> GitHub</a> and feel free to share your feedback on our <a href="https://forum.hestiacp.com" target="_new">discussion forum</a>.<br><br><i class="fas fa-heart status-icon red"></i> The Hestia Control Panel development team'
+    elif [[ "$new_version" =~ "beta" ]]; then
+        # Send feedback notification for beta releases
+        $HESTIA/bin/v-add-user-notification admin 'Thank you for testing Hestia Control Panel '$new_version'.' '<b>Please share your feedback with our development team through our <a href="https://forum.hestiacp.com" target="_new">discussion forum</a>.<br><br>Found a bug? Report it on <a href="https://github.com/hestiacp/hestiacp/issues" target="_new"><i class="fab fa-github"></i> GitHub</a>!</b><br><br><i class="fas fa-heart status-icon red"></i> The Hestia Control Panel development team'
+    else
+        # Send normal upgrade complete notification for stable releases
+        $HESTIA/bin/v-add-user-notification admin 'Upgrade complete' 'Your server has been updated to Hestia Control Panel <b>v'$new_version'</b>.<br><br>Please tell us about any bugs or issues by opening an issue report on <a href="https://github.com/hestiacp/hestiacp/issues" target="_new"><i class="fab fa-github"></i> GitHub</a>.<br><br><b>Have a wonderful day!</b><br><br><i class="fas fa-heart status-icon red"></i> The Hestia Control Panel development team'
+    fi
+}
+
+upgrade_send_notification_to_email () {
+    if [ "$UPGRADE_SEND_EMAIL" = "true" ]; then
+        # Retrieve admin email address, sendmail path, and message temp file path
+        admin_email=$(v-list-user admin json | grep "CONTACT" | cut -d'"' -f4)
+        send_mail="$HESTIA/web/inc/mail-wrapper.php"
+        message_tmp_file="/tmp/hestia-upgrade-complete.txt"
+
+        # Create temporary file
+        touch $message_tmp_file
+
+        # Write message to file
+        echo "$HOSTNAME has been upgraded from Hestia Control Panel v$VERSION to v${new_version}." >> $message_tmp_file
+        echo "Installation log: $LOG" >> $message_tmp_file
+        echo "" >> $message_tmp_file
+        echo "What's new: https://github.com/hestiacp/hestiacp/blob/$RELEASE_BRANCH/CHANGELOG.md" >> $message_tmp_file
+        echo  >> $message_tmp_file
+        echo "What to do if you run into issues:" >> $message_tmp_file
+        echo "- Check our forums for possible solutions: https://forum.hestiacp.com" >> $message_tmp_file
+        echo "- File an issue report on GitHub: https://github.com/hestiacp/hestiacp/issues" >> $message_tmp_file
+        echo "" >> $message_tmp_file
+        echo "==================================================="  >> $message_tmp_file
+        echo "Have a wonderful day," >> $message_tmp_file
+        echo "The Hestia Control Panel development team" >> $message_tmp_file
+        
+        # Read back message from file and pass through to sendmail
+        cat $message_tmp_file | $send_mail -s "Update Installed - v${new_version}" $admin_email
+        rm -f $message_tmp_file
+    fi
+}
+
+upgrade_send_log_to_email() {
+    if [ "$UPGRADE_SEND_EMAIL_LOG" = "true" ]; then
+        admin_email=$(v-list-user admin json | grep "CONTACT" | cut -d'"' -f4)
+        send_mail="$HESTIA/web/inc/mail-wrapper.php"
+        cat $LOG | $send_mail -s "Update Installation Log - v${new_version}" $admin_email
+    fi
+}
+
 upgrade_init_backup() {
     # Ensure that backup directories are created
     # Hestia Control Panel configuration files
     mkdir -p $HESTIA_BACKUP/conf/hestia/
-    
+
+    # System services (apache2, nginx, bind9, vsftpd, etc).
+    if [ ! -z "$WEB_SYSTEM" ]; then
+        mkdir -p $HESTIA_BACKUP/conf/$WEB_SYSTEM/
+    fi
+    if [ ! -z "$IMAP_SYSTEM" ]; then
+        mkdir -p $HESTIA_BACKUP/conf/$IMAP_SYSTEM/
+    fi
+    if [ ! -z "$MAIL_SYSTEM" ]; then
+        mkdir -p $HESTIA_BACKUP/conf/$MAIL_SYSTEM/
+    fi
+    if [ ! -z "$DNS_SYSTEM" ]; then
+        mkdir -p $HESTIA_BACKUP/conf/$DNS_SYSTEM/
+    fi
+    if [ ! -z "$PROXY_SYSTEM" ]; then
+        mkdir -p $HESTIA_BACKUP/conf/$PROXY_SYSTEM/
+    fi
+    if [ ! -z "$DB_SYSTEM" ]; then
+        mkdir -p $HESTIA_BACKUP/conf/$DB_SYSTEM/
+    fi
+    if [ ! -z "$FTP_SYSTEM" ]; then
+        mkdir -p $HESTIA_BACKUP/conf/$FTP_SYSTEM/
+    fi
+    if [ ! -z "$FIREWALL_SYSTEM" ]; then
+        mkdir -p $HESTIA_BACKUP/conf/$FIREWALL_SYSTEM/
+    fi
+    if [ ! -z "$FIREWALL_EXTENSION" ]; then
+        mkdir -p $HESTIA_BACKUP/conf/$FIREWALL_EXTENSION/
+    fi
+    if [ -e "/etc/ssh/sshd_config" ]; then
+        mkdir -p $HESTIA_BACKUP/conf/ssh/
+    fi
+
     # Hosting Packages
     mkdir -p $HESTIA_BACKUP/packages/
 
@@ -92,7 +346,7 @@ upgrade_init_backup() {
         fi
         if [[  "$DB_SYSTEM" =~ "pgsql" ]]; then 
             mkdir -p $HESTIA_BACKUP/conf/pgsql/        
-        fi       
+        fi
     fi
     if [ ! -z "$FTP_SYSTEM" ]; then
         mkdir -p $HESTIA_BACKUP/conf/$FTP_SYSTEM/
@@ -106,49 +360,95 @@ upgrade_init_backup() {
     if [ -e "/etc/ssh/sshd_config" ]; then
         mkdir -p $HESTIA_BACKUP/conf/ssh/
     fi
+}
 
-    echo "[ * ] Backing up existing templates and configuration files..."
+upgrade_init_logging() {
+    # Set log file path
+    LOG="$HESTIA_BACKUP/hst-upgrade-$(date +%d%m%Y%H%M).log"
 
+    # Create log file
+    touch $LOG
+}
+
+upgrade_start_backup() {
+    echo "[ * ] Backing up existing templates and configuration files..."
+    if [ "$DEBUG_MODE" = "true" ]; then
+        echo "      - Packages"
+    fi
     cp -rf $HESTIA/data/packages/* $HESTIA_BACKUP/packages/
 
+    if [ "$DEBUG_MODE" = "true" ]; then
+        echo "      - Templates"
+    fi
     cp -rf $HESTIA/data/templates/* $HESTIA_BACKUP/templates/
 
+    if [ "$DEBUG_MODE" = "true" ]; then
+        echo "      - Configuration files:"
+    fi
+
     # Hestia Control Panel configuration files
+    if [ "$DEBUG_MODE" = "true" ]; then
+        echo "      ---- hestia"
+    fi
     cp -rf $HESTIA/conf/* $HESTIA_BACKUP/conf/hestia/
 
     # System service configuration files (apache2, nginx, bind9, vsftpd, etc).
     if [ ! -z "$WEB_SYSTEM" ]; then
+        if [ "$DEBUG_MODE" = "true" ]; then
+            echo "      ---- $WEB_SYSTEM"
+        fi
         cp -f /etc/$WEB_SYSTEM/*.conf $HESTIA_BACKUP/conf/$WEB_SYSTEM/
         cp -f /etc/$WEB_SYSTEM/conf.d/*.conf $HESTIA_BACKUP/conf/$WEB_SYSTEM/
     fi
     if [ ! -z "$PROXY_SYSTEM" ]; then
+        if [ "$DEBUG_MODE" = "true" ]; then
+            echo "      ---- $PROXY_SYSTEM"
+        fi
         cp -f /etc/$PROXY_SYSTEM/*.conf $HESTIA_BACKUP/conf/$PROXY_SYSTEM/
         cp -f /etc/$PROXY_SYSTEM/conf.d/*.conf $HESTIA_BACKUP/conf/$PROXY_SYSTEM/
         cp -f /etc/$PROXY_SYSTEM/conf.d/*.inc $HESTIA_BACKUP/conf/$PROXY_SYSTEM/
     fi
     if [ ! -z "$IMAP_SYSTEM" ]; then
+        if [ "$DEBUG_MODE" = "true" ]; then
+            echo "      ---- $IMAP_SYSTEM"
+        fi
         cp -f /etc/$IMAP_SYSTEM/*.conf $HESTIA_BACKUP/conf/$IMAP_SYSTEM/
         cp -f /etc/$IMAP_SYSTEM/conf.d/*.conf $HESTIA_BACKUP/conf/$IMAP_SYSTEM/
     fi
     if [ ! -z "$MAIL_SYSTEM" ]; then
+        if [ "$DEBUG_MODE" = "true" ]; then
+            echo "      ---- $MAIL_SYSTEM"
+        fi
         cp -f /etc/$MAIL_SYSTEM/*.conf $HESTIA_BACKUP/conf/$MAIL_SYSTEM/
     fi
     if [ ! -z "$DNS_SYSTEM" ]; then
         if [ "$DNS_SYSTEM" = "bind9" ]; then
+            if [ "$DEBUG_MODE" = "true" ]; then
+                echo "      ---- $DNS_SYSTEM"
+            fi
             cp -f /etc/bind/*.conf $HESTIA_BACKUP/conf/$DNS_SYSTEM/
         fi
     fi
-    if [ ! -z "$DB_SYSTEM" ]; then    
-        if [[  "$DB_SYSTEM" =~ "mysql" ]]; then 
+    if [ ! -z "$DB_SYSTEM" ]; then
+        if [[ "$DB_SYSTEM" =~ "mysql" ]]; then
+            if [ "$DEBUG_MODE" = "true" ]; then
+                echo "      ---- mysql"
+            fi
             cp -f /etc/mysql/*.cnf $HESTIA_BACKUP/conf/mysql/
             cp -f /etc/mysql/conf.d/*.cnf $HESTIA_BACKUP/conf/mysql/      
         fi
-        if [[  "$DB_SYSTEM" =~ "pgsql" ]]; then 
+        if [[ "$DB_SYSTEM" =~ "pgsql" ]]; then
+            if [ "$DEBUG_MODE" = "true" ]; then
+                echo "      ---- pgsql"
+            fi
             cp -f /etc/mysql/*.cnf $HESTIA_BACKUP/conf/pgsql/
             cp -f /etc/mysql/conf.d/*.cnf $HESTIA_BACKUP/conf/pgsql/         
         fi
     fi
     if [ ! -z "$FTP_SYSTEM" ]; then
+        if [ "$DEBUG_MODE" = "true" ]; then
+            echo "      ---- $FTP_SYSTEM"
+        fi
         if [ "$FTP_SYSTEM" = "vsftpd" ]; then
             cp -f /etc/$FTP_SYSTEM.conf $HESTIA_BACKUP/conf/$FTP_SYSTEM/
         fi
@@ -158,10 +458,16 @@ upgrade_init_backup() {
         fi
     fi
     if [ ! -z "$FIREWALL_EXTENSION" ]; then
+        if [ "$DEBUG_MODE" = "true" ]; then
+            echo "      ---- $FIREWALL_EXTENSION"
+        fi
         cp -f /etc/$FIREWALL_EXTENSION/*.conf $HESTIA_BACKUP/conf/$FIREWALL_EXTENSION/
         cp -f /etc/$FIREWALL_EXTENSION/*.local $HESTIA_BACKUP/conf/$FIREWALL_EXTENSION/
     fi
     if [ -e "/etc/ssh/sshd_config" ]; then
+        if [ "$DEBUG_MODE" = "true" ]; then
+            echo "      ---- sshd"
+        fi
         cp -f /etc/ssh/sshd_config $HESTIA_BACKUP/conf/ssh/sshd_config
     fi
 }
@@ -171,200 +477,200 @@ upgrade_refresh_config() {
     source /usr/local/hestia/func/main.sh
 }
 
-upgrade_start_routine() {
-    #####################################################################
-    #######       Ensure that release branch variable exists      #######
-    #####################################################################
-    release_branch_check=$(cat $HESTIA/conf/hestia.conf | grep RELEASE_BRANCH)
-    if [ -z "$release_branch_check" ]; then
-        echo "[ * ] Adding global release branch variable to system configuration..."
-        $BIN/v-change-sys-config-value 'RELEASE_BRANCH' 'release'
-    fi
-    
-    #####################################################################
-    #######             Start standard upgrade process            #######
-    #######  Place instructions for all post v1.0.1 builds below  #######
-    #####################################################################
+upgrade_start_routine() {   
+    # Parse version numbers for comparison
+    function check_version { echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\n", $1,$2,$3,$4); }'; }
 
-    # Ensure that latest upgrade commands are processed if version is the same
-    if [ $VERSION = "$new_version" ]; then
-        echo "[ ! ] The latest version of Hestia Control Panel is already installed."
-        echo "      Verifying configuration..."
-        echo ""
-        source $HESTIA/install/upgrade/versions/latest.sh
-        VERSION="$new_version"
-        upgrade_set_version $VERSION
-        upgrade_refresh_config
-    fi
-
-    if [ $VERSION = "0.9.8-25" ] || [ $VERSION = "0.9.8-26" ] || [ $VERSION = "0.9.8-27" ] || [ $VERSION = "0.9.8-28" ] || [ $VERSION = "0.9.8-29" ] || [ $VERSION = "0.10.0" ] || [ $VERSION = "1.00.0-190618" ] || [ $VERSION = "1.00.0-190621" ] || [ $VERSION = "1.0.0" ]; then
-        source $HESTIA/install/upgrade/versions/previous/0.9.8-29.sh
-        source $HESTIA/install/upgrade/versions/previous/1.00.0-190618.sh
-        source $HESTIA/install/upgrade/versions/previous/1.0.1.sh
-        VERSION="1.0.1"
-        upgrade_set_version $VERSION
-        upgrade_refresh_config
-    fi
-
-    # Upgrade to Version 1.0.2
-    if [ $VERSION = "1.0.1" ]; then
-        source $HESTIA/install/upgrade/versions/previous/1.0.2.sh
-        VERSION="1.0.2"
-        upgrade_set_version $VERSION
-        upgrade_refresh_config
-    fi
-
-    # Upgrade to Version 1.0.3
-    if [ $VERSION = "1.0.2" ]; then
-        source $HESTIA/install/upgrade/versions/previous/1.0.3.sh
-        VERSION="1.0.3"
-        upgrade_set_version $VERSION
-        upgrade_refresh_config
-    fi
+    # Remove pre-release designation from version number for upgrade scripts
+    VERSION=$(echo $VERSION | sed "s|~alpha||g" | sed "s|~beta||g")
 
-    # Upgrade to Version 1.0.4
-    if [ $VERSION = "1.0.3" ]; then
-        source $HESTIA/install/upgrade/versions/previous/1.0.4.sh
-        VERSION="1.0.4"
-        upgrade_set_version $VERSION
-        upgrade_refresh_config
-    fi
-
-    # Upgrade to Version 1.0.5
-    if [ $VERSION = "1.0.4" ]; then
-        source $HESTIA/install/upgrade/versions/previous/1.0.5.sh
-        VERSION="1.0.5"
-        upgrade_set_version $VERSION
-        upgrade_refresh_config
-    fi
-
-    # Upgrade to Version 1.0.6
-    if [ $VERSION = "1.0.5" ]; then
-        source $HESTIA/install/upgrade/versions/previous/1.0.6.sh
-        VERSION="1.0.6"
-        upgrade_set_version $VERSION
-        upgrade_refresh_config
-    fi
-
-    # Upgrade to Version 1.1.0
-    if [ $VERSION = "1.0.6" ]; then
-        source $HESTIA/install/upgrade/versions/previous/1.1.0.sh
-        VERSION="1.1.0"
-        upgrade_set_version $VERSION
-        upgrade_refresh_config
-    fi
-
-    # Upgrade to Version 1.1.1
-    if [ $VERSION = "1.1.0" ]; then
-        source $HESTIA/install/upgrade/versions/previous/1.1.1.sh
-        VERSION="1.1.1"
-        upgrade_set_version $VERSION
-        upgrade_refresh_config
-    fi
+    # Get list of all available version steps and create array
+    upgrade_steps=$(ls $HESTIA/install/upgrade/versions/*.sh)
+    for script in $upgrade_steps; do
+        declare -a available_versions
+        available_versions+=($(echo $script | sed "s|/usr/local/hestia/install/upgrade/versions/||g" | sed "s|.sh||g"))
+    done
 
-    # Upgrade to Version 1.2.0
-    if [ $VERSION = "1.1.1" ] || [ $VERSION = "1.1.2" ]; then
-        source $HESTIA/install/upgrade/versions/previous/1.2.0.sh
-        VERSION="1.2.1"
+    # Define variables for accessing supported versions
+    all_versions=$(printf "%s\n" ${available_versions[@]})
+    oldest_version=$(printf "%s\n" ${available_versions[@]} | sort -r | tail -n1)
+    latest_version=$(printf "%s\n" ${available_versions[@]} | tail -n1)
+
+    # Check for supported versions and process necessary upgrade steps
+    if [ $(check_version $latest_version) -gt $(check_version $VERSION) ]; then
+        for version_step in "${available_versions[@]}"
+        do
+            if [ $(check_version $VERSION) -lt $(check_version "$version_step") ]; then
+                upgrade_step_message
+                source $HESTIA/install/upgrade/versions/$version_step.sh
+            fi
+        done
         upgrade_set_version $VERSION
         upgrade_refresh_config
-    fi
-
-
-    # Upgrade to Version 1.2.1
-    if [ $VERSION = "1.2.0" ]; then
-        # Process steps which may not have correctly executed from v1.1.0.
-        echo
-        echo "[ ! ] Reprocessing steps from v1.1.0 due to a previous installer bug..."
-        echo
-        source $HESTIA/install/upgrade/versions/previous/1.1.0.sh
-        source $HESTIA/install/upgrade/versions/previous/1.2.0.sh
-        VERSION="1.2.1"
-        upgrade_refresh_config
-    fi
-
-
-    # Upgrade to Version 1.2.2
-    if [ $VERSION = "1.2.1" ]; then
-        source $HESTIA/install/upgrade/versions/latest.sh
+    else
+        echo ""
+        echo "[ ! ] The latest version of Hestia Control Panel is already installed."
+        echo "      Verifying configuration..."
+        echo ""
+        if [ -e "$HESTIA/install/upgrade/versions/$VERSION.sh" ]; then
+            source $HESTIA/install/upgrade/versions/$VERSION.sh
+        fi
         VERSION="$new_version"
+        upgrade_set_version $VERSION
         upgrade_refresh_config
     fi
 
-
     #####################################################################
     #######     End version-specific upgrade instruction sets     #######
     #####################################################################
 }
 
 upgrade_phpmyadmin() {
-    # Check if MariaDB/MySQL is installed on the server before attempting to install or upgrade phpMyAdmin
-    if [ "$DB_SYSTEM" = "mysql" ]; then
-        # Define version check function
-        function version_ge(){ test "$(printf '%s\n' "$@" | sort -V | head -n 1)" != "$1" -o ! -z "$1" -a "$1" = "$2"; }
-
-        pma_release_file=$(ls /usr/share/phpmyadmin/RELEASE-DATE-* 2>/dev/null |tail -n 1)
-        if version_ge "${pma_release_file##*-}" "$pma_v"; then
-            echo "[ ! ] phpMyAdmin v${pma_release_file##*-} is already installed, skipping update..."
-        else
-            # Display upgrade information
-            echo "[ * ] Upgrading phpMyAdmin to version v$pma_v..."
-            [ -d /usr/share/phpmyadmin ] || mkdir -p /usr/share/phpmyadmin
-
-            # Download latest phpMyAdmin release
-            wget --quiet https://files.phpmyadmin.net/phpMyAdmin/$pma_v/phpMyAdmin-$pma_v-all-languages.tar.gz
-
-            # Unpack files
-            tar xzf phpMyAdmin-$pma_v-all-languages.tar.gz
-
-            # Delete file to prevent error
-            rm -fr /usr/share/phpmyadmin/doc/html
-
-            # Overwrite old files
-            cp -rf phpMyAdmin-$pma_v-all-languages/* /usr/share/phpmyadmin
+    if [ "$UPGRADE_UPDATE_PHPMYADMIN" = "true" ]; then
+        # Check if MariaDB/MySQL is installed on the server before attempting to install or upgrade phpMyAdmin
+        if [ "$DB_SYSTEM" = "mysql" ]; then
+            # Define version check function
+            function version_ge(){ test "$(printf '%s\n' "$@" | sort -V | head -n 1)" != "$1" -o ! -z "$1" -a "$1" = "$2"; }
+
+            pma_release_file=$(ls /usr/share/phpmyadmin/RELEASE-DATE-* 2>/dev/null |tail -n 1)
+            if version_ge "${pma_release_file##*-}" "$pma_v"; then
+                echo "[ ! ] Verifying phpMyAdmin v${pma_release_file##*-} installation..."
+                # Update permissions
+                if [ -e /var/lib/phpmyadmin/blowfish_secret.inc.php ]; then
+                    chmod 0644 /var/lib/phpmyadmin/blowfish_secret.inc.php
+                fi
+            else
+                # Display upgrade information
+                echo "[ * ] Upgrading phpMyAdmin to version v$pma_v..."
+                [ -d /usr/share/phpmyadmin ] || mkdir -p /usr/share/phpmyadmin
+
+                # Download latest phpMyAdmin release
+                wget --quiet https://files.phpmyadmin.net/phpMyAdmin/$pma_v/phpMyAdmin-$pma_v-all-languages.tar.gz
+
+                # Unpack files
+                tar xzf phpMyAdmin-$pma_v-all-languages.tar.gz
+
+                # Delete file to prevent error
+                rm -fr /usr/share/phpmyadmin/doc/html
+
+                # Overwrite old files
+                cp -rf phpMyAdmin-$pma_v-all-languages/* /usr/share/phpmyadmin
+
+                # Set config and log directory
+                sed -i "s|define('CONFIG_DIR', ROOT_PATH);|define('CONFIG_DIR', '/etc/phpmyadmin/');|" /usr/share/phpmyadmin/libraries/vendor_config.php
+                sed -i "s|define('TEMP_DIR', ROOT_PATH . 'tmp/');|define('TEMP_DIR', '/var/lib/phpmyadmin/tmp/');|" /usr/share/phpmyadmin/libraries/vendor_config.php
+
+                # Create temporary folder and change permissions
+                if [ ! -d /usr/share/phpmyadmin/tmp ]; then
+                    mkdir /usr/share/phpmyadmin/tmp
+                    chmod 777 /usr/share/phpmyadmin/tmp
+                fi
+
+                if [ -e /var/lib/phpmyadmin/blowfish_secret.inc.php ]; then
+                    chmod 0644 /var/lib/phpmyadmin/blowfish_secret.inc.php
+                fi
+
+                # Clean up source files
+                rm -fr phpMyAdmin-$pma_v-all-languages
+                rm -f phpMyAdmin-$pma_v-all-languages.tar.gz
+            fi
+        fi
+    fi
+}
 
-            # Set config and log directory
-            sed -i "s|define('CONFIG_DIR', ROOT_PATH);|define('CONFIG_DIR', '/etc/phpmyadmin/');|" /usr/share/phpmyadmin/libraries/vendor_config.php
-            sed -i "s|define('TEMP_DIR', ROOT_PATH . 'tmp/');|define('TEMP_DIR', '/var/lib/phpmyadmin/tmp/');|" /usr/share/phpmyadmin/libraries/vendor_config.php
+upgrade_filemanager() {
+    if [ "$UPGRADE_UPDATE_FILEMANAGER" = "true" ]; then
+        FILE_MANAGER_CHECK=$(cat $HESTIA/conf/hestia.conf | grep "FILE_MANAGER='false'")
+        if [ -z "$FILE_MANAGER_CHECK" ]; then
+            echo "[ * ] Updating File Manager..."
+            # Reinstall the File Manager
+            $HESTIA/bin/v-delete-sys-filemanager quiet
+            $HESTIA/bin/v-add-sys-filemanager quiet
+        fi
+    fi
+}
 
-            # Create temporary folder and change permissions
-            if [ ! -d /usr/share/phpmyadmin/tmp ]; then
-                mkdir /usr/share/phpmyadmin/tmp
-                chmod 777 /usr/share/phpmyadmin/tmp
+upgrade_filemanager_update_config() {
+    if [ "$UPGRADE_UPDATE_FILEMANAGER_CONFIG" = "true" ]; then
+        FILE_MANAGER_CHECK=$(cat $HESTIA/conf/hestia.conf | grep "FILE_MANAGER='false'")
+        if [ -z "$FILE_MANAGER_CHECK" ]; then
+            if [ -e "$HESTIA/web/fm/configuration.php" ]; then
+                echo "[ * ] Updating File Manager configuration..."
+                # Update configuration.php
+                cp -f $HESTIA_INSTALL_DIR/filemanager/filegator/configuration.php $HESTIA/web/fm/configuration.php
+                # Set environment variable for interface
+                $HESTIA/bin/v-change-sys-config-value 'FILE_MANAGER' 'true'
             fi
-
-            # Clean up source files
-            rm -fr phpMyAdmin-$pma_v-all-languages
-            rm -f phpMyAdmin-$pma_v-all-languages.tar.gz
         fi
     fi
 }
 
-upgrade_get_version() {
-    # Retrieve new version number for Hestia Control Panel from .deb package
-    new_version=$(dpkg -l | awk '$2=="hestia" { print $3 }')
+upgrade_rebuild_web_templates() {
+    if [ "$UPGRADE_UPDATE_WEB_TEMPLATES" = "true" ]; then
+        echo "[ ! ] Updating default web domain templates..."
+        $BIN/v-update-web-templates
+    fi
 }
 
-upgrade_set_version() {
-    # Set new version number in hestia.conf
-    sed -i "/VERSION/d" $HESTIA/conf/hestia.conf
-    echo "VERSION='$@'" >> $HESTIA/conf/hestia.conf
+upgrade_rebuild_mail_templates() {
+    if [ "$UPGRADE_UPDATE_MAIL_TEMPLATES" = "true" ]; then
+        echo "[ ! ] Updating default mail domain templates..."
+        $BIN/v-update-mail-templates
+    fi
+}
+
+upgrade_rebuild_dns_templates() {
+    if [ "$UPGRADE_UPDATE_DNS_TEMPLATES" = "true" ]; then
+        echo "[ ! ] Updating default DNS zone templates..."
+        $BIN/v-update-dns-templates
+    fi
 }
 
 upgrade_rebuild_users() {
-    for user in $($HESTIA/bin/v-list-sys-users plain); do
-        echo "[ * ] Rebuilding domains and account for user: $user..."
-        if [ ! -z "$WEB_SYSTEM" ]; then
-            $BIN/v-rebuild-web-domains $user 'no' >/dev/null 2>&1
-        fi
-        if [ ! -z "$DNS_SYSTEM" ]; then
-            $BIN/v-rebuild-dns-domains $user 'no' >/dev/null 2>&1
-        fi
-        if [ ! -z "$MAIL_SYSTEM" ]; then 
-            $BIN/v-rebuild-mail-domains $user 'no' >/dev/null 2>&1
+    if [ "$UPGRADE_REBUILD_USERS" = "true" ]; then
+        if [ "$DEBUG_MODE" = "true" ]; then
+            echo "[ * ] Rebuilding user accounts and domains:"
+        else
+            echo "[ * ] Rebuilding user accounts and domains, this may take a few minutes..."
         fi
-        $BIN/v-rebuild-user $user 'no' >/dev/null 2>&1
-    done
+        for user in $($HESTIA/bin/v-list-sys-users plain); do
+            if [ "$DEBUG_MODE" = "true" ]; then
+                echo "      - $user:"
+            else
+                echo "      - $user..."
+            fi
+            if [ ! -z "$WEB_SYSTEM" ]; then
+                if [ "$DEBUG_MODE" = "true" ]; then
+                    echo "      ---- Web domains..."
+                    $BIN/v-rebuild-web-domains $user 'no'
+                else
+                    $BIN/v-rebuild-web-domains $user 'no' >/dev/null 2>&1
+                fi
+            fi
+            if [ ! -z "$DNS_SYSTEM" ]; then
+                if [ "$DEBUG_MODE" = "true" ]; then
+                    echo "      ---- DNS zones..."
+                    $BIN/v-rebuild-dns-domains $user 'no'
+                else
+                    $BIN/v-rebuild-dns-domains $user 'no' >/dev/null 2>&1
+                fi
+            fi
+            if [ ! -z "$MAIL_SYSTEM" ]; then 
+                if [ "$DEBUG_MODE" = "true" ]; then
+                    echo "      ---- Mail domains..."
+                    $BIN/v-rebuild-mail-domains $user 'no'
+                else
+                    $BIN/v-rebuild-mail-domains $user 'no' >/dev/null 2>&1
+                fi
+            fi
+            if [ "$DEBUG_MODE" = "true" ]; then
+                echo "      ---- User configuration..."
+                $BIN/v-rebuild-user $user 'no'
+            else
+                $BIN/v-rebuild-user $user 'no' >/dev/null 2>&1
+            fi
+        done
+    fi
 }
 
 upgrade_restart_services() {
@@ -376,32 +682,68 @@ upgrade_restart_services() {
         fi
     fi
 
-    echo "[ * ] Restarting services..."
-    sleep 5
-    if [ ! -z "$MAIL_SYSTEM" ]; then
-        $BIN/v-restart-mail $restart
-    fi
-    if [ ! -z "$WEB_SYSTEM" ]; then
-        $BIN/v-restart-web $restart
-        $BIN/v-restart-proxy $restart
-    fi
-    if [ ! -z "$DNS_SYSTEM" ]; then
-        $BIN/v-restart-dns $restart
-    fi
-    for v in `ls /etc/php/`; do
-        if [ -e /etc/php/$v/fpm ]; then
-            $BIN/v-restart-service php$v-fpm $restart
+    if [ "$UPGRADE_RESTART_SERVICES" = "true" ]; then
+        echo "[ * ] Restarting services..."
+        sleep 2
+        if [ ! -z "$MAIL_SYSTEM" ]; then
+            if [ "$DEBUG_MODE" = "true" ]; then
+                echo "      - $MAIL_SYSTEM"
+            fi
+            $BIN/v-restart-mail $restart
         fi
-    done
-    if [ ! -z "$FTP_SYSTEM" ]; then
-        $BIN/v-restart-ftp $restart
-    fi
-    if [ ! -z "$FIREWALL_EXTENSION" ]; then
-        $BIN/v-restart-service $FIREWALL_EXTENSION yes
+        if [ ! -z "$WEB_SYSTEM" ]; then
+            if [ "$DEBUG_MODE" = "true" ]; then
+                echo "      - $WEB_SYSTEM"
+            fi
+            $BIN/v-restart-web $restart
+        fi
+        if [ ! -z "$PROXY_SYSTEM" ]; then
+            if [ "$DEBUG_MODE" = "true" ]; then
+                echo "      - $PROXY_SYSTEM"
+            fi
+            $BIN/v-restart-proxy $restart
+        fi
+        if [ ! -z "$DNS_SYSTEM" ]; then
+            if [ "$DEBUG_MODE" = "true" ]; then
+                echo "      - $DNS_SYSTEM"
+            fi
+            $BIN/v-restart-dns $restart
+        fi
+        for v in `ls /etc/php/`; do
+            if [ -e /etc/php/$v/fpm ]; then
+                if [ "$DEBUG_MODE" = "true" ]; then
+                    echo "      - php$v-fpm"
+                fi
+                $BIN/v-restart-service php$v-fpm $restart
+            fi
+        done
+        if [ ! -z "$FTP_SYSTEM" ]; then
+            if [ "$DEBUG_MODE" = "true" ]; then
+                echo "      - $FTP_SYSTEM"
+            fi
+            $BIN/v-restart-ftp $restart
+        fi
+        if [ ! -z "$FIREWALL_EXTENSION" ]; then
+            if [ "$DEBUG_MODE" = "true" ]; then
+                echo "      - $FIREWALL_EXTENSION"
+            fi
+            $BIN/v-restart-service $FIREWALL_EXTENSION yes
+        fi
+        # Restart SSH daemon service
+        if [ "$DEBUG_MODE" = "true" ]; then
+            echo "      - sshd"
+        fi
+        $BIN/v-restart-service ssh $restart
     fi
 
-    # Restart SSH daemon and Hestia Control Panel service
-    $BIN/v-restart-service ssh $restart
+    # Always restart the Hestia Control Panel service
+    if [ "$DEBUG_MODE" = "true" ]; then
+        echo "      - hestia"
+    fi
     $BIN/v-restart-service hestia $restart
 }
 
+upgrade_perform_cleanup() {
+    # Remove upgrade configuration file as it's not needed
+    rm -f $HESTIA_INSTALL_DIR/upgrade/upgrade.conf
+}

+ 1 - 1
install/deb/filemanager/filegator/configuration.php

@@ -4,7 +4,7 @@ $dist_config = require __DIR__.'/configuration_sample.php';
 
 $dist_config['public_path'] = '/fm/';
 $dist_config['frontend_config']['app_name'] = 'File Manager - Hestia Control Panel';
-$dist_config['frontend_config']['logo'] = '../images/logo.png';
+$dist_config['frontend_config']['logo'] = '../images/logo.svg';
 $dist_config['frontend_config']['editable'] = ['.txt', '.css', '.js', '.ts', '.html', '.php', '.py',
         '.yml', '.xml', '.md', '.log', '.csv', '.conf', '.config', '.ini', '.scss', '.sh', '.env', '.example', '.htaccess'];
 $dist_config['frontend_config']['guest_redirection'] = '/login/' ;

+ 1 - 1
install/deb/templates/web/awstats/index.tpl

@@ -3,7 +3,7 @@
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     <title>Awstats log analyzer </title>
 </head>
-<frameset rows="60,*" cols="*">
+<frameset rows="80,*" cols="*">
     <frame src="nav.html" name="nav" scrolling="no" noresize>
     <frame src="%month%/index.html" name="stats">
 </frameset>

+ 3 - 3
install/deb/templates/web/awstats/nav.tpl

@@ -10,11 +10,11 @@
 <body>
 <table width="100%" border="0" cellspacing="0" cellpadding="0">
 <tr>
-    <td><img src="logo.png" alt="hestia"></td>
+    <td><img src="logo.svg" alt="hestia"></td>
     <td><form name="period" action="" method="get">
-        <select name="select" ONCHANGE="change()">
+    <select name="select" ONCHANGE="change()">
 %select_month%
-        </select>
+    </select>
     </form>
     </td>
 </tr>

+ 11 - 2
install/hst-install-debian.sh

@@ -23,7 +23,7 @@ HESTIA_INSTALL_DIR="$HESTIA/install/deb"
 VERBOSE='no'
 
 # Define software versions
-HESTIA_INSTALL_VER='1.2.2-alpha'
+HESTIA_INSTALL_VER='1.3.0~alpha'
 pma_v='5.0.2'
 multiphp_v=("5.6" "7.0" "7.1" "7.2" "7.3" "7.4")
 fpm_v="7.3"
@@ -403,6 +403,7 @@ fi
 #----------------------------------------------------------#
 
 install_welcome_message() {
+    DISPLAY_VER=$(echo $HESTIA_INSTALL_VER | sed "s|~alpha||g" | sed "s|~beta||g")
     echo
     echo '                _   _           _   _        ____ ____                  '
     echo '               | | | | ___  ___| |_(_) __ _ / ___|  _ \                 '
@@ -411,7 +412,15 @@ install_welcome_message() {
     echo '               |_| |_|\___||___/\__|_|\__,_|\____|_|                    '
     echo "                                                                        "
     echo "                          Hestia Control Panel                          "
-    echo "                                  ${HESTIA_INSTALL_VER}                 "
+    if [[ "$HESTIA_INSTALL_VER" =~ "beta" ]]; then
+        echo "                              BETA RELEASE                          "
+    fi
+    if [[ "$HESTIA_INSTALL_VER" =~ "alpha" ]]; then
+        echo "                          DEVELOPMENT SNAPSHOT                      "
+        echo "                    NOT INTENDED FOR PRODUCTION USE                 "
+        echo "                          USE AT YOUR OWN RISK                      "
+    fi
+    echo "                                  ${DISPLAY_VER}                        "
     echo "                            www.hestiacp.com                            "
     echo
     echo "========================================================================"

+ 11 - 2
install/hst-install-ubuntu.sh

@@ -23,7 +23,7 @@ HESTIA_INSTALL_DIR="$HESTIA/install/deb"
 VERBOSE='no'
 
 # Define software versions
-HESTIA_INSTALL_VER='1.2.2-alpha'
+HESTIA_INSTALL_VER='1.3.0~alpha'
 pma_v='5.0.2'
 multiphp_v=("5.6" "7.0" "7.1" "7.2" "7.3" "7.4")
 fpm_v="7.3"
@@ -378,6 +378,7 @@ fi
 #----------------------------------------------------------#
 
 install_welcome_message() {
+    DISPLAY_VER=$(echo $HESTIA_INSTALL_VER | sed "s|~alpha||g" | sed "s|~beta||g")
     echo
     echo '                _   _           _   _        ____ ____                  '
     echo '               | | | | ___  ___| |_(_) __ _ / ___|  _ \                 '
@@ -386,7 +387,15 @@ install_welcome_message() {
     echo '               |_| |_|\___||___/\__|_|\__,_|\____|_|                    '
     echo "                                                                        "
     echo "                          Hestia Control Panel                          "
-    echo "                                  ${HESTIA_INSTALL_VER}                 "
+    if [[ "$HESTIA_INSTALL_VER" =~ "beta" ]]; then
+        echo "                              BETA RELEASE                          "
+    fi
+    if [[ "$HESTIA_INSTALL_VER" =~ "alpha" ]]; then
+        echo "                          DEVELOPMENT SNAPSHOT                      "
+        echo "                    NOT INTENDED FOR PRODUCTION USE                 "
+        echo "                          USE AT YOUR OWN RISK                      "
+    fi
+    echo "                                  ${DISPLAY_VER}                        "
     echo "                            www.hestiacp.com                            "
     echo
     echo "========================================================================"

+ 46 - 0
install/upgrade/upgrade.conf

@@ -0,0 +1,46 @@
+#######################################################################################
+#######                             User preferences                            #######
+#######################################################################################
+
+# These values can be modified by the user in $HESTIA/conf/hestia.conf
+# and can be adjusted from within the Web UI from Server Settings > Configure > Updates.
+
+# Send an "upgrade complete" notification to the admin's e-mail address:
+# UPGRADE_SEND_EMAIL='true'
+
+# Send the update installation log to the admin's e-mail address:
+# UPGRADE_SEND_EMAIL_LOG='true'
+
+# Enable verbose logging and debug information
+# DEBUG_MODE='true'
+
+#######################################################################################
+#######                             Upgrade switches                            #######
+#######################################################################################
+
+# Update default templates when performing an upgrade
+# These flags should be set to true if any changes are made to the template files
+# to ensure that they are properly updated on the end-user's system.
+UPGRADE_UPDATE_WEB_TEMPLATES='true'
+UPGRADE_UPDATE_MAIL_TEMPLATES='true'
+UPGRADE_UPDATE_DNS_TEMPLATES='true'
+
+# Update phpMyAdmin to the latest version during upgrade
+UPGRADE_UPDATE_PHPMYADMIN='true'
+
+# Update the File Manager or it's configuration file
+# UPGRADE_UPDATE_FILEMANAGER: Performs an upgrade/repair install of the File Manager
+# UPGRADE_UPDATE_FILEMANAGER: Updates only the configuration file
+UPGRADE_UPDATE_FILEMANAGER='false'
+UPGRADE_UPDATE_FILEMANAGER_CONFIG='true'
+
+# Post installation clean-up
+UPGRADE_REBUILD_USERS='true'
+UPGRADE_RESTART_SERVICES='true'
+
+#######################################################################################
+#######                        3rd Party Software Updates                       #######
+#######################################################################################
+
+# Set version of phpMyAdmin to install during upgrade if not already installed
+pma_v='5.0.2'

+ 0 - 0
install/upgrade/versions/previous/0.9.8-29.sh → install/upgrade/versions/0.9.8-29.sh


+ 0 - 13
install/upgrade/versions/previous/1.0.1.sh → install/upgrade/versions/1.0.1.sh

@@ -6,19 +6,6 @@
 #######                      Place additional commands below.                   #######
 #######################################################################################
 
-# Ensure that users from previous releases are set to the correct stable release branch
-if [ ! -z "$RELEASE_BRANCH" ] && [ "$RELEASE_BRANCH" = "master" ] || [ "$RELEASE_BRANCH" = "develop" ]; then
-    echo "[ * ] Updating default release branch configuration..."
-    $HESTIA/bin/v-change-sys-config-value 'RELEASE_BRANCH' 'release'
-fi
-
-# Back up old template files and install the latest versions
-if [ -d $HESTIA/data/templates/ ]; then
-    echo "[ * ] Updating web templates to enable per-domain HSTS/OCSP SSL support..."
-    cp -rf $HESTIA/data/templates $HESTIA_BACKUP/templates/
-    $HESTIA/bin/v-update-web-templates >/dev/null 2>&1
-fi
-
 # Remove global options from nginx.conf to prevent conflicts with other web packages
 # and remove OCSP SSL stapling from global configuration as it has moved to per-domain availability in this release.
 if [ -e /etc/nginx/nginx.conf ]; then

+ 0 - 0
install/upgrade/versions/previous/1.0.2.sh → install/upgrade/versions/1.0.2.sh


+ 0 - 0
install/upgrade/versions/previous/1.0.3.sh → install/upgrade/versions/1.0.3.sh


+ 7 - 0
install/upgrade/versions/1.0.4.sh

@@ -0,0 +1,7 @@
+#!/bin/sh
+
+# Hestia Control Panel upgrade script for target version 1.0.4
+
+#######################################################################################
+#######                      Place additional commands below.                   #######
+#######################################################################################

+ 0 - 0
install/upgrade/versions/previous/1.0.5.sh → install/upgrade/versions/1.0.5.sh


+ 0 - 0
install/upgrade/versions/previous/1.0.6.sh → install/upgrade/versions/1.0.6.sh


+ 0 - 8
install/upgrade/versions/previous/1.00.0-190618.sh → install/upgrade/versions/1.00.0-190618.sh

@@ -44,14 +44,6 @@ if [ -d $HESTIA/data/packages/ ]; then
     cp -f $HESTIA/data/packages/default.pkg $HESTIA_BACKUP/packages/
 fi
 
-# Back up old template files and install the latest versions
-if [ -d $HESTIA/data/templates/ ]; then
-    echo "[ * ] Replacing default Web, DNS, and Mail templates..."
-    cp -rf $HESTIA/data/templates $HESTIA_BACKUP/templates/
-    $HESTIA/bin/v-update-web-templates >/dev/null 2>&1
-    $HESTIA/bin/v-update-dns-templates >/dev/null 2>&1
-	$HESTIA/bin/v-update-mail-templates >/dev/null 2>&1
-fi
 
 # Remove old Office 365 template as there is a newer version with an updated name
 if [ -f $HESTIA/data/templates/dns/o365.tpl ]; then

+ 0 - 0
install/upgrade/versions/previous/1.1.0.sh → install/upgrade/versions/1.1.0.sh


+ 0 - 0
install/upgrade/versions/previous/1.1.1.sh → install/upgrade/versions/1.1.1.sh


+ 0 - 10
install/upgrade/versions/previous/1.2.0.sh → install/upgrade/versions/1.2.0.sh

@@ -217,13 +217,3 @@ if [ -z "$GZIP_LVL_CHECK" ]; then
     echo "[ * ] Updating backup compression level variable..."
     $BIN/v-change-sys-config-value "BACKUP_GZIP" '9'
 fi
-
-# Update template files to add warnings
-# Backup current templates
-cp -r -f $HESTIA/data/templates/* $HESTIA_BACKUP/templates/
-echo "[ ! ] Updating default web domain templates..."
-$BIN/v-update-web-templates
-echo "[ ! ] Updating default mail domain templates..."
-$BIN/v-update-mail-templates
-echo "[ ! ] Updating default DNS zone templates..."
-$BIN/v-update-dns-templates

+ 9 - 0
install/upgrade/versions/1.2.1.sh

@@ -0,0 +1,9 @@
+#!/bin/sh
+
+# Hestia Control Panel upgrade script for target version 1.2.1
+
+#######################################################################################
+#######                      Place additional commands below.                   #######
+#######################################################################################
+
+

+ 0 - 10
install/upgrade/versions/latest.sh → install/upgrade/versions/1.2.2.sh

@@ -6,15 +6,6 @@
 #######                      Place additional commands below.                   #######
 #######################################################################################
 
-# Update template files to add warnings
-# Backup current templates
-echo "[ ! ] Updating default web domain templates..."
-$BIN/v-update-web-templates
-echo "[ ! ] Updating default mail domain templates..."
-$BIN/v-update-mail-templates
-echo "[ ! ] Updating default DNS zone templates..."
-$BIN/v-update-dns-templates
-
 # Enhance Vsftpd security
 if [ "$FTP_SYSTEM" = "vsftpd" ]; then
     echo "[ ! ] Hardening Vsftpd TLS configuration..."
@@ -25,7 +16,6 @@ if [ "$FTP_SYSTEM" = "vsftpd" ]; then
     chmod 644 /etc/vsftpd.conf
 fi
 
-
 # Rework apt repositories
 apt="/etc/apt/sources.list.d"
 echo "[ * ] Hardening APT repositories..."

+ 7 - 0
install/upgrade/versions/1.2.3.sh

@@ -0,0 +1,7 @@
+#!/bin/sh
+
+# Hestia Control Panel upgrade script for target version 1.2.3
+
+#######################################################################################
+#######                      Place additional commands below.                   #######
+#######################################################################################

+ 7 - 0
install/upgrade/versions/1.3.0.sh

@@ -0,0 +1,7 @@
+#!/bin/sh
+
+# Hestia Control Panel upgrade script for target version 1.3.0
+
+#######################################################################################
+#######                      Place additional commands below.                   #######
+#######################################################################################

+ 0 - 22
install/upgrade/versions/previous/1.0.4.sh

@@ -1,22 +0,0 @@
-#!/bin/sh
-
-# Hestia Control Panel upgrade script for target version 1.0.4
-
-#######################################################################################
-#######                      Place additional commands below.                   #######
-#######################################################################################
-
-# Add php-imagick package to existing version...
-#php_versions=$(ls /etc/php/*/fpm -d 2>/dev/null |wc -l)
-#if [ "$php_versions" -gt 1 ]; then
-#    echo "[ * ] Install PHP Imageqick..."
-#    software="php-imagick"
-#    for v in $(ls /etc/php/); do
-#        if [ ! -d "/etc/php/$v/fpm/pool.d/" ]; then
-#            continue
-#        fi
-#        software="$software php$v-imagick"
-#    done
-#fi
-#apt -qq update
-#apt -qq install $software -y

+ 0 - 17
install/upgrade/versions/previous/1.2.1.sh

@@ -1,17 +0,0 @@
-#!/bin/sh
-
-# Hestia Control Panel upgrade script for target version 1.2.1
-
-#######################################################################################
-#######                      Place additional commands below.                   #######
-#######################################################################################
-
-# Update template files to add warnings
-# Backup current templates
-cp -r -f $HESTIA/data/templates/* $HESTIA_BACKUP/templates/
-echo "[ ! ] Updating default web domain templates..."
-$BIN/v-update-web-templates
-echo "[ ! ] Updating default mail domain templates..."
-$BIN/v-update-mail-templates
-echo "[ ! ] Updating default DNS zone templates..."
-$BIN/v-update-dns-templates

+ 1 - 1
src/deb/hestia/control

@@ -1,7 +1,7 @@
 Source: hestia
 Package: hestia
 Priority: optional
-Version: 1.2.2-alpha
+Version: 1.3.0~alpha
 Section: admin
 Maintainer: HestiaCP <info@hestiacp.com>
 Homepage: https://www.hestiacp.com

+ 48 - 14
src/deb/hestia/postinst

@@ -8,9 +8,11 @@ fi
 #                Initialize functions/variables               #
 ###############################################################
 
-# Load upgrade functions and refresh variables/configuration
+# Load upgrade functions and variables
+source /usr/local/hestia/func/main.sh
 source /usr/local/hestia/func/upgrade.sh
-upgrade_refresh_config
+source /usr/local/hestia/conf/hestia.conf
+source /usr/local/hestia/install/upgrade/upgrade.conf
 
 ###############################################################
 #             Set new version numbers for packages            #
@@ -18,36 +20,68 @@ upgrade_refresh_config
 # Hestia Control Panel
 new_version=$(dpkg -l | awk '$2=="hestia" { print $3 }')
 
-# phpMyAdmin
-pma_v='5.0.2'
-
 ###############################################################
 #               Begin standard upgrade routines               #
 ###############################################################
 
+# Set default verbose output based on release branch
+is_debug_build
 
-# Set up console display and welcome message
-upgrade_welcome_message
+# Detect operating system version
+detect_os
 
 # Initialize backup directories
 upgrade_init_backup
 
+# Initialize logging
+upgrade_init_logging
+
+# Set up console display and welcome message
+upgrade_welcome_message_log >> $LOG
+upgrade_welcome_message
+
+# Perform upgrade health check and refresh configuration before upgrading
+upgrade_health_check | tee -a $LOG
+upgrade_refresh_config
+
+# Back up existing configuration files and templates
+upgrade_start_backup | tee -a $LOG
+
 # Execute version-specific upgrade scripts
-upgrade_start_routine
+upgrade_start_routine | tee -a $LOG
+
+# Upgrade File Manager and update configuration
+upgrade_filemanager | tee -a $LOG
+upgrade_filemanager_update_config | tee -a $LOG
+
+# Update Web domain templates
+upgrade_rebuild_web_templates | tee -a $LOG
+
+# Update Mail domain templates
+upgrade_rebuild_mail_templates | tee -a $LOG
+
+# Update DNS zone templates
+upgrade_rebuild_dns_templates | tee -a $LOG
 
 # Upgrade phpMyAdmin if applicable
-upgrade_phpmyadmin
+upgrade_phpmyadmin | tee -a $LOG
 
 # Set new version number in hestia.conf
 upgrade_set_version $new_version
 
-# Perform account and domain rebuild to ensure configuration files are correct
-upgrade_rebuild_users
-
-# Restart necessary services for changes to take full effect
-upgrade_restart_services
+# Perform upgrade clean-up tasks (rebuild domains and users, restart services, delete temporary files)
+upgrade_cleanup_message | tee -a $LOG
+upgrade_rebuild_users | tee -a $LOG
+upgrade_restart_services | tee -a $LOG
+upgrade_perform_cleanup | tee -a $LOG
 
 # Add upgrade notification to admin user's panel and display completion message
+upgrade_complete_message_log >> $LOG
 upgrade_complete_message
 
+# If setting variables are set to true in hestia.conf, send notifications and email output.
+upgrade_send_notification_to_panel
+upgrade_send_notification_to_email
+upgrade_send_log_to_email
+
 exit 0

+ 1 - 1
web/add/db/index.php

@@ -42,7 +42,7 @@ if (!empty($_POST['ok'])) {
 
     // Check password length
     if (empty($_SESSION['error_msg'])) {
-        if (!preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/', $_POST['v_password'])) { $_SESSION['error_msg'] = __('Password does not match the minimum requirements'); }
+         if (!validate_password($_POST['v_password'])) { $_SESSION['error_msg'] = __('Password does not match the minimum requirements');}
     }
 
     // Protect input

+ 1 - 1
web/add/mail/index.php

@@ -123,7 +123,7 @@ if (!empty($_POST['ok_acc'])) {
     
     // Check password length
     if (empty($_SESSION['error_msg']) && !empty($_POST['v_fwd_only']) ) {
-        if (!preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/', $_POST['v_password'])) { $_SESSION['error_msg'] = __('Password does not match the minimum requirements'); }
+        if (!validate_password($_POST['v_password'])) { $_SESSION['error_msg'] = __('Password does not match the minimum requirements');}
     }
 
     // Protect input

+ 1 - 1
web/add/user/index.php

@@ -45,7 +45,7 @@ if (!empty($_POST['ok'])) {
 
     // Check password length
     if (empty($_SESSION['error_msg'])) {
-        if (!preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/', $_POST['v_password'])) { $_SESSION['error_msg'] = __('Password does not match the minimum requirements'); }
+        if (!validate_password($_POST['v_password'])) { $_SESSION['error_msg'] = __('Password does not match the minimum requirements'); }
     }
 
     // Protect input

+ 31 - 1
web/add/web/index.php

@@ -94,6 +94,10 @@ if (!empty($_POST['ok'])) {
     $v_stats = escapeshellarg($_POST['v_stats']);
     $v_stats_user = $data[$v_domain]['STATS_USER'];
     $v_stats_password = $data[$v_domain]['STATS_PASSWORD'];
+    $v_custom_doc_domain = $_POST['v-custom-doc-domain'];
+    $v_custom_doc_folder = $_POST['v-custom-doc-folder'];
+    $v_custom_doc_root_prepath = '/home/'.$user.'/web/';
+    
     $v_ftp = $_POST['v_ftp'];
     $v_ftp_user = $_POST['v_ftp_user'];
     $v_ftp_password = $_POST['v_ftp_password'];
@@ -109,7 +113,8 @@ if (!empty($_POST['ok'])) {
     if ((!empty($_POST['v_ssl_crt'])) || (!empty($_POST['v_ssl_key']))) $v_adv = 'yes';
     if ((!empty($_POST['v_ssl_ca'])) || ($_POST['v_stats'] != 'none')) $v_adv = 'yes';
     if ((!empty($_POST['v_letsencrypt']))) $v_adv = 'yes';
-
+    if (!empty($_POST['v_custom_doc_root_check'])){$v_adv = 'yes'; $v_custom_doc_root = 1; }
+    
     // Check advanced features
     if (empty($_POST['v_dns'])) $v_dns = 'off';
     if (empty($_POST['v_mail'])) $v_mail = 'off';
@@ -227,6 +232,24 @@ if (!empty($_POST['ok'])) {
         unlink($v_stats_password);
         $v_stats_password = escapeshellarg($_POST['v_stats_password']);
     }
+    
+    if ( !empty($_POST['v-custom-doc-domain']) && !empty($_POST['v_custom_doc_root_check']) && $v_custom_doc_root_prepath.$v_custom_doc_domain.'/public_html'.$v_custom_doc_folder != $v_custom_doc_root){
+        if($_POST['v-custom-doc-domain'] == $v_domain && empty($_POST['v-custom-doc-folder'])){
+
+        }else{
+            $v_custom_doc_domain = escapeshellarg($_POST['v-custom-doc-domain']);
+            $v_custom_doc_folder = escapeshellarg($_POST['v-custom-doc-folder']);
+            $v_domain = escapeshellarg(trim($_POST['v_domain']));
+            
+            exec(HESTIA_CMD."v-change-web-domain-docroot ".$user." ".$v_domain." ".$v_custom_doc_domain." ".$v_custom_doc_folder,  $output, $return_var);
+            check_return_code($return_var,$output);
+            unset($output);  
+            $v_custom_doc_root = 1; 
+        }
+    }else{
+        unset($v_custom_doc_root);
+    }   
+    
 
     // Restart DNS server
     if (($_POST['v_dns'] == 'on') && (empty($_SESSION['error_msg']))) {
@@ -354,6 +377,7 @@ if (!empty($_POST['ok'])) {
 // Define user variables
 $v_ftp_user_prepath = $panel[$user]['HOME'] . "/web";
 $v_ftp_email = $panel[$user]['CONTACT'];
+$v_custom_doc_root_prepath = '/home/'.$user.'/web/';
 
 // List IP addresses
 exec (HESTIA_CMD."v-list-user-ips ".$user." json", $output, $return_var);
@@ -365,6 +389,12 @@ exec (HESTIA_CMD."v-list-web-stats json", $output, $return_var);
 $stats = json_decode(implode('', $output), true);
 unset($output);
 
+// Get all user domains 
+exec (HESTIA_CMD."v-list-web-domains ".escapeshellarg($user)." json", $output, $return_var);
+$user_domains = json_decode(implode('', $output), true);
+$user_domains = array_keys($user_domains);
+unset($output);
+
 // Render page
 render_page($user, $TAB, 'add_web');
 

+ 1 - 1
web/css/src/styles.css

@@ -643,7 +643,7 @@ a {
 }
 
 .l-logo {
-  background-image: url("/images/logo-header.png");
+  background-image: url("/images/logo-header.svg");
   background-repeat: no-repeat;
   float: left;
   height: 28px;

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
web/css/styles.min.css


+ 2 - 2
web/edit/db/index.php

@@ -63,8 +63,8 @@ if (!empty($_POST['save'])) {
 
     // Change database password
     if ((!empty($_POST['v_password'])) && (empty($_SESSION['error_msg']))) {
-        if (!preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/', $_POST['v_password'])) { 
-            $_SESSION['error_msg'] = __('Password does not match the minimum requirements'); 
+        if (!validate_password($_POST['v_password'])) { 
+             $_SESSION['error_msg'] = __('Password does not match the minimum requirements');
         }else{ 
             $v_password = tempnam("/tmp","vst");
             $fp = fopen($v_password, "w");

+ 2 - 2
web/edit/mail/index.php

@@ -398,8 +398,8 @@ if ((!empty($_POST['save'])) && (!empty($_GET['domain'])) && (!empty($_GET['acco
 
     // Change password
     if ((!empty($_POST['v_password'])) && (empty($_SESSION['error_msg']))) {
-        if (!preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/', $_POST['v_password'])) { 
-            $_SESSION['error_msg'] = __('Password does not match the minimum requirements'); 
+        if (!validate_password($_POST['v_password'])) { 
+            $_SESSION['error_msg'] = __('Password does not match the minimum requirements');
         }else{         
             $v_password = tempnam("/tmp","vst");
             $fp = fopen($v_password, "w");

+ 22 - 0
web/edit/server/index.php

@@ -359,6 +359,28 @@ if (!empty($_POST['save'])) {
         }
     }
 
+    // Update send notification setting
+    if (empty($_SESSION['error_msg'])) {
+        if ($_POST['v_upgrade_send_notification_email'] != $_SESSION['UPGRADE_SEND_EMAIL']) {
+            if ($_POST['v_upgrade_send_notification_email'] == 'on'){ $_POST['v_upgrade_send_notification_email'] = 'true'; } else { $_POST['v_upgrade_send_notification_email'] = 'false'; }
+            exec (HESTIA_CMD."v-change-sys-config-value UPGRADE_SEND_EMAIL ".escapeshellarg($_POST['v_upgrade_send_notification_email']), $output, $return_var);
+            check_return_code($return_var,$output);
+            unset($output);
+            $v_upgrade_notification_adv = 'yes';
+        }
+    }
+
+    // Update send log by email setting
+    if (empty($_SESSION['error_msg'])) {
+        if ($_POST['v_upgrade_send_email_log'] != $_SESSION['UPGRADE_SEND_EMAIL_LOG']) {
+            if ($_POST['v_upgrade_send_email_log'] == 'on') { $_POST['v_upgrade_send_email_log'] = 'true'; } else { $_POST['v_upgrade_send_email_log'] = 'false'; }
+            exec (HESTIA_CMD."v-change-sys-config-value UPGRADE_SEND_EMAIL_LOG ".escapeshellarg($_POST['v_upgrade_send_email_log']), $output, $return_var);
+            check_return_code($return_var,$output);
+            unset($output);
+            $v_upgrade_send_log_adv = 'yes';
+        }
+    }
+
     // Disable local backup
     if (empty($_SESSION['error_msg'])) {
         if (($_POST['v_backup'] == 'no') && ($v_backup == 'yes' )) {

+ 3 - 1
web/edit/user/index.php

@@ -100,7 +100,9 @@ if (!empty($_POST['save'])) {
     if ((!empty($_POST['v_password'])) && (empty($_SESSION['error_msg']))) {
         // Check password length
         $pw_len = strlen($_POST['v_password']);
-        if (!preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/', $_POST['v_password'])) { $_SESSION['error_msg'] = __('Password does not match the minimum requirements'); }
+        if (!validate_password($_POST['v_password'])) { 
+            $_SESSION['error_msg'] = __('Password does not match the minimum requirements');
+        } 
         if (empty($_SESSION['error_msg'])) {
             $v_password = tempnam("/tmp","vst");
             $fp = fopen($v_password, "w");

+ 40 - 2
web/edit/web/index.php

@@ -73,11 +73,24 @@ $v_proxy_ext = str_replace(',', ', ', $data[$v_domain]['PROXY_EXT']);
 $v_stats = $data[$v_domain]['STATS'];
 $v_stats_user = $data[$v_domain]['STATS_USER'];
 if (!empty($v_stats_user)) $v_stats_password = "";
+$v_custom_doc_root_prepath = '/home/'.$v_username.'/web/';
+$v_custom_doc_root = $data[$v_domain]['CUSTOM_DOCROOT'];
+
+$m = preg_match('/\/home\/'.$v_username.'\/web\/([A-Za-z0-9.-].*)\/([A-Za-z0-9.-\/].*)/', $v_custom_doc_root, $matches);
+$v_custom_doc_domain = $matches[1];
+$v_custom_doc_folder = str_replace('public_html/','',$matches[2]);
+
 $v_ftp_user = $data[$v_domain]['FTP_USER'];
 $v_ftp_path = $data[$v_domain]['FTP_PATH'];
 if (!empty($v_ftp_user)) $v_ftp_password = "";
-$v_ftp_user_prepath = $data[$v_domain]['DOCUMENT_ROOT'];
-$v_ftp_user_prepath = str_replace('/public_html', '', $v_ftp_user_prepath, $occurance = 1);
+
+if($v_custom_doc_domain != ''){
+    $v_ftp_user_prepath = '/home/'.$v_username.'/web/'.$v_custom_doc_domain;
+}else{
+    $v_ftp_user_prepath = '/home/'.$v_username.'/web/'.$v_domain;
+}
+
+
 $v_ftp_email = $panel[$user]['CONTACT'];
 $v_suspended = $data[$v_domain]['SUSPENDED'];
 if ( $v_suspended == 'yes' ) {
@@ -736,6 +749,31 @@ if (!empty($_POST['save'])) {
             }
         }
     }
+    //custom docoot with check box disabled      
+    if( !empty($v_custom_doc_root) && empty($_POST['v_custom_doc_root_check']) ){
+        exec(HESTIA_CMD."v-change-web-domain-docroot ".$v_username." ".escapeshellarg($v_domain)." default",  $output, $return_var);
+        check_return_code($return_var,$output);
+        unset($output);    
+        unset($_POST['v-custom-doc-domain'], $_POST['v-custom-doc-folder']);    
+    }
+
+    if ( !empty($_POST['v-custom-doc-domain']) && !empty($_POST['v_custom_doc_root_check']) && $v_custom_doc_root_prepath.$v_custom_doc_domain.'/public_html'.$v_custom_doc_folder != $v_custom_doc_root){
+        if($_POST['v-custom-doc-domain'] == $v_domain && empty($_POST['v-custom-doc-folder'])){
+            exec(HESTIA_CMD."v-change-web-domain-docroot ".$v_username." ".escapeshellarg($v_domain)." default",  $output, $return_var);
+            check_return_code($return_var,$output);
+            unset($output);     
+        }else{
+            $v_custom_doc_domain = escapeshellarg($_POST['v-custom-doc-domain']);
+            $v_custom_doc_folder = escapeshellarg($_POST['v-custom-doc-folder']);
+        
+            exec(HESTIA_CMD."v-change-web-domain-docroot ".$v_username." ".escapeshellarg($v_domain)." ".$v_custom_doc_domain." ".$v_custom_doc_folder,  $output, $return_var);
+            check_return_code($return_var,$output);
+            unset($output);  
+            $v_custom_doc_root = 1; 
+        }
+    }else{
+        unset($v_custom_doc_root);
+    }   
 
     // Restart web server
     if (!empty($restart_web) && (empty($_SESSION['error_msg']))) {

BIN
web/images/logo-header.png


+ 70 - 0
web/images/logo-header.svg

@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 70.7 37.5" style="enable-background:new 0 0 70.7 37.5;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#FFFFFF;}
+	.st1{opacity:0.3;fill:#B2B2B2;}
+	.st2{opacity:0.6;fill:#FFFFFF;}
+	.st3{opacity:0.2;fill:#878787;}
+	.st4{opacity:0.17;fill:#FFFFFF;}
+	.st5{opacity:0.3;fill:#C6C6C6;}
+</style>
+<g>
+	<g>
+		<g>
+			<path class="st0" d="M6,32.6c0,0,2.2-0.9,6.8-10.2c1-2.1,1.8-3.4,2.8-4.4c0,0,1.8-0.1,0.9,2.8c-0.9,2.9-1.2,7.8-1.2,7.8
+				s-2.5,5.3-2.9,5.6c-0.4,0.4-1.6,2.3-4,2S6,32.6,6,32.6z"/>
+			<path class="st1" d="M6,32.6c0,0,2.2-0.9,6.8-10.2c1-2.1,1.8-3.4,2.8-4.4c0,0,1.8-0.1,0.9,2.8c-0.9,2.9-1.2,7.8-1.2,7.8
+				s-2.5,5.3-2.9,5.6c-0.4,0.4-1.6,2.3-4,2S6,32.6,6,32.6z"/>
+			<path class="st2" d="M12.5,29.8c-2.7,5.6-3.7,4.5-3.7,4.5s-1.3-0.2-2.6-0.4c0.3,0.9,0.9,2.1,2.3,2.3c2.4,0.3,3.7-1.6,4-2
+				c0.4-0.4,2.9-5.6,2.9-5.6s0.2-3.9,0.9-6.8C15.3,23.7,14,26.6,12.5,29.8z"/>
+			<path class="st0" d="M0.5,0c0,0,9.2-0.3,8.3,14.7C7.9,30.8,10.1,37,13.4,32.8c0,0-3.4,6.9-9.6,3.2C0.1,33.9,0,30.1,0,25.7
+				C0,25.7,1.1,11,0.5,0z"/>
+			<path class="st0" d="M21.5,30.4c0,0,2.2,6.1,9.5,4.3c0.1,0,0.1,0.1,0.1,0.1c-0.9,0.5-2.4,1.3-3.7,1.8
+				C23.4,38.2,21.9,33.2,21.5,30.4z"/>
+			<path class="st3" d="M21.5,30.4c0,0,2.2,6.1,9.5,4.3c0.1,0,0.1,0.1,0.1,0.1c-0.9,0.5-2.9,1.7-4.2,1.9
+				C22.5,37.2,21.9,33.2,21.5,30.4z"/>
+			<path class="st0" d="M20.2,17.1c-2.1-1.5-4.7,1-4.7,1c2.3-0.9-0.9,5.1,0.2,12.3c0.8,5.1,4.6,6.6,4.6,6.6l0,0c3.5,1.5,7-0.3,7-0.3
+				C17,35.7,24.1,19.9,20.2,17.1z"/>
+			<path class="st0" d="M20.2,17.1c-2.1-1.6-4.7,1-4.7,1c2.3-0.9-0.9,5.1,0.2,12.3c0.8,5.1,4.6,6.6,4.6,6.6l0,0c3.5,1.5,7-0.3,7-0.3
+				C17,35.7,24,20.4,20.2,17.1z"/>
+			<path class="st0" d="M3.8,19.5C5.1,2.4,0.5,0,0.5,0C1.2,9.9,0,25.7,0,25.7c0,4.7,0.1,8.2,3.8,10.4c6.2,3.7,9.6-3.2,9.6-3.2
+				C9.1,40.6,2.5,37.1,3.8,19.5z"/>
+			<path class="st0" d="M19,19.5c0.1-2.5-1.4-2.5-1.6-2.5c-1.2,0.4-1.9,1.1-1.9,1.1c2.3-0.9-0.9,5.1,0.2,12.3
+				c0.8,5.1,4.6,6.6,4.6,6.6l0,0c3.5,1.5,7-0.3,7-0.3C15.4,40.9,18.9,22.2,19,19.5z"/>
+			<path class="st4" d="M15.5,18.1c0,0,0.7-0.7,1.9-1.1c0.2,0,1.7,0,1.6,2.5c-0.2,2.7-4,21.4,8.4,17.1C17,35.7,24,20.4,20.2,17.1
+				C18.1,15.5,15.5,18.1,15.5,18.1z"/>
+			<path class="st5" d="M0.5,0L0.5,0c0,0,4.5,2.4,3.2,19.5c-1,13.5,2.6,18.7,6.3,16.9c1.1-0.6,2-1.6,2.5-2.3
+				c0.3-0.4,0.5-0.8,0.8-1.2c-3.3,4.2-5.5-2-4.6-18.1C9.7-0.3,0.5,0,0.5,0z"/>
+		</g>
+	</g>
+	<g>
+		<path class="st0" d="M33.3,29.1h0.8c-0.9,2.2-2.5,4.5-5.8,4.5c-2.8,0-4.8-1.6-4.8-5.6c0-2.8,1.1-6.9,5.2-6.9
+			c3.1,0,3.2,2.3,3.2,2.8c0,2.9-2.4,4.4-4.8,4.6c0,2.2,0.6,3,2.4,3C31.5,31.6,32.4,30.5,33.3,29.1z M29.1,22.4c-1.1,0-1.9,2.3-2,4.9
+			c1.6-0.1,2.9-1.6,2.9-3.4C30,22.9,29.5,22.4,29.1,22.4z"/>
+		<path class="st0" d="M39,20.5c1.6,6.3,2.1,7.3,2.1,9.7c0,2.6-2.3,3.4-4.1,3.4c-2.9,0-4.3-2-4.3-3.6c0-0.9,0.4-1.5,0.9-1.8
+			c0.9-2.4,1.6-4.8,1.9-7.2L39,20.5z M34.7,30.3c-0.2,0-0.6-0.1-0.7-0.3c0.2,1.1,0.8,1.7,1.9,1.7c0.9,0,1.7-0.4,1.7-1.7
+			c0-1.7-0.3-2.5-1.3-6.2c-0.3,1.5-0.8,3-1.3,4.5c0.4,0.2,0.7,0.5,0.7,1C35.6,29.8,35.3,30.3,34.7,30.3z"/>
+		<path class="st0" d="M48.3,11.5v5.3h2v1.3h-2v10c0,1.9,0.4,2.3,1.7,2.3c0.5,0,0.8-0.1,0.9-0.3c0,0.2,0,0.5,0,0.7
+			c0,1.8-1.2,2.8-2.9,2.8c-3.4,0-4.6-2.1-4.6-5.2V18.1h-1.1v-1.3h1.1v-4.6L48.3,11.5z"/>
+		<path class="st0" d="M54,16c1.1,0,2,0.9,2,2c0,1.1-0.9,1.9-2,1.9c-1.1,0-1.9-0.9-1.9-1.9C52.1,16.9,52.9,16,54,16z M55.8,21.2v8.3
+			c0,1.4,0.3,1.7,1.3,1.7s1.6-0.9,1.7-2.2h1c-0.5,4-2.8,4.5-4.2,4.5c-2.5,0-3.4-1.5-3.4-3.8v-8.6H55.8z"/>
+		<path class="st0" d="M68.9,21.2v8.3c0,1.4,0.3,1.7,1.3,1.7c0.2,0,0.3,0,0.5-0.1c-0.3,1.8-0.7,2.5-2.1,2.5c-1.6,0-2.4-0.9-2.7-2.2
+			c-0.5,1.1-1.4,2.2-3.2,2.2c-2.1,0-4.3-1.4-4.3-5.7c0-3,1.3-6.8,4.7-6.8c0.8,0,1.9,0.1,2.3,1.3v-1.2H68.9z M62,27.7
+			c0,3.5,1.2,3.5,1.8,3.5c0.7,0,1.6-0.7,1.6-2.1v-5.5c-0.1-0.3-0.4-0.9-1.2-0.9C62.6,22.6,62,25.6,62,27.7z"/>
+	</g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>

+ 146 - 0
web/images/logo.svg

@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 119.9 144" style="enable-background:new 0 0 119.9 144;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:url(#SVGID_1_);}
+	.st1{fill:url(#SVGID_2_);}
+	.st2{opacity:0.43;fill:url(#SVGID_3_);}
+	.st3{fill:url(#SVGID_4_);}
+	.st4{fill:url(#SVGID_5_);}
+	.st5{fill:url(#SVGID_6_);}
+	.st6{fill:url(#SVGID_7_);}
+	.st7{fill:url(#SVGID_8_);}
+	.st8{fill:url(#SVGID_9_);}
+	.st9{fill:url(#SVGID_10_);}
+	.st10{opacity:0.17;fill:url(#SVGID_11_);}
+	.st11{opacity:0.25;fill:url(#SVGID_12_);}
+</style>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-52.2906" y1="-474.6584" x2="23.383" y2="-474.6584" gradientTransform="matrix(0.3653 -0.9308 0.9308 0.3653 494.3181 263.6963)">
+	<stop  offset="0" style="stop-color:#2A255C"/>
+	<stop  offset="0.5" style="stop-color:#672783"/>
+	<stop  offset="0.6474" style="stop-color:#652782"/>
+	<stop  offset="0.7551" style="stop-color:#60277D"/>
+	<stop  offset="0.85" style="stop-color:#562674"/>
+	<stop  offset="0.9371" style="stop-color:#4A2568"/>
+	<stop  offset="1" style="stop-color:#3F245D"/>
+</linearGradient>
+<path class="st0" d="M23.8,125c0,0,8.4-3.6,26.2-39.3c4-8,6.7-13.2,10.8-16.8c0,0,6.9-0.5,3.6,10.7c-3.3,11.2-4.5,29.8-4.5,29.8
+	s-9.6,20.2-11,21.7c-1.4,1.5-6.3,9-15.5,7.7S23.8,125,23.8,125z"/>
+<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-52.2906" y1="-474.6584" x2="23.383" y2="-474.6584" gradientTransform="matrix(0.3653 -0.9308 0.9308 0.3653 494.3181 263.6963)">
+	<stop  offset="0" style="stop-color:#20254B"/>
+	<stop  offset="0.1286" style="stop-color:#3C2758;stop-opacity:0.8714"/>
+	<stop  offset="0.2955" style="stop-color:#5A2867;stop-opacity:0.7045"/>
+	<stop  offset="0.4657" style="stop-color:#732673;stop-opacity:0.5343"/>
+	<stop  offset="0.6381" style="stop-color:#86237B;stop-opacity:0.3619"/>
+	<stop  offset="0.8143" style="stop-color:#922180;stop-opacity:0.1857"/>
+	<stop  offset="1" style="stop-color:#952081;stop-opacity:0"/>
+</linearGradient>
+<path class="st1" d="M23.8,125c0,0,8.4-3.6,26.2-39.3c4-7.9,6.7-13.2,10.8-16.8c0,0,6.9-0.5,3.6,10.7c-3.3,11.2-4.5,29.8-4.5,29.8
+	s-9.6,20.2-11,21.7c-1.4,1.5-6.3,9-15.5,7.7S23.8,125,23.8,125z"/>
+<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-52.2906" y1="-473.3361" x2="10.5017" y2="-473.3361" gradientTransform="matrix(0.3653 -0.9308 0.9308 0.3653 494.3181 263.6963)">
+	<stop  offset="0" style="stop-color:#952081;stop-opacity:0"/>
+	<stop  offset="1.289326e-02" style="stop-color:#962081;stop-opacity:1.289326e-02"/>
+	<stop  offset="0.2279" style="stop-color:#A02985;stop-opacity:0.2279"/>
+	<stop  offset="0.4982" style="stop-color:#A52E86;stop-opacity:0.4982"/>
+	<stop  offset="1" style="stop-color:#A72F87"/>
+</linearGradient>
+<path class="st2" d="M48.7,114.1c-10.3,21.4-14,17.4-14,17.4s-4.9-0.6-9.9-1.6c1.1,3.6,3.5,8,8.8,8.8c9.2,1.3,14.1-6.2,15.5-7.7
+	c1.4-1.5,11-21.7,11-21.7s0.9-14.9,3.5-26C59.6,90.8,54.5,102,48.7,114.1z"/>
+<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-58.7223" y1="-507.9429" x2="67.4358" y2="-507.9429" gradientTransform="matrix(0.3653 -0.9308 0.9308 0.3653 494.3181 263.6963)">
+	<stop  offset="0" style="stop-color:#2271B8"/>
+	<stop  offset="0.5" style="stop-color:#3AABE2"/>
+	<stop  offset="1" style="stop-color:#71C7D7"/>
+</linearGradient>
+<path class="st3" d="M2.8,0c0,0,35.2-1,31.9,56.5c-3.5,61.7,4.7,85.4,17.5,69.4c0,0-12.9,26.5-36.8,12.3
+	C1.3,129.9,0.6,115.6,0.7,98.4C0.7,98.4,4.9,42.2,2.8,0z"/>
+<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-22.171" y1="-396.1683" x2="-22.171" y2="-436.4348" gradientTransform="matrix(0.3653 -0.9308 0.9308 0.3653 494.3181 263.6963)">
+	<stop  offset="0" style="stop-color:#D70953"/>
+	<stop  offset="0.5" style="stop-color:#A21A5C"/>
+	<stop  offset="1" style="stop-color:#A21A5C"/>
+</linearGradient>
+<path class="st4" d="M83.2,116.6c0,0,8.4,23.4,36.3,16.6c0.3-0.1,0.4,0.3,0.2,0.5c-3.3,2.1-9,4.9-14.1,6.9
+	C90.3,146.4,84.7,127.2,83.2,116.6z"/>
+<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-21.9673" y1="-396.1683" x2="-21.9673" y2="-436.4348" gradientTransform="matrix(0.3653 -0.9308 0.9308 0.3653 494.3181 263.6963)">
+	<stop  offset="0" style="stop-color:#D70953"/>
+	<stop  offset="0.995" style="stop-color:#3A1E3E"/>
+</linearGradient>
+<path class="st5" d="M83.2,116.6c0,0,8.4,23.4,36.3,16.6c0.3-0.1,0.4,0.3,0.2,0.5c-3.3,2.1-11.3,6.6-16.3,7.2
+	C87.1,142.8,84.7,127.2,83.2,116.6z"/>
+<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-38.3815" y1="-440.9603" x2="32.6304" y2="-440.9603" gradientTransform="matrix(0.3653 -0.9308 0.9308 0.3653 494.3181 263.6963)">
+	<stop  offset="0" style="stop-color:#E72273"/>
+	<stop  offset="0.5" style="stop-color:#D70953"/>
+	<stop  offset="1" style="stop-color:#A21A5C"/>
+</linearGradient>
+<path class="st6" d="M78.2,65.6c-8.2-5.8-18,3.9-18,3.9c8.7-3.4-3.4,19.5,0.7,47.1c2.9,19.6,17.8,25.2,17.8,25.2l0,0
+	c13.2,5.7,26.9-1.3,26.9-1.3C65.9,136.9,93.3,76.5,78.2,65.6z"/>
+<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="-38.3815" y1="-440.9603" x2="32.7289" y2="-440.9603" gradientTransform="matrix(0.3653 -0.9308 0.9308 0.3653 494.3181 263.6963)">
+	<stop  offset="0" style="stop-color:#E72273;stop-opacity:0"/>
+	<stop  offset="0.2209" style="stop-color:#E72871;stop-opacity:0.4418"/>
+	<stop  offset="0.5" style="stop-color:#E72A70"/>
+	<stop  offset="0.6013" style="stop-color:#E42A6F;stop-opacity:0.7974"/>
+	<stop  offset="0.7072" style="stop-color:#DB276C;stop-opacity:0.5856"/>
+	<stop  offset="0.8153" style="stop-color:#CB2367;stop-opacity:0.3694"/>
+	<stop  offset="0.9242" style="stop-color:#B51E61;stop-opacity:0.1515"/>
+	<stop  offset="1" style="stop-color:#A21A5C;stop-opacity:0"/>
+</linearGradient>
+<path class="st7" d="M78.2,65.6c-8.1-6.2-18,3.9-18,3.9c8.7-3.4-3.4,19.5,0.7,47.1c2.9,19.6,17.8,25.2,17.8,25.2l0,0
+	c13.2,5.7,26.9-1.3,26.9-1.3C65.9,136.9,92.8,78.2,78.2,65.6z"/>
+<linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="-58.7223" y1="-507.9429" x2="65.8812" y2="-507.9429" gradientTransform="matrix(0.3653 -0.9308 0.9308 0.3653 494.3181 263.6963)">
+	<stop  offset="0" style="stop-color:#046AB3"/>
+	<stop  offset="0.4505" style="stop-color:#198FCF"/>
+	<stop  offset="1" style="stop-color:#009AC6"/>
+</linearGradient>
+<path class="st8" d="M15.3,74.6C20.2,9.1,2.8,0,2.8,0c2.5,37.8-2.1,98.4-2.1,98.4c-0.1,17.9,0.6,31.5,14.6,39.9
+	c23.9,14.1,36.8-12.3,36.8-12.3C35.6,155.5,10.1,142.3,15.3,74.6z"/>
+<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="-38.3815" y1="-440.9603" x2="29.0044" y2="-440.9603" gradientTransform="matrix(0.3653 -0.9308 0.9308 0.3653 494.3181 263.6963)">
+	<stop  offset="0" style="stop-color:#E72273;stop-opacity:0"/>
+	<stop  offset="0.2583" style="stop-color:#CF1F6A;stop-opacity:0.2583"/>
+	<stop  offset="0.566" style="stop-color:#B71C62;stop-opacity:0.566"/>
+	<stop  offset="0.8243" style="stop-color:#A81B5E;stop-opacity:0.8243"/>
+	<stop  offset="1" style="stop-color:#A21A5C"/>
+</linearGradient>
+<path class="st9" d="M73.6,74.9c0.6-9.4-5.5-9.4-6.1-9.4c-4.5,1.4-7.3,4.1-7.3,4.1c8.7-3.4-3.4,19.5,0.7,47.1
+	c2.9,19.6,17.8,25.2,17.8,25.2l0,0c13.2,5.7,26.9-1.3,26.9-1.3C59.9,157,73,85.1,73.6,74.9z"/>
+<linearGradient id="SVGID_11_" gradientUnits="userSpaceOnUse" x1="-35.675" y1="-440.9603" x2="32.729" y2="-440.9603" gradientTransform="matrix(0.3653 -0.9308 0.9308 0.3653 494.3181 263.6963)">
+	<stop  offset="0" style="stop-color:#E72273;stop-opacity:0"/>
+	<stop  offset="1.798216e-02" style="stop-color:#E93E7D;stop-opacity:3.596431e-02"/>
+	<stop  offset="6.854424e-02" style="stop-color:#EE779C;stop-opacity:0.1371"/>
+	<stop  offset="0.1215" style="stop-color:#F3A1B8;stop-opacity:0.2429"/>
+	<stop  offset="0.1757" style="stop-color:#F7C1D0;stop-opacity:0.3515"/>
+	<stop  offset="0.2317" style="stop-color:#FAD9E2;stop-opacity:0.4634"/>
+	<stop  offset="0.2899" style="stop-color:#FDEAF0;stop-opacity:0.5798"/>
+	<stop  offset="0.3513" style="stop-color:#FEF6F9;stop-opacity:0.7026"/>
+	<stop  offset="0.418" style="stop-color:#FFFDFE;stop-opacity:0.8361"/>
+	<stop  offset="0.5" style="stop-color:#FFFFFF"/>
+	<stop  offset="0.5596" style="stop-color:#FDFCFC;stop-opacity:0.8808"/>
+	<stop  offset="0.6219" style="stop-color:#F8F1F4;stop-opacity:0.7561"/>
+	<stop  offset="0.6856" style="stop-color:#EFDFE6;stop-opacity:0.6287"/>
+	<stop  offset="0.7503" style="stop-color:#E4C5D1;stop-opacity:0.4995"/>
+	<stop  offset="0.8156" style="stop-color:#D5A4B6;stop-opacity:0.3689"/>
+	<stop  offset="0.8815" style="stop-color:#C47B96;stop-opacity:0.2371"/>
+	<stop  offset="0.9466" style="stop-color:#B24A74;stop-opacity:0.1069"/>
+	<stop  offset="1" style="stop-color:#A21A5C;stop-opacity:0"/>
+</linearGradient>
+<path class="st10" d="M60.2,69.5c0,0,2.8-2.7,7.3-4.1c0.6,0,6.7,0,6.1,9.4c-0.6,10.2-15.3,82.1,32.1,65.6
+	c-39.7-3.5-12.9-62.2-27.5-74.8C70.1,59.4,60.2,69.5,60.2,69.5z"/>
+<linearGradient id="SVGID_12_" gradientUnits="userSpaceOnUse" x1="-25.2243" y1="-453.7274" x2="40.9387" y2="-568.3251" gradientTransform="matrix(0.3653 -0.9308 0.9308 0.3653 494.3181 263.6963)">
+	<stop  offset="0" style="stop-color:#2271B8;stop-opacity:0"/>
+	<stop  offset="9.571314e-03" style="stop-color:#2D75BA;stop-opacity:1.914263e-02"/>
+	<stop  offset="0.1107" style="stop-color:#799ACE;stop-opacity:0.2215"/>
+	<stop  offset="0.2075" style="stop-color:#ADBCDD;stop-opacity:0.415"/>
+	<stop  offset="0.2974" style="stop-color:#D1D8E9;stop-opacity:0.5948"/>
+	<stop  offset="0.3788" style="stop-color:#EBEDF0;stop-opacity:0.7577"/>
+	<stop  offset="0.4491" style="stop-color:#FBFAF4;stop-opacity:0.8981"/>
+	<stop  offset="0.5" style="stop-color:#FFFEF5"/>
+	<stop  offset="0.6131" style="stop-color:#FEFDF5;stop-opacity:0.7737"/>
+	<stop  offset="0.6958" style="stop-color:#F6FAF3;stop-opacity:0.6085"/>
+	<stop  offset="0.7687" style="stop-color:#E9F4F0;stop-opacity:0.4627"/>
+	<stop  offset="0.836" style="stop-color:#D6ECEB;stop-opacity:0.328"/>
+	<stop  offset="0.8994" style="stop-color:#BBE1E5;stop-opacity:0.2011"/>
+	<stop  offset="0.9592" style="stop-color:#96D3DE;stop-opacity:8.162302e-02"/>
+	<stop  offset="1" style="stop-color:#71C7D7;stop-opacity:0"/>
+</linearGradient>
+<path class="st11" d="M2.8,0L2.8,0c0,0,17.4,9.1,12.5,74.6c-3.9,51.8,10.1,71.7,24.3,64.9c4.3-2.5,7.6-6.1,9.7-9c1-1.4,2-3,2.9-4.6
+	c-12.8,15.9-21-7.7-17.5-69.4C38-1,2.8,0,2.8,0z"/>
+</svg>

+ 8 - 4
web/inc/i18n/ar.php

@@ -892,8 +892,12 @@ $LANG['ar'] = array(
     'Notifications' => 'إشعارات',
 
     // Help
-    'Help' => 'مساعدة',
-    'Documentation' => 'توثيق',
-    'Support' => 'الدعم',
-    'Submit an issue report' => 'إرسال تقرير بالمشكلة',
+    'Help' => 'Help',
+    'Documentation' => 'Documentation',
+    'Support' => 'Support',
+    'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'إرسال إشعار بالبريد الإلكتروني عند تثبيت التحديث',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'احفظ سجل تثبيت التحديث',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'أرسل سجل تثبيت التحديث بالبريد الإلكتروني',
 );

+ 8 - 4
web/inc/i18n/az.php

@@ -856,8 +856,12 @@ $LANG['az'] = array(
     'Notifications' => 'Bildirişlər',
 
     // Help
-    'Help' => 'Kömək edin',
-    'Documentation' => 'Sənədlər',
-    'Support' => 'Dəstək',
-    'Submit an issue report' => 'Bir problem hesabatı təqdim edin',
+    'Help' => 'Help',
+    'Documentation' => 'Documentation',
+    'Support' => 'Support',
+    'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Yeniləmə quraşdırıldıqda e-poçt bildirişini göndərin',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Yeniləmə quraşdırma jurnalını qeyd edin',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Yeniləmə quraşdırma jurnalını elektron poçtla göndərin',
 );

+ 8 - 4
web/inc/i18n/bg.php

@@ -882,9 +882,13 @@ $LANG['bg'] = array(
     'Notifications' => 'Известия',
     
     // Help
-    'Help' => 'Помогне',
-    'Documentation' => 'документация',
-    'Support' => 'поддържа',
-    'Submit an issue report' => 'Изпратете доклад за проблем',
+    'Help' => 'Help',
+    'Documentation' => 'Documentation',
+    'Support' => 'Support',
+    'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Известие по имейл, когато е инсталирана актуализация',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Запазете дневниците за актуализация',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Изпратете дневника за инсталиране на актуализацията по имейл',
 );
 

+ 9 - 4
web/inc/i18n/bs.php

@@ -884,8 +884,13 @@ $LANG['bs'] = array(
     'Notifications' => 'Obavijesti',
     
     // Help
-    'Help' => 'Pomoć',
-    'Documentation' => 'Dokumentacija',
-    'Support' => 'Podrška',
-    'Submit an issue report' => 'Pošaljite prijavu problema',
+    'Help' => 'Help',
+    'Documentation' => 'Documentation',
+    'Support' => 'Support',
+    'Submit an issue report' => 'Submit an issue report',
+    'disk' => 'Disk',    
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Pošaljite obavijest e-poštom kada je ažuriranje instalirano',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Spremi dnevnik instalacije ažuriranja',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Pošaljite dnevnik instalacije ažuriranja e-poštom',
 );

+ 11 - 4
web/inc/i18n/cn.php

@@ -898,8 +898,15 @@ $LANG['cn'] = array(
     'Notifications' => '通知事项',
     
     // Help
-    'Help' => '救命',
-    'Documentation' => '文献资料',
-    'Support' => '支持',
-    'Submit an issue report' => '提交问题报告',
+    'Help' => 'Help',
+    'Documentation' => 'Documentation',
+    'Support' => 'Support',
+    'Submit an issue report' => 'Submit an issue report',
+    'backend server' =>  'Backend Server',
+    'traffic' => 'Traffic',
+    'disk' => 'Disk',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => '安装更新后发送电子邮件通知',
+    'SYSTEM_UPGRADE_SAVE_LOG' => '保存更新安装日志',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => '通过电子邮件发送更新安装日志',
 );

+ 4 - 0
web/inc/i18n/cz.php

@@ -890,4 +890,8 @@ $LANG['cz'] = array(
     'Documentation' => 'Documentation',
     'Support' => 'Support',
     'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Po instalaci aktualizace odešlete e-mailové upozornění',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Uložte instalační protokol aktualizace',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Pošlete instalační protokol aktualizace e-mailem',
 );

+ 5 - 0
web/inc/i18n/da.php

@@ -889,4 +889,9 @@ $LANG['da'] = array(
     'Documentation' => 'Documentation',
     'Support' => 'Support',
     'Submit an issue report' => 'Submit an issue report',
+    'disk' => 'Disk',    
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Send e-mail-meddelelse, når en opdatering er installeret',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Gem opdateringsinstallationslog',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Send opdateringsinstallationslogg via e-mail',
 );

+ 8 - 4
web/inc/i18n/de.php

@@ -881,8 +881,12 @@ $LANG['de'] = array(
     'Notifications' => 'Benachrichtigungen',
     
     // Help
-    'Help' => 'Hilfe',
-    'Documentation' => 'Dokumentation',
-    'Support' => 'Unterstützung',
-    'Submit an issue report' => 'Senden Sie einen Problembericht',
+    'Help' => 'Help',
+    'Documentation' => 'Documentation',
+    'Support' => 'Support',
+    'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Senden Sie eine E-Mail-Benachrichtigung, wenn ein Update installiert wurde',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Speichern Sie das Update-Installationsprotokoll',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Senden Sie das Update-Installationsprotokoll per E-Mail',
 );

+ 8 - 4
web/inc/i18n/el.php

@@ -886,8 +886,12 @@ $LANG['el'] = array(
     'Notifications' => 'Ειδοποιήσεις',
     
     // Help
-    'Help' => 'Βοήθεια',
-    'Documentation' => 'Τεκμηρίωση',
-    'Support' => 'Υποστήριξη',
-    'Submit an issue report' => 'Υποβολή αναφοράς προβλήματος',
+    'Help' => 'Help',
+    'Documentation' => 'Documentation',
+    'Support' => 'Support',
+    'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Αποστολή ειδοποίησης μέσω email όταν έχει εγκατασταθεί μια ενημέρωση',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Αποθήκευση αρχείου καταγραφής εγκατάστασης ενημέρωσης',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Αποστολή καταγραφής εγκατάστασης ενημέρωσης μέσω email',
 );

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

@@ -889,4 +889,8 @@ $LANG['en'] = array(
     'Documentation' => 'Documentation',
     'Support' => 'Support',
     'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Send email notification when an update has been installed',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Save update installation log',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Send update installation log by email',
 );

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

@@ -892,4 +892,10 @@ $LANG['es'] = array(
     'Documentation' => 'Documentation',
     'Support' => 'Support',
     'Submit an issue report' => 'Submit an issue report',
+    'traffic' => 'Traffic',
+    'disk' => 'Disk',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Enviar notificación por correo electrónico cuando se haya instalado una actualización',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Guardar registro de instalación de actualizaciones',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Enviar el registro de instalación de actualizaciones por correo electrónico',
 );

+ 5 - 0
web/inc/i18n/fa.php

@@ -858,4 +858,9 @@ $LANG['fa'] = array(
     'Documentation' => 'Documentation',
     'Support' => 'Support',
     'Submit an issue report' => 'Submit an issue report',
+    'disk' => 'Disk',    
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'اعلان ایمیل را هنگام نصب به روزرسانی ارسال کنید',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'ذخیره سیاهههای مربوط به نصب',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'گزارش های نصب را از طریق ایمیل ارسال کنید',
 );

+ 4 - 0
web/inc/i18n/fi.php

@@ -851,6 +851,10 @@ $LANG['fi'] = array(
     'Please scan the code below in your 2FA application:' => 'To finish setting up two-factor authentication, scan the QR code below<br />using an authentication app (such as <a href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2">Google Authenticator</a>):',
     '2FA Reset Code:' => 'Account Recovery Code:',
     
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Lähetä sähköposti-ilmoitus, kun päivitys on asennettu',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Tallenna päivityksen asennusloki',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Lähetä päivitysasennusloki sähköpostitse',
+    
 // Texts below doesn't exist in en.php
     'traffic' => 'tiedonsiirto',
     'disk' => 'levytila',

+ 6 - 2
web/inc/i18n/fr.php

@@ -890,6 +890,10 @@ $LANG['fr'] = array(
     // Help
     'Help' => 'Aidez-moi',
     'Documentation' => 'Documentation',
-    'Support' => 'Soutien',
-    'Submit an issue report' => 'Soumettre un rapport de problème',
+    'Support' => 'Support',
+    'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Envoyer une notification par e-mail lorsqu\'une mise à jour a été installée',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Enregistrer le journal d\'installation des mises à jour',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Envoyer le journal d\'installation de la mise à jour par e-mail',
 );

+ 4 - 0
web/inc/i18n/hr.php

@@ -891,4 +891,8 @@ $LANG['hr'] = array(
     'Documentation' => 'Documentation',
     'Support' => 'Support',
     'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Pošaljite obavijest e-poštom kada je ažuriranje instalirano',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Spremi dnevnik instalacije ažuriranja',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Pošaljite dnevnik instalacije ažuriranja e-poštom',
 );

+ 4 - 0
web/inc/i18n/hu.php

@@ -892,4 +892,8 @@ $LANG['hu'] = array(
     'Documentation' => 'Documentation',
     'Support' => 'Support',
     'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Küldjön e-mail értesítést, ha telepítve van egy frissítés',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Mentse a frissítési telepítési naplót',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Küldje el a frissítési telepítési naplót e-mailben',
 );

+ 4 - 0
web/inc/i18n/id.php

@@ -889,4 +889,8 @@ $LANG['id'] = array(
     'Documentation' => 'Documentation',
     'Support' => 'Support',
     'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Kirim pemberitahuan email ketika pembaruan telah diinstal',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Simpan pembaruan log instalasi',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Kirim pembaruan log instalasi melalui email',
 );

+ 8 - 4
web/inc/i18n/it.php

@@ -883,8 +883,12 @@ $LANG['it'] = array(
     'Notifications' => 'Notifiche',
     
     // Help
-    'Help' => 'Aiuto',
-    'Documentation' => 'Documentazione',
-    'Support' => 'Supporto',
-    'Submit an issue report' => 'Invia una segnalazione di problemi',
+    'Help' => 'Help',
+    'Documentation' => 'Documentation',
+    'Support' => 'Support',
+    'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Invia notifica e-mail quando è stato installato un aggiornamento',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Salva il registro di installazione degli aggiornamenti',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Invia il registro di installazione degli aggiornamenti via e-mail',
 );

+ 4 - 0
web/inc/i18n/ja.php

@@ -888,4 +888,8 @@ $LANG['ja'] = array(
     'Documentation' => 'Documentation',
     'Support' => 'Support',
     'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => '更新がインストールされたときにメール通知を送信する',
+    'SYSTEM_UPGRADE_SAVE_LOG' => '更新インストールログを保存する',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'メールで更新インストールログを送信する',
 );

+ 4 - 0
web/inc/i18n/ka.php

@@ -886,4 +886,8 @@ $LANG['ka'] = array(
     'Documentation' => 'Documentation',
     'Support' => 'Support',
     'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'ელ.ფოსტის გაგზავნის გაგზავნა გაგზავნისთანავე',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'შეინახეთ განახლების ინსტალაციის ჟურნალი',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'გაგზავნის განახლების ინსტალაციის ჟურნალი ელ.ფოსტით',
 );

+ 4 - 0
web/inc/i18n/ko.php

@@ -888,4 +888,8 @@ $LANG['ko'] = array(
     'Documentation' => 'Documentation',
     'Support' => 'Support',
     'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => '업데이트가 설치되면 이메일 알림 보내기',
+    'SYSTEM_UPGRADE_SAVE_LOG' => '업데이트 설치 로그 저장',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => '이메일로 업데이트 설치 로그 보내기',
 );

+ 4 - 0
web/inc/i18n/nl.php

@@ -899,4 +899,8 @@ $LANG['nl'] = array(
     'Documentation' => 'Documentation',
     'Support' => 'Support',
     'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Stuur een e-mailmelding wanneer een update is geïnstalleerd',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Sla het updatelogboek op',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Stuur het updatelogboek per e-mail',
 );

+ 4 - 0
web/inc/i18n/no.php

@@ -889,4 +889,8 @@ $LANG['no'] = array(
     'Documentation' => 'Documentation',
     'Support' => 'Support',
     'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Send e-postvarsling når en oppdatering er installert',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Lagre oppdateringsinstallasjonsloggen',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Send oppdateringsinstallasjonslogg via e-post',
 );

+ 4 - 0
web/inc/i18n/pl.php

@@ -891,4 +891,8 @@ $LANG['pl'] = array(
     'Documentation' => 'Documentation',
     'Support' => 'Support',
     'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Wyślij powiadomienie e-mail, gdy aktualizacja zostanie zainstalowana',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Zapisz dziennik instalacji aktualizacji',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Wyślij dziennik instalacji aktualizacji pocztą e-mail',
 );

+ 4 - 0
web/inc/i18n/pt-BR.php

@@ -884,4 +884,8 @@ $LANG['pt-BR'] = array(
     'Documentation' => 'Documentation',
     'Support' => 'Support',
     'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Enviar notificação por email quando uma atualização estiver instalada',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Salvar log de instalação da atualização',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Enviar log de instalação da atualização por email',
 );

+ 4 - 0
web/inc/i18n/pt.php

@@ -887,4 +887,8 @@ $LANG['pt'] = array(
     'Documentation' => 'Documentation',
     'Support' => 'Support',
     'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Enviar notificação por email quando uma atualização estiver instalada',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Salvar log de instalação da atualização',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Enviar log de instalação da atualização por email',
 );

+ 4 - 0
web/inc/i18n/ro.php

@@ -888,4 +888,8 @@ $LANG['ro'] = array(
     'Documentation' => 'Documentation',
     'Support' => 'Support',
     'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Trimiteți o notificare prin e-mail atunci când a fost instalată o actualizare',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Salvați jurnalul de instalare de actualizare',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Trimiteți jurnalul de instalare de actualizare prin e-mail',
 );

+ 8 - 4
web/inc/i18n/ru.php

@@ -887,8 +887,12 @@ $LANG['ru'] = array(
     'Notifications' => 'Уведомления',
     
     // Help
-    'Help' => 'Помогите',
-    'Documentation' => 'Документация',
-    'Support' => 'Служба поддержки',
-    'Submit an issue report' => 'Отправить отчет о проблеме',
+    'Help' => 'Help',
+    'Documentation' => 'Documentation',
+    'Support' => 'Support',
+    'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Отправить уведомление по электронной почте, когда обновление было установлено',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Сохранить журнал установки обновлений',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Отправить журнал установки обновления по электронной почте',
 );

+ 4 - 0
web/inc/i18n/se.php

@@ -887,4 +887,8 @@ $LANG['se'] = array(
     'Documentation' => 'Documentation',
     'Support' => 'Support',
     'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Skicka e-postmeddelande när en uppdatering har installerats',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Spara uppdateringsinstallationslogg',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Skicka uppdateringsinstallationslogg via e-post',
 );

+ 4 - 0
web/inc/i18n/sr.php

@@ -888,4 +888,8 @@ $LANG['sr'] = array(
     'Documentation' => 'Documentation',
     'Support' => 'Support',
     'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Пошаљите обавештење е-поштом када је ажурирање инсталирано',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Сачувајте дневник инсталације ажурирања',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Пошаљите дневник инсталације ажурирања е-поштом',
 );

+ 4 - 0
web/inc/i18n/th.php

@@ -891,4 +891,8 @@ $LANG['th'] = array(
     'Documentation' => 'Documentation',
     'Support' => 'Support',
     'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'ส่งอีเมลแจ้งเตือนเมื่อมีการติดตั้งการอัปเดต',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'บันทึกบันทึกการติดตั้งการอัพเดท',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'ส่งบันทึกการติดตั้งการอัปเดตทางอีเมล',
 );

+ 4 - 0
web/inc/i18n/tr.php

@@ -889,4 +889,8 @@ $LANG['tr'] = array(
     'Documentation' => 'Documentation',
     'Support' => 'Support',
     'Submit an issue report' => 'Submit an issue report',
+
+    'SYSTEM_UPGRADE_SEND_NOTIFICATION_EMAIL' => 'Bir güncelleme yüklendiğinde e-posta bildirimi gönder',
+    'SYSTEM_UPGRADE_SAVE_LOG' => 'Güncelleme yükleme günlüğünü kaydet',
+    'SYSTEM_UPGRADE_SEND_EMAIL_LOG' => 'Güncelleme kurulum günlüğünü e-posta ile gönder',
 );

Некоторые файлы не были показаны из-за большого количества измененных файлов