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

Merge branch 'main' into feature/user-roles

Kristan Kenney 5 лет назад
Родитель
Сommit
b9ef8be2a5

+ 2 - 0
bin/v-rebuild-all

@@ -22,9 +22,11 @@ restart=$2
 # Includes
 # shellcheck source=/usr/local/hestia/func/main.sh
 # shellcheck source=/usr/local/hestia/func/rebuild.sh
+# shellcheck source=/usr/local/hestia/func/syshealth.sh
 # shellcheck source=/usr/local/hestia/conf/hestia.conf
 source $HESTIA/func/main.sh
 source $HESTIA/func/rebuild.sh
+source $HESTIA/func/syshealth.sh
 source $HESTIA/conf/hestia.conf
 
 # Export sbin

+ 2 - 0
bin/v-rebuild-database

@@ -20,10 +20,12 @@ database=$2
 # shellcheck source=/usr/local/hestia/func/main.sh
 # shellcheck source=/usr/local/hestia/func/db.sh
 # shellcheck source=/usr/local/hestia/func/rebuild.sh
+# shellcheck source=/usr/local/hestia/func/syshealth.sh
 # shellcheck source=/usr/local/hestia/conf/hestia.conf
 source $HESTIA/func/main.sh
 source $HESTIA/func/db.sh
 source $HESTIA/func/rebuild.sh
+source $HESTIA/func/syshealth.sh
 source $HESTIA/conf/hestia.conf
 
 

+ 2 - 0
bin/v-rebuild-databases

@@ -19,10 +19,12 @@ user=$1
 # shellcheck source=/usr/local/hestia/func/main.sh
 # shellcheck source=/usr/local/hestia/func/db.sh
 # shellcheck source=/usr/local/hestia/func/rebuild.sh
+# shellcheck source=/usr/local/hestia/func/syshealth.sh
 # shellcheck source=/usr/local/hestia/conf/hestia.conf
 source $HESTIA/func/main.sh
 source $HESTIA/func/db.sh
 source $HESTIA/func/rebuild.sh
+source $HESTIA/func/syshealth.sh
 source $HESTIA/conf/hestia.conf
 
 

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

@@ -22,10 +22,12 @@ update_serial=$4
 # shellcheck source=/usr/local/hestia/func/main.sh
 # shellcheck source=/usr/local/hestia/func/domain.sh
 # shellcheck source=/usr/local/hestia/func/rebuild.sh
+# shellcheck source=/usr/local/hestia/func/syshealth.sh
 # shellcheck source=/usr/local/hestia/conf/hestia.conf
 source $HESTIA/func/main.sh
 source $HESTIA/func/domain.sh
 source $HESTIA/func/rebuild.sh
+source $HESTIA/func/syshealth.sh
 source $HESTIA/conf/hestia.conf
 
 

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

@@ -21,10 +21,12 @@ update_serial=$3
 # shellcheck source=/usr/local/hestia/func/main.sh
 # shellcheck source=/usr/local/hestia/func/domain.sh
 # shellcheck source=/usr/local/hestia/func/rebuild.sh
+# shellcheck source=/usr/local/hestia/func/syshealth.sh
 # shellcheck source=/usr/local/hestia/conf/hestia.conf
 source $HESTIA/func/main.sh
 source $HESTIA/func/domain.sh
 source $HESTIA/func/rebuild.sh
+source $HESTIA/func/syshealth.sh
 source $HESTIA/conf/hestia.conf
 
 

+ 4 - 2
bin/v-rebuild-mail-domain

@@ -19,13 +19,15 @@ domain=$2
 # Includes
 # shellcheck source=/usr/local/hestia/func/main.sh
 # shellcheck source=/usr/local/hestia/func/domain.sh
-# shellcheck source=/usr/local/hestia/func/rebuild.sh
 # shellcheck source=/usr/local/hestia/func/ip.sh
+# shellcheck source=/usr/local/hestia/func/rebuild.sh
+# shellcheck source=/usr/local/hestia/func/syshealth.sh
 # shellcheck source=/usr/local/hestia/conf/hestia.conf
 source $HESTIA/func/main.sh
 source $HESTIA/func/domain.sh
