From d1b4b926e40ab8d3d5bfddee92c407aa15139264 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 28 Jan 2026 12:38:44 +0100 Subject: [PATCH] Sicherung gegen mehrfachaufruf --- sync-ispconfig-proxy.sh | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/sync-ispconfig-proxy.sh b/sync-ispconfig-proxy.sh index 7bb3fa6..cc54ebc 100755 --- a/sync-ispconfig-proxy.sh +++ b/sync-ispconfig-proxy.sh @@ -1,9 +1,17 @@ #!/bin/bash # ============================================================================== -# ISPConfig Proxy Sync Script - Version 3.34 (Fix: Auto-Subdomain Support) +# ISPConfig Proxy Sync Script - Version 3.35 (Safe Lock & Auto-Subdomain) # ============================================================================== +LOCKFILE="/tmp/restart.syncproxy.lock" + +# Sichern gegen Mehrfachstart +lockfile -r 0 "$LOCKFILE" || exit 1 + +# TRAP: Stellt sicher, dass das Lockfile bei JEDEM Beenden gelöscht wird +trap 'rm -f "$LOCKFILE"' EXIT + # --- KONFIGURATION --- CONF_FILE="/usr/local/bin/sync-ispconfig-proxy.conf" SERVER_LIST="/usr/local/bin/proxy_based_server.conf" @@ -44,11 +52,11 @@ write_nginx_config() { local domain=$1 local target_ip=$2 local redirect_path=$3 - local sub_type=$4 # Dies ist das Feld 'subdomain' aus ISPConfig + local sub_type=$4 # Feld 'subdomain' aus ISPConfig local cert_dir="/root/.acme.sh/${domain}_ecc" local config_path="$NGINX_CONF_DIR/${domain}.conf" - # s_names nur um www erweitern, wenn subdomain auf 'www' steht + # Server-Namen nur um www erweitern, wenn subdomain auf 'www' steht local s_names="$domain" [[ "$sub_type" == "www" ]] && s_names="$domain www.$domain" @@ -109,10 +117,13 @@ main() { if [ -n "$TARGET_DOMAIN" ]; then global_filter="AND (wd.domain = '${TARGET_DOMAIN}' OR parent.domain = '${TARGET_DOMAIN}')" elif [ "$FORCE_ALL" = false ] && [ "$TEST_MODE" = false ]; then + # Nutzt dbidx für ISPConfig 3.3.0p3 local raw_ids=$(mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -Bse "SELECT DISTINCT dbidx FROM sys_datalog WHERE dbtable = 'web_domain' AND datalog_id > $last_id;" 2>/dev/null) [ $? -ne 0 ] && { echo "FEHLER: SQL-Abfrage fehlgeschlagen." >&2; exit 1; } + local changed_ids=$(echo "$raw_ids" | grep -oE '[0-9]+') if [ -z "$changed_ids" ]; then exit 0; fi + global_filter="AND wd.domain_id IN ($(echo "$changed_ids" | paste -sd "," -))" UPDATE_LAST_ID=true else @@ -125,6 +136,7 @@ main() { FROM web_domain wd JOIN server s ON wd.server_id = s.server_id LEFT JOIN web_domain parent ON wd.parent_domain_id = parent.domain_id WHERE TRIM(s.server_name) = TRIM('$CURRENT_SERVER') AND wd.type IN ('vhost', 'alias', 'vhostalias', 'subdomain', 'vhostsubdomain') $global_filter ORDER BY wd.domain_id ASC;" + [ "$DEBUG_MODE" = true ] && echo "[DEBUG] Query: $sql_query" local sql_result=$(mysql -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -N -B -e "$sql_query") while read -r row; do @@ -146,7 +158,6 @@ main() { local cert_dir="/root/.acme.sh/${domain}_ecc" if [ ! -f "$cert_dir/fullchain.cer" ] || [ "$RENEW_CERT" = true ]; then - # ACME Aufruf: Nur -d www hinzufügen, wenn sub_type == "www" local acme_cmd="/root/.acme.sh/acme.sh --issue -d $domain" [[ "$sub_type" == "www" ]] && acme_cmd="$acme_cmd -d www.$domain" $acme_cmd -w /var/www/html --server letsencrypt --ecc --force