Browse Source

Fix/sync issues existing domains (#3028)

* Fix sync issues existing domains

* Also change v-rebuild-dns-domains

* Also update v-sync-dns-cluster

* Add debug info 1.7.0.sh step

* One time display the message is enough

* Quick test

* Set to true

* Fix bug for real

and remove debug info

* Disable updating dns records slave as rdnc notifify does it

* Limit reload to 1 zone

* When slave is set to yes do not sync domain

* #2649 Add role for DNS cluster that doesn't get synced with v-sync-dns-cluster

* Add extra space

* $USER_DATA was missing

* $USER_DATA is defined everywhere as $HESTIA/data/users/$user

Only v-sync-dns-cluster uses it is as $HESTIA/data/users/
Jaap Marcus 3 years ago
parent
commit
eda32585e7

+ 4 - 2
bin/v-add-remote-dns-domain

@@ -59,7 +59,7 @@ fi
 if [ "$DNS_CLUSTER_SYSTEM" = "zone" ]; then
     str=$(echo "$str" | sed "s/SLAVE='no'/SLAVE='yes'/g");
     str=$(echo "$str" | sed "s/SLAVE=''/SLAVE='yes'/g");
-    ip=$($BIN/v-list-sys-ips plain | cut -f1);
+    ip=$($BIN/v-list-sys-ips plain | cut -f1 | head -n1);
     str=$(echo "$str" | sed "s/MASTER=''/MASTER='$ip'/g");
 fi
 
@@ -82,7 +82,6 @@ for cluster in $(grep "SUSPENDED='no'" $HESTIA/conf/dns-cluster.conf); do
         cluster_cmd v-rebuild-dns-domain $DNS_USER $domain 'yes' 'no'
         check_result $? "$HOST connection failed" "$E_CONNECT"
 
-        rndc notify $domain  > /dev/null 2>&1
     else
         # Syncing domain data
         cluster_cmd v-insert-dns-domain $DNS_USER "$str" $HOSTNAME $flush 'no'
@@ -103,6 +102,9 @@ for cluster in $(grep "SUSPENDED='no'" $HESTIA/conf/dns-cluster.conf); do
     fi
 done
 
+if [ "$DNS_CLUSTER_SYSTEM" = "zone" ]; then
+    rndc notify $domain  > /dev/null 2>&1
+fi
 #----------------------------------------------------------#
 #                       Hestia                             #
 #----------------------------------------------------------#

+ 28 - 30
bin/v-add-remote-dns-record

@@ -54,38 +54,36 @@ if [ -z "$str" ]; then
     fi
     exit
 fi
-
-IFS=$'\n'
-for cluster in $(grep "SUSPENDED='no'" $HESTIA/conf/dns-cluster.conf); do
-    
-    # Reset user, password and hash vars
-    clear_dns_cluster_settings
-    
-    # Parsing remote host parameters
-    parse_object_kv_list "$cluster"
-    
-    # Syncing serial
-    str=$(grep "DOMAIN='$domain'" $USER_DATA/dns.conf)
-    # Parsing domain parameters
-    parse_object_kv_list "$str"
-    
-    if [ "$DNS_CLUSTER_SYSTEM" != "zone" ]; then
-    cluster_cmd v-insert-dns-domain $DNS_USER "$str" $HOSTNAME 'domain' 'no'
-    check_result $? "$HOST connection failed (soa sync)" "$E_CONNECT"
-
-    # Syncing record
-    str=$(grep "ID='$id'" $USER_DATA/dns/$domain.conf | sed 's/"/\\"/g')
-    cluster_cmd v-insert-dns-record $DNS_USER $domain "$str" 'no'
-    check_result $? "$HOST connection failed (record sync)" "$E_CONNECT"
-
-    # Rebuilding dns zone
-    cluster_cmd v-rebuild-dns-domain $DNS_USER $domain 'yes' 'no'
-    check_result $? "$HOST connection failed (rebuild)" "$E_CONNECT"
-    fi
-done
+# $DNS_CLUSTER_SYSTEM = "zone" doesn't need to be uopdated
 
 if [ "$DNS_CLUSTER_SYSTEM" != "zone" ]; then
-    rndc notify $domain  > /dev/null 2>&1
+    IFS=$'\n'
+    for cluster in $(grep "SUSPENDED='no'" $HESTIA/conf/dns-cluster.conf); do
+
+        # Reset user, password and hash vars
+        clear_dns_cluster_settings
+
+        # Parsing remote host parameters
+        parse_object_kv_list "$cluster"
+
+        # Syncing serial
+        str=$(grep "DOMAIN='$domain'" $USER_DATA/dns.conf)
+        # Parsing domain parameters
+        parse_object_kv_list "$str"
+
+
+        cluster_cmd v-insert-dns-domain $DNS_USER "$str" $HOSTNAME 'domain' 'no'
+        check_result $? "$HOST connection failed (soa sync)" "$E_CONNECT"
+
+        # Syncing record
+        str=$(grep "ID='$id'" $USER_DATA/dns/$domain.conf | sed 's/"/\\"/g')
+        cluster_cmd v-insert-dns-record $DNS_USER $domain "$str" 'no'
+        check_result $? "$HOST connection failed (record sync)" "$E_CONNECT"
+
+        # Rebuilding dns zone
+        cluster_cmd v-rebuild-dns-domain $DNS_USER $domain 'yes' 'no'
+        check_result $? "$HOST connection failed (rebuild)" "$E_CONNECT"
+    done
 fi
 #----------------------------------------------------------#
 #                       Hestia                             #

+ 1 - 0
bin/v-rebuild-dns-domain

@@ -81,6 +81,7 @@ if [ "$update_serial" != 'no' ]; then
     update_domain_serial
 fi
 
+syshealth_repair_dns_config
 # Rebuiling zone config
 rebuild_dns_domain_conf
 

+ 1 - 0
bin/v-rebuild-dns-domains

@@ -82,6 +82,7 @@ for domain in $(search_objects 'dns' 'DOMAIN' "*" 'DOMAIN'); do
    if [ "$update_serial" != 'no' ]; then
         update_domain_serial
     fi
+    syshealth_repair_dns_config
     rebuild_dns_domain_conf
 done
 

+ 40 - 30
bin/v-sync-dns-cluster

@@ -47,10 +47,10 @@ fi
 
 # Starting cluster loop
 for cluster in $hosts; do
-    
+
     # Reset user, password and hash vars
-    clear_dns_cluster_settings    
-    
+    clear_dns_cluster_settings
+
     # Parsing host values
     parse_object_kv_list "$cluster"
 
@@ -61,34 +61,44 @@ for cluster in $hosts; do
     # Syncing user domains
     user_list=$(ls -d $HESTIA/data/users/*/ | sed "s#$HESTIA/data/users/##" | sed s"/.$//" | grep -v "dns-cluster")
     for user in $user_list; do
-        for str in $(cat $HESTIA/data/users/$user/dns.conf); do
-            if [ "$DNS_CLUSTER_SYSTEM" != "zone" ]; then            
-                # Syncing domain index
+        USER_DATA="$HESTIA/data/users/$user"
+        ROLE=$(get_user_value '$ROLE');
+        if [ "$ROLE" != "dns-cluster" ]; then
+            for str in $(cat $HESTIA/data/users/$user/dns.conf); do
+                unset $SLAVE
                 parse_object_kv_list "$str"
-                cluster_cmd v-insert-dns-domain "$DNS_USER" "$str" "$HOSTNAME" ' ' "no"
-                check_result $? "$HOST connection failed" "$E_CONNECT"
-
-                # Syncing domain records
-                tmp_file="/tmp/vst-sync.$DOMAIN"
-                cluster_file "$USER_DATA/$user/dns/$DOMAIN.conf" "$tmp_file"
-                check_result $? "$HOST connection failed" "$E_CONNECT"
-    
-                cluster_cmd v-insert-dns-records "$DNS_USER" "$DOMAIN" "$tmp_file" 'no'
-                check_result $? "$HOST connection failed" "$E_CONNECT"
-            fi
-            if [ "$DNS_CLUSTER_SYSTEM" = "zone" ]; then
-                str=$(echo "$str" | sed "s/SLAVE='no'/SLAVE='yes'/g");
-                ip=$($BIN/v-list-sys-ips plain | cut -f1);
-                str=$(echo "$str" | sed "s/MASTER='*'/MASTER='$ip'/g");
-
-                # Syncing domain data
-                cluster_cmd v-insert-dns-domain $DNS_USER "$str" $HOSTNAME $flush 'no'
-                check_result $? "$HOST connection failed" "$E_CONNECT"
-                
-                cluster_cmd v-rebuild-dns-domain "$DNS_USER" "$DOMAIN"
-                rndc notify $DOMAIN  > /dev/null 2>&1
-            fi
-        done
+                if [ "$SLAVE" != "yes" ]; then
+                    if [ "$DNS_CLUSTER_SYSTEM" != "zone" ]; then
+                        # Syncing domain index
+
+                        cluster_cmd v-insert-dns-domain "$DNS_USER" "$str" "$HOSTNAME" ' ' "no"
+                        check_result $? "$HOST connection failed" "$E_CONNECT"
+
+                        # Syncing domain records
+                        tmp_file="/tmp/vst-sync.$DOMAIN"
+                        cluster_file "$HESTIA/data/users/$user/dns/$DOMAIN.conf" "$tmp_file"
+                        check_result $? "$HOST connection failed" "$E_CONNECT"
+
+                        cluster_cmd v-insert-dns-records "$DNS_USER" "$DOMAIN" "$tmp_file" 'no'
+                        check_result $? "$HOST connection failed" "$E_CONNECT"
+                    fi
+                    if [ "$DNS_CLUSTER_SYSTEM" = "zone" ]; then
+                        str=$(echo "$str" | sed "s/SLAVE='no'/SLAVE='yes'/g");
+                        str=$(echo "$str" | sed "s/SLAVE=''/SLAVE='yes'/g");
+
+                        ip=$($BIN/v-list-sys-ips plain | cut -f1 | head -n1);
+                        str=$(echo "$str" | sed "s/MASTER=''/MASTER='$ip'/g");
+
+                        # Syncing domain data
+                        cluster_cmd v-insert-dns-domain $DNS_USER "$str" $HOSTNAME $flush 'no'
+                        check_result $? "$HOST connection failed" "$E_CONNECT"
+
+                        cluster_cmd v-rebuild-dns-domain "$DNS_USER" "$DOMAIN"
+                        rndc notify $DOMAIN  > /dev/null 2>&1
+                    fi
+                fi
+            done
+        fi
     done
     if [ "$DNS_CLUSTER_SYSTEM" != "zone" ]; then
         # Rebuilding dns zones

+ 12 - 12
func/main.sh

@@ -1085,7 +1085,7 @@ is_object_format_valid() {
 
 # Role validator
 is_role_valid (){
-    if ! [[ "$1" =~ ^admin$|^user$ ]]; then
+    if ! [[ "$1" =~ ^admin$|^user$|^dns-cluster$ ]]; then
         check_result "$E_INVALID" "invalid $2 format :: $1"
     fi
 }
@@ -1131,7 +1131,7 @@ is_format_valid() {
                 action)         is_fw_action_format_valid "$arg";;
                 active)         is_boolean_format_valid "$arg" 'active' ;;
                 aliases)        is_alias_format_valid "$arg" ;;
-                alias)          is_alias_format_valid "$arg" ;;        
+                alias)          is_alias_format_valid "$arg" ;;
                 antispam)       is_boolean_format_valid "$arg" 'antispam' ;;
                 antivirus)      is_boolean_format_valid "$arg" 'antivirus' ;;
                 autoreply)      is_autoreply_format_valid "$arg" ;;
@@ -1219,16 +1219,16 @@ is_format_valid() {
 }
 
 is_folder_exists () {
-  if [ ! -d "$1" ]; then 
+  if [ ! -d "$1" ]; then
     check_result "$E_NOTEXIST" "folder $1 does not exist"
   fi
 }
 
 is_command_valid_format () {
-  if [[ ! "$1" =~ ^v-[[:alnum:]][-|\.|_[:alnum:]]{0,64}[[:alnum:]]$ ]]; then 
+  if [[ ! "$1" =~ ^v-[[:alnum:]][-|\.|_[:alnum:]]{0,64}[[:alnum:]]$ ]]; then
     check_result "$E_INVALID" "Invalid command format"
   fi
-  if [[ -n $( echo "$1" | grep -e '\-\-' ) ]]; then 
+  if [[ -n $( echo "$1" | grep -e '\-\-' ) ]]; then
     check_result "$E_INVALID" "Invalid command format"
   fi
 }
@@ -1304,15 +1304,15 @@ check_access_key_cmd() {
     local access_key_id="$(basename "$1")"
     local cmd=$2
     local -n user_arg_position=$3
-    
-    if [[ "$DEBUG_MODE" = "true" ]]; then 
+
+    if [[ "$DEBUG_MODE" = "true" ]]; then
     new_timestamp
       echo "[$date:$time] $1 $2" >> /var/log/hestia/api.log
     fi
     if [[ -z "$access_key_id" || ! -f "$HESTIA/data/access-keys/${access_key_id}" ]]; then
         check_result "$E_FORBIDEN" "Access key $access_key_id doesn't exist"
     fi
-    
+
     if [[ -z "$cmd" ]]; then
         check_result "$E_FORBIDEN" "Command not provided"
     elif [[ "$cmd" = 'v-make-tmp-file' ]]; then
@@ -1326,11 +1326,11 @@ check_access_key_cmd() {
           fi
       elif [[ -z "$PERMISSIONS" && "$USER" != "admin" ]]; then
           check_result "$E_FORBIDEN" "Key $access_key_id don't have permission to run the command $hst_command"
-      fi 
+      fi
       user_arg_position="0"
     elif [[ ! -e "$BIN/$cmd" ]]; then
         check_result "$E_FORBIDEN" "Command $cmd not found"
-    else 
+    else
         USER="" PERMISSIONS=""
         source_conf "${HESTIA}/data/access-keys/${access_key_id}"
 
@@ -1505,8 +1505,8 @@ multiphp_default_version() {
 
 is_hestia_package(){
     check=false;
-    for pkg in $1; do 
-      if [ "$pkg" == "$2" ]; then 
+    for pkg in $1; do
+      if [ "$pkg" == "$2" ]; then
         check="true";
       fi
     done

+ 42 - 40
func/rebuild.sh

@@ -23,44 +23,44 @@ rebuild_user_conf() {
     chmod 660 $USER_DATA/history.log
     touch $USER_DATA/stats.log
     chmod 660 $USER_DATA/stats.log
-    
+
     # Update FNAME LNAME to NAME
-    if [ -z "$NAME" ]; then 
+    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  
+        sed -i "/LNAME='$LNAME'/d" $USER_DATA/user.conf
     fi
-    if [ -z "${TWOFA+x}" ]; then 
-        sed -i "/RKEY/a TWOFA=''" $USER_DATA/user.conf 
+    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 
+        sed -i "/TWOFA/a QRCODE=''" $USER_DATA/user.conf
     fi
-    if [ -z "${PHPCLI+x}" ]; then 
-        sed -i "/QRCODE/a PHPCLI=''" $USER_DATA/user.conf 
+    if [ -z "${PHPCLI+x}" ]; then
+        sed -i "/QRCODE/a PHPCLI=''" $USER_DATA/user.conf
     fi
-    if [ -z "${ROLE+x}" ]; then 
-        sed -i "/PHPCLI/a ROLE='user'" $USER_DATA/user.conf 
+    if [ -z "${ROLE+x}" ]; then
+        sed -i "/PHPCLI/a ROLE='user'" $USER_DATA/user.conf
     fi
-    if [ -z "${THEME+x}" ]; then 
-        sed -i "/LANGUAGE/a THEME=''" $USER_DATA/user.conf 
+    if [ -z "${THEME+x}" ]; then
+        sed -i "/LANGUAGE/a THEME=''" $USER_DATA/user.conf
     fi
-    if [ -z "${PREF_UI_SORT+x}" ]; then 
-        sed -i "/NOTIFICATIONS/a PREF_UI_SORT='name'" $USER_DATA/user.conf 
+    if [ -z "${PREF_UI_SORT+x}" ]; then
+        sed -i "/NOTIFICATIONS/a PREF_UI_SORT='name'" $USER_DATA/user.conf
     fi
-    if [ -z "${LOGIN_DISABLED+x}" ]; then 
-        sed -i "/PREF_UI_SORT/a LOGIN_DISABLED=''" $USER_DATA/user.conf 
+    if [ -z "${LOGIN_DISABLED+x}" ]; then
+        sed -i "/PREF_UI_SORT/a LOGIN_DISABLED=''" $USER_DATA/user.conf
     fi
-    if [ -z "${LOGIN_USE_IPLIST+x}" ]; then 
-        sed -i "/LOGIN_DISABLED/a LOGIN_USE_IPLIST=''" $USER_DATA/user.conf 
+    if [ -z "${LOGIN_USE_IPLIST+x}" ]; then
+        sed -i "/LOGIN_DISABLED/a LOGIN_USE_IPLIST=''" $USER_DATA/user.conf
     fi
-    if [ -z "${LOGIN_ALLOW_IPS+x}" ]; then 
-        sed -i "/LOGIN_USE_IPLIST/a LOGIN_ALLOW_IPS=''" $USER_DATA/user.conf 
+    if [ -z "${LOGIN_ALLOW_IPS+x}" ]; then
+        sed -i "/LOGIN_USE_IPLIST/a LOGIN_ALLOW_IPS=''" $USER_DATA/user.conf
     fi
-    if [ -z "${RATE_LIMIT+x}" ]; then 
-        sed -i "/MAIL_ACCOUNTS/a RATE_LIMIT='200'" $USER_DATA/user.conf 
+    if [ -z "${RATE_LIMIT+x}" ]; then
+        sed -i "/MAIL_ACCOUNTS/a RATE_LIMIT='200'" $USER_DATA/user.conf
     fi
     # Run template trigger
     if [ -x "$HESTIA/data/packages/$PACKAGE.sh" ]; then
@@ -230,7 +230,7 @@ rebuild_web_domain_conf() {
     if [ ! -d /etc/$PROXY_SYSTEM/conf.d/domains ]; then
         mkdir -p /etc/$PROXY_SYSTEM/conf.d/domains
     fi
-    
+
     syshealth_repair_web_config
     get_domain_values 'web'
     is_ip_valid $IP
@@ -285,7 +285,7 @@ rebuild_web_domain_conf() {
         $HOMEDIR/$user/web/$domain \
         $HOMEDIR/$user/web/$domain/private \
         $HOMEDIR/$user/web/$domain/cgi-bin \
-        $HOMEDIR/$user/web/$domain/public_*html 
+        $HOMEDIR/$user/web/$domain/public_*html
     chown -R $user:$user $HOMEDIR/$user/web/$domain/document_errors
     chown root:$user /var/log/$WEB_SYSTEM/domains/$domain.*
 
@@ -489,14 +489,14 @@ rebuild_dns_domain_conf() {
                     -e "s/%time%/$TIME/g" \
                     -e "s/%date%/$DATE/g" > $USER_DATA/dns/$domain.conf
         fi
-    
+
         # Sorting records
         sort_dns_records
         #Remove old sign files
         rm -fr  $HOMEDIR/$user/conf/dns/$domain.db.*
         # Updating zone
         update_domain_zone
-    
+
         # Set permissions
         if [ "$DNS_SYSTEM" = 'named' ]; then
             dns_group='named'
@@ -505,9 +505,12 @@ rebuild_dns_domain_conf() {
         fi
         # Set file permissions
         chmod 640 $HOMEDIR/$user/conf/dns/$domain.db
-        chown root:$dns_group $HOMEDIR/$user/conf/dns/$domain.db   
+        chown $root:$dns_group $HOMEDIR/$user/conf/dns/$domain.db
+    else
+        rm -fr  $HOMEDIR/$user/conf/dns/$domain.db.*
+        chown $dns_group:$dns_group $HOMEDIR/$user/conf/dns/$domain.db
     fi
-    
+
     # Get dns config path
     if [ -e '/etc/named.conf' ]; then
         dns_conf='/etc/named.conf'
@@ -546,17 +549,16 @@ rebuild_dns_domain_conf() {
     records=$(wc -l $USER_DATA/dns/$domain.conf | cut -f 1 -d ' ')
     user_records=$((user_records + records))
     update_object_value 'dns' 'DOMAIN' "$domain" '$RECORDS' "$records"
-    
+
     # Load new config
     /usr/sbin/rndc reconfig > /dev/null 2>&1
-    
     # Reload config
-    /usr/sbin/rndc reload > /dev/null 2>&1
-    
+    /usr/sbin/rndc reload $domain > /dev/null 2>&1
+
     if [ "$DNSSEC" = "yes" ]; then
-        # Key consists always out of 5 digits when less is used they are "lost" 
+        # Key consists always out of 5 digits when less is used they are "lost"
         key=$(/usr/sbin/rndc dnssec -status $domain_idn | grep ^key: | cut -f2 -d' ' | numfmt --format='%05.0f' --invalid=ignore);
-        
+
         if [ ! -d "$USER_DATA/keys/" ]; then
             mkdir -p $USER_DATA/keys/
         fi
@@ -569,7 +571,7 @@ rebuild_dns_domain_conf() {
 # MAIL domain rebuild
 rebuild_mail_domain_conf() {
     syshealth_repair_mail_config
-    
+
     get_domain_values 'mail'
     if [[ "$domain" = *[![:ascii:]]* ]]; then
         domain_idn=$(idn2 --quiet $domain)
@@ -617,7 +619,7 @@ rebuild_mail_domain_conf() {
         touch $HOMEDIR/$user/conf/mail/$domain/passwd
         touch $HOMEDIR/$user/conf/mail/$domain/fwd_only
         touch $HOMEDIR/$user/conf/mail/$domain/limits
-        
+
         # Setting outgoing ip address
         if [ -n "$local_ip" ]; then
             echo "$local_ip" > $HOMEDIR/$user/conf/mail/$domain/ip
@@ -632,7 +634,7 @@ rebuild_mail_domain_conf() {
         if [ "$ANTIVIRUS" = 'yes' ]; then
             touch $HOMEDIR/$user/conf/mail/$domain/antivirus
         fi
-        
+
         # Adding reject spam protection
         if [ "$REJECT" = 'yes' ]; then
             touch $HOMEDIR/$user/conf/mail/$domain/reject_spam
@@ -643,7 +645,7 @@ rebuild_mail_domain_conf() {
             cp $USER_DATA/mail/$domain.pem \
                 $HOMEDIR/$user/conf/mail/$domain/dkim.pem
         fi
-        
+
         # Rebuild SMTP Relay configuration
         if [ "$U_SMTP_RELAY" = 'true' ]; then
             $BIN/v-add-mail-domain-smtp-relay $user $domain "$U_SMTP_RELAY_HOST" "$U_SMTP_RELAY_USERNAME" "$U_SMTP_RELAY_PASSWORD" "$U_SMTP_RELAY_PORT"
@@ -659,7 +661,7 @@ rebuild_mail_domain_conf() {
         if [ ! -e $HOMEDIR/$user/mail/$domain_idn ]; then
             mkdir "$HOMEDIR/$user/mail/$domain_idn"
         fi
-        
+
         # Webamil client
         if [ "$WEBMAIL" = '' ]; then
            $HESTIA/bin/v-add-mail-domain-webmail $user $domain 'roundcube' 'no'

+ 35 - 35
func/upgrade.sh

@@ -17,13 +17,13 @@ source $HESTIA/func/syshealth.sh
 # Define version check function
 function version_ge(){ test "$(printf '%s\n' "$@" | sort -V | head -n 1)" != "$1" -o -n "$1" -a "$1" = "$2"; }
 
-add_upgrade_message (){ 
-    if [ -f "$HESTIA_BACKUP/message.log" ]; then 
+add_upgrade_message (){
+    if [ -f "$HESTIA_BACKUP/message.log" ]; then
         echo -e $1 >> $HESTIA_BACKUP/message.log
         echo -e "\n\n" >> $HESTIA_BACKUP/message.log
     else
         echo -e $1 > $HESTIA_BACKUP/message.log
-    fi    
+    fi
 }
 
 is_debug_build() {
@@ -36,7 +36,7 @@ is_debug_build() {
 }
 
 upgrade_health_check() {
-    
+
     echo "============================================================================="
     echo "[ ! ] Performing system health check before proceeding with installation...  "
     # Perform basic health check against hestia.conf to ensure that
@@ -103,12 +103,12 @@ upgrade_welcome_message_log() {
     else
         echo "BUILD TYPE:            Production release"
     fi
-    echo 
+    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 
+    echo
 }
 
 upgrade_step_message() {
@@ -137,7 +137,7 @@ upgrade_complete_message() {
     echo "Forum:    https://forum.hestiacp.com/                                        "
     echo "Discord:  https://discord.gg/nXRUZch                                         "
     echo "GitHub:   https://github.com/hestiacp/hestiacp/                              "
-    echo 
+    echo
     echo "Help support the Hestia Control Panel project by donating via PayPal:        "
     echo "https://www.hestiacp.com/donate                                              "
     echo
@@ -148,13 +148,13 @@ upgrade_complete_message() {
 }
 
 upgrade_complete_message_log() {
-    echo 
+    echo
     echo "============================================================================="
     echo "UPGRADE COMPLETE.                                                            "
     echo "Please report any issues on GitHub:                                          "
     echo "https://github.com/hestiacp/hestiacp/issues                                  "
     echo "============================================================================="
-    echo 
+    echo
     $BIN/v-log-action "system" "Info" "Updates" "Update installed (Version: $new_version)."
 }
 
@@ -177,7 +177,7 @@ upgrade_set_version() {
 upgrade_set_branch() {
     # Set branch in hestia.conf
     DISPLAY_VER=$(echo "$1" | sed "s|~alpha||g" | sed "s|~beta||g");
-    if [ "$DISPLAY_VER" = "$1" ]; then 
+    if [ "$DISPLAY_VER" = "$1" ]; then
         $BIN/v-change-sys-config-value "RELEASE_BRANCH" "release"
     fi
 }
@@ -232,7 +232,7 @@ upgrade_send_notification_to_email () {
         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
@@ -248,8 +248,8 @@ upgrade_send_log_to_email() {
 }
 
 upgrade_config_set_value() {
-    if [ -f "$HESTIA_BACKUP/upgrade.conf" ]; then 
-        if [ "$2" = "true" ]; then 
+    if [ -f "$HESTIA_BACKUP/upgrade.conf" ]; then
+        if [ "$2" = "true" ]; then
             sed -i "s/$1='false'/$1='true'/g" $HESTIA_BACKUP/upgrade.conf
         fi
     fi
@@ -263,8 +263,8 @@ prepare_upgrade_config () {
           if [[ ! $lhs =~ ^\ *# && -n $lhs ]]; then
               rhs="${rhs%%\#*}"    # Del in line right comments
               rhs="${rhs%%*( )}"   # Del trailing spaces
-              rhs="${rhs%\'*}"     # Del opening string quotes 
-              rhs="${rhs#\'*}"     # Del closing string quotes 
+              rhs="${rhs%\'*}"     # Del opening string quotes
+              rhs="${rhs#\'*}"     # Del closing string quotes
               echo "$lhs='$rhs'" >> $HESTIA_BACKUP/upgrade.conf
           fi
       done < "$HESTIA/install/upgrade/upgrade.conf"
@@ -330,11 +330,11 @@ upgrade_init_backup() {
         mkdir -p $HESTIA_BACKUP/conf/$PROXY_SYSTEM/
     fi
     if [ -n "$DB_SYSTEM" ]; then
-        if [[  "$DB_SYSTEM" =~ "mysql" ]]; then 
-            mkdir -p $HESTIA_BACKUP/conf/mysql/        
+        if [[  "$DB_SYSTEM" =~ "mysql" ]]; then
+            mkdir -p $HESTIA_BACKUP/conf/mysql/
         fi
-        if [[  "$DB_SYSTEM" =~ "pgsql" ]]; then 
-            mkdir -p $HESTIA_BACKUP/conf/pgsql/        
+        if [[  "$DB_SYSTEM" =~ "pgsql" ]]; then
+            mkdir -p $HESTIA_BACKUP/conf/pgsql/
         fi
     fi
     if [ -n "$FTP_SYSTEM" ]; then
@@ -440,14 +440,14 @@ upgrade_start_backup() {
             if [ "$DEBUG_MODE" = "true" ]; then
                 echo "      ---- mysql"
             fi
-            cp -fr /etc/mysql/* $HESTIA_BACKUP/conf/mysql/       
+            cp -fr /etc/mysql/* $HESTIA_BACKUP/conf/mysql/
         fi
         if [[ "$DB_SYSTEM" =~ "pgsql" ]]; then
             if [ "$DEBUG_MODE" = "true" ]; then
                 echo "      ---- pgsql"
             fi
             # config for postgresql is stored in /etc/postgresql/version/main/
-            cp -fr /etc/postgresql/* $HESTIA_BACKUP/conf/pgsql/         
+            cp -fr /etc/postgresql/* $HESTIA_BACKUP/conf/pgsql/
         fi
     fi
     if [ -n "$FTP_SYSTEM" ]; then
@@ -499,14 +499,14 @@ upgrade_refresh_config() {
     source_conf "/usr/local/hestia/conf/hestia.conf"
 }
 
-upgrade_start_routine() {   
+upgrade_start_routine() {
     # Parse version numbers for comparison
     function check_version { echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\n", $1,$2,$3,$4); }'; }
-    
+
     # Remove pre-release designation from version number for upgrade scripts
     VERSION=$(echo "$VERSION" | sed "s/~\([a-zA-Z0-9].*\)//g");
 
-    
+
     # Get list of all available version steps and create array
     upgrade_steps=$(ls $HESTIA/install/upgrade/versions/*.sh)
     for script in $upgrade_steps; do
@@ -515,7 +515,7 @@ upgrade_start_routine() {
     done
 
     # Define variables for accessing supported versions
-    # Sort version by -V due to issues with version numbers 1.4.10 and higher 
+    # Sort version by -V due to issues with version numbers 1.4.10 and higher
     all_versions=$(printf "%s\n" "${available_versions[@]}" | sort -V)
     oldest_version=$(printf "%s\n" "$all_versions" | head -n1)
     latest_version=$(printf "%s\n" "$all_versions" | sort -V | tail -n1)
@@ -566,7 +566,7 @@ upgrade_b2_tool(){
                 exit 3
             fi
         fi
-    fi   
+    fi
 }
 
 upgrade_phpmyadmin() {
@@ -605,7 +605,7 @@ upgrade_phpmyadmin() {
                 mkdir /usr/share/phpmyadmin/tmp
                 chown root:www-data /usr/share/phpmyadmin/tmp
                 chmod 770 /usr/share/phpmyadmin/tmp
-                
+
             fi
 
             if [ -e /var/lib/phpmyadmin/blowfish_secret.inc.php ]; then
@@ -623,19 +623,19 @@ upgrade_phpmyadmin() {
 upgrade_filemanager() {
     FILE_MANAGER_CHECK=$(cat $HESTIA/conf/hestia.conf | grep "FILE_MANAGER='false'")
     if [ -z "$FILE_MANAGER_CHECK" ]; then
-        if [ -f "$HESTIA/web/fm/version" ]; then 
+        if [ -f "$HESTIA/web/fm/version" ]; then
             fm_version=$(cat $HESTIA/web/fm/version);
         else
             fm_version="1.0.0"
         fi
-        if [ "$fm_version" != "$fm_v" ]; then 
+        if [ "$fm_version" != "$fm_v" ]; then
             echo "[ ! ] Upgrading File Manager to version $fm_v..."
             # Reinstall the File Manager
             $HESTIA/bin/v-delete-sys-filemanager quiet yes
             $HESTIA/bin/v-add-sys-filemanager quiet
         else
             echo "[ * ] File Manager is up to date ($fm_v)..."
-            
+
             if [ "$UPGRADE_UPDATE_FILEMANAGER_CONFIG" = "true" ]; then
                 if [ -e "$HESTIA/web/fm/configuration.php" ]; then
                     echo "[ ! ] Updating File Manager configuration..."
@@ -646,7 +646,7 @@ upgrade_filemanager() {
                 fi
             fi
         fi
-    fi  
+    fi
 }
 
 upgrade_roundcube(){
@@ -734,7 +734,7 @@ upgrade_rebuild_users() {
                     $BIN/v-rebuild-dns-domains "$user" 'no' >/dev/null 2>&1
                 fi
             fi
-            if [ -n "$MAIL_SYSTEM" ]; then 
+            if [ -n "$MAIL_SYSTEM" ]; then
                 if [ "$DEBUG_MODE" = "true" ]; then
                     echo "      ---- Mail domains..."
                     $BIN/v-rebuild-mail-domains "$user" 'no'
@@ -795,15 +795,15 @@ upgrade_restart_services() {
             fi
             $BIN/v-restart-dns 'yes'
         fi
-        if [ -n "$WEB_BACKEND" ]; then 
+        if [ -n "$WEB_BACKEND" ]; then
             versions_list=$($BIN/v-list-sys-php plain)
-            for v in $versions_list; do 
+            for v in $versions_list; do
                 if [ "$DEBUG_MODE" = "true" ]; then
                     echo "      - php$v-fpm"
                 fi
                 $BIN/v-restart-service "php$v-fpm" 'yes'
             done
-        fi 
+        fi
         if [ -n "$FTP_SYSTEM" ]; then
             if [ "$DEBUG_MODE" = "true" ]; then
                 echo "      - $FTP_SYSTEM"

+ 8 - 4
install/upgrade/versions/1.7.0.sh

@@ -5,6 +5,8 @@
 #######################################################################################
 #######                      Place additional commands below.                   #######
 #######################################################################################
+####### upgrade_config_set_value only accepts true or false.                    #######
+#######                                                                         #######
 ####### Pass through information to the end user in case of a issue or problem  #######
 #######                                                                         #######
 ####### Use add_upgrade_message "My message here" to include a message          #######
@@ -15,19 +17,21 @@
 ####### You can use \n within the string to create new lines.                   #######
 #######################################################################################
 
-upgrade_config_set_value 'UPGRADE_UPDATE_WEB_TEMPLATES' 'no'
-upgrade_config_set_value 'UPGRADE_UPDATE_DNS_TEMPLATES' 'no'
-upgrade_config_set_value 'UPGRADE_UPDATE_MAIL_TEMPLATES' 'no'
-upgrade_config_set_value 'UPGRADE_REBUILD_USERS' 'yes'
+upgrade_config_set_value 'UPGRADE_UPDATE_WEB_TEMPLATES' 'false'
+upgrade_config_set_value 'UPGRADE_UPDATE_DNS_TEMPLATES' 'false'
+upgrade_config_set_value 'UPGRADE_UPDATE_MAIL_TEMPLATES' 'false'
+upgrade_config_set_value 'UPGRADE_REBUILD_USERS' 'true'
 upgrade_config_set_value 'UPGRADE_UPDATE_FILEMANAGER_CONFIG' 'false'
 
 # Make sure to sync install quoteshell arg
 if [ "$FILE_MANAGER" = "true" ]; then
+    echo "[ * ] Force update filemanager..."
     $HESTIA/bin/v-delete-sys-filemanager quiet
     $HESTIA/bin/v-add-sys-filemanager quiet
 fi
 
 packages=$(ls --sort=time $HESTIA/data/packages |grep .pkg)
+echo "[ * ] Update existing packages to support rate limit mail accounts..."
 for package in $packages; do
     if [ -z "$(grep -e 'RATE_LIMIT' $HESTIA/data/packages/$package)" ]; then
        echo "RATE_LIMIT='200'" >> $HESTIA/data/packages/$package

+ 1 - 0
web/templates/pages/add_user.html

@@ -89,6 +89,7 @@
           <select class="form-select" name="v_role" id="v_role">
             <option value="user"><?=_('User');?>
             <option value="admin" <?php if($v_role == "admin" ){ echo "selected"; } ?>><?=_('Administrator');?>
+            <option value="dns-cluster" <?php if($v_role == "dns-cluster" ){ echo "selected"; } ?>><?=_('DNS Sync user');?>
           </select>
         </div>
         <div class="u-mb10">

+ 1 - 0
web/templates/pages/edit_user.html

@@ -152,6 +152,7 @@
               <select class="form-select" name="v_role" id="v_role">
                 <option value="user"><?=_('User');?>
                 <option value="admin" <?php if($v_role == "admin" ){ echo "selected"; } ?>><?=_('Administrator');?>
+                <option value="dns-cluster" <?php if($v_role == "dns-cluster" ){ echo "selected"; } ?>><?=_('DNS Sync user');?>
               </select>
             </div>
           <?php } ?>