-source $HESTIA/func/rebuild.sh
 source $HESTIA/func/ip.sh
+source $HESTIA/func/rebuild.sh
+source $HESTIA/func/syshealth.sh
 source $HESTIA/conf/hestia.conf
 
 # Define mail user

+ 4 - 2
bin/v-rebuild-mail-domains

@@ -18,13 +18,15 @@ user=$1
 # Includes
 # shellcheck source=/usr/local/hestia/func/main.sh
 # shellcheck source=/usr/local/hestia/func/domain.sh
-# shellcheck source=/usr/local/hestia/func/rebuild.sh
 # shellcheck source=/usr/local/hestia/func/ip.sh
+# shellcheck source=/usr/local/hestia/func/rebuild.sh
+# shellcheck source=/usr/local/hestia/func/syshealth.sh
 # shellcheck source=/usr/local/hestia/conf/hestia.conf
 source $HESTIA/func/main.sh
 source $HESTIA/func/domain.sh
-source $HESTIA/func/rebuild.sh
 source $HESTIA/func/ip.sh
+source $HESTIA/func/rebuild.sh
+source $HESTIA/func/syshealth.sh
 source $HESTIA/conf/hestia.conf
 
 # Define mail user

+ 2 - 0
bin/v-rebuild-user

@@ -19,9 +19,11 @@ restart=$2
 # Includes
 # shellcheck source=/usr/local/hestia/func/main.sh
 # shellcheck source=/usr/local/hestia/func/rebuild.sh
+# shellcheck source=/usr/local/hestia/func/syshealth.sh
 # shellcheck source=/usr/local/hestia/conf/hestia.conf
 source $HESTIA/func/main.sh
 source $HESTIA/func/rebuild.sh
+source $HESTIA/func/syshealth.sh
 source $HESTIA/conf/hestia.conf
 
 # Export sbin

+ 2 - 0
bin/v-rebuild-users

@@ -17,9 +17,11 @@ restart=$1
 # Includes
 # shellcheck source=/usr/local/hestia/func/main.sh
 # shellcheck source=/usr/local/hestia/func/rebuild.sh
+# shellcheck source=/usr/local/hestia/func/syshealth.sh
 # shellcheck source=/usr/local/hestia/conf/hestia.conf
 source $HESTIA/func/main.sh
 source $HESTIA/func/rebuild.sh
+source $HESTIA/func/syshealth.sh
 source $HESTIA/conf/hestia.conf
 
 # Export sbin

+ 2 - 0
bin/v-rebuild-web-domain

@@ -22,11 +22,13 @@ restart=$3
 # shellcheck source=/usr/local/hestia/func/domain.sh
 # shellcheck source=/usr/local/hestia/func/ip.sh
 # shellcheck source=/usr/local/hestia/func/rebuild.sh
+# shellcheck source=/usr/local/hestia/func/syshealth.sh
 # shellcheck source=/usr/local/hestia/conf/hestia.conf
 source $HESTIA/func/main.sh
 source $HESTIA/func/domain.sh
 source $HESTIA/func/ip.sh
 source $HESTIA/func/rebuild.sh
+source $HESTIA/func/syshealth.sh
 source $HESTIA/conf/hestia.conf
 
 

+ 2 - 0
bin/v-rebuild-web-domains

@@ -21,11 +21,13 @@ restart=$2
 # shellcheck source=/usr/local/hestia/func/domain.sh
 # shellcheck source=/usr/local/hestia/func/ip.sh
 # shellcheck source=/usr/local/hestia/func/rebuild.sh
+# shellcheck source=/usr/local/hestia/func/syshealth.sh
 # shellcheck source=/usr/local/hestia/conf/hestia.conf
 source $HESTIA/func/main.sh
 source $HESTIA/func/domain.sh
 source $HESTIA/func/ip.sh
 source $HESTIA/func/rebuild.sh
