fix: use file lock

This commit is contained in:
2026-06-08 06:57:26 +00:00
parent 2398dac8c2
commit 568c514d3f

View File

@@ -40,17 +40,36 @@ if ($vhid !== $primary_vhid) {
$ifkey = 'wan'; $ifkey = 'wan';
// Determine whether WAN interface is currently enabled // Determine whether WAN interface is currently enabled
$ifkey_enabled = !empty($config['interfaces'][$ifkey]['enable']) ? true : false; $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 // MASTER event
if ($type === "MASTER") { if ($type === "MASTER") {
// Enable WAN only if it's currently disabled // Enable WAN only if it's currently disabled
if (!$ifkey_enabled) { 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); log_msg("CARP event: switching to '$type', enabling interface '$ifkey'.", LOG_WARNING);
$config['interfaces'][$ifkey]['enable'] = '1'; $config['interfaces'][$ifkey]['enable'] = '1';
write_config("enable interface '$ifkey' due CARP event '$type'", false); write_config("enable interface '$ifkey' due CARP event '$type'", false);
interface_configure(false, $ifkey, false, false); interface_configure(false, $ifkey, false, false);
} else { } 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 // BACKUP event
@@ -61,6 +80,10 @@ if ($type === "MASTER") {
unset($config['interfaces'][$ifkey]['enable']); unset($config['interfaces'][$ifkey]['enable']);
write_config("disable interface '$ifkey' due CARP event '$type'", false); write_config("disable interface '$ifkey' due CARP event '$type'", false);
interface_configure(false, $ifkey, false, false); interface_configure(false, $ifkey, false, false);
// Create lock file
file_put_contents($lock_file, time());
sleep($lock_default_age);
@unlink($lock_file);
} else { } else {
log_msg("CARP event: already '$type' for interface '$ifkey', nothing to do."); log_msg("CARP event: already '$type' for interface '$ifkey', nothing to do.");
} }