From 568c514d3f99fad82d15b1661234aaee43220ae2 Mon Sep 17 00:00:00 2001 From: Vezpi Date: Mon, 8 Jun 2026 06:57:26 +0000 Subject: [PATCH] fix: use file lock --- opnsense/10-wan | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/opnsense/10-wan b/opnsense/10-wan index 6f7fab4..0373bb1 100644 --- a/opnsense/10-wan +++ b/opnsense/10-wan @@ -40,17 +40,36 @@ if ($vhid !== $primary_vhid) { $ifkey = 'wan'; // Determine whether WAN interface is currently enabled $ifkey_enabled = !empty($config['interfaces'][$ifkey]['enable']) ? true : false; +// Lock file to prevent interface flapping +$lock_file = '/tmp/carp_wan_disable_lock'; +$lock_default_age = 5; +$lock_max_age = 10; // MASTER event if ($type === "MASTER") { // Enable WAN only if it's currently disabled if (!$ifkey_enabled) { + // Check if lock file is present + if (file_exists($lock_file)) { + $lock_age = time() - (int)file_get_contents($lock_file); + if ($lock_age < $lock_max_age) { + log_msg("CARP event: WAN disable lock present ({$lock_age}s old), waiting..."); + $elapsed = 0; + while (file_exists($lock_file) && $elapsed < 5000) { + usleep(500000); + $elapsed += 500; + } + } else { + log_msg("CARP event: removing stale WAN disable lock."); + @unlink($lock_file); + } + } log_msg("CARP event: switching to '$type', enabling interface '$ifkey'.", LOG_WARNING); $config['interfaces'][$ifkey]['enable'] = '1'; write_config("enable interface '$ifkey' due CARP event '$type'", false); interface_configure(false, $ifkey, false, false); } else { - log_msg("CARP event: already '$type' for interface '$ifkey', nothing to do."); + log_msg("CARP event: already 'MASTER' for interface '$ifkey', nothing to do."); } // BACKUP event @@ -61,6 +80,10 @@ if ($type === "MASTER") { unset($config['interfaces'][$ifkey]['enable']); write_config("disable interface '$ifkey' due CARP event '$type'", false); interface_configure(false, $ifkey, false, false); + // Create lock file + file_put_contents($lock_file, time()); + sleep($lock_default_age); + @unlink($lock_file); } else { log_msg("CARP event: already '$type' for interface '$ifkey', nothing to do."); }