+source $HESTIA/func/syshealth.sh
 source $HESTIA/conf/hestia.conf
 
 

+ 27 - 0
bin/v-restore-sys-config

@@ -0,0 +1,27 @@
+#!/bin/bash
+# info: Restore system configuration
+# options: [SYSTEM]
+# labels: 
+#
+# example: v-restore-sys-config
+#
+# The function restores system configuration file
+
+system=$1
+
+# Includes
+# shellcheck source=/usr/local/hestia/func/main.sh
+source $HESTIA/func/main.sh
+# shellcheck source=/usr/local/hestia/func/syshealth.sh
+source $HESTIA/func/syshealth.sh
+
+#----------------------------------------------------------#
+#                        Action                            #
+#----------------------------------------------------------#
+
+syshealth_restore_system_installed_config
+
+#----------------------------------------------------------#
+#                        Hestia                            #
+#----------------------------------------------------------#
+log_event "$OK" "$ARGUMENTS"

+ 2 - 0
bin/v-restore-user

@@ -39,6 +39,7 @@ fi
 # shellcheck source=/usr/local/hestia/func/ip.sh
 # shellcheck source=/usr/local/hestia/func/db.sh
 # shellcheck source=/usr/local/hestia/func/rebuild.sh
+# shellcheck source=/usr/local/hestia/func/syshealth.sh
 # shellcheck source=/usr/local/hestia/conf/hestia.conf
 source $HESTIA/func/main.sh
 source $HESTIA/func/backup.sh
@@ -46,6 +47,7 @@ source $HESTIA/func/domain.sh
 source $HESTIA/func/ip.sh
 source $HESTIA/func/db.sh
 source $HESTIA/func/rebuild.sh
+source $HESTIA/func/syshealth.sh
 source $HESTIA/conf/hestia.conf
 
 

+ 36 - 0
bin/v-update-sys-defaults

@@ -0,0 +1,36 @@
+#!/bin/bash
+# info: update default key database
+# options: [SYSTEM]
+# labels: 
+#
+# example: v-update-sys-defaults
+# example: v-update-sys-defaults user
+#
+# The function updates the known key/value pair database
+
+system=$1
+
+# Includes
+# shellcheck source=/usr/local/hestia/func/main.sh
+source $HESTIA/func/main.sh
+# shellcheck source=/usr/local/hestia/func/syshealth.sh
+source $HESTIA/func/syshealth.sh
+
+#----------------------------------------------------------#
+#                        Action                            #
+#----------------------------------------------------------#
+
+if [ ! -z "$system" ]; then
+    syshealth_update_${system}_config_format
+else
+    syshealth_update_web_config_format
+    syshealth_update_mail_config_format
+    syshealth_update_dns_config_format
+    syshealth_update_db_config_format
+    syshealth_update_user_config_format
+fi
+
+#----------------------------------------------------------#
+#                        Hestia                            #
+#----------------------------------------------------------#
+log_event "$OK" "$ARGUMENTS"

+ 2 - 1
func/rebuild.sh

@@ -196,7 +196,8 @@ 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
     prepare_web_domain_values

+ 160 - 4
func/syshealth.sh

@@ -1,10 +1,166 @@
 #!/bin/bash
 
-# Hestia Control Panel - System Health Check Function Library
+# Hestia Control Panel - System Health Check and Repair Function Library
+
+# Read known configuration keys from $HESTIA/conf/defaults/$system.conf
+function read_kv_config_file() {
+    local system=$1
+    while read -r str; do
+        echo "$str"
+    done < <(cat $HESTIA/conf/defaults/$system.conf)
+    unset system
+}
+
+# Write known configuration keys to $HESTIA/conf/defaults/
+function write_kv_config_file() {
+    # Ensure configuration directory exists
+    if [ ! -d "$HESTIA/conf/defaults/" ]; then
+        mkdir "$HESTIA/conf/defaults/"
+    fi
+
+    # Remove previous known good configuration
+    if [ -f "$HESTIA/conf/defaults/$system.conf" ]; then
+        rm -f $HESTIA/conf/defaults/$system.conf
+    fi
+
+    touch $HESTIA/conf/defaults/$system.conf
+
+    for key in ${known_keys[@]}; do
+        echo $key >> $HESTIA/conf/defaults/$system.conf
+    done
+}
+
+# Sanitize configuration input
+function sanitize_config_file() {
+    local system=$1
+    known_keys=$(read_kv_config_file "$system")
+    for key in $known_keys; do
+        unset $key
+    done
+}
+
+# Update list of known keys for web.conf files
+function syshealth_update_web_config_format() {
+
+    # WEB DOMAINS
+    # Create array of known keys in configuration file
+    system="web"
+    known_keys=(DOMAIN IP IP6 CUSTOM_DOCROOT CUSTOM_PHPROOT FASTCGI_CACHE FASTCGI_LENGTH ALIAS TPL SSL SSL_FORCE SSL_HOME LETSENCRYPT FTP_USER FTP_MD5 FTP_PATH BACKEND PROXY PROXY_EXT STATS STATS_USER STATS_CRYPT SUSPENDED TIME DATE)
+    write_kv_config_file
+    unset system
+    unset known_keys
+}
+
+# Update list of known keys for dns.conf files
+function syshealth_update_dns_config_format() {
+
+    # DNS DOMAINS
+    # Create array of known keys in configuration file
+    system="dns"
+    known_keys=(DOMAIN IP TPL TTL EXP SOA SERIAL SRC RECORDS SUSPENDED TIME DATE)
+    write_kv_config_file
+    unset system
+    unset known_keys
+
+    # DNS RECORDS
+    system="dns_records"
+    known_keys=(ID RECORD TYPE PRIORITY VALUE SUSPENDED TIME DATE TTL)
+    write_kv_config_file
+    unset system
+    unset known_keys
+}
+
+# Update list of known keys for mail.conf files
+function syshealth_update_mail_config_format() {
+
+    # MAIL DOMAINS
+    # Create array of known keys in configuration file
+    system="mail"
+    known_keys=(DOMAIN ANTIVIRUS ANTISPAM DKIM WEBMAIL SSL LETSENCRYPT CATCHALL ACCOUNTS U_DISK SUSPENDED TIME DATE)
+    write_kv_config_file
+    unset system
+    unset known_keys
+
+    # MAIL ACCOUNTS
+    system="mail_accounts"
+    known_keys=(ACCOUNT ALIAS AUTOREPLY FWD FWD_ONLY MD5 QUOTA U_DISK SUSPENDED TIME DATE)
+    write_kv_config_file
+    unset system
+    unset known_keys
+}
+
+# Update list of known keys for user.conf files
+function syshealth_update_user_config_format() {
+
+    # USER CONFIGURATION
+    # Create array of known keys in configuration file
+    system="user"
+    known_keys=(NAME PACKAGE CONTACT CRON_REPORTS MD5 RKEY TWOFA QRCODE PHPCLI ROLE SUSPENDED SUSPENDED_USERS SUSPENDED_WEB SUSPENDED_DNS SUSPENDED_MAIL SUSPENDED_DB SUSPENDED_CRON IP_AVAIL IP_OWNED U_USERS U_DISK U_DISK_DIRS U_DISK_WEB U_DISK_MAIL U_DISK_DB U_BANDWIDTH U_WEB_DOMAINS U_WEB_SSL U_WEB_ALIASES U_DNS_DOMAINS U_DNS_RECORDS U_MAIL_DKIM U_MAIL_DKIM U_MAIL_ACCOUNTS U_MAIL_DOMAINS U_MAIL_SSL U_DATABASES U_CRON_JOBS U_BACKUPS LANGUAGE NOTIFICATIONS TIME DATE)
+    write_kv_config_file
+    unset system
+    unset known_keys
+
+    # CRON JOB CONFIGURATION
+    # Create array of known keys in configuration file
+    system="cron"
+    known_keys=(JOB MIN HOUR DAY MONTH WDAY CMD SUSPENDED TIME DATE)
+    write_kv_config_file
+    unset system
+    unset known_keys
+}
+
+# Update list of known keys for db.conf files
+function syshealth_update_db_config_format() {
+
+    # DATABASE CONFIGURATION
+    # Create array of known keys in configuration file
+    system="db"
+    known_keys=(DB DBUSER MD5 HOST TYPE CHARSET U_DISK SUSPENDED TIME DATE)
+    write_kv_config_file
+    unset system
+    unset known_keys
+}
+
+# Update list of known keys for ip.conf files
+function syshealth_update_ip_config_format() {
+
+    # IP ADDRESS
+    # Create array of known keys in configuration file
+    system="ip"
+    known_keys=(OWNER STATUS NAME U_SYS_USERS U_WEB_DOMAINS INTERFACE NETMASK NAT HELO TIME DATE)
+    write_kv_config_file
+    unset system
+    unset known_keys
+}
+
+# Repair web domain configuration
+function syshealth_repair_web_config() {
+    system="web"
+    sanitize_config_file "$system"
+    get_domain_values 'web'
+    prev="DOMAIN"
+    for key in $known_keys; do
+        if [ -z "${!key}" ]; then 
+            add_object_key 'web' 'DOMAIN' "$domain" "$key" "$prev"   
+        fi
+        prev=$key
+    done
+}
+
+function syshealth_restore_system_installed_config() {
+    if [ -f "$HESTIA/conf/defaults/hestia.conf" ]; then
+        mv $HESTIA/conf/hestia.conf $HESTIA/conf/hestia.conf.old
+        cp $HESTIA/conf/defaults/hestia.conf $HESTIA/conf/hestia.conf
+        rm -f $HESTIA/conf/hestia.conf.old
+    else
+        echo "ERROR: System default configuration file not found, aborting."
+        exit 1
+    fi
+}
 
 # Repair System Configuration
 # Adds missing variables to $HESTIA/conf/hestia.conf with safe default values
-function syshealth_repair_system_config () {
+function syshealth_repair_system_config() {
     # Release branch
     if [ -z "$RELEASE_BRANCH" ]; then
         echo "[ ! ] Adding missing variable to hestia.conf: RELEASE_BRANCH ('release')"
@@ -37,8 +193,8 @@ function syshealth_repair_system_config () {
 
     # 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'
+        echo "[ ! ] Adding missing variable to hestia.conf: BACKUP_GZIP ('4')"
+        $BIN/v-change-sys-config-value 'BACKUP_GZIP' '4'
     fi
 
     # Theme

+ 10 - 0
func/upgrade.sh

@@ -636,6 +636,16 @@ upgrade_rebuild_users() {
     fi
 }
 
+upgrade_replace_default_config() {
+    if [ "$UPGRADE_REPLACE_KNOWN_KEYS" ]; then
+        syshealth_update_web_config_format
+        syshealth_update_mail_config_format
+        syshealth_update_dns_config_format
+        syshealth_update_db_config_format
+        syshealth_update_user_config_format
+    fi
+}
+
 upgrade_restart_services() {
     if [ "$UPGRADE_RESTART_SERVICES" = "true" ]; then
         echo "[ * ] Restarting services..."

+ 1 - 0
install/upgrade/upgrade.conf

@@ -41,6 +41,7 @@ UPGRADE_UPDATE_FILEMANAGER='true'
 UPGRADE_UPDATE_FILEMANAGER_CONFIG='false'
 
 # Post installation clean-up
+UPGRADE_REPLACE_KNOWN_KEYS='true'
 UPGRADE_REBUILD_USERS='true'
 UPGRADE_RESTART_SERVICES='true'
 

+ 29 - 15
install/upgrade/versions/1.4.0.sh

@@ -17,28 +17,32 @@ fi
 
 # Populating HELO/SMTP Banner for existing IPs
 if [ "$MAIL_SYSTEM" == "exim4" ]; then
-    source $HESTIA/func/ip.sh
 
-    echo "[ * ] Populating HELO/SMTP Banner value for existing IP addresses..."
-    > /etc/exim4/mailhelo.conf
+    # Check if we've already done this upgrade before proceeding
+    if ! grep -q ^smtp_active_hostname  /etc/exim4/exim4.conf.template; then
 
-    for ip in $($BIN/v-list-sys-ips plain | cut -f1); do
-        helo=$(is_ip_rdns_valid $ip)
+        source $HESTIA/func/ip.sh
 
-        if [ ! -z "$helo" ]; then
-            $BIN/v-change-sys-ip-helo $ip $helo
-        fi
-    done
+        echo "[ * ] Populating HELO/SMTP Banner value for existing IP addresses..."
+        > /etc/exim4/mailhelo.conf
+
+        for ip in $($BIN/v-list-sys-ips plain | cut -f1); do
+            helo=$(is_ip_rdns_valid $ip)
+
+            if [ ! -z "$helo" ]; then
+                $BIN/v-change-sys-ip-helo $ip $helo
+            fi
+        done
 
-    # Update exim configuration
-    echo "[ * ] Updating exim4 configuration..."
+        # Update exim configuration
+        echo "[ * ] Updating exim4 configuration..."
 
-    # Check if smtp_active_hostname exists before adding it
-    if [ ! 'grep -q ^smtp_active_hostname  /etc/exim4/exim4.conf.template' ]; then
+        # Add new smtp_active_hostname variable to exim config
         sed -i '/^smtp_banner = \$smtp_active_hostname$/a smtp_active_hostname = ${if exists {\/etc\/exim4\/mailhelo.conf}{${lookup{$interface_address}lsearch{\/etc\/exim4\/mailhelo.conf}{$value}{$primary_hostname}}}{$primary_hostname}}"' /etc/exim4/exim4.conf.template
-    fi
 
-    sed -i 's/helo_data = \${if exists {\/etc\/exim4\/mailhelo.conf}{${lookup{\$sender_address_domain}lsearch\*{\/etc\/exim4\/mailhelo.conf}{\$value}{\$primary_hostname}}}{\$primary_hostname}}/helo_data = ${if exists {\/etc\/exim4\/mailhelo.conf}{${lookup{$sending_ip_address}lsearch{\/etc\/exim4\/mailhelo.conf}{$value}{$primary_hostname}}}{$primary_hostname}}/' /etc/exim4/exim4.conf.template
+        # Lookup HELO address by sending ip instead of sending domain
+        sed -i 's/helo_data = \${if exists {\/etc\/exim4\/mailhelo.conf}{${lookup{\$sender_address_domain}lsearch\*{\/etc\/exim4\/mailhelo.conf}{\$value}{\$primary_hostname}}}{\$primary_hostname}}/helo_data = ${if exists {\/etc\/exim4\/mailhelo.conf}{${lookup{$sending_ip_address}lsearch{\/etc\/exim4\/mailhelo.conf}{$value}{$primary_hostname}}}{$primary_hostname}}/' /etc/exim4/exim4.conf.template
+    fi
 fi
 
 # Upgrading Mail System
@@ -114,6 +118,16 @@ if [ "$API" = "no" ]; then
     fi
 fi
 
+# Back up users existing configuration data to $HESTIA/conf/defaults/hestia.conf
+if [ ! -f "$HESTIA/conf/defaults/hestia.conf" ]; then
+    echo "[ * ] Creating known good configuration data for system recovery..."
+    if [ ! -d "$HESTIA/conf/defaults/" ]; then
+        mkdir -p "$HESTIA/conf/defaults/"
+    fi
+    cp -f $HESTIA/conf/hestia.conf $HESTIA/conf/defaults/hestia.conf
+fi
+
+
 
 ##### COMMANDS FOR V1.5.X
 

+ 1 - 0
src/deb/hestia/postinst

@@ -42,6 +42,7 @@ upgrade_welcome_message
 
 # Perform upgrade health check and refresh configuration before upgrading
 upgrade_health_check | tee -a $LOG
+upgrade_replace_default_config
 upgrade_refresh_config
 
 # Back up existing configuration files and